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 / BEEHIVE / ZSUS / ZSUS001.LBR / FOR12.LBR / FOR12.ZZ0 / FOR12.Z80
Text File  |  1989-03-18  |  16KB  |  729 lines

  1. ; FOR.Z80
  2. ;
  3. ; Takes a list of (ambiguous) file specifications as parameters and stores
  4. ; them in a file (FORFILES.SYS), optionally expanding the ambiguous names.
  5. ; Explicit directory specifications are retained in front of the names.
  6. ; The output file FORFILES.SYS is set to System status.  This is an ordinary
  7. ; text file, with one filename (or other list element) on each line.
  8. ;
  9. ; Alternatively, arbitrary strings, all named directories, an ascending
  10. ; sequence of integers, or all current shell variable names may be written
  11. ; to the file.
  12. ;
  13. ; Syntax:
  14. ;
  15. ;    FOR <[du:|dir:]fn.ft> [<[du:|dir:]fn.ft>] [/X]
  16. ;
  17. ;    where the 'X' option indicates that all ambiguous filenames are to be
  18. ;        expanded.  If an ambiguous filename is prefaced with a DU: or DIR:
  19. ;        specification, its expansions will all also contain the directory
  20. ;        specification.
  21. ;
  22. ; -or-
  23. ;
  24. ;    FOR 'one string' "another string" \a third string\ /S
  25. ;
  26. ;    where the 'S' option is REQUIRED to indicate that the list elements
  27. ;        are delimited strings.  Any non-blank character except the virgule
  28. ;        (/) and comma may be used as a delimiter.
  29. ;
  30. ; -or-
  31. ;
  32. ;    FOR /o
  33. ;
  34. ;    where 'o' can be:
  35. ;        D  --  list all named directories
  36. ;        Rn --  list all integers up to that contained in register 'n',
  37. ;           one per line.  The list is zero-based
  38. ;        Nn --  list all integers up to 'n', one per line (zero-based).
  39. ;        V  --  list all currently defined shell variable names.
  40. ;
  41. ;    If the 'Nn' or 'Rn' forms are used and a 1-based list is needed,
  42. ;    the first element can be removed with 'NEXT' and not used.  Any
  43. ;    parameters preceding one of these option specifications will be
  44. ;    ignored.
  45. ;
  46. ; In all circumstances, only one option is appropriate.  As presently written,
  47. ; program control is transferred directly based upon the option, rather than
  48. ; using an array of option flags.
  49. ;
  50. ; Delimiters BETWEEN list elements (whether filenames or strings) may be
  51. ; either spaces or commas.
  52. ;
  53. ;
  54. ; Author: Dreas Nielsen
  55. ; History --
  56. ;    Date        Version        Comments
  57. ;    ----        -------        --------
  58. ;    7/15/86        0.1        First code
  59. ;    1/10/87        0.2        Fixed ambiguous filenames
  60. ;    1/11/87        1.0        First complete version
  61. ;    2/19/89        1.1        Added shell variable name expansion.
  62. ;    3/19/89        1.2        Removed unreferenced externals,
  63. ;                    labels, etc., made code compatible
  64. ;                    with non-ZAS assemblers, removed/
  65. ;                    corrected anamolous code, established
  66. ;                    DSEG to simplify buffer allocation,
  67. ;                    generally tuned up and tightened code,
  68. ;                    linked to a new standalone VARLOAD.REL
  69. ;                    and the new Z3LIB/SYSLIB, resulting in
  70. ;                    a 30-record COMfile vs. 51 records for
  71. ;                    v1.1.
  72. ;                                Bruce Morgen
  73. ;
  74. ;
  75. ;================[  Equates and External Routines  ]================
  76. ;
  77. VERS    EQU    12
  78. ;
  79. FALSE    EQU    0
  80. TRUE    EQU    NOT FALSE
  81. ;
  82. DEBUG    EQU    FALSE
  83. ;
  84. CR    EQU    0DH
  85. LF    EQU    0AH
  86. BELL    EQU    7
  87. TAB    EQU    9
  88. SPACE    EQU    20H
  89. CTRLZ    EQU    1AH
  90. EOF    EQU    1AH
  91. BDOS    EQU    5
  92. INFERR    EQU    1    ;error code for "can't open input file"
  93. OFERR    EQU    2    ;error code for "can't open output file"
  94. RDERR    EQU    3    ;error code for "can't read input file"
  95. WRTERR    EQU    4    ;error code for "can't write output file"
  96. CLZERR    EQU    5    ;error code for "can't close output file"
  97. PARMFL    EQU    '/'
  98. XPARM    EQU    'X'
  99. LINLEN    EQU    300    ;max # of chars in output line
  100. CMDLIN    EQU    080H
  101. SYSFCB    EQU    05CH
  102. BUFSIZ    EQU    8    ;8 128-byte sectors (1k) for I/O buffers
  103. FCBLEN    EQU    36
  104. BSZOFF    EQU    0    ;offset of buffer size indicator from I/O ctl block
  105. BADOFF    EQU    6    ;offset of buffer addr indic. from I/O ctl block start
  106. FCBOFF    EQU    8    ;offset of fcb from I/O ctl block start
  107. ;
  108.     PUBLIC    $MEMRY
  109.     EXT    Z3INIT,GETQUIET,SKSP,EPRINT,PUTUD,GETUD,LOGUD
  110.     EXT    PUTER2,FXO$OPEN,FX$PUT,FXO$CLOSE
  111.     EXT    DIRQ,MFN2,FILLB
  112.     EXT    DNSCAN,FNAME,GETNDR,GETREG,EVAL10,MHLFDC
  113.     EXT    VARLOAD,Z3VARS
  114. ;
  115. ;================[  Beginning of Program  ]================
  116. ;
  117.     DB    'Z3ENV'
  118.     DB    1
  119. Z3ENV:    DW    00
  120.     DB    VERS
  121. ;
  122. START:    LD    HL,(Z3ENV)
  123. ;
  124. ; Save stack and set a new one
  125.     LD    (SAVESP),SP
  126.     LD    SP,STK
  127. ;
  128.     CALL    Z3INIT
  129. ;
  130. ; Reset error flag
  131.     XOR    A
  132.     CALL    PUTER2
  133.     CALL    GETQUIET
  134.     JR    NZ,QBEGIN
  135. ; Print signon message
  136.     CALL    EPRINT
  137.     DB    'FOR  v. ',[VERS / 10] + '0','.',[VERS MOD 10] + '0',CR,LF,0
  138. ;
  139. ; Save currently logged DU
  140. QBEGIN:    CALL    PUTUD
  141. ;
  142. ; Check for no parameters (help)
  143.     LD    A,(SYSFCB+1)
  144.     CP    ' '
  145.     JP    Z,HELP
  146. ;
  147. ; Store null at end of cmdline (it's already there, isn't it?....)
  148.     LD    HL,CMDLIN
  149.     LD    C,(HL)
  150.     INC    C
  151.     LD    B,0
  152.     PUSH    HL
  153.     ADD    HL,BC
  154.     LD    (HL),B
  155.     POP    HL
  156.     INC    HL
  157. ;
  158. ; Move command line
  159.     LD    DE,PARAMS
  160.     LDIR
  161. ;
  162. ; Allocate output buffer and initialize it
  163.     LD    HL,($MEMRY)
  164.     LD    B,BUFSIZ
  165.     PUSH    HL
  166.     CALL    FBINIT        ;allocate I/O ctl buffer for output
  167.     LD    (FREE),HL
  168.     POP    HL
  169.     LD    DE,OFNAM
  170.     CALL    INITNAM
  171. ;
  172. ; Examine command line for option specification.  If no options are specified,
  173. ; the list is presumed to be of filenames which are not to be expanded or
  174. ; undelimited strings (without embedded spaces or commas).  This routine finds
  175. ; the LAST parameter flag on the line, as there may be some embedded in
  176. ; delimited strings.
  177. GETOPT:
  178.     LD    HL,00        ;zero out parameter address
  179.     LD    (PFADR),HL
  180.     LD    HL,PARAMS
  181. GETO2:    LD    A,(HL)
  182.     INC    HL
  183.     OR    A        ;end of list?
  184.     JR    Z,GETO3
  185.     CP    PARMFL
  186.     JR    NZ,GETO2
  187.     LD    (PFADR),HL
  188.     JR    GETO2
  189. ;
  190. GETO3:    LD    HL,(PFADR)
  191.     LD    A,H
  192.     OR    L        ;if this is null...
  193.     JR    Z,RAWFILES    ;...no parameter flag was found
  194. ;
  195. ; Examine char after '/' and proceed accordingly
  196.     CALL    SKSP
  197.     LD    A,(HL)
  198.     CP    'X'
  199.     JR    Z,AMBFILS    ;ambiguous filenames
  200.     CP    'S'
  201.     JP    Z,STRINGS    ;delimited strings
  202.     CP    'D'
  203.     JP    Z,DIRNAMES    ;directory names
  204.     CP    'R'
  205.     JP    Z,REGS        ;register value
  206.     CP    'N'
  207.     JP    Z,NUM        ;integer value
  208.     CP    'V'
  209.     JP    Z,VARS        ; shell variable names
  210.     JP    HELP        ;because it is an unrecognized option
  211. ;
  212. ; Parameter list is unambigous filenames or undelimited strings.
  213. RAWFILES:
  214.     CALL    OPENOUT
  215.     LD    HL,PARAMS
  216. RAW1:    LD    A,(HL)        ;skip to first non-delimiter
  217.     INC    HL
  218.     CALL    LISTDEL
  219.     JR    Z,RAW1
  220.     OR    A
  221.     JR    Z,RAW6
  222.     DEC    HL        ;point back 1 to fetch 1st char again
  223. ;
  224. RAW2:    LD    DE,NMDEST    ;transfer token
  225. RAW3:    LD    A,(HL)
  226.     INC    HL
  227.     OR    A        ;end of list?
  228.     JR    Z,RAW4
  229.     CALL    LISTDEL        ;space or comma?
  230.     JR    Z,RAW4
  231.     LD    (DE),A
  232.     INC    DE
  233.     JR    RAW3        ;get next char of current token
  234. ;
  235. RAW4:                ;write current token and look for next
  236.     CALL    WRTTOK
  237.     JR    NZ,RAW2        ;next token found -- get and write it
  238. ;
  239. RAW6:                ;end of list found
  240.     CALL    CLOSOUT
  241.     JP    DONE
  242. ;
  243. ;----------------
  244. ; Parameter list is a list of ambiguous filenames.
  245. AMBFILS:
  246.     CALL    OPENOUT
  247.     LD    HL,PARAMS    ;save prefix (DU: or DIR:) if it exists
  248. AMB0:    LD    A,(HL)        ;skip to first non-delimiter
  249.     INC    HL
  250.     CALL    LISTDEL        ;is (A) a list delimiter?
  251.     JR    Z,AMB0        ;if so, get next character
  252.     OR    A
  253.     JP    Z,AMB3        ;if end of list, quit
  254.     DEC    HL        ;point back 1 to 1st char of token
  255.     PUSH    HL        ;save starting point
  256.     CALL    NXTDLM        ;see if next delimiter is a colon
  257.     POP    HL        ;get starting addr. back
  258.     LD    DE,DIRNAM    ;destination buffer; HL points to source
  259.     CP    ':'
  260.     JR    NZ,NOMOV
  261. ;                ;move DU:/DIR: spec into buffer
  262. MOVDU:    LD    A,(HL)
  263.     LD    (DE),A
  264.     INC    HL
  265.     INC    DE
  266.     CP    ':'
  267.     JR    NZ,MOVDU
  268. ;
  269. NOMOV:    XOR    A        ;null-terminate DU:/DIR: spec buffer
  270.     LD    (DE),A
  271. ;
  272. ; Parse the filename pointed to by HL into FCB format
  273.     PUSH    HL        ;save ptr to filename
  274.     LD    HL,DIRNAM
  275.     LD    A,(HL)
  276.     OR    A
  277.     JR    Z,P2        ;don't scan if no DU/DIR
  278.     XOR    A        ;DU before DIR
  279.     CALL    DNSCAN
  280.     JR    Z,P2        ;if invalid, stay here
  281.     CALL    LOGUD
  282. P2:    POP    HL        ;get filename
  283.     LD    DE,SYSFCB
  284.     CALL    FNAME        ;parse filename into FCB
  285.     JR    Z,AMB2
  286.     LD    (CLPTR),HL    ;save pointer to tokens
  287.     LD    HL,(FREE)    ;buffer area for directory load
  288.     LD    A,10100000B    ;non-system files sorted by name
  289.     CALL    DIRQ        ;load directory
  290.     CALL    GETUD        ;return home to write file
  291. ;
  292.     INC    HL        ;point to first name
  293.     EX    DE,HL        ;...with DE
  294. WRNAMS:    LD    A,B        ;for all filenames in buffer...
  295.     OR    C
  296.     JR    Z,WRNAM3
  297.     PUSH    DE        ;(save ptr to name)
  298.     LD    DE,DIRNAM    ;...move directory name to write buffer
  299.     LD    HL,NMDEST
  300. WRNAM1:    LD    A,(DE)
  301.     INC    DE
  302.     OR    A
  303.     JR    Z,WRNAM2
  304.     LD    (HL),A
  305.     INC    HL
  306.     JR    WRNAM1
  307. WRNAM2:    POP    DE        ;HL = mem buffer, DE = name
  308. ;
  309.     PUSH    BC        ;write 13 nulls, so name will be null-term.
  310.     LD    B,13
  311.     XOR    A
  312.     CALL    FILLB
  313.     POP    BC
  314. ;
  315.     CALL    MFN2        ;convert fname to packed string in wrt buffer
  316.     PUSH    DE
  317. ;
  318.     CALL    WRTSTR        ;write name to file
  319.     POP    DE
  320.     LD    HL,16        ;set DE to point to next name
  321.     ADD    HL,DE
  322.     EX    DE,HL
  323.     DEC    BC        ;count down number of names written
  324.     JR    WRNAMS
  325. ;
  326. WRNAM3:                ;done with this token, look for next
  327.     LD    HL,(CLPTR)
  328. AMB2:    LD    A,(HL)
  329.     INC    HL
  330.     OR    A
  331.     JR    Z,AMB3
  332.     CP    PARMFL
  333.     JR    Z,AMB3
  334.     CALL    LISTDEL
  335.     JR    Z,AMB2
  336.     DEC    HL        ;if another token found, point to 1st char
  337.     JP    AMB0        ;go back and process it
  338. ;
  339. AMB3:    CALL    CLOSOUT
  340.     JP    DONE
  341. ;
  342. ;
  343. ;----------------
  344. ; Chop parameter list into delimited strings.
  345. ;
  346. STRINGS:
  347.     CALL    OPENOUT
  348.     LD    HL,PARAMS
  349. STR1:    LD    A,(HL)        ;skip to first non-comma, non-space
  350.     INC    HL
  351.     CALL    LISTDEL
  352.     JR    Z,STR1
  353.     OR    A
  354.     JR    Z,STR5
  355.     DEC    HL
  356. ;
  357. STR2:    LD    A,(HL)
  358.     LD    B,A        ;save delimiter for comparison
  359.     INC    HL
  360.     LD    DE,NMDEST
  361. STR3:    LD    A,(HL)
  362.     INC    HL
  363.     OR    A
  364.     JR    Z,STR4
  365.     CP    B        ;the current string delimiter is used here
  366.     JR    Z,STR4
  367.     LD    (DE),A
  368.     INC    DE
  369.     JR    STR3
  370. ;
  371. STR4:
  372.     OR    A        ;if not null, bump HL by 1 more to account...
  373.     JR    Z,STR5        ;...for DEC HL in WRTTOK
  374.     INC    HL
  375. STR5:    CALL    WRTTOK
  376.     JR    NZ,STR2
  377. ;
  378. STR6:
  379.     CALL    CLOSOUT
  380.     JP    DONE
  381. ;
  382. ;
  383. ;  List all directory names.
  384. ;
  385. DIRNAMES:
  386.     CALL    GETNDR
  387.     JP    Z,DONE
  388.     LD    A,(HL)
  389.     OR    A
  390.     JP    Z,DONE
  391. ; There is a buffer and there is at least one entry in it
  392.     CALL    OPENOUT
  393. DIRN1:    LD    A,(HL)
  394.     OR    A
  395.     JR    Z,DIRNZ        ; end of list reached
  396.     INC    HL
  397.     INC    HL        ; now pointing to name
  398.     PUSH    HL        ; save this pointer
  399.     LD    DE,NMDEST    ; transfer name to output buffer
  400.     LD    B,8
  401. DIRN2:    LD    A,(HL)
  402.     CP    ' '
  403.     JR    Z,DIRN3
  404.     LD    (DE),A
  405.     INC    HL
  406.     INC    DE
  407.     DJNZ    DIRN2
  408. ;
  409. DIRN3:    LD    A,':'
  410.     LD    (DE),A
  411.     INC    DE
  412.     XOR    A
  413.     LD    (DE),A
  414.     CALL    WRTSTR
  415. ;
  416.     POP    HL        ; advance to next directory name
  417.     LD    DE,16
  418.     ADD    HL,DE
  419.     JR    DIRN1
  420. ;
  421. DIRNZ:    CALL    CLOSOUT        ; all done with directory names
  422.     JP    DONE
  423. ;
  424. ;
  425. ; Write all numbers up to the value contained in the register specified by
  426. ; the character at (HL+1).  The list will be zero-based and will run up to
  427. ; the register value - 1.
  428. ;
  429. REGS:
  430.     INC    HL
  431.     LD    A,(HL)
  432.     OR    A
  433.     JR    Z,REGERR    ; premature eol
  434.     SUB    '0'
  435.     JR    C,REGERR    ; illegal value
  436.     JR    Z,REGERR
  437.     CP    10
  438.     JR    NC,REGERR
  439. ; A register value is specified and it is legal
  440.     LD    B,A
  441.     CALL    GETREG
  442.     LD    E,A
  443.     LD    D,0
  444.     JR    WRTNUMS
  445. ;
  446. REGERR:
  447.     CALL    EPRINT
  448.     DB    'Improper register value.',CR,LF,0
  449.     XOR    A
  450.     DEC    A
  451.     CALL    PUTER2
  452.     JP    DONE
  453. ;
  454. ;
  455. ; Write a zero-based list of numbers, up to (but not including) the value
  456. ; indicated by the string at (HL+1).
  457. ;
  458. NUM:
  459.     INC    HL
  460.     LD    A,(HL)
  461.     OR    A
  462.     JR    Z,NUMERR
  463.     CALL    EVAL10
  464.     JR    WRTNUMS
  465. ;
  466. NUMERR:    CALL    EPRINT
  467.     DB    'Unspecified numeric argument.',CR,LF,0
  468.     XOR    A
  469.     DEC    A
  470.     CALL    PUTER2
  471.     JP    DONE
  472. ;
  473. ;  Write out numbers up to the value in DE if DE > 0
  474. WRTNUMS:
  475.     LD    A,E
  476.     OR    D
  477.     JP    Z,DONE        ; don't write anything if arg is 0
  478.     PUSH    DE
  479.     CALL    OPENOUT
  480.     POP    DE
  481.     LD    HL,00        ; HL counts up to limit in DE
  482. WRTNUM1:
  483.     PUSH    DE        ; save limit
  484.     LD    DE,NMDEST    ; format & write number
  485.     CALL    MHLFDC
  486.     XOR    A
  487.     LD    (DE),A
  488.     PUSH    HL
  489.     CALL    WRTSTR
  490.     POP    HL
  491.     POP    DE        ; get limit back
  492.     INC    HL        ; compute next number to write
  493.     PUSH    HL        ; save it while comparing to limit
  494.     OR    A        ; clear carry flag
  495.     SBC    HL,DE        ; at limit yet?
  496.     POP    HL        ; get current value back
  497.                 ; if at limit, go quit to WRTNUMZ
  498.     JR    NZ,WRTNUM1    ; else go back and write the next number
  499. ;
  500. WRTNUMZ:
  501.     CALL    CLOSOUT
  502.     JP    DONE
  503. ;
  504. ;
  505. ; Write a list of all currently defined shell variable names.
  506. VARS:
  507.     LD    HL,(FREE)
  508.     CALL    VARLOAD
  509.     JP    NZ,DONE
  510.     LD    (FREE),HL
  511.     LD    HL,(Z3VARS)    ; origin of list--same as (FREE) passed.
  512.     LD    A,(HL)
  513.     CP    1AH        ; eof?
  514.     JP    Z,DONE
  515.     CALL    OPENOUT
  516. ;
  517. ; Transfer each variable name to the name buffer, null terminate, and
  518. ; write out.
  519.     LD    HL,(Z3VARS)
  520. ;
  521. ; While not eof (^Z at HL)
  522. VARS1:    LD    A,(HL)
  523.     CP    1AH
  524.     JR    Z,VARS5
  525. ; Transfer up to 8 characters to destination buffer.
  526.     LD    DE,NMDEST
  527.     LD    B,8
  528. VARS2:    LD    A,(HL)
  529.     CP    ' '
  530.     JR    Z,VARS3        ; Exit loop if end of name found
  531.     LD    (DE),A
  532.     INC    HL
  533.     INC    DE
  534.     DJNZ    VARS2
  535. VARS3:                ; Terminate name
  536.     XOR    A
  537.     LD    (DE),A
  538. ; Write out name.
  539.     PUSH    HL
  540.     CALL    WRTSTR
  541.     POP    HL
  542. ; Scan to end of this definition, skip to next name.
  543.     XOR    A
  544.     LD    BC,0FFFFH
  545.     CPIR
  546. ; End while
  547.     JR    VARS1
  548. ;
  549. VARS5:
  550.     CALL    CLOSOUT
  551.     JP    DONE
  552. ;
  553. ;
  554. ;
  555. ; Print help message and fall through to exit.
  556. HELP:
  557.     CALL    EPRINT
  558.     DB    'Syntax is:',CR,LF
  559.     DB    '   FOR <[du:|dir:]fn.ft> [<[du:|dir:]fn.ft>] [/x]',CR,LF
  560.     DB    'or',CR,LF
  561.     DB    '   FOR ''one string'' "another string" \a third string\ /s',CR,LF
  562.     DB    'or',CR,LF
  563.     DB    '   FOR /o',CR,LF
  564.     DB    'Options:',CR,LF
  565.     DB    '   x -- Expand ambiguous filenames',CR,LF
  566.     DB    '   s -- List elements are delimited strings',CR,LF
  567.     DB    '   o -- May be:',CR,LF
  568.     DB    TAB,'    D  --  list all named directories',CR,LF
  569.     DB    TAB,'    Rn --  list all integers up to that contained in register ''n'',',CR,LF
  570.     DB    TAB,'           one per line.  The list is zero-based.',CR,LF
  571.     DB    TAB,'    Nn --  list all integers up to ''n'', one per line (zero-based).',CR,LF
  572.     DB    TAB,'    V  --  list all current shell variable names.',CR,LF
  573.     DB    0
  574. ;
  575. ;
  576. ; Clean up and exit program.
  577. DONE:
  578.     CALL    GETUD
  579.     LD    SP,(SAVESP)
  580.     RET
  581. ;
  582. ;
  583. ;================[  Subroutines  ]================
  584. ;
  585. ; Initialize file I/O control buffers.
  586. ; Enter with  HL = first free address in memory
  587. ;             B  = number of 128-byte sectors for the file buffer
  588. ; Return:     HL = first free address after buffer
  589. ;
  590. FBINIT:
  591.     PUSH    DE
  592.     PUSH    BC
  593.     LD    (HL),B
  594.     LD    DE,BADOFF    ;loc of buf addr in I/O ctl block
  595.     ADD    HL,DE
  596.     PUSH    HL
  597.     LD    DE,FCBLEN+FCBOFF-BADOFF
  598.     ADD    HL,DE
  599.     EX    DE,HL
  600.     POP    HL
  601.     LD    (HL),E
  602.     INC    HL
  603.     LD    (HL),D
  604.     EX    DE,HL        ;get buf start addr in HL
  605.     LD    DE,128        ;incr HL by buf len in bytes
  606. FBINI1:    ADD    HL,DE
  607.     DJNZ    FBINI1
  608.     POP    BC
  609.     POP    DE
  610.     RET
  611. ;
  612. ;----------------
  613. ; Move filename into fcb of I/O ctl block.  Enter with HL = I/O ctl blk addr,
  614. ; DE = addr of string to move.  Drive is set to current.
  615. INITNAM:
  616.     PUSH    BC
  617.     PUSH    DE        ;save while adding fcb offset
  618.     LD    DE,FCBOFF
  619.     ADD    HL,DE        ;point to input fcb
  620.     XOR    A        ;set current drive
  621.     LD    (HL),A
  622.     INC    HL        ;point to name field of fcb
  623.     POP    DE        ;get source addr
  624.     EX    DE,HL        ;put dest addr in DE, source in HL
  625.     LD    BC,11
  626.     LDIR
  627.     POP    BC        ;restore original contents
  628.     RET
  629. ;
  630. ;----------------
  631. ; Open output file
  632. OPENOUT:
  633.     LD    DE,($MEMRY)
  634.     JP    FXO$OPEN
  635. ;
  636. ;----------------
  637. ; Close output file
  638. CLOSOUT:
  639.     LD    DE,($MEMRY)
  640.     JP    FXO$CLOSE
  641. ;
  642. ;----------------
  643. ; Find next delimiter in string pointed to by HL.  Return with delim. in A,
  644. ; HL pointing past char.  Delimiters are:
  645. ;    <NULL>  <SPACE>  /  ,  :
  646. NXTDLM:    LD    A,(HL)
  647.     INC    HL
  648.     CP    ':'
  649.     RET    Z
  650.     CP    ','
  651.     RET    Z
  652.     CP    ' '
  653.     RET    Z
  654.     OR    A
  655.     RET    Z
  656.     CP    '/'
  657.     RET    Z
  658.     JR    NXTDLM
  659. ;
  660. ;----------------
  661. ; Is (A) a list-element delimiter (a comma or space?).   Return Z if true.
  662. LISTDEL:
  663.     CP    SPACE
  664.     RET    Z
  665.     CP    ','
  666.     RET
  667. ;
  668. ;----------------
  669. ; Write the string at NMDEST to the output file.  String will be
  670. ; terminated with a CR/LF.
  671. WRTSTR:
  672.     LD    DE,($MEMRY)
  673.     LD    HL,NMDEST
  674. WRT2:    LD    A,(HL)
  675.     INC    HL
  676.     OR    A
  677.     JR    Z,WRT3
  678.     CALL    FX$PUT
  679.     JR    WRT2
  680. WRT3:    LD    A,CR
  681.     CALL    FX$PUT
  682.     LD    A,LF
  683.     JP    FX$PUT
  684. ;
  685. ;----------------
  686. ; Null-terminate the current token and write it out, then search for the next.
  687. ; Return Z if the end of the input has been reached, NZ otherwise.  On return,
  688. ; HL points to the next non-blank, non-comma character.
  689. WRTTOK:
  690.     XOR    A        ;store null at end of token
  691.     LD    (DE),A
  692.     PUSH    HL
  693.     CALL    WRTSTR
  694.     POP    HL
  695.     DEC    HL        ;point to delim again in case it's a null
  696. WRTT:    LD    A,(HL)        ;skip over multiple delimiters
  697.     INC    HL
  698.     OR    A        ;No blank lines can be generated by multiple
  699.     RET    Z        ;delimiters.
  700.     CP    PARMFL
  701.     RET    Z
  702.     CALL    LISTDEL
  703.     JR    Z,WRTT
  704.     DEC    HL        ;we'll fetch the non-delimiter again
  705.     RET
  706. ;
  707. $MEMRY:    DS    2
  708. ;
  709. OFNAM:    DB    'FORFILESS','Y'+80H,'S'
  710. ;
  711. ;================[  Storage  ]================
  712. ;
  713.     DSEG
  714.  
  715. SAVESP:    DS    2
  716. PARAMS:            ;Buffer for list of files (command line)
  717.     DS    127
  718. DIRNAM:    DS    24    ;Buffer for directory name
  719. NMDEST:    DS    LINLEN    ;Buffer for destn for packed name string
  720. PFADR:    DS    2    ;address following last parameter flag in command line
  721. CLPTR:    DS    2    ;temp. storage for pointer to cmd line
  722. FREE:    DS    2    ;addr of beginning of free memory
  723.  
  724.     DS    48
  725. STK:    DS    2
  726. ;
  727. ;
  728.     END    START
  729.