home *** CD-ROM | disk | FTP | other *** search
- ;POW FROM DR. DOBBS JOURNAL NO. 29, PAGE 20
-
- ;....POW....Assemble with CP/M ASM
-
- ;Revisions (in reverse order):
-
- ;04-20 FEB 82 ... CP/M MODS VERSION 2
- ;BY: WILLIAM R. BRANDONI
- ; DIAMOND-SHAMROCK CORP.
- ; P.O. BOX 348
- ; PAINESVILLE, OHIO 44077
- ; (216) 357-3680
- ;MAJOR REVISIONS:
- ; 1) Automatic processing of files larger than memory (OPTIONAL).
- ; 2) Changed :CT and :CC commands.
- ; 3) New :CD :CE :CN :CS :CU :FN :FY :JR :MD :MN :MS commands added.
- ; 4) New "C" and "V" options added ("V" OPTIONAL)
- ; 5) New "quoted space" character (#) added.
- ;MINOR REVISIONS:
- ; 6) Minor changes to some routines. Among them are:
- ; * DISKIN now recognizes CPM EOF character. Avoids some
- ; occasional junk on last page. Other mods, too.
- ; * NPAG now works properly even if page number is reset
- ; to zero during text output.
- ; * Menu input can be in lower or upper case.
- ; * Some labels have been altered.
- ; 7) Revised option message, repeats at each prompt.
- ; 8) Ctrl-C returns to menu. MUST USE "Q" TO QUIT.
- ; 9) "BELL" added to some messages.
- ;10) Default page length changed. Total is now 66 for
- ; standard page size.
- ;11) Source code restructured. Added user EQU section.
- ; Changed/added some comments.
- ; Code is arranged as follows:
- ; **1** INITIAL EQUATES
- ; **2** START OF PROGRAM
- ; **3** TEXT FOR ALL MESSAGES
- ; **4** GET OPTION FROM KEYBOARD
- ; **5** MAIN LOOP
- ; **6** LOOK FOR A COMMAND
- ; **7** COMMAND PROCESSING ........ alphabetized
- ; **8** PRINTER OUTPUT ROUTINES
- ; **9** POW UTILITY ROUTINES ...... alphabetized
- ; **10** SUPPORT UTILITY ROUTINES .. alphabetized
- ; **11** VARIABLE DEFINITIONS, BUFFERS, AND STACK SPACE
-
-
- ;30 JULY 79....MODS FOR CP/M
- ;BY BOTTER REEVES...LOY NAVA CO. LTD.
- ;1229/27 NEW ROAD, BANGKOK 5, THAILAND
- ;233-4193
-
-
- ;DEC 16-30, 1977 :
- ;MODIFIED FOR FDOS JUN 3,1978
- ;SELECTRIC MODS JUNE 15,1978
- ;TOTAL JUSTIFICATION FIXED JULY 20, 1978
-
-
- ;BY HERMAN WATSON
- ;P.O. BOX 341401
- ;CORAL GABLES, FLA 33134
-
-
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
- ; **1** INITIAL EQUATES
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- FALSE EQU 0
- TRUE EQU NOT FALSE
-
- ; * * * * * * * * * * * * * * * * * *
-
- ; USER DEFINABLE EQUATES
-
- BASE EQU 0000H ;<----SET TO BASE OF YOUR CP/M
-
- BIGFILE EQU TRUE ;<----ENABLE INPUT FILES LARGER THAN MEMORY
- ; Sets up more buffers, modifies/defines
- ; routines, checks memory addresses,
- ; and continues file loading during
- ; processing.
-
- VIEWCRT EQU TRUE ;<----ENABLE THE "V" OPTION
- ; Allows display of output on CRT console.
-
- CRTLN EQU 24 ;<----SET TO NO. OF LINES ON YOUR CRT
- ; Only used if VIEWCRT is TRUE.
-
- ; * * * * * * * * * * * * * * * * * *
-
- ; MISC. EQUATES
-
- BEGIN EQU BASE+100H
-
- ; SPECIAL CHARACTERS
-
- COMAND EQU ':' ;COMMAND IDENTIFIER
- DNSHFT EQU '\' ;DOWNSHIFT
- UPSHFT EQU '^' ;UPSHIFT
- NQUOTE EQU '[' ;QUOTE NEXT
- QSPACE EQU '#' ;QUOTED SPACE
-
- BELL EQU 7
- LF EQU 10
- FF EQU 12
- CR EQU 13
- SPQ EQU ' ' OR 10000000B ;SPACE WITH HIGH BIT ON
-
- ; CP/M EQUATES
-
- RESTRT EQU BASE ;CP/M REBOOT
- BDOS EQU BASE+5 ;CP/M ENTRY FOR I/O
- CPMEOF EQU 1AH ;CP/M EOF IS CTRL-Z
-
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
- ; **2** START OF PROGRAM
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- ORG BEGIN ;START LOC FOR COM FILE
-
- START: LXI SP,STACK
-
- IF BIGFILE
-
- ;FIND TPA LIMIT FROM BDOS JUMP
-
- LHLD BDOS+1 ;GET BDOS START
- DCR H ;DROP BELOW BDOS
- MVI L,0 ;AND SET TO EVEN PAGE BOUNDRY
- SHLD MEMSIZ
-
- ;STORE VALUE OF "TEST"
-
- LXI H,TEXT
- SHLD HLVAL
-
- ;COMPUTE "OFFSET" = "MEMSIZ" - "TEXT" - "NMOVED"
-
- LXI B,MEMSIZ
- LXI D,OFFSET
- LXI H,HLVAL
- CALL SUB2
- LXI B,OFFSET
- LXI D,OFFSET
- LXI H,NMOVED
- CALL SUB2
-
- ;COMPUTE "TMOVED" = "TEXT" + "NMOVED"
-
- LXI B,HLVAL
- LXI D,TMOVED
- LXI H,NMOVED
- CALL ADD2
-
- ENDIF
-
- LXI H,STMSG
- CALL TXTYP
- JMP MAIN
-
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
- ; **3** TEXT FOR ALL MESSAGES
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- STMSG: DB LF,CR,LF,'...PROCESSOR OF WORDS...',CR,LF
- DB ' Version 2.0',CR,LF
- DB ' (Feb. 1982)',CR,LF,LF
- DB 'Options are:',CR,LF,'$'
-
- PROMPT: DB ' "L" = LOAD file',CR,LF
- IF VIEWCRT
- DB ' "V" = VIEW on console',CR,LF
- ENDIF
- DB ' "P" = PAGE print',CR,LF
- DB ' "C" = CONTINUOUS print',CR,LF
- DB ' "Q" = QUIT',CR,LF,LF
- DB 'Enter Option ...... $'
-
- GREET: DB 'Enter File Name ... $'
-
- NOFMS: DB BELL,'FILE NOT FOUND$'
-
- PAGMS: DB BELL,LF,'Press any key when printer is'
- DB ' ready (ctrl-C to abort)$'
-
- IF BIGFILE
- MEMMSG: DB BELL,'*** MEMORY FULL *** will read as needed$'
- BUFMSG: DB BELL,'*** Reading more data ***$'
- ENDIF
-
- IF VIEWCRT
- VIEWMS: DB BELL,LF,'Press any key to view next screen full'
- DB ' (ctrl-C to abort)'
- DB CR,LF,LF,'This message will not be repeated$'
- VPGMSG: DB CR,LF,'---------- End of Page ----------$',CR,LF,LF
- ENDIF
-
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
- ; **4** GET OPTION FROM KEYBOARD
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- ;ALLOW 'L', 'V', 'C', 'P' OR 'Q' ONLY.
- ;"LOAD", "VIEW", "PRINT", "QUIT"
-
- MAIN: CALL ECHO1
- MVI A,1 ;RESET SOME FLAGS TO DEFAULT STATUS
- STA LPOS
- XRA A
- STA CDBLF
- STA COMNT
- STA CUNLF
- STA DBLPF
- STA PAGN
- STA SOT
- STA TCNT
-
- IF VIEWCRT
- STA VIEW
- ENDIF
-
- LXI H,PROMPT
- CALL TXTYP
- CALL CI ;GET CHAR FROM CONSOLE
- MOV C,A
- CALL ECHO1
- MOV A,C
-
- IF VIEWCRT
- CPI 'V' ;IS IT "V"?
- JNZ MAIL
- MOV C,A ;YES -- SET FLAGS TO 1
- MVI A,1
- STA WAIT
- STA VIEW
- LXI H,VIEWMS ;OPERATOR MESSAGE FIRST
- CALL TXTYP
- CALL ECHO1
- CALL ABTST
- JMP MAIN2
- ENDIF
-
- MAIL: CPI 'L' ;IS IT "L"?
- JNZ MAIC
- XRA A
- STA COMNT ;CLEAR COMMENT FLAG
-
- IF BIGFILE
- STA MEMOVF ;CLEAR OVERFLOW FLAGS
- STA MSGOVF
- ENDIF
-
- CALL FDIN ;LOAD TEXT FROM DISK
- JMP MAIN
-
- MAIC: CPI 'C' ;IS IT "C"?
- JNZ MAIP
- MOV C,A ;YES -- SET "WAIT" TO 1
- MVI A,1
- STA WAIT
- LXI H,PAGMS ;OPERATOR MESSAGE FIRST
- CALL TXTYP
- CALL ECHO1
- CALL ABTST
- JMP MAIN2
-
- MAIP: CPI 'P' ;IS IT "P"?
- JNZ MAIQ
- MOV C,A ;YES -- SET "WAIT" TO 0
- XRA A
- STA WAIT
-
- MAIN2: MOV A,C
- LXI H,TEXT ;PROCESS TEXT AND COMMANDS
- SHLD APNT
- CALL CLOS
- CALL NEWL
- JMP PRINT
-
- MAIQ: CPI 'Q' ;IS IT "Q"?
- JNZ MAIN ;LOOP BACK IF NOT L,V,C,P,OR Q
- JMP RESTRT ;REBOOT CP/M
-
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
- ; **5** MAIN LOOP
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- ;COMMAND DECODER AND PRINT LOOP
- ;THIS IS THE MAIN TEXT AND WORD PROCESSING LOOP
- ;HERE, WE GET THE NEXT CHAR FROM TEXT AND SEE
- ;IF A COMMAND, OR PROCESSED TEXT
-
- PRINT: LHLD APNT ;SOURCE TEXT POINTER
- PRLP: MOV A,M
- INX H
-
- IF BIGFILE
- CALL BUFTST
- ENDIF
-
- CPI 3 ;END OF TEXT?
- JC EOF
-
- CPI COMAND ;BEGINNING OF COMMAND?
- JZ CMND
-
- MOV B,A ;COMMENTS?
- LDA COMNT
- ORA A
- JZ PRLP1 ;IF NOT, DO NORMAL PROCESSING
- SHLD APNT
- JMP PRLP
-
- PRLP1: MOV A,B
- CALL CAPR ;DO CASE PROCESSING
- JC PRLP ;LETTER WAS TO BE IGNORED
- MOV B,A
-
- CPI NQUOTE ;QUOTE NEXT?
- JNZ PROQ
- MOV B,M ;OUTPUT WITHOUT QUESTION
- INX H
-
- IF BIGFILE
- CALL BUFTST
- ENDIF
-
- JMP PROC
-
- PROQ: CPI QSPACE ;QUOTED SPACE?
- JNZ PROC
- MVI B,SPQ ;REPLACE IT
-
- PROC: LDA JFLG ;PROCESS A LETTER
- ORA A
- MOV A,B
- SHLD APNT
- JZ NOFM
- CALL FMAT ;LEFT, RIGHT OR TOTAL JUST.
- JMP PRINT
- NOFM: CALL UFMT ;NO JUSTIFICATION
- JMP PRINT
- EOF: CALL CLOS ;CLOSE PENDING LINE
- XRA A
- STA EOT
- CALL NPAG
- MVI A,0FFH
- STA EOT
- JMP MAIN
-
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
- ; **6** LOOK FOR A COMMAND
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- ;COMMAND IDENTIFIER WAS ENCOUNTERED IN TEXT
- ;THIS TESTS NEXT TWO CHARACTERS
- ;AGAINST ALL COMMANDS TO FIND COMMAND
- ;AND CALL IT
-
- CMND: MOV B,M
- INX H
-
- IF BIGFILE
- CALL BUFTST
- ENDIF
-
- MOV C,M
- INX H
-
- IF BIGFILE
- CALL BUFTST
- ENDIF
-
- SHLD CEPT ;POINTS TO DELIMITER
- LXI H,CTAB
-
- ;LOOP TO FIND MATCH
-
- CLOP: MOV A,M
- INX H
- ORA A
- JZ CRTN
- CMP B
- JZ ONEM
-
- ;HERE FIRST LETTER FAIL
-
- LDA COMNT ;TEST FOR COMMENTS
- ORA A
- JNZ CRTN
- INX H
- INX H
- INX H
- JMP CLOP
-
- ;HERE FIRST LETTER MATCH
-
- ONEM: MOV A,M
- INX H
- CMP C
- JZ TWOM
-
- ;HERE SECOND LETTER FAIL
-
- LDA COMNT ;TEST FOR COMMENTS
- ORA A
- JNZ CRTN
- INX H
- INX H
- JMP CLOP
-
- ;COMMAND MATCH
-
- TWOM: MOV E,M ;LOAD ADDR
- INX H
- MOV D,M
- LHLD CEPT
- SHLD APNT ;POINTING AT DELIMITER
- LXI H,PRINT ;SET UP RETURN
- PUSH H
- XCHG
- PCHL ;GO TO COMMAND ROUTINE
-
- ;FAILED TO MATCH A COMMAND
- ;OR END OF COMMAND PROCESSING
-
- CRTN: LHLD APNT
- MOV B,M
- INX H
-
- IF BIGFILE
- CALL BUFTST
- ENDIF
-
- LDA ACCSAV
- ORA A
- JZ PROC ;NOT COMMENT - PROCESS IT
- SHLD APNT ;ELSE SAVE POINTER AND DO AGAIN
- JMP PRLP
-
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
- ; **7** COMMAND PROCESSING
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- ;THE COMMAND TABLE
-
- CTAB: DW 'CE' ;CE MUST BE FIRST COMMAND IN TABLE SINCE
- DW COME ;FIRST IS ONLY ONE SCANNED IF CS ACTIVE
- DW 'BM'
- DW BMES
- DW 'BP'
- DW BRKP
- DW 'CC'
- DW CEND
- DW 'CD'
- DW CDBL
- DW 'CM'
- DW MIDC
- DW 'CN'
- DW CNRM
- DW 'CS'
- DW COMS
- DW 'CT'
- DW CENT
- DW 'CU'
- DW CUNL
- DW 'DB'
- DW DBRK
- DW 'DM'
- DW DMAR
- DW 'DT'
- DW DTAB
- DW 'FN'
- DW FFDN
- DW 'FY'
- DW FFDY
- DW 'JE'
- DW ENDJ
- DW 'JL'
- DW LEFJ
- DW 'JR'
- DW RITJ
- DW 'JT'
- DW TOTJ
- DW 'LF'
- DW LNFD
- DW 'MD'
- DW MDBL
- DW 'MN'
- DW MCLR
- DW 'MS'
- DW MSGS
- DW 'NP'
- DW NPAG
- DW 'OF'
- DW OPOF
- DW 'ON'
- DW OPON
- DW 'PB'
- DW PGBT
- DW 'PG'
- DW FPAG
- DW 'PL'
- DW DPAG
- DW 'PN'
- DW SETP
- DW 'PT'
- DW PGTP
- DW 'SP'
- DW SPAZ
- DW 'TM'
- DW TMES
- DB 0 ;LAST ENTRY MUST BE ZERO
-
- ;TERMINATE A COMMAND
- ;CR,COMMA,SPACE, OR NOTHING ARE OK
-
- CTRM: LHLD APNT
- MOV A,M
- INX H
-
- IF BIGFILE
- CALL BUFTST
- ENDIF
-
- SHLD APNT
- CPI CR
- RZ
- CPI ' '
- RZ
- CPI ','
- RZ
- DCX H
- SHLD APNT
- RET
-
- ;GET THE NEXT ARGUMENT
-
- GARG: CALL CDEL
- JNZ GARE
- CALL ADEC
- MOV A,H
- ORA A
- MOV A,L
- RZ
- GARE: POP H
- JMP CTRM
-
- ;BOTTOM MESSAGE **BM**
-
- IF NOT BIGFILE
- BMES: CALL GARG
- STA BOTT
- CALL CDEL
- JNZ CTRM
- SHLD BOTA ;POINT TO MESSAGE
- JMP TMLP
- ENDIF
-
- IF BIGFILE
- BMES: CALL GARG
- STA BOTT
- CALL CDEL
- JNZ CTRM
- LXI D,BOTBUF ;MOVE MESSAGE INTO BUFFER
- LDA BBSZ
- MOV B,A
- CALL BUFILL
- SHLD APNT ;POINT PAST MESSAGE
- RET
- ENDIF
-
- ;BREAK FOR A NEW PARAGRAPH **BP**
-
- BRKP: CALL CLOS ;CLEAR LINE
- LDA PPOS ;GET PAGE POSITION
- ORA A
- JZ BRKT ;NO LF AT TOP OF PAGE
- LDA BRLF
- STA CETM
- CALL LFDO
- BRKT: LDA BRTB
- CALL PUTB
- JMP CTRM
-
- ;CENTER COPY (PRINT AGAIN) **CC**
-
- CEND: CALL OUTCEN
- JMP CTRM
-
- ;CENTER DOUBLESTRIKE **CD**
-
- CDBL: CALL GARG ;GET VALUE
- CPI 10 ;LIMIT THE VALUE
- JC CDBL1
- MVI A,10
- CDBL1: STA CDBSAV ;STORE LAST :CD ARG
- ORA A ;IF ZERO, USE :CN COMMAND
- JZ CNRM1
- PUSH B
- MOV C,A
- LDA DBLPF ;ADD TO MASTER
- ADD C
- POP B
- STA CDBLF ;STORE IT
-
- IF VIEWCRT
- LDA VIEW ;TEST FOR VIEW OPTION
- ORA A
- JZ CTRM
- XRA A
- STA CDBLF ;CLEAR IT
- ENDIF
-
- JMP CTRM
-
- ;COMMENT END **CE**
-
- COME: XRA A ;ZERO = NOT COMMENT
- STA COMNT
- JMP CTRM
-
- ;CENTER MARGIN MESSAGE **CM**
-
- MIDC: LDA RMAR
- LXI H,LMAR
- SUB M
- RAR ;DIVIDE BY TWO
- ADD M
- JMP CENA
-
- ;CENTER NORMAL PRINT **CN**
-
- CNRM: XRA A ;CLEAR CENTER UNDERLINE
- STA CUNLF
- CNRM1: LDA DBLPF ;RESET CENTER DOUBLESTRIKE
- STA CDBLF
- JMP CTRM
-
- ;COMMENT START **CS**
-
- COMS: MVI A,0FFH
- STA COMNT
- JMP CTRM
-
- ;CENTER TAB MESSAGE **CT**
-
- CENT: CALL GARG ;GET TAB
-
- CENA: STA CETM ;STORE TAB
- CALL CDEL
- JNZ CTRM
- SHLD CEPT ;POINT TO MESSAGE
- CALL CLOS
- CALL NEWCB ;CLEAN CENBUF
- MVI C,0
- LHLD CEPT ;START OF MESSAGE ADDRESS
-
- ;COUNT CHARS IN MESSAGE
-
- CECC: MOV A,M
- INX H
- CALL CAPR ;DO CASE PROCESSING
- JC CECC ;LETTER IS TO BE IGNORED
- INR C
- CPI CR
- JNZ CECC
-
- ;COMPUTE POSN OF FIRST LETTER OF MESSAGE
-
- MOV A,C
- ORA A
- RAR
- MOV C,A
- LDA CETM
- SUB C
- SHLD APNT ;POINT PAST MESSAGE
-
- LXI H,CENBUF ;COMPUTE LADR FOR MESSAGE
- CALL ADAH
- XCHG
- LHLD CEPT ;START OF MESSAGE ADDRESS
-
- CEMV: MOV A,M ;MOVE IT TO CENBUF
- INX H
- CALL CAPR ;DO CASE PROCESSING AGAIN
- JC CEMV ;LETTER TO BE IGNORED
- CPI CR
- JZ CEMV2
- STAX D
- INX D
- JMP CEMV
- CEMV2: STAX D
- JMP OUTCEN
-
- ;CENTER UNDERLINE **CU**
-
- CUNL: MVI A,1 ;SET UNDERLINE
- STA CUNLF
-
- IF VIEWCRT
- LDA VIEW ;TEST VIEW OPTION
- ORA A
- JZ CTRM
- XRA A ;CLEAR UNDERLINE
- STA CUNLF
- ENDIF
-
- JMP CTRM
-
- ;DEFINE A PARAGRAPH BREAK. **DB**
-
- DBRK: CALL GARG
- STA BRLF
- CALL GARG
- STA BRTB
- JMP CTRM
-
- ;DEFINE MARGINS. **DM**
-
- DMAR: CALL GARG
- STA LMAR
- STA BRTB ;SET THAT TOO
- CALL GARG
- STA RMAR
- CALL CLOS
- CALL NEWL
- JMP CTRM
-
- ;DEFINE TABS (14 MAX.) **DT**
-
- DTAB: LXI H,TTAB
- SHLD TBAD
- DTBL: CALL CDEL
- JNZ DTBX
- CALL ADEC
- MOV A,L
- LHLD TBAD
- MOV M,A
- INX H
- SHLD TBAD
- JMP DTBL
- DTBX: LHLD TBAD
- MVI M,0
- JMP CTRM
-
- ;FORM FEED - NO **FN**
-
- FFDN: XRA A
- STA FFLG
- JMP CTRM
-
- ;FORM FEED - YES **FY**
-
- FFDY: MVI A,0FFH
- STA FFLG
- JMP CTRM
-
- ;CLOSE PRESENT LINE AND SET TO NO JUST. MODE **JE**
-
- ENDJ: CALL CLOS
- XRA A
- STA JFLG
- JMP CTRM
-
- ;SET LEFT JUSTIFICATION MODE **JL**
-
- LEFJ: MVI A,1
- STA JFLG
- JMP CTRM
-
- ;SET RIGHT JUSTIFICATION MODE **JR**
-
- RITJ: MVI A,3
- STA JFLG
- JMP CTRM
-
- ;SET TOTAL JUSTIFICATION MODE **JT**
-
- TOTJ: MVI A,2
- STA JFLG
- JMP CTRM
-
- ;LINE FEED COMMAND (IGNORE ZERO LF'S) **LF**
-
- LNFD: CALL GARG
- STA CETM
- CALL LFDO
- JMP CTRM
-
- ;MASTER DOUBLESTRIKE **MD**
-
- MDBL: CALL GARG
- CPI 10 ;LIMIT THE VALUE
- JC MDBL1
- MVI A,10
- MDBL1: ORA A ;IF ZERO, USE :MN COMMAND
- JZ MCLR
- STA DBLPF ;STORE MASTER DOUBLE
- PUSH B
- MOV C,A
- LDA CDBLF ;ADD TO CENTER DOUBLE
- ADD C
- STA CDBLF ;STORE CENTER DOUBLE
- POP B
-
- IF VIEWCRT
- LDA VIEW ;TEST VIEW OPTION
- ORA A
- JZ CTRM
- XRA A
- STA DBLPF ;CLEAR MASTER
- STA CDBLF ;CLEAR CENTER
- ENDIF
-
- JMP CTRM
-
- ;MASTER NORMAL **MN**
-
- MCLR: LDA CDBSAV ;RESET CENTER TO LAST :CD ARG
- STA CDBLF
- XRA A ;CLEAR MASTER
- STA DBLPF
-
- IF VIEWCRT
- LDA VIEW ;TEST FOR VIEW OPTION
- ORA A
- JZ CTRM
- XRA A
- STA CDBLF ;CLEAR CENTER
- ENDIF
-
- JMP CTRM
-
-
- ;BOTTOM AND TOP MESSAGE START **MS**
-
- MSGS: CALL GARG
- STA STMS
- JMP CTRM
-
- ;FORCE BOTTOM PRESENT PAGE AND START NEW ONE **NP**
-
- NPAG: LDA SOT
- ORA A
- JZ DVDR
- CALL CLOS
- CALL NEWL
- LDA PLEN
- STA CETM
- CALL LFDO
- JMP CTRM
-
- ;TURN OFF PRINTER OUTPUT **OF**
-
- OPOF: XRA A ;ZERO TURNS OFF OUTPUT
- STA OPST
- JMP CTRM
-
- ;TURN ON PRINTER OUTPUT **ON**
-
- OPON: MVI A,0FFH ;NON-ZERO MEANS ON
- STA OPST
- JMP CTRM
-
- ;DEFINE BOTTOM OF PAGE **PB**
-
- PGBT: CALL GARG
- STA BLEN
- CALL GARG
- STA BOTN
- JMP CTRM
-
- ;IMMEDIATELY FORCE A PAGE START **PG**
-
- FPAG: CALL DVDR
- JMP CTRM
-
- ;DEFINE PAGE LENGTH **PL**
-
- DPAG: CALL GARG
- STA PLEN
- JMP CTRM
-
- ;PAGE NUMBER **PN**
-
- SETP: CALL GARG
- STA PAGN
- JMP CTRM
-
- ;DEFINE TOP OF PAGE **PT**
-
- PGTP: CALL GARG
- STA TLEN
- CALL GARG
- STA TOPN
- JMP CTRM
-
- ;SET SPACING **SP**
-
- SPAZ: CALL GARG
- STA SPAS
- JMP CTRM
-
- ;TOP MESSAGE **TM**
-
- IF NOT BIGFILE
- TMES: CALL GARG
- STA TOPT
- CALL CDEL
- JNZ CTRM
- SHLD TOPA ;POINT TO MESSAGE
- TMLP: MOV A,M
- INX H
- CPI CR
- JNZ TMLP
- SHLD APNT ;POINT PAST MESSAGE
- RET
- ENDIF
-
- IF BIGFILE
- TMES: CALL GARG
- STA TOPT
- CALL CDEL
- JNZ CTRM
- LXI D,TOPBUF ;MOVE MESSAGE INTO BUFFER
- LDA TBSZ
- MOV B,A
- CALL BUFILL
- SHLD APNT ;POINT PAST MESSAGE
- RET
- ENDIF
-
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
- ; **8** PRINTER OUTPUT ROUTINES
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- ;FORMATTED OUTPUT
- ;CALL WITH LETTER IN A
- ;HANDLES LEFT, RIGHT OR TOTAL JUSTIFICATION
-
- FMAT: CPI 9 ;TEST TAB
- JZ TBST
- CPI CR ;TEST CARRIAGE RETURN
- JNZ LFTS
- MVI A,' ' ;REPLACE CR WITH SPACE
- LFTS: CPI LF ;IGNORE LINE FEEDS
- RZ
- CPI ' '
- JNZ RFMT
-
- ;NO SPACES AT THE LEFT OF THE LINE
-
- LXI H,LMAR
- LDA LPOS
- CMP M
- RZ ;AT START, SO STAY THERE
- MVI A,' ' ;OK TO KEEP SPACE
- RFMT: LHLD LADR ;NOW PLACE LETTER IN OUTBUF
- MOV M,A
- INX H
- SHLD LADR
- LXI H,RMAR ;CHECK IF OUTBUF FULL
- LDA LPOS
- INR A
- STA LPOS
- CMP M
- RC
-
- ;OUTBUF FULL. ASSUME LEFT JUST.
- ;BACK UP TO SPACE AND SAVE OVERFLOW
- ;DE=TEMP ADDRESS
- ;C=CHAR COUNT
- ;HL=OUTBUF ADDRESS
-
- MVI B,30 ;MAX AMOUNT TEML CAN HOLD
- MVI C,0 ;TEML CHAR COUNT
- LXI D,TEML
- LHLD LADR
- MVI M,CR ;EOL IN CASE NOT POSSIBLE
-
- ;LOOP BACK TO FIRST SPACE (WITHIN 30 LETTERS
- ;AND WITHOUT HITTING LEFT MARGIN)
-
- LJBU: DCX H
- MOV A,M
- CPI ' '
- JZ LJFN
- LJRT: STAX D
- INX D
- INR C
- DCR B
- JZ OUTL
- JMP LJBU
- LJFN: DCX H
- MOV A,M
- INX H
- CPI ' '
- JZ LJRT
- MOV A,C
- STA TCNT ;SAVE CHAR COUNT
- LDA LPOS ;BACK UP LPOS
- SUB C
- STA LPOS
- MOV C,A ;DON'T GO PAST NEW PARA TAB
- LDA BRTB ;FOR UNMODIFIED INDENTION
- SUB C ;TO THAT TAB POSITION
- JNC OUTL ;TERMS NOT MET
- SHLD LADR
- MVI M,CR ;NEW EOL
-
- ;TEST HERE IF LEFT, RIGHT, OR TOTAL JUST.
- ;1=LEFT
- ;2=TOTAL
- ;3=RIGHT
- ;BY THE WAY, AT THIS POINT LEFT JUST. IS DONE.
-
- LDA JFLG
- CPI 1
- JZ OUTL
- CPI 2
- JZ TOTL
- CPI 3
- JNZ OUTL
-
- ;RIGHT JUST.
- ;LINE IS ALREADY LEFT JUSTIFIED,
- ;SO MOVE TO RIGHT MARGIN AND PAD LEFT.
-
- RIGHT: LHLD LEND
- XCHG
- LHLD LADR
- LDA LPOS
- MOV C,A
- CALL TDHE ;DE .EQ. HL MEANS PAD DONE
- JZ OUTL
-
- ;GET LEFTMOST CHAR. POSITION
- ;(SMALLEST OF BREAK-TAB OR LEFT-MARGIN)
-
- LDA BRTB ;BREAK
- MOV B,A
- LDA LMAR ;MARGIN
- CMP B
- JC RJUST1
- MOV A,B
- RJUST1: STA ACCSAV
-
- ;DO THE MOVE
-
- RMOVE: MOV A,M ;PICK UP AT LEFT
- STAX D ;STORE AT RIGHT
- MVI A,' ' ;AND REPLACE WITH BLANK
- MOV M,A
- DCX D
- DCX H
- DCR C
- LDA ACCSAV ;GET LEFTMOST POSITION
- CMP C
- JNZ RMOVE
- JMP OUTL
-
- ;TOTAL JUST.
- ;MOVE LINE TO RIGHT, AND PAD
- ;IF LMAR REACHED, PUSH LINE LEFT AND
- ;PAD AGAIN UNTIL DONE
- ;(HL) .GE. (DE), SO DE IS RIGHT OF HL, AND WHEN
- ;DE .EQ. HL, THE PADDING IS DONE
-
- ;BEGIN AT LAST CHAR AND SHOVE RIGHT
- ;START PADDING AT THE SFLP SPACE
- ;(SFLP IS RANDOM) AND CONTINUE
- ;PADDING EACH OCCURRANCE OF A GROUP
- ;OF SPACES UNTIL THE TWO POINTERS ARE EQUAL
- ;TO EACH OTHER
-
- TOTL: CALL RAND ;INIT SFLP
- STA SFLP
- LHLD LEND
- XCHG
- LHLD LADR
- LDA LPOS
- MOV C,A
- MVI B,0 ;MAKE SURE SP IS FOUND
- CALL TDHE ;DE .EQ. HL MEANS PAD DONE
- JZ OUTL
-
- ;RIGHT AND PAD
-
- RITE: MOV A,M ;PICK UP FROM LEFT
- STAX D ;STORE AT RIGHT
- CPI ' ' ;TEST PICKED UP CHAR
- JNZ WORD
- MVI B,1 ;NOTE THAT SP WAS FOUND
- LDA SFLP ;TST IF WE CAN INSERT YET
- ORA A ;TEST FOR ZERO
- JZ PADD ;CAN'T INSERT YET
- DCR A
- STA SFLP
- JMP WORD ;NOT YET
- PADD: LDA LCHR ;CHECK IF GROUP OF SPACES
- CPI ' ' ;DON'T ALLOW THIS COND.
- JZ WRD1
- MVI A,' ' ;PADDING DONE HERE
- DCX D
- STAX D
- CALL TDHE
- JZ OUTL
- WORD: MOV A,M
- STA LCHR
- WRD1: DCX D ;REST OF RIGHT AND PAD LOOP
- DCX H
- DCR C
- LDA BRTB ;ALLOWS INDENTION
- CMP C
- JZ LEFT ;HIT INDENTATION
- LDA LMAR ;OR LEFT MARGIN
- CMP C
- JNZ RITE ;CAN STILL PROCEED
-
- ;PUSH LEFT AND TRY AGAIN
-
- LEFT: INX D
- INX H
- INR C
- LDAX D
- MOV M,A
- CPI CR
- JNZ LEFT
- XRA A ;TEST IF ONE SP FOUND
- ORA B
- JZ OUTL ;NOPE, NOT ONE SP FOUND
- JMP RITE
-
- ;OUTPUT A COMPLETE FORMATTED LINE FROM OUTBUF
-
- OUTL: LDA DBLPF ;GET THE DOUBLE FLAG
- MOV C,A
- OUTL1: LXI H,OUTBUF ;GET THE LINE
- OUTM: MOV A,M
- INX H
- CPI CR
- JZ OUTM1
- CALL OUTW
- JMP OUTM
- OUTM1: MVI A,CR ;DO A CR
- CALL OUTW
- MOV A,C
- DCR C
- ORA A
- JNZ OUTL1
- EOL: CALL NEWL ;CLEAN OUTBUF
- LDA SPAS ;PROCESS SPACING
- MOV C,A
- EOLP: CALL CRLF
- LDA PPOS ;UPDATE TEXT PAGE POSITION
- INR A
- STA PPOS
-
- IF VIEWCRT
- LDA VIEW ;IS THIS A VIEW?
- ORA A
- JZ EOLP1
- LDA CRTPOS
- INR A
- STA CRTPOS
- CPI CRTLN ;END OF A SCREEN?
- JC EOLP1
- CALL ABTST ;YES - WAIT FOR TYPE AT CONSOLE
- MVI A,1
- STA CRTPOS ;RESET CRT POSITION
- ENDIF
-
- EOLP1: LDA PPOS
- LXI H,PLEN
- CMP M
- JNC EOXP
- DCR C
- JNZ EOLP
- JMP RSTR
- EOXP: CALL NEXP ;NEED A NEW PAGE!
-
- ;RESTORE OVERFLOW FROM TEML
- ;INTO OUTBUF STARTING AT LMAR
-
- RSTR: LXI D,TCNT
- LDAX D
- ORA A
- RZ
- LXI H,TEML-1
- MOV C,A
- DCR C
- CALL ADAH
- MOV A,M
- CPI ' ' ;PREVENT FIRST BEING SPACE
- MOV A,C
- STAX D
- JZ RSTR
-
- ;FIRST NOT SPACE
-
- INR C
- LDA LMAR
- ADD C
- STA LPOS
- XCHG
- LHLD LADR
- RSTL: LDAX D
- MOV M,A
- DCX D
- INX H
- DCR C
- JNZ RSTL
- SHLD LADR
- XRA A
- STA TCNT
- RET
-
-
- ;UNFORMATTED OUTPUT ROUTINE
- ;EQUIVALENT TO FMAT, BUT NO JUSTIFICATION
- ;IF TEXT EXCEEDS RMAR, THEN A CR IS FORCED AND A
- ;NEW LINE IS STARTED
-
- UFMT: CPI 9 ;TEST TAB
- JZ TBST
- CPI LF ;IGNORE LINE FEEDS
- RZ
- CPI CR ;TEST CARRIAGE RETURN
- LHLD LADR
- MOV M,A ;INSERT AS EOL
- JZ OUTL
- INX H
- SHLD LADR
- LXI H,RMAR ;TEST IF FULL
- LDA LPOS
- INR A
- STA LPOS
- DCR A
- CMP M
- RC
-
- ;HERE, OUTBUF IS FULL SO FORCE CR AND CONTINUE
-
- LHLD LADR
- MVI M,CR
- JMP OUTL
-
- ;OUTPUT OUTBUF IF ANYTHING IN IT
-
- CLOS: LXI H,LMAR
- LDA LPOS
- CMP M
- RZ
- RC
- LHLD LADR
- MVI M,CR
- LDA JFLG ;SEE IF RIGHT JUSTIFICATION
- CPI 3
- JNZ CLOS1
- LHLD LEND
- INX H
- SHLD LEND
- LDA LPOS
- INR A
- STA LPOS
- JMP RIGHT
- CLOS1: JMP OUTL
-
- ;OUTPUT BOTTOM OF PAGE, THE DIVIDER, AND
- ;THE TOP OF THE NEXT PAGE
-
- NEXP: LDA BLEN ;GET BOTTOM LENGTH
- ORA A
- JZ LASTPG ;NO BOTTOM
- MOV C,A
- LDA FFLG ;ARE WE USING FORM FEEDS?
- ORA A
- JZ NPBL
-
- ;FORM-FEED BOTTOM ROUTINES
-
- LDA BOTN ;IS THERE A BOTTOM LINE?
- ORA A
- JNZ NPBLF
- CALL CRFF ;NO, SO END IT
- JMP LASTPG
-
- NPBLF: LDA BOTN ;CHECK IF LINE FOR MESSAGE
- CMP C
- CZ BMSG ;YES, OUTPUT IT
- LDA BOTN
- CMP C
- JZ NPBLF1 ;AND END IT
- CALL CRLF
- DCR C
- JNZ NPBLF
- JMP LASTPG
-
- NPBLF1: CALL CRFF
- JMP LASTPG
-
- ;NO-FORM-FEED BOTTOM ROUTINE
-
- NPBL: LDA BOTN ;CHECK IF AT LINE FOR MSG OUT
- CMP C
- CZ BMSG ;YES, OUTPUT IT
- CALL CRLF
- DCR C
- JNZ NPBL
-
- ;DETERMINE IF LAST PAGE IN FILE
-
- LASTPG: LDA EOT
- ORA A
- RZ ;ZERO SAYS EOF ENCOUNTERED
-
- ;START A NEW PAGE NOW
-
- DVDR: MOV H,A
- MVI A,1 ;SET THE "START OF TEXT" FLAG
- STA SOT
-
- IF VIEWCRT
- LDA VIEW ;IS THIS A VIEW?
- ORA A
- JZ DVDR2
- MVI A,1 ;RESET CRT POSITION
- STA CRTPOS
- LXI H,VPGMSG ;SEND END-OF-PAGE MESSAGE
- CALL TXTYP
- CALL ECHO1
- CALL ABTST
- JMP DVDR1
- ENDIF
-
- DVDR2: LDA WAIT ;DO WE WAIT FOR NEXT PAGE?
- ORA A
- MOV A,H
- JNZ DVDR1
-
- ;OUTPUT WARNING TO CONSOLE AND WAIT FOR "GO"
-
- LXI H,PAGMS
- CALL TXTYP
- CALL ECHO1
- CALL ABTST ;ABORT IF CTRL-C
-
- DVDR1: LXI H,PAGN
- INR M
- NEWP: LDA TLEN ;GET TOP LENGTH
- ORA A
- JZ NPXT ;NO TOP PLEASE
- MOV C,A
- NPTL: LDA TOPN ;EQUAL LINE FOR MSG OUTPUT?
- CMP C
- CZ TMSG ;YES, PRINT IT
- CALL CRLF
- DCR C
- JNZ NPTL
- NPXT: XRA A
- STA PPOS
-
- IF VIEWCRT
- LDA TLEN
- STA CRTPOS
- XRA A
-
- ENDIF
- RET
-
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
- ; **9** POW UTILITY ROUTINES
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- ;GET CHARACTER FROM CONSOLE
- ;TEST FOR ABORT (CTRL C)
-
-
- ABTST: CALL CI
- CPI 3
- RNZ ;NOPE
- JMP MAIN ;RETURN TO MENU
-
-
- ;ADDRESS TEST FOR OVERFLOW
- ;HL=ADDRESS TO TEST
- ;RETURN CARRY SET IF OVERFLOW
-
- IF BIGFILE
- ADDTST: LDA MEMSIZ+1 ;TEST HIGH BYTE ONLY
- CMP H ;SINCE LIMIT IS ON PAGE BOUNDRY
- RNZ
- STC
- RET
- ENDIF
-
-
- ;CONVERT ASCII NUMBER TO BINARY
- ;ADDRESS IN HL ON ENTRY, SAVED IN APNT ON EXIT
- ;RETURN WITH VALUE IN HL
-
-
- ADEC: PUSH H
- POP B
- LXI H,0
- ADE1: LDAX B
- CALL NMCK ;CHECK FOR DECIMAL NUMBER
- JC ADE2
- INX B
-
- IF BIGFILE
- PUSH B ! PUSH H
- POP B ! POP H
- CALL BUFTST
- PUSH B ! PUSH H
- POP B ! POP H
- ENDIF
-
- MOV D,H
- MOV E,L
- DAD H
- DAD H
- DAD D
- DAD H
- SUI 48
- MOV E,A
- MVI D,0
- DAD D
- JMP ADE1
- ADE2: PUSH B
- XTHL
- SHLD APNT
- POP H
- RET
-
-
- ;BINARY TO DECIMAL CONVERT CONTENTS OF A REG
- ;DIRECT OUTPUT TO PRINTER,COMPLETE WITH ZERO
- ;SUPPRESSION
-
-
- BIND: PUSH H ! PUSH D ! PUSH B
- MVI E,0
- LDA PAGN
- MVI C,100
- CALL BIDA
- MVI C,10
- CALL BIDA
- ADI '0'
- POP B ! POP D ! POP H
- RET
-
- BIDA: MVI B,'0'-1
- INR B
- SUB C
- JNC BIDA+2
- ADD C
- MOV D,A
- MOV A,B
- CPI '0'
- JNZ BINZ
- MOV A,E
- ORA A
- MOV A,D
- RZ
- BINZ: INR E
- MOV A,B
- CALL OUTC
- MOV A,D
- RET
-
-
- ;OUTPUT BOTTOM OF PAGE MESSAGE
-
-
- BMSG: PUSH B
- LDA STMS ;NO MSG IF PAGE NUMBER LESS THAN "STMS"
- MOV C,A
- LDA PAGN
- CMP C
- POP B
- RC
- MOV A,C
- STA TSTG ;SAVE PRESENT LINE COUNT
-
- IF NOT BIGFILE
- LHLD BOTA ;GET ADDRESS
- ENDIF
-
- IF BIGFILE
- LXI H,BOTBUF ;GET BUFFER
- ENDIF
-
- LDA BOTT ;AND TAB POSITION
- CALL DIROUT ;PRINT IT
- RET
-
-
- ;FILL A TEMPORARY BUFFER (IN DE) OF SIZE (IN B) FROM
- ;MEMORY (STARTING AT HL) UNTIL CR IS FOUND
-
-
- IF BIGFILE
- BUFILL: MOV A,M
- STAX D
- INX H
- CALL BUFTST
- INX D
- CPI CR ;WAS LAST A CR?
- RZ
- DCR B
- JNZ BUFILL
- MVI A,CR
- DCX D
- STAX D
- RET
- ENDIF
-
-
- ;TEST FOR MEMORY OVERFLOW DURING TEXT PROCESSING
- ;ON ENTRY HL=NEXT ADDRESS DESIRED
-
-
- IF BIGFILE
- BUFTST: PUSH B ! PUSH D ! PUSH H
- STA ACCSAV ;SAVE ACCUM
- CALL ADDTST ;TEST OVERFLOW
- JNC BUFTS2 ;O.K.
- LXI H,BUFMSG
- CALL TXTYP ;TYPE MESSAGE
- CALL ECHO1
-
- ;1) MOVE TOP OF BUFFER TO BOTTOM
-
- LXI H,NMOVED
- MOV B,M
- LHLD TMOVED
- XCHG
- LHLD MEMSIZ
- DCX D
- BUFTS1: MOV A,M
- STAX D
- DCX D
- DCX H
- DCR B
- JNZ BUFTS1
-
- ;2) RESET OVERFLOW FLAG
-
- LXI H,MEMOVF
- MVI M,0
-
- ;3) READ ANOTHER BUFFER FULL
-
- LHLD TMOVED
- CALL TPLP
-
- ;4) RESET TEXT POINTERS
-
- LXI B,APNT
- LXI D,APNT
- LXI H,OFFSET
- CALL SUB2
- POP H
- SHLD HLVAL
- LXI B,HLVAL
- LXI D,HLVAL
- LXI H,OFFSET
- CALL SUB2
- LHLD HLVAL
- PUSH H
-
- BUFTS2: LDA ACCSAV ;RESTORE ACCUM
- POP H ! POP D ! POP B
- RET
- ENDIF
-
-
- ;CASE PROCESSING SUBROUTINE
- ;RETURN WITH CARRY SET IF CHAR IS TO BE
- ;IGNORED. (IE WAS A SHIFT COMMAND)
-
- ;CHECK IF UPSHIFT OR DOWNSHIFT COMMAND
-
- CAPR: CPI UPSHFT ;UPSHIFT?
- JZ UCAS
- CPI DNSHFT ;DOWNSHIFT?
- JZ LCAS
-
- ;CHECK AND PROCESS UPPER AND LOWER CASE
-
- MOV B,A
- LDA CASE
- CPI 3
- JZ CASX ;ZERO SAYS SHIFT LOCKED UP
-
- ;LAND HERE, EITHER SINGLE SHIFT OR LOWER CASE
- ;TEST FOR SINGLE SHIFT
-
- CPI 1 ;1=SINGLE SHIFT
- MVI A,0 ;Z FLAG STILL PRESERVED
- STA CASE ;CLEAR IT ANYWAY
- JZ CASX ;ZERO SAYS SINGLE SHIFT
-
- ;LAND HERE, LOWER CASE COND
- ;TEST IF IT IS ALPHA
-
- MOV A,B
- CPI 'A'
- JC CASX ;NOT ALPHA
- CPI 'Z'+1
- JNC CASX ;NOT ALPHA
-
- ;LAND HERE, CONVERT TO LOWER CASE
-
- MVI A,20H
- ORA B
- MOV B,A
-
- ;EXIT WITH CARRY BIT CLEAR
-
- CASX: ORA A
- MOV A,B
- RET
-
- ;PROCESS UNSHIFT OR LOWER CASE MODE
-
- LCAS: XRA A
- JMP NOLCK
-
- ;PROCESS SHIFT (EITHER SINGLE OR SHIFT LOCK)
-
- UCAS: LDA CASE
- CPI 1
- JZ LOCK
- MVI A,1 ;SINGLE SHIFT
- JMP NOLCK
- LOCK: MVI A,3
- NOLCK: STA CASE
- STC ;SET CARRY, IGNORE LETTER
- RET
-
-
- ;FIND DELIMITER WITHIN A COMMAND
- ;SPACE AND COMMA ARE ACCEPTED
-
-
- CDEL: LHLD APNT
- MOV A,M
- INX H
-
- IF BIGFILE
- CALL BUFTST
- ENDIF
-
- CPI ','
- RZ
- CPI ' '
- RZ
- DCX H
- RET
-
-
- ;DIRECTLY OUTPUT MESSAGE LINE TO PRINTER
- ;DOES NOT USE OR DESTROY OUTBUF AND ITS CONTENTS
-
-
- DIROUT: SHLD DIRMSG ;SAVE MESSAGE
- STA DIRTAB ;AND TAB
- LDA DBLPF ;GET DOUBLE COUNT
- MOV B,A
- LDA CASE ;SAVE TEXT CASE
- PUSH PSW
- DIRDBL: LHLD DIRMSG ;GET MESSAGE
- LDA DIRTAB ;GET TAB
- MOV C,A
- MVI A,3 ;RESET TO DEFAULT CASE
- STA CASE
- DIROU1: MVI A,' ' ;SPACE OVER TO TAB
- CALL OUTW
- DCR C
- JNZ DIROU1
- PUSH B
- DIROU2: MOV A,M ;OUTPUT THE MESSAGE
- INX H
- CALL CAPR ;DO CASE PROCESSING
- JC DIROU2 ;IGNORE LAST CHAR
- CPI ':' ;SUBSTITUTE THE PAGE NUMBER
- CZ BIND ;AT OCCURANCE OF COLON
- CPI CR ;QUIT AT CR
- JZ DIROU3
- CALL OUTW
- JMP DIROU2
- DIROU3: MVI A,CR ;DO A CR
- CALL OUTW
- POP B
- MOV A,B
- DCR B
- ORA A
- JNZ DIRDBL ;PRINT AGAIN
- POP PSW ;RESTORE TEXT CASE
- STA CASE
- LDA TSTG ;RESTORE LINE COUNT
- MOV C,A
- RET
-
-
- ;DISK AND TAPE INPUT ROUTINE
-
-
- FDIN: CALL INIR ;OPEN THE FILE
- LXI H,TEXT ;POINT TO START OF TEXT BUFFER
- CALL TPLP ;READ THE DATA
- RET
-
-
- ;DO LINE FEEDS AND KEEP TRACK OF POSITION ON PAGE.
- ;IF NEW PAGE, REST OF LF COMMAND IS FORGOTTEN.
-
-
- LFDO: CALL CLOS
- LDA CETM
- ORA A
- RZ
- MOV C,A
- LFLP: CALL CRLF
- LDA PPOS
- INR A
- STA PPOS
-
- IF VIEWCRT
- LDA VIEW ;IS THIS A VIEW?
- ORA A
- JZ LFLP1
- LDA CRTPOS
- INR A
- STA CRTPOS
- CPI CRTLN ;END OF A SCREEN?
- JC LFLP1
- CALL ABTST ;YES - WAIT FOR TYPE AT CONSOLE
- MVI A,1
- STA CRTPOS ;RESET CRT POSITION
- ENDIF
-
- LFLP1: LDA PPOS
- LXI H,PLEN
- CMP M
- JNC NEXP
- DCR C
- RZ
- JMP LFLP
-
-
- ;TEST FOR MEMORY OVERFLOW DURING TEXT INPUT
- ;ON ENTRY HL=NEXT ADDRESS DESIRED
-
-
- IF BIGFILE
- MEMTST: PUSH B ! PUSH D ! PUSH H
- STA ACCSAV ;SAVE ACCUM
- CALL ADDTST ;TEST OVERFLOW
- JNC MEMTS2 ;O.K.
-
- ;IF HERE, THEN OVERFLOW MUST BE TRAPPED
-
- LDA MSGOVF ;CHECK MESSAGE FLAG
- ORA A
- JNZ MEMTS1 ;IF SET, DON'T PRINT MESSAGE AGAIN
- MVI A,0FFH ;SET MESSAGE FLAG
- STA MSGOVF
- LXI H,MEMMSG
- CALL TXTYP ;TYPE MESSAGE
- CALL ECHO1
-
- MEMTS1: LXI H,MEMOVF
- MVI M,0FFH ;SET OVERFLOW FLAG
-
- MEMTS2: LDA ACCSAV ;RESTORE ACCUM
- POP H ! POP D ! POP B
- RET
- ENDIF
-
-
- ;INITIALIZE CENBUF FOR NEW CENTERED LINE
-
-
- NEWCB: LXI H,CENBUF ;FILL WITH SPACES
- LDA CBSZ
- MOV C,A
- MVI A,' '
- NEWCB1: MOV M,A
- INX H
- DCR C
- JNZ NEWCB1
- RET
-
-
- ;INITIALIZE OUTBUF FOR NEW FORMATTED LINE
-
-
- NEWL: LXI H,OUTBUF ;FILL WITH SPACES
- LDA MAXL
- MOV C,A
- MVI A,' '
- NEWL1: MOV M,A
- INX H
- DCR C
- JNZ NEWL1
- LXI H,OUTBUF ;COMPUTE LEFT MARGIN ADDR
- LDA LMAR
- CALL ADAH
- SHLD LADR
- LDA LMAR ;SET POSITION COUNTER
- STA LPOS
- LXI H,OUTBUF ;COMPUTE RIGHT MARGIN ADDR
- LDA RMAR
- CALL ADAH
- SHLD LEND
- MVI M,CR ;EOL AT RIGHT
- RET
-
-
- ;OUTPUT A CENTER MESSAGE
- ;THIS IS A MODIFIED VERSION OF THE "OUTL" ROUTINE
- ;FOR :CM, :CT, AND :CC ONLY
-
-
- OUTCEN: LDA CUNLF ;GET THE UNDERLINE FLAG
- ORA A
- JZ OUTCN5
-
- ;PROCESS UNDERLINE FIRST
- ;IN CASE WE DON'T DEFEAT THIS IN VIEW MODE
- ;ELSE UNDERLINE WILL OVERWRITE TEXT ON CRT
-
- LDA CDBLF ;GET THE DOUBLE COUNT
- MOV C,A
-
- OUTCN1: LXI H,CENBUF ;GET THE MESSAGE
-
- OUTCN2: MOV A,M
- INX H
- CPI CR
- JZ OUTCN4
- CPI ' ' ;IS IT SPACE?
- JZ OUTCN3 ;SKIP IT
- MVI A,'_' ;ELSE PRINT UNDERLINE
-
- OUTCN3: CALL OUTW
- JMP OUTCN2
-
- OUTCN4: MVI A,CR ;DO A CR
- CALL OUTW
- MOV A,C ;TEST FOR DOUBLE
- DCR C
- ORA A
- JNZ OUTCN1
-
- ;PROCESS THE CENTER MESSAGE
-
- OUTCN5: LDA CDBLF ;GET THE DOUBLE COUNT
- MOV C,A
-
- OUTCN6: LXI H,CENBUF ;GET MESSAGE AGAIN
-
- OUTCN7: MOV A,M
- INX H
- CPI CR
- JZ OUTCN8
- CALL OUTW
- JMP OUTCN7
-
- OUTCN8: MVI A,CR ;DO A CR
- CALL OUTW
- MOV A,C
- DCR C
- ORA A
- JNZ OUTCN6
-
- JMP EOL ;GO TO NORMAL END OF LINE ROUTINE
-
-
- ;CONVERT TABS TO CORRECT POSITION
-
-
- TBST: LDA LPOS
- MOV C,A
- LXI D,TTAB
-
- ;SEARCH TTAB FOR NEXT GREATEST LOCATION
-
- TBST1: LDAX D
- INX D
- CMP C
- JZ TBST1
- JNC GOTB
- CPI 0
- JNZ TBST1
-
- ;NO MORE TABS IN TABLE
-
- JMP CLOS
-
- ;GOT GOOD TAB, UPDATE POINTERS
-
- GOTB: LXI H,RMAR
- CMP M
- JNC CLOS
- PUTB: STA LPOS
- LXI H,OUTBUF
- CALL ADAH
- SHLD LADR
- RET
-
-
- ;OUTPUT TOP OF PAGE MESSAGE
-
-
- TMSG: PUSH B
- LDA STMS ;NO MSG IF PAGE NUMBER LESS THAN "STMS"
- MOV C,A
- LDA PAGN
- CMP C
- POP B
- RC
- MOV A,C
- STA TSTG ;SAVE PRESENT LINE COUNT
-
- IF NOT BIGFILE
- LHLD TOPA ;GET ADDRESS
- ENDIF
-
- IF BIGFILE
- LXI H,TOPBUF ;GET BUFFER
- ENDIF
-
- LDA TOPT ;AND TAB POSITION
- CALL DIROUT ;PRINT IT
- RET
-
-
- ;TEXT INPUT LOOP
- ;STARTING ADDRESS FOR TEXT BUFFER MUST BE IN HL AT START
-
-
- IF BIGFILE
- TPLP: CALL MEMTST ;SEE IF OVERFLOW
- XCHG
- LXI H,MEMOVF
- MOV A,M
- XCHG
- ORA A ;NON-ZERO MEANS BUFFER FULL
- RNZ
- CALL GBYT ;OK - GET NEXT BYTE
- ENDIF
-
- IF NOT BIGFILE
- TPLP: CALL GBYT ;GET NEXT BYTE
- ENDIF
-
- MOV M,A ;STORE IN BUFFER
- INX H
- JNC TPLP ;EOF WILL SET CARRY
-
- ;FOR TAPE, I WOULD CHECK FOR VALUE LESS THAN 3
- ;IE BINARY 1=EOF FOR TAPE
- ;AND CARRY SET = EOF FROM FDOS
-
- DCX H ;MARK EOF AT END OF TEXT
- MVI M,1
- RET
-
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
- ; **10** SUPPORT UTILITY ROUTINES
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- ;ADD A TO HL
-
-
- ADAH: ADD L
- MOV L,A
- RNC
- INR H
- RET
-
-
- ;TWO BYTE ADD
- ;BC=ADDR OF FIRST, HL=ADDR OF SECOND, DE=ADDR OF RESULT
-
- IF BIGFILE
- ADD2: PUSH B ! PUSH D ! PUSH H
- XRA A
- LDAX B
- ADC M
- STAX D
- INX B
- INX D
- INX H
- LDAX B
- ADC M
- STAX D
- POP H ! POP D ! POP B
- RET
- ENDIF
-
-
- ;GET CHAR FROM CONSOLE
-
-
- CI: PUSH H ! PUSH D ! PUSH B
- MVI C,1
- CALL BDOS
- CALL MAPUC ;MAP TO UPPER CASE
- POP B ! POP D ! POP H
- RET
-
-
- ;CONSOLE OUTPUT OF CHARACTER (ECHOS TOO)
-
-
- CO: PUSH H ! PUSH D ! PUSH B
- MOV E,C
- MVI C,2
- CALL BDOS
- POP B ! POP D ! POP H
- RET
-
-
- ;OUTPUT CARRAGE RETURN AND FORM FEED TO PRINTER
- ;RETURNS WITH CR IN A
-
-
- CRFF: MVI A,CR
- CALL OUTW
- MVI A,FF
- CALL OUTW
- MVI A,CR
- RET
-
-
- ;OUTPUT CARRAGE RETURN AND LINE FEED TO PRINTER
- ;RETURNS WITH CR IN A
-
-
- CRLF: MVI A,CR
- CALL OUTW
- MVI A,LF
- CALL OUTW
- MVI A,CR
- RET
-
-
- ;CONSOLE STATUS CHECK.
- ;RETURNS A NON-ZERO IF KEY PRESSED AT CONSOLE
-
-
- CSTS: PUSH H ! PUSH D ! PUSH B
- MVI C,11
- CALL BDOS
- POP B ! POP D ! POP H
- RET
-
-
- ;ECHOS ON CONSOLE AND OUTS CRLF
-
-
- ECHO: CALL CO
- ECHO1: PUSH B
- MVI C,CR
- CALL CO
- MVI C,LF
- CALL CO
- POP B
- RET
-
-
- ;GET A CHARACTER FROM DISK FILE
-
-
- GBYT: PUSH H
- CALL DISKIN
- POP H
- RET
-
-
- ;INITIALIZE TO READ DISK FILE
-
-
- INIR: CALL ECHO1 ;CRLF TO CONSOLE
- LXI H,GREET
- CALL TXTYP
- CALL TXTIN
- CALL ECHO1 ;CRLF TO CONSOLE
- LXI H,CONBUF+2 ;+2 FOR COUNTS
- LXI D,INFCB ; A LA CP/M FORMAT
- CALL MTFCB ;LIB ROUTINE TO MAKE FCB
- JC INIR ;ERROR, TRY AGAIN
- CALL OPENF ;FCB OK, OPEN IT
- JC INIR ;ERROR, TRY AGAIN
- LXI H,INBUF+128 ;INIT. FOR DISKIN
- SHLD INPTR
- RET
-
-
- ;MAP CHARACTER IN "A" TO UPPER CASE
-
-
- MAPUC: CPI 'a'
- JC MAPEND
- CPI 'z'+1
- JNC MAPEND
- SUI 20H
- MAPEND: ORA A ;CLEAR CARRY
- RET
-
-
- ;CHECK FOR DECIMAL NUMBER IN ASCII
-
-
- NMCK: CPI '0'
- RC
- CPI '9'+1
- CMC
- RET
-
-
- ;OPEN FILE
-
-
- OPENF: LXI D,INFCB
- MVI C,15 ;CPM FUNCTION FOR OPEN
- CALL BDOS
- CPI 255 ;FAILED TO OPEN IF = 255
- CMC
- RNZ
- LXI H,NOFMS ;FILE NOT FOUND MSG
- CALL TXTYP
- STC
- RET
-
-
- ;PRINTER OUTPUT PROCESSING
-
-
- OUTC: CPI CR
- JZ CRLF
- OUTW: PUSH B
- ANI 01111111B ;MASK OFF HIGH BIT - NEED FOR QSPACE
- MOV C,A
- LDA OPST ;TEST IF OUTPUT ON
- ORA A
- JZ OUTW1
-
- IF NOT VIEWCRT
- CALL PO
- ENDIF
-
- IF VIEWCRT
- LDA VIEW ;IS THIS A VIEW?
- ORA A
- JZ OUTWA
- CALL CO
- JMP OUTW1
- OUTWA: CALL PO
- ENDIF
-
- OUTW1: CALL CSTS
- ORA A
- CNZ ABTST ;KEY PRESSED ON CONSOLE
- MOV A,C
- POP B
- RET
-
-
- ;SEND A CHARACTER TO THE PRINTER
-
-
- PO: PUSH H ! PUSH D ! PUSH B
- MOV E,C
- MVI C,5 ;LIST OUT FUNCTION
- CALL BDOS
- POP B ! POP D ! POP H
- RET
-
-
- ;GENERATE PSEUDORANDOM NUMBER 0-15
-
-
- RAND: LXI H,RNDV
- RND1: MOV A,M
- RLC
- INR A
- RLC
- RLC
- XRA M
- MOV M,A
- ANI 0FH
- RET
-
-
- ;TWO BYTE SUBTRACT
- ;BC=ADDR OF FIRST, HL=ADDR OF SECOND, DE=ADDR OF RESULT
-
- IF BIGFILE
- SUB2: PUSH B ! PUSH D ! PUSH H
- XRA A
- LDAX B
- SBB M
- STAX D
- INX B
- INX D
- INX H
- LDAX B
- SBB M
- STAX D
- POP H ! POP D ! POP B
- RET
- ENDIF
-
-
- ;TEST DE .EQ. HL
- ;RETURN ZERO IF SO
-
-
- TDHE: MOV A,D
- CMP H
- RNZ
- MOV A,E
- CMP L
- RET
-
-
- ;INPUT A LINE OF TEXT FROM CONSOLE
-
-
- TXTIN: PUSH H ! PUSH D ! PUSH B
- LXI D,CONBUF+65
- MVI C,65 ;CLEAR BUFFER TO SPACES
- MVI A,' '
- TXTN1: STAX D
- DCX D
- DCR C
- JNZ TXTN1
- MVI C,10
- CALL BDOS
- POP B ! POP D ! POP H
- RET
-
-
- ;TYPE A LINE OF TEXT ON CONSOLE
-
-
- TXTYP: PUSH H ! PUSH D ! PUSH B
- XCHG
- MVI C,9
- CALL BDOS
- POP B ! POP D ! POP H
- RET
-
-
- ;++++++++++++++++++++++++++++++++++++++++++++++
- ;
- ; MAKE CP/M FILE CONTROL BLOCK
- ;
- ; MAKEFCB.LIB - VERSION 0.2 - 28 OCT 77
- ;
- ; JEFFREY W. SHOOK
- ; P.O. BOX 185
- ; ROCKY POINT, NEW YORK 11778
- ; (516) 744 7133
- ;
- ; ADDED CALLS TO MAPUC 17-FEB-82 (WRB)
- ;++++++++++++++++++++++++++++++++++++++++++++++
-
- ; CREATE A CP/M FILE CONTROL BLOCK FROM
- ; A COMMAND STRING AT THE ADDRESS IN HL
- ; AND PLACE IT AT THE ADDRESS IN DE. RETURN
- ; WITH THE CARRY SET IF AN ERROR OCCURS.
-
- ; DEFINITIONS
-
- FCBSIZ: EQU 33
- FNMLEN: EQU 11 ; FILE NAME LENGTH
-
- MTFCB: PUSH H ; SAVE CMD STRING PTR
- PUSH D ; SAVE FCB ADDRESS
-
- LXI B,FCBSIZ; CLEAR ENTIRE FCB AREA
- MVI A,0
- CALL FILLB
-
- POP D ; FILL FILE NAME WITH SPACES
- PUSH D
- INX D
- LXI B,FNMLEN
- MVI A,' '
- CALL FILLB
-
- POP D ; RESTORE POINTERS
- POP H
-
- CALL SKIPS ; SKIP LEADING SPACES
-
- INX H ; CHECK FOR DISK CODE
- MOV A,M
- DCX H
- CPI ':'
- JNZ MTFCB1 ; JUMP ON NO CODE
-
- MOV A,M ; TEST IF DISK CODE GOOD
- CALL MAPUC ; MAKE IT UPPER CASE
- INX H
- INX H
- SBI '@'
- RC ; MAKE ERROR RETURN IF BAD
- CPI 'Z'+1
- CMC
- RC
-
- STAX D ; STORE DISK CODE AT FCB + 0
- MTFCB1: INX D
-
- MVI C,8 ; PROCESS FILE NAME FIELD
- CALL GETNAM
-
- MOV A,M ; TEST FOR FILE TYPE SEPARATOR
- INX H
- CPI '.'
- JNZ MTFCB2
-
- MVI C,3 ; PROCESS FILE TYPE FIELD
- CALL GETNAM
- MOV A,M
- INX H
-
- MTFCB2: CALL TERMT ; TEST FOR CORECT TERMINATOR
- RET
-
- ; PROCESS NAME FIELD
-
- GETNAM: MOV A,M ; GET CHAR FROM CMD STR
- CALL MAPUC ; MAKE IT UPPER CASE
- INX H
-
- CPI '?' ; ALLOW AMBIG REFERENCE CHAR
- JZ GETNA1
-
- CPI '*' ; FILL REST WITH ?
- JZ GETNA2
-
- CALL VALCHR ; TEST FOR ALLOWED CHAR IN NAME
- JC GETNA3
-
- GETNA1: STAX D ; STORE CHAR IN TFCB
- INX D
-
- DCR C ; CHECK NAME SIZE
- JNZ GETNAM
- RET
-
- GETNA2: MVI A,'?' ; FILL REST OF FIELD WITH ?
- MVI B,0
- JMP FILLB
-
- GETNA3: INX D ; MOVE FCB PTR TO END OF FIELD
- DCR C
- JNZ GETNA3
- DCX H
- RET
-
- ; TEST FOR VALID CHAR IN NAME FIELD
- ; RETURN WITH CARRY SET IF INVALID.
-
- VALCHR: CPI '*'
- CMC
- RZ
- CPI ','
- CMC
- RZ
- CPI '.'
- CMC
- RZ
- CPI ' '
- RC
- CPI '^'+1
- CMC
- RC
- CPI ':'
- CMC
- RNC
- CPI '@'
- RET
-
- ; TEST FOR VALID FILENAME TERMINATOR CHAR
- ; RETURN WITH CARRY SET IF INVALID.
-
- TERMT: CPI ' '
- RZ
- CPI ','
- RZ
- CPI CR
- RZ
- CPI ';'
- RZ
- STC
- RET
-
- ; SKIP SPACES IN CMD STRING
-
- SKIPS: MVI A,' '
- SKIPS1: CMP M
- RNZ
- INX H
- JMP SKIPS1
-
- ; FILL BLOCK WITH VALUE
-
- ; ENTER WITH:
- ; A = VALUE FOR FILL
- ; DE = START OF BLOCK
- ; BC = LENGTH OF BLOCK
-
- CLRB: MVI A,0
-
- FILLB: INR B
- DCR B
- JNZ FILLB1
- INR C
- DCR C
- RZ
-
- FILLB1: STAX D
-
- INX D
- DCX B
- JMP FILLB
-
-
-
- ;++++++++++++++++++++++++++++++++++++++++++++++
- ;
- ; SEQUENTIAL DISK CHARACTER INPUT
- ;
- ; DISKIN.LIB - VERSION 1.0 - 18 SEP 77
- ;
- ; J.W. SHOOK, P.O. BOX 185, ROCKY POINT, NY 11778
- ;
- ; ADDED HIGH BIT MASK AND CPMEOF 17-FEB-82 (WRB)
- ;++++++++++++++++++++++++++++++++++++++++++++++
-
- ; BEFORE READING A FILE SEQUENTIALLY
- ; THE FOLLOWING INITIAL CONDITIONS
- ; MUST BE ESTABLISHED.
-
- ; 1) A CP/M FILE CONTROL BLOCK
- ; CONTAINING THE FILE NAME MUST
- ; START AT LOCATION INFCB.
- ; 2) A 128 BYTE BUFFER AREA MUST
- ; START AT LOCATION INBUF.
- ; 3) THE FILE MUST BE SUCCESSFULLY
- ; OPENED.
- ; 4) THE NEXT RECORD POINTER IN
- ; THE FILE CONTROL BLOCK MUST BE
- ; SET TO ZERO.
- ; 5) THE WORD AT LOCATION INPTR
- ; MUST BE SET TO INBUF+128 TO
- ; MARK THE BUFFER AS EMPTY.
- ; 6) TO READ A FILE AGAIN, JUST SET
- ; NEXT RECORD TO ZERO, AND
- ; RESET INPTR.
-
- ; READ CHARACTER FROM FILE
-
- DISKIN: LHLD INPTR ; TEST BUFFER POINTER
- LXI D,-(INBUF+128)
- DAD D
- MOV A,H
- ORA L
- CZ RDREC ; IF EMPTY, READ NEXT RECORD
- RC ; RETURN ON BAD READ
- LHLD INPTR ; GET CHAR FROM BUFFER
- MOV A,M
- ANI 01111111B ;MASK OFF HIGH BIT - NEED FOR QSPACE
- CPI CPMEOF ; IS THIS AN EOF CHARACTER?
- JNZ DISKN1
- STC ; MAKE SURE CARRY IF EOF
- JMP DISKN2
- DISKN1: ORA A ; MAKE SURE NO CARRY IF NOT EOF
- DISKN2: INX H ; MOVE BUFFER POINTER
- SHLD INPTR
- RET
-
-
- ; REFILL DISK INPUT BUFFER
-
- RDREC: LXI D,INBUF ; SET DMA ADDRESS
- MVI C,26
- CALL BDOS
- LXI D,INFCB ; READ A RECORD
- MVI C,20
- CALL BDOS
- RAR ; SET CARRY ON BAD READ
- LXI H,INBUF ; SET POINTER TO BUFFER START
- SHLD INPTR
- RET
-
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
- ; **11** VARIABLE DEFINITIONS, BUFFERS, AND STACK SPACE
- ; = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
- ; DEFAULTS FOR OPTIONS
-
- BLEN: DB 10 ;BOTTOM LENGTH
- BOTN: DB 0 ;BOTTOM MESSAGE LINE NUMBER
- BOTT: DB 10 ;BOTTOM TAB
- BRLF: DB 1 ;NEW PARAGRAPH LF'S
- BRTB: DB 10 ;NEW PARAGRAPH TAB
- CASE: DB 3 ;UPPER CASE LOCK
- CDBLF: DB 0 ;NO CENTER DOUBLESTRIKE
- CDBSAV: DB 0 ;LAST :CD ARGUMENT
- COMNT: DB 0 ;COMMENT FLAG
- CUNLF: DB 0 ;NO CENTER UNDERLINE
- DBLPF: DB 0 ;NO MASTER DOUBLESTRIKE
- FFLG: DB 0 ;NO FORM FEEDS
- JFLG: DB 0 ;NO JUSTIFICATION
- LCHR: DB 0 ;LAST CHAR FOR TOTAL JUST.
- LMAR: DB 10 ;LEFT MARGIN
- LPOS: DB 1 ;LINE POSITION
- PAGN: DB 0 ;PAGE NUMBER
- PLEN: DB 46 ;PAGE LENGTH
- PPOS: DB 1 ;PAGE POSITION
- RMAR: DB 70 ;RIGHT MARGIN
- SPAS: DB 1 ;SPACING
- STMS: DB 2 ;START TOP & BOTTOM MESSAGE
- TLEN: DB 10 ;TOP LENGTH
- TOPN: DB 0 ;TOP MESSAGE LINE NUMBER
- TOPT: DB 10 ;TOP TAB
- TTAB: DB 15 ;TAB TABLE
- DB 22
- DB 30
- DB 45
- DB 0
- DS 10 ;UP TO 15 TABS - LAST MUST BE ZERO
- WAIT: DB 0 ;WAIT TO PRINT NEXT PAGE
-
- ; POINTERS, BUFFERS, STATUS FLAGS AND CONSTANTS
-
- ACCSAV: DS 1 ;TEMP ACCUM SAVE
- APNT: DS 2 ;INPUT POINTER
- CBSZ: DB 135 ;CENTER BUFFER SIZE
- CENBUF: DS 136 ;CENTER MESSAGE BUFFER
- CEPT: DS 2 ;MESSAGE POINTER
- CETM: DS 1 ;CENTER TAB OR CHAR COUNT
- CONBUF: DB 64 ;CONSOLE INPUT BUFFER
- DB 0
- DS 64
- DIRMSG: DS 2 ;DIROUT MESSAGE
- DIRTAB: DS 1 ;DIROUT TAB
- EOT: DB 0FFH ;LAST PAGE PRINTED IF ZERO
- HLVAL: DS 2 ;TEMP HL SAVE
- INBUF: DS 128 ;DISK FILE INPUT BUFFER
- INFCB: DS 33 ;FILE CONTROL BLOCK
- INPTR: DS 2 ;POINTER FOR DISKIN
- LADR: DS 2 ;LPOS ADDRESS
- LEND: DS 2 ;RIGHT MARGIN ADDRESS
- MAXL: DB 135 ;MAXIMUM LINE LENGTH
- OPST: DB 0FFH ;OUTPUT ON OR OFF STATUS
- OUTBUF: DS 136 ;OUTPUT BUFFER
- RNDV: DB 5AH ;SEED FOR RANDOM NUMBER
- SFLP: DB 0 ;FLOP FOR EVERY RND SPACE
- SOT: DB 0 ;FIRST PAGE PRINTED IF NOT ZERO
- TBAD: DS 2 ;TAB TABLE POINTER
- TCNT: DB 0 ;OVERFLOW CHAR COUNT
- TEML: DS 30 ;OVERFLOW BUFFER
- TSTG: DB 0 ;TEMP STORAGE FOR BMSG/TMSG LINE NO.
-
- IF NOT BIGFILE
- BOTA: DS 2 ;BOTTOM MESSAGE ADDRESS
- TOPA: DS 2 ;TOP MESSAGE ADDRESS
- ENDIF
-
- ; VIEW VARIABLES
-
- IF VIEWCRT
- CRTPOS: DB 1 ;CRT POSITION
- VIEW: DB 0 ;VIEW OFF INITIALLY
- ENDIF
-
- ; BIGFILE VARIABLES
-
- IF BIGFILE
- BBSZ: DB 135 ;BOTTOM BUFFER SIZE
- BOTBUF: DS 136 ;BOTTOM MESSAGE BUFFER
- MEMSIZ: DS 2 ;HIGH LIMIT OF TPA
- MEMOVF: DB 0 ;MEMORY OVERFLOW FLAG
- MSGOVF: DB 0 ;OVERFLOW MESSAGE FLAG
- NMOVED: DB 200 ;NO. OF BYTES MOVED AT RELOAD
- DB 0 ;(HIGH BYTE MUST BE ZERO)
- OFFSET: DS 2 ;ADDRESS OFFSET FOR BUFFER POINTERS
- TBSZ: DB 135 ;TOP BUFFER SIZE
- TOPBUF: DS 136 ;TOP MESSAGE BUFFER
- TMOVED: DS 2 ;ADDRESS OF END OF MOVED DATA
- ENDIF
-
- ; STACK
-
- DS 64 ;STACK SPACE
- STACK EQU $
-
- ; TEXT BUFFER
-
- TEXT: END ;TEXT BUFFER STARTS HERE
-