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 / ENTERPRS / CPM / UTILS / F / FILT84.LBR / FILT84.ZZ0 / FILT84.Z80
Text File  |  1992-05-09  |  27KB  |  1,267 lines

  1. ; FILT.Z80
  2. ;
  3. ;    Tabs or detabs ASCII text and assembler source files, filtering
  4. ;    out control characters, high-bits, and other unwanted characters.
  5. ;
  6. Vers    equ    84
  7. SubVers    equ    ' '
  8. ;
  9. ; HISTORY:
  10. ;
  11. ; Version 8.4 -- May 9, 1992 -- Gene Pizzetta
  12. ;    At Howard Goldstein's suggestion, I added a new command line
  13. ;    option to allow retaining existing form feeds in ASCII text and
  14. ;    source code files.  This new option is also configurable as the
  15. ;    default.  Appropriate modifications have been made to FILT84.CFG
  16. ;    and to FILT84.HLP.
  17. ;
  18. ; Version 8.3 -- May 3, 1992 -- Gene Pizzetta
  19. ;    On systems without date stamping, FILT was trying to rename files
  20. ;    in the wrong directory.  That has been fixed.  Thanks to Ed Flinn
  21. ;    and Howard Goldstein for finding this bug.  While I was at it, I
  22. ;    have changed the DOC file to a standard ZCPR3 help file.
  23. ;
  24. ; Version 8.2 -- March 3, 1992 -- Gene Pizzetta
  25. ;    A request from Howard Goldstein has motivated me to add the
  26. ;    ability to keep tabs in the document as originally found.
  27. ;    This three-way operation has resulted in two new command line
  28. ;    options: E to expand tabs to spaces and K to keep them as found.
  29. ;    Trailing tabs will still be removed.  Whether a user abort via
  30. ;    ^C generates an error is now configurable.  Should now be CP/M
  31. ;    compatible in the current user area only.
  32. ;
  33. ; Version 8.1 -- September 30, 1991 -- Gene Pizzetta
  34. ;    FILT did not check (and never has) for ambiguous filenames, which
  35. ;    could cause a small disaster.  It checks now.  Made display of
  36. ;    line count progress reports into configurable option.
  37. ;
  38. ; Version 8.0 -- September 10, 1991 -- Gene Pizzetta
  39. ;    Disassembled enough to change to a relocatable file (it was easy
  40. ;    after working on JUSTIFY).  Changed to Z80 opcodes to partially
  41. ;    compensate for space used by additional features.  Replaced some
  42. ;    routines with library routines.  Now allows destination directory
  43. ;    without destination filename.  Changed key options to command
  44. ;    line entry.  Changed some messages to make them more descriptive.
  45. ;    Added DU support, intelligent usage screen, error flag setting,
  46. ;    error handler invocation, quiet mode, and ZCNFG configuration.
  47. ;    Under ZSDOS and ZDDOS file create date stamps are transferred to
  48. ;    the new file.  Incorporates some code efficiencies suggested by
  49. ;    Bruce Morgen for JUSTIFY.  The hardest part of this conversion
  50. ;    was deciding how to make those various modes chosen interactively
  51. ;    into a group of logical command line options.  I hope I've
  52. ;    succeeded.
  53. ;
  54. ; Version 7.0a -- May 11, 1986 -- Irv Hoff W6FFC
  55. ;    When filtering WordStar files FILT7 was checking for unwanted
  56. ;    control characters too soon, thus ignoring space breaks and
  57. ;    soft-hyphens.  The summary report then indicated none were
  58. ;    found.  That has been fixed with FILT7A.  Evidently these
  59. ;    characters are seldom used in WordStar files, as I had to
  60. ;    make some special files to even test this feature.  This would
  61. ;    be verified to some extent by nobody calling this to our
  62. ;    attention even though the program has been available for
  63. ;    several years now.  (WordStar uses 0Fh for space breaks and
  64. ;    1Fh for soft-hyphens.)
  65. ;
  66. ; Version 7.0 -- April 27, 1985 -- Irv Hoff
  67. ;    Accepts lines up to 255 characters long (vice 128).  Insures
  68. ;    last line has CR-LF to allow normal processing.
  69. ;
  70. ; Version 6.0 -- March 7, 1985 -- Irv Hoff
  71. ;    Added tab option if in Text mode.  Fixed ERXIT so external file
  72. ;    is not deleted unless a 'Y' is used.
  73. ;
  74. ; Version 5.0 -- November 20, 1984 -- Irv Hoff
  75. ;    Initial version, similar style to FORM5, NEAT5 and TABS5.
  76. ;
  77. ; Please report bugs or make suggestions:
  78. ;
  79. ;    Gene Pizzetta
  80. ;    481 Revere St.
  81. ;    Revere, MA 02151
  82. ;
  83. ;    Voice:  (617) 284-0891
  84. ;    Newton Centre Z-Node:  (617) 965-7259
  85. ;    Ladera Z-Node Central:  (213) 670-9465
  86. ;
  87. BdosE    equ    05h        ; BDOS entry
  88. CpmFcb    equ    5Ch        ; default file control block
  89. AltFcb    equ    6Ch        ; alternate file control block
  90. CpmDma    equ    80h        ; default DMA buffer
  91. BufSiz    equ    128*128        ; buffer size (16K)
  92. ;
  93. ; BDOS functions . . .
  94. ;
  95. FOpen    equ    15        ; open file
  96. FClose    equ    16        ; close file
  97. FErase    equ    19        ; delete file
  98. FRead    equ    20        ; read sequential
  99. FWrite    equ    21        ; write sequential
  100. FMake    equ    22        ; create file
  101. FName    equ    23        ; rename file
  102. SetDma    equ    26        ; set DMA address
  103. ;
  104. ; ASCII . . .
  105. ;
  106. CtrlC    equ    03h        ; ^C
  107. TAB    equ    09h        ; tab
  108. LF    equ    0Ah        ; line feed
  109. FF    equ    0Ch        ; form feed
  110. CR    equ    0Dh        ; carriage return
  111. CtrlZ    equ    1Ah        ; ^Z (CP/M EOF)
  112. ;
  113.     .request    zslib,z3lib,syslib
  114. ;
  115.     extrn    gcomnam,comnam,hvtinit,hvdinit,hvon,hvoff    ; ZSLIB
  116.     extrn    eatspc,eatnspc,getstp,setstp,zcheck
  117.     extrn    z3init,envptr,getquiet,puter2,inverror        ; Z3LIB
  118.     extrn    eprint,epstr,cout,condin,pafdc,phldc,pfn2    ; SYSLIB
  119.     extrn    bdos,retud,logud,initfcb,codend
  120. ;
  121.     jp    Start
  122. ;
  123.     db    'Z3ENV',1
  124. Z3EAdr:    dw    0
  125. ;
  126. ; Configuration area . . .
  127. ;
  128.     dw    0        ; filler
  129.     db    'FILT'        ; for ZCNFG
  130.     db    Vers/10+'0',Vers mod 10+'0','  '
  131. ;
  132. ; Mode:    00000001b = b0 = source code
  133. ;    00000010b = b1 = ASCII text (default)
  134. ;    00000100b = b2 = WordStar document (remove dot commands)
  135. ;    00001000b = b3 = WordStar document (retain dot commands)
  136. Mode:    db    00000010b
  137. ;
  138. ; Tabs:    00000001b = b0 = re-tab output
  139. ;    00000010b = b1 = keep tabs as found
  140. ;    00000100b = b2 = expand tabs to spaces
  141. TabFlg:    db    00000001b
  142. ;
  143. FFFlag:    db    0        ; 0=remove form feeds, FFh=keep them (A&S only)
  144. QtFlag:    db    0        ; 0=verbose, FFh=quiet
  145. AbtFlg:    db    0        ; 0=no error on abort, FFh=error on abort
  146. LinFlg:    db    0        ; 0=report progress, FFh=don't
  147. LnStep:    db    0Fh        ; rate of screen updates (0F, 1F, or 3F)
  148. ;
  149. ; Program begins . . .
  150. ;
  151. Start:    ld    hl,(Z3EAdr)
  152.     call    zcheck        ; ZCPR3?
  153.     jr    z,GotZ3        ; (yep)
  154.     ld    hl,0        ; not Z3, set ENVPTR to 0
  155. GotZ3:    call    z3init        ; initialize environment
  156.     ld    (Stack),sp    ; save stack pointer
  157.     ld    sp,Stack    ; ..and set up new stack
  158.     call    codend        ; set up buffers
  159.     ld    (BufBeg),hl
  160.     ld    de,BufSiz
  161.     add    hl,de
  162.     ld    (BufEnd),hl
  163.     ld    hl,BufOff    ; initialize data segment
  164.     ld    b,OutBuf-BufOff
  165.     xor    a
  166. FillLp:    ld    (hl),a
  167.     inc    hl
  168.     djnz    FillLp
  169.     call    hvtinit        ; initialize terminal
  170.     call    getquiet    ; check quiet flag
  171.     rra            ; make sure it's 0 or FFh
  172.     sbc    a,a
  173.     jr    nz,SetQt
  174.     ld    a,(QtFlag)
  175. SetQt:    ld    (OpQFlg),a
  176.     ld    hl,DftNam
  177.     call    gcomnam        ; get disk name
  178.     ld    a,(CpmFcb+1)    ; help request?
  179.     cp    ' '
  180.     jp    z,Usage
  181.     cp    '/'
  182.     jp    z,Usage        ; (yep)
  183. ;
  184.     ld    hl,AltFcb+1    ; check for output file
  185.     ld    bc,11
  186.     ld    a,(hl)
  187.     cp    ' '
  188.     jr    z,Start1
  189.     cp    '/'
  190.     jr    nz,Start2
  191. Start1:    ld    hl,CpmFcb+1    ; none, so use input filename
  192. Start2:    ld    de,OutFn    ; move final filename to storage
  193.     ldir
  194.     ld    hl,OutFn
  195.     ld    de,OutFcb+1    ; move to output FCB
  196.     ld    c,8
  197.     ldir
  198.     ld    hl,TmpTyp    ; with $$$ filetype
  199.     ld    c,3
  200.     ldir
  201.     ld    ix,CpmFcb    ; get input and output DU's
  202.     call    GetDU
  203.     ld    (InDir),bc
  204.     ld    ix,AltFcb
  205.     call    GetDU
  206.     ld    (OutDir),bc
  207.     call    GetOpt        ; get options
  208. ;
  209.     ld    bc,(InDir)    ; get DU
  210.     ld    de,CpmFcb+1    ; point to filename
  211.     ld    a,(OpQFlg)
  212.     or    a
  213.     jr    nz,SkipIF
  214.     call    eprint
  215.     db    ' Filtering ',0
  216.     ld    a,(OpMFlg)
  217.     and    00000001b    ; source code mode?
  218.     ld    hl,AsmMsg
  219.     jr    nz,PrtMod    ; (yes)
  220.     ld    a,(OpMFlg)
  221.     and    00001100b    ; WordStar mode?
  222.     ld    hl,WSMsg
  223.     jr    nz,PrtMod    ; (yep)
  224.     ld    hl,TxtMsg    ; no, ASCII text mode
  225. PrtMod:    call    epstr
  226.     call    PrtFn
  227. SkipIF:    push    de        ; copy filename pointer to HL
  228.     pop    hl
  229.     call    ChkAmb        ; check for ambiguous filename
  230.     call    InDU        ; set up for opening source file
  231.     dec    de        ; point to source FCB
  232.     call    initfcb
  233.     ld    c,FOpen
  234.     call    BdosE
  235.     inc    a
  236.     jr    nz,OpenOK
  237.     ld    a,10        ; error code
  238.     call    eprint
  239.     db    ' File not found.',0
  240.     jp    Exit
  241. ;
  242. OpenOK:    ld    hl,0
  243.     ld    (BufOff),hl    ; zero buffer offset
  244.     ld    a,(OpQFlg)
  245.     or    a
  246.     jr    nz,SkipOF
  247.     ld    bc,(OutDir)
  248.     ld    de,OutFn    ; point to final output filename
  249.     call    eprint
  250.     db    ' to ',0
  251.     call    PrtFn
  252.     call    eprint
  253.     db    ' ..',0
  254. SkipOF:    call    OutDU
  255.     ld    de,OutFcb
  256.     push    de        ; point HL to filename
  257.     pop    hl
  258.     inc    hl
  259.     call    ChkAmb        ; check for ambiguous filename
  260.     call    initfcb
  261.     ld    c,FErase    ; blind erase file
  262.     call    bdos
  263.     ld    de,OutFcb
  264.     ld    c,FMake
  265.     call    BdosE
  266.     inc    a
  267.     jr    nz,MakeOK
  268.     ld    a,11        ; error code
  269.     call    eprint
  270.     db    ' No directory space.',0
  271.     jp    Abort
  272. ;
  273. MakeOK:    ld    a,(OpQFlg)
  274.     or    a
  275.     call    z,CrLf
  276.     ld    de,OutBuf
  277.     ld    b,255
  278. L03F0:    push    bc
  279.     push    de
  280.     ld    c,SetDma
  281.     ld    de,CpmDma
  282.     call    bdos
  283.     call    InDU
  284.     ld    c,FRead
  285.     ld    e,CpmFcb    ; D = 0
  286.     call    BdosE
  287.     pop    de        ; DE = address of OutBuf
  288.     pop    bc        ; B = 255
  289.     or    a
  290.     jr    z,ReadOK    ; (read okay)
  291.     cp    1        ; end of file?
  292.     jp    z,Done        ; (yep)
  293.     ld    a,4        ; error code
  294.     call    eprint
  295.     db    ' File read error.',0
  296.     jp    ErExit
  297. ;
  298. ReadOK:    ld    hl,CpmDma    ; move bytes from input buf to output buf
  299. L0437:    ld    a,(hl)        ; get character
  300.     cp    8Dh        ; soft carriage return?
  301.     call    z,IncSCr
  302.     bit    7,a        ; high bit character?
  303.     call    nz,IncHBt
  304.     and    7Fh        ; reset high bit
  305.     cp    7Fh        ; delete character?
  306.     jp    z,DoIt
  307.     cp    CtrlZ        ; ^Z ?
  308.     jp    z,Done        ; (end of file)
  309.     cp    ' '        ; control character?
  310.     jr    nc,NmlChr    ; (no)
  311.     cp    CR        ; carriage return?
  312.     jr    z,NmlChr
  313.     cp    LF        ; line feed?
  314.     jr    z,NmlChr
  315.     cp    FF        ; form feed?
  316.     jr    z,NmlChr
  317.     cp    TAB        ; tab?
  318.     jr    z,NmlChr
  319.     cp    0Fh        ; binding space?
  320.     jr    z,NmlChr
  321.     cp    1Fh        ; soft hyphen?
  322.     jp    nz,DoCtrl    ; handle other control characters
  323. ;
  324. NmlChr:    inc    b        ; increment counter
  325.     ld    c,a        ; save character in C
  326.     ld    a,b        ; end of buffer?
  327.     cp    0FFh
  328.     ld    a,c        ; recover character
  329.     jr    nc,L04BE    ; (end of buffer)
  330.     cp    0Fh        ; binding space?
  331.     jp    z,DoBSpc    ; (yes, handle it)
  332.     cp    ' '        ; space?
  333.     jr    nz,L0490    ; (no)
  334. L0485:    push    hl
  335.     ld    hl,(OSpCnt)    ; yes, increment space count
  336.     inc    hl
  337.     ld    (OSpCnt),hl
  338.     pop    hl
  339. L0490:    cp    TAB        ; tab?
  340.     jr    nz,NotTab    ; (no)
  341.     push    hl        ; save pointer
  342.     ld    hl,(OTbCnt)    ; yes, increment tab count
  343.     inc    hl
  344.     ld    (OTbCnt),hl
  345.     ld    h,a        ; save character in H
  346.     ld    a,(OpTFlg)    ; check "keep tabs" flag
  347.     and    00000010b
  348.     ld    a,h        ; recover character
  349.     pop    hl        ; recover pointer
  350.     jr    nz,NotTab    ; (keep tabs)
  351. XpndLp:    ld    a,' '        ; expand tab
  352.     ld    (de),a
  353.     inc    de
  354.     inc    b
  355.     ld    a,b
  356.     and    7
  357.     or    a
  358.     jr    nz,XpndLp
  359.     dec    b
  360.     jp    DoIt
  361. ;
  362. NotTab:    call    L0602
  363.     ld    (de),a
  364.     inc    de
  365.     cp    LF
  366.     jp    nz,DoIt
  367.     call    condin
  368.     call    nz,ChkCon
  369.     jr    L04C5
  370. ;
  371. L04BE:    ld    a,CR
  372.     ld    (de),a
  373.     inc    de
  374.     ld    a,LF
  375.     ld    (de),a
  376. L04C5:    dec    b
  377.     jr    z,L04E9
  378.     dec    de
  379.     dec    de
  380. L04CB:    dec    de
  381.     ld    a,(de)
  382.     cp    ' '
  383.     jr    z,L04D7
  384.     cp    TAB
  385.     jr    nz,L04E1
  386. L04D7:    call    IncTSp
  387.     djnz    L04CB
  388.     dec    de
  389. ;
  390. L04E1:    inc    de
  391. L04E2:    ld    a,CR
  392.     ld    (de),a
  393.     inc    de
  394.     ld    a,LF
  395.     ld    (de),a
  396. L04E9:    push    hl
  397.     call    CkPrgs        ; give progress report
  398.     ld    hl,OutBuf
  399. L04F0:    ld    a,(hl)
  400.     cp    ' '
  401.     jr    c,L0558
  402.     jp    nz,L0598
  403.     ld    a,(OpTFlg)
  404.     and    00000110b
  405.     ld    a,(hl)
  406.     jp    nz,L0598
  407.     ld    a,(OpMFlg)
  408.     and    00000001b    ; source code mode?
  409.     jr    z,L051C        ; (no)
  410.     ld    a,(L0C56)
  411.     or    a
  412.     jr    nz,L051C
  413.     ld    a,(L0C55)
  414.     or    a
  415.     jr    z,L051C
  416.     ld    a,' '
  417.     push    af
  418.     jp    L05C1
  419. ;
  420. L051C:    ld    a,(L0C57)
  421.     inc    a
  422.     ld    (L0C57),a
  423.     ld    a,(L0C51)
  424.     inc    a
  425.     ld    (L0C51),a
  426.     and    7
  427.     or    a
  428.     jp    nz,L05E5
  429.     ld    a,(L0C57)
  430.     cp    1
  431.     jr    nz,L054F
  432.     ld    a,(OpMFlg)
  433.     and    00000001b    ; source code mode?
  434.     jr    z,L0546        ; (no)
  435.     ld    a,(L0C56)
  436.     or    a
  437.     jr    z,L054F
  438. L0546:    xor    a
  439.     ld    (L0C57),a
  440.     ld    a,' '
  441.     jp    L05E0
  442. ;
  443. L054F:    xor    a
  444.     ld    (L0C57),a
  445.     ld    a,TAB
  446.     jr    L05E0
  447. ;
  448. L0558:    cp    CR
  449.     jr    z,L0587
  450.     cp    LF
  451.     jr    z,L0587
  452.     cp    TAB
  453.     jr    nz,L057A
  454.     xor    a
  455.     ld    (L0C57),a
  456.     ld    a,(L0C51)
  457.     add    a,8
  458.     and    0F8h
  459.     ld    (L0C51),a
  460.     ld    a,TAB
  461.     jr    L05E0
  462. ;
  463. L057A:    cp    FF        ; form feed?
  464.     jp    z,DoFF
  465.     cp    1Fh        ; soft hyphen?
  466.     jp    z,DoSHy
  467.     jr    L05E5
  468. ;
  469. L0587:    push    af
  470.     xor    a
  471.     ld    (L0C51),a
  472.     ld    (L0C55),a
  473.     ld    (L0C56),a
  474.     ld    (L0C57),a
  475.     jr    L05DF
  476. ;
  477. L0598:    push    af
  478.     cp    '.'
  479.     jp    z,L06D3
  480.     cp    ''''
  481.     jr    nz,L05AA
  482.     ld    a,(L0C55)
  483.     cpl
  484.     ld    (L0C55),a
  485. L05AA:    cp    ';'
  486.     jr    nz,L05C1
  487.     ld    a,(L0C56)
  488.     or    a
  489.     jr    nz,L05C1
  490.     ld    a,(L0C55)
  491.     or    a
  492.     jr    nz,L05C1
  493.     inc    a
  494.     ld    (L0C56),a
  495. L05C1:    ld    a,(L0C51)
  496.     inc    a
  497.     ld    (L0C51),a
  498.     ld    a,(L0C57)
  499.     or    a
  500.     jr    z,L05DF
  501. L05CF:    push    af
  502.     ld    a,' '
  503.     push    hl
  504.     call    L0762
  505.     pop    hl
  506.     pop    af
  507.     dec    a
  508.     ld    (L0C57),a
  509.     jr    nz,L05CF
  510. L05DF:    pop    af
  511. L05E0:    push    hl
  512.     call    L0762
  513.     pop    hl
  514. L05E5:    inc    hl
  515.     cp    LF
  516.     jp    nz,L04F0
  517. L05EB:    ld    de,OutBuf
  518.     ld    b,0FFh
  519.     pop    hl
  520.     ld    a,(L0C52)
  521.     or    a
  522.     ret    nz
  523.     ld    a,LF
  524. DoIt:    ld    (L0C53),a    ; save last character
  525.     inc    l        ; end of buffer?
  526.     jp    z,L03F0        ; (yes, read more)
  527.     jp    L0437        ; continue
  528. ;
  529. L0602:    ld    c,a
  530.     ld    a,(L0C53)
  531.     cp    CR
  532.     ld    a,c
  533.     jr    nz,L0618
  534.     cp    LF
  535.     ret    z
  536.     ld    a,l
  537.     or    a
  538.     jr    z,L0615
  539.     dec    l
  540. L0615:    ld    a,LF
  541.     ret
  542. ;
  543. L0618:    cp    LF
  544.     ret    nz
  545.     ld    a,CR
  546.     ld    (de),a
  547.     inc    de
  548.     push    hl
  549.     ld    hl,(OphCnt)    ; increment orphan line feed count
  550.     inc    hl
  551.     ld    (OphCnt),hl
  552.     pop    hl
  553.     ld    a,c
  554.     ret
  555. ;
  556. IncSCr:    push    hl
  557.     ld    hl,(SCrCnt)    ; increment soft carriage return count
  558.     inc    hl
  559.     ld    (SCrCnt),hl
  560.     pop    hl
  561.     ret
  562. ;
  563. DoCtrl:    push    hl
  564.     ld    hl,(CtlCnt)    ; increment control character count
  565.     inc    hl
  566.     ld    (CtlCnt),hl
  567.     pop    hl
  568.     jr    DoIt
  569. ;
  570. DoFF:    push    hl
  571.     ld    hl,(FFCnt)    ; increment form feed count
  572.     inc    hl
  573.     ld    (FFCnt),hl
  574.     pop    hl
  575.     ld    a,(OpFFlg)    ; retaining form feeds?
  576.     or    a
  577.     jr    nz,DoFF1    ; (yes)
  578.     ld    a,(OpMFlg)
  579.     and    00001100b    ; WordStar mode?
  580.     jr    z,L05E5        ; (nope)
  581. DoFF1:    ld    a,FF        ; put a form feed into the output
  582.     jr    L05E0
  583. ;
  584. IncHBt:    push    hl
  585.     ld    hl,(HBtCnt)    ; increment high-bit character count
  586.     inc    hl
  587.     ld    (HBtCnt),hl
  588.     pop    hl
  589.     ret
  590. ;
  591. DoSHy:    push    hl        ; handle soft hyphens
  592.     ld    hl,(SHyCnt)
  593.     inc    hl
  594.     ld    (SHyCnt),hl
  595.     pop    hl
  596.     ld    a,(OpMFlg)
  597.     and    00001100b    ; WordStar mode?
  598.     jp    z,L05E5        ; (nope)
  599.     ld    a,'-'
  600.     jp    L05E0
  601. ;
  602. DoBSpc:    push    hl        ; handle binding spaces
  603.     ld    hl,(BSpCnt)
  604.     inc    hl
  605.     ld    (BSpCnt),hl
  606.     pop    hl
  607.     ld    a,(OpMFlg)
  608.     and    00001100b    ; WordStar mode?
  609.     jp    z,DoIt        ; (nope)
  610.     ld    a,' '
  611.     jp    L0485
  612. ;
  613. IncTSp:    push    hl
  614.     ld    hl,(TSpCnt)    ; increment trailing space count
  615.     inc    hl
  616.     ld    (TSpCnt),hl
  617.     pop    hl
  618.     ret
  619. ;
  620. IncLns:    ld    hl,(LinCnt)    ; increment line count
  621.     inc    hl
  622.     ld    (LinCnt),hl
  623.     ret
  624. ;
  625. IncNSp:    ld    hl,(NSpCnt)    ; increment new file space count
  626.     inc    hl
  627.     ld    (NSpCnt),hl
  628.     ret
  629. ;
  630. IncNTb:    ld    hl,(NTbCnt)    ; increment new file tab count
  631.     inc    hl
  632.     ld    (NTbCnt),hl
  633.     ret
  634. ;
  635. L06D3:    ld    a,(L0C51)
  636.     or    a
  637.     jp    nz,L05C1
  638.     ld    a,(OpMFlg)
  639.     and    00001100b    ; WordStar mode?
  640.     jp    z,L05C1        ; (nope)
  641.     ld    a,(OpMFlg)
  642.     and    00001000b    ; retaining dot commands?
  643.     jr    nz,L070F    ; (yep)
  644.     pop    af
  645.     inc    hl
  646.     ld    a,(hl)
  647.     and    5Fh
  648.     cp    'P'
  649.     jr    nz,L070F
  650.     inc    hl
  651.     ld    a,(hl)
  652.     and    5Fh
  653.     cp    'A'
  654.     jr    nz,L070F
  655.     inc    hl
  656.     ld    a,(hl)
  657.     cp    CR
  658.     jr    nz,L070F
  659.     ld    a,FF
  660.     call    L0762
  661.     push    hl
  662.     ld    hl,(FFCnt)    ; increment form feed count
  663.     inc    hl
  664.     ld    (FFCnt),hl
  665.     pop    hl
  666. L070F:    push    hl
  667.     ld    hl,(DotCnt)    ; increment dot command count
  668.     inc    hl
  669.     ld    (DotCnt),hl
  670.     pop    hl
  671.     ld    a,(OpMFlg)
  672.     and    00001000b    ; retaining dot commands?
  673.     jp    nz,L05C1    ; (yep)
  674.     jp    L05EB
  675. ;
  676. ; Error exit if output file is open
  677. ErExit:    push    af        ; save error code
  678.     call    OutDU
  679.     ld    de,OutFcb
  680.     ld    c,FClose    ; close output file
  681.     call    BdosE
  682.     ld    de,OutFcb
  683.     ld    c,FErase    ; and erase it
  684.     call    BdosE
  685.     pop    af
  686. ;
  687. ; Error exit if no output file is open
  688. Abort:    push    af
  689.     call    InDU
  690.     ld    de,CpmFcb
  691.     ld    c,FClose    ; existing file abort
  692.     call    BdosE
  693.     pop    af
  694. Exit:    ld    b,a        ; put error code in B
  695.     call    Z3Chk        ; ZCPR3?
  696.     jr    z,Exit1        ; (no)
  697.     ld    a,b        ; recover error code
  698.     call    puter2        ; set error flag
  699.     or    a
  700.     call    nz,inverror    ; (if error, call error handler)
  701. Exit1:    call    hvdinit        ; de-initialize terminal
  702.     ld    sp,(Stack)    ; restore stack
  703.     ret            ; return to Z-System
  704. ;
  705. CkPrgs:    ld    a,(LinFlg)
  706.     or    a
  707.     ret    nz        ; (no progress reports)
  708.     ld    a,(OpQFlg)
  709.     or    a
  710.     ret    nz
  711.     ld    hl,(LinCnt)    ; compare number of lines so far
  712.     ld    a,(LnStep)    ; ..with step rate
  713.     and    l
  714.     ret    nz        ; (not there yet)
  715.     ld    a,CR
  716.     call    cout
  717.     ld    hl,(LinCnt)    ; print line progress report
  718.     jp    phldc        ; ..and return to caller
  719. ;
  720. L0762:    cp    ' '
  721.     call    z,IncNSp
  722.     cp    LF        ; line feed?
  723.     call    z,IncLns    ; (yes, increment line count)
  724.     cp    TAB        ; tab?
  725.     call    z,IncNTb    ; (yes, increment new tab count)
  726.     push    af
  727.     ld    hl,(BufEnd)    ; buffer end address in HL
  728.     ex    de,hl        ; end address in DE
  729.     ld    hl,(BufOff)    ; buffer offset in HL
  730.     ld    a,l        ; end of buffer?
  731.     sub    e
  732.     ld    a,h
  733.     sbc    a,d
  734.     jr    c,L07DF
  735.     ld    hl,0        ; zero buffer offset
  736.     ld    (BufOff),hl
  737. L0786:    ex    de,hl        ; buffer offset in DE
  738.     ld    hl,(BufEnd)    ; buffer end in HL
  739.     ld    a,e        ; end of buffer?
  740.     sub    l
  741.     ld    a,d
  742.     sbc    a,h
  743.     jr    nc,L07D1
  744.     ld    hl,(BufBeg)    ; get buffer start address
  745.     add    hl,de        ; add offset
  746.     ex    de,hl        ; pointer in DE
  747.     ld    c,SetDma
  748.     call    BdosE
  749.     call    OutDU
  750.     ld    de,OutFcb
  751.     ld    c,FWrite
  752.     call    BdosE
  753.     or    a
  754.     jr    nz,DskFul
  755.     ld    de,128        ; add sector to offset
  756.     ld    hl,(BufOff)
  757.     add    hl,de
  758.     ld    (BufOff),hl
  759.     jr    L0786
  760. ;
  761. DskFul:    ld    a,11        ; error code
  762.     call    eprint
  763.     db    ' Disk full.',0
  764.     jp    ErExit
  765. ;
  766. L07D1:    ld    c,SetDma
  767.     ld    de,CpmDma
  768.     call    BdosE
  769.     ld    hl,0
  770.     ld    (BufOff),hl    ; zero buffer offset
  771. L07DF:    ex    de,hl        ; buffer offset in DE
  772.     ld    hl,(BufBeg)    ; get buffer address
  773.     add    hl,de        ; add offset
  774.     ex    de,hl        ; pointer address in DE
  775.     pop    af        ; recover character
  776.     ld    (de),a        ; store it in buffer
  777.     ld    hl,(BufOff)    ; get offset
  778.     inc    hl        ; increment it
  779.     ld    (BufOff),hl    ; ..and store it
  780.     ret
  781. ;
  782. ChkCon:    cp    CtrlC        ; ^C ?
  783.     ret    nz        ; (anything else, continue)
  784.     ld    a,(AbtFlg)    ; error code (if any)
  785.     call    eprint
  786.     db    ' Aborted.',0
  787.     jp    ErExit
  788. ;
  789. Done:    ld    (L0C52),a    ; end of file, so finish up
  790.     inc    de
  791.     inc    b
  792.     call    nz,L04BE
  793.     ld    a,(OpQFlg)
  794.     or    a
  795.     jr    nz,L0866
  796.     ld    a,CR
  797.     call    cout
  798.     ld    hl,(LinCnt)
  799.     call    phldc
  800. L0866:    ld    hl,(BufOff)    ; check for end of sector
  801.     ld    a,l
  802.     and    7Fh
  803.     jr    nz,L0872
  804.     ld    (BufEnd),hl
  805. L0872:    ld    a,CtrlZ
  806.     push    af
  807.     call    L0762
  808.     pop    af
  809.     jr    nz,L0866
  810.     call    InDU
  811.     ld    de,CpmFcb
  812.     ld    c,FClose
  813.     call    bdos
  814.     call    OutDU
  815.     ld    de,OutFcb
  816.     ld    c,FClose
  817.     call    BdosE
  818.     inc    a
  819.     jr    nz,Finish
  820.     ld    a,4        ; error code
  821.     call    eprint
  822.     db    ' Cannot close output file.',0
  823.     jp    ErExit
  824. ;
  825. Finish:    call    DatStp        ; move date stamps
  826.     ld    a,(OpQFlg)
  827.     or    a
  828.     jp    nz,Finis5
  829.     ld    a,CR
  830.     call    cout
  831.     ld    hl,(LinCnt)
  832.     call    phldc        ; print total lines
  833.     call    eprint
  834.     db    '  lines',CR,LF,0
  835.     ld    hl,(OSpCnt)
  836.     call    phldc        ; print count of original spaces
  837.     call    eprint
  838.     db    '  original spaces',CR,LF,0
  839.     ld    hl,(OTbCnt)
  840.     call    phldc        ; print count of original tabs
  841.     call    eprint
  842.     db    '  original tabs',CR,LF,0
  843.     ld    hl,(NSpCnt)
  844.     call    phldc        ; print count of new spaces
  845.     call    eprint
  846.     db    '  current spaces',CR,LF,0
  847.     ld    hl,(NTbCnt)
  848.     call    phldc        ; print count of new tabs
  849.     call    eprint
  850.     db    '  current tabs',CR,LF,LF,0
  851.     ld    hl,(FFCnt)
  852.     call    phldc        ; print count of form feeds kept/deleted
  853.     call    eprint
  854.     db    '  form feeds ',0
  855.     ld    a,(OpFFlg)    ; retaining form feeds?
  856.     or    a
  857.     jr    nz,Finis1    ; (yep)
  858.     ld    a,(OpMFlg)
  859.     and    00001100b    ; WordStar mode?
  860.     jr    nz,Finis1    ; (yep)
  861.     call    eprint
  862.     db    'deleted',0
  863.     jr    Finis2
  864. ;
  865. Finis1:    call    eprint
  866.     db    'present',0
  867. Finis2:    ld    hl,(HBtCnt)
  868.     call    CrLf
  869.     call    phldc        ; print high-bit character count
  870.     call    eprint
  871.     db    '  high bits zeroed',CR,LF,0
  872.     ld    hl,(CtlCnt)
  873.     call    phldc        ; print control character count
  874.     call    eprint
  875.     db    '  control characters deleted',CR,LF,0
  876.     ld    hl,(OphCnt)
  877.     call    phldc        ; print orphan line feed count
  878.     call    eprint
  879.     db    '  orphan line feeds fixed',CR,LF,0
  880.     ld    hl,(TSpCnt)
  881.     call    phldc        ; print trailing spaces count
  882.     call    eprint
  883.     db    '  trailing spaces or tabs deleted',0
  884.     ld    a,(OpMFlg)
  885.     and    00001100b    ; WordStar mode?
  886.     jp    z,Finis5    ; (nope)
  887.     call    CrLf
  888.     call    CrLf
  889.     ld    hl,(DotCnt)
  890.     call    phldc        ; print count of dot commands kept/deleted
  891.     call    eprint
  892.     db    '  dot commands ',0
  893.     ld    a,(OpMFlg)
  894.     and    00001000b    ; retaining dot commands?
  895.     jr    z,Finis3    ; (nope)
  896.     call    eprint
  897.     db    'retained',0
  898.     jr    Finis4
  899. ;
  900. Finis3:    call    eprint
  901.     db    'deleted ',0
  902. Finis4:    call    CrLf
  903.     ld    hl,(SCrCnt)
  904.     call    phldc        ; print soft carriage return count
  905.     call    eprint
  906.     db    '  soft carriage returns fixed',CR,LF,0
  907.     ld    hl,(SHyCnt)
  908.     call    phldc        ; print soft hyphen count
  909.     call    eprint
  910.     db    '  soft hyphens fixed',CR,LF,0
  911.     ld    hl,(BSpCnt)
  912.     call    phldc        ; print binding spaces count
  913.     call    eprint
  914.     db    '  binding spaces fixed',0
  915. Finis5:    ld    hl,OutFn    ; move original filename
  916.     ld    de,OutFcb+1    ; to output FCB
  917.     ld    bc,11
  918.     ldir
  919.     ld    hl,OutFn    ; and move it to rename filename
  920.     ld    de,OutFcb+17
  921.     ld    c,8
  922.     ldir
  923.     ld    hl,BakTyp    ; move filetype BAK (DE = OutFcb+25)
  924.     ld    c,3
  925.     ldir
  926.     call    OutDU        ; make sure we're in the right directory
  927.     ld    de,OutFcb+16
  928.     xor    a
  929.     ld    (de),a        ; zero drive byte (just in case)
  930.     ld    c,FErase    ; blind erase any existing BAK file
  931.     call    bdos
  932.     ld    de,OutFcb    ; blind rename any existing file to fn.BAK
  933.     ld    c,FName
  934.     call    BdosE
  935.     ld    hl,TmpTyp    ; move $$$ type to output FCB
  936.     ld    de,OutFcb+9
  937.     ld    bc,3
  938.     ldir
  939.     ld    hl,OutFn+8    ; move final filetype to rename filetype
  940.     ld    de,OutFcb+25
  941.     ld    c,3
  942.     ldir
  943.     ld    de,OutFcb
  944.     ld    c,FName
  945.     call    BdosE
  946.     xor    a        ; error code (no error)
  947.     jp    Exit
  948. ;
  949. ; ChkAmb -- check for ambiguous filename at address in HL.
  950. ;
  951. ChkAmb:    ld    bc,11
  952.     ld    a,'?'
  953.     cpir
  954.     ret    nz        ; (okay)
  955.     ld    a,8        ; error code
  956.     call    eprint        ; ambiguous filenames not allowed
  957.     db    ' Ambiguous filename.',0
  958.     jp    Abort
  959. ;
  960. GetDU:    call    retud        ; B=current drive, C=current user
  961.     ld    a,(ix+0)    ; get drive byte
  962.     or    a
  963.     jr    z,GetDU1    ; (none)
  964.     dec    a        ; make A=0, etc.
  965.     ld    b,a        ; ..and put drive in B
  966. GetDU1:    call    Z3Chk        ; Z-System?
  967.     ret    z        ; (no, keep current user)
  968.     ld    c,(ix+13)    ; put user in C
  969.     ld    a,(ix+15)    ; get error byte
  970.     or    a
  971.     ret    z
  972.     ld    a,2        ; error code
  973.     call    eprint
  974.     db    ' Invalid directory.',0
  975.     jp    Abort
  976. ;
  977. InDU:    push    bc
  978.     ld    bc,(InDir)
  979.     jr    SetDU
  980. ;
  981. OutDU:    push    bc
  982.     ld    bc,(OutDir)
  983. SetDU:    call    logud
  984.     pop    bc
  985.     ret
  986. ;
  987. PrtFn:    call    hvon        ; start highlighting
  988.     ld    a,b        ; print drive
  989.     add    a,'A'
  990.     call    cout
  991.     ld    a,c        ; print user
  992.     call    pafdc
  993.     ld    a,':'
  994.     call    cout
  995.     call    pfn2
  996.     jp    hvoff        ; end highlighting and return
  997. ;
  998. GetOpt:    ld    a,(Mode)    ; move defaults
  999.     ld    (OpMFlg),a
  1000.     ld    a,(TabFlg)
  1001.     ld    (OpTFlg),a
  1002.     ld    a,(FFFlag)
  1003.     ld    (OpFFlg),a
  1004.     ld    hl,CpmDma+1
  1005.     call    eatspc        ; move past first token
  1006.     call    eatnspc
  1007.     call    eatspc
  1008.     ret    z        ; (no options)
  1009.     cp    '/'        ; slash?
  1010.     inc    hl        ; move past it
  1011.     jr    z,GotOpt    ; (we've got options)
  1012.     call    eatnspc        ; move past second token
  1013.     call    eatspc
  1014.     ret    z        ; (no options)
  1015.     cp    '/'
  1016.     jr    nz,GotOpt    ; (we've got options)
  1017.     inc    hl        ; move past slash
  1018. GotOpt:    ld    a,(hl)        ; get option
  1019.     inc    hl        ; point to next
  1020.     or    a
  1021.     ret    z        ; (end of options)
  1022.     cp    'S'
  1023.     jr    z,OptS
  1024.     cp    'A'
  1025.     jr    z,OptA
  1026.     cp    'D'
  1027.     jr    z,OptD
  1028.     cp    'E'
  1029.     jr    z,OptE
  1030.     cp    'K'
  1031.     jr    z,OptK
  1032.     cp    'Q'
  1033.     jr    z,OptQ
  1034.     cp    'F'
  1035.     jr    z,OptF
  1036.     cp    'T'
  1037.     jr    z,OptT
  1038.     cp    'W'
  1039.     jr    z,OptW
  1040.     cp    ' '        ; skip intervening and trailing spaces
  1041.     jr    z,GotOpt
  1042.     ld    a,19        ; error code
  1043.     call    eprint
  1044.     db    ' Invalid option.',0
  1045.     jp    Abort
  1046. ;
  1047. OptS:    ld    a,00000001b
  1048.     jr    DoMode
  1049. ;
  1050. OptA:    ld    a,00000010b
  1051.     jr    DoMode
  1052. ;
  1053. OptW:    ld    a,00000100b
  1054.     jr    DoMode
  1055. ;
  1056. OptD:    ld    a,00001000b
  1057. ;
  1058. DoMode:    ld    (OpMFlg),a
  1059.     jr    GotOpt
  1060. ;
  1061. OptQ:    ld    a,(OpQFlg)
  1062.     cpl
  1063.     ld    (OpQFlg),a
  1064.     jr    GotOpt
  1065. ;
  1066. OptF:    ld    a,(OpFFlg)
  1067.     cpl
  1068.     ld    (OpFFlg),a
  1069.     jr    GotOpt
  1070. ;
  1071. OptT:    ld    a,00000001b
  1072.     jr    DoTOpt
  1073. ;
  1074. OptK:    ld    a,00000010b
  1075.     jr    DoTOpt
  1076. ;
  1077. OptE:    ld    a,00000100b
  1078. DoTOpt:    ld    (OpTFlg),a
  1079.     jr    GotOpt
  1080. ;
  1081. ; Z3Chk -- Checks for Z-System by assuming the environment is not located
  1082. ; in zero page.  Returns NZ for Z-System, Z if not.
  1083. ;
  1084. Z3Chk:    ld    a,(envptr+1)    ; get high byte of environment address
  1085.     or    a
  1086.     ret
  1087. ;
  1088. ; DatStp -- Get create stamp from original file, if available, and
  1089. ; transfer it to new file.
  1090. ;
  1091. DatStp:    call    InDU        ; setup for input file
  1092.     ld    de,CpmFcb
  1093.     call    initfcb        ; re-initialize FCB
  1094.     ld    hl,CpmDma    ; point to DMA buffer
  1095.     call    getstp        ; get ZSDOS file stamp
  1096.     ret    nz        ; (error)
  1097.     ld    a,(CpmDma+1)    ; check for create date
  1098.     or    a
  1099.     jr    nz,DatSt1    ; (we've got a create date)
  1100.     ld    a,(CpmDma+11)    ; none, so check for modify date
  1101.     or    a
  1102.     ret    z        ; (no date stamp)
  1103.     ld    hl,CpmDma+10    ; point to modify date
  1104.     jr    DatSt2
  1105. DatSt1:    ld    hl,CpmDma    ; point to create date
  1106. DatSt2:    ld    de,StpTmp    ; move date to storage
  1107.     ld    bc,5
  1108.     ldir
  1109.     call    OutDU        ; setup for output file
  1110.     ld    de,OutFcb
  1111.     call    initfcb
  1112.     ld    hl,CpmDma    ; point to DMA buffer
  1113.     call    getstp        ; get file stamp
  1114.     ret    nz        ; (error)
  1115.     ld    hl,StpTmp
  1116.     ld    de,CpmDma    ; move old create stamp to date string
  1117.     ld    bc,5
  1118.     ldir
  1119.     ld    de,OutFcb    ; setup for file stamping
  1120.     ld    hl,CpmDma
  1121.     jp    setstp        ; set file stamp and return
  1122. ;
  1123. Usage:    call    eprint
  1124. DftNam:    db    'FILT   Version '
  1125.     db    Vers/10+'0','.',Vers mod 10+'0',SubVers
  1126.     db    '  Copyright (c) 1986 by Irv Hoff',CR,LF
  1127.     db    'Usage:',CR,LF
  1128.     db    '   ',0
  1129.     ld    hl,comnam
  1130.     call    epstr
  1131.     call    eprint
  1132.     db    ' {dir:}infile {dir:}{outfile} {{/}options}',CR,LF
  1133.     db    'The outfile defaults to the name of the infile.',CR,LF
  1134.     db    'Mode Options:',CR,LF
  1135.     db    '   A   ASCII Text',0
  1136.     ld    a,(Mode)
  1137.     and    00000010b
  1138.     call    nz,PrtDft
  1139.     call    eprint
  1140.     db    CR,LF
  1141.     db    '   S   Source Code',0
  1142.     ld    a,(Mode)
  1143.     and    00000001b
  1144.     call    nz,PrtDft
  1145.     call    eprint
  1146.     db    CR,LF
  1147.     db    '   W',0
  1148.     xor    a        ; reset flag for "remove dots"
  1149.     call    PrtWS        ; print rest of line
  1150.     ld    a,(Mode)
  1151.     and    00000100b
  1152.     call    nz,PrtDft
  1153.     call    eprint
  1154.     db    CR,LF
  1155.     db    '   D',0
  1156.     or    0FFh        ; set flag for "retain dots"
  1157.     call    PrtWS        ; print rest of line
  1158.     ld    a,(Mode)
  1159.     and    00001000b
  1160.     call    nz,PrtDft
  1161.     call    eprint
  1162.     db    CR,LF
  1163.     db    'Tabbing Options:',CR,LF
  1164.     db    '   T   re-tab',0
  1165.     ld    a,(TabFlg)
  1166.     bit    0,a
  1167.     call    nz,PrtDft
  1168.     call    eprint
  1169.     db    CR,LF
  1170.     db    '   E   expand tabs to spaces',0
  1171.     bit    2,a
  1172.     call    nz,PrtDft
  1173.     call    eprint
  1174.     db    CR,LF
  1175.     db    '   K   keep tabs as found',0
  1176.     bit    1,a
  1177.     call    nz,PrtDft
  1178.     call    eprint
  1179.     db    CR,LF
  1180.     db    'Other Options:',CR,LF
  1181.     db    '   F   re',0
  1182.     ld    a,(FFFlag)
  1183.     or    a
  1184.     call    z,PrtRtn
  1185.     call    nz,PrtRmv
  1186.     call    eprint
  1187.     db    ' form feeds (A and S modes)',CR,LF
  1188.     db    '   Q   quiet mode',0
  1189.     ld    a,(OpQFlg)
  1190.     or    a
  1191.     jr    z,UsageX
  1192.     call    eprint
  1193.     db    ' off',0
  1194. UsageX:    xor    a        ; no error
  1195.     jp    Exit
  1196. ;
  1197. PrtWS:    call    eprint
  1198.     db    '   WordStar: re',0
  1199.     or    a
  1200.     call    z,PrtRmv
  1201.     call    nz,PrtRtn
  1202.     call    eprint
  1203.     db    ' dot commands',0
  1204.     ret
  1205. ;
  1206. PrtDft:    call    eprint
  1207.     db    ' [default]',0
  1208.     ret
  1209. ;
  1210. PrtRmv:    call    eprint
  1211.     db    'move',0
  1212.     ret
  1213. ;
  1214. PrtRtn:    call    eprint
  1215.     db    'tain',0
  1216.     ret
  1217. ;
  1218. CrLf:    call    eprint
  1219.     db    CR,LF,0
  1220.     ret
  1221. ;
  1222. AsmMsg:    db    'Source Code ',0
  1223. TxtMsg:    db    'ASCII Text ',0
  1224. WSMsg:    db    'WordStar Document ',0
  1225. TmpTyp:    db    '$$$'
  1226. BakTyp:    db    'BAK'
  1227. ;
  1228.     DSEG
  1229. ;
  1230. OpMFlg:    ds    1        ; Mode: source code, ASCII, WS/no dot, WS/dot
  1231. OpTFlg:    ds    1        ; Tab flag
  1232. OpFFlg:    ds    1        ; Form feed flag
  1233. OpQFlg:    ds    1        ; Quiet flag
  1234. InDir:    ds    2        ; source user and drive
  1235. OutDir:    ds    2        ; destination user and drive
  1236. OutFn:    ds    11        ; final output filename
  1237. OutFcb:    ds    36        ; output file control block
  1238. StpTmp:    ds    5        ; create date storage
  1239. BufBeg:    ds    2        ; buffer start address
  1240. BufEnd:    ds    2        ; buffer end address
  1241. BufOff:    ds    2        ; current buffer offset
  1242. L0C51:    ds    1
  1243. L0C52:    ds    1
  1244. L0C53:    ds    1
  1245. L0C55:    ds    1
  1246. L0C56:    ds    1
  1247. L0C57:    ds    1
  1248. SCrCnt:    ds    2        ; count of soft carriage returns
  1249. CtlCnt:    ds    2        ; count of control characters
  1250. DotCnt:    ds    2        ; count of dot commands
  1251. FFCnt:    ds    2        ; count of form feeds
  1252. HBtCnt:    ds    2        ; count of zeroed high bits
  1253. SHyCnt:    ds    2        ; count of soft hyphens
  1254. LinCnt:    ds    2        ; lines in file
  1255. OphCnt:    ds    2        ; count of orphan line feeds
  1256. OSpCnt:    ds    2        ; count of spaces in original file
  1257. BSpCnt:    ds    2        ; count of binding spaces
  1258. NSpCnt:    ds    2        ; count of spaces in new file
  1259. OTbCnt:    ds    2        ; count of tabs in original file
  1260. NTbCnt:    ds    2        ; count of tabs in new file
  1261. TSpCnt:    ds    2        ; count of trailing spaces
  1262. OutBuf:    ds    256        ; output buffer
  1263.     ds    138        ; stack
  1264. Stack:    ds    2        ; stack pointer storage
  1265. ;
  1266.     end
  1267.