home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv009.ark / MFT45.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  16.3 KB  |  883 lines

  1. ;;;    mft - multiple file transfer (for single drive systems)
  2. ;
  3. ;     **Based on article in Dr. Dobbs Journal of Computer**
  4. ; **Calisthenics & Orthodontia #49, Box E, Menlo Park, Ca. 94025**
  5. ;    Version 4.5 - 10/29/80 - Deleted system disk request of V4.0
  6. ;     to shorten messages, minor changes in abort options and
  7. ;     other messages. Moved disk reset of V4.1 to point
  8. ;     before directory search. (CHS)
  9. ;
  10. ;    Version 4.4 - 10/28/80 - Modified to bail out with message 
  11. ;     if no FCB is specified. Updates rearranged with most
  12. ;     recent first for reader convenience. (Charles H. Strom)
  13. ;
  14. ;    VERSION 4.3 BY LEWIS MOSELEY, JR.  3/22/80
  15. ;    FIXED BUG WHICH SHOWED UP WHEN MULTIPLE COPIES WERE
  16. ;    MADE OF A MULTIPLE EXTENT FILE, IN THAT CP/M OPEN
  17. ;    THE NEXT EXTENT USING THE DATA AREA TO SEARCH THE
  18. ;    DIRECTORY, SCREWING UP THE DATA BLOCK THAT IS THERE.
  19. ;
  20. ;    VERSION 4.2 BY LEWIS MOSELEY, JR.  2/23/80
  21. ;    FIXED BUG THAT OCCURRED WHEN ONLY A SINGLE FILE
  22. ;        WAS SPECIFIED AND THAT FILE WAS NOT FOUND:
  23. ;        PROGRAM HUNG IN A LOOP
  24. ;
  25. ;      VERSION 4.1 BY LES FREED AND LEWIS MOSELEY 2/11/80
  26. ;    ADDED DISK RESET ON DISK CHANGE TO ALLOW
  27. ;        CHANGING DENSITY BETWEEN DISKS
  28. ;    ADDED CTL-C ABORT 
  29. ;
  30. ;    VERSION 4.0 BY LEWIS MOSELEY, JR.  12/79
  31. ;    ADDED OPTION FOR MULTIPLE OUTPUT COPIES
  32. ;    ADDED REQUEST FOR SYSTEM DISK BEFORE REBOOT
  33. ;
  34. ;    l.e. hughes     9/79
  35. ;    mycroft labs
  36. ;    atlanta, ga
  37. ;    MODIFIED FOR SOL & COMPATABLE COMPUTERS BY
  38. ;    LEWIS MOSELEY, JR. - ATLANTA,GA.
  39. VERSION    EQU    4
  40. MODLEV    EQU    5
  41. ;
  42. entry    equ    0005H        ;bdos entry point
  43. tfcb    equ    005CH        ;system file control block
  44. dbuf    equ    0080H        ;system disk buffer
  45. ;  
  46. CR    equ    0DH
  47. LF    equ    0AH
  48. ;  
  49. rcfc    equ    01        ;read console
  50. wcfc    equ    02        ;write console
  51. rdfc    equ    13        ;reset disk
  52. offc    equ    15        ;open file
  53. cffc    equ    16        ;close file
  54. sffc    equ    17        ;search first
  55. snfc    equ    18        ;search next
  56. dffc    equ    19        ;delete file
  57. rrfc    equ    20        ;read record
  58. wrfc    equ    21        ;write record
  59. mffc    equ    22        ;make file
  60. safc    equ    26        ;set address
  61. ;  
  62. fn    equ    01        ;file name offset
  63. ft    equ    09        ;file type offset
  64. ex    equ    12        ;extent number offset
  65. nr    equ    32        ;next record offset
  66. ;  
  67.     org    100H
  68. mft:    lxi    sp,stack+64
  69.     lxi    h,msg1        ;print 'MFT V4.0'
  70.     call    wasc
  71.     xra    a        ;clear break flags
  72.     sta    ibflg
  73.     sta    obflg
  74.     STA    NDFLG        ;CLEAR NO DUP FLAG
  75. ;  
  76.     LDA    TFCB+1        ;If no FCB specified
  77.     CPI    ' '        ;then say so
  78.     JNZ    OK
  79.     LXI    H,MSGK        ;and bail out
  80.     CALL    WASC        ;here
  81.     JMP    0H
  82. ;
  83. ;    calculate buffer size = fwa(BDOS) - fwa(MBUF)
  84. ;  
  85. OK    lhld    entry+1        ;hl = (entry+1) - 6
  86.     lxi    d,-6
  87.     dad    d
  88.     mov    a,l
  89.     ani    80H        ;hl = hl mod 128
  90.     mov    l,a
  91.     lxi    d,mbuf        ;hl = hl - fwa(MBUF)
  92.     mov    a,l
  93.     sub    e
  94.     mov    l,a
  95.     mov    a,h
  96.     sbb    d
  97.     mov    h,a
  98.     dad    h        ;hl = hl / 128
  99.     mov    l,h
  100.     mvi    a,0
  101.     aci    0
  102.     mov    h,a
  103.     dcx    h        ;subtract one
  104.     shld    space        ;save as buffer size
  105.     lxi    h,msg2        ;write 'Buffer size = '
  106.     call    wasc
  107.     lhld    space        ;write size of buffer
  108.     call    wdwc
  109.     lxi    h,msg3        ;write ' sectors'
  110.     call    wasc
  111. ;  
  112. ;    ask user to mount input disk
  113. ;  
  114. mft1:    lxi    h,msg4        ;write 'Mount input disk, type CR'
  115.     call    wasc
  116.     call    racc        ;read response
  117.     CPI    03        ;CTL-C ?
  118.     JZ    MFTL        ;ABORT WITH MESSAGE
  119.     cpi    CR        ;loop if anything but CR
  120.     jnz    mft1
  121.     call    weolc        ;echo CR,LF
  122.     CALL    RESET        ;adjust density
  123.     lda    ibflg        ;jump if ibflg set
  124.     ora    a
  125.     jnz    mft2a
  126. ;  
  127. ;    copy command line into cbuf
  128. ;  
  129.     lxi    h,dbuf        ;fwa of command line image
  130.     lxi    d,cbuf        ;fwa of command buffer
  131.     mov    b,m        ;fetch command line image length
  132.     inx    h
  133. mft2:    mov    a,m        ;fetch next byte from cli
  134.     inx    h
  135.     stax    d        ;store in dbuf
  136.     inx    d
  137.     dcr    b        ;decrement count
  138.     jnz    mft2        ;loop until zero
  139.     xra    a        ;store zero byte at end
  140.     stax    d
  141.     lxi    h,cbuf        ;reset cbufp
  142.     shld    cbufp
  143.     call    cfnt        ;create file name table
  144.     lxi    h,fnt        ;reset fnt pointers
  145.     shld    ifntp
  146.     shld    ofntp
  147. mft2a:    lxi    h,mbuf        ;reset mbuf pointer
  148.     shld    mbufp
  149.     lhld    space        ;reset msize
  150.     shld    msize
  151.     lda    ibflg        ;jump if ibflg not set
  152.     ora    a
  153.     jz    mft3
  154.     lxi    h,ifcb        ;copy IFCB into TFCB
  155.     lxi    d,tfcb
  156.     mvi    b,33
  157.     call    move
  158.     xra    a        ;clear ibflg
  159.     sta    ibflg
  160.     inr    a        ;set obflg
  161.     sta    obflg
  162.     lhld    ifntp        ;back ifntp up 4 bytes
  163.     lxi    d,-4
  164.     dad    d
  165.     shld    ifntp
  166.     lxi    h,tfcb+fn    ;write filename
  167.     call    wfnc
  168.     lxi    h,msg6        ;write ' - '
  169.     call    wasc
  170.     lhld    ifntp        ;DE = ifntp
  171.     xchg
  172.     jmp    mft4        ;continue reading previous file
  173. ;  
  174. ;    parse off next name from cbuf
  175. ;  
  176. mft3:    lhld    ifntp        ;fetch input fnt pointer
  177.     mov    a,m        ;jump if end of table
  178.     cpi    0FFH
  179.     jz    mft9
  180.     mvi    m,1        ;set 'file read' flag
  181.     inx    h
  182.     lxi    d,tfcb+fn    ;copy filename into tfcb
  183.     mvi    b,11
  184.     call    move
  185.     shld    ifntp        ;save input fnt pointer
  186.     lxi    h,tfcb+fn    ;write filename
  187.     call    wfnc
  188.     lxi    h,msg6        ;write ' - '
  189.     call    wasc
  190.     xra    a        ;setup tfcb
  191.     sta    tfcb
  192.     sta    tfcb+ex
  193.     sta    tfcb+nr
  194.     call    open        ;open file
  195.     lhld    ifntp
  196.     xchg
  197. mft4:    lhld    mbufp
  198.     mov    a,h        ;copy into fnt entry
  199.     stax    d
  200.     inx    d
  201.     mov    a,l
  202.     stax    d
  203.     inx    d
  204.     xchg            ;save fnt pointer
  205.     shld    ifntp
  206.     lxi    h,0        ;file size (in sectors) = 0
  207.     shld    fsize
  208. ;  
  209. ;    read next file from input disk
  210. ;  
  211. mft6:    lhld    mbufp
  212.     xchg
  213.     call    setdma
  214.     call    read        ;read next sector
  215.     ora    a        ;jump if normal transfer
  216.     jz    mft7
  217.     cpi    1        ;jump if EOF
  218.     jz    mft8
  219.     lxi    h,msg8        ;write 'read error - '
  220.     call    wasc
  221.     jmp    mft8        ;continue as if EOF
  222. mft7:    lhld    mbufp        ;mbufp = mbufp + 128
  223.     lxi    d,128
  224.     dad    d
  225.     shld    mbufp
  226.     lhld    fsize        ;fsize = fsize + 1
  227.     inx    h
  228.     shld    fsize
  229.     lhld    msize        ;decrement msize
  230.     dcx    h
  231.     shld    msize
  232.     mov    a,h        ;loop if still positive
  233.     ora    l
  234.     jnz    mft6
  235.     lxi    h,tfcb        ;copy tfcb into ifcb
  236.     lxi    d,ifcb
  237.     mvi    b,33
  238.     call    move
  239.     mvi    a,1        ;set ibflg
  240.     sta    ibflg
  241. mft8:    lxi    d,dbuf        ;reset dma pointer
  242.     call    setdma
  243.     call    close        ;close file
  244.     lhld    fsize        ;write file size
  245.     call    wdwc
  246.     lxi    h,msg9        ;write ' sectors read'
  247.     call    wasc
  248. ;  
  249. ;    update fnt, loop
  250. ;  
  251.     lhld    fsize        ;DE = file size
  252.     xchg
  253.     lhld    ifntp        ;store file size in fnt entry
  254.     mov    m,d
  255.     inx    h
  256.     mov    m,e
  257.     inx    h
  258.     shld    ifntp        ;save fnt pointer
  259.     lda    ibflg        ;loop if ibflg not set
  260.     ora    a
  261.     jz    mft3
  262. ;
  263. ;    FLAG THAT THE MEMORY BUFFER HAS BEEN EXCEEDED, AND
  264. ;    TELL USER THAT DUPLICATE COPIES CANNOT BE MADE
  265.     LDA    NDFLG        ;TOLD HIM ALREADY?
  266.     ORA     A
  267.     JNZ    MFT9        ;JUMP IF SO
  268.     LXI    H,MSGH        ;IF NOT, TELL HIM
  269.     CALL    WASC
  270.     MVI    A,1        ;SET NDFLG THIS TIME
  271.     STA    NDFLG
  272. ;
  273. ;    Ask user to mount output disk
  274. ;  
  275. mft9:    lxi    h,msgA        ;write 'Mount output disk, type CR'
  276.     call    wasc
  277.     call    racc        ;read response
  278.     CPI    03        ;CTL-C?
  279.     JZ    MFTL        ;ABORT WITH MESSAGE IF SO
  280.     cpi    CR        ;loop if anything but CR
  281.     jnz    mft9
  282.     call    weolc        ;echo CR,LF
  283.     call    reset        ;reset disk system 
  284.                 ;make r/w and check density
  285.     lda    obflg        ;jump if obflg not set
  286.     ora    a
  287.     jz    mftA
  288.     lxi    h,ofcb        ;copy ofcb into tfcb
  289.     lxi    d,tfcb
  290.     mvi    b,33
  291.     call    move
  292.     call    open        ;open previous file
  293.     lhld    ofntp        ;backup output fnt pointer 4 bytes
  294.     lxi    d,-4
  295.     dad    d
  296.     shld    ofntp
  297.     lxi    h,tfcb+fn    ;write file name
  298.     call    wfnc
  299.     lxi    h,msg6        ;write ' - '
  300.     call    wasc
  301.     jmp    mftb        ;continue writing previous file
  302. ;  
  303. ;    write next file to output disk
  304. ;  
  305. mftA:    lhld    ofntp
  306.     mov    a,m
  307.     ora    a
  308.     jz    mftF
  309.     cpi    0FFH
  310.     jz    mftF
  311.     inx    h
  312.     lxi    d,tfcb+fn
  313.     mvi    b,11
  314.     call    move
  315.     shld    ofntp
  316.     lxi    h,tfcb+fn
  317.     call    wfnc
  318.     lxi    h,msg6
  319.     call    wasc
  320.     xra    a
  321.     sta    tfcb
  322.     sta    tfcb+ex
  323.     sta    tfcb+nr
  324.     call    delt        ;try to create output file
  325.     call    make
  326.     cpi    255        ;jump if ok
  327.     jnz    mftB
  328.     lxi    h,msgB        ;write 'unable to create'
  329.     call    wasc
  330.     jmp    mftG
  331. mftB:    lhld    ofntp
  332.     mov    d,m        ;fetch fwa of file from fnt
  333.     inx    h
  334.     mov    e,m
  335.     inx    h
  336.     xchg
  337.     shld    mbufp        ;save it
  338.     xchg
  339.     mov    d,m        ;fetch size of file from fnt
  340.     inx    h
  341.     mov    e,m
  342.     inx    h
  343.     xchg
  344.     shld    fsize        ;save it
  345.     shld    xsize        ;save for printout
  346.     xchg
  347.     shld    ofntp
  348.     lhld    fsize        ;jump if fsize=0
  349.     mov    a,h
  350.     ora    l
  351.     jz    mftDA
  352. mftC:    lhld    mbufp        ;set dma address to mbufp
  353.     xchg
  354.     call    setdma
  355.     call    write        ;write next sector
  356.     ora    a        ;jump if ok
  357.     jz    mftD
  358.     lxi    h,msgC        ;write 'error writing file'
  359.     call    wasc
  360.     jmp    mftG
  361. mftD:    lhld    mbufp        ;mbufp = mbufp + 128
  362.     lxi    d,128
  363.     dad    d
  364.     shld    mbufp
  365.     lhld    fsize        ;fsize = fsize - 1
  366.     dcx    h
  367.     shld    fsize
  368.     mov    a,h        ;loop until zero
  369.     ora    l
  370.     jnz    mftC
  371. mftDA:    lxi    h,tfcb        ;copy tfcb into ofcb
  372.     lxi    d,ofcb
  373.     mvi    b,33
  374.     call    move
  375.     lxi    d,dbuf        ;reset dma pointer
  376.     call    setdma
  377.     call    close        ;try to close file
  378.     cpi    255        ;jump if ok
  379.     jnz    mftE
  380.     lxi    h,msgD        ;write 'unable to close'
  381.     call    wasc
  382. mftE:    lhld    xsize        ;write number of sectors written
  383.     call    wdwc
  384.     lxi    h,msgE        ;write ' sectors written'
  385.     call    wasc
  386.     jmp    mftA
  387. mftF:    lda    ibflg        ;loop if ibflg set
  388.     ora    a
  389.     jnz    mft1
  390. ;Terminate program here on irrecoverable error or
  391. ;when all files have been copied.  Must reload system
  392. ;disk to avoid crash when copying to someone else's disk.
  393. ;If normal end, and if buffer has not been exceeded, give
  394. ;user the option of making another copy of the same
  395. ;set of files.
  396. mftG:    LXI    H,MSGF        ;SEE IF OPTION IS ALLOWED
  397.     LDA     NDFLG
  398.     ORA    A
  399.     JNZ    MFTH        ;JUMP IF NOT ALLOWED
  400.     CALL     WASC        ;ELSE TELL ABOUT OPTION
  401. MFTH:    LXI    H,MSGG        ;ASK FOR SYSTEM DISK
  402.     call    wasc
  403.     call    racc        ;wait for response
  404.     CPI    03H        ;WARM BOOT IF ^C
  405.     JZ     0
  406.     CPI    CR         ;ATTEMPT REPEAT IF <RETURN>
  407.     JZ    MFTJ
  408.     JMP    MFTG        ;ELSE LOOP TILL GOOD RESPONSE
  409. ;
  410. MFTJ:    CALL    WEOLC        ;ACKNOWLEDGE COMMAND
  411.     LDA    NDFLG        ;REPEAT ALLOWED?
  412.     ORA    A
  413.     JNZ    MFTK        ;JUMP IF NOT
  414.     LXI    H,FNT        ;ELSE RESET FNT POINTER
  415.     SHLD    OFNTP
  416.     LXI    H,MBUF        ;RESET MEM BUF POINTER
  417.     SHLD    MBUFP
  418.     XRA    A        ;RESET OUTPUT INTERRUPTED FLAG
  419.     STA    OBFLG
  420.     JMP    MFT9        ;AND DO AGAIN
  421. ;
  422. MFTK:    LXI    H,MSGH        ;CANNOT REPEAT, TELL HIM AGAIN
  423.     CALL    WASC
  424.     JMP    MFTG        ;AND WAIT FOR SYSTEM DISK
  425. ;  
  426. MFTL:    LXI    H,MSGJ        ;ABORT MESSAGE
  427.     CALL    WASC
  428.     JMP    0H        ;WARM BOOT
  429.  
  430. ;    subroutines
  431. ;  
  432. move:    mov    a,m
  433.     inx    h
  434.     stax    d
  435.     inx    d
  436.     dcr    b
  437.     jnz    move
  438.     ret
  439. ;  
  440. ;;    gfn - get file name
  441. ;  
  442. ;  
  443. gfn:    mov    a,m
  444.     ora    a
  445.     rz
  446.     cpi    ' '
  447.     jnz    gfn0
  448.     inx    h
  449.     jmp    gfn
  450. gfn0:    lxi    d,xfcb
  451.     xra    a
  452.     stax    d
  453.     inx    d
  454.     push    d
  455.     mvi    b,11
  456.     mvi    a,' '
  457. gfn6:    stax    d
  458.     inx    d
  459.     dcr    b
  460.     jnz    gfn6
  461.     pop    d
  462.     mvi    b,9
  463. gfn1:    mov    a,m
  464.     ora    a
  465.     jz    gfn4
  466.     inx    h
  467.     cpi    ' '
  468.     jz    gfn4
  469.     cpi    '.'
  470.     jz    gfn2
  471.     cpi    '*'
  472.     jz    gfn7
  473.     stax    d
  474.     inx    d
  475.     dcr    b
  476.     jz    gfn5
  477.     jmp    gfn1
  478. gfn7:    dcr    b
  479.     jz    gfn9
  480.     mvi    a,'?'
  481.     stax    d
  482.     inx    d
  483.     jmp    gfn7
  484. gfn9:    mov    a,m
  485.     cpi    '.'
  486.     jnz    gfn4
  487.     inx    h
  488. gfn2:    lxi    d,xfcb+ft
  489.     mvi    b,4
  490. gfn3:    mov    a,m
  491.     ora    a
  492.     jz    gfn4
  493.     inx    h
  494.     cpi    ' '
  495.     jz    gfn4
  496.     cpi    '*'
  497.     jz    gfn8
  498.     stax    d
  499.     inx    d
  500.     dcr    b
  501.     jz    gfn5
  502.     jmp    gfn3
  503. gfn8:    dcr    b
  504.     jz    gfn4
  505.     mvi    a,'?'
  506.     stax    d
  507.     inx    d
  508.     jmp    gfn8
  509. gfn4:    xra    a
  510.     ret
  511. gfn5:    stc
  512.     ret
  513. ;  
  514. ;;    cfnt - create file name table
  515. ;  
  516. ;  
  517. cfnt:    lxi    h,fnt        ;reset ifntp
  518.     shld    ifntp
  519.     MVI    M,0FFH        ;VER 4.2 BUG FIX 
  520. cfnt1:    lhld    cbufp        ;get cbufp
  521.     mov    a,m        ;exit if end of list
  522.     ora    a
  523.     rz
  524.     call    gfn        ;get next afn
  525.     shld    cbufp        ;save command buffer ptr
  526.     jnc    cfnt2        ;jump if filename ok
  527.     lxi    h,msg5        ;write 'Syntax error in filename'
  528.     call    wasc
  529.     jmp    cfnt1        ;loop
  530. cfnt2:    xra    a        ;clear xfcb extent field
  531.     sta    xfcb+ex
  532.     lxi    d,xfcb        ;search for first occurance
  533.     call    srchf
  534.     cpi    255        ;jump if found
  535.     jnz    cfnt3
  536.     lxi    h,xfcb+fn    ;write filename
  537.     call    wfnc
  538.     lxi    h,msg7        ;write ' not found'
  539.     call    wasc
  540.     jmp    cfnt1        ;loop
  541. cfnt3:    ani    3        ;index into cbuf
  542.     mov    l,a
  543.     mvi    h,0
  544.     dad    h
  545.     dad    h
  546.     dad    h
  547.     dad    h
  548.     dad    h
  549.     lxi    d,dbuf
  550.     dad    d
  551.     xchg            ;copy filename into fnt
  552.     lhld    ifntp
  553.     xchg
  554.     mvi    b,12
  555.     call    move
  556.     lxi    h,zeros        ;zero fill rest of entry
  557.     mvi    b,4
  558.     call    move
  559.     xchg
  560.     shld    ifntp        ;save input fnt pointer
  561.     mvi    m,0FFH        ;insure FF byte at end
  562.     lxi    d,xfcb        ;search for next occurance
  563.     call    srchn
  564.     cpi    255        ;jump if found
  565.     jnz    cfnt3
  566.     jmp    cfnt1        ;go get next afn
  567. ;  
  568. ;;    wasc - write ascii string to console
  569. ;  
  570. ;  
  571. wasc:    mov    a,m
  572.     ora    a
  573.     rz
  574.     call    wacc
  575.     inx    h
  576.     jmp    wasc
  577. ;  
  578. ;  
  579. ;;    wfnc - write file name to console
  580. ;Note: Under SOLOS and CUTER, 01 is the cursor-left character.
  581. ;When MFTing a multi-extent file, the extent character must
  582. ;be filtered out of the file-name-block to avoid wierd
  583. ;console output.
  584. ;
  585. wfnc:    mov     a,m
  586.     ora    a        ;0=thru
  587.     rz
  588.     cpi    20h        ;skip print if < space
  589.     jc    wfnc1
  590.     call    wacc
  591. wfnc1    inx    h
  592.     jmp    wfnc
  593. ;  
  594. ;;    weolc - write end of line to console
  595. ;  
  596. ;  
  597. weolc:    mvi    a,CR
  598.     call    wacc
  599.     mvi    a,LF
  600.     jmp    wacc
  601. ;  
  602. ;;    wdwc - write decimal word to console
  603. ;  
  604. ;  
  605. wdwc:    push    h
  606.     push    d
  607.     push    b
  608.     mvi    b,0        ;clear 'digit written' flag
  609.     lxi    d,10000        ;write 1st digit
  610.     call    wndd
  611.     lxi    d,1000        ;write 2nd digit
  612.     call    wndd
  613.     lxi    d,100        ;write 3rd digit
  614.     call    wndd
  615.     lxi    d,10        ;write 4th digit
  616.     call    wndd
  617.     lxi    d,1        ;write 5th digit
  618.     mvi    b,1        ;force last digit to print
  619.     call    wndd
  620.     pop    b
  621.     pop    d
  622.     pop    h
  623.     ret
  624. ;  
  625. wndd:    mvi    c,0        ;c=0
  626. wndd1:    mov    a,l        ;hl = hl - de
  627.     sub    e
  628.     mov    l,a
  629.     mov    a,h
  630.     sbb    d
  631.     mov    h,a
  632.     jc    wndd2        ;jump if < 0
  633.     inr    c        ;c = c + 1
  634.     jmp    wndd1        ;loop
  635. wndd2:    dad    d        ;hl = hl + de
  636.     mov    a,c        ;jump if c non-zero
  637.     ora    c
  638.     jnz    wndd4
  639.     mov    a,b        ;jump if digit written
  640.     ora    b
  641.     jnz    wndd4
  642.     mvi    a,' '        ;write one space
  643.     jmp    wacc
  644. wndd4:    mvi    b,1        ;set 'digit written' flag
  645.     mov    a,c        ;encode c into decimal ascii
  646.     adi    '0'
  647.     jmp    wacc        ;go write it
  648. ;  
  649. ;;    wacc - write ascii character to console
  650. ;  
  651. ;  
  652. wacc:    push    h
  653.     push    d
  654.     push    b
  655.     push    psw
  656.     mvi    c,wcfc
  657.     mov    e,a
  658.     call    entry
  659.     pop    psw
  660.     pop    b
  661.     pop    d
  662.     pop    h
  663.     ret
  664. ;  
  665. ;;    racc - read ascii character from console
  666. ;  
  667. ;  
  668. racc:    push    h
  669.     push    d
  670.     push    b
  671.     mvi    c,rcfc
  672.     call    entry
  673.     pop    b
  674.     pop    d
  675.     pop    h
  676.     ret
  677. ;  
  678. ;;    reset - reset disk system
  679. ;  
  680. ;  
  681. reset:    push    h
  682.     push    d
  683.     push    b
  684.     mvi    c,rdfc
  685.     call    entry
  686.     pop    b
  687.     pop    d
  688.     pop    h
  689.     ret
  690. ;  
  691. ;;    open - open disk file
  692. ;  
  693. ;  
  694. open:    push    h
  695.     push    d
  696.     push    b
  697.     lxi    d,tfcb
  698.     mvi    c,offc
  699.     call    entry
  700.     pop    b
  701.     pop    d
  702.     pop    h
  703.     ret
  704. ;  
  705. ;;    read - read record from disk file
  706. ;  
  707. ;  
  708. read:    push    h
  709.     push    d
  710.     push    b
  711.     lxi    d,tfcb
  712.     mvi    c,rrfc
  713.     call    entry
  714.     pop    b
  715.     pop    d
  716.     pop    h
  717.     ret
  718. ;  
  719. ;;    close - close disk file
  720. ;  
  721. ;  
  722. close:    push    h
  723.     push    d
  724.     push    b
  725.     lxi    d,tfcb
  726.     mvi    c,cffc
  727.     call    entry
  728.     pop    b
  729.     pop    d
  730.     pop    h
  731.     ret
  732. ;  
  733. ;;    delt - delete disk file
  734. ;  
  735. ;  
  736. delt:    push    h
  737.     push    d
  738.     push    b
  739.     lxi    d,tfcb
  740.     mvi    c,dffc
  741.     call    entry
  742.     pop    b
  743.     pop    d
  744.     pop    h
  745.     ret
  746. ;  
  747. ;;    make - make new disk file
  748. ;  
  749. ;  
  750. make:    push    h
  751.     push    d
  752.     push    b
  753.     lxi    d,tfcb
  754.     mvi    c,mffc
  755.     call    entry
  756.     pop    b
  757.     pop    d
  758.     pop    h
  759.     ret
  760. ;  
  761. ;;    write - write record to file
  762. ;  
  763. ;  
  764. write:    push    h
  765.     push    d
  766.     push    b
  767. ;
  768. ;REVISION 4.3 MODS
  769.     LDA    tfcb+nr        ;LAST RECORD IN EXTENT?
  770.     CPI    7FH
  771.     JNZ    WRITE1        ;NO, CONTINUE
  772.     LHLD    mbufp        ;EXISTING DATA AREA
  773.     LXI    D,dbuf        ;POINT TO SAFE AREA
  774.     CALL    SETDMA        ;TELL CP/M WHERE TO GET DATA
  775.     MVI    B,80H        ;LENGTH TO MOVE
  776.     CALL    MOVE        ;MOVE DATA AWAY SO...
  777. ;CP/M DOESN'T OVERWRITE THE REAL DATA IN OPENING NEXT EXTENT
  778. ;END REVISION 4.3 MODS
  779.  
  780. WRITE1:    lxi    d,tfcb
  781.     mvi    c,wrfc
  782.     call    entry
  783.     pop    b
  784.     pop    d
  785.     pop    h
  786.     ret
  787. ;  
  788. ;;    setdma - set dma address
  789. ;  
  790. ;  
  791. setdma:    push    h
  792.     push    d
  793.     push    b
  794.     mvi    c,safc
  795.     call    entry
  796.     pop    b
  797.     pop    d
  798.     pop    h
  799.     ret
  800. ;  
  801. ;;    srchf - search for first occurance of afn
  802. ;  
  803. ;  
  804. srchf:    push    h
  805.     push    d
  806.     push    b
  807.     mvi    c,sffc
  808.     call    entry
  809.     pop    b
  810.     pop    d
  811.     pop    h
  812.     ret
  813. ;  
  814. ;;    srchn - search for next occurance of afn
  815. ;  
  816. ;  
  817. srchn:    push    h
  818.     push    d
  819.     push    b
  820.     mvi    c,snfc
  821.     call    entry
  822.     pop    b
  823.     pop    d
  824.     pop    h
  825.     ret
  826. ;  
  827. msg1:    db    CR,LF,'MFT V'
  828.     DB    VERSION+'0'    ;VERSION #
  829.     DB    '.',MODLEV+'0'    ;MODIFICATION LEVEL
  830.     DB    CR,LF
  831.     db    'Multi-File-Transfer for single disk,',CR,LF
  832.     db    'With multiple-copy option.',CR,LF,LF,0
  833. msg2:    db    'Buffer size = ',0
  834. msg3:    db    ' sectors',CR,LF,LF,0
  835. msg4:    db    'Mount INPUT disk, type RETURN (or ^C to reboot)',0
  836. msg5:    db    'Syntax error in filename',CR,LF,0
  837. msg6:    db    ' - ',0
  838. msg7:    db    ' not found',CR,LF,0
  839. msg8:    db    'read error - ',0
  840. msg9:    db    ' sectors read',CR,LF,0
  841. msgA:    db    'Mount OUTPUT disk, type RETURN (or ^C to reboot)',0
  842. msgB:    db    'unable to create',CR,LF,0
  843. msgC:    db    'error writing file',CR,LF,0
  844. msgD:    db    'unable to close',CR,LF,0
  845. msgE:    db    ' sectors written',CR,LF,0
  846. MSGF:    db    CR,LF,'Completed. '
  847.     db    'Type RETURN for another copy, OR...',0
  848. MSGG:    db    CR,LF,'type ^C to reboot.',CR,LF,0
  849. MSGH:    db     CR,LF,'++Memory buffer exceeded, cannot ',CR,LF
  850.     db    'make duplicate copies this time;',CR,LF
  851.     DB    'last ouput file is defective++',CR,LF,LF,0
  852. MSGJ    DB    CR,LF,'++PROGRAM ABORTED++',CR,LF,0
  853. MSGK    DB    CR,LF,'No file name specified',CR,LF,0
  854. ;
  855. ;
  856. zeros:    db    0,0,0,0
  857. ;  
  858.     org    ($+15)/16*16
  859. ;  
  860. fnt:    ds    16*64+1
  861. ;  
  862. stack:    ds    64
  863. space:    ds    2        ;available space
  864. msize:    ds    2        ;memory size
  865. cbuf:    ds    80        ;command buffer
  866. cbufp:    ds    2        ;command buffer pointer
  867. fsize:    ds    2        ;file size in sectors
  868. xsize:    ds    2        ;file size for printout
  869. ifntp:    ds    2        ;input fnt pointer
  870. ofntp:    ds    2        ;output fnt pointer
  871. mbufp:    ds    2        ;memory buffer pointer
  872. ifcb:    ds    33        ;input fcb
  873. ofcb:    ds    33        ;output fcb
  874. xfcb:    ds    33        ;temporary fcb
  875. ibflg:    ds    1        ;input break flag
  876. obflg:    ds    1        ;output break flag
  877. NDFLG:    DS    1        ;NO DUPLICATE ALLOWED FLAG
  878. ;  
  879. mbuf    equ    $
  880. ;  
  881.     end    mft
  882.