home *** CD-ROM | disk | FTP | other *** search
- ;************************************************************
- ;THIS PROGRAM IS A MODIFICATION OF "COPYATOB.COM" WHICH
- ;HAS BEEN RE-WRITTEN TO OPERATE BOTH THROUGH CPM BDOS CALLS
- ;AND DIRECTLY WITH BIOS PRIMITIVES. THE PROGRAM CAN BE
- ;USED TO COPY TRACKS 0 AND 1 WITH THE COMMAND "COPY SYSTEM"
- ; 2 TO 76 WITH THE COMMAND "COPY DATA" AND
- ; 0 TO 76 WITH THE COMMAND "COPY ALL"
- ;THE PROGRAM WILL OPERATE WITH A STANDARD CPM SYSTEM OF ANY
- ;SIZE. BECAUSE OF THE POTENTIAL POWER OF THIS PROGRAM
- ;THE INITIATING COMMAND IS TESTED FOR PRECISE SYNTAX.
- ;TONY GOLD (212) 722-3416.
- ;------------------------------------------------------------
- ;7/23/77
- ;THIS PROGRAM HAS BEEN REWRITTEN TO REMOVE THE DEPENDENCE
- ;ON THE LOCATION OF THE SCRATCH AREA, SO THAT IT CAN BE
- ;USED WITH THE DIGITAL SYSTEMS FDC3 CONTROLLER.
- ;
- ;ALSO THE PROGRAM PAUSES AFTER LOADING SO THAT THE DISKS
- ;CAN BE CHANGED.
- ;TOM KIRK (609) 921-0321.
- ;************************************************************
- ORG 100H
- ;
- ;
- JMP VECTOR
- ;************************************************************
- HOME: JMP DUMYADR
- SELDSK: JMP DUMYADR
- SETTRK: JMP DUMYADR
- SETSEC: JMP DUMYADR
- SETDMA: JMP DUMYADR
- READ: JMP DUMYADR
- WRITE: JMP DUMYADR
- READN: JMP DUMYADR
- WRITEN: JMP DUMYADR
- ;************************************************************
- ;EQUATES
- EXITCPM EQU 0
- LASTSEC EQU 26
- BDOS EQU 5
- ;************************************************************
- ;
- MESGA: DB 0DH,0AH,'+COMPARE ERROR ON TRACK $'
- MESGB: DB '(HEX) SECTOR $'
- MESGC: DB 'PERMANENT $'
- MESGD: DB '+PERMANENT SOURCE DISK ERROR EXIT $'
- MESGE: DB '+PERMANENT DESTINATION DISK ERROR EXIT $'
- SIGNON: DB 13,10,'+SOURCE ON A'
- DB 13,10,'+OBJECT ON B'
- SINOFF: DB 13,10,'+TYPE <RET>$'
- CRLF: DB 13,10,'$'
- ;
- ;
- PRTHEX: PUSH PSW ;SAVE FOR LSN
- RAR ;SHIFT MSNIBLE TO LSN
- RAR
- RAR
- RAR
- CALL PRTNBL ;PRINT IT
- POP PSW ;NOW FOR LSN
- PRTNBL: ANI 0FH
- ADI 30H ;SHIFT TO ASCII VALUE
- CPI 3AH ;OVER 9?
- JC SML
- ADI 7 ;SHIFT TO ALPHA
- SML:
- MOV E,A ;FOR BDOS CALL
- MVI C,2 ;WRITE CONSOLE FUNCTION
- CALL BDOS
- RET
- ;
- ;
- COPY: MVI C,0
- CALL SELDSK ;SELECT DISK A
- LDA TRKSRT ;FIRST TRACK TO MOVE
- STA TRK ;MAKE CURRENT
- MOV C,A
- CALL SETTRK ;AND SELECT IT ON DISK A
- MVI C,1
- CALL SELDSK ;ALSO B
- LDA TRKSRT ;FIRST TRACK TO MOVE
- MOV C,A
- CALL SETTRK ;AND SELECT IT ON DISK B
- RDLOOP: MVI C,0
- XRA A
- STA CMPERR
- CALL SELDSK
- LDA TRK ;GET TRACK
- MOV C,A
- CALL READT ;READ ENTIRE TRACK
- RETRYW:
- MVI C,1
- CALL SELDSK
- LDA TRK
- MOV C,A
- CALL WRITET ;WRITE TRACK
- LDA TRK
- MOV C,A
- CALL COMPT ;REREAD AND COMPARE
- JNZ RETRYW ;RETRY IF ERR
- LDA TRK
- INR A
- STA TRK
- LXI H,TRKSRT+1 ;POINT TO LAST TRACK+1 STORAGE
- CMP M ;ARE WE DONE?
- JNZ RDLOOP ;LOOP IF NOT
- RET
- ;
- ;
- COMPT: LXI H,BUF1
- CALL RT2 ;REREAD INTO BUF1
- LXI H,BUF0
- LXI D,BUF1
- LXI B,128*LASTSEC
- CMPLP: LDAX D
- CMP M
- JNZ CERR
- INX H
- INX D
- DCR C
- JNZ CMPLP
- DCR B ;ARE WE AT END OF BUFFER?
- JNZ CMPLP
- RET
- CERR: PUSH B
- LXI D,MESGA
- MVI C,9 ;BDOS PRINT BUFFER FUNCTION CALL
- CALL BDOS
- LDA TRK
- CALL PRTHEX
- LXI D,MESGB
- MVI C,9 ;BDOS PRINT BUFFER FUNCTION CALL
- CALL BDOS
- POP H ;PUSHED FROM B
- DAD H ;COMPUTE SECTOR IN ERROR
- LXI D,0FF00H
- DAD D
- MVI A,27
- SUB H
- CALL PRTHEX ;PRINT SECTOR
- LDA CMPERR
- INR A
- STA CMPERR ;INCREMENT ERROR COUNT
- CPI 10
- RNZ
- MVI C,9 ;BDOS PRINT BUFFER FUNCTION CALL
- LXI D,MESGC
- CALL BDOS
- XRA A
- RET
- ;
- DMASET: PUSH B
- MOV C,L
- MOV B,H
- CALL SETDMA
- POP B
- RET
- ;
- ;
- READT: LXI H,BUF0 ;TRACK # IN C
- RT2: SHLD DMAAD
- CALL DMASET
- CALL SETTRK
- MVI C,1
- PUSH B
- CALL SETSEC
- CALL READ
- JMP RT4
- RT3: PUSH B
- CALL SETSEC
- CALL READN
- RT4: RAR ;WAS A BIT 0 SET BY DISK ERROR?
- CC FAILR
- LHLD DMAAD
- LXI D,128
- DAD D
- SHLD DMAAD
- CALL DMASET
- POP B
- MVI A,LASTSEC
- CMP C
- RZ
- INR C
- JMP RT3
- ;
- ;
- WRITET: LXI H,BUF0 ;TRACK # IN C
- WT2: SHLD DMAAD
- CALL DMASET
- CALL SETTRK
- MVI C,1
- PUSH B
- CALL SETSEC
- CALL WRITE
- JMP WT4
- WT3: PUSH B
- CALL SETSEC
- CALL WRITEN
- WT4: RAR ;WAS A BIT 0 SET BY DISK ERROR?
- CC FAILW
- LHLD DMAAD
- LXI D,128
- DAD D
- SHLD DMAAD
- CALL DMASET
- POP B
- MVI A,LASTSEC
- CMP C
- RZ
- INR C
- JMP WT3
- CMPERR: DB 0 ;NUMBER OF COMPARE ERRORS
- TRK: DB 0
- DMAAD: DS 2
- STK: DS 32
- STKTOP: DB 0
- ;
- ;
- ;
- ;
- BUF0: DS 128*LASTSEC
- BUF1: DS 128*LASTSEC
- ;************************************************************
- VECTOR:
- ;SET UP JUMP VECTORS FOR ACCESS TO BIOS PRIMITIVES
- BASE EQU 0 ;FIND WBOOT JMP ADDRESS AT RST0
- DUMYADR EQU 0 ;WHO CARES?
- ;
- LHLD BASE+1 ;GET WBOOT ADDRESS
- SPHL ;SAVE IT IN SP FOR DAD
- ;
- LXI H,15H
- DAD SP
- SHLD HOME+1
- ;
- LXI H,18H
- DAD SP
- SHLD SELDSK+1
- ;
- LXI H,1BH
- DAD SP
- SHLD SETTRK+1
- ;
- LXI H,1EH
- DAD SP
- SHLD SETSEC+1
- ;
- LXI H,21H
- DAD SP
- SHLD SETDMA+1
- ;
- LXI H,24H
- DAD SP
- SHLD READ+1
- ;
- LXI H,27H
- DAD SP
- SHLD WRITE+1
- ;
- LXI H,2AH
- DAD SP
- SHLD READN+1
- ;
- LXI H,2DH
- DAD SP
- SHLD WRITEN+1
- ;
- LXI SP,STKTOP
- ;
- ;************************************************************
- RUNTYP: JMP BUFMSR
- ;THIS ROUTINE SETS UP THE PARAMETERS FOR THE COPY ROUTINE.
- ;COPY CAN BE USED TO TRANSFER: SYS TRACKS 0- 1
- ; DAT TRACKS 2-76
- ; ALL TRACKS 0-76
- ;THE ROUTINE SEARCHES THE DEFAULT BUFFER AT 80H FOR THE
- ;RUN PARAMETER TO BE USED
- ;************************************************************
- ;ROUTINE EQUATES
- TBUFF EQU 80H
- ;************************************************************
- ;DATA TABLES
- SYSMSG: DB 'YSTEM$' ;SYSTEM MESSAGE
- DATMSG: DB 'ATA$' ;DATA MESSAGE
- ALLMSG: DB 'LL$' ;ALL MESSAGE
- TRKSRT: DW 0 ;STORAGE FOR FIRST AND LAST+1 TRACK NUMBERS
- CMDER1: DB '+COMMAND "COPY$'
- CMDER2: DB '" HAS SYNTAX ERROR',0DH,0AH,'$'
- CMDINF: DB '+THIS PROGRAM IS INITIATED WITH THE COMMAND',0DH,0AH
- DB '+"COPY SYSTEM", "COPY DATA" OR "COPY ALL"$'
- DONMSG: DB '+FUNCTION COMPLETE$'
- ;************************************************************
- ;FIRST WE MEASURE THE INPUT BUFFER MESSAGE
- ;AND DELIMIT IT WITH A $ PER BDOS CALL 9
- BUFMSR: LXI H,TBUFF
- XRA A ;CLEAR ACC.
- ADD M ;GET MESSAGE SIZE
- JZ NOMSG ;NONE FOUND
- INX H ;ADD FOR ADDR. PAST MESSAGE
- MVI B,0 ;EMPTY FOR DAD
- MOV C,A
- DAD B ;ADD CHARACTER COUNT TO HL
- MVI M,'$' ;END BUFFER CHARACTER
- ;************************************************************
- ;NEXT IS A TEST FOR WHICH MESSAGE IS PRESENT
- LDA TBUFF+2 ;FIRST CHARACTER ADDRESS
- CPI 'S'
- JZ SYSSET
- CPI 'D'
- JZ DATSET
- CPI 'A'
- JZ ALLSET
- JMP BADMSG ;FIRST CHARACTER NOT ONE OF 3 PERMITTED
- ;************************************************************
- SYSSET:
- LXI D,SYSMSG
- MVI C,6
- CALL MSGTST
- MVI L,0 ;FIRST TRACK TO TRANSFER
- MVI H,2 ;LAST TRACK PLUS ONE
- JMP PUTPAR
- ;************************************************************
- DATSET:
- LXI D,DATMSG
- MVI C,4
- CALL MSGTST
- MVI L,2 ;FIRST TRACK TO TRANSFER
- MVI H,77 ;LAST TRACK PLUS ONE
- JMP PUTPAR
- ;************************************************************
- ALLSET:
- LXI D,ALLMSG
- MVI C,3
- CALL MSGTST
- MVI L,0 ;FIRST TRACK TO TRANSFER
- MVI H,77 ;LAST TRACK PLUS ONE
- PUTPAR: SHLD TRKSRT ;PUT PARAMETERS IN TRKSRT AND TRKSRT+1
- ;************************************************************
- LXI D,SIGNON
- MVI C,9
- CALL BDOS
- AGIN: MVI C,1
- CALL BDOS
- CPI 3
- JZ EXITCPM
- CPI 13
- JNZ AGIN
- LXI D,CRLF
- MVI C,9
- CALL BDOS
- ;************************************************************
- CALL COPY ;MAIN ROUTINE
- LXI D,DONMSG ;SAY WE'RE DONE
- MVI C,9
- CALL BDOS
- JMP EXIT ;DONE. NOW GET OUT
- ;************************************************************
- MSGTST: LXI H,TBUFF+3
- LDAX D
- CMP M ;SAME AS MESSAGE?
- JNZ BADMSG
- INX H
- INX D
- DCR C ;REDUCE CHARACTER COUNTER
- RZ ;FINISHED OK
- JMP MSGTST+3 ;CHECK OUT NEXT CHARACTER
- ;************************************************************
- BADMSG: LXI D,CMDER1
- MVI C,9
- CALL BDOS
- LXI D,TBUFF+1 ;PRINT ERRONEOUS COMMAND
- MVI C,9
- CALL BDOS
- LXI D,CMDER2
- MVI C,9
- CALL BDOS
- NOMSG: LXI D,CMDINF
- MVI C,9
- CALL BDOS
- JMP EXITCPM
- ;************************************************************
- FAILR: LXI D,MESGD
- JMP DIE
- FAILW: LXI D,MESGE
- MVI C,9 ;BDOS PRINT BUFFER FUNCTION CALL
- DIE: CALL BDOS
- ;************************************************************
- EXIT: LXI D,SINOFF
- MVI C,9
- CALL BDOS
- MVI C,1
- CALL BDOS
- CPI '&'
- JZ AGIN
- CPI 13
- JNZ EXIT
- JMP EXITCPM
- END
-