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 / CNTLH11.LBR / CNTLH11.ZZ0 / CNTLH11.Z80
Text File  |  2000-06-30  |  12KB  |  475 lines

  1. ;
  2. ; File: CNTLH.Z80
  3. ; Author: D. McCord
  4. ; Last Revised: 10 Sept 89
  5. ; Version: 1.1
  6. ;
  7. ; 1.1 Revision - added proper handling for an existing .BAK file and
  8. ;                processing of orphan cr's (adds lf's)
  9. ;
  10. ; Purpose: Text filtering for captured telecomm conversation files.  This
  11. ;          program cleans up such "chat" files in several different ways:
  12. ;          1. resets the high-order bit of all characters in the input
  13. ;             file, making it also usable to change a WS document-format
  14. ;             file to plain ASCII (non-document).
  15. ;          2. Filters out any control-h (backspace) characters and
  16. ;             processes these implied edits (deleting the immediately-
  17. ;             previous character also).
  18. ;          3. adds linefeed characters as needed to "orphan" carriage
  19. ;             returns.
  20. ;
  21. ; This software is not copyrighted.  
  22. ;
  23. ; assembly command lines:
  24. ;
  25. ; a0:command>zas cntlh
  26. ; a0:command>zlink cntlh,z3lib/,syslib/
  27. ;
  28. ; Equates
  29. ;
  30. CR    EQU    13        ; carriage return
  31. LF    EQU    10        ; linefeed
  32. Z3ENV    EQU    0FE00h        ; address of your ENV
  33. VERSION    EQU    11        ; 11 = 1.1
  34. FCB1    EQU    5Ch        ; 1st default fcb
  35. BUFFER$SIZE    EQU    16    ; 16k each input and output file buffers
  36. PIPE$SIZE    EQU    64    ; maximum active control h's in process
  37. CONTROLH    EQU    'H'-40h    ; control h character
  38. ;
  39. ; SYSLIB declarations
  40. ;
  41.     extrn    print,phlfdc,phl4hc,subhd,comphd
  42.     extrn    getud,putud,logud,codend,fxi$open,fxo$open
  43.     extrn    fxi$close,fxo$close,fx$get,fx$put,f$rename,f$delete
  44.     extrn    pfn2,retud
  45. ;
  46. ; Z3LIB declarations
  47. ;
  48.     extrn    z3init
  49. ;
  50. ; Z3 Utility header
  51. ;
  52. beglow:
  53.     jp    start
  54.     db    'Z3ENV'
  55.     db    1        ; external ENV
  56. envadr:
  57.     dw    z3env
  58. start:
  59.     ld    hl,(envadr)
  60.     call    z3init        ; init Z3 stuff
  61.     ld    (oldstk),sp    ; save old stack
  62.     ld    sp,stack    ; set internal stack
  63.     call    banner        ; print name of program and version
  64.     ld    a,(fcb1+1)    ; look at first char on command line
  65.     cp    '/'        ; help request?
  66.     jp    z,help
  67.     cp    ' '        ; no parameters?
  68.     jp    z,help
  69. ;
  70. ; determine DU: of input file
  71. ;
  72.     call    putud        ; save current DU:
  73.     call    retud        ; get current DU: in BC
  74.     ld    a,(fcb1+13)    ; get parsed user area
  75.     ld    c,a
  76.     ld    a,(fcb1)    ; and parsed disk
  77.     or    a
  78.     jr    z,start1    ; if no parsed disk, use what RETUD gave us
  79.     dec    a        ; adjust
  80.     ld    b,a
  81. start1:
  82.     call    logud        ; set it
  83. ;
  84. ; init fcb of input file
  85. ;
  86.     ld    bc,12
  87.     ld    de,iniocbfcb
  88.     ld    hl,fcb1
  89.     ldir            ; move default fcb to iniocb
  90.     call    codend        ; get end of code address
  91.     ld    (inbuff$add),hl    ; init buffer pointer in iniocb
  92. ;
  93. ; init fcb of output file
  94. ;
  95.     ld    de,buffer$size*1024
  96.     add    hl,de            ; set output to start one
  97.                     ; buffer$size after input
  98.     ld    (outbuff$add),hl    ; init buffer pointer in outiocb
  99.     push    hl            ; save start of outbuf for use below
  100.     ld    bc,12
  101.     ld    de,outiocbfcb
  102.     ld    hl,fcb1
  103.     ldir            ; move default fcb to outiocb
  104.     ld    bc,3
  105.     ld    de,outiocbfcb+9
  106.     ld    hl,tempext
  107.     ldir            ; setup output file to have $$$ extension
  108. ;
  109. ; setup character processing pipe
  110. ;
  111.     pop    hl            ; get back start of outbuf
  112.     ld    de,buffer$size*1024
  113.     add    hl,de            ; set pipe to start one
  114.                     ; buffer$size after output
  115.     ld    (lowpipe$add),hl    ; init pointer to lower boundary
  116.     ld    (pipepointer),hl    ; init pipe pointer
  117.     ld    de,pipe$size        ; size of pipe
  118.     add    hl,de            ; determine upper boundary of pipe
  119.     ld    (highpipe$add),hl    ; init pointer to high boundary
  120. ;
  121. ; Inform operator of memory usage
  122. ;
  123.     push    hl
  124.     call    print
  125.     db    '  Highest memory address used is ',0
  126.     pop    hl
  127.     call    phl4hc
  128.     call    print
  129.     db    cr,lf,0
  130. ;
  131. ; setup of unitialized data complete.  Now open files for use.
  132. ;
  133. open$input:
  134.     ld    de,iniocb    ; prep for open
  135.     call    fxi$open    ; open input file
  136.     jp    z,inopen$error    ; did an error occur?
  137.     call    print
  138.     db    '  Opened input file: ',0
  139.     ld    de,iniocbfcb+1
  140.     call    pfn2
  141.     call    print
  142.     db    cr,lf,0
  143. open$output:
  144.     ld    de,outiocb    ; prep for open
  145.     call    fxo$open    ; open output file
  146.     jp    z,outopen$error    ; any errors?
  147.     call    print
  148.     db    '  Output file opened successfully'
  149.     db    cr,lf,0
  150. ;
  151. ; All files opened successfully...  enter main loop
  152. ;
  153. loop01:
  154.     call    abort        ; check for operator termination
  155.     call    getinput    ; get an input character, maybe set endflag
  156.     ld    c,a        ; save input character
  157.     ld    a,(endflag)    ; end of input?
  158.     or    a
  159.     jr    nz,loop10    ; if end, jump to closing stuff
  160.     ld    a,c        ; get input character back
  161.     res    7,a        ; reset high bit
  162.     cp    controlh    ; is it a control-h?
  163.     jp    nz,loop02    ; if not, go to loop02
  164.     ld    hl,(ctlh$count)    ; increment statistics
  165.     inc    hl
  166.     ld    (ctlh$count),hl
  167.     call    takefrompipe    ; yes it was a ^H, back up the pipe
  168.     jr    loop01        ; go get next character
  169. loop02:
  170.     call    putinpipe    ; put it in the pipe
  171.     jr    loop01
  172. loop10:
  173.     call    flush        ; flush whatever's in the pipe
  174.     call    close        ; close output file
  175.     call    print
  176.     db    '  Processing completed - ',0
  177.     ld    hl,(ctlh$count)
  178.     call    phlfdc
  179.     call    print
  180.     db    ' control-h''s processed',cr,lf,0
  181.     call    rename        ; rename original to .bak, .$$$ to original
  182.     jp    exit1
  183. ;
  184. ; getinput reads the next character from the input file, sets endflag if
  185. ; the end is reached.
  186. ;
  187. getinput:
  188.     ld    de,iniocb    ; point to input file
  189.     call    fx$get        ; read it into A
  190.     ret    nz        ; return, no error
  191.     ld    a,0ffh
  192.     ld    (endflag),a    ; set end of file
  193.     ret
  194. ;
  195. ; push character in A into character pipe.  If overflow, write an output
  196. ; character.
  197. ;
  198. putinpipe:
  199.     push    hl            ; save registers
  200.     push    de
  201.     push    bc
  202.     ld    c,a            ; save character in C
  203.     ld    hl,(pipepointer)    ; get current top
  204.     ld    de,(highpipe$add)    ; get upper boundary
  205.     call    comphd            ; compare 'em
  206.     jr    nz,nowrite        ; if they are equal, write a character
  207. ;
  208. ; get a character out of the far end of the pipe and write it
  209. ;
  210. writeone:
  211.     dec    hl            ; bump pipepointer down 1
  212.     ld    (pipepointer),hl    ; store new pipepointer
  213.     call    write$hl        ; go write character at (HL) to output
  214. ;
  215. ; if we needed to write, we did.  now, shift pipe if needed.
  216. ;
  217. nowrite:
  218.     ld    hl,(pipepointer)
  219.     ld    de,(lowpipe$add)
  220.     call    subhd        ; get length to shift pipe
  221.     ld    a,h        ; test if HL is zero...
  222.     or    l
  223.     jr    z,noshift    ; might be first character in pipe
  224. ;
  225. ; we need to, so shift pipe one inward
  226. ;
  227.     push    bc        ; save character in C
  228.     push    hl
  229.     pop    bc        ; length to shift in BC
  230.     ld    de,(pipepointer); destination
  231.     ld    hl,(pipepointer)
  232.     dec    hl        ; one less than destination
  233.     lddr            ; block load with decrement [ (DE) <- (HL),
  234.                 ; decrement HL & DE, repeat (BC) times ]
  235.     pop    bc        ; get character back
  236. noshift:
  237.     ld    a,c
  238.     ld    hl,(lowpipe$add)
  239.     ld    (hl),a        ; put character at front of pipe
  240.     ld    hl,(pipepointer)
  241.     inc    hl
  242.     ld    (pipepointer),hl; increment pipepointer appropriately
  243.     pop    bc        ; restore registers
  244.     pop    de
  245.     pop    hl
  246.     ret
  247. ;
  248. ; takefrompipe empties the nearest character from the pipe
  249. ;
  250. takefrompipe:
  251.     push    hl        ; save registers
  252.     push    de
  253.     push    bc
  254.     ld    hl,(pipepointer)
  255.     ld    de,(lowpipe$add)
  256.     call    subhd
  257.     ld    a,h        ; test if HL is zero...
  258.     or    l
  259.     jr    z,notake    ; must be empty pipe if Z, don't do anything
  260.     push    hl        ; get size of pipe
  261.     pop    bc        ;  ...into BC
  262.     ld    hl,(lowpipe$add)
  263.     inc    hl        ; DE already has (lowpipe$add) in it
  264.     ldir            ; (DE) <- (HL), autoincrement (BC) times
  265.     ld    hl,(pipepointer)
  266.     dec    hl
  267.     ld    (pipepointer),hl
  268. notake:
  269.     pop    bc
  270.     pop    de
  271.     pop    hl
  272.     ret
  273. ;
  274. ; some error when opening input file brings us here
  275. ;
  276. inopen$error:
  277.     call    print
  278.     db    '  Error opening input file - probably no file with '
  279.     db    'that name - aborting',cr,lf,0
  280. exit:
  281.     call    getud
  282.     jp    exit1
  283. ;
  284. ; some error when opening output file brings us here
  285. ;
  286. outopen$error:
  287.     call    print
  288.     db    '  Error opening output file - aborting',cr,lf,0
  289.     jr    exit
  290. ;
  291. ; write$hl writes the character at (HL) to the output file after control-h
  292. ; processing.  here we fix orphan cr's.
  293. ;
  294. write$hl:
  295.     ld    a,(was$a$cr)        ; was the previous character a cr?
  296.     or    a
  297.     jr    z,write$hl10        ; if not, skip
  298.     ld    a,(hl)
  299.     cp    lf            ; is a linefeed following prev. cr?
  300.     jr    z,write$hl05        ; if yes, reset things to normal
  301.     ld    a,lf            ; load A with linefeed
  302.     call    write$hl20        ; go write it and come back
  303. write$hl05:
  304.     ld    a,0h            ; make A zero
  305.     ld    (was$a$cr),a        ; reset flag
  306. write$hl10:
  307.     ld    a,(hl)            ; get character to write
  308.     cp    cr            ; is a cr?
  309.     jr    nz,write$hl20        ; if not, go finish
  310.     ld    (was$a$cr),a        ; set flag to cr (0dh), non-zero
  311. write$hl20:
  312.     ld    de,outiocb        ; point to output
  313.     call    fx$put            ; write character in A to it
  314.     ret    nz            ; if no error, return, else fall to...
  315. ;
  316. ; an error writing to output brings us here
  317. ;
  318. outwrite$error:
  319.     call    print
  320.     db    '  Error writing output file - aborting',cr,lf,0
  321.     jp    exit
  322. ;
  323. ; print program name and version info
  324. ;
  325. banner:
  326.     call    print
  327.     db    'CNTLH, Version '
  328.     db    version/10+'0','.',(version mod 10)+'0',cr,lf,0
  329.     ret
  330. ;
  331. ; Built-in help
  332. ;
  333. help:
  334.     call    print
  335.     db    '  Text filtering and processing for captured "chat" files.'
  336.     db    cr,lf
  337.     db    'Syntax:',cr,lf
  338.     db    '  CNTLH <filespec>',cr,lf
  339.     db    '    <filespec> may use DU:, DIR: as needed.  Original <filespec>'
  340.     db    cr,lf
  341.     db    '    is renamed to .BAK, filtered file is named <filespec>.'
  342.     db    cr,lf,0
  343. exit1:
  344.     ld    sp,(oldstk)
  345.     ret
  346. ;
  347. ; flush takes whatever is in the pipe and writes it to the output file
  348. ;
  349. flush:
  350.     ld    hl,(pipepointer)
  351.     ld    de,(lowpipe$add)
  352.     call    subhd
  353.     ld    a,h
  354.     or    l
  355.     ret    z        ; nothing in pipe if Z
  356.     push    hl
  357.     pop    bc        ; BC now has # of items in pipe
  358.     ld    hl,(pipepointer)
  359.     dec    hl
  360. floop:
  361.     call    write$hl    ; write (HL) to output file
  362.     dec    bc
  363.     ld    a,b
  364.     or    c        ; if NZ, more to do
  365.     ret    z        ; return if done
  366.     dec    hl
  367.     jr    floop        ; go do more
  368. ;
  369. ; close all files
  370. ;
  371. close:
  372.     ld    de,iniocb
  373.     call    fxi$close    ; close input
  374.     ld    de,outiocb
  375.     call    fxo$close    ; close output
  376.     ret    nz        ; return if no errors
  377.     call    print
  378.     db    '  Error closing output file',cr,lf,0
  379.     jp    exit
  380. ;
  381. ; rename deletes any existing filename.BAK, then renames the original
  382. ; file to .BAK, new file to original's name
  383. ;
  384. rename:
  385.     ld    de,renamefcb    ; set up to move input filename to renamefcb
  386.     ld    hl,iniocbfcb
  387.     ld    bc,12
  388.     ldir            ; zap!
  389.     ld    bc,3        ; setup renamed input file to have BAK
  390.     ld    de,renamefcb+9    ; extension
  391.     ld    hl,bakext
  392.     ldir            ; zap!
  393.     ld    de,renamefcb
  394.     call    f$delete    ; delete an existing .BAK file, if any
  395.     ld    de,iniocbfcb    ; point to old name
  396.     ld    hl,renamefcb    ; point at new name
  397.     call    f$rename    ; go rename input file to .BAK
  398.     ld    de,renamefcb    ; move original filename to renamefcb
  399.     ld    hl,iniocbfcb
  400.     ld    bc,12
  401.     ldir            ; zap!
  402.     ld    de,outiocbfcb    ; point to old name
  403.     ld    hl,renamefcb    ; point to new name
  404.     call    f$rename    ; go rename output file to what original was
  405.     ret
  406. ;
  407. ; abort checks for operator abort
  408. ;
  409. abort:
  410.     ld    hl,abort1
  411.     push    hl        ; we return to abort1 after the jp (hl) below
  412.     ld    hl,(1)
  413.     inc    hl
  414.     inc    hl
  415.     inc    hl        ; HL points to BIOS CONST
  416.     jp    (hl)
  417. abort1:
  418.     or    a
  419.     ret    z        ; return if nothing waiting
  420.     call    print
  421.     db    cr,lf,'[User Abort]',cr,lf,0
  422. ;
  423. ; gobble the pending character which caused the abort
  424. ;
  425.     ld    hl,exit
  426.     push    hl        ; we return to exit after the jp (hl) below
  427.     ld    hl,(1)
  428.     ld    de,6
  429.     add    hl,de        ; HL points to BIOS CONIN
  430.     jp    (hl)
  431. ;
  432. ; initialized data area
  433. ;
  434. tempext:    db    '$$$'
  435. bakext:        db    'BAK'
  436. ;
  437. iniocb:
  438.     db    buffer$size*8
  439.     db    0
  440.     dw    0
  441.     dw    0
  442. inbuff$add:
  443.     dw    0
  444. iniocbfcb:
  445.     ds    36
  446. outiocb:
  447.     db    buffer$size*8
  448.     db    0
  449.     dw    0
  450.     dw    0
  451. outbuff$add:
  452.     dw    0
  453. outiocbfcb:
  454.     ds    36
  455. lowpipe$add:
  456.     dw    0
  457. highpipe$add:
  458.     dw    0
  459. pipepointer:
  460.     dw    0    ; where the NEXT character would go in the pipe
  461. endflag:
  462.     db    0
  463. ctlh$count:
  464.     dw    0
  465. was$a$cr:
  466.     db    0    ; 0 = previous character was not a cr
  467. ;
  468. ; uninitialized data area
  469. ;
  470. renamefcb:
  471.     ds    36
  472.     ds    64
  473. stack:
  474. oldstk:    ds    2
  475.