home *** CD-ROM | disk | FTP | other *** search
- ;;; COPY - COPY DISK A TO B
- ;
- ; L.E. HUGHES 8080SDC 77/10/29
-
- ; MEMS MUST AGREE WITH CP/M SIZE
-
- MEMS EQU 32
-
- MEMT EQU MEMS*1024
- BIOS EQU MEMT-3*256
-
- ; BIOS ENTRY POINTS
-
- CONSTA EQU BIOS+06H ;CONSOLE STATUS (A=0, NO DATA)
- CONIN EQU BIOS+09H ;CONSOLE INPUT (INTO A)
- CONOUT EQU BIOS+0CH ;CONSOLE OUTPUT (FROM C)
- SELDSK EQU BIOS+1BH ;SELECT DISK (FROM C, 0..1)
- SETTRK EQU BIOS+1EH ;SET TRACK (FROM C, 0..76)
- SETSEC EQU BIOS+21H ;SET SECTOR (FROM C, 1..26)
- SETDMA EQU BIOS+24H ;SET DMA ADDRESS (FROM BC)
- READ EQU BIOS+27H ;READ SECTOR INTO DMA BUFFER
- WRITE EQU BIOS+2AH ;WRITE SECTOR FROM DMA BUFFER
-
- ; MISC SYMBOLS
-
- LF EQU 0AH ;LINE FEED
- CR EQU 0DH ;CARRIAGE RETURN
-
- DISKA EQU 0
- DISKB EQU 1
-
- BOOT EQU 0000H
-
- ITRK EQU 0
- LTRK EQU 76
-
- BUF EQU 400H
- NTRKS EQU LTRK-ITRK+1 ;NUMBER OF TRACKS
- BSIZE EQU BIOS-BUF ;BUFFER SIZE
- NBPT EQU 128*26 ;NUMBER OF BYTES PER TRACK
- NTPP EQU BSIZE/NBPT ;NUMBER OF TRACKS PER PASS
- NP EQU (NTRKS/NTPP)+1 ;NUMBER OF PASSES
- NTLP EQU NTRKS-(NP-1)*NTPP ;NUMBER OF TRACKS IN LAST PASS
-
- ORG 100H
- COPY: LXI SP,STACK+64
-
- ; PRINT HEADING
-
- MVI A,(MEMS/10)+'0'
- CALL WACC
- MVI A,(MEMS MOD 10)+'0'
- CALL WACC
- LXI H,STR1
- CALL WASC
- IF NP/10
- MVI A,(NP/10)+'0'
- CALL WACC
- ENDIF
- MVI A,(NP MOD 10)+'0'
- CALL WACC
- LXI H,STR2
- CALL WASC
- XRA A
- STA TRKI
- STA TRKO
- MVI A,NP
- STA PCOUNT
-
- ; BEGIN MAIN LOOP
-
- COPY1: LXI H,STR3 ;PRINT 'MOUNT OLD DISK, THEN TYPE CR'
- CALL WASC
- CALL RACC
- CALL WEOLC
- LXI H,BUF ;PTR = FWA OF BUFFER
- SHLD PTR
- MVI A,NTPP ;TCOUNT = NUMBER OF TRACKS
- STA TCOUNT
- LDA PCOUNT
- ORA A
- JNZ COPY2
- MVI A,NTLP
- STA TCOUNT
- COPY2: LHLD PTR ;READ NEXT N TRACKS
- LDA TRKI
- CALL RDTRK
- LHLD PTR
- LXI D,NBPT
- DAD D
- SHLD PTR
- LDA TRKI
- INR A
- STA TRKI
- LDA TCOUNT
- DCR A
- STA TCOUNT
- JNZ COPY2
- LXI H,STR4 ;PRINT 'MOUNT NEW DISK, THEN TYPE CR'
- CALL WASC
- CALL RACC
- CALL WEOLC
- LXI H,BUF ;PTR = FWA OF BUFFER
- SHLD PTR
- MVI A,NTPP ;TCOUNT = NUMBER OF TRACKS PER PASS
- STA TCOUNT
- LDA PCOUNT
- ORA A
- JNZ COPY3
- MVI A,NTLP
- STA TCOUNT
- COPY3: LHLD PTR ;WRITE NEXT N TRACKS
- LDA TRKO
- CALL WRTRK
- LHLD PTR
- LXI D,NBPT
- DAD D
- SHLD PTR
- LDA TRKO
- INR A
- STA TRKO
- LDA TCOUNT
- DCR A
- STA TCOUNT
- JNZ COPY3
- LDA PCOUNT
- DCR A
- STA PCOUNT
- JNZ COPY1 ;LOOP UNTIL ALL PASSES DONE
- LXI H,STR5 ;PRINT 'COPY COMPLETE'
- CALL WASC
- JMP BOOT
-
- ;; RDTRK - READ ABSOLUTE TRACK INTO MEMORY
- ;
- ; ENTRY CONDITIONS
- ; HL........FWA OF AREA TO READ TRACK INTO
- ; A.........TRACK NUMBER (0 TO 76)
-
- RDTRK: PUSH B
- PUSH D
- PUSH H
- SHLD DMAPTR
- MOV C,A
- CALL SETTRK
- MVI A,1 ;INITIAL SECTOR #
- STA SECNO
- RDTRK1: LDA SECNO
- LXI H,SMAP-1
- MVI D,0
- MOV E,A
- DAD D
- MOV C,M
- CALL SETSEC
- LHLD DMAPTR
- MOV B,H
- MOV C,L
- CALL SETDMA
- CALL READ
- LHLD DMAPTR
- LXI D,80H
- DAD D
- SHLD DMAPTR
- LXI H,SECNO
- INR M
- MOV A,M
- CPI 26+1
- JC RDTRK1
- POP H
- POP D
- POP B
- RET
-
- ;; WRTRK - WRITE ABSOLUTE TRACK FROM MEMORY
- ;
- ; ENTRY CONDITIONS
- ; HL........FWA OF AREA TO WRITE TRACK FROM
- ; A.........TRACK NUMBER (0 TO 76)
-
- WRTRK: PUSH B
- PUSH D
- PUSH H
- SHLD DMAPTR
- MOV C,A
- CALL SETTRK
- MVI A,1 ;INITIAL SECTOR #
- STA SECNO
- WRTRK1: LDA SECNO
- LXI H,SMAP-1
- MVI D,0
- MOV E,A
- DAD D
- MOV C,M
- CALL SETSEC
- LHLD DMAPTR
- MOV B,H
- MOV C,L
- CALL SETDMA
- CALL WRITE
- LHLD DMAPTR
- LXI D,80H
- DAD D
- SHLD DMAPTR
- LXI H,SECNO
- INR M
- MOV A,M
- CPI 26+1
- JC WRTRK1
- POP H
- POP D
- POP B
- RET
-
- ; STRING DATA
-
- STR1: DB 'K SINGLE DRIVE DISK COPY UTILITY V1.0',CR,LF,0
- STR2: DB ' PASSES REQUIRED TO COPY ENTIRE DISK',CR,LF,0
- STR3: DB 'MOUNT OLD DISK, THEN TYPE CR',0
- STR4: DB 'MOUNT NEW DISK, THEN TYPE CR',0
- STR5: DB 'COPY COMPLETE',CR,LF,0
-
- ; WASC - WRITE ASCII STRING TO CONSOLE
-
- WASC: MOV A,M
- ORA A
- RZ
- CALL WACC
- INX H
- JMP WASC
-
- ; WEOLC - WRITE END OF LINE TO CONSOLE
-
- WEOLC: MVI A,CR
- CALL WACC
- MVI A,LF
- JMP WACC
-
- ; WACC - WRITE ASCII CHARACTER TO CONSOLE
-
- WACC: PUSH H
- PUSH D
- PUSH B
- MOV C,A
- CALL CONOUT
- POP B
- POP D
- POP H
- RET
-
- ; RACC - READ ASCII CHARACTER FROM CONSOLE
-
- RACC: PUSH H
- PUSH D
- PUSH B
- CALL CONIN
- ANI 7FH
- POP B
- POP D
- POP H
- RET
-
- ; SECTOR MAP
-
- SMAP: DB 01,06,11,16,21,26
- DB 05,10,15,20,25
- DB 04,09,14,19,24
- DB 03,08,13,18,23
- DB 02,07,12,17,22
-
- OLDSP: DS 2
- STACK: DS 64
-
- TRKNO: DS 1 ;TRACK NUMBER
- SECNO: DS 1 ;SECTOR NUMBER
- DMAPTR: DS 2 ;DMA POINTER
-
- PTR: DS 2
- TRKI: DS 1 ;INPUT TRACK NUMBER
- TRKO: DS 1 ;OUTPUT TRACK NUMBER
- PCOUNT: DS 1 ;PASS COUNT
- TCOUNT: DS 1 ;TRACK COUNT
-
- END
-