home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol065 / filecopy.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.8 KB  |  274 lines

  1. ;******************************************
  2. ;*                                        *
  3. ;* SINGLE DRIVE FILECOPY V81.1  4 MAY 81  *
  4. ;*                                        *
  5. ;* WILL COPY FILES UP TO 65535 RECORDS    *
  6. ;* LONG (128 BYTES/REC) ONLY LIMITED BY   *
  7. ;* THE CONSTRAINTS OF AVAILABLE MEMORY    *
  8. ;* ALL CONSOLE AND DISK I/O               *
  9. ;* THROUGH BDOS CALL AT LOC 5             *
  10. ;*                                        *
  11. ;* REVISED BY SHELDON EICHENBAUM          *
  12. ;*                                        *
  13. ;* ORGINAL BY KEN BARBIER AS PUBLISHED IN *
  14. ;* MICROCOMPUTING  SEPT. 1980             *
  15. ;*                                        *
  16. ;******************************************
  17. ; CP/M BDOS ADDRESSES
  18. RBOOT    EQU    0    ;RE-BOOT CP/M
  19. BDOS    EQU    5    ;BDOS CALL ENTRY
  20. FCB    EQU    5CH    ;DEFAULT FILE CONTROL BLOCK
  21. INBUF    EQU    80H    ;DEFAULT DMA ADDRESS
  22. ;CP/M BDOS FUNCTIONS
  23. READF    EQU    1    ;READ CONSOLE INTO (A)
  24. TYPEF    EQU    2    ;READ CONSOLE FROM (E)
  25. INIT    EQU    13    ;INITIALIZE DISC IN DRIVE A:
  26. OPEN    EQU    15    ;OPEN FILE
  27. CLOS    EQU    16    ;CLOSE FILE
  28. FIND    EQU    17    ;FIND FILE IN DIRECTORY
  29. DELE    EQU    19    ;DELETE FILE
  30. READ    EQU    20    ;READ FILE
  31. WRIT    EQU    21    ;WRITE FILE
  32. MAKE    EQU    22    ;CREATE FILE DIRECTORY ENTRY
  33.     ORG    0100H    ;TPA PROGRAM START ADDRESS
  34.     JMP    START    ;GOTO PROGRAM START
  35. ; CONSOLE I/O THROUGH BDOS CALL
  36. CI    PUSH    H    ;SAVE REGISTERS
  37.     PUSH    D
  38.     PUSH    B
  39.     MVI    C,READF    ;READ FUNCTION
  40.     CALL    BDOS    ;RETURN CHAR IN (A)
  41.     POP    B    ;RESTORE OTHER REGISTERS
  42.     POP    D
  43.     POP    H
  44.     RET
  45. CO    PUSH    H
  46.     PUSH    D
  47.     PUSH    B
  48.     MOV    E,A    ;MOVE PRINT CHAR TO (E)
  49.     MVI    C,TYPEF
  50.     CALL    BDOS
  51.     POP    B
  52.     POP    D
  53.     POP    H
  54.     RET
  55. CCRLF    MVI    A,0DH    ;CR LF TO CONSOLE
  56.     CALL    CO
  57.     MVI    A,0AH
  58.     JMP    CO
  59. MSGXP    POP    H    ;OUTPUT MESSAGE AND RETURN
  60. MSGX1    MOV    A,M    ;THROUGH INDEX (H,L)
  61.     CPI    0    ;TEXT TERMINATOR = 0
  62.     JZ    MSGEX
  63.     CALL    CO
  64.     INX    H
  65.     JMP    MSGX1
  66. MSGEX    INX    H    ;POINT TO TEXT + 1
  67.     PCHL        ;AND RETURN THERE
  68. ; FILECOPY CONSOLE MESSAGE SUBROUTINE
  69. RDMSG    CALL    CCRLF    ;PROMPT FOR READ DISK
  70.     CALL    MSGXP
  71.     DB    'READ DISK IN DRIVE, THEN CR'
  72.     DB    0
  73. RDMS1    CALL    CI    ;GET RESPONSE
  74.     CPI    'X'    ;ALLOW EXIT
  75.     JZ    RBOOT    ;BACK TO CP/M
  76.     CPI    0DH    ;ACCEPT CR ONLY
  77.     JNZ    RDMS1
  78.     CALL    CCRLF    ;ACKNOWLEDGE
  79.     RET        ;AND RETURN
  80. WRMSG    CALL    CCRLF    ;PROMPT FOR WRITE DISK
  81.     CALL    MSGXP
  82.     DB    'WRITE DISK IN DRIVE, THEN CR'
  83.     DB    0
  84. WRMS1    CALL    CI
  85.     CPI    'X'
  86.     JZ    RBOOT
  87.     CPI    0DH
  88.     JNZ    WRMS1
  89.     CALL    CCRLF
  90.     RET
  91. RDERR    CALL    CCRLF    ;SHOW READ ERROR
  92.     CALL    MSGXP
  93.     DB    'READ ERROR!  ENTER X TO ABORT'
  94.     DB    0DH,0AH
  95.     DB    '                   CR TO IGNORE'
  96.     DB    0
  97. RDER1    CALL    CI    ;ACCEPT CR OR X
  98.     CPI    'X'
  99.     JZ    EXIT
  100.     CPI    0DH
  101.     RZ        ;RETURN MEANS IGNORE
  102.     JMP    RDER1
  103. WRERR    CALL    CCRLF    ;SHOW WRITE ERROR
  104.     CALL    MSGXP
  105.     DB    'PERMANENT WRITE ERROR!'
  106.     DB    0
  107. EXIT    CALL    MSGXP
  108.     DB    'BACK TO CP/M?'
  109.     DB    0
  110. WRER1    CALL    CI    ;WAIT FOR CR    X
  111.     CPI    0DH
  112.     JZ    RBOOT
  113.     CPI    'X'
  114.     JZ    RBOOT
  115.     JNZ    WRER1    ;AS ONLY LEGAL RESPONSE
  116. ; BEGIN FILECOPY PROGRAM
  117. START    CALL    CCRLF    ;SIGN ON MESSAGE
  118.     CALL    MSGXP
  119.     DB    'SINGLE DRIVE FILECOPY  V81.1   4 MAY 81'
  120.     DB    0DH,0AH
  121.     DB    0
  122.     CALL    RDMSG    ;PROMPT FOR READ DISK
  123.     LXI    D,FCB    ;LOOK FOR FILE
  124.     MVI    C,FIND    ;BEFORE GOING AHEAD
  125.     CALL    BDOS
  126.     CPI    255    ;DOES FILE EXITS?
  127.     JNZ    RUN    ;YES. READ IT
  128.     CALL    CCRLF    ;NO. GIVE UP
  129.     CALL    MSGXP
  130.     DB    'FILE DOES NOT EXIST!'
  131.     DB    0
  132.     JMP    EXIT    ;REBOOT CP/M
  133. RUN    LXI    H,FCB    ;SET UP FCB'S FOR
  134.     LXI    D,RFCB    ;READ AND WRITE
  135.     MVI    C,16
  136. RUN1    MOV    A,M
  137.     STAX    D
  138.     INX    H
  139.     INX    D
  140.     DCR    C
  141.     JNZ    RUN1
  142.     LXI    H,FCB
  143.     LXI    D,WFCB
  144.     MVI    C,16
  145. RUN2    MOV    A,M
  146.     STAX    D
  147.     INX    H
  148.     INX    D
  149.     DCR    C
  150.     JNZ    RUN2
  151.     LXI    H,BUFFR    ;INITIALIZE POINTER
  152.     SHLD    HSAVE    ;INTO BUFFER
  153.     XRA    A    ;ZERO RECORD COUNTS
  154.     STA    ASAVE
  155.     STA    ASAVE+1
  156.     STA    RFCBN
  157.     STA    WFCBN
  158. ; READ THE FILE INTO RAM
  159. RFILE    LXI    D,RFCB    ;USE READ FCB
  160.     MVI    C,OPEN    ;AND OPEN THE FILE
  161.     CALL    BDOS
  162.     CPI    255    ;ERROR?
  163.     JNZ    RFIL1
  164.     CALL    CCRLF
  165.     CALL    MSGXP    ;YES. SHOW IT
  166.     DB    'UNABLE TO OPEN FILE!'
  167.     DB    0
  168.     JMP    EXIT    ;AND ABORT
  169. RFIL1    LXI    D,RFCB    ;READ A RECORD
  170.     MVI    C,READ
  171.     CALL    BDOS
  172.     CPI    0    ;GOOD READ?
  173.     JZ    RFIL2    ;YES. STORE IT
  174.     CPI    1    ;OR END OF FILE?
  175.     JZ    WFILE    ;YES. WRITE IT
  176.     CALL    RDERR    ;NO. SHOW ERROR
  177. RFIL2    LHLD    HSAVE    ;STORE THE RECORD
  178.     LXI    D,INBUF
  179.     MVI    C,80H
  180. RFIL3    LDAX    D
  181.     MOV    M,A
  182.     INX    H
  183.     INX    D
  184.     DCR    C
  185.     JNZ    RFIL3
  186.     SHLD    HSAVE    ;AND NEXT ADDRESS
  187.     PUSH    H
  188.     LHLD    ASAVE
  189.     INX    H
  190.     SHLD    ASAVE
  191.     POP    H
  192.     LDA    7    ;ANY MEMORY LEFT?
  193.     DCR    A
  194.     CMP    H
  195.     JNZ    RFIL1    ;YES. KEEP READING
  196.     CALL    CCRLF    ;NO. ABORT
  197.     CALL    MSGXP
  198.     DB    'FILE IS TOO BIG!'
  199.     DB    0
  200.     JMP    EXIT
  201. ; WRITE THE FILE ONTO DISK
  202. WFILE    CALL    WRMSG    ;PROMPT FOR WRITE DISK
  203.     MVI    C,INIT    ;INITIALIZE DISK FOR WRITE
  204.     CALL    BDOS
  205.     LXI    D,WFCB    ;SEE IF FILE EXITS
  206.     MVI    C,FIND
  207.     CALL    BDOS
  208.     CPI    255    ;WE CAN'T WRITE TWO
  209.     JZ    WFIL1    ;NO. CONTINUE
  210.     CALL    CCRLF    ;YES. ERASE OR ABORT?
  211.     CALL    MSGXP
  212.     DB    'FILE ALREADY EXITS. ENTER:X TO ABORT'
  213.     DB    0DH,0AH
  214.     DB    '                          CR TO ERASE IT'
  215.     DB    0
  216. WAIT1    CALL    CI
  217.     CPI    'X'
  218.     JZ    RBOOT
  219.     CPI    0DH
  220.     JNZ    WAIT1
  221.     LXI    D,WFCB    ;ERASE THE OLD FILE
  222.     MVI    C,DELE
  223.     CALL    BDOS
  224. WFIL1    LXI    D,WFCB    ;OPEN FILE FOR WRITE
  225.     MVI    C,MAKE
  226.     CALL    BDOS
  227.     CPI    255    ;OPEN OK?
  228.     JNZ    WFIL2    ;YES. CONTINUE
  229.     CALL    CCRLF
  230.     CALL    MSGXP    ;SHOW UNABLE TO OPEN
  231.     DB    'OUT OF DIRECTORY SPACE!'
  232.     DB    0
  233.     JMP    EXIT
  234. WFIL2    LXI    H,BUFFR    ;INITIALIZE POINTER
  235.     SHLD    HSAVE
  236. WFIL3    LHLD    HSAVE    ;MOVE RECORD TO OUTPUT
  237.     LXI    D,INBUF    ;BUFFER (SAME AS INPUT)
  238.     MVI    C,80H
  239. WFIL4    MOV    A,M
  240.     STAX    D
  241.     INX    H
  242.     INX    D
  243.     DCR    C
  244.     JNZ    WFIL4
  245.     SHLD    HSAVE    ;SAVE NEXT ADDRESS
  246.     LXI    D,WFCB    ;WRITE THE RECORD
  247.     MVI    C,WRIT
  248.     CALL    BDOS
  249.     CPI    0
  250.     CNZ    WRERR    ;SHOW WRITE ERROR
  251.     LHLD    ASAVE    ;COUNT RECORD WRITTEN
  252.     DCX    H
  253.     SHLD    ASAVE
  254.     MOV    A,H
  255.     ORA    L
  256.     JNZ    WFIL3    ;AND WRITE ANOTHER
  257.     LXI    D,WFCB    ;DONE. CLOSE THE FILE
  258.     MVI    C,CLOS
  259.     CALL    BDOS
  260.     CALL    CCRLF
  261.     CALL    MSGXP    ;PROMPT FOR REBOOT
  262.     DB    'ALL DONE!'
  263.     DB    0
  264.     JMP    EXIT    ;AND WE ARE ALL DONE
  265. ; RAM BUFFERS
  266. HSAVE    DS    2    ;BUFFER ADDRESS STORE
  267. ASAVE    DS    2    ;RECORD COUNT
  268. RFCB    DS    33    ;READ FILE CONTROL BLOCK
  269. WFCB    DS    33    ;WRITE FILE CONTROL BLOCK
  270. BUFFR    DB    0    ;DATA BUFFER START
  271. RFCBN    EQU    RFCB+32    ;RECORD COUNTS. READ
  272. WFCBN    EQU    WFCB+32    ;AND WRITE
  273.     END
  274.