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
/
SCOPY.ASM
< prev
next >
Wrap
Assembly Source File
|
1985-02-10
|
8KB
|
284 lines
;;; 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