home *** CD-ROM | disk | FTP | other *** search
- *XCOPY.ASM -- SINGLE DISK COPY PROGRAM
- * From Jon Lindsay's book, "Introduction to CP/M
- * Assembly Language Functions & Applications"
- * Translated and modified to use Z-80 opcodes
- * by Jim Schenkel 415-928-4445 July 23, 1982
-
- *EQUATES
-
- ORG 100H
- CR EQU 0DH ;CARRIAGE RETURN
- LF EQU 0AH ;LINE FEED
- BDOS EQU 5 ;BDOS ENTRY POINT
- FCB EQU 5CH ;FILE CONROL BLOCK ADDRESS
- CONSF EQU 1 ;READ CONSOLE
- PRINTF EQU 9 ;PRINT STRING
- RESETF EQU 13 ;RESET DISK
- OPENF EQU 15 ;OPEN FILE
- CLOSEF EQU 16 ;CLOSE FILE
- DELETF EQU 19 ;DELETE FILE
- READF EQU 20 ;READ FILE
- WRITEF EQU 21 ;WRITE FILE
- MAKEF EQU 22 ;MAKE FILE
- DMAF EQU 26 ;SET DMA
-
- *MAIN PROGRAM
-
- ;SET UP NEW STACK
- LD HL,0 ;CLEAR HL
- ADD HL,SP ;GET OLD STACK POINTER
- LD (OLDSP),HL ;SAVE OLD STACK
- LD SP,STACK ;SET UP NEW STACK
-
- XOR A ;INITIALIZE RECORD
- LD (RCNUM),A ;COUNTER TO ZERO
-
- ;SAY HELLO TO THE FOLKS
- LD DE,HOWDY ;POINT TO MESSAGE
- LD C,PRINTF ;PRINT STRING
- CALL BDOS
-
- ;FIND FILE AND OPEN IT
- LD DE,FCB ;SOURCE FILE
- LD C,OPENF
- CALL BDOS
- LD DE,NOFL ;ERROR MESSAGE ADR
- INC A ;FF-->0 IF NO FILE
- JP Z,QUIT ;THEN JUMP OUT
-
- CALL SETDMA ;SET DMA ADDRESS
-
- ;READ NEXT RECORD
- READ LD DE,FCB ;GET RECORD
- LD C,READF
- CALL BDOS
- OR A ;ZERO IF READ OK
- JP NZ,XDISK ;ELSE WRITE IT
-
- CALL XBUF ;SET NEXT RECORD DMA
-
- LD HL,RCNUM ;RECORD COUNTER
- INC (HL) ;INCREMENT BY 1
- JP READ ;READ NEXT RECORD
-
- ;CHANGE DISK WHEN FINISHED READING
- XDISK LD DE,NDISK ;NEW DISK MESSAGE
- LD C,PRINTF
- CALL BDOS
-
- ;INPUT FROM CONSOLE
- LD C,CONSF
- CALL BDOS
- CP CR ;'RETURN' TO CONTINUE
- JP NZ,QUIT1 ;ELSE QUIT
-
- LD C,RESETF ;INITIALIZE NEW DISK
- CALL BDOS
-
- ;DELETE OLD FILE OF SAME NAME IF PRESENT
- LD DE,FCB ;LOOK FOR SAME FILE NAME
- LD C,DELETF ;DELETE FUNCTION
- CALL BDOS
-
- ;CREATE NEW FILE
- LD DE,FCB ;CREATE NEW FILE NAME
- LD C,MAKEF ;MAKE FILE FUNCTION
- CALL BDOS
- LD DE,BADIR ;BAD DIRECTORY MESSAGE
- INC A ;FF-->0 IF NO SPACE
- JP Z,QUIT ;THEN QUIT
-
- CALL SETDMA ;RESET DMA FOR WRITE
-
- ;READY TO WRITE
- WRITE LD DE,FCB ;WRITE TO FILE
- LD C,WRITEF ;WRITE FUNCTION
- CALL BDOS
- LD DE,BADFL ;BAD WRITE MESSAGE
- OR A ;A=0 IF WRITE OK
- JP NZ,QUIT ;ELSE QUIT
- CALL XBUF ;GET NEXT RECORD
-
- LD HL,RCNUM ;GET RECORD COUNT
- DEC (HL) ;DECREMENT BY 1
- JP Z,FINISH ;DONE
-
- JP WRITE ;WRITE ANOTHER RECORD
-
- FINISH LD DE,FCB ;FILE TO CLOSE
- LD C,CLOSEF ;CLOSE FUNCTION
- CALL BDOS
- LD DE,CLOSE ;BAD CLOSE MESSAGE
- INC A ;FF-->0 IF NO GOOD
- JP Z,QUIT ;THEN QUIT
-
- LD DE,DONE ;JOB IS DONE
- QUIT LD C,PRINTF ;PRINT MESSAGE
- CALL BDOS
- QUIT1 LD HL,(OLDSP) ;GET OLD STACK POINTER
- LD SP,HL ;PUT INTO SP
- RET ;RETURN TO CCP
-
- *SUBROUTINES
-
- ;ADVANCE DMA BY 128 BYTES (1 RECORD)
- XBUF LD HL,(BDMA) ;GET DMA ADDRESS
- LD DE,80H ;INCREMENT
- ADD HL,DE ;BY 128
- LD (BDMA),HL ;STORE NEW DMA ADR
- EX DE,HL ;GET IT IN DE REGS.
- LD C,DMAF ;RESET DMA TO NEXT ADDRESS
- CALL BDOS
- RET
-
- ;IF FILE PRESENT, SET UP DMA FOR READ/WRITE
- SETDMA LD DE,BUFF ;USER DMA
- LD (BDMA),DE ;STORE BUFF ADDRESS
- LD C,DMAF ;ALL READ/WRITE OPS
- CALL BDOS ;START AT DMA
- XOR A ;CLEAR A
- LD (FCB+32),A ;ZERO "CR" IN FCB
- RET
-
- *STORAGE AREA
-
- HOWDY DB CR,LF,'XCOPY SINGLE-DISK DRIVE COPY UTILITY'
- DB CR,LF,' (JS version 7/23/82)'
- DB CR,LF,'Gives WEIRD results with files over 16k bytes',CR,LF,LF,'$'
- NOFL DB CR,LF,'++Cannot find the source file++'
- DB CR,LF,LF,'XCOPY requires a command of the form'
- DB CR,LF,LF,' XCOPY [X:]FILENAME.TYP'
- DB CR,LF,LF,'The drive designation is optional; if present, XCOPY'
- DB CR,LF,'will read from and write to the specified drive.'
- DB CR,LF,'If not present, XCOPY will read from the currently'
- DB CR,LF,'active drive and write to drive A.'
- DB CR,LF,LF,'$'
- NDISK DB CR,LF,'Insert the new disk and hit RETURN to continue.'
- DB CR,LF,' (Any other key to abort.)',CR,LF,'$'
- BADIR DB CR,LF,'++No space in the directory++$'
- BADFL DB CR,LF,'++Bad write operation++$'
- DONE DB CR,LF,'End of copy operation.$'
- CLOSE DB CR,LF,'++Cannot close the file++$'
-
- OLDSP DS 2 ;OLD STACK POINTER
- RCNUM DS 1 ;# OF RECORDS
- DS 40H ;PROGRAM STACK AREA
- STACK EQU $
- BDMA DW BUFF ;START OF FILE MEMORY
- BUFF EQU $ ;START FILE BUFFER HERE
- END