home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol017 / tfx12-18.asm < prev    next >
Assembly Source File  |  1984-04-29  |  21KB  |  881 lines

  1. ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2. ; +           CP/M to CP/M file transfer utility             +
  3. ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4. ;
  5. ; Revised 12/18/80,  to allow "wild card" filenames and  type,
  6. ; as well as "multi-file transfers"
  7. ;                    TFX.ASM Version 1.2
  8. ;                           as of
  9. ;                     December 18, 1980
  10. ;                     HARWARE DEPENDENCE
  11. ;                     ------------------
  12. ;  The  harware  requirment for inter-system file transfer  is 
  13. ; simply  two disk sub-systems of same or  differing  hardware 
  14. ; requirments  operating under the same host main frame micro-
  15. ; computer,  both  of which are capable of operating  under  a 
  16. ; CP/M environment.
  17. ;                    SOFTWARE DEPENDENCE
  18. ;                    -------------------
  19. ;  
  20. ;  Both  disk sub-systems must be capable of running the  CP/M 
  21. ; disk  operating system.  Memory size of these systems is  of 
  22. ; little  importance  other  than one system 'MUST' be  of  at 
  23. ; least 5 kilo-bytes larger in size.
  24. ;                        OPERATION
  25. ;                        ---------
  26. ;  The  'Resident'  and 'Co-resident' systems are  defined  as 
  27. ; follows:
  28. ;                     RESIDENT SYSYTEM
  29. ;  The  resident  CP/M system,  larger in  terms  of  SYSGENed 
  30. ; memory size.
  31. ;                    CO-RESIDENT SYSTEM
  32. ;    
  33. ;  The  co-resident CP/M system,  smaller in terms of SYSGENed 
  34. ; memory size.
  35. ;  Initially you start up by booting the co-resident system as 
  36. ; you  normally  do and then transfer control to the  resident 
  37. ; system. There are several ways of doing this, the easiest is 
  38. ; using a file called GO.COM,  it's operation is simple;  type 
  39. ; GO 'XXXX' where XXXX represents the hexadecimal address  you 
  40. ; wish your processor to jump to, others include (with a front 
  41. ; panel  system) STOP,EXAMINE,RUN ( as for a MITS 8800b micro-
  42. ; computer)  the  address refered to is the  "primitive"  boot 
  43. ; address to your resident system.
  44. ;  After completing the above operation, type:
  45. ;  TFX S:FN.FT D:FN.FT<cr>
  46. ;  Where:
  47. ;  TFX  is the com file transfer utility
  48. ;  
  49. ;  S:   is  the source drive reference (RESIDENT  system), A: 
  50. ;       thru P: under CP/M version 2.x
  51. ;  
  52. ;  D:   is  the  destination  drive  reference  (CO-RESIDENT 
  53. ;       system), A: thru P: under CP/M version 2.x
  54. ;  FN:  is the file name (1 to 8 character)
  55. ;  
  56. ;  FT:  is the file type (1 to 3 character)
  57. ;  <cr> carriage return, on your console keyboard
  58. ;  Note:  D:FN.FT does not have to agree with S:FN.FT; this is 
  59. ; an enventual call to 'make file' function to the co-resident 
  60. ; BDOS in CP/M.  Also, "wild card" filenames and  types may be
  61. ; used.
  62. ;                          MESSAGES
  63. ;                          --------
  64. ; Resident bdos entry = XXXXH (hex address resident)
  65. ; Co-resident bdos entry = XXXXH (hex  address  co-resident) 
  66. ; No source file (source file can't be found)
  67. ; No directory space (directory full on destination disk)
  68. ; Write protected (destination disk is write protected)
  69. ; Copy complete (file transfer has completed)
  70. ;              PATCH NOTES
  71. ;              -----------
  72. ;  In   view  of  the  various  CP/M  (versions)  systems  and 
  73. ; programmers implementations (Lifeboat associates,...ugh),  I 
  74. ; have decided not to do any version checking (an attribute of 
  75. ; CP/M  2.x).  In  the TFX.ASM source file,  you  will  see  a 
  76. ; subroutine  that  calculates  the  co-resident  jump  vector 
  77. ; entries,  saves this address and then biases this value by a 
  78. ; constant  to  determine  the bdos entry  - the  address  you 
  79. ; normally  find  at  0005h.  This bias value is based  on  my 
  80. ; system  and  more than likely will have to  be  changed  for 
  81. ; yours.  This  is  simply the difference between 'warm  boot' 
  82. ; (this address is stored at 0000h) and BDOS (this address  is 
  83. ; stored  at 0005h).  I then simply take this address and do a 
  84. ; DAD  (double  add) to this bias,  a  subtraction  operation. 
  85. ; These address references are of cource with respect to  your 
  86. ; co-resident CP/M system. WARNING: DO NOT USE DDT (or SID) to 
  87. ; examine  address  0005h to use in your offset  calculations. 
  88. ; This address will overlayed by either debugger,  and will be 
  89. ; wrong.
  90. ;  This  is  a  very simple file transfer  function,  in  fact 
  91. ; primitive.  I am in the process of writting a program  which 
  92. ; operates  in similar fashion to PIP.COM,  which is a  common 
  93. ; utility...at  the  time of this writting it's  still  pretty 
  94. ; "buggy".
  95. ;                         Crable Enterprises - Brent J. Crable
  96. ;
  97. ;
  98. ;++++++++++++++++++++++++++++++++++++++++++++++++
  99. ;+    CP/M to CP/M inter-system file transfer    +
  100. ;+    written by: Brent J. Crable   12/18/80    +
  101. ;++++++++++++++++++++++++++++++++++++++++++++++++
  102. ;
  103. boot:        equ     0        ;system reboot
  104. bdos:        equ     5        ;bdos entry point
  105. tfcb:        equ     5ch     ;system file control block
  106. disk$buf:   equ     80h     ;system disk buffer
  107. fn:        equ     1        ;file name offset
  108. ft:        equ     9        ;file type offset
  109. ex:        equ     12        ;extent number offset
  110. nr:        equ     32        ;next record offset
  111. ;
  112. cr        equ     0dh
  113. lf        equ     0ah
  114. ;
  115. ;+++++++++++++++++++++++++++++++++++++++++++++++
  116. ;+    CP/M primitive bdos functions           +
  117. ;+++++++++++++++++++++++++++++++++++++++++++++++
  118. ;
  119. read$con:   equ     1        ;read console
  120. write$con:  equ     2        ;print console
  121. printf:     equ     9        ;print buffer
  122. reset:        equ     13        ;reset disk
  123. open:        equ     15        ;open file
  124. close:        equ     16        ;close file
  125. sfirst:     equ     17        ;search first
  126. snext:        equ     18        ;search next
  127. delt:        equ     19        ;delete file
  128. read:        equ     20        ;read record
  129. write:        equ     21        ;write record
  130. make:        equ     22        ;make file
  131. setdma:     equ     26        ;set address
  132. ;
  133. ;**********    macro definitons    ****************
  134. ;
  135. mess    macro    m    ;print message m
  136. ;
  137.     lxi    d,m    ;;point to message
  138.     mvi    c,printf;;load cp/m print code
  139.     call    bdos    ;;disk primitive entry point
  140.     endm
  141. ;
  142. ;**************************************************
  143. ;
  144.     org    100h
  145. ;
  146. tfx:    lxi    sp,stack
  147. ;
  148.     mess    msg0    ;sign on
  149.     mess    msg1
  150.     lhld    bdos+1
  151.     mov    a,h    ;print bdos addr
  152.     call    phex
  153.     mov    a,l
  154.     call    phex
  155.     mvi    a,'H'
  156.     call    pchar
  157.     call    crlf
  158.     xra    a
  159.     sta    inp$buf$flg
  160.     sta    opt$buf$flg
  161. ;
  162. ;++++++++++++++++++++++++++++++++++++++++++++++
  163. ;+ calculate co-resident cp/m system location +
  164. ;++++++++++++++++++++++++++++++++++++++++++++++
  165. ;
  166. fndsys: lxi    h,4a00h ;set a start value
  167. tryag:    push    h    ;set pointer
  168.     mvi    b,15    ;number of jumps to match
  169. match:    mov    a,m
  170.     cpi    0c3h    ;look for jmp instruction
  171.     jz    jmpok    ;yes
  172.     pop    h
  173.     inr    h
  174.     jmp    tryag
  175. ;
  176. jmpok:    inx    h
  177.     inx    h
  178.     inx    h
  179.     dcr    b
  180.     jnz    match
  181. ;+++++++++++++++++++++++++++++++++++++++++++
  182. ;+ we found something that is probably the +
  183. ;+ co-resident CP/M bdos entry           +
  184. ;+++++++++++++++++++++++++++++++++++++++++++
  185.     pop    h    ;recover address
  186.     shld    xentry    ;co-res jmp vectors
  187.     lxi    d,-3578 ;bias to bdos (patchable)
  188.     dad    d
  189.     shld    xbdos
  190.     mess    msg1a
  191.     lhld    xbdos
  192.     mov    a,h    ;print xbdos addr
  193.     call    phex
  194.     mov    a,l
  195.     call    phex
  196.     mvi    a,'H'
  197.     call    pchar
  198.     call    crlf
  199. ;
  200. ;++++++++++++++++++++++++++++++++++++++++++++++++++++
  201. ;+ calculate buffer size =(xbdos-mbuff/modulus 128) +
  202. ;++++++++++++++++++++++++++++++++++++++++++++++++++++
  203. ;
  204.     lhld    xbdos
  205.     lxi    d,-6    ;hl = xbdos-6
  206.     dad    d
  207.     mov    a,l
  208.     ani    80h    ;hl = hl mod 128
  209.     mov    l,a
  210.     lxi    d,mbuf
  211.     mov    a,l
  212.     sub    e
  213.     mov    l,a
  214.     mov    a,h
  215.     sbb    d
  216.     mov    h,a
  217.     dad    h    ;hl = hl / 128
  218.     mov    l,h
  219.     mvi    a,0
  220.     aci    0
  221.     mov    h,a
  222.     dcx    h    ;subtract one
  223.     shld    aval$space   ;save as buffer size
  224.     mess    msg2    ;print buffer size =
  225.     lhld    aval$space   ;print size of buffer
  226.     call    wdwc
  227.     mess    msg3    ;print sectors
  228.     call    crlf
  229. ;+++++++++++++++++++++++++++++++++++++++++++++++++++
  230. ;+  notify user to mount data disk in host system  +
  231. ;+++++++++++++++++++++++++++++++++++++++++++++++++++
  232. ;
  233.     lda    tfcb+1    ;see if file name specified
  234.     cpi    ' '
  235.     jnz    tfx1
  236.     mess    msgz    ;error - no file name
  237.     jmp    boot
  238. ;
  239. tfx1:    mess    msg4
  240.     call    racc    ;read response
  241.     cpi    cr    ;loop if anything but cr
  242.     jnz    tfx1
  243. tfx1a:    call    crlf
  244.     lda    inp$buf$flg   ;jump if input buffer flag set
  245.     ora    a
  246.     jnz    tfx2a
  247. ;+++++++++++++++++++++++++++++++++++++++++++++++
  248. ;+ Move command line image into command buffer +
  249. ;+++++++++++++++++++++++++++++++++++++++++++++++
  250.     lxi    h,disk$buf  ;source
  251.     lxi    d,cmd$buf      ;destination
  252.     mov    b,m    ;fetch command line image length
  253.     inx    h
  254. tfx2:    mov    a,m    ;fetch next byte from cli
  255.     inx    h
  256.     stax    d
  257.     inx    d
  258.     dcr    b    ;decrement count
  259.     jnz    tfx2    ;loop untill zero
  260.     xra    a    ;store zero byte at end
  261.     stax    d
  262.     lxi    h,cmd$buf  ;reset cmd$bufp
  263.     shld    cmd$pt$buf
  264.     call    cfnt    ;create file name table
  265.     lxi    h,file$nt   ;reset file$nt pointers
  266.     shld    inp$fil$ntp
  267.     shld    opt$fil$ntp
  268. tfx2a:    lxi    h,mbuf    ;reset mbuf pointer
  269.     shld    mem$pt$buf
  270.     lhld    aval$space   ;reset msize
  271.     shld    mem$size
  272.     lda    inp$buf$flg   ;jump if inp$buf$flg not set
  273.     ora    a
  274.     jz    tfx3
  275.     lxi    h,input$fcb  ;copy input$fcb into tfcb
  276.     lxi    d,tfcb
  277.     mvi    b,33
  278.     call    move
  279.     xra    a    ;clear inp$buf$flg
  280.     sta    inp$buf$flg
  281.     mvi    a,1    ;set opt$buf$flg
  282.     sta    opt$buf$flg
  283.     lhld    inp$fil$ntp   ;back inp$fil$ntp up 4 bytes
  284.     lxi    d,-4
  285.     dad    d
  286.     shld    inp$fil$ntp
  287.     lxi    h,tfcb+fn ;print file name
  288.     call    wasc
  289.     mess    msg6    ;print -
  290.     lhld    inp$fil$ntp   ;de = inp$fil$ntp
  291.     xchg
  292.     jmp    tfx4    ;continue reading previous file
  293. ;++++++++++++++++++++++++++++++++++++++++++++++
  294. ;+ process next file name from command buffer +
  295. ;++++++++++++++++++++++++++++++++++++++++++++++
  296. ;
  297. tfx3:    lhld    inp$fil$ntp   ;fetch input fnt pointer
  298.     mov    a,m    ;jump if end of table
  299.     cpi    0ffh
  300.     jz    tfx9
  301.     mvi    m,1    ;set 'file read' flag
  302.     inx    h
  303.     lxi    d,tfcb+fn  ;copy filename into tfcb
  304.     mvi    b,11
  305.     call    move
  306.     shld    inp$fil$ntp   ;save input fnt pointer
  307.     lxi    h,tfcb+fn  ;print file name
  308.     call    wasc
  309.     mess    msg6
  310.     xra    a    ;setup tfcb
  311.     sta    tfcb
  312.     sta    tfcb+ex
  313.     sta    tfcb+nr
  314.     lxi    d,tfcb
  315.     mvi    c,open    ;open file
  316.     call    bdos
  317.     lhld    inp$fil$ntp
  318.     xchg
  319. tfx4:    lhld    mem$pt$buf
  320.     mov    a,h    ;copy into fnt entry
  321.     stax    d
  322.     inx    d
  323.     mov    a,l
  324.     stax    d
  325.     inx    d
  326.     xchg        ;save fnt pointer
  327.     shld    inp$fil$ntp
  328.     lxi    h,0    ;file size (in sectors) = 0
  329.     shld    file$size
  330. ;
  331. ; read next file from input disk
  332. ;
  333. tfx6:    lhld    mem$pt$buf
  334.     xchg
  335.     mvi    c,setdma
  336.     call    bdos
  337.     lxi    d,tfcb    ;read next sector (8)
  338.     mvi    c,read
  339.     call    bdos
  340.     ora    a    ;jump if normal transfer
  341.     jz    tfx7
  342.     cpi    1    ;jump if eof
  343.     jz    tfx8
  344.     mess    msg8    ;print read error - '
  345.     jmp    tfx8    ;continue as if eof
  346. ;
  347. tfx7:    lhld    mem$pt$buf   ;mem$pt$buf = mem$pt$buf + 128
  348.     lxi    d,128
  349.     dad    d
  350.     shld    mem$pt$buf
  351.     lhld    file$size   ;file$size = file$size + 1
  352.     inx    h
  353.     shld    file$size
  354.     lhld    mem$size
  355.     dcx    h
  356.     shld    mem$size
  357.     mov    a,h    ;loop if still positive
  358.     ora    l
  359.     jnz    tfx6
  360.     lxi    h,tfcb    ;copy tfcb into input$fcb
  361.     lxi    d,input$fcb
  362.     mvi    b,33
  363.     call    move
  364.     mvi    a,1    ;set inp$buf$flg
  365.     sta    inp$buf$flg
  366. tfx8:    lxi    d,disk$buf  ;reset dma pointer
  367.     mvi    c,setdma
  368.     call    bdos
  369.     lxi    d,tfcb
  370.     mvi    c,close  ;close file (8)
  371.     call    bdos
  372.     lhld    file$size   ;print file size
  373.     call    wdwc
  374.     mess    msg9    ;print sectors read'
  375. ;
  376. ; update file$nt, loop
  377. ;
  378.     lhld    file$size   ;de = file size
  379.     xchg
  380.     lhld    inp$fil$ntp   ;store file size in fnt entry
  381.     mov    m,d
  382.     inx    h
  383.     mov    m,e
  384.     inx    h
  385.     shld    inp$fil$ntp   ;save fnt pointer
  386.     lda    inp$buf$flg   ;loop if inp$buf$flg not set
  387.     ora    a
  388.     jz    tfx3
  389. ;
  390. ; ask user to mount output disk
  391. ;
  392. tfx9:    lda    pauseflg
  393.     ora    a
  394.     jz    tfx9a
  395.     xra    a
  396.     sta    pauseflg
  397.     mess    msga    ;print mount output disk, type cr
  398.     call    racc    ;read response
  399.     cpi    cr    ;loop if anything but cr
  400.     jnz    tfx9
  401.     call    crlf
  402.     jmp    tfx10
  403. ;
  404. tfx9a:    call    crlf
  405.     mess    msga1
  406.     call    crlf
  407. tfx10:    mvi    c,reset;reset disk system (make r/w)
  408.     call    entry
  409.     lda    opt$buf$flg   ;jump if opt$buf$flg not set
  410.     ora    a
  411.     jz    tfxa
  412.     lxi    h,output$fcb  ;copy output$fcb into tfcb
  413.     lxi    d,tfcb
  414.     mvi    b,33
  415.     call    move
  416.     lxi    d,tfcb
  417.     mvi    c,open    ;open previos file
  418.     call    entry
  419.     lhld    opt$fil$ntp   ;backup output fnt pointer 4 bytes
  420.     lxi    d,-4
  421.     dad    d
  422.     shld    opt$fil$ntp
  423.     lxi    h,tfcb+fn    ;print file name
  424.     call    wasc
  425.     mess    msg6    ;print -
  426.     jmp    tfxb    ;continue writing previous file
  427. ;
  428. pauseflg:
  429.     db    1    ;set true
  430. ;+++++++++++++++++++++++++++++++++++++++
  431. ;+ Write next file to destination disk +
  432. ;+++++++++++++++++++++++++++++++++++++++
  433. tfxa:    lhld    opt$fil$ntp
  434.     mov    a,m
  435.     ora    a
  436.     jz    tfxf
  437.     cpi    0ffh
  438.     jz    tfxf
  439.     inx    h
  440.     lxi    d,tfcb+fn
  441.     mvi    b,11
  442.     call    move
  443.     shld    opt$fil$ntp
  444.     lxi    h,tfcb+fn
  445.     call    wasc
  446.     mess    msg6
  447.     xra    a
  448.     sta    tfcb
  449.     sta    tfcb+ex
  450.     sta    tfcb+nr
  451.     lda    tfcb+9    ;fource to $r/w for 2.0
  452.     ani    7fh
  453.     sta    tfcb+9    ;fource to $dir for 2.0
  454.     lda    tfcb+10
  455.     ani    7fh
  456.     sta    tfcb+10
  457.     lxi    d,tfcb    ;try to create output file (5)
  458.     mvi    c,delt
  459.     call    entry
  460.     lxi    d,tfcb
  461.     mvi    c,make
  462.     call    entry
  463.     cpi    255    ;jump if o.k.
  464.     jnz    tfxb
  465.     mess    msgb    ;print unable to create'
  466.     jmp    tfxg
  467. ;
  468. tfxb:    lhld    opt$fil$ntp
  469.     mov    d,m    ;fetch fwa of file from fnt
  470.     inx    h
  471.     mov    e,m
  472.     inx    h
  473.     xchg
  474.     shld    mem$pt$buf   ;save it
  475.     xchg
  476.     mov    d,m    ;fetch size of file from pointer
  477.     inx    h
  478.     mov    e,m
  479.     inx    h
  480.     xchg
  481.     shld    file$size   ;save it
  482.     shld    prt$size   ;save for printout
  483.     xchg
  484.     shld    opt$fil$ntp
  485.     lhld    file$size   ;jump   if file$size = 0
  486.     mov    a,h
  487.     ora    l
  488.     jz    tfxda
  489. tfxc:    lhld    mem$pt$buf   ;set dma address to mbuff
  490.     xchg
  491.     mvi    c,setdma
  492.     call    entry
  493.     lxi    d,tfcb    ;write next sector (5)
  494.     mvi    c,write
  495.     call    entry
  496.     ora    a    ;jump if ok
  497.     jz    tfxd
  498.     mess    msgc    ;error writting file
  499.     jmp    tfxg
  500. ;
  501. tfxd:    lhld    mem$pt$buf   ;mem$pt$buf = mem$pt$buf + 128
  502.     lxi    d,128
  503.     dad    d
  504.     shld    mem$pt$buf
  505.     lhld    file$size   ;file$size = file$size - 1
  506.     dcx    h
  507.     shld    file$size
  508.     mov    a,h    ;loop until zero
  509.     ora    l
  510.     jnz    tfxc
  511. tfxda:    lxi    h,tfcb    ;copy tfcb into output$fcb
  512.     lxi    d,output$fcb
  513.     mvi    b,33
  514.     call    move
  515.     lxi    d,disk$buf  ;reset dma pointer
  516.     mvi    c,setdma
  517.     call    entry
  518.     mvi    c,close ;try to close file (5)
  519.     lxi    d,tfcb
  520.     call    entry
  521.     cpi    255    ;jump if ok
  522.     jnz    tfxe
  523.     mess    msgd    ;unable to close
  524. tfxe:    lhld    prt$size   ;print number of sectors written
  525.     call    wdwc
  526.     mess    msge    ;print sectors written
  527.     jmp    tfxa
  528. ;
  529. tfxf:    lda    inp$buf$flg   ;loop if inp$buf$flg set
  530.     ora    a
  531.     jnz    tfxh
  532. tfxg:    mess    msgf    ;exit to cp/m
  533.     call    racc    ;read response
  534.     cpi    cr    ;loop if anything but cr
  535.     jnz    tfxg
  536.     jmp    boot    ;reboot cp/m
  537. ;
  538. tfxh:    call    crlf
  539.     mess    msgg
  540.     jmp    tfx1a
  541. ;
  542. ;    subroutines
  543. ;
  544. move:    mov    a,m
  545.     inx    h
  546.     stax    d
  547.     inx    d
  548.     dcr    b
  549.     jnz    move
  550.     ret
  551. ;+++++++++++++++++++++++++++++++++++
  552. ;+    get file name subroutine       +
  553. ;+++++++++++++++++++++++++++++++++++
  554. getn:    mov    a,m
  555.     ora    a
  556.     rz
  557.     cpi    ' '
  558.     jnz    getno
  559.     inx    h
  560.     jmp    getn
  561. ;
  562. getno:    lxi    d,temp$fcb
  563.     xra    a
  564.     stax    d
  565.     inx    d
  566.     push    d
  567.     mvi    b,11
  568.     mvi    a,' '
  569. getn6:    stax    d
  570.     inx    d
  571.     dcr    b
  572.     jnz    getn6
  573.     pop    d
  574.     mvi    b,9
  575. getn1:    mov    a,m
  576.     ora    a
  577.     jz    getn4
  578.     inx    h
  579.     cpi    ' '
  580.     jz    getn4
  581.     cpi    '.'
  582.     jz    getn2
  583.     cpi    '*'
  584.     jz    getn7
  585.     stax    d
  586.     inx    d
  587.     dcr    b
  588.     jz    getn5
  589.     jmp    getn1
  590. ;
  591. getn7:    dcr    b
  592.     jz    getn9
  593.     mvi    a,'?'
  594.     stax    d
  595.     inx    d
  596.     jmp    getn7
  597. ;
  598. getn9:    mov    a,m
  599.     cpi    '.'
  600.     jnz    getn4
  601.     inx    h
  602. getn2:    lxi    d,temp$fcb+ft
  603.     mvi    b,4
  604. getn3:    mov    a,m
  605.     ora    a
  606.     jz    getn4
  607.     inx    h
  608.     cpi    ' '
  609.     jz    getn4
  610.     cpi    '*'
  611.     jz    getn8
  612.     stax    d
  613.     inx    d
  614.     dcr    b
  615.     jz    getn5
  616.     jmp    getn3
  617. ;
  618. getn8:    dcr    b
  619.     jz    getn4
  620.     mvi    a,'?'
  621.     stax    d
  622.     inx    d
  623.     jmp    getn8
  624. ;
  625. getn4:    xra    a
  626.     ret
  627. ;
  628. getn5:    stc
  629.     ret
  630. ;
  631. ;+++++++++++++++++++++++++++++++++++
  632. ;+    create file names table       +
  633. ;+++++++++++++++++++++++++++++++++++
  634. ;
  635. cfnt:    lxi    h,file$nt   ;reset inp$fil$ntp
  636.     shld    inp$fil$ntp
  637. cfnt1:    lhld    cmd$pt$buf   ;get cmd$pt$buf
  638.     mov    a,m
  639.     ora    a
  640.     rz
  641.     call    getn     ;get next afn
  642.     shld    cmd$pt$buf   ;save command buffer ptr
  643.     jnc    cfnt2
  644.     mess    msg5    ;print syntax error in filename
  645.     jmp    cfnt1
  646. ;
  647. cfnt2:    xra    a    ;clear temp$fcb extent field
  648.     sta    temp$fcb+ex
  649.     lxi    d,temp$fcb  ;search for first occurance
  650.     mvi    c,sfirst
  651.     call    bdos
  652.     cpi    255    ;jump found
  653.     jnz    cfnt3
  654.     lxi    h,temp$fcb+fn  ;print filename
  655.     call    wasc
  656.     mess    msg7    ;print not found
  657.     jmp    boot    ;exit to cp/m
  658. ;
  659. cfnt3:    ani    3    ;index into cbuf
  660.     mov    l,a
  661.     mvi    h,0
  662.     dad    h    ;*2
  663.     dad    h    ;*4
  664.     dad    h    ;*8
  665.     dad    h    ;*16
  666.     dad    h    ;*32
  667.     lxi    d,disk$buf
  668.     dad    d
  669.     xchg        ;copy filename into file$nt
  670.     lhld    inp$fil$ntp
  671.     xchg
  672.     mvi    b,12
  673.     call    move
  674.     lxi    h,nulls ;buffer rest of entry
  675.     mvi    b,4
  676.     call    move
  677.     xchg
  678.     shld    inp$fil$ntp   ;save input file$nt pointer
  679.     mvi    m,0ffh    ;insure ff byte at end
  680.     lxi    d,temp$fcb  ;search for next occurance
  681.     mvi    c,snext
  682.     call    bdos
  683.     cpi    255    ;jump if found
  684.     jnz    cfnt3
  685.     jmp    cfnt1    ;go get next afn
  686. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  687. ;+   print ascii string to console - terminated by '0'     +
  688. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  689. ;
  690. wasc:    mov    a,m
  691.     ora    a
  692.     rz
  693.     call    pchar     ;print it
  694.     inx    h
  695.     jmp    wasc
  696. ;++++++++++++++++++++++++++++++++++++
  697. ;+   print end of line to console   +
  698. ;++++++++++++++++++++++++++++++++++++
  699. crlf:    mess    msgx
  700.     ret
  701. ;++++++++++++++++++++++++++++++++++++
  702. ;+   print decimal word to console  +
  703. ;++++++++++++++++++++++++++++++++++++
  704. wdwc:    push    h
  705.     push    d
  706.     push    b
  707.     mvi    b,0    ;clear b
  708.     lxi    d,10000 ;print 1st digit
  709.     call    wndd
  710.     lxi    d,1000    ;print 2nd digit
  711.     call    wndd
  712.     lxi    d,100    ;print 3rd digit
  713.     call    wndd
  714.     lxi    d,10    ;print 4th digit
  715.     call    wndd
  716.     lxi    d,1    ;print 5th digit
  717.     mvi    b,1    ;force last digit to print
  718.     call    wndd
  719.     pop    b
  720.     pop    d
  721.     pop    h
  722.     ret
  723. ;
  724. wndd:    mvi    c,0    ;c = 0
  725. wndd1:    mov    a,l    ;hl = hl - de
  726.     sub    e
  727.     mov    l,a
  728.     mov    a,h
  729.     sbb    d
  730.     mov    h,a
  731.     jc    wndd2    ;jump if < 0
  732.     inr    c    ;c = c + 1
  733.     jmp    wndd1    ;loop
  734. ;
  735. wndd2:    dad    d    ;hl = hl + de
  736.     mov    a,c    ;jump if c non-zero
  737.     ora    c
  738.     jnz    wndd4
  739.     mov    a,b    ;jump if digit written
  740.     ora    b
  741.     jnz    wndd4
  742.     mvi    a,' '    ;print one space
  743.     jmp    pchar
  744. ;
  745. wndd4:    mvi    b,1    ;set 'digit written' flag
  746.     mov    a,c    ;encode c into decimal ascii
  747.     adi    '0'
  748.     jmp    pchar     ;go print it
  749. ;
  750. phex:    push    psw
  751.     rrc
  752.     rrc
  753.     rrc
  754.     rrc        ;shift right 4
  755.     call    pnib    ;print nibble
  756.     pop    psw
  757.     call    pnib
  758.     ret
  759. ;
  760. pnib:    ani    0fh
  761.     cpi    10
  762.     jnc    p10
  763. ;less than or equal to 9
  764.     adi    '0'
  765.     jmp    prn
  766. ;greater or equal to 10
  767. p10:    adi    'A'-10
  768. prn:    call    pchar
  769.     ret
  770. ;++++++++++++++++++++++++++++++++++++++++++++
  771. ;+ pchar - print ascii character to console +
  772. ;++++++++++++++++++++++++++++++++++++++++++++
  773. pchar:    push    h    ;no - this isn't over kill !
  774.     push    d
  775.     push    b
  776.     push    psw
  777.     mvi    c,write$con
  778.     mov    e,a    ;character to e
  779.     call    bdos
  780.     pop    psw
  781.     pop    b
  782.     pop    d
  783.     pop    h
  784.     ret
  785. ;
  786. ; racc - read ascii character from console
  787. ;
  788. racc:    mvi    c,read$con
  789.     jmp    bdos
  790. ;
  791. entry:    db    0cdh    ;call instruction
  792. xbdos:    ds    2    ;address to xbdos
  793.     ret        ;return to caller
  794. ;
  795. ;
  796. msg0:    db    ' >>   CP/M to CP/M file transfer utility   <<'
  797.     db    cr,lf
  798.     db    ' Version 1.2  as of 12/18 by: Brent J. Crable'
  799.     db    cr,lf,cr,lf,'$'
  800. msg1:    db    '   resident bdos entry = $'
  801. msg1a:    db    'co-resident bdos entry = $'
  802. msg2:    db    'buffer size =$'
  803. msg3:    db    ' (128) byte sectors',cr,lf,'$'
  804. msg4:    db    'Mount source disk in <A>, type CR',cr,lf,'$'
  805. msg5:    db    'syntax error in file name',cr,lf,'$'
  806. msg6:    db    ' - $'
  807. msg7:    db    ' not found',cr,lf,'$'
  808. msg8:    db    'read error - $'
  809. msg9:    db    ' sectors read',cr,lf,'$'
  810. msga:    db    cr,lf,'Mount destination disk in <A>, type CR',cr,lf,'$'
  811. msga1:    db    '+++ Writing to destination disk +++',cr,lf,'$'
  812. msgb:    db    'unable to create',cr,lf,'$'
  813. msgc:    db    'error writing file',cr,lf,'$'
  814. msgd:    db    'unable to close',cr,lf,'$'
  815. msge:    db    ' sectors written',cr,lf,'$'
  816. msgf:    db    cr,lf,'insert host cp/m disk, type CR$'
  817. msgg:    db    '+++ Reading from source disk +++',cr,lf,'$'
  818. msgx:    db    cr,lf,'$'
  819. msgz:    db    '+++ no file name specified +++$'
  820. ;
  821. ;
  822. nulls:    db    0,0,0,0
  823. ;
  824.     org    ($+15)/16*16
  825. ;
  826. file$nt:      ds      16*64+1 ;file name table
  827. stack:          ds      64      ;64 level stack
  828. aval$space:   ds      2       ;available space
  829. mem$size:     ds      2       ;memory size
  830. cmd$buf:      ds      80      ;command buffer
  831. cmd$pt$buf:   ds      2       ;command buffer pointer
  832. file$size:    ds      2       ;file size in sectors
  833. prt$size:     ds      2       ;file size for printout
  834. inp$fil$ntp:  ds      2       ;input fnt pointer
  835. opt$fil$ntp:  ds      2       ;output fnt pointer
  836. mem$pt$buf:   ds      2       ;memory buffer pointer
  837. input$fcb:    ds      33      ;input file control block
  838. output$fcb:   ds      33      ;output file control block
  839. temp$fcb:     ds      33      ;temporary file control block
  840. inp$buf$flg:  ds      1       ;input break flag
  841. opt$buf$flg:  ds      1       ;output break flag
  842. xentry:       ds      2       ;co-resident jmp table entry
  843. ;
  844. mbuf:    equ    $
  845.     end    tfx
  846.  
  847.