Compucolor.org – Virtual Media

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