home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol074 / copy.asm < prev    next >
Assembly Source File  |  1984-04-29  |  8KB  |  503 lines

  1. ;    COPY - CP/M SINGLE DISK COPY UTILITY
  2. ;
  3.     ORG    0100H
  4.     JMP    COPY
  5.     DB    '(C) 1979 - N D H HAMMOND'
  6. PRGNAME    DB    'COPY VSN 2.1 OF 3JAN80',0DH,0AH,'$'
  7. ;
  8. ;
  9.     ;SYSTEM ADDRESSES
  10. WBOOTE    EQU    0000H    ;REBOOT ADDRESS
  11. SFCB    EQU    005CH    ;SOURCE FILE CONTROL BLOCK
  12. SFCBEX    EQU    SFCB+12    ;CURRENT FILE EXTENT NO
  13. SFCBCR    EQU    SFCB+32    ;NEXT RECORD COUNTER
  14. TBUF    EQU    0080H    ;SYSTEM DEFAULT BUFFER
  15.     ;CONSTANTS
  16. CCPL    EQU    (3200H-2900H) SHR 8    ;PAGES IN CCP
  17. TRUE    EQU    0FFH
  18. ETX    EQU    03H
  19. LF    EQU    0AH
  20. CR    EQU    0DH
  21. EOM    EQU    '$'
  22. ;
  23. ;    MAIN PROGRAM
  24. ;
  25. COPY    LXI    H,0    ;SAVE OLD STACK POINTER
  26.     DAD    SP
  27.     SHLD    OLDSP
  28.     LXI    SP,STACK
  29.     LXI    D,PRGNAME
  30.     CALL    WRITESTRING
  31.     CALL    SETMODE
  32. COPYLP    CALL    GETARGS
  33.     CALL    INITVAR
  34.     CALL    SOURCEDISK
  35.     CALL    OPENSOURCE
  36.     CALL    LOADBUF
  37.     CALL    DESTDISK
  38.     CALL    MAKETEMP
  39. REPEAT    CALL    DUMPBUF
  40.     LDA    FINISH
  41.     CPI    TRUE
  42.     JZ    ENDCOPY
  43.     CALL    SOURCEDISK
  44.     CALL    LOADBUF
  45.     CALL    DESTDISK
  46.     JMP    REPEAT
  47. ENDCOPY    CALL    TERMINATE
  48.     LDA    MULTI
  49.     CPI    TRUE
  50.     JNZ    EXIT
  51.     CALL    PROMPT
  52.     JMP    COPYLP
  53. EXIT    LHLD    OLDSP
  54.     SPHL
  55.     RET        ;RETURN TO CP/M
  56. ;
  57. ;    SUBROUTINBS
  58. ;
  59. SETMODE        ;SET SINGLE/MULTIPLE COPY MODE
  60.     XRA    A
  61.     STA    MULTI
  62.     LDA    TBUF    ;WAS A FILE NAME SPECIFIED?
  63.     CPI    0
  64.     JNZ    SM1
  65.     ;NO - SET MULTIPLE MODE
  66.     MVI    A,TRUE
  67.     STA    MULTI
  68.     CALL    PROMPT
  69.     RET
  70. SM1    ;YES - SINGLE MODE, MOVE COMMAND LINE TO RBUF
  71.     LXI    H,TBUF
  72.     LXI    D,RBUF+1
  73.     MVI    B,30
  74.     CALL    COPYSTRING
  75.     ;LIMIT TO 29 CHARACTERS
  76.     LDA    RBUF+1
  77.     CPI    30
  78.     RM
  79.     MVI    A,29
  80.     STA    RBUF+1
  81.     RET
  82. ;
  83. ;
  84. INITVAR        ;INITIALIZE VARIABLES
  85.     XRA    A
  86.     STA    FINISH
  87.     ;SET EXTENT TO CP/M CBASE
  88.     LHLD    ENTRY+1    ;HL:=FBASE
  89.     MOV    A,H
  90.     SBI    CCPL
  91.     MOV    H,A    ;HL:=CBASE
  92.     MOV    A,L    ;ENSURE EXTENT IS AT
  93.     ANI    80H    ;  A PAGE BOUNDARY
  94.     MOV    L,A
  95.     SHLD    EXTENT
  96.     ;ZERO EXTENT BIT IN SOURCE FCB
  97.     XRA    A
  98.     STA    SFCBEX
  99.     RET
  100. ;
  101. ;
  102. GETARGS        ;GET FILE NAMES FROM BUFFER
  103.     LXI    H,RBUF+1    ;HL:=^BUFFER LGTH
  104.     MOV    A,M        ;A:=BUFFER LGTH
  105.     CPI    0        ;CHECK FOR EMPTY
  106.     JZ    EXIT
  107.     INX    H        ;HL:=^BUFFER
  108.     ;SET <ETX> SENTINEL AT END OF BUFFER
  109.     PUSH    H
  110.     MOV    C,A
  111.     MVI    B,0
  112.     DAD    B
  113.     MVI    M,ETX
  114.     ;GET SOURCE FILE NAME
  115.     POP    H
  116.     CALL    DEBLANK
  117.     CPI    ETX
  118.     JZ    ARGERR
  119.     LXI    D,SFCB+1
  120.     CALL    GETFILE
  121.     JC    ARGERR
  122.     ;GET DEST FILE NAME
  123.     CALL    DEBLANK
  124.     CPI    ETX
  125.     JZ    NODEST
  126.     LXI    D,DFCB+1
  127.     CALL    GETFILE
  128.     JC    ARGERR
  129.     CALL    DEBLANK
  130.     CPI    ETX
  131.     JNZ    ARGERR
  132.     RET
  133. NODEST    ;SET DEST FILE = SOURCE FILE NAME
  134.     LXI    D,DFCB+1
  135.     LXI    H,SFCB+1
  136.     MVI    B,11
  137.     CALL    COPYSTRING
  138.     RET
  139. ARGERR    ;REPORT ERROR AND RETRY
  140.     LXI    D,AEMSG
  141.     CALL    WRITESTRING
  142.     CALL    PROMPT
  143.     JMP    GETARGS
  144. ;
  145. ;
  146. DEBLANK        ;SKIP BLANKS IN RBUF
  147.     ;ENTRY:    HL=^POSITION IN RBUF
  148.     ;EXIT:    HL=^FIRST NONBLANK
  149.     ;    A=HL^
  150.     MOV    A,M
  151.     CPI    ' '
  152.     RNZ
  153.     INX    H
  154.     JMP    DEBLANK
  155. ;
  156. ;
  157. GETFILE        ;GET FILE NAME FROM RBUF
  158.     ;ENTRY:    HL=^POSITION IN RBUF
  159.     ;    DE=^FCB FOR FILE
  160.     ;EXIT:    HL,DE=^UPDATED POSITION
  161.     ;    A=HL^ (<SPACE> OR <CONTROL CHAR>)
  162.     ;    CYF=ERROR FLAG
  163.     MVI    C,8
  164.     CALL    GETNAME
  165.     RC
  166.     CPI    '.'
  167.     JNZ    NOEXT
  168.     INX    H
  169.     MVI    C,3
  170.     CALL    GETNAME
  171.     RET
  172.     ;FILL FILE TYPE FIELD WITH BLANKS
  173. NOEXT    MVI    A,' '
  174.     STAX    D
  175.     INX    D
  176.     STAX    D
  177.     INX    D
  178.     STAX    D
  179.     MOV    A,M
  180.     ORA    A    ;CLEAR CYF
  181.     RET
  182. ;
  183. ;
  184. GETNAME        ;GET NAME FROM RBUF
  185.     ;ENTRY:    HL=^POSITION IN RBUF
  186.     ;    DE=^FCB POSITION
  187.     ;    C=MAX NO OF CHARACTERS
  188.     ;EXIT:    HL,DE=^UPDATED POSITION
  189.     ;    A=DELIMITER (HL^)
  190.     ;    CYF=ERROR FLAG
  191.     MVI    B,0
  192.     INR    C
  193.     ;TRANSFER NAME TO FCB
  194. NXTCH    MOV    A,M
  195.     CPI    ' '+1
  196.     JM    CKBLK
  197.     CPI    '.'
  198.     JZ    CKBLK
  199.     CALL    UPCASE
  200.     STAX    D
  201.     INX    H
  202.     INR    B
  203.     INX    D
  204.     MOV    A,B
  205.     CMP    C
  206.     JNZ    NXTCH
  207.     STC        ;TOO MANY CHARS
  208.     RET
  209.     ;BLANK FILL IF REQD
  210. CKBLK    DCR    C
  211. BLKFL    MOV    A,B
  212.     CMP    C
  213.     JZ    GOTNM
  214.     MVI    A,' '
  215.     STAX    D
  216.     INR    B
  217.     INX    D
  218.     JMP    BLKFL
  219.     ;EXIT
  220. GOTNM    MOV    A,M
  221.     ORA    A    ;CLEAR CYF
  222.     RET
  223. ;
  224. ;
  225. UPCASE        ;CONVERT ACC TO UPPER CASE
  226.     CPI    61H    ;'a'
  227.     RM
  228.     CPI    7BH    ;'z'+1
  229.     RP
  230.     ANI    5FH
  231.     RET
  232. ;
  233. ;
  234. OPENSOURCE    ;OPEN SOURCE FILE
  235.     LXI    D,SFCB
  236.     CALL    OPENFILE
  237.     CPI    0FFH
  238.     JNZ    OPEN$OK
  239.     MVI    B,1
  240.     JMP    ERROR
  241. OPEN$OK    XRA    A
  242.     STA    SFCBCR
  243.     RET
  244. ;
  245. ;
  246. LOADBUF        ;LOAD BUFFER FROM SOURCE FILE
  247.     LXI    D,BUFFER
  248. RDNXT    PUSH    D
  249.     CALL    SETDMA
  250.     LXI    D,SFCB
  251.     CALL    READREC
  252.     POP    D
  253.     ORA    A
  254.     JZ    RD$OK
  255.     CPI    1
  256.     JZ    EOF
  257.     MVI    B,3
  258.     JMP    ERROR
  259. RD$OK    LXI    B,80H    ;UPDATE BUFFER
  260.     XCHG
  261.     DAD    B
  262.     LXI    B,EXTENT
  263.     CALL    COMPARE
  264.     XCHG
  265.     JNZ    RDNXT
  266.     RET
  267. EOF    MVI    A,TRUE
  268.     STA    FINISH
  269.     XCHG
  270.     SHLD    EXTENT
  271.     RET
  272. ;
  273. ;
  274. MAKETEMP    ;CREATE TEMPORARY FILE COPY.$$$
  275.     LXI    D,TFCB
  276.     CALL    MAKEFILE
  277.     CPI    0FFH
  278.     JNZ    MAKE$OK
  279.     MVI    B,2
  280.     JMP    ERROR
  281. MAKE$OK    XRA    A
  282.     STA    TFCBCR
  283.     STA    TFCBEX
  284.     RET
  285. ;
  286. ;
  287. DUMPBUF        ;DUMP BUFFER TO TEMP FILE
  288.     LXI    D,BUFFER
  289. WRNXT    PUSH    D
  290.     CALL    SETDMA
  291.     LXI    D,TFCB
  292.     CALL    WRITEREC
  293.     POP    D
  294.     ORA    A
  295.     JZ    WR$OK
  296.     MVI    B,2
  297.     JMP    ERROR
  298. WR$OK    LXI    B,80H    ;UPDATE BUFFER POSITION
  299.     XCHG
  300.     DAD    B
  301.     LXI    B,EXTENT
  302.     CALL    COMPARE
  303.     XCHG
  304.     JNZ    WRNXT
  305.     RET
  306. ;
  307. ;
  308. TERMINATE    ;CLOSE TEMP FILE
  309.     LXI    D,TFCB
  310.     CALL    CLOSEFILE
  311.     ;DELETE OLD COPY OF DEST FILE (IF ANY)
  312.     LXI    D,DFCB
  313.     CALL    DELETEFILE
  314.     ;RENAME DEST FILE = COPY.$$$
  315.     LXI    H,DFCB+1
  316.     LXI    D,TFCB+17
  317.     MVI    B,11
  318.     CALL    COPYSTRING
  319.     LXI    D,TFCB
  320.     CALL    RENAMEFILE
  321.     ;ADVISE OPERATOR
  322.     LXI    D,TERMSG
  323.     CALL    WRITESTRING
  324.     RET
  325. ;
  326. ;
  327. COPYSTRING    ;COPY STRING OF LENGTH B
  328.         ;FROM HL^ TO DE^
  329.     MOV    A,M
  330.     STAX    D
  331.     INX    H
  332.     INX    D
  333.     DCR    B
  334.     JNZ    COPYSTRING
  335.     RET
  336. ;
  337. ;
  338. ERROR        ;PRINT ERROR MESSAGE
  339.     LXI    D,OPMSG
  340.     MOV    A,B
  341.     CPI    1
  342.     JZ    EPRINT
  343.     LXI    D,CRMSG
  344.     CPI    2
  345.     JZ    EPRINT
  346.     LXI    D,REMSG
  347. EPRINT    CALL    WRITESTRING
  348.     ;EXIT (OR RESTART IF MULTIPLE COPY MODE)
  349.     LDA    MULTI
  350.     CPI    TRUE
  351.     JNZ    EXIT
  352.     LXI    SP,STACK
  353.     CALL    PROMPT
  354.     JMP    COPYLP
  355. ;
  356. ;
  357. COMPARE        ;COMPARE BC^ AND HL - SET FLAGS
  358.     INX    B
  359.     LDAX    B
  360.     DCX    B
  361.     CMP    H
  362.     RNZ
  363.     LDAX    B
  364.     CMP    L
  365.     RET
  366. ;
  367. ;
  368. SOURCEDISK    ;ADVISE OPERATOR, WAIT FOR RESPONSE,
  369.     LXI    D,SDMSG
  370.     CALL    WRITESTRING
  371.     CALL    WAIT
  372.     RET
  373. ;
  374. ;
  375. DESTDISK    ;ADVISE OPERATOR, WAIT FOR RESPONSE
  376.     LXI    D,DDMSG
  377.     CALL    WRITESTRING
  378.     CALL    WAIT
  379.     ;RESET BDOS TO AVOID 'R/O ERROR'
  380.     CALL    INITBDOS
  381.     RET
  382. ;
  383. ;
  384. PROMPT        ;ISSUE PROMPT AND GET PARAMETERS
  385.     MVI    E,'*'
  386.     CALL    WRITECHAR
  387.     LXI    D,RBUF
  388.     CALL    READSTRING
  389.     RET
  390. ;
  391. ;
  392. WAIT        ;WAIT FOR OPERATOR TO TYPE RETURN
  393.     CALL    READCHAR
  394.     CPI    03H
  395.     JZ    WBOOTE
  396.     CPI    CR
  397.     JNZ    WAIT
  398.     RET
  399. ;
  400. ;    CP/M COMMUNICATION ROUTINES
  401. ;
  402. ;
  403. ENTRY    EQU    0005H    ; BDOS ENTRY POINT
  404. ;
  405. ;
  406. READCHAR    ; READ A CHARACTER FROM CONSOLE
  407.     MVI    C,1
  408.     JMP    ENTRY
  409. ;
  410. ;
  411. WRITECHAR    ; WRITE A CHARACTER TO CONSOLE
  412.     MVI    C,2
  413.     JMP    ENTRY
  414. ;
  415. ;
  416. WRITESTRING    ; WRITE A STRING ON CONSOLE
  417.     MVI    C,9
  418.     JMP    ENTRY
  419. ;
  420. ;
  421. READSTRING    ; READ STRING FROM CONSOLE
  422.     MVI    C,10
  423.     JMP    ENTRY
  424. ;
  425. ;
  426. INITBDOS    ;INITIALIZE BDOS, LOG IN DISK A
  427.     MVI    C,13
  428.     JMP    ENTRY
  429. ;
  430. ;
  431. OPENFILE    ; OPEN A NEW FILE
  432.     MVI    C,15
  433.     JMP    ENTRY
  434. ;
  435. ;
  436. CLOSEFILE    ; CLOSE FILE
  437.     MVI    C,16
  438.     JMP    ENTRY
  439. ;
  440. ;
  441. DELETEFILE    ; DELETE DIRECTORY ENTRY FOR FILE
  442.     MVI    C,19
  443.     JMP    ENTRY
  444. ;
  445. ;
  446. READREC        ; READ NEXT 128 BYTE RECORD
  447.     MVI    C,20
  448.     JMP    ENTRY
  449. ;
  450. ;
  451. WRITEREC    ; WRITE NEXT 128 BYTE RECORD
  452.     MVI    C,21
  453.     JMP    ENTRY
  454. ;
  455. ;
  456. MAKEFILE    ; CREATE NEW DIRECTORY ENTRY
  457.     MVI    C,22
  458.     JMP    ENTRY
  459. ;
  460. ;
  461. RENAMEFILE    ; CHANGE NAME IN DIRECTORY
  462.     MVI    C,23
  463.     JMP    ENTRY
  464. ;
  465. ;
  466. SETDMA        ; SET DMA ADDRESS FOR READ OR WRITE
  467.     MVI    C,26
  468.     JMP    ENTRY
  469. ;
  470. ;
  471. ;
  472. ;    DATA AREA
  473. ;
  474. OLDSP    DS    2
  475. RBUF    DB    28    ;COMMAND INPUT BUFFER
  476.     DS    31
  477. TFCB    DB    0    ;TEMP FCB
  478.     DB    'COPY    $$$'
  479. TFCBEX    DB    0
  480.     DB    0,0,0
  481.     DS    16
  482. TFCBCR    DS    1
  483. DFCB    DB    0    ;DEST FCB
  484.     DS    32
  485. EXTENT    DS    2    ;EXTENT OF COPY BUFFER
  486. MULTI    DS    1    ;MULTIPLE COPY MODE FLAG
  487. FINISH    DS    1    ;LAST BUFFER FLAG
  488. SDMSG    DB    LF,'INSERT SOURCE DISK, <CR> TO CONTINUE'
  489.     DB    CR,LF,EOM
  490. DDMSG    DB    'INSERT DEST DISK, <CR> TO CONTINUE'
  491.     DB    CR,LF,EOM
  492. TERMSG    DB    'COPY COMPLETE',CR,LF,EOM
  493. AEMSG    DB    LF,'WHAT?',CR,LF,EOM
  494. OPMSG    DB    LF,'SOURCE FILE NOT FOUND',CR,LF,EOM
  495. CRMSG    DB    LF,'DISK OR DIRECTORY FULL',CR,LF,EOM
  496. REMSG    DB    'READ ERROR ON SOURCE',CR,LF,EOM
  497.     DS    20H    ;MINIMUM STACK SPACE
  498.     ;SET START OF BUFFER TO MULTIPLE OF SECTOR SIZE
  499.     ORG    (($ + 7FH) / 80H) * 80H
  500. STACK    EQU    $    ;GROWS DOWN
  501. BUFFER    EQU    $    ;FILLS REST OF MEMORY TO CBASE
  502.     END
  503.