ORG 100H WBOOT EQU 00000H CTRLA EQU 00001H CTRLB EQU 00002H BDOS EQU 00005H X0006 EQU 00006H X0009 EQU 00009H X0018 EQU 00018H X001B EQU 0001BH X001E EQU 0001EH X0021 EQU 00021H X0024 EQU 00024H X0027 EQU 00027H X002A EQU 0002AH X002D EQU 0002DH X0030 EQU 00030H X0033 EQU 00033H JP ENTRY ; D0103: DEFB 05H D0104: DEFB 23H D0105: DEFB 28H D0106: DEFB 00H A0107: DEFB 00H D0108: DEFB 80H PROMPT: DEFB 0DH,0AH DEFB 'COPY Version 5.3',0DH,0AH DEFB '(C) 1980 Lifeboat Associates.',24H ; ENTRY: LD SP,STACK XOR A LD (TRPFLG),A LD HL,00000H LD (D0F99),HL LD C,00CH CALL BDOS LD (CPMFLG),HL CALL SETJMP LD A,(D0104) LD HL,NUMTRK CALL TRKNUM LD DE,PROMPT CALL A0DBF LD DE,T0EC0 CALL A0DBF START: LD SP,STACK CALL MNMENU JP NZ,START CP 00DH JP Z,EXECUT CALL CHKVFY JP NZ,START EXECUT: LD SP,STACK LD A,(CMDSTR) CP 056H JP Z,VERIFY JP A0380 ; VERIFY: CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB 'Insert disk in ' CDRVVF: DEFB 020H DEFB ' and to verify. - ',24H CALL GETCMD CP 00DH JP NZ,START CALL DISPLAY DEFB 0DH,0AH,0Dh,0AH DEFB 'Verify in progress - press ESC to abort.',0DH,0AH DEFB 'Each * is one track verified.',0DH,0AH,24H CALL CHKPRM CALL DISPLAY DEFB 0DH,0AH DEFB 'Verify complete. ',24H LD A,(ERRFLG) OR A JP NZ,ERMSG1 CALL DISPLAY DEFB 'NO errors were detected.',24H JP START ; ERMSG1: CALL DISPLAY DEFB 'Errors detected. +++ ERRORS +++',07H,24H JP START ; ; Unused block - format statement. CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB 'Insert disk in ' DRVFMT: DEFB 020H DEFB ' and to format. - ',24H CALL GETCMD CP 00DH JP NZ,START CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB 'Format in progress - press ESC to abort.',0DH,0AH DEFB 'Each * is one track formatted and verified.',0DH,0AH,24H CALL CHKPRM CALL DISPLAY DEFB 0DH,0AH DEFB 'Verify complete. ',24H LD A,(ERRFLG) OR A JP NZ,ERMSG3 CALL DISPLAY DEFB 'NO errors were detected.',24H JP START ; ERMSG3: CALL DISPLAY DEFB 'Errors detected. +++ ERRORS +++',07H,24H JP START ; A0380: CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB 'Insert SOURCE in ' SRCDRV: DEFB 020H DEFB ', DESTINATION in ' DSTDRV: DEFB 020H DEFB 20H,0DH,0AH DEFB ' and then press to copy the disk',0DH,0AH DEFB ' or any other key to reset options. - ',24H CALL GETCMD CP A,(0DH) JP NZ,START A0409: CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB 'Copy in progress - press ESC to abort.',0DH,0AH DEFB 'Each * is a track copied and verified.',0DH,0AH,24H CALL CHKPRM CALL DISPLAY DEFB 0DH,0AH DEFB 'Copy complete. ',24H LD A,(ERRFLG) OR A JP NZ,ERMSG2 CALL DISPLAY DEFB 'NO errors were detected.',24H JP START ; ERMSG2: CALL DISPLAY DEFB 'Errors detected. +++ ERRORS +++',07H,24H JP START ; MNMENU: CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB '****** O P T I O N T A B L E ******',24H LD A,(TRPFLG) OR A JP Z,A052E CALL DISPLAY DEFB 0DH,0AH DEFB ' = Run again with same parameters.',24H A052E: CALL DISPLAY DEFB 0DH,0AH DEFB ' "A" = Copy all ' NUMTRK: DEFB 00H,00H DEFB ' tracks per side.',0DH,0AH DEFB ' This option also formats a new disk.',0DH,0AH DEFB ' "M" = Copy MOST until empty (0E5H) track.',0DH,0AH DEFB ' "V" = VERIFY the disk by reading all data.',0DH,0AH DEFB ' "E" = EXIT and return to CP/M.',0DH,0AH DEFB 0DH,0AH DEFB 'Enter your selection from option table. - ',24H CALL GETCMD LD HL,TRPFLG CP (HL) RET Z LD (CMDSTR),A LD HL,D0104 LD H,(HL) LD L,000H CP 041H JP Z,STRTRK CP 04DH JP Z,STRTRK CP 056H JP Z,STRTRK CP 045H JP Z,RETCPM CALL DISPLAY DEFB 0DH,0AH,0DH,0AH,07H DEFB 'Illegal selection. Try again.',24H LD A,001H OR A RET ; STRTRK: LD (D0F91),HL XOR A RET ; RETCPM: LD HL,(D0F99) LD A,L OR H JP Z,LODCPM LD A,(D0F98) LD (HL),A LODCPM: CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB 'Insert CP/M disk in A, then press . - ',24H CALL GETCMD JP WBOOT ; CHKVFY: LD A,(CMDSTR) CP 056H JP Z,SELDRV JP GETSRC ; SELDRV: CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB 'Enter VERIFY drive name: (A B C or D)',0DH,0AH DEFB 'or does default verify on drive A. - ',24H CALL GETCMD CP 00DH JP NZ,LDFALT LD A,041H LDFALT: LD (CDRVVF),A SUB 041H CP 004H JP NC,SELDRV XOR A RET ; GETSRC: CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB 'ENTER SOURCE drive name: (A B C or D)',24h CALL DISPLAY DEFB 0DH,0AH DEFB 'or makes default COPY from A to B. - ',24H CALL GETCMD CP 00DH JP Z,SETARG LD (SRCDRV),A SUB 041H CP 004H JP NC,GETSRC GETDST: CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB 'Enter DESTINATION drive: (A B C or D). - ',24H CALL GETCMD LD (DSTDRV),A SUB 041H CP 004H JP NC,GETDST JP CLRARG ; SETARG: LD A,041H LD (SRCDRV),A INC A LD (DSTDRV),A CLRARG: XOR A RET ; CHKPRM: XOR A LD (D0F85),A LD HL,CDRVVF LD A,(CMDSTR) CP 056H JP NZ,A081A LD A,(HL) LD (SRCDRV),A A081A: LD HL,DRVFMT LD A,(CMDSTR) CP 046H JP NZ,A082C LD A,(HL) LD (DSTDRV),A LD (SRCDRV),A A082C: CALL TSTPRG LD (HLPNTR),HL EX DE,HL LD (DEPNTR),HL CALL SETBUF CALL A0CD7 CALL HOMEHD XOR A LD (ERRFLG),A LD A,(D0F91) LD (D0F89),A A0849: CALL TSTEND LD A,(CMDSTR) CP 046H JP Z,A0870 LD A,(SRCDRV) SUB 041H LD (CDRIVE),A LD HL,023E4H LD (D0F8A),HL CALL A08E7 CALL TSTEND LD A,(CMDSTR) CP 056H JP Z,A088C A0870: LD HL,D0F85 LD A,(HL) OR A LD (HL),001H CALL Z,A08BB LD A,(DSTDRV) SUB 041H LD (CDRIVE),A LD HL,023E4H LD (D0F8A),HL CALL A0927 RET C A088C: CALL A0994 LD HL,D0F89 ADD A,(HL) LD (HL),A LD A,(NOTRKS) CP (HL) JP NZ,A0849 RET ; TSTPRG: LD A,(SRCDRV) SUB 041H LD C,A LD A,(CPMFLG) OR A JP Z,TSTMPM LD A,(D0108) OR C LD C,A TSTMPM: CALL MPMCPM JP C,SELERR LD HL,T0F50 LD DE,01400H RET ; A08BB: RET ; ; >> NO VERIFYION PATH TO HERE << LD A,(DSTDRV) SUB 041H LD C,A LD A,(CPMFLG) OR A JP Z,A08CE LD A,(D0108) OR C LD C,A A08CE: CALL MPMCPM JP C,SELERR JP Z,A08D7 A08D7: JP HOMEHD ; MPMCPM: CALL SETDRV LD A,(CPMFLG) OR A RET Z LD A,L OR H RET NZ SCF RET ; A08E7: CALL A0994 LD (D0F8C),A LD A,(D0F89) DEC A LD (D0F8E),A LD HL,(DEPNTR) LD A,L CPL LD E,A LD A,H CPL LD D,A INC DE LD HL,(D0F8A) ADD HL,DE LD (D0F8F),HL A0905: LD HL,D0F8E INC (HL) LD HL,(DEPNTR) EX DE,HL LD HL,(D0F8F) ADD HL,DE LD (D0F8F),HL CALL A0A7D LD A,(CMDSTR) CP 056H CALL Z,A09A8 LD HL,D0F8C DEC (HL) JP NZ,A0905 RET ; A0927: CALL A0994 LD (D0F8C),A LD A,(D0F89) DEC A LD (D0F8E),A LD HL,(DEPNTR) LD A,L CPL LD E,A LD A,H CPL LD D,A INC DE LD HL,(D0F8A) ADD HL,DE LD (D0F8F),HL A0945: LD HL,D0F8E INC (HL) LD HL,(DEPNTR) EX DE,HL LD HL,(D0F8F) ADD HL,DE LD (D0F8F),HL LD A,(D0103) INC A LD (D0F95),A A095B: LD HL,D0F95 DEC (HL) JP M,A0980 CALL A0A88 LD HL,(D0F8F) LD (D0F9F),HL LD HL,STACK LD (D0F8F),HL CALL A0A7D LD HL,(D0F9F) LD (D0F8F),HL CALL A0B48 JP NZ,A095B A0980: CALL A09A8 CALL A09AE SCF RET Z CALL TSTEND LD HL,D0F8C DEC (HL) JP NZ,A0945 XOR A RET ; A0994: LD A,(D0F89) LD B,A LD A,(D0F88) LD C,A INC C A099D: DEC C LD A,(NOTRKS) SUB B CP C JP C,A099D LD A,C RET ; A09A8: CALL DISPLAY LD HL,0C924H A09AE: LD A,(CMDSTR) CP 04EH JP Z,A09BB CP 04DH JP NZ,A09DA A09BB: LD A,(D0F8E) CP 002H JP C,A09DA LD HL,(DEPNTR) LD B,H LD C,L LD HL,STACK A09CB: LD A,(HL) CP 0E5H JP NZ,A09DA INC HL DEC BC LD A,B OR C JP NZ,A09CB XOR A RET ; A09DA: LD A,001H OR A RET ; SETBUF: LD HL,(X0006) LD L,000H LD DE,0F01DH ADD HL,DE PUSH HL LD HL,(DEPNTR) EX DE,HL LD A,(00007) LD B,A LD C,000H LD HL,023E4H FNDTOP: ADD HL,DE INC C LD A,H CP B JP C,FNDTOP DEC C LD A,C LD (D0F88),A POP BC LD HL,STACK BUFTST: LD A,01AH LD (HL),A CP (HL) JP NZ,MMFAIL CPL LD (HL),A CP (HL) JP NZ,MMFAIL INC HL DEC BC LD A,B OR C JP NZ,BUFTST RET ; MMFAIL: CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB 'ABORTING due to memory failure in buffer.',0DH,0AH DEFB 'Insert CP/M system disk and press . - ',24H CALL GETCMD JP RETCPM ; A0A7D: CALL TSTEND LD A,00DH LD (TRPFLG),A JP A0C5B ; A0A88: CALL TSTEND JP A0C60 ; ; >> NO EXECUTION PATH TO HERE << LD A,001H LD (D0F97),A LD A,(CDRIVE) LD C,A CALL SETDRV LD A,(D0F8E) LD C,A LD B,000H CALL SETTRK LD C,001H LD HL,(D0F8F) A0AA8: PUSH BC PUSH HL CALL A0E4A LD B,000H CALL SETSEC POP BC PUSH BC CALL SETDMA LD A,(D0103) INC A LD B,A A0ABC: DEC B JP M,A0AC9 PUSH BC CALL READSK POP BC OR A JP NZ,A0ABC A0AC9: POP HL LD DE,00080H ADD HL,DE POP BC CALL NZ,A0BC6 INC C CALL A0B36 LD A,E INC A CP C JP NZ,A0AA8 RET ; ; >> NO EXECUTION PATH TO HERE << LD A,001H LD (D0F97),A LD A,(CDRIVE) LD C,A CALL SETDRV LD A,(D0F8E) LD C,A LD B,000H CALL SETTRK LD C,001H LD HL,(D0F8F) A0AF7: PUSH BC PUSH HL CALL A0E4A LD B,000H CALL SETSEC POP BC PUSH BC CALL SETDMA LD A,(D0103) INC A LD B,A A0B0B: DEC B JP M,A0B22 PUSH BC CALL A0CC5 LD C,002H CALL WRTDSK PUSH AF CALL A0CCF POP AF POP BC OR A JP NZ,A0B0B A0B22: POP HL LD DE,00080H ADD HL,DE POP BC CALL NZ,A0BD6 INC C CALL A0B36 LD A,E INC A CP C JP NZ,A0AF7 RET ; A0B36: LD A,(D0105) LD E,A LD A,(D0F8E) OR A RET NZ LD A,(A0107) OR A RET Z LD E,01AH SCF RET ; A0B48: XOR A LD (D0F93),A CALL A0B36 LD BC,0D00H JP C,A0B5A LD HL,(DEPNTR) LD C,L LD B,H A0B5A: LD HL,(D0F8F) EX DE,HL LD HL,STACK LD A,(DE) CP (HL) JP Z,A0B70 LD A,(D0F95) OR A LD A,001H RET NZ CALL A0B9E A0B70: INC HL INC DE DEC BC LD A,C OR B JP NZ,A0B5A XOR A RET ; SELERR: CALL DISPLAY DEFB 0DH,0AH DEFB '***** Select error *****',24H CALL A0C13 JP START ; A0B9E: LD A,001H LD (D0F97),A PUSH HL PUSH DE PUSH BC LD DE,0F01DH ADD HL,DE ADD HL,HL INC H LD C,H LD HL,D0F93 LD A,C CP (HL) LD (HL),A JP Z,A0C0C CALL DISPLAY DEFB 0DH,0AH DEFB 'Compare',24H JP A0BE4 ; A0BC6: PUSH HL PUSH DE PUSH BC CALL DISPLAY DEFB 0DH,0AH DEFB 'Read',24H JP A0BE4 ; A0BD6: PUSH HL PUSH DE PUSH BC CALL DISPLAY DEFB 0DH,0AH DEFB 'Write',24H ; A0BE4: CALL DISPLAY DEFB ' error at ',24H PUSH BC CALL A0C29 POP BC LD A,(D0F97) OR A CALL NZ,A0C40 CALL A0C13 CALL DISPLAY RLCA JR NZ,A0C2B LD A,0FFH LD (ERRFLG),A A0C0C: CALL TSTEND POP BC POP DE POP HL RET ; A0C13: CALL DISPLAY DEFB ' on drive ',24H LD A,(CDRIVE) ADD A,041H JP ABORT ; A0C29: LD A,(D0F8E) A0C2B: LD HL,T0C3C CALL TRKNUM CALL DISPLAY DEFB ' Track ' T0C3C: DEFB 020H DEFB 020H,24H RET ; A0C40: CALL A0E4A LD A,C LD HL,T0C57 CALL TRKNUM CALL DISPLAY DEFB ' - Sector ' T0C57: DEFB 020H DEFB 020H,24H RET ; A0C5B: LD E,001H JP A0C62 ; A0C60: LD E,000H A0C62: XOR A LD (D0F97),A LD A,(D0103) INC A LD B,A LD A,E OR A CALL Z,A0CC5 A0C70: PUSH BC LD A,(CDRIVE) INC A LD C,A LD A,(D0CC4) AND 080H OR C LD C,A LD HL,D0F8E LD B,(HL) LD A,(D0CC4) AND 040H JP Z,A0C9C LD A,(D0104) LD D,A DEC A LD HL,D0F8E SUB (HL) LD B,(HL) JP NC,A0C9C ADD A,D LD B,A LD A,C OR 040H LD C,A A0C9C: LD D,000H LD HL,(D0F8F) LD A,00AH CALL ALTTRN POP BC OR A JP Z,A0CBE DEC B JP NZ,A0C70 LD A,003H OR A JP NZ,A0CBB CALL A0BD6 JP A0CBE ; A0CBB: CALL A0BC6 A0CBE: PUSH AF CALL A0CCF POP AF RET ; ; >> NO EXECUTION PATH TO HERE << D0CC4: NOP A0CC5: LD A,(D0F98) AND 0BFH LD HL,(D0F99) LD (HL),A RET ; A0CCF: LD A,(D0F98) LD HL,(D0F99) LD (HL),A RET ; A0CD7: LD HL,(D0F99) LD A,L OR H JP NZ,A0CEF LD HL,(0001) LD L,008H LD H,(HL) DEC H LD L,0FFH LD A,(HL) LD (D0F98),A LD (D0F99),HL A0CEF: LD A,(CPMFLG) OR A JP NZ,A0D3B LD A,(SRCDRV) SUB 041H CALL A0D2A LD (D0CC4),A LD A,(DSTDRV) SUB 041H CALL A0D2A LD HL,D0CC4 CP (HL) RET Z CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB 'Density mismatch ',24H JP RETCPM A0D2A: LD C,A INC C LD HL,(D0F99) LD L,0FBH LD A,(HL) A0D32: RRCA RRCA DEC C JP NZ,A0D32 AND 080H RET ; A0D3B: LD HL,(D0F99) LD L,0FAH LD A,(SRCDRV) SUB 041H LD C,A LD B,000H ADD HL,BC LD A,(HL) LD (D0CC4),A AND 040H JP Z,A0D68 LD A,(SRCDRV) SUB 041H CALL A0D8B JP NC,A0D68 LD A,(DSTDRV) SUB 041H CALL A0D8B JP C,A0D70 A0D68: LD A,(D0CC4) AND 0BFH LD (D0CC4),A A0D70: LD A,(D0104) LD B,A LD A,(D0CC4) AND 040H JP Z,A0D7F LD A,B ADD A,B LD B,A A0D7F: LD HL,NOTRKS LD A,(HL) CP 002H JP Z,A0D89 LD (HL),B A0D89: XOR A RET ; A0D8B: LD C,A INC C LD HL,(D0F99) LD L,0F8H LD A,(HL) A0D93: DEC C RLCA JP NZ,A0D93 RET ; ; >> NO EXECUTION PATH TO HERE << RET ; TRKNUM: LD B,00AH CALL SETCNT ADD A,030H LD (HL),A DEC HL LD A,030H CP (HL) RET NZ LD (HL),020H RET ; SETCNT: LD (HL),02FH SETFLG: INC (HL) SUB B JP NC,SETFLG ADD A,B INC HL RET ; ABORT: PUSH AF CALL TSTEND POP AF LD E,A LD C,002H JP BDOS ; A0DBF: LD C,009H JP BDOS ; DISPLAY: EX (SP),HL LD A,(HL) INC HL EX (SP),HL CP 024H RET Z PUSH HL CALL ABORT POP HL JP DISPLAY ; GETCMD: XOR A LD DE,T0DFE LD (DE),A DEC DE LD C,00AH CALL BDOS LD HL,T0DFE LD C,(HL) INC HL LD B,000H ADD HL,BC LD (HL),00DH INC C CONVRT: LD A,(HL) CALL A0DF4 LD (HL),A DEC HL DEC C JP NZ,CONVRT RET ; A0DF4: CP 060H RET C CP 07BH RET NC AND 05FH RET ; T0DFE: DEFB 0DH A0DFF: DEFS 16 DEFB 0DH TSTEND: CALL CONSTT OR A RET Z CALL CONINN CP 01BH RET NZ CALL DISPLAY DEFB 0DH,0AH,0DH,0AH DEFB 'Console ESCAPE has aborted the copy.',24H JP START ; A0E4A: LD B,000H DEC C CALL A0B36 LD HL,T0F50 JP C,A0E6D LD HL,(HLPNTR) LD A,(D0106) OR A JP Z,A0E6D LD A,(CPMFLG) OR A JP Z,A0E6D EX DE,HL CALL SECTRN LD C,L RET ; A0E6D: LD B,000H ADD HL,BC LD C,(HL) RET ; SETJMP: LD A,(0002) LD HL,CONSTT+2 LD B,00DH STLOOP: LD (HL),A INC HL INC HL INC HL DEC B JP NZ,STLOOP LD A,(CPMFLG) OR A RET NZ LD HL,ALTTRN+1 LD A,(HL) SUB 003H LD (HL),A RET ; CONSTT: JP X0006 ; CONINN: JP X0009 ; JP X0006 ; HOMEHD: JP X0018 ; SETDRV: JP X001B ; SETTRK: JP X001E ; SETSEC: JP X0021 ; SETDMA: JP X0024 ; READSK: JP X0027 ; WRTDSK: JP X002A ; JP X002D ; SECTRN: JP X0030 ; ALTTRN: JP X0033 ; ; DEFS 10 T0EC0: DEFB 0DH,0AH,0DH,0AH DEFB 'Disk copy for double/quad CP/M2 on North Star.',0DH,0AH DEFB 'Source disk controls density and number of sides.',24H DEFB 000H DEFS 26 DEFB 'Translate table ' T0F50: DEFB 01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH DEFB 10H,11H,12H,13H,14H,15H,16H,17H,18H,19H,1AH,1BH,1CH,1DH,1EH,1FH DEFB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H,2AH,2BH,2CH,2DH,2EH,2FH DEFB 30H,31H,32H,33H,34H TRPFLG: DEFB 000H D0F85: DEFB 000H CPMFLG: DEFB 000H DEFB 000H D0F88: DEFB 000H D0F89: DEFB 000H D0F8A: DEFB 000H DEFB 000H D0F8C: DEFB 000H CDRIVE: DEFB 000H D0F8E: DEFB 000H D0F8F: DEFB 000H DEFB 000H D0F91: DEFB 000H NOTRKS: DEFB 000H D0F93: DEFB 000H ERRFLG: DEFB 000H D0F95: DEFB 000H CMDSTR: DEFB 000H D0F97: DEFB 000H D0F98: DEFB 000H D0F99: DEFB 000H DEFB 000H HLPNTR: DEFB 000H DEFB 000H DEPNTR: DEFB 000H DEFB 000H D0F9F: DEFB 000H DEFS 65 STACK: DEFS 29 END