home *** CD-ROM | disk | FTP | other *** search
- ;
- ; FIXTEX.ASM version 1.2
- ; by Paul L. Kelley
- ; based on
- ; FILTER.ASM version 1.1
- ; and
- ; FILTEX.ASM version 1.0
- ; by Keith Petersen, W8SDZ
- ;09/10/84 - Fixed bug in FLTESC routine, that failed to reset high bit
- ; if FLTESC option is selected.
- ; Did this by storing byte back to input buffer location
- ; after ANI 7Fh, so that when its recalled from there after
- ; various tests it comes back with bit 7 reset.
- ;
- ; EOS
- ;
- ;01/14/83 - Did the following:
- ; 1. Fixed bug (missing ENDIF) in version 1.0,
- ; 2. Rewrote instructions on user-definable options
- ; to avoid some possible confusion.
- ; EOS
- ;01/03/83 - Did the following:
- ;
- ; 1. Changed to assemble with DRI's ASM,
- ; 2. Changed so that if input file is FILENAME.ABC then output
- ; file is FILENAME.XYZ where the various XYZ's are given
- ; below or, if renaming is chosen, the output file has
- ; the original file name and type and the input file name
- ; has the file type BAK,
- ; 3. Modified so that output file can be on different drive
- ; from input,
- ; 4. Added routines to output several types of files depending
- ; on assembly time switches, these switches can be set to
- ; do a number of operations (some are mutually exclusive).
- ; All cases pad the last sector with EOFs. The operations
- ; are:
- ; a. leave text unchanged, filetype=PAD
- ; b. delete all control characters except CR, LF and TAB,
- ; filetype=FIX
- ; c. insert LF after each CR if absent, filetype=ALF
- ; d. insert CR before each LF if absent, filetype=ACR
- ; e. delete extraneous LF (those not following CR), filetype=FEL
- ; f. delete LF, filetype=FLF
- ; g. insert one space on each blank line, filetype=ASP
- ; h. delete LF and insert a space on each blank line, filetype=SFL
- ; i. replace TAB with spaces, filetype=FTB
- ; j. delete LF and replace TAB with spaces, filetype=FLT
- ; k. replace TAB with spaces and insert a space on each blank line,
- ; filetype=SRT
- ; l. delete LF and replace TAB with spaces and insert a space
- ; on each blank line,
- ; filetype=FBB (canonical bulletin board file)
- ; m. delete any character following ESC, filetype=FES
- ; n. replace more than one space with TAB where possible,
- ; filetype=RSP
- ; o. replace more than one space with TAB where possible
- ; except in 'qouted' strings,
- ; filetype=FSM (canonical assembly file)
- ; p. insert a tab at start of each line, filetype=ATB
- ; q. insert an arbitrary number of spaces at start of each line,
- ; filetype=ANS
- ;
- ;Options f, g, h, i, j, k and l may be useful when sending files to
- ;bulletin boards and mainframes. Option m may be useful when capturing
- ;text from mainframes which control your terminal in full screen mode.
- ;Option o can shorten assembly language files.
- ; P.L.Kelley
- ;
- ;From FILTER.ASM Version 1.1 - Revised 01/27/81
- ;This program copies any ASCII file and filters out (ignores)
- ;all control characters except CR, LF, and TAB. It also sets
- ;the high order bit of all characters to zero so that files
- ;created with WordStar or other text processing programs can
- ;be read by MBASIC. The filtered copy of the of the file is
- ;created as 'FILTER.FIL' on the default drive. The source
- ;file is left intact. If the original file's EOF (1AH) is
- ;not at the physical end of the last sector, this program
- ;will pad the last sector with EOF's. This is useful for
- ;'cleaning up' a file which was originally created by MBASIC
- ;or text editors which do not pad the last sector with EOF's.
- ; Keith Petersen, W8SDZ
- ;
- ;Command: FILTER [drive:]<filename.filetype> [drive:]
- ;
- FALSE equ 0
- TRUE equ 0ffh
- ;
- ; ********** USER DEFINABLE AREA BEGINS HERE *****************
-
- renfil equ FALSE ;if true, output file has name of
- ; input file and input file has file
- ; type BAK.
- ; if false, output file is given
- ; distinctive file type and input file
- ; is not renamed.
- ;
- fltctl equ FALSE ;filters control chars (exc. CR,LF,TAB)
- ; FLTCTL is independent of other options,
- ; but should probably be set TRUE if
- ; FLTESC (below) is TRUE.
- ;
-
- ; +++++++ Read the following carefully - easy to go wrong ++++++
-
- ;The remaining options fall into two mutually-exlusive groups, i.e.,
- ; ALL of the other group's options must be FALSE if any options
- ; in a Group a are set TRUE.
-
- ;In the case of GROUP ONE, only one of the seven possible
- ; options may be true (and all Group Two options must be FALSE).
-
- ;In the case of GROUP TWO, one or more of the three options
- ; may be TRUE (and all of Group One options must be FALSE)
- ;
-
- ;+++++ GROUP ONE Options start here - ONLY ONE may be TRUE,
- ; AND all GROUP TWO Options
- ; must be FALSE if a GROUP ONE
- ; Options is TRUE. ++++++++++++++
-
- addlf equ FALSE ;add LF after CR if missing
- addcr equ FALSE ;add CR before LF if missing
- addnsp equ FALSE ;add spaces at the start of each line
- fltelf equ FALSE ;filter LF if not after CR
- fltesc equ FALSE ;filter character after ESC (you will likely
- ; also want to set ftlctl to TRUE)
- spcrpl equ FALSE ;replace spaces with TAB (where possible)
- addtab equ FALSE ;add TAB at the start of each line
- ; (see below also)
- ; End GROUP ONE Options
- ;
- ; Subordinate GROUP ONE Option:
- fltasm equ FALSE ;Do not replace spaces in 'quoted' strings.
- ; This equate may be TRUE only if SPCRPL in
- ; Group 1 (above) is also TRUE.
- ;
- ; ~~~~~~~~ END GROUP ONE - BEGIN GROUP TWO Options ~~~~~~~~~~~~~~~
-
- ; ++++++++++++++++++++++ ANY of ALL Group TWO Options may be TRUE,
- ; but ONLY is ALL Group ONE Optiond are FALSE
- ; ++++++++++++++++++++++++++++
-
- filtlf equ FALSE ;filter all LF
- addsp equ FALSE ;add one space on each blank line
- tabrpl equ FALSE ;replace TAB with spaces
-
- ; ~~~~~~~~~~~~~~ End GROUP TWO Options ~~~~~~~~~~~~~~~
- ;
- numspc equ 8 ;defines number of spaces to add at
- ; start of line if ADDNSP is TRUE.
- ; May change to suit yourself.
- ;
- tablen equ 8 ;defines length of TAB inserted by TABRPL.
- ; May change to suit yourself
- ;
- ; ******************** END OF USER DEFINABLE AREA ********
-
- ; NOTE: Although you could probably enlarge BSIZE (below) up
- ; to a value of TPA - 2 (in K bytes), it probably wouldn't
- ; improve speed very much. Unless you know exactly what
- ; you're doing, and why, you're better off leaving the
- ; value for BSIZE as it is.
- ;
- ;Define write buffer size
- BSIZE EQU 16 ;<--NOW SET FOR 16k
- ;
-
- ;
- ;BDOS equates
- ;
- WBOOT EQU 0 ;WARM BOOT ENTRY ADRS
- WRCON EQU 2 ;WRITE CHARACTER TO CONSOLE
- BDOS EQU 5 ;CP/M BDOS ENTRY ADRS
- PRINT EQU 9 ;PRINT STRING (DE) UNTIL '$'
- OPEN EQU 15 ;OPEN DISK FILE
- close equ 16
- erase equ 19
- READ EQU 20 ;READ SEQUENTIAL FILE
- write equ 21
- make equ 22
- rename equ 23
- STDMA EQU 26 ;SET DMA ADDRESS
- FCB EQU 5CH ;DEFAULT FILE CONTROL BLOCK
- ;
- cr equ 13
- lf equ 10
- tab equ 9
- eof equ 1ah
- esc equ 1bh
- quote equ ''''
- cmnt equ ';'
- del equ 7fh
- mask equ 7fh
- ;
- ;Program starts here
- ;
- ORG 100H
- ;
- START:
- LXI SP,STACK ;SET STACK POINTER
- CALL ILPRT ;PRINT
- DB CR,LF,'FXTXT version 1.2 - ASCII file utility',CR,LF
- DB 'Resets all high bits',cr,lf,0
- if fltctl
- call ilprt
- db 'Deletes all control characters except CR'
- endif ;fltctl
- if ((not filtlf) or (not tabrpl)) and fltctl
- db ', LF and TAB'
- endif ;((not filtlf) or (not tabrpl)) and fltctl
- if filtlf and (not tabrpl) and fltctl
- db ' and TAB'
- endif ;filtlf and (not tabrpl) and fltctl
- if fltelf and (not tabrpl) and fltctl
- db ', TAB and LF following CR'
- endif ;fltelf and (not tabrpl) and fltctl
- if tabrpl and (not filtlf) and fltctl
- db ' and LF'
- endif ;tabrpl and (not filtlf) and fltctl
- if fltctl
- db cr,lf,0
- endif ;fltctl
- if (not fltctl) and filtlf
- call ilprt
- db 'Deletes LF',cr,lf,0
- endif ;(not fltctl) and filtlf
- if (not filtlf) and fltelf
- call ilprt
- db 'Deletes LF not after CR',cr,lf,0
- endif ;(not filtlf) and fltelf
- if addlf or addcr or addsp or addtab or fltesc
- call ilprt
- endif ;addlf or addcr or addsp or addtab or fltesc
- if addlf
- db 'Inserts LF after CR if missing'
- endif ;addlf
- if addcr
- db 'Inserts CR before LF if missing'
- endif ;addcr
- if addsp
- db 'Inserts a space on blank lines'
- endif ;addsp
- if fltesc
- db 'Deletes character after ESC'
- endif ;fltesc
- if addtab
- db 'Adds a TAB at the start of each line'
- endif ;addtab
- if addlf or addcr or addsp or addtab or fltesc
- db cr,lf,0
- endif ;addlf or addcr or addsp or addtab or fltesc
- if spcrpl or tabrpl
- call ilprt
- endif ;spcrpl or tabrpl
- if tabrpl
- db 'Replaces TAB with spaces'
- endif ;tabrpl
- if spcrpl
- db 'Replaces spaces with TAB where possible'
- endif ;spcrpl
- if fltasm
- db ' except in ''quoted'' strings'
- endif ;fltasm
- if spcrpl or tabrpl
- db cr,lf,0
- endif ;spcrpl or tabrpl
- if addnsp
- call ilprt
- db 'Adds ',0
- lxi h,numspc
- call decout
- call ilprt
- db ' spaces at the start of each line',cr,lf,0
- endif ;addnsp
- lda ftype
- cpi 0
- jnz nofix
- if not fltctl
- call ilprt
- db 'Text unchanged',cr,lf,0
- lxi h,padftp
- endif ;not fltctl
- if fltctl
- lxi h,fixftp
- endif ;filctl
- lxi d,ftype
- mvi b,3
- call move
- nofix:
- if not renfil
- lxi d,outftp
- lxi h,ftype
- mvi b,3
- call move
- call ilprt
- db 'Output file type is '
- outftp: db ' ',cr,lf,0
- endif ;not renfil
- if renfil
- call ilprt
- db 'Input file type will be changed to BAK',cr,lf,0
- endif ;renfil
- LDA FCB+1
- CPI ' ' ;FILENAME THERE?
- JNZ OPENIT ;YES, GO OPEN IT
- CALL EXIT ;PRINT MSG THEN EXIT
- DB 'Usage: FIXTEX [drive:]<filename.filetype> [drive:]',CR,LF
- DB ' [ ] = optional, < > = required$'
- ;
- ;Open source file
- ;
- OPENIT: LXI D,FCB
- MVI C,OPEN
- CALL BDOS
- INR A ;CHECK FOR NO OPEN
- JNZ DECFIL ;NO ERROR, CONTINUE
- CALL EXIT
- DB '++ SOURCE FILE NOT FOUND ++$'
- ;
- ;Check for destination drive and erase then open output file
- ;
- decfil: lxi h,80h
- mvi d,0
- mov e,m
- dad d
- mov a,m
- cpi ':'
- mvi a,0
- jnz nodest
- dcx h
- mov a,m
- sbi 'A'
- cpi 16
- jnc wrgdest
- inr a
- nodest: sta fcb2
- lxi h,fcb+1
- lxi d,fcb2+1
- mvi b,8
- call move
- lxi d,fcb2
- mvi c,erase
- call bdos
- lxi d,fcb2
- mvi c,make
- call bdos
- CALL ILPRT ;PRINT:
- DB 'Input and output files open',CR,LF,CR,LF,0
- ;
- ;Read sector from source file
- ;
- READLP: LXI D,80H
- MVI C,STDMA
- CALL BDOS
- LXI D,FCB
- MVI C,READ
- CALL BDOS
- ORA A ;READ OK
- JZ WRDISK ;YES, SEND IT TO OUTPUT
- CPI 1 ;END-OF-FILE?
- JZ padeof ;TRANSFER DONE, CLOSE, EXIT
- CALL ERXIT
- DB '++ SOURCE FILE READ ERROR ++$'
- ;
- ;Write sector to output file (with buffering)
- ;
- WRDISK: LXI H,80H ;READ BUFFER ADRS
- ;
- WRDLOP:
- ;
- if addlf
- lda crflg
- ora a
- mov a,m
- jz skip2
- cpi lf
- jz putchr
- call more
- dcr l
- mvi a,lf
- jmp putchr
- endif ;addlf
- ;
- if tabrpl
- lda tabflg
- ora a
- jz skip
- lda tabcnt
- dcr a
- sta tabcnt
- jz endtab
- dcr l
- call more
- mvi a,' '
- jmp putchr
- endtab: xra a
- sta tabflg
- endif ;tabrpl
- ;
- if fltasm
- mov a,m
- cpi cmnt
- jnz nocmnt
- lda quoflg
- ora a
- jnz nocmnt
- mvi a,true
- sta cmtflg
- jmp spctst
- nocmnt: lda cmtflg
- ora a
- jnz spctst
- mov a,m
- cpi quote
- jnz noflip
- lda quoflg
- cma
- sta quoflg
- noflip: lda quoflg
- ora a
- jnz skip
- endif ;fltasm
- ;
- if spcrpl
- spctst: lda spcflg
- ora a
- jnz spcst2
- mov a,m
- cpi ' '
- jz spcset
- endif ;spcrpl
- ;
- skip: MOV A,M ;GET BYTE FROM READ BUFFER
- skip2: CPI eof ;END OF FILE MARKER ?
- JZ padeof ;TRANSFER DONE, CLOSE, EXIT
- ;
- if addtab
- lda crflg
- ora a
- mov a,m
- jz skip3
- cpi lf
- jz putcrlf
- call more
- dcr l
- mvi a,tab
- jmp putchr
- endif ;addtab
- ;
- if addnsp
- lda crflg
- ora a
- mov a,m
- jz skip3
- cpi lf
- jz putcrlf
- call more
- dcr l
- lda spccnt
- dcr a
- sta spccnt
- mvi a,' '
- jz putchr
- jmp putcrlf
- endif ;addnsp
- ;
- skip3: ANI mask ;STRIP PARITY BIT
- mov m,a ;put into memory with high bit set, in case
- ; we need it later (change for bugfix in 1.2)
-
- CPI del ;DEL (RUBOUT) ?
- JZ nIGNOR ;YES, IGNORE IT
- CPI ' ' ;SPACE OR ABOVE?
- JNC PUTCHR ;YES GO WRITE IT
- ;
- if addcr
- lda crflg
- ora a
- mov a,m
- jnz lftest
- cpi lf
- jnz crtest
- mvi a,true
- sta crflg
- call more
- dcr l
- mvi a,cr
- jmp putcrlf
- lftest: cpi lf
- jmp putchr
- endif ;addcr
- ;
- if fltelf
- lda crflg
- ora a
- mov a,m
- jnz lftest
- cpi lf
- jz ignore
- lftest: cpi lf
- jz putchr
- endif ;fltelf
- ;
- if not (filtlf or fltelf or addcr or addtab or addnsp)
- lftest: CPI LF ;LINE FEED ?
- JZ PUTcrlf ;YES GO WRITE IT
- endif ;not (filtlf or fltelf or addcr or addtab or addnsp)
- ;
- if filtlf
- cpi lf
- jz ignore
- endif ;filtlf
- ;
- if addsp
- cpi cr
- jnz tabtst
- lda crflg
- ora a
- mov a,m
- jz crtest
- call more
- dcr l
- mvi a,' '
- jmp putchr
- endif ;addsp
- ;
- crtest: CPI CR ;CARRIAGE RETURN ?
- ;
- if addlf or fltelf or addsp or addcr or addtab or addnsp
- jnz tabtst
- mvi a,true
- sta crflg
- mov a,m
- cpi cr
- endif ;addlf or fltelf or addsp or addcr or addtab or addnsp
- ;
- if tabrpl or spcrpl
- jnz tabtst
- xra a
- sta lincnt
- sta cmtflg
- sta quoflg
- mov a,m
- cpi cr
- endif ;tabrpl or spcrpl
- ;
- JZ PUTcrlf ;YES GO WRITE IT
- tabtst: CPI TAB ;TAB CHARACTER ?
- ;
- if spcrpl
- cz inccnt
- mov a,m
- cpi tab
- jz putcrlf
- endif ;spcrpl
- ;
- if not (tabrpl or spcrpl)
- JZ PUTCHR ;YES, GO WRITE IT
- endif ;not (tabrpl or spcrpl)
- ;
- if tabrpl
- cz tabset
- mov a,m
- cpi tab
- jz ignore
- endif ;tabrpl
- ;
- if fltesc
- cpi esc
- jnz nignor
- mvi a,true
- sta escflg
- endif ;fltesc
- ;
- if addlf
- xra a
- sta crflg
- endif ;addlf
- ;
- nignor:
- if not fltctl
- mov a,m
- jmp putcrlf
- endif ;not fltctl
- ;
- ;Ignore character and add one to ignore count
- ;
- IGNORE: PUSH H ;SAVE INPUT BUFFER ADRS
- LHLD DCOUNT ;GET DELETE COUNTER
- INX H ;ADD ONE
- SHLD DCOUNT ;SAVE NEW COUNT
- POP H ;GET INPUT BUFFER ADRS BACK
- JMP TSTEND ;IGNORE CHARACTER AND CONTINUE
- ;
- ;Pad last sector with EOFs
- ;
- padeof: lhld nxtout
- call sectst
- jz nopad
- padcnt: mvi m,eof
- inx h
- call sectst
- jnz padcnt
- lxi h,scinbf
- inr m
- nopad: mvi a,true
- sta finis
- jmp wrblock
- ;
- ;Check if end of output sector
- ;
- sectst: mvi a,0
- cmp l
- rz
- mvi a,80h
- cmp l
- ret
- ;
- ;Add one to acount
- ;
- more: push h
- lhld acount
- inx h
- shld acount
- pop h
- ret
- ;
- ;Add count of spaces eliminated to dcount
- ;
- if spcrpl
- less: push h
- lhld dcount
- lda spccnt
- less2: inx h
- dcr a
- jnz less2
- shld dcount
- pop h
- ret
- endif ;spcrpl
- ;
- if tabrpl
- tabset: mvi b,tablen
- lda lincnt
- tabagn: sub b
- jnc tabagn
- cma
- inr a
- inr a
- sta tabcnt
- mvi a,true
- sta tabflg
- ret
- endif ;tabrpl
- ;
- if spcrpl
- spcset: mvi a,true
- sta spcflg
- xra a
- spcst4: inr a
- sta spccnt
- lda lincnt
- inr a
- sta lincnt
- mvi b,tablen
- tabagn: sub b
- jz spcst3
- jnc tabagn
- inr l
- jz readlp
- spcst5: mov a,m
- cpi tab
- jz spcst7
- cpi ' '
- mvi a,true
- jnz spcst3 ;put spaces
- lda spccnt
- jmp spcst4
- ;
- spcst2: lda dowflg
- ora a
- jnz dowrbf
- jmp spcst5
- ;
- spcst7: call inccnt
- spcst3: cma
- sta tabflg
- mvi a,true
- cma
- sta dowflg
- ;
- dowrbf: lda tabflg
- ora a
- jz space
- xra a
- sta tabflg
- sta dowflg
- lda spcflg
- ora a
- mvi a,false
- sta spcflg
- jz nosngl
- lda spccnt
- cpi 1
- mvi a,' '
- jz putcrlf
- call more
- nosngl: call less
- mvi a,tab
- jmp putcrlf
- space: dcr l
- lda spccnt
- dcr a
- sta spccnt
- jnz moresp
- xra a
- sta spcflg
- sta dowflg
- moresp: mvi a,' '
- jmp putcrlf
- ;
- inccnt: mvi b,tablen
- lda lincnt
- tbagn2: sub b
- jnc tbagn2
- cma
- mov b,a
- lda lincnt
- add b
- inr a
- sta lincnt
- xra a
- sta spcflg
- ret
- endif ;spcrpl
- ;
- ;Write character to output buffer
- ;
- putchr:
- ;
- if addlf or fltelf or addsp or addcr or addtab or addnsp
- push psw
- xra a
- sta crflg
- pop psw
- endif ;addlf or fltelf or addsp or addcr or addtab or addnsp
- ;
- if addnsp
- push psw
- mvi a,numspc
- sta spccnt
- pop psw
- endif ;addnsp
- ;
- if tabrpl or spcrpl
- push psw
- lda lincnt
- inr a
- sta lincnt
- pop psw
- endif ;tabrpl or spcrpl
- ;
- if fltesc
- lda escflg
- ora a ;is it zero?
- mov a,m ;now get the character back
- jz putcrlf ;non-zero if prev char was ESC
- xra a
- sta escflg ;so reset escflg
- jmp ignore ;and igone the esc
- endif ;fltesc
-
- ;
- putcrlf:
- PUSH H ;SAVE INPUT BUFFER ADRS
- lhld nxtout
- mov m,a
- inx h
- shld nxtout
- call sectst
- jnz secnic
- lda scinbf
- inr a
- sta scinbf
- cpi bsize*8
- jz wrblock
- secnic: POP H ;GET INPUT BUFFER ADRS BACK
- ;
- TSTEND: INR L ;DONE WITH SECTOR?
- JNZ WRDLOP ;NO, GET ANOTHER BYTE
- JMP READLP ;GO GET ANOTHER SECTOR
- ;
- ;Write memory buffer to output file
- ;
- wrblock:
- lda scinbf
- ora a
- jz tdone
- mov c,a
- lxi d,buffer
- dkwrlp: push d
- push b
- mvi c,stdma
- call bdos
- lxi d,fcb2
- mvi c,write
- call bdos
- pop b
- pop d
- ora a
- jnz wrerr
- lxi h,80h
- dad d
- xchg
- dcr c
- jnz dkwrlp
- lda finis
- ora a
- jnz tdone
- xra a
- sta scinbf
- lxi h,buffer
- shld nxtout
- jmp secnic
- ;
- wrerr: call erxit
- DB '++ OUTPUT FILE WRITE ERROR, DISK FULL ++$'
- ;
- ;Transfer is done - close destination file
- ;
- TDONE: lxi d,fcb2
- mvi c,close
- call bdos
- ;
- ;Rename files
- ;
- if renfil
- xra a
- sta fcb+16
- sta fcb2+16
- lxi d,fcb+16
- lxi h,fcb
- mvi b,12
- call move
- lxi d,fcb2+17
- lxi h,fcb2+1
- mvi b,11
- call move
- lxi d,fcb+25
- lxi h,bakftp
- mvi b,3
- call move
- lxi d,fcb2+25
- lxi h,fcb+9
- mvi b,3
- call move
- lxi d,fcb+16
- mvi c,erase
- call bdos
- xra a
- sta fcb+16
- lxi d,fcb
- mvi c,rename
- call bdos
- lxi d,fcb2
- mvi c,rename
- call bdos
- endif ;renfil
- ;
- ;Output messages to operator and exit
- ;
- CALL ILPRT ;PRINT:
- DB 'Function complete:',cr,lf,0
- if tabrpl or fltesc or spcrpl or filtlf or fltelf or fltctl
- LHLD DCOUNT ;GET DELETED CHAR COUNT
- CALL DECOUT ;PRINT IT
- call ilprt
- endif ;tabrpl or fltesc or spcrpl or filtlf or fltelf or fltctl
- if fltctl
- DB ' bytes '
- endif ;fltctl
- if (tabrpl or fltesc or spcrpl or filtlf or fltelf) and fltctl
- db 'including'
- endif ;(tabrpl or fltesc or spcrpl or filtlf or fltelf) and fltctl
- if tabrpl
- db ' TABs '
- endif ;tabrpl
- if tabrpl and filtlf
- db 'and'
- endif ;tabrpl and filtlf
- if filtlf or fltelf
- db ' LFs '
- endif ;filtlf or fltelf
- if spcrpl
- db ' spaces '
- endif ;spcrpl
- if fltesc
- db ' single characters following ESC '
- endif ;fltesc
- if tabrpl or spcrpl or filtlf or fltelf or fltctl or fltesc
- db 'deleted',cr,lf,0
- endif ;tabrpl or spcrpl or filtlf or fltelf or fltctl or fltesc
- if addlf or addsp or addcr or tabrpl or addtab or addnsp or spcrpl
- lhld acount
- call decout
- call ilprt
- endif ;addlf or addsp or addcr or tabrpl or addtab
- ;or addnsp or spcrpl
- if tabrpl or addnsp or addsp
- db ' spaces added',cr,lf,0
- endif ;tabrpl or addnsp or addsp
- if spcrpl or addtab
- db ' TABs added',cr,lf,0
- endif ;spcrpl or addtab
- if addlf
- db ' LFs added',cr,lf,0
- endif ;addlf
- if addcr
- db ' CRs added',cr,lf,0
- endif ;addcr
- call ilprt
- db 'Last sector padded with EOFs',cr,lf,0
- jmp wboot
- ;
- ;Erase the incomplete output file, then exit
- ;
- ERXIT: lxi d,fcb2
- mvi c,close
- call bdos
- lxi d,fcb2
- mvi c,erase
- call bdos
- ;
- ;Print message then exit to CP/M warm boot
- ;
- EXIT: POP D ;GET MSG ADRS
- MVI C,PRINT ;PRINT MESSAGE
- CALL BDOS
- CALL ILPRT ;PRINT CRLF
- DB CR,LF,0
- JMP WBOOT ;ASSURES UPDATE OF BIT MAP
- ;
- ;Print illegal destination drive message
- ;
- wrgdest:
- call exit
- db '++ ILLEGAL DESTINATION DRIVE ++$'
- ;
- ;Inline print routine - prints string pointed to
- ;by stack until a zero is found. Returns to caller
- ;at next address after the zero terminator.
- ;
- ILPRT: XTHL ;SAVE HL, GET MSG ADRS
- ;
- ILPLP: MOV A,M ;GET CHAR
- CALL TYPE ;OUTPUT IT
- INX H ;POINT TO NEXT
- MOV A,M ;TEST
- ORA A ;..FOR END
- JNZ ILPLP
- XTHL ;RESTORE HL, RET ADDR
- RET ;RET PAST MSG
- ;
- ;Send character in A register to console
- ;
- TYPE: PUSH B
- PUSH D
- PUSH H
- MOV E,A ;CHAR TO E FOR CP/M
- MVI C,WRCON ;WRITE TO CONSOLE
- CALL BDOS
- POP H
- POP D
- POP B
- RET
- ;
- ;Decimal output - print HL as decimal
- ;number with leading zero suppression
- ;
- DECOUT: PUSH B
- PUSH D
- PUSH H
- LXI B,-10
- LXI D,-1
- ;
- DECOU2: DAD B
- INX D
- JC DECOU2
- LXI B,10
- DAD B
- XCHG
- MOV A,H
- ORA L
- CNZ DECOUT
- MOV A,E
- ADI '0'
- CALL TYPE
- POP H
- POP D
- POP B
- RET
- ;
- move: mov a,m
- stax d
- inx h
- inx d
- dcr b
- jnz move
- ret
- ;
- ;Output file control bytes
- ;
- fcb2: db ' '
- ; ^^^^^^^^^ ;9 bytes
- ftype:
- if addlf
- db 'ALF'
- endif ;addlf
- if fltelf
- db 'FEL'
- endif ;fltelf
- if filtlf and (not addsp) and (not tabrpl)
- db 'FLF'
- endif ;filtlf and (not addsp) and (not tabrpl)
- if addsp and (not filtlf) and (not tabrpl)
- db 'ASP'
- endif ;addsp and (not filtlf) and (not tabrpl)
- if filtlf and addsp and (not tabrpl)
- db 'SFL'
- endif ;filtlf and addsp and (not tabrpl)
- if fltesc
- db 'FES'
- endif ;fltesc
- if addcr
- db 'ACR'
- endif ;addcr
- if tabrpl and (not filtlf) and (not addsp)
- db 'RTB'
- endif ;tabrpl and (not filtlf) and (not addsp)
- if tabrpl and (not filtlf) and addsp
- db 'SRT'
- endif ;tabrpl and (not filtlf) and addsp
- if tabrpl and filtlf and (not addsp)
- db 'FLT'
- endif ;tabrpl and filtlf and (not addsp)
- if tabrpl and filtlf and addsp
- db 'FBB'
- endif ;tabrpl and filtlf and addsp
- if addtab
- db 'ATB'
- endif ;addtab
- if addnsp
- db 'ANS'
- endif ;addnsp
- if spcrpl and (not fltasm)
- db 'RSP'
- endif ;spcrpl and (not fltasm)
- if fltasm
- db 'FSM'
- endif ;fltasm
- db 0,0,0,0,0,0,0,0,0,0,0,0
- db 0,0,0,0,0,0,0,0,0,0,0,0
- db 0,0,0
- ;
- lincnt: db 0
- tabcnt: db 0
- scinbf: db 0
- finis: db false
- spccnt: db numspc
- tabflg: db false
- spcflg: db false
- dowflg: db false
- quoflg: db false
- cmtflg: db false
- escflg: db false
- crflg:
- if not (addsp or addnsp or addtab)
- db false
- endif ;not (addsp or addnsp or addtab)
- if addsp or addnsp or addtab
- db true
- endif ;addsp or addnsp or addtab
- nxtout: dw buffer
- DCOUNT: DW 0 ;DELETED CHARACTER COUNTER
- acount: dw 0 ;added character counter
- bakftp: db 'BAK'
- fixftp: db 'FIX'
- padftp: db 'PAD'
- DS 100 ;ROOM FOR STACK
- STACK: ds 2 ;STACK POINTER SET HERE
- ;
- ;Put write buffer on even page boundary
- BUFFER EQU ($ and 0ff00h) + 100h ;WRITE BUFFER STARTS HERE
- ;
- END