home *** CD-ROM | disk | FTP | other *** search
- ;;; COPY - COPY DISK A TO B
- ;
- ; L.E. HUGHES 8080SDC 77/10/29
-
- ; MSIZE MUST AGREE WITH CP/M SIZE
-
- MSIZE EQU 32
-
- MEMT EQU MSIZE*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
-
- ITRK EQU 0 ;INITIAL TRACK TO COPY
- LTRK EQU 76 ;LAST TRACK TO COPY
-
- ORG 100H
- COPY: LXI H,0
- DAD SP
- SHLD OLDSP
- LXI SP,STACK+64
-
- ; ALLOW USER TO MOUNT DISK(S) BEFORE PROCEEDING
-
- LXI H,STR1 ;PRINT 'TYPE CR TO COPY A ONTO B'
- CALL WASC
- CALL RACC
- CPI CR
- JNZ COPYX ;EXIT IF RESPONSE IS ANYTHING BUT CR
-
- ; BEGIN MAIN LOOP
-
- LXI H,STR4 ;PRINT HEADER
- CALL WASC
- LXI H,STR5
- CALL WASC
- MVI A,ITRK ;INITIAL TRACK NUMBER
- STA TRKNO
- COPY2: MVI C,DISKA ;SELECT DRIVE A
- CALL SELDSK
- LDA TRKNO ;SET TRACK NUMBER
- MOV C,A
- CALL SETTRK
- LXI H,TBUF ;SET INITIAL DMA ADDRESS
- SHLD DMAPTR
- MVI A,1 ;INITIAL SECTOR NUMBER
- STA SECNO
- COPY3: LDA SECNO ;SET SECTOR NUMBER
- LXI H,SMAP-1
- MVI D,0
- MOV E,A
- DAD D
- MOV C,M
- CALL SETSEC
- LHLD DMAPTR ;SET DMA ADDRESS
- MOV B,H
- MOV C,L
- CALL SETDMA
- CALL READ ;READ SECTOR
- LHLD DMAPTR ;ADD 80H TO DMA PTR
- MOV A,L
- ADI 80H
- MOV L,A
- JNC $+4
- INR H
- SHLD DMAPTR
- LXI H,SECNO ;ADD 1 TO SECTOR NUMBER
- INR M
- MOV A,M
- CPI 26+1 ;LOOP THRU ENTIRE TRACK
- JC COPY3
-
- ; WRITE TBUF TO CURRENT TRACK ON DISK B
-
- MVI C,DISKB ;SELECT DISK B
- CALL SELDSK
- LDA TRKNO ;SET TRACK NUMBER
- MOV C,A
- CALL SETTRK
- LXI H,TBUF ;SET DMA ADDRESS
- SHLD DMAPTR
- MVI A,1 ;SET INITIAL SECTOR NUMBER
- STA SECNO
- COPY4: LDA SECNO ;SET SECTOR NUMBER
- LXI H,SMAP-1
- MVI D,0
- MOV E,A
- DAD D
- MOV C,M
- CALL SETSEC
- LHLD DMAPTR ;SET DMA ADDRESS
- MOV B,H
- MOV C,L
- CALL SETDMA
- CALL WRITE ;WRITE SECTOR
- LHLD DMAPTR ;ADD 80H TO DMAPTR
- MOV A,L
- ADI 80H
- MOV L,A
- JNC $+4
- INR H
- SHLD DMAPTR
- LXI H,SECNO ;ADD 1 TO SECTOR NUMBER
- INR M
- MOV A,M
- CPI 26+1 ;LOOP THRU ENTIRE TRACK
- JC COPY4
-
- ; ADVANCE TO NEXT TRACK
-
- MVI A,'*'
- CALL WACC
- LXI H,TRKNO
- INR M
- MOV A,M
- CPI LTRK+1 ;LOOP THRU ENTIRE DISK
- JC COPY2
-
- ; ALL DONE
-
- COPY5: LXI H,STR2 ;PRINT 'COPY COMPLETE'
- JMP COPY6
- COPYX: LXI H,STR3 ;PRINT 'COPY ABORTED'
- COPY6: CALL WASC
- LHLD OLDSP ;EXIT TO CP/M
- SPHL
- RET
-
- ; WASC - WRITE ASCII STRING TO CONSOLE
-
- WASC: MOV A,M
- ORA A
- RZ
- CALL WACC
- INX H
- JMP WASC
-
- ; 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
-
- ; OUTPUT STRINGS
-
- STR1: DB 'TYPE CR TO COPY A ONTO B',CR,LF,0
- STR2: DB CR,LF,'COPY COMPLETE',CR,LF,0
- STR3: DB 'COPY ABORTED',CR,LF,0
- STR4: DB ' 1 2 3 4'
- DB ' 5 6 7',CR,LF,0
- STR5: DB '01234567890123456789012345678901234567890'
- DB '123456789012345678901234567890123456',CR,LF,0
-
- ; 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
-
- TBUF: DS 26*128 ;TRACK BUFFER
-
- END
-