home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / lambda / soundpot / p / xcopy.lbr / XCOPY.AZM / XCOPY.ASM
Encoding:
Assembly Source File  |  1993-10-25  |  4.3 KB  |  170 lines

  1. *XCOPY.ASM -- SINGLE DISK COPY PROGRAM 
  2. *  From Jon Lindsay's book, "Introduction to CP/M
  3. *  Assembly Language Functions & Applications"
  4. *  Translated and modified to use Z-80 opcodes
  5. *  by Jim Schenkel 415-928-4445  July 23, 1982
  6.  
  7. *EQUATES
  8.  
  9.     ORG    100H
  10. CR    EQU    0DH    ;CARRIAGE RETURN
  11. LF    EQU    0AH    ;LINE FEED
  12. BDOS    EQU    5    ;BDOS ENTRY POINT
  13. FCB    EQU    5CH    ;FILE CONROL BLOCK ADDRESS
  14. CONSF    EQU    1    ;READ CONSOLE 
  15. PRINTF    EQU    9    ;PRINT STRING 
  16. RESETF    EQU    13    ;RESET DISK 
  17. OPENF    EQU    15    ;OPEN FILE 
  18. CLOSEF    EQU    16    ;CLOSE FILE
  19. DELETF    EQU    19    ;DELETE FILE 
  20. READF    EQU    20    ;READ FILE 
  21. WRITEF    EQU    21    ;WRITE FILE 
  22. MAKEF    EQU    22    ;MAKE FILE
  23. DMAF    EQU    26    ;SET DMA
  24.  
  25. *MAIN PROGRAM
  26.  
  27. ;SET UP NEW STACK
  28.     LD    HL,0        ;CLEAR HL
  29.     ADD    HL,SP        ;GET OLD STACK POINTER
  30.     LD    (OLDSP),HL    ;SAVE OLD STACK
  31.     LD    SP,STACK    ;SET UP NEW STACK
  32.  
  33.     XOR    A        ;INITIALIZE RECORD
  34.     LD    (RCNUM),A        ;COUNTER TO ZERO
  35.  
  36. ;SAY HELLO TO THE FOLKS
  37.     LD    DE,HOWDY    ;POINT TO MESSAGE
  38.     LD    C,PRINTF    ;PRINT STRING
  39.     CALL    BDOS
  40.  
  41. ;FIND FILE AND OPEN IT
  42.     LD    DE,FCB        ;SOURCE FILE
  43.     LD    C,OPENF
  44.     CALL    BDOS
  45.     LD    DE,NOFL        ;ERROR MESSAGE ADR
  46.     INC    A        ;FF-->0 IF NO FILE
  47.     JP    Z,QUIT        ;THEN JUMP OUT
  48.  
  49.     CALL    SETDMA        ;SET DMA ADDRESS
  50.  
  51. ;READ NEXT RECORD
  52. READ    LD    DE,FCB        ;GET RECORD
  53.     LD    C,READF
  54.     CALL    BDOS
  55.     OR    A        ;ZERO IF READ OK
  56.     JP    NZ,XDISK    ;ELSE WRITE IT
  57.  
  58.     CALL    XBUF        ;SET NEXT RECORD DMA
  59.  
  60.     LD    HL,RCNUM    ;RECORD COUNTER
  61.     INC    (HL)        ;INCREMENT BY 1
  62.     JP    READ        ;READ NEXT RECORD
  63.  
  64. ;CHANGE DISK WHEN FINISHED READING
  65. XDISK    LD    DE,NDISK    ;NEW DISK MESSAGE
  66.     LD    C,PRINTF
  67.     CALL    BDOS
  68.  
  69. ;INPUT FROM CONSOLE
  70.     LD    C,CONSF
  71.     CALL    BDOS
  72.     CP    CR        ;'RETURN' TO CONTINUE
  73.     JP    NZ,QUIT1    ;ELSE QUIT
  74.  
  75.     LD    C,RESETF    ;INITIALIZE NEW DISK
  76.     CALL    BDOS
  77.  
  78. ;DELETE OLD FILE OF SAME NAME IF PRESENT
  79.     LD    DE,FCB        ;LOOK FOR SAME FILE NAME
  80.     LD    C,DELETF    ;DELETE FUNCTION
  81.     CALL    BDOS
  82.  
  83. ;CREATE NEW FILE
  84.     LD    DE,FCB        ;CREATE NEW FILE NAME
  85.     LD    C,MAKEF        ;MAKE FILE FUNCTION
  86.     CALL    BDOS
  87.     LD    DE,BADIR    ;BAD DIRECTORY MESSAGE
  88.     INC    A        ;FF-->0 IF NO SPACE
  89.     JP    Z,QUIT        ;THEN QUIT
  90.  
  91.     CALL    SETDMA        ;RESET DMA FOR WRITE
  92.  
  93. ;READY TO WRITE
  94. WRITE    LD    DE,FCB        ;WRITE TO FILE
  95.     LD    C,WRITEF    ;WRITE FUNCTION
  96.     CALL    BDOS
  97.     LD    DE,BADFL    ;BAD WRITE MESSAGE
  98.     OR    A        ;A=0 IF WRITE OK
  99.     JP    NZ,QUIT        ;ELSE QUIT
  100.     CALL    XBUF        ;GET NEXT RECORD
  101.  
  102.     LD    HL,RCNUM    ;GET RECORD COUNT
  103.     DEC    (HL)        ;DECREMENT BY 1
  104.     JP    Z,FINISH    ;DONE
  105.  
  106.     JP    WRITE        ;WRITE ANOTHER RECORD
  107.  
  108. FINISH    LD    DE,FCB        ;FILE TO CLOSE
  109.     LD    C,CLOSEF    ;CLOSE FUNCTION
  110.     CALL    BDOS
  111.     LD    DE,CLOSE    ;BAD CLOSE MESSAGE
  112.     INC    A        ;FF-->0 IF NO GOOD
  113.     JP    Z,QUIT        ;THEN QUIT
  114.  
  115.     LD    DE,DONE        ;JOB IS DONE
  116. QUIT    LD    C,PRINTF    ;PRINT MESSAGE
  117.     CALL    BDOS
  118. QUIT1    LD    HL,(OLDSP)    ;GET OLD STACK POINTER
  119.     LD    SP,HL        ;PUT INTO SP
  120.     RET            ;RETURN TO CCP
  121.  
  122. *SUBROUTINES
  123.  
  124. ;ADVANCE DMA BY 128 BYTES (1 RECORD)
  125. XBUF    LD    HL,(BDMA)    ;GET DMA ADDRESS
  126.     LD    DE,80H        ;INCREMENT
  127.     ADD    HL,DE        ;BY 128
  128.     LD    (BDMA),HL    ;STORE NEW DMA ADR
  129.     EX    DE,HL        ;GET IT IN DE REGS.
  130.     LD    C,DMAF        ;RESET DMA TO NEXT ADDRESS
  131.     CALL    BDOS
  132.     RET
  133.  
  134. ;IF FILE PRESENT, SET UP DMA FOR READ/WRITE
  135. SETDMA    LD    DE,BUFF        ;USER DMA
  136.     LD    (BDMA),DE    ;STORE BUFF ADDRESS
  137.     LD    C,DMAF        ;ALL READ/WRITE OPS
  138.     CALL    BDOS        ;START AT DMA
  139.     XOR    A        ;CLEAR A
  140.     LD    (FCB+32),A    ;ZERO "CR" IN FCB
  141.     RET
  142.  
  143. *STORAGE AREA
  144.  
  145. HOWDY    DB    CR,LF,'XCOPY SINGLE-DISK DRIVE COPY UTILITY'
  146.     DB    CR,LF,'    (JS version 7/23/82)'
  147.     DB    CR,LF,'Gives WEIRD results with files over 16k bytes',CR,LF,LF,'$'
  148. NOFL    DB    CR,LF,'++Cannot find the source file++'
  149.     DB    CR,LF,LF,'XCOPY requires a command of the form'
  150.     DB    CR,LF,LF,'           XCOPY [X:]FILENAME.TYP'
  151.     DB    CR,LF,LF,'The drive designation is optional; if present, XCOPY'
  152.     DB    CR,LF,'will read from and write to the specified drive.'
  153.     DB    CR,LF,'If not present, XCOPY will read from the currently'
  154.     DB    CR,LF,'active drive and write to drive A.'
  155.     DB    CR,LF,LF,'$'
  156. NDISK    DB    CR,LF,'Insert the new disk and hit RETURN to continue.'
  157.     DB    CR,LF,'          (Any other key to abort.)',CR,LF,'$'
  158. BADIR    DB    CR,LF,'++No space in the directory++$'
  159. BADFL    DB    CR,LF,'++Bad write operation++$'
  160. DONE    DB    CR,LF,'End of copy operation.$'
  161. CLOSE    DB    CR,LF,'++Cannot close the file++$'
  162.  
  163. OLDSP    DS    2        ;OLD STACK POINTER
  164. RCNUM    DS    1        ;# OF RECORDS
  165.     DS    40H        ;PROGRAM STACK AREA
  166. STACK    EQU    $
  167. BDMA    DW    BUFF        ;START OF FILE MEMORY
  168. BUFF    EQU    $        ;START FILE BUFFER HERE
  169.     END
  170.