TITLE FORMAT ORG 100H ; NMIVEC EQU 066H ;NMI VECTOR WRTTRK EQU 0F4H ;WRITE TRACK COMAND STSREG EQU 10H ;1771 STATUS REGISTER CMDREG EQU 10H ;1771 COMMAND REGISTER TRKREG EQU 11H ;1771 TRACK REGISTER DATREG EQU 13H ;1771 DATA REGISTER SEKCMD EQU 1AH ;SEEK COMMAND CPM EQU 5 ;BDOS CALL MONRD EQU 0F024H ;MONITOR CALL FOR READ SECTOR SELECT EQU 0F01BH ;MONITOR CALL FOR SELECT ; START: LD C,9 ;IDENTIFY THE PROGRAM LD DE,MSG CALL CPM LD A,(4) ;SAVE THE DRIVE AND USER WHO CALLED THIS LD (SYSDRV),A CALL FILBUF ;BUILD THE TRACK BUFFER JP ST1 ; ; ; exit to cpm ; BYEBYE: LD A,(SYSDRV) ;LOAD CALLING DRIVE/USER LD C,A CALL SELECT ;GO SELECT THAT DRIVE/USER LD C,0 CALL CPM ; ST1: LD C,9 LD DE,ASKDRV CALL CPM LD C,1 CALL CPM CP 3 ;CHECK FOR ^C JR Z,BYEBYE ;EXIT IF SO CALL TUPPER CP 'A' JR Z,ST2 CP 'B' JR Z,ST2 CP 'C' JR Z,ST2 CP 'D' JR Z,ST2 LD C,9 LD DE,WHAT CALL CPM JP ST1 ; ST2: SUB 41H ;DRIVES ARE NUMBERED 0,1,2,3!!!! LD (FMTDRV),A LD C,A CALL SELECT BIT 7,A JP NZ,ST4 STRACK: LD C,9 ;ENTER STARTING TRACK LD DE,ASKSTK TRACK: CALL CPM LD C,10 LD DE,INPBFR CALL CPM LD HL,0 LD DE,INPBFF LD A,(INPCHR) LD C,A ASCHEX: DEC C JP M,STTKLD LD A,(DE) INC DE CALL TUPPER CP '0' JP C,STTKLD CP '9'+1 JP C,HEXDIG CP 'A' JP C,STRACK CP 'F'+1 JP NC,STRACK SUB 'A'-10 JP CNVERT HEXDIG: SUB '0' CNVERT: ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD A,L LD L,A JP ASCHEX TUPPER: CP 'a' ;CONVERT LOWER TO UPPER CASE RET C CP 'z'+1 RET NC AND 5FH RET STTKLD: LD A,L LD (TRACKN),A FTRACK: LD C,9 ;ENTER FINSHING TRACK LD DE,ASKFTK CALL CPM LD C,10 LD DE,INPBFR CALL CPM LD HL,0 LD DE,INPBFF LD A,(INPCHR) LD C,A ASCIHX: DEC C JP M,FTTKLD LD A,(DE) INC DE CALL TUPPER CP '0' JP C,FTTKLD CP '9'+1 JP C,HEXDGT CP 'A' JP C,FTRACK CP 'F'+1 JP NC,FTRACK SUB 'A'-10 JP CONVRT HEXDGT: SUB '0' CONVRT: ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD A,L LD L,A JP ASCIHX FTTKLD: LD A,L LD HL,TRACKN CP (HL) JP M,FTRACK ;MUST NOT END AT LOWER TRACK CP 77 JR C,LDFTRK PUSH AF LD C,9 ;WARN IF TRACK # >76 LD DE,WARN CALL CPM LD C,1 CALL CPM CP 'Y' POP AF JR NZ,FTRACK LDFTRK: LD (ENDTRK),A CALL ASKIFV ;ASK IF VERIFICATION IS WANTED LD C,9 LD DE,TELLIT CALL CPM ; ST3: CALL UPDBUF ;PUT IN THE PROPER TRACK NUMBERS LD A,(FMTDRV) LD C,A CALL SELECT ;RESELECT DRIVE CALL SEEK CALL BINASC CALL FMTTRK LD A,(VFYFLG) OR A CALL Z,VFYTRK ;IF WANTED, VERIFY THE TRACK LD A,(ERRCNT) OR A CALL NZ,SHOERR ;PRINT A "X" IF ERROR ENCOUNTERED CALL CKCON ;SEE IF ANYBODY WANTS TO ABORT THIS LD A,(TRACKN) LD HL,ENDTRK CP (HL) JP Z,ST1 INC A LD (TRACKN),A JP ST3 ; ST4: LD C,9 LD DE,NOTRDY CALL CPM JP ST1 ; ; PRINT AN "X" IF ERROR ENCOUNTERED ; SHOERR: LD A,'X' LD C,2 LD E,A CALL CPM RET ; ; SEEK TO THE TRACK WANTED ; SEEK: LD A,(TRACKN) OUT (DATREG),A LD A,SEKCMD OUT (CMDREG),A LD B,20 SEEK1: NOP DJNZ SEEK1 SEEK2: IN A,(STSREG) BIT 0,A JR NZ,SEEK2 RET ; ; THIS FORMATS THE TRACK ; FMTTRK: DI LD HL,NMIVEC LD D,(HL) LD A,0C9H LD (HL),A LD A,0D0H CALL CMDOUT LD B,-1 LD C,DATREG LD HL,TRACKB LD A,WRTTRK CALL CMDOUT FMT1: HALT OUTI JP NZ,FMT1 IN A,(STSREG) LD (TEMP),A BIT 0,A JR Z,FMT2 LD B,186 JP FMT1 ; FMT2: CALL ERRCK LD HL,NMIVEC LD (HL),D EI RET ; CMDOUT: OUT (CMDREG),A CALL PAUSE PAUSE: EX (SP),HL EX (SP),HL RET ; ; ; VERIFY FORMAT, DATA AREA ; VFYTRK: LD A,0 LD (ERRCNT),A LD A,1 LD (TEMP),A VFY1: LD A,(TEMP) LD C,A LD HL,SECDAT CALL MONRD IN A,(STSREG) BIT 3,A JR NZ,VFY2 BIT 4,A JR NZ,VFY2 VFY3: LD A,(TEMP) INC A LD (TEMP),A CP 27 JR NZ,VFY1 RET VFY2: LD A,(ERRCNT) INC A LD (ERRCNT),A JR VFY3 ; ; CHECK FOR ERRORS AFTER BUSY GETS RESET ; ERRCK: LD A,(TEMP) BIT 6,A JR Z,ERRCK1 LD DE,WPMSG JP ERREX ERRCK1: LD A,(TEMP) BIT 5,A JR Z,ERRCK3 LD DE,WFMSG JP ERREX ERRCK2: ERREX: LD C,9 CALL 5 LD DE,ABORT LD C,9 CALL 5 LD HL,NMIVEC LD (HL),D EI JP ST1 ERRCK3: RET ; ; ; ASK IF VERIFICATION IS WANTED ; ASKIFV: LD A,0 LD (VFYFLG),A ;DEFAULT TO VERIFY LD C,9 LD DE,ASKVER CALL CPM LD C,1 CALL CPM CP 3 ;CHECK FOR CONTROL-C JR Z,ASKVE CP 'N' JR Z,ASKVN RET ASKVN: LD A,-1 LD (VFYFLG),A ;SET NO VERIFY FLAG RET ;AND RETURN ASKVE: JP ST1 ; ; CHECK CONSOLE FOR CONTROL-C INPUT ; CKCON: LD C,6 LD E,0FFH CALL 5 OR A RET Z ;RETURN IF ZERO - NO INPUT CP 03 ;THIS IS A CONTROL-C CHARACTER RET NZ LD C,9 LD DE,CCDET CALL 5 POP HL JP ST1 ;AND GO TO THE BEGINNING.. ; ; ; BUILD THE TRACK IMAGE ; FILBUF: LD HL,TRACKB LD B,00 FFFILL: LD (HL),0FFH INC HL DJNZ FFFILL LD DE,TRACKB+40 LD BC,0*256+6 LD HL,ZEROS LDIR LD A,0FCH ;INDEX MARK LD (DE),A INC DE LD BC,0*256+26 LD HL,TRACKB LDIR ; ; FILL THE SECTORS ; FILSEC: LD A,1 LD (SECTOR),A FILS1: LD BC,0*256+6 LD HL,ZEROS LDIR LD A,0FEH ;ID ADDRESS MARK LD (DE),A INC DE LD A,(TRACKN) LD (DE),A INC DE LD A,0 LD (DE),A INC DE LD A,(SECTOR) LD (DE),A INC DE LD A,0 LD (DE),A INC DE LD A,0F7H ;WRITE 2 CRC'S LD (DE),A INC DE LD BC,0*256+11 LD HL,TRACKB LDIR LD BC,0*256+6 LD HL,ZEROS LDIR LD A,0FBH ;DATA MARK LD (DE),A INC DE LD B,128 LD A,0E5H FILDAT: LD (DE),A INC DE DJNZ FILDAT LD A,0F7H ;WRITE 2 CRC'S LD (DE),A INC DE LD BC,0*256+27 LD HL,TRACKB LDIR LD A,(SECTOR) CP 26 JR Z,FILS2 INC A LD (SECTOR),A JP FILS1 FILS2: LD B,0 LD A,0FFH FFLOOP: LD (DE),A INC DE LD HL,TRACKB DJNZ FFLOOP RET ; ; UPDATE THE TRACK NUMBERS IN THE BUFFER ; UPDBUF: CCF LD A,(TRACKN) LD B,26 LD DE,186 LD HL,TRACKB+80 UPD1: LD (HL),A ADD HL,DE DJNZ UPD1 RET ; ; PRINT CURRENT TRACK NUMBER ; BINASC: LD A,0 LD D,A LD E,A LD A,(TRACKN) LD B,A BIN1: CP 9 JR Z,BIN2 JR C,BIN2 SUB 10 INC D JP BIN1 ; BIN2: LD E,A LD A,D ADD A,30H LD (ASCHI),A LD A,E ADD A,30H LD (ASCLO),A ; ; NOW PRINT IT ; CP 30H JR Z,BIN3 LD C,2 LD E,9 CALL CPM JR BIN4 BIN3: LD C,2 LD E,13 CALL CPM LD E,10 LD C,2 CALL CPM BIN4: LD A,(ASCHI) LD E,A LD C,2 CALL CPM LD C,2 LD A,(ASCLO) LD E,A CALL CPM RET MSG: DEFB 27,'E',26,13,10,10,'BIGBOARD format program by Bill Parzick',13,10 DEFB 'Revision 2.0 1-JAN-1985 by R.Parsons',13,10 DEFB 'With slower stepping & track selection',13,10,'$' ASKDRV: DEFB 13,10,10,'Drive to be formatted (A,B,C,D) :$' ASKVER: DEFB 13,10,'Verify format (Y or N) ?$' TELLIT: DEFB 13,10,'Formatting..........',13,10 DEFB 9,'(Control-C will abort)',13,10,'$' CCDET: DEFB 13,10,'Control-C detected......format aborted ','$' NOTRDY: DEFB 13,10,10,'Drive is ***** NOT READY *****',13,10,'$' WPMSG: DEFB 13,10,10,'Diskette is ***** WRITE PROTECTED *****',13,10,'$' WFMSG: DEFB 13,10,10,'Drive reports a ***** WRITE FAULT *****',13,10,'$' ABORT: DEFB 10,'Format ***** ABORTED ***** ',13,10,'$' WHAT: DEFB 13,10,10,'Say what??',13,10,'$' ASKSTK: DEFB 13,10,'First track to be formatted (hex)?',13,10,'$' ASKFTK: DEFB 13,10,'Last track to be formatted (hex)?',13,10,'$' WARN: DEFB 13,10,'WARNING!!! Format track beyond 76?(Y/N)',13,10,'$' ; TEMP: DEFS 1 VFYFLG: DEFS 1 SYSDRV: DEFS 1 ;CALLING DRIVE AND USER ZEROS: DEFS 10 TRACKB: DEFS 5300 ;TRACK BUFFER SECTOR: DEFB 1 ;SECTOR NUMBER TRACKN: DEFB 0 ;TRACK NUMBER ASCLO: DEFB 0 ASCHI: DEFB 0 SECDAT: DEFS 130 ERRCNT: DEFS 1 INPBFR: DEFB 2 INPCHR: DEFB 0 INPBFF: DEFS 2 ENDTRK: DEFS 1 FMTDRV: DEFS 1 ; END