Listing of file='SCRIPT.SRC;01' on disk='vmedia/chip_63-sector.ccvf'
; ++++++ SCRIPT ++++++
;
; JUSTIFY, PRINT AND STORE A TEXT FILE
; ------------------------------------------
; by Myron T. Steffy, 10833 Brookside Drive
; Sun City, Arizona 85351 <C> 1982
; Ver. 3.5 for FORUM INTERNATIONAL
; to be used with Basic program ++ SCRIPT ++
;=========================================================
KBCHA EQU 81FEH
READY EQU 81FFH
ORG 9500H
START: SHLD HLBOX ;STORE H & L FOR RETURN
LXI H,00 ;ZERO H & L
DAD SP ;ADD SP ADDRESS
SHLD BASSP ;SP STORED HERE
LXI SP,STACK;SET UP RUNNING STACK
CALL SETUP ;BOTH 6.78 & 8.79
CALL CLRMEM ;CLEAR RAM FOR TEXT FILE
LXI H,94FFH ;PROTECT PROGRAM
SHLD 80ACH ;END OF BASIC
MVI A,0C3H ;USER JUMP
STA 81BFH
LXI H,RENTR ;RE-ENTER WITHOUT CLEARING MEMORY
SHLD 81C0H
LXI H,MSG01 ;TITLE
CALL OSTR ;PRINT IT
LXI D,00
LHLD BASSP
SPHL ;RESTORE SP
LHLD HLBOX ;RESTORE H & L
XRA A
STA LCOUNT ;LINE COUNT FOR PAGING
RET ;TO BASIC
RENTR: SHLD HLBOX ;PRESERVE H & L
LXI H,00
DAD SP
SHLD BASSP ;SAVE BASIC SP
LXI SP,STACK;RUNNING STACK
LXI H,MSG02
CALL OSTR
CALL GETANS ;PAUSE
LXI H,0A002H
SHLD 0A000H ;ADDRESS OF JUSTIFIED TEXT
LXI H,TEXT ;START OF TEXT
SHLD SAVADR ;STORE ADDRESS
XRA A ;ZERO ALL COUNTERS
STA CCOUNT ;PRINTER CHARACTER COUNT
CALL CRLF ;SCREEN ONLY
BEGIN: LXI H,LINBUF;LINE BUFFER
CALL CLRBUF ;CLEAR IT WITH ZEROS
LXI H,PRTBUF;PRINT BUFFER
CALL CLRBUF ;CLEAR IT
XRA A
STA BCOUNT ;ZERO COUNTER
STA CFLAG ;ZERO CENTER FLAG
LHLD SAVADR ;GET THE ADDRESS
LDA BSIZ
ADI 03 ;ALLOWANCE FOR CR,LF
MOV C,A ;LINE LENGTH
BEG02: MOV A,M ;CHARACTER
CPI 0 ;END OF TEXT ?
JZ TXTEND
CPI 10H ;CENTERING COMMAND
CZ SETFLG
CPI 0DH ;CARRIAGE RETURN ?
JZ CLNR ;CHECK FOR PARAGRAPH
BEG03: XRA A
CMP C ;END OF COUNT ?
JZ MOVLIN ;FULL LENGTH LINE
DCR C ;DECREMENT LINE LENGTH
INX H ;NEXT LETTER
JMP BEG02
CLNR: LDA RJFLG ;REJUSTIFY FLAG
CPI 1
JNZ LINEND ;NO
INX H
MOV A,M ;LOOK AT 2ND CHARACTER
DCX H ;RESTORE COUNT
CPI 0AH ;DON'T PROCESS IF NO
JNZ LINEND
INX H
INX H
MOV A,M ;LOOK AT 3RD CHARACTER
CPI 0DH ;ANOTHER C/R MEANS PARAGRAPH
JZ PARA
DCX H
DCX H
MVI M,20H ;REPLACE C/R WITH A SPACE
JMP BEG03 ;PROCESS AS USUAL
PARA: DCX H
DCX H
MVI M,07 ;PARAGRAPH SIGNAL
JMP LINEND ;END OF SENTENCE
MOVBUF: LXI D,LINBUF;MOVES A LINE TO LINBUF
MBF01: MOV A,M
ANI 7FH ;ASCII DETERMINATION
CPI 7BH ;NOT USED BY CC II
JNC SKIP ;APPEARS IN SCRIBE FILES
CPI 0AH ;LINE FEED NOT USED
JZ SKIP
CPI 20H ;DISCARD LEADING SPACE
JZ SKIP
MBF02: CPI 7 ;PARAGRAPH SIGNAL
JZ MBF03
CPI 9 ;ACCEPT 'TAB'
JZ MBF03
CPI 10H ;CENTERING SIGNAL
JZ MBF03
ANI 7FH ;BE SURE IT'S ASCII
CPI 0DH ;PASS CARRIAGE RETURN
JZ MBF03
CPI 1FH ;DISCARD CONTROL CHARACTERS
JC MORE
CPI 7BH ;DUMP IT, NOT USED BY CC II
JNC MORE
MBF03: STAX D ;INTO LINBUF
INX D
DCR B ;COUNTER FOR TRANSFER
JNZ MORE ;NEED SOME MORE
RET
SETFLG: MVI A,01 ;CENTER THIS LINE
STA CFLAG
RET
SKIP: INX H ;CHANGE START ADDRESS
SHLD SAVADR ;STORE IT
JMP MBF01
MORE: INX H ;TAKE NEXT CHARACTER
MOV A,M
JMP MBF02
MOVPRT: LXI D,PRTBUF;MOVES A LINE TO PRTBUF
CALL MBF01
RET
MOVLIN: LDA BSIZ
MOV B,A ;NEEDED BY MOVBUF
LHLD SAVADR ;CURRENT ADDRESS
CALL MOVBUF ;FOR JUSTIFICATION
CALL LETCTR
MOV A,C ;GET NEW COUNT FROM LETCTR
ADI 02
STA BCOUNT
LDA JFLAG
CPI 01
JNZ NOJUST ;DO NOT JUSTIFY
CALL SPACER
JMP NEXLIN
NOJUST: LXI H,LINBUF
MOV B,C ;THE LETTER COUNT
INR B
CALL MOVPRT ;MOVE IT TO PRTBUF
JMP NEXLIN
NOSPC: LDA BSIZ ;CORRECT THE COUNT
ADI 01
STA BCOUNT
MOV B,A ;NEEDED BY MOVPRT
LHLD SAVADR ;CURRENT ADDRESS
CALL MOVPRT ;MOVE IT TO PRTBUF
NEXLIN: CALL LINOUT ;PRINT IT
EI
CALL STOP ;INTERRUPT AT LINE END
DI
LHLD SAVADR
LDA BCOUNT ;ADD TO CURRENT ADDRESS
CALL ADHLA
SHLD SAVADR ;NEW ADDRESS
JMP BEGIN ;FOR NEXT LINE
LINOUT: CALL INDENT ;PRINTER ONLY
LXI H,PRTBUF
LN01: MOV A,M ;SENDING CHARACTERS
CPI 0 ;TO PRINT DRIVER
JZ LN02
CPI 7 ;PARAGRAPH WANTED
JZ SENPAR
CPI 0DH
JNZ LN03
LN02: MVI A,0DH ;ENDS LINE WITH
CALL PRINT ;C/R & L/F
MVI A,0AH
CALL PRINT
RET
LN03: CALL PRINT ;PRINTS CHARACTER
INX H
JMP LN01
SENPAR: CALL LN02 ;SENDS TWO FOR
CALL LN02 ;A PARAGRAPH
RET
LINEND: LXI D,PRTBUF;HAS A C/R, PRINT IT
LHLD SAVADR ;WITHOUT JUSTIFICATION
LDA BSIZ
ADI 02
SUB C
ADI 02
STA BCOUNT
MOV B,A
LDA CFLAG ;CENTERING FLAG
CPI 01
CZ CENTER
CALL MBF01
JMP NEXLIN
CENTER: PUSH B ;SAVE B COUNT
LDA BSIZ
SUB B
MVI B,0
CTR01: SUI 2 ;DIVIDING BY 2
JM CTR02
INR B
JMP CTR01
CTR02: MOV A,B ;NO. OF SPACES NEEDED
STA CFLAG ;STORE COUNT FOR PRINTER
POP B
RET
TXTEND: LXI D,PRTBUF;MOVES LAST LINE TO PRTBUF
LHLD SAVADR ;GET STARTING ADDRESS
CALL MOVDH
CALL LINOUT
JMP EXIT
; LINE BUFFER FILLER COUNTER
LETCTR: LXI H,LINBUF;BUFFER ADDRESS
LDA BSIZ
MOV C,A ;NUMBER OF CHARACTERS IN LINBUF
CALL ADHLA ;END OF LINE
LTR01: XRA A
CMP C ;HAS COUNTER REACHED ZERO ?
JZ NOSPC ;NO SPACES, PRINT AS IS
MOV A,M ;GET CHARACTER
CPI 20H ;IS IT A SPACE ?
JZ LTR02 ;
DCX H ;NEXT ADDRESS
DCR C ;CHARACTER COUNT
JMP LTR01 ;CONTINUE LOOKING
LTR02: DCX H
DCR C
MOV A,M
CPI 20H
JZ LTR02
LDA BSIZ
SUB C
MOV B,A ;NEEDED BY SPACER
RET
; PRINT BUFFER SPACE FILLER
SPACER: LXI D,PRTBUF;PRINTING BUFFER
LDA BSIZ
PUSH H
XCHG
CALL ADHLA ;ADD BSIZ TO D
XCHG
POP H
SPC01: MOV A,M ;CHARACTER FROM LINBUF
STAX D
CPI 20H ;WAS IT A SPACE ?
JZ FILLER ;ADD ANOTHER SPACE IF NEEDED
XRA A
CMP C ;LAST CHARACTER IN LINBUF ?
JZ REPT ;YES, CHECK B REGISTER
DCR C
DCX D
DCX H
JMP SPC01 ;GET NEXT CHARACTER
FILLER: XRA A
CMP B ;DO WE NEED A SPACE ?
JZ CONTIN ;NO, ENOUGH ADDED
DCR B ;ONE LESS SPACE NEEDED
DCX D ;MOVE OVER ONE IN PRTBUF
MVI A,20H ;ADD A SPACE TO THE LINE
STAX D ;STORE IT IN PRTBUF
DCX D
DCX H
NOFILL: MOV A,M ;IS THE NEXT ONE A SPACE ?
CPI 20H
JNZ SPC01 ;NO, OK TO PROCEED
STAX D
DCR C ;YES, SKIP OVER IT
DCX D
DCX H
JMP NOFILL ;DON'T PUT TWO IN A ROW
CONTIN: XRA A
CMP C ;HAVE WE FINISHED THE LINE ?
RZ ;YES, ALL DONE
DCR C
DCX D
DCX H
MOV A,M ;NEXT CHARACTER TO PRTBUF
STAX D
JMP CONTIN
REPT: CMP B ;NEED MORE SPACES ?
RZ ;ALL DONE
PUSH B ;SAVE THE COUNT
LXI H,LINBUF;
CALL CLRBUF ;ZERO LINBUF FOR NEW START
LXI H,PRTBUF;MOVE CONTENTS OF PRTBUF
LXI D,LINBUF;BACK TO LINBUF
LDA BSIZ
ADI 01
MOV B,A ;NEEDED BY MOVDH
CALL MOVDH
LXI H,PRTBUF
CALL CLRBUF ;ZERO PRTBUF
POP B ;RESTORE SPACES COUNT
LDA BSIZ
SUB B
MOV C,A
LXI H,LINBUF
LDA BSIZ
CALL ADHLA
JMP SPACER ;REPEAT UNTIL B=0
CLRBUF: MVI B,50H ;MAXIMUM BUFFER LENGTH
ZERO: MVI M,00 ;ZERO MEMORY
DCR B ;DECREMENT COUNT
RZ ;RETURN WHEN FINISHED
INX H ;NEXT
JMP ZERO
; PRINTER DRIVER
;
; EXPANDS TABS, INDENTS, COUNTS CHARACTERS ON
; A LINE, LINES ON A PAGE AND DOES FORM FEEDS!
PRINT: CALL SAVE ;SAVE ALL THE REGISTERS
CPI 9 ;SEE IF TAB
JZ TABOUT ;SEND BLANKS FOR TAB
CPI 10H ;CENTERING INDICATOR
JZ FIXCEN ;CENTER THIS LINE
CPI 0AH ;END OF LINE?
JNZ COUNT ;NO, COUNT IT
CALL PRT01 ;PRINT IT ANYWAY
CALL NUFILE ;CREATE NEW FILE
LXI H,CCOUNT;RESET CHAR. COUNTER
MVI M,0 ;TO ZERO
LXI H,LCOUNT;GET LINE COUNT
INR M ;ADD ONE
LDA PSIZ ;GET PAGE SIZE
CMP M ;THERE YET?
RNZ ;NO, THAT'S ALL
MVI M,0 ;NOW AT TOP OF PAGE
HEAD: LDA WHITE ;SOME BLANK LINES ?
CPI 0
JZ HEAD02 ;NONE WANTED
HEAD01: PUSH PSW ;SAVE COUNT
MVI A,0AH ;LINE FEEDS FOR HEADING
CALL PRT01
POP PSW ;RECOVER COUNT
DCR A
JNZ HEAD01 ;KEEP IT UP
HEAD02: XRA A ;ZERO CHAR COUNT
STA CCOUNT
LDA PAUSE ;PAUSE FLAG
CPI 0DH
RNZ
LXI H,MSG02
CALL OSTR
LXI H,MSG03
CALL OSTR
CALL GETANS ;PAUSE FOR PAPER ADJUSTMENT
STA PAUSE
MVI A,0DH
CALL PRT01
RET
COUNT: CALL PRT01 ;SEND IT
CALL NUFILE
LXI H,CCOUNT;ONE MORE CHARACTER
INR M ;ON THIS LINE
LDA LSIZ ;MAX LINE SIZE
CMP M ;OUR COUNT
RNZ ;RETURN IF LESS THAN MAX
MVI A,13 ;SEND C/R
CALL PRINT ;SEND L/F, RESET COUNTER
MVI A,10 ;TEST FOR END OF PAGE
JMP PRINT ;AND RETURN
TABOUT: CALL NUFILE
TAB01: MVI A,20H ;SEND SPACES
CALL PRT01
LDA CCOUNT ;UNTIL COUNT= EVEN
INR A ;MULTIPLE OF EIGHT
STA CCOUNT
ANI 7
RZ
JMP TAB01
INDENT: LXI H,PRTBUF;TEXT STARTING ADDRESS
CALL SPNOR ;LOOK FOR FIRST CHARACTER
CPI 0DH ;IF C/R, LINE IS BLANK
RZ ;INDENT NOT REQUIRED
PUSH PSW ;SAVE THE REGISTERS
PUSH B
MVI B,9 ;COUNTER
INDT01: MVI A,20H ;SPACE
CALL PRT02 ;SEND IT
DCR B ;DECREMENT COUNT
JNZ INDT01 ;NEED MORE
POP B
POP PSW
RET
PRT01: CALL LO ;CHARACTER TO SCREEN
PRT02: PUSH PSW ;SAVE THE CHARACTER
LDA RATE ;LOAD BAUD RATE
OUT 5 ;SEND IT
POP PSW ;RECALL CHARACTER
MOV E,A ;MUST BE IN E FOR S1OUT
CALL S1OUT ;CHARACTER TO PRINTER
RET
NUFILE: PUSH PSW ;SAVE CHARACTER
LDA SFILE
CPI 1
JNZ PASS ;NO NEW FILE
POP PSW
PUSH H
LHLD 0A000H ;FILE CHARACTER ADDRESS
MOV M,A ;STORE IT
INX H
SHLD 0A000H ;NEXT ADDRESS
POP H
RET
PASS: POP PSW
RET
FIXCEN: CALL NUFILE ;RETAIN 10H IN NEW FILE
PUSH B
LDA CFLAG ;HAS COUNT FOR SPACES
MOV B,A
FIX01: MVI A,20H
CALL PRT01 ;SEND SPACES FOR CENTERING
LDA CCOUNT
INR A
STA CCOUNT ;UPDATE CHARACTER COUNT
DCR B
JZ FIX02
JMP FIX01
FIX02: POP B
RET
GETANS: MVI A,32H ;GET ONE CHARACTER ANSWER
STA READY ;FROM THE KEYBOARD
MVI A,40H
STA 81D6H ;BELL CONTROL
MVI A,05H ;LENGTH OF TONE
CALL WATL ;100 MILLISECONDS
XRA A
STA 81D6H ;BELL OFF
GETCHA: CALL 0024H
JNZ GETCHA ;LOOPS UNTIL READY
RET
STOP: LDA READY ;KEYBOARD ROUTINE
CPI 50H
JZ STOP
CPI 80H
RNZ
LDA KBCHA ;KEYBOARD CHARACTER
PUSH PSW
XRA A
STA READY ;RECOGNIZES BREAK OR
STA KBCHA ;L/F AT END OF LINE
POP PSW
CPI 0AH ;LINE FEED TO EXIT
JZ EXIT
RET
CLRMEM: LXI H,LINBUF;CLEAR ALL RAM
MEM01: MVI M,00 ;ABOVE BUFFERS
INX H
MVI A,0FFH
CMP H
JNZ MEM01
CMP L
RZ
JMP MEM01
EXIT: CALL CRLF
LXI D,00
LHLD BASSP ;RESTORE SP
SPHL ;SWAP
LHLD HLBOX ;RESTORE H & L
XRA A
RET ;TO BASIC
SETUP: LDA 0001H
CPI 00BAH ;VER. 8.79
RZ
LXI H,NEWTAB
LXI D,OLDTAB
LXI B,LENTAB
ROMJMP: LDAX D
MOV M,A
INX H
INX D
DCX B
MOV A,B
ORA C
JNZ ROMJMP
RET
OLDTAB:
JMP 338BH ;CRLF
JMP 3392H ;LO
JMP 33C3H ;S1OUT
JMP 33F4H ;OSTR
JMP 3429H ;WATL
JMP 343BH ;MOVDH
JMP 3459H ;SUBHD
JMP 3460H ;SPNOR
JMP 3518H ;ADHLA
JMP 3FD0H ;SAVE
LENTAB EQU $-OLDTAB
NEWTAB:
CRLF: JMP 17C1H
LO: JMP 17C8H
S1OUT: JMP 17F9H
OSTR: JMP 182AH
WATL: JMP 185FH
MOVDH: JMP 1871H
SUBHD: JMP 188FH
SPNOR: JMP 1896H
ADHLA: JMP 194EH
SAVE: JMP 0A2EH
SAVADR: DW 01 ;TEMP ADDRESS STORAGE
BASSP: DW 01 ;BASIC STACK POINTER
HLBOX: DW 01 ;H & L STORAGE
BCOUNT: DS 1 ;BYTE COUNT FOR TRANSFERS
CCOUNT: DS 1 ;CURRENT CHARACTER COUNT
LCOUNT: DS 1 ;CURRENT LINE COUNT
CFLAG: DS 1 ;CENTERING FLAG
; DEFAULT VALUES FOR SCRIPT
PAUSE: DB 13 ;PAUSE
SFILE: DB 0 ;CREATE SRC FILE (YES=1)
JFLAG: DB 1 ;JUSTIFY FLAG (YES=1)
BSIZ: DB 60 ;LINE LENGTH FOR JUSTIFICATION
LSIZ: DB 80 ;MAX LINE LENGTH
PSIZ: DB 55 ;NUMBER OF LINES ON PAGE
WHITE: DB 0 ;BLANK LINES AT TOP OF PAGE
RATE: DB 192 ;BAUD RATE (DEFAULTS TO 9600)
RJFLG: DB 0 ;REJUSTIFY FLAG
MSG01: DB 12,14,17,9,9,'SCRIPT ',15,18,'TEXT PROCESSOR '
DB 13,10,10,21,'<C> by Myron T. Steffy, '
DB 'Sun City, Arizona January 15, 1982 ',19
DB 13,10,10,9,9,'LOAD TEXT AT B000H.',13,10,10
DB 9,9,18,'RE-ENTER with ',17,'ESCAPE ^ (USER) '
DB 18,13,10,10,239
MSG02: DB 19,13,10,10,9,9,'TO CONTINUE, PRESS RETURN ',22
DB 13,10,10,239
MSG03: DB 21,9,9,'TO CANCEL PAUSE, PRESS SPACE BAR'
DB 22,13,10,10,239
DS 50H ;STACK AREA
STACK:
ORG (($/100H)+1)*100H
LINBUF: DS 50H
PRTBUF: DS 50H
ORG 0B000H ; LOAD TEXT FILE HERE
TEXT:
END START