home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG019.ARK
/
COPY.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
6KB
|
208 lines
;;; 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