; ; 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:] [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:] [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