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