home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / ZCPR33 / A-R / CONCAT03.LBR / CONCAT03.MZC / CONCAT03.MAC
Text File  |  2000-06-30  |  15KB  |  662 lines

  1. ; CONCAT.MAC -- Version 0.3  -- September 19, 1989
  2. ;
  3. ; Concatenates two or more source files into a destination file,
  4. ; similar to PIP.  For ZCPR3 only.
  5. ;
  6. ; USAGE:
  7. ;
  8. ;    CONCAT {dir:}outfile={dir:}infile{,{dir:}infile{, ...}} {/option}
  9. ;
  10. ; Any file without a DU or DIR specification is assumed to be on
  11. ; the current drive/user.  Default is text mode, checking for a
  12. ; CP/M end-of-file character (^Z).  The only option at present is
  13. ; 'O', which puts CONCAT is object mode so ^Z's are ignored.
  14. ;
  15. ; CONCAT requires an output file and at least one input file.  Actually,
  16. ; it can be used as a simple file-copy utility, but that's not its
  17. ; purpose.  The same filename may be given repeatedly in the input file
  18. ; list.  The equal sign separates the output file from the input
  19. ; files.  Commas separate multiple input files.  While the equal sign
  20. ; and commas are required, they may be separated from the filenames
  21. ; by one or more spaces.  A filename cannot begin with a slash unless
  22. ; it is preceded by a DU or DIR specification.
  23. ;
  24. ; If an error occurs, such as an input file not found, the incomplete
  25. ; output file is erased.  If another file has the same name as the
  26. ; output file, it will be renamed to filetype BAK.
  27. ;
  28. ; An invalid option will be ignored.
  29. ;
  30. ; To report bugs or make suggestions:
  31. ;                Gene Pizzetta
  32. ;                481 Revere Street
  33. ;                Revere, MA 02151
  34. ;
  35. ;                Newton Centre Z-Node:  (617) 965-7259
  36. ;                Lilliput Z-Node:  (312) 649-1730
  37. ;                Voice:  (617) 284-0891
  38. ;
  39. ; Re-assembly requires MAC or SLRMAC and SYSLIB, Version 4.  With MAC,
  40. ; Z80.LIB will also be needed.  
  41. ;
  42. Bdos    equ    05h
  43. MemTop    equ    Bdos+1
  44. CpmDma    equ    80h
  45. TPA    equ    100h
  46. ;
  47. ; Bdos functions . . .
  48. ;
  49. FRead    equ    20
  50. FWrite    equ    21
  51. CurDsk    equ    25
  52. SetDma    equ    26
  53. ;
  54. LF    equ    0Ah
  55. CR    equ    0Dh
  56. CpmEOF    equ    1Ah
  57. BufSiz    equ    1
  58. ;
  59.     MACLIB    Z80
  60. ;
  61. ; Following routines are from VLIB, Z3LIB, and SYSLIB, Version 4
  62. ;
  63.     ext    f$exist,f$open,f$mopen,f$rename,f$delete,f$close
  64.     ext    logud,pstr,pfn2,crlf,cout,pafdc,initfcb
  65.     ext    z3vinit,zfname,stndout,stndend
  66. ;
  67.     jmp    Start
  68. ;
  69.     db    'Z3ENV'
  70.     db    1
  71. Z3EAdr:    dw    0FE00h        ; address of environment descriptor
  72. ;
  73. ; Messages . . .
  74. ;
  75. MsgUse:    db    'CONCAT    Version 0.3',CR,LF
  76.     db    'Usage:',CR,LF
  77.     db    '   CONCAT {dir:}outfile={dir:}infile{,{dir:}infile{, ...}}'
  78.     db    ' {/option}',CR,LF
  79.     db    'Concatenates infiles to outfile.',CR,LF
  80.     db    'Option:',CR,LF
  81.     db    '   O   object files, ignore ^Z',0
  82. MsgWrt:    db    'Writing  ',0
  83. MsgRd:    db    '  Reading  ',0
  84. MsgNIG:    db    'No input file given.',0
  85. MsgNIF:    db    'Input file not found.',0
  86. MsgNOG:    db    'No output file given.',0
  87. MsgNOF:    db    'Output file not found.',0
  88. MsgNEr:    db    'Can''t erase existing file.',0
  89. MsgREr:    db    'Input read error.',0
  90. MsgWEr:    db    'Output write error.',0
  91. MsgCIF:    db    'Error closing input file.',0
  92. MsgCOF:    db    'Error closing output file.',0
  93. MsgAmb:    db    'Ambiguous filename not allowed.',0
  94. MsgDlm:    db    'Illegal command line.',0
  95. MsgDne:    db    'Done!',0
  96. ;
  97. Start:    sspd    OldStk        ; save old stack pointer
  98.     lhld    MemTop        ; get top of memory
  99.     mov    a,h        ; move high byte to A
  100.     sui    16        ; preserve 4K for CCP and safety
  101.     mov    h,a        ; ..and put it back
  102.     sphl
  103.     lhld    Z3EAdr        ; set up environment
  104.     call    z3vinit
  105. ;
  106.     call    GetDfD        ; get and store default disk
  107.     lda    CpmDma        ; see if there's a tail
  108.     ora    a
  109.     jrnz    GtTail        ; (yes)
  110.     lxi    h,MsgUse    ; no, tell them how to do it
  111.     call    pstr
  112.     jmp    Exit
  113. ;
  114. GtTail:    mov    c,a        ; move command tail to storage
  115.     inr    c
  116.     mvi    b,0
  117.     lxi    h,CpmDma+1
  118.     lxi    d,CTail
  119.     ldir
  120. ;
  121.     call    GetOpt        ; get options, if any
  122.     lxi    h,CTail        ; get output filename from tail
  123.     call    EatSpc        ; eat any spaces
  124.     cpi    0        ; is it NUL?
  125.     jrz    NoOFl        ; (no)
  126.     cpi    '/'        ; is it a slash?
  127.     jrnz    GtOFl        ; (no)
  128. NoOFl:    lxi    h,MsgNOG
  129.     call    pstr
  130.     jmp    Exit
  131. ;
  132. GtOFl:    lxi    d,OutFcb    ; ..and put it in FCB
  133.     call    zfname
  134.     jrz    CkDelm        ; (okay, so far)
  135.     lxi    h,MsgAmb    ; it's ambiguous
  136.     call    pstr
  137.     jmp    Exit
  138. ;
  139. CkDelm:    call    EatSpc
  140.     mov    a,m
  141.     cpi    '='        ; equal sign after filename?
  142.     jrz    GtOUsr        ; (yes)
  143.     lxi    h,MsgDlm
  144.     call    pstr
  145.     jmp    Exit
  146. ;
  147. GtOUsr:    inx    h        ; get past delimiter
  148.     shld    TailPt        ; save command tail pointer
  149.     lxi    h,FcbOFn
  150.     lxi    d,OutFil
  151.     lxi    b,11
  152.     ldir
  153.     lxi    h,TmpTyp
  154.     lxi    d,FcbOFt
  155.     lxi    b,3
  156.     ldir
  157.     lda    OutFcb        ; get drive (A=1)
  158.     ora    a        ; is there one?
  159.     jrnz    GtOUs1        ; (yes)
  160.     lda    DftDsk        ; no, get default
  161. GtOUs1:    dcr    a        ; make A=0
  162.     sta    OutDrv        ; ..and store it
  163.     lda    OutFcb+13    ; get user
  164.     sta    OutUsr        ; ..and store it
  165. ;
  166.     lhld    TailPt
  167.     call    EatSpc
  168.     cpi    0
  169.     jrz    NoIFl
  170.     cpi    '/'
  171.     jrnz    GtIFl
  172. NoIFl:    lxi    h,MsgNIG
  173.     call    pstr
  174.     jmp    Exit
  175. ;
  176. GtIFl:    call    SetIFl        ; set up input FCB
  177.     call    OpnInp        ; open input file
  178.     call    OpnOut        ; open output file
  179. ;
  180.     lxi    h,MsgWrt
  181.     call    pstr
  182.     lda    OutDrv
  183.     mov    b,a
  184.     lda    OutUsr
  185.     mov    c,a
  186.     lxi    d,OutFil
  187.     call    PrtFn
  188.     lxi    h,MsgRd
  189.     call    pstr
  190.     lda    InDrv
  191.     mov    b,a
  192.     lda    InUsr
  193.     mov    c,a
  194.     lxi    d,FcbIFn
  195.     call    PrtFn
  196. ;
  197.     call    RdLoop        ; read and write files
  198. ;
  199. CkMore:    call    ClsIFl        ; close input file
  200.     lhld    TailPt        ; any more input files?
  201.     call    EatSpc
  202.     cpi    ','
  203.     jrnz    NoMore        ; (no)
  204.     inx    h
  205.     call    EatSpc
  206.     cpi    0
  207.     jrz    NoMore
  208.     cpi    '/'
  209.     jrz    NoMore
  210.     call    SetIFl        ; set up input FCB
  211.     call    OpnInp        ; open input file
  212.     lxi    h,MsgRd
  213.     call    pstr
  214.     lda    InDrv
  215.     mov    b,a
  216.     lda    InUsr
  217.     mov    c,a
  218.     lxi    d,FcbIFn
  219.     call    PrtFn
  220.     call    RdLoop        ; read and write files
  221.     jr    CkMore
  222. ;
  223. Abort:    call    OutDU
  224.     lxi    d,OutFcb
  225.     call    f$exist        ; does an output file exist?
  226.     jrz    Abort1        ; (no)
  227.     call    OutDU
  228.     lxi    d,OutFcb
  229.     call    f$delete    ; yes, erase it
  230. Abort1:    jmp    Exit
  231. ;
  232. NoMore:    call    ClsOFl        ; close output file
  233.     lxi    h,OutTyp    ; move real filetype into FCB
  234.     lxi    d,FcbOFt
  235.     lxi    b,3
  236.     ldir
  237.     lxi    d,OutFcb
  238.     call    initfcb
  239.     call    OutDU
  240.     lxi    d,OutFcb
  241.     call    f$exist        ; see if XXX already exists
  242.     jrz    SkpBak        ; (it doesn't)
  243.     lxi    h,BakTyp
  244.     lxi    d,FcbOFt
  245.     lxi    b,3
  246.     ldir
  247.     call    OutDU
  248.     lxi    d,OutFcb    ; point to existing BAK name
  249.     call    f$delete    ; erase any existing file
  250.     jrz    DelSuc        ; (delete successful)
  251.     lxi    h,MsgNEr
  252.     call    pstr
  253.     jmp    Abort
  254. ;
  255. DelSuc:    lxi    h,FcbOFn
  256.     lxi    d,FcbOFn+12
  257.     lxi    b,11
  258.     ldir
  259.     lxi    h,OutFil
  260.     lxi    d,FcbOFn
  261.     lxi    b,11
  262.     ldir
  263.     call    OutDU
  264.     lxi    d,OutFcb    ; point to old XXX name
  265.     lxi    h,OutFcb+12    ; point to new BAK name
  266.     call    f$rename    ; ..and rename file
  267. SkpBak:    lxi    h,TmpTyp    ; rename temporary $$$ file
  268.     lxi    d,FcbOFt    ; ..to output filename
  269.     lxi    b,3
  270.     ldir
  271.     lxi    h,OutFil
  272.     lxi    d,FcbOFn+12
  273.     lxi    b,11
  274.     ldir
  275.     call    OutDU
  276.     lxi    h,OutFcb+12    ; point to new XXX name
  277.     lxi    d,OutFcb    ; point to old $$$ name
  278.     call    f$rename
  279. ;
  280. Finish:    lxi    h,MsgDne
  281.     call    pstr
  282. Exit:    lspd    OldStk        ; restore old stack pointer
  283.     ret
  284. ;
  285. ; Subroutines . . .
  286. ;
  287. ; SetIFl -- set up input file control block
  288. ;
  289. SetIFl:    lxi    d,InpFcb    ; point to input FCB
  290.     call    zfname        ; ..and parse filespec
  291.     jrz    GtIUsr        ; (still okay)
  292.     lxi    h,MsgAmb    ; it's ambiguous
  293.     call    pstr
  294.     jmp    Abort
  295. ;
  296. GtIUsr:    shld    TailPt        ; save command tail pointer
  297.     lda    InpFcb        ; get driv (A=1)
  298.     ora    a        ; is there one?
  299.     jrnz    GtIUs1        ; (yes)
  300.     lda    DftDsk        ; no, get default
  301. GtIUs1:    dcr    a        ; make A=0
  302.     sta    InDrv        ; ..and store it
  303.     lda    InpFcb+13    ; get user
  304.     sta    InUsr        ; ..and store it
  305.     ret
  306. ;
  307. ; OpnInp -- open input file
  308. ;
  309. OpnInp:    mvi    a,128        ; initialize pointer
  310.     sta    GetPtr
  311.     sub    a        ; initialize end-of-file flag
  312.     sta    GetFlg
  313.     lxi    d,InpFcb
  314.     call    initfcb
  315.     call    InDU        ; set drive/user for input
  316.     lxi    d,InpFcb        ; open input file
  317.     call    f$open
  318.     rz            ; (all okay)
  319.     lxi    h,MsgNIF    ; open error
  320.     call    pstr
  321.     jmp    Abort
  322. ;
  323. ; OpnOut -- open output file
  324. ;
  325. OpnOut:    sub    a        ; initialize pointer
  326.     sta    PutPtr
  327.     lxi    d,OutFcb
  328.     call    initfcb        ; initialize FCB
  329.     call    OutDU
  330.     lxi    d,OutFcb    ; open output file
  331.     call    f$exist        ; does it already exist?
  332.     jrz    OpnOu1        ; (no)
  333.     lxi    d,OutFcb
  334.     call    f$delete    ; yes, delete it
  335.     jrz    OpnOu1
  336.     lxi    h,MsgNEr    ; can't erase it
  337.     call    pstr
  338.     jmp    Exit
  339. OpnOu1:    lxi    d,OutFcb
  340.     call    f$mopen
  341.     rz            ; (okay)
  342.     lxi    h,MsgNOF    ; open error
  343.     call    pstr
  344.     jmp    Exit
  345. ;
  346. ; RdLoop -- reads and writes until end of file
  347. ;
  348. RdLoop:    call    FGetC        ; get a character
  349.     jc    RdErr        ; (read error)
  350.     rz            ; (end of file)
  351.     cpi    CpmEof        ; end of file?
  352.     cz    ChkEof        ; (yes, check mode)
  353.     rz            ; (yes)
  354.     call    FPutC        ; write character
  355.     jc    WrtErr        ; (write error)
  356.     jr    RdLoop
  357. ;
  358. RdErr:    lxi    h,MsgREr    ; we have an input read error
  359.     call    pstr
  360.     jmp    Abort
  361. ;
  362. WrtErr:    lxi    h,MsgWEr    ; we have an output write error
  363.     call    pstr
  364.     jmp    Abort
  365. ;
  366. ; ChkEof -- checks for Option O and, if so, ignores end-of-file character
  367. ;
  368. ChkEof:    mov    b,a        ; save character in B
  369.     lda    OpOFlg        ; get object flag
  370.     ora    a
  371.     mov    a,b        ; get character back in A
  372.     ret
  373. ;
  374. ; ClsIFl -- close input file
  375. ;
  376. ClsIFl:    call    InDU        ; close input file
  377.     lxi    d,InpFcb
  378.     call    f$close
  379.     rz            ; (okay)
  380.     lxi    h,MsgCIF
  381.     call    pstr        ; error
  382.     jmp    Abort
  383. ;
  384. ; ClsOFl -- closes output file
  385. ;
  386. ClsOFl:    call    OutDU
  387.     lda    OpOFlg        ; check option O flag
  388.     ora    a
  389.     jrnz    SkpEof        ; (object file transfer, skip EOF)
  390.     mvi    a,CpmEof    ; put end-of-file character
  391.     call    FPutC
  392.     lda    PutPtr        ; check pointer
  393.     ora    a
  394.     jz    ClsOut        ; we just wrote, so close
  395.     mov    b,a
  396.     mvi    a,128        ; fill rest of record with ^Z
  397.     sub    b
  398.     mov    b,a
  399. FillZ:    mvi    a,CpmEof
  400.     push    b
  401.     call    FPutC
  402.     pop    b
  403.     djnz    FillZ
  404.     jr    WrLast
  405. ;
  406. SkpEof:    lda    PutPtr        ; check pointer
  407.     ora    a
  408.     jz    ClsOut        ; just wrote, so close
  409. WrLast:    lxi    d,OWork        ; we've got to write the last record
  410.     mvi    c,SetDma
  411.     call    Bdos
  412.     lxi    d,OutFcb
  413.     mvi    c,FWrite
  414.     call    Bdos
  415.     ora    a        ; check for error
  416.     jnz    WrtErr        ; (yes, abort)
  417. ;
  418. ClsOut:    call    OutDU        ; close output file
  419.     lxi    d,OutFcb
  420.     call    f$close
  421.     rz            ; (okay)
  422.     lxi    h,MsgCOF
  423.     call    pstr        ; close error
  424.     jmp    Abort1
  425. ;
  426. ; GetDfD -- gets default disk (A=0) and stores it (A=1)
  427. ;
  428. GetDfD:    mvi    c,CurDsk    ; get default disk
  429.     call    Bdos
  430.     inr    a        ; make it fcb compatible
  431.     sta    DftDsk
  432.     ret
  433. ;
  434. ; PrtFn -- Prints drive/user and filename on console
  435. ;
  436. PrtFn:    call    stndout
  437.     mov    a,b        ; get drive
  438.     adi    'A'        ; make it printable
  439.     call    cout        ; ..and print it
  440.     mov    a,c        ; get user
  441.     call    pafdc        ; ..and print it
  442.     mvi    a,':'
  443.     call    cout
  444.     call    pfn2        ; print filename
  445.     call    stndend
  446.     call    crlf
  447.     ret
  448. ;
  449. ; EatSpc -- gobbles up spaces
  450. ;
  451. EatSpc:    mov    a,m
  452.     cpi    ' '        ; is it a space?
  453.     inx    h
  454.     jrz    EatSpc        ; (yes)
  455.     dcx    h
  456.     ret
  457. ;
  458. ; OutDU -- sets default drive and user for output file
  459. ;
  460. OutDU:    lda    OutUsr
  461.     mov    c,a
  462.     lda    OutDrv
  463.     mov    b,a
  464.     call    logud
  465.     ret
  466. ;
  467. ; InDU -- sets default drive and user for input file
  468. ;
  469. InDU:    lda    InUsr
  470.     mov    c,a
  471.     lda    InDrv
  472.     mov    b,a
  473.     call    logud
  474.     ret
  475. ;
  476. ; FGetC -- returns character from file.  Assumes file has been
  477. ; successfully opened.  Returns character or ^Z (end-of-file) in
  478. ; A.  Zero set (Z) on end of file.  Carry set (C) if error.
  479. ;
  480. FGetC:    lda    GetFlg        ; check end-of-file flag
  481.     ora    a
  482.     jrnz    GetEof        ; (yes)
  483.     lda    GetPtr        ; get pointer
  484.     cpi    128        ; done with buffer?
  485.     jrc    GetChr        ; (no, get a character)
  486.     lxi    d,IWork
  487.     mvi    c,SetDMA    ; set DMA address
  488.     call    Bdos
  489.     call    InDU        ; set DU
  490.     lxi    d,InpFcb
  491.     mvi    c,FRead        ; read more file
  492.     call    Bdos
  493.     cpi    1        ; return code?
  494.     jrz    GetEof        ; (end of file)
  495.     jrnc    GetErr        ; (a problem)
  496.     sta    GetPtr        ; put 0 in pointer
  497. ;
  498. GetChr:    lxi    h,IWork        ; point to DMA buffer
  499.     mov    e,a        ; put pointer in DE
  500.     mvi    d,0
  501.     dad    d        ; add it to HL
  502.     mov    a,m        ; get next character
  503.     lxi    h,GetPtr    ; increment pointer
  504.     inr    m
  505.     stc
  506.     cmc            ; clear carry
  507.     ret
  508. ;
  509. GetEof:    mvi    a,CpmEof
  510.     sta    GetFlg        ; set end-of-file flag
  511.     stc
  512.     cmc            ; clear carry
  513.     ret
  514. ;
  515. GetErr:    mvi    a,CpmEof
  516.     sta    GetFlg
  517.     stc            ; set carry
  518.     ret
  519. ;
  520. ; FPutC -- Writes character to file.  Assumes file has been successfully
  521. ; opened.  Expects character in A.  Returns carry set (C) on error.
  522. ;
  523. FPutC:    mov    c,a        ; save character in C
  524.     lda    PutPtr        ; get pointer
  525.     cpi    128        ; buffer full?
  526.     jrc    PutChr        ; (no, so do it)
  527.     push    b        ; the character is threatened from all sides
  528.     lxi    d,OWork
  529.     mvi    c,SetDma    ; setting output DMA
  530.     call    Bdos
  531.     call    OutDU        ; set drive and user
  532.     lxi    d,OutFcb    ; ..and write out buffer
  533.     mvi    c,FWrite
  534.     call    Bdos
  535.     pop    b        ; get back out character
  536.     cpi    0        ; return code?
  537.     jrnz    PutErr        ; (problem)
  538.     sta    PutPtr        ; reset pointer to 0
  539. ;
  540. PutChr:    lxi    h,OWork        ; point to DMA buffer
  541.     mov    e,a        ; move pointer to DE
  542.     mvi    d,0
  543.     dad    d        ; ..and add it to HL
  544.     mov    m,c        ; write character
  545.     lxi    h,PutPtr
  546.     inr    m        ; increment pointer
  547.     sub    a        ; clear carry
  548.     ret
  549. ;
  550. PutErr:    stc            ; set carry
  551.     ret
  552. ;
  553. ; GetOpt -- checks command tail for user supplied options and sets
  554. ; appropriate option flags.  Invalid options are ignored.
  555. ;
  556. GetOpt:    lxi    h,CTail        ; point to command tail
  557.     lda    CpmDma        ; anything there?
  558.     ora    a
  559.     rz            ; (no)
  560.     mov    b,a        ; yes, put number of chars in B
  561. ScnDLp:    mov    a,m        ; get character
  562.     cpi    '/'        ; delimiter?
  563.     jz    ScnOpt        ; (yes)
  564.     mov    d,a        ; save character
  565. ScnDL2:    inx    h        ; no, keep looking
  566.     djnz    ScnDLp
  567.     ret            ; (none found, return)
  568. ;
  569. ScnOpt:    push    psw        ; save current character
  570.     mov    a,d        ; get back previous character
  571.     pop    d        ; put current character in D
  572.     cpi    ' '        ; was previous char a space?
  573.     jnz    ScnDL2        ; (no)
  574.     jmp    ScnOp2
  575. ;
  576. ScnOLp:    call    ScnTbl
  577.     xchg            ; point back to options
  578. ScnOp2:    inx    h
  579.     djnz    ScnOLp        ; loop through options
  580.     ret
  581. ;
  582. ScnTbl:    mov    c,m        ; put option in C
  583.     lxi    d,OptTbl    ; point DE to option table
  584. ScnTLp:    ldax    d        ; get table option
  585.     ora    a        ; end of table?
  586.     jz    NoMat        ; (yes, no match)
  587.     inx    d        ; no, keep looking
  588.     cmp    c        ; match?
  589.     jz    TMatch        ; (yes)
  590.     inx    d        ; move pointer to next entry
  591.     inx    d
  592.     jmp    ScnTLp        ; ..and keep looking
  593. ;
  594. NoMat:    xchg
  595.     ret
  596. ;
  597. TMatch:    push    h        ; save option pointer
  598.     ldax    d        ; put address from table into HL
  599.     mov    l,a
  600.     inx    d
  601.     ldax    d
  602.     mov    h,a
  603.     pop    d        ; recover option pointer in DE
  604.     mvi    a,1        ; set option flag by jumping to
  605.     pchl            ; ..table routine and returning
  606. ;
  607. ; OptTbl -- Option Jump Table
  608. ;
  609. OptTbl:    db    '/'        ; / = usage message
  610.     dw    OptH
  611.     db    'O'        ; O = object file transfer
  612.     dw    OptO
  613.     db    0        ; end of option jump table
  614. ;
  615. ; Option setting routines
  616. ;
  617. OptH:    lxi    h,MsgUse
  618.     call    pstr
  619.     jmp    Exit
  620. OptO:    sta    OpOFlg
  621.     ret
  622. ;
  623. ; Data storage . . .
  624. ;
  625. OpOFlg:    db    0
  626. ;
  627. OutFil:    db    '        '    ; save original output filename here
  628. OutTyp:    db    '   '
  629. BakTyp:    db    'BAK'        ; for BAK file
  630. TmpTyp:    db    '$$$'        ; for temporary filename
  631. ;
  632. GetFlg:    db    0        ; FGetC end-of-file flag
  633. GetPtr:    db    0        ; FGetC pointer
  634. InpFcb:    db    0        ; input file fcb
  635. FcbIFn:    db    '        '
  636. FcbIFt:    db    '   '
  637.     ds    24
  638. ;
  639. PutPtr:    db    0        ; FPutC pointer
  640. OutFcb:    db    0        ; output file fcb
  641. FcbOFn:    db    '        '
  642. FcbOFt:    db    '   '
  643.     ds    24
  644. ;
  645.     DSEG
  646. ;
  647. ; Uninitialized storage . . .
  648. ;
  649. DftDsk:    ds    1        ; default drive
  650. InDrv:    ds    1        ; input file drive
  651. InUsr:    ds    1        ; input file user
  652. OutDrv:    ds    1        ; output file drive
  653. OutUsr:    ds    1        ; output file user
  654. OldStk:    ds    2        ; old stack pointer
  655. TailPt:    ds    2        ; command tail index pointer
  656. CTail:    ds    128        ; command tail storage
  657. ;
  658. IWork:    ds    128*BufSiz    ; input buffer
  659. OWork:    ds    128*BufSiz    ; output buffer
  660. ;
  661.     end
  662.