CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 20:18:31 Page 0001 *** CDOSCOPY *** 0001 ; Disk Copy Utility from CPM Users Group 0002 ; Modified for CDOS by Trevor Marshall 0003 ; Elec Eng Dept 0004 ; Uni W.A. 0005 ; Jan 1980 0006 ; 0007 ; Rewritten for 2.36 CDOS (Double Density) 0008 ; Automatic disk label checking, 0009 ; Sept 1980, Trevor Marshall 0010 ; 0011 ; (0100) 0012 ORG 100H 0100 C34201 R 0013 JP COPY 0014 ; BIOS FUNCTION CALLING TABLE 0103 CD2D01 0015 WBOOT: CALL BIOSGO 0106 CD2D01 0016 CONST: CALL BIOSGO 0109 CD2D01 0017 CONIN: CALL BIOSGO 010C CD2D01 0018 CONOUT: CALL BIOSGO 010F CD2D01 0019 LIST: CALL BIOSGO 0112 CD2D01 0020 PUNCH: CALL BIOSGO 0115 CD2D01 0021 READER: CALL BIOSGO 0118 CD2D01 0022 HOME: CALL BIOSGO 011B CD2D01 0023 SELDSK: CALL BIOSGO 011E CD2D01 0024 SETTRK: CALL BIOSGO 0121 CD2D01 0025 SETSEC: CALL BIOSGO 0124 CD2D01 0026 SETDMA: CALL BIOSGO 0127 CD2D01 0027 READ: CALL BIOSGO 012A CD2D01 0028 WRITE: CALL BIOSGO 012D E3 0029 BIOSGO: EX (SP),HL ; Get call addr in HL, save HL on stack 012E D5 0030 PUSH DE ; Save DE 012F EB 0031 EX DE,HL ; Move call addr to DE 0130 2A0100 0032 LD HL,(1) ; Get BIOS entry address 0133 19 0033 ADD HL,DE ; Add call addr to entry ad dr 0134 110601 0034 LD DE,[WBOOT+3]; Get start of table 0035 ; Subtract DE from HL in 8080 code (for compatibility) 0137 7B 0036 LD A,E 0138 2F 0037 CPL 0139 5F 0038 LD E,A 013A 7A 0039 LD A,D 013B 2F 0040 CPL 013C 57 0041 LD D,A ;Now have 1s compl of DE 013D 13 0042 INC DE ;2s compl 013E 19 0043 ADD HL,DE ;Done! 013F D1 0044 POP DE ; Restore DE 0140 E3 0045 EX (SP),HL ; Restore HL, put jump addr on stack 0141 C9 0046 RET ; Jump to BIOS routine 0047 ; Original coding by: 0048 ; L.E. HUGHES 8080SDC 77/10/29 0049 ; 0050 ; Modified by Trevor Marshall 0051 ; E.E.Dept 0052 ; Uni W.A. 0053 ; 0054 ; to work with any sized CDOS system 0055 ; and to prompt for drives 0056 ; 0057 0058 ; MISC SYMBOLS CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 20:18:31 Page 0002 *** CDOSCOPY *** 0059 (000A) 0060 LF EQU 0AH ;LINE FEED (000D) 0061 CR EQU 0DH ;CARRIAGE RETURN 0062 (0000) 0063 ITRK EQU 0 ;INITIAL TRACK TO COPY (004C) 0064 LTRK EQU 76 ;LAST TRACK TO COPY 0065 (0005) 0066 BDOS: EQU 5 0067 ; 0142 210000 0068 COPY: LD HL,0 0145 39 0069 ADD HL,SP 0146 22E006 0070 LD (OLDSP),HL 0149 312207 0071 LD SP,STACK+64 0072 ; 0073 ; ALLOW USER TO MOUNT DISK(S) BEFORE PROCEEDING 0074 014C 0E96 0075 AGAIN: LD C,96H ;Turn drive motors off 014E CD0500 0076 CALL BDOS 0077 ; 0151 219704 0078 LD HL,CRLF 0154 CDFE02 0079 CALL WASC 0157 215504 0080 LD HL,STR1 ;PRINT 'Source Disk Drive,etc' 015A CDFE02 0081 CALL WASC 015D CD1503 0082 CALL RACC 0160 FE03 0083 CP 3 ;CTL-C ABORT 0162 CAF702 0084 JP Z,EXIT1 0165 CD0803 0085 CALL WACC 0168 D641 0086 SUB 'A' 016A DA4C01 R 0087 JP C,AGAIN ;Invalid entry 016D FE03 0088 CP 3 016F D24C01 R 0089 JP NC,AGAIN 0172 322E07 0090 LD (SOURCE),A 0175 219704 0091 LD HL,CRLF 0178 CDFE02 0092 CALL WASC 0093 ; Now prompt for destination 017B 219A04 0094 LD HL,STR1A 017E CDFE02 0095 CALL WASC 0181 CD1503 0096 CALL RACC 0184 CD0803 0097 CALL WACC 0187 D641 0098 SUB 'A' 0189 DA4C01 R 0099 JP C,AGAIN 018C FE03 0100 CP 3 018E D24C01 R 0101 JP NC,AGAIN 0191 322F07 0102 LD (DEST),A 0194 212E07 0103 LD HL,SOURCE 0197 4E 0104 LD C,(HL) 0198 B9 0105 CP A,C 0199 CA4C01 R 0106 JP Z,AGAIN 019C 219704 0107 LD HL,CRLF 019F CDFE02 0108 CALL WASC 0109 0110 0111 ; Now we must determine whether single or double 0112 ; density disks are in use, and check that we 0113 ; are not trying to copy between incompatible formats 0114 ; 0115 ; We will use the CDOS 1BH cal (Get disk allocation vec) 0116 ; as the disk labels are read before this call returns . 0117 ; This call returns the number of clusters in DE 0118 ; CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 20:18:31 Page 0003 *** CDOSCOPY *** 0119 ; 01A2 0E0D 0120 LD C,0DH ;Reset CDOS 01A4 CD0500 0121 CALL BDOS 0122 ; 01A7 3A2E07 0123 LD A,(SOURCE) ;Select Source drive 01AA 5F 0124 LD E,A 01AB 0E0E 0125 LD C,0EH 01AD CD0500 0126 CALL BDOS 0127 ; 01B0 0E1B 0128 LD C,1BH ;Get CLUSTER.SIZE size map 01B2 CD0500 0129 CALL BDOS ;for first disk 01B5 ED532207 0130 LD (ACLUSTERS),DE 0131 ; 01B9 3A2F07 0132 LD A,(DEST) ;Select Dest. drive 01BC 5F 0133 LD E,A 01BD 0E0E 0134 LD C,0EH 01BF CD0500 0135 CALL BDOS 0136 ; 01C2 0E1B 0137 LD C,1BH ;Get cluster size map 01C4 CD0500 0138 CALL BDOS ;for second disk 01C7 ED532407 0139 LD (BCLUSTERS),DE ;save it 01CB 2A2207 0140 LD HL,(ACLUSTERS) ;get it again 01CE AF 0141 XOR A 01CF ED52 0142 SBC HL,DE ;to compare them 01D1 7D 0143 LD A,L 01D2 B5 0144 OR A,L ;see if HL is zero 01D3 C20802 R 0145 JP NZ,SEND.DIFF.ERROR ;no 0146 ; Now display the disks in use and branch to copy S/R 01D6 7B 0147 LD A,E ;LSB of # clusters 01D7 FEFE 0148 CP A,0FEH ;D/D S/S? 01D9 CA2B03 0149 JP Z,SEND.DD.MSG 01DC FE60 0150 CP A,060H ;D/D D/S 01DE CA2103 0151 JP Z,SEND.DS.MSG 01E1 FEF3 0152 CP A,0F3H ;S/D S/S 01E3 2808 0153 JR Z,SEND.SD.MSG 01E5 FEF7 0154 CP A,0F7H ;S/D D/S 01E7 CA2103 0155 JP Z,SEND.DS.MSG ;Dont use this often, 0156 ;I wont bother to tidy it up 01EA C31302 R 0157 JP SEND.NON.STANDARD.MSG 0158 ; 01ED 114806 0159 SEND.SD.MSG: LD DE,SD.MSG 01F0 0E09 0160 LD C,9 01F2 CD0500 0161 CALL BDOS ;Print it 01F5 3E1B 0162 LD A,1BH ;Max sectors/trk+1 01F7 322907 0163 LD (SECTORS.PER.TRACK),A 01FA 218000 0164 LD HL,80H ;The sector size for S/D 01FD 222A07 0165 LD (DMA.INCR),HL 0200 21C506 0166 LD HL,SDMAP-1 ;Point to sector map 0203 222C07 0167 LD (SECTOR.MAP.ADDRESS),HL 0206 1810 0168 JR MAIN 0169 ; 0208 118706 0170 SEND.DIFF.ERROR: LD DE,DIFF.ERROR.MSG 020B 0E09 0171 L5: LD C,9 020D CD0500 0172 CALL BDOS 0210 C34C01 0173 JP AGAIN 0213 11A306 0174 SEND.NON.STANDARD.MSG: LD DE,NON.STANDARD.ERROR.MSG 0216 18F3 0175 JR L5 0176 ; 0177 ; BEGIN SINGLE DENSITY LOOP 0178 0218 117706 0179 MAIN: LD DE,MSG1 ;Finish disk msg CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 20:18:31 Page 0004 *** CDOSCOPY *** 021B 0E09 0180 LD C,9 021D CD0500 0181 CALL BDOS 0182 ; 0220 211A05 0183 LD HL,STR4 ;PRINT HEADER 0223 CDFE02 0184 CALL WASC 0226 216705 0185 LD HL,STR5 0229 CDFE02 0186 CALL WASC 0187 ; 022C 3E00 0188 LD A,ITRK ;INITIAL TRACK NUMBER 022E 323007 0189 LD (TRKNO),A 0190 COPY2: 0191 ; Check for CTL-C abort 0231 CD0601 0192 CALL CONST 0234 FE00 0193 CP 0 0236 CA4302 R 0194 JP Z,FT1 0239 CD0901 0195 CALL CONIN 023C E65F 0196 AND 5FH 023E FE03 0197 CP 3 ;CTL-C 0240 CAEE02 0198 JP Z,COPYX 0243 3A2E07 0199 FT1: LD A,(SOURCE) ;Select Source Disk 0246 4F 0200 LD C,A 0247 CD1B01 0201 CALL SELDSK 024A 3A3007 0202 LD A,(TRKNO) ;SET TRACK NUMBER 024D 4F 0203 LD C,A 024E CD1E01 0204 CALL SETTRK 0251 213A07 0205 LD HL,TBUF ;SET INITIAL DMA ADDRESS 0254 223207 0206 LD (DMAPTR),HL 0257 3E01 0207 LD A,1 ;INITIAL SECTOR NUMBER 0259 323107 0208 LD (SECNO),A 025C 3A3107 0209 COPY3: LD A,(SECNO) ;SET SECTOR NUMBER 025F 2A2C07 0210 LD HL,(SECTOR.MAP.ADDRESS) 0262 1600 0211 LD D,0 0264 5F 0212 LD E,A 0265 19 0213 ADD HL,DE 0266 4E 0214 LD C,(HL) 0267 CD2101 0215 CALL SETSEC 026A 2A3207 0216 LD HL,(DMAPTR) ;SET DMA ADDRESS 026D 44 0217 LD B,H 026E 4D 0218 LD C,L 026F CD2401 0219 CALL SETDMA 0272 CD2701 0220 CALL READ ;READ SECTOR 0275 2A3207 0221 LD HL,(DMAPTR) ;ADD INCR TO DMA PTR 0278 D5 0222 PUSH DE 0279 ED5B2A07 0223 LD DE,(DMA.INCR) 027D 19 0224 ADD HL,DE 027E D1 0225 POP DE 027F 223207 0226 LD (DMAPTR),HL 0282 213107 0227 LD HL,SECNO ;ADD 1 TO SECTOR NUMBER 0285 34 0228 INC (HL) 0286 7E 0229 LD A,(HL) 0287 212907 0230 LD HL,SECTORS.PER.TRACK 028A BE 0231 CP A,(HL) ;LOOP THRU ENTIRE TRACK 028B DA5C02 R 0232 JP C,COPY3 0233 0234 ; WRITE TBUF TO CURRENT TRACK ON DISK C 0235 028E 3A2F07 0236 LD A,(DEST) ;Select dest dsk 0291 4F 0237 LD C,A 0292 CD1B01 0238 CALL SELDSK 0295 3A3007 0239 LD A,(TRKNO) ;SET TRACK NUMBER 0298 4F 0240 LD C,A CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 20:18:31 Page 0005 *** CDOSCOPY *** 0299 CD1E01 0241 CALL SETTRK 029C 213A07 0242 LD HL,TBUF ;SET DMA ADDRESS 029F 223207 0243 LD (DMAPTR),HL 02A2 3E01 0244 LD A,1 ;SET INITIAL SECTOR NUMBER 02A4 323107 0245 LD (SECNO),A 02A7 3A3107 0246 COPY4: LD A,(SECNO) ;SET SECTOR NUMBER 02AA 2A2C07 0247 LD HL,(SECTOR.MAP.ADDRESS) 02AD 1600 0248 LD D,0 02AF 5F 0249 LD E,A 02B0 19 0250 ADD HL,DE 02B1 4E 0251 LD C,(HL) 02B2 CD2101 0252 CALL SETSEC 02B5 2A3207 0253 LD HL,(DMAPTR) ;SET DMA ADDRESS 02B8 44 0254 LD B,H 02B9 4D 0255 LD C,L 02BA CD2401 0256 CALL SETDMA 02BD CD2A01 0257 CALL WRITE ;WRITE SECTOR 02C0 2A3207 0258 LD HL,(DMAPTR) ;ADD INCR TO DMAPTR 02C3 D5 0259 PUSH DE 02C4 ED5B2A07 0260 LD DE,(DMA.INCR) 02C8 19 0261 ADD HL,DE 02C9 D1 0262 POP DE 02CA 223207 0263 LD (DMAPTR),HL 02CD 213107 0264 LD HL,SECNO ;ADD 1 TO SECTOR NUMBER 02D0 34 0265 INC (HL) 02D1 7E 0266 LD A,(HL) 02D2 212907 0267 LD HL,SECTORS.PER.TRACK 02D5 BE 0268 CP A,(HL) ;LOOP THRU ENTIRE TRACK 02D6 DAA702 R 0269 JP C,COPY4 0270 0271 ; ADVANCE TO NEXT TRACK 0272 02D9 3E2A 0273 LD A,'*' 02DB CD0803 0274 CALL WACC 02DE 213007 0275 LD HL,TRKNO 02E1 34 0276 INC (HL) 02E2 7E 0277 LD A,(HL) 02E3 FE4D 0278 CP LTRK+1 ;LOOP THRU ENTIRE DISK 02E5 DA3102 0279 JP C,COPY2 0280 0281 ; ALL DONE SINGLE DENSITY 0282 02E8 21EC04 0283 COPY5: LD HL,STR2 ;PRINT 'COPY COMPLETE' 02EB C3F102 R 0284 JP COPY6 02EE 21FF04 0285 COPYX: LD HL,STR3 ;PRINT 'COPY ABORTED' 02F1 CDFE02 0286 COPY6: CALL WASC 02F4 C34201 0287 JP COPY 02F7 2AE006 0288 EXIT1: LD HL,(OLDSP) ;EXIT TO CP/M 02FA F9 0289 LD SP,HL 02FB C30000 0290 JP 0 0291 0292 ; WASC - WRITE ASCII STRING TO CONSOLE 0293 02FE 7E 0294 WASC: LD A,(HL) 02FF B7 0295 OR A 0300 C8 0296 RET Z 0301 CD0803 0297 CALL WACC 0304 23 0298 INC HL 0305 C3FE02 R 0299 JP WASC 0300 0301 ; WACC - WRITE ASCII CHARACTER TO CONSOLE CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 20:18:31 Page 0006 *** CDOSCOPY *** 0302 0308 E5 0303 WACC: PUSH HL 0309 D5 0304 PUSH DE 030A C5 0305 PUSH BC 030B F5 0306 PUSH AF 030C 4F 0307 LD C,A 030D CD0C01 0308 CALL CONOUT 0310 F1 0309 POP AF 0311 C1 0310 POP BC 0312 D1 0311 POP DE 0313 E1 0312 POP HL 0314 C9 0313 RET 0314 0315 ; RACC - READ ASCII CHARACTER FROM CONSOLE 0316 0315 E5 0317 RACC: PUSH HL 0316 D5 0318 PUSH DE 0317 C5 0319 PUSH BC 0318 CD0901 0320 CALL CONIN 031B E65F 0321 AND 5FH ;Make LC=UC 031D C1 0322 POP BC 031E D1 0323 POP DE 031F E1 0324 POP HL 0320 C9 0325 RET 0326 0321 3E02 0327 SEND.DS.MSG: LD A,2 0323 322807 0328 LD (SIZE.FLAG),A 0326 115906 0329 LD DE,DS.MSG 0329 1808 0330 JR V1 032B 3E01 0331 SEND.DD.MSG: LD A,1 032D 322807 0332 LD (SIZE.FLAG),A 0330 113706 0333 LD DE,DD.MSG 0333 0E09 0334 V1: LD C,9 0335 CD0500 0335 CALL BDOS 0336 ; 0337 ;Calculate the 2's complement of the block capacity of d isk 0338 2A2207 0338 LD HL,(ACLUSTERS) ;Get # on disk 033B 29 0339 ADD HL,HL ; x2 (16 blocks per cluster) 033C 29 0340 ADD HL,HL ; x4 033D 29 0341 ADD HL,HL ; x8 033E 29 0342 ADD HL,HL ; x16 033F EB 0343 EX DE,HL ;into DE 0340 37 0344 SCF ;add 1 to block capacity 0341 210000 0345 LD HL,0 0344 ED52 0346 SBC HL,DE ;have 2's complement 0346 222607 0347 LD (BLOCK.CAPACITY),HL 0348 ; We cannot use the same approach for D/D disks 0349 ; as for S/D, so we will use a LOGICAL BLOCK 0350 ; approach. Each block is 128 Bytes, I have 0351 ; ~32K free RAM, so will read ~28K at a time 0352 ; (160h, 352d blocks). 0353 ; 0349 117706 0354 DOUBLE: LD DE,MSG1 ;Finish disk msg 034C 0E09 0355 LD C,9 034E CD0500 0356 CALL BDOS 0357 ; 0351 3A2807 0358 LD A,(SIZE.FLAG) ;Is it D/D or D/S ? 0354 FE01 0359 CP 1 ;D/D only? 0356 200E 0360 JR NZ,JJ1 ;No, D/S D/D 0358 21B705 0361 LD HL,STR6 ;PRINT D/D HEADER CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 20:18:31 Page 0007 *** CDOSCOPY *** 035B CDFE02 0362 CALL WASC 035E 21C805 0363 LD HL,STR7 0361 CDFE02 0364 CALL WASC 0364 180C 0365 JR JJ2 0366 ; 0366 21DC05 0367 JJ1: LD HL,STR8 ;PRINT D/S HEADER 0369 CDFE02 0368 CALL WASC 036C 210B06 0369 LD HL,STR9 036F CDFE02 0370 CALL WASC 0371 ; 0372 210000 0372 JJ2: LD HL,0 ;INITIAL BLOCK NUMBER 0375 223407 0373 LD (BLKNO),HL 0374 ; 0375 ; Begin the main (fill buffer) loop 0378 21BA06 0376 DCOPY2: LD HL,TBUF-80H 037B 223207 0377 LD (DMAPTR),HL ;Initialize DMA ptr 037E ED5B3407 0378 LD DE,(BLKNO) ;Block # to DE 0382 ED533607 0379 LD (FIRSTBLK),DE ;Save first blocK # 0380 ; 0381 ; Check for CTL-C abort 0386 CD0601 0382 CALL CONST 0389 FE00 0383 CP 0 038B CA9803 R 0384 JP Z,DFT1 038E CD0901 0385 CALL CONIN 0391 E65F 0386 AND 5FH 0393 FE03 0387 CP 3 ;CTL-C 0395 CAEE02 0388 JP Z,COPYX ;and abort 0389 ; 0390 ; Get enough blocks to fill buffer, one at a time 0398 2A3207 0391 DFT1: LD HL,(DMAPTR) ;ADD INCR TO DMA PTR 039B 118000 0392 LD DE,80H ;Block size is 128 bytes 039E 19 0393 ADD HL,DE 039F 223207 0394 LD (DMAPTR),HL 0395 ; Are we at end of Buffer, 03A2 110080 0396 LD DE,-8000H 03A5 19 0397 ADD HL,DE ;C means .LT. 8000H 03A6 3845 0398 JR C,DCOPY6 ;If so write the buffer 0399 ;Set DMA for DOS 03A8 ED5B3207 0400 LD DE,(DMAPTR) 03AC 0E1A 0401 LD C,1AH 03AE CD0500 0402 CALL BDOS 0403 ; Is this block beyond the end of disk? 03B1 ED5B2607 0404 LD DE,(BLOCK.CAPACITY) 03B5 2A3407 0405 LD HL,(BLKNO) 03B8 19 0406 ADD HL,DE ;see if DE & HL are .EQ. 03B9 7D 0407 LD A,L 03BA B4 0408 OR A,H 03BB CAE802 0409 JP Z,COPY5 ;Z = done copy 0410 ; Read the block 03BE ED5B3407 0411 LD DE,(BLKNO) ;Block # to DE 03C2 0E83 0412 LD C,83H 03C4 212E07 0413 LD HL,SOURCE 03C7 46 0414 LD B,(HL) ;disk # to B 03C8 04 0415 INC B ;For BDOS 03C9 CBF8 0416 SET 7,B ;Set interleaved read 03CB CD0500 0417 CALL BDOS 0418 ; Handle error status 03CE FE01 0419 CP A,1 ;I/O error 03D0 CAEE02 0420 JP Z,COPYX 03D3 FE02 0421 CP A,2 ;Illegal request 03D5 CAEE02 0422 JP Z,COPYX CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 20:18:31 Page 0008 *** CDOSCOPY *** 03D8 FE03 0423 CP A,3 ;Illegal Block 03DA CAEE02 0424 JP EQ,COPYX 0425 ; Now incr the block # 03DD 2A3407 0426 LD HL,(BLKNO) 03E0 23 0427 INC HL 03E1 223407 0428 LD (BLKNO),HL 0429 ; Is this beyond the end of disk? 03E4 ED5B2607 0430 LD DE,(BLOCK.CAPACITY) 03E8 19 0431 ADD HL,DE ;see if DE & HL are .EQ. 03E9 7D 0432 LD A,L 03EA B4 0433 OR A,H 03EB 20AB 0434 JR NZ,DFT1 ;Z = done read 0435 ; Must decr last BLKNO so write does not overrun 03ED 2A3407 0436 DCOPY6: LD HL,(BLKNO) 03F0 2B 0437 DEC HL 03F1 223407 0438 LD (BLKNO),HL 0439 ; 0440 ;Write the buffer if full 0441 DCOPY3: 0442 ; Begin the main (empty buffer) loop 03F4 3E2A 0443 SENDSTAR: LD A,'*' 03F6 CD0803 0444 CALL WACC 0445 ; 03F9 21BA06 0446 LD HL,TBUF-80H 03FC 223207 0447 LD (DMAPTR),HL ;Initialize DMA ptr 0448 ; Save last BLK # and get first # 03FF 2A3407 0449 LD HL,(BLKNO) 0402 223807 0450 LD (LASTBLK),HL 0451 ; 0405 ED5B3607 0452 LD DE,(FIRSTBLK) ;First Block # to DE 0409 ED533407 0453 LD (BLKNO),DE ;Save blocK # 0454 ; 0455 ; Put enough blocks to empty buffer, one at a time 040D 2A3207 0456 DFT2: LD HL,(DMAPTR) ;ADD INCR TO DMA PTR 0410 118000 0457 LD DE,80H ;Block size is 128 bytes 0413 19 0458 ADD HL,DE 0414 223207 0459 LD (DMAPTR),HL 0460 ; Is this beyond the end of disk? 0461 ; LD DE,(BLOCK.CAPACITY) 0462 ; LD HL,(BLKNO) ;get the block # 0463 ; ADD HL,DE ;see if DE & HL are .EQ. 0464 ; LD A,L 0465 ; OR A,H 0466 ; JP Z,COPY5 ;Z = done copy 0467 ; Have we written too many blocks 0417 2A3807 0468 LD HL,(LASTBLK) 041A ED5B3407 0469 LD DE,(BLKNO) 041E AF 0470 XOR A 041F ED52 0471 SBC HL,DE 0421 DA7803 0472 JP C,DCOPY2 ;C if BLKNO > LASTBLK 0473 ; On exit BLKNO will be LASTBLK + 1 0474 ; Which is OK for next read loop 0475 ;Set DMA for DOS 0424 ED5B3207 0476 LD DE,(DMAPTR) 0428 0E1A 0477 LD C,1AH 042A CD0500 0478 CALL BDOS 0479 ; 0480 ; Write the block 042D ED5B3407 0481 LD DE,(BLKNO) ;Block # to DE 0431 0E84 0482 LD C,84H 0433 212F07 0483 LD HL,DEST CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 20:18:31 Page 0009 *** CDOSCOPY *** 0436 46 0484 LD B,(HL) ;disk # to B 0437 04 0485 INC B ;for BDOS 0438 CBF8 0486 SET 7,B ;Set interleaved read 043A CD0500 0487 CALL BDOS 0488 ; Handle error status 043D FE01 0489 CP A,1 ;I/O error 043F CAEE02 0490 JP Z,COPYX 0442 FE02 0491 CP A,2 ;Illegal request 0444 CAEE02 0492 JP Z,COPYX 0447 FE03 0493 CP A,3 ;Illegal Block,done 0449 CAEE02 0494 JP EQ,COPYX 0495 ; Now incr the block # 044C 2A3407 0496 LD HL,(BLKNO) 044F 23 0497 INC HL 0450 223407 0498 LD (BLKNO),HL 0499 ; 0453 18B8 0500 JR DFT2 ;Loop for more blocks 0501 ; 0502 ; 0503 ; OUTPUT STRINGS 0504 0455 536F7572 0505 STR1: DEFB 'Source disk drive (A to D) ?',CR,LF 0473 54797065 0506 DB 'Type if you make an error --- ',0 0497 0D0A00 0507 CRLF: DB cr,lf,0 049A 456E7375 0508 STR1A: db 'Ensure you mount the disks before' 04BB 74797069 0509 db 'typing the : ',cr,lf 04CA 44657374 0510 DB 'Destination drive (A to D) ? --- ',0 04EC 0D0A436F 0511 STR2: DEFB CR,LF,'Copy completed',CR,LF,0 04FF 2A2A2A2A 0512 STR3: DEFB '***** Copy aborted *****',CR,LF,0 051A 0D0A0A 0513 STR4: DEFB 0DH,0AH,0AH 051D 20202020 0514 DB ' 1 2 3 4' 0546 20202020 0515 DEFB ' 5 6 7',CR,LF,0 0567 30313233 0516 STR5: DEFB '012345678901234567890123456789012345678 90' 0590 31323334 0517 DEFB '123456789012345678901234567890123456',C R,LF,0 05B7 0D0A0A 0518 STR6: DB 0DH,0AH,0AH 05BA 20202020 0519 DB ' 1',CR,LF,0 05C8 30313233 0520 STR7: DB '01234567890123456',CR,LF,0 05DC 0D0A0A 0521 STR8: DB 0DH,0AH,0AH 05DF 20202020 0522 DB ' 1 2 3 4',CR,LF,0 060B 30313233 0523 STR9: DB '012345678901234567890123456789012345678 90',CR,LF,0 0524 ; 0637 0D0A446F 0525 DD.MSG: DB 0DH,0AH,'Double Density$' 0648 0D0A5369 0526 SD.MSG: DB 0DH,0AH,'Single Density$' 0659 0D0A446F 0527 DS.MSG: DB 0DH,0AH,'Double sided Double Density$' 0677 20646973 0528 MSG1: DB ' disks mounted.$' 0687 0D0A2A2A 0529 DIFF.ERR.MSG: DB 0DH,0AH,'**** DISK LABEL ERROR ***$' 06A3 0D0A2A2A 0530 NON.STANDARD.ERROR.MSG: DB 0DH,0AH,'**** DISKS ARE NON S TANDARD ****$' 0531 ; 0532 ; SECTOR MAP 0533 06C6 01070D13 0534 SDMAP: DB 1,7,0DH,13H,19H,5,0BH,11H,17H,3,9,0FH,15 H,2 06D4 080E141A 0535 DB 8,0EH,14H,1AH,6,0CH,12H,18H,4,0AH,10H,16 H 0536 ;DDMAP: DB 1,0CH,7,2,0DH,8,3,0EH,9,4,0FH,0AH,5,10H, CROMEMCO Z80 Macro Assembler version 03.07 Nov 30, 1980 20:18:31 Page 0010 *** CDOSCOPY *** 0BH,6 0537 ; 06E0 (0002) 0538 OLDSP: DEFS 2 06E2 (0040) 0539 STACK: DEFS 64 0722 (0002) 0540 ACLUSTERS: DS 2 ;Clusters on DSK 1 0724 (0002) 0541 BCLUSTERS: DS 2 ;Clusters on DSK 2 0726 (0002) 0542 BLOCK.CAPACITY: DS 2 ;Blocks on the disk 0728 (0001) 0543 SIZE.FLAG: DS 1 ;D/D OR D/S ? 0729 (0001) 0544 SECTORS.PER.TRACK: DS 1 072A (0002) 0545 DMA.INCR: DS 2 072C (0002) 0546 SECTOR.MAP.ADDRESS: DS 2 072E (0001) 0547 SOURCE: DS 1 ;SOURCE DRIVE # 072F (0001) 0548 DEST: DS 1 ;DEST DRIVE # 0549 0730 (0001) 0550 TRKNO: DEFS 1 ;TRACK NUMBER 0731 (0001) 0551 SECNO: DEFS 1 ;SECTOR NUMBER 0732 (0002) 0552 DMAPTR: DEFS 2 ;DMA POINTER 0734 (0002) 0553 BLKNO: DS 2 0736 (0002) 0554 FIRSTBLK: DS 2 0738 (0002) 0555 LASTBLK: DS 2 0556 ; 0557 ; THe buffer for D/D is assumed 45 K long 073A (0D00) 0558 TBUF: DEFS 26*128 ;TRACK BUFFER 0559 143A (0100) 0560 END 100H Errors 0 Range Count 14 Parity Count 0