Compucolor.org – Virtual Media

Listing of file='SCRIPT.SRC;01' on disk='vmedia/chip_85-sector.ccvf'


;		SCRIPT PRINTER PROGRAM
;
;	Vers. 4.0 by Myron T. Steffy, Sun City, Arizona
;=============================================================

;		     SYSTEM EQUATES

INPCRT	EQU	81C5H	;JUMP VECTOR #31
KBDFL	EQU	81DFH	;HOLDS NUMBER OF JUMP VECTOR
READY	EQU	81FFH	;KEYBOARD STATUS
KBCHA	EQU	81FEH	;KEYBOARD CHARACTER

;	FPB - FILE PARAMETER BLOCK LAYOUT

FTYP	EQU	08	;FILE TYPE
FBUF	EQU	32	;BUFFER POINTER FOR TRANSFER
FXBC	EQU	34	;BYTE COUNT FOR TRANSFER
FPTR	EQU	36	;FBUF PNTR FOR SEQUENTIAL RTNS.

;	START OF PROGRAM

	ORG	4000H

START:	EI		;ENABLE INTERRUPTS
	LXI	H,0	;ZERO H & L
	DAD	SP	;ADD SP ADDRESS
	SHLD	FCSSP	;SP STORED HERE
	LXI	SP,STACK;SET UP RUNNING STACK
	CALL	SETUP	;WHICH BASIC ?
	LXI	H,LINBUF;CLEAR ALL BUFFERS
	CALL	CLRBUF
	LXI	H,PRTBUF
	CALL	CLRBUF
	CALL	CLRMEM	;CLEAR RAM FOR TEXT FILE
	MVI	A,0C3H	;USER JUMP
	STA	81BFH
	LXI	H,EXIT	;RE-ENTER WITHOUT CLEARING MEMORY
	SHLD	81C0H
	MVI	A,0C0H	;DEFAULT BAUD RATE
	STA	RATE
	XRA	A
	STA	KBDFL
	LXI	H,MSG01	;TITLE
	CALL	OSTR	;PRINT IT
	CALL	DRIVE	;GET DRIVE NUMBER & DIRECTORY
	CALL	VECTOR
	JMP	FILES

VECTOR:	MVI	A,31	;SET UP VECTOR
	STA	KBDFL	;TO INPCRT
	MVI	A,0C3H	;JUMP COMMAND
	STA	INPCRT
	LXI	H,KBDINP;INPCRT JUMPS
	SHLD	INPCRT+1;TO KEYBOARD INPUT
	LXI	H,KBDBUF;POINT TO COUNTER
	MVI	M,0	;ZERO COUNTER
	RET

DRIVE:	LXI	H,MSG21	;WHICH DRIVE ?
	CALL	OSTR
	CALL	GETANS
	STA	MSG21A+7
	LXI	H,MSG21A
DRV01:	MOV	A,M
	CPI	239
	JZ	PDIR
	CALL	0033H
	INX	H
	JMP	DRV01

PDIR:	LXI	H,MSG22
PDIR01:	MOV	A,M
	CPI	239
	RZ
	CALL	0033H
	INX	H
	JMP	PDIR01

FILES:	LXI	H,MSG02	;COMMAND INFO
	CALL	INPCOM	;INPUT COMMANDS
	CALL	INFO	;SETUP FILES AND PRINTER
	JC	FILES	;RETRY IF ERROR

LOOP:	LXI	H,FPB1	;FILE ADDRESS PARAMETER BLOCK
	CALL	GTBYT	;GET NEXT BYTE
	JC	LOOP1	;<C>=ERROR OR END OF FILE
	JMP	QUERY

LOOP1:	JNZ	ERROR	;ERROR STATUS
	LXI	H,MSG04	;CLOSING MSG
	CALL	OSTR
	JMP	EXIT

RENTR:	LXI	H,00	;RE-ENTRY, RETAINING FILE
	DAD	SP
	SHLD	FCSSP	;SAVE FCS SP
	LXI	SP,STACK;RUNNING STACK
	CALL	VECTOR
QUERY:	XRA	A
	STA	LCOUNT	;ZERO LINE COUNT
	STA	SFILE	;AND SET DEFAULT FLAGS
	STA	RJFLG
	STA	PNUM
	STA	PGFL
	MVI	A,1
	STA	JFLAG
	LXI	H,MSG05	;BSIZ (INPCOM HAS OSTR)
	CALL	NUMB
	ORA	A
	JNZ	QU05
	MVI	A,60
QU05:	STA	BSIZ
	JMP	LNSPG

NUMB:	CALL	INPCOM	;GET NUMBERS FROM KEYBOARD
	LXI	H,BUFFER
	CALL	SCND01
	CALL	GVAL
	RET

LNSPG:	LXI	H,MSG06	;PSIZ
	CALL	NUMB
	ORA	A
	JNZ	QU06
	MVI	A,56	;DEFAULT PAGE SIZE
QU06:	STA	PSIZ
	LXI	H,MSG07	;FORM FEEDS
	CALL	NUMB
	ORA	A
	JNZ	QU07
	MVI	A,10	;DEFAULT FORM FEEDS
QU07:	STA	WHITE
	LXI	H,MSG08	;BLANKS FIRST PAGE
	CALL	NUMB
	ORA	A
	JNZ	QU08
	XRA	A
QU08:	STA	LCOUNT
	LXI	H,MSG09	;BAUD RATE
	CALL	NUMB
	CALL	SETBR
	ORA	A
	JNZ	QU09
	MVI	A,0C0H	;DEFAULTS TO 9600
QU09:	STA	RATE
	OUT	5
	LXI	H,MSG10	;CANCEL NUMBERING ?
	CALL	OSTR
	CALL	GETANS
	CPI	'Y'
	CALL	LO
	JZ	QU10
	MVI	A,56	;DEFAULTS FOR NUMBERING
	STA	PSIZ
	MVI	A,6	;NUMBER TAKES 4 LINES
	STA	WHITE
	MVI	A,1
	STA	PGFL
QU10:	LXI	H,MSG11	;NEW SOURCE FILE ?
	CALL	OSTR
	CALL	GETANS
	CPI	'Y'
	CALL	LO
	JNZ	JUSTF
	MVI	A,1	;SET FLAG
	STA	SFILE
JUSTF:	LXI	H,MSG12	;CANCEL JUSTIFICATION ?
	CALL	OSTR
	CALL	GETANS
	CPI	'Y'
	JNZ	REJUST
	CALL	LO
	XRA	A
	STA	JFLAG	;YES, CANCEL FLAG
REJUST:	LXI	H,MSG13	;REJUSTIFY ?
	CALL	OSTR
	CALL	GETANS
	CPI	'Y'
	JNZ	OPSYS
	CALL	LO
	MVI	A,1	;SET FLAG
	STA	JFLAG	;BOTH FLAGS MUST BE SET
	STA	RJFLG
	JMP	OPSYS

;	INPCOM:	PRINT MESSAGE AND INPUT COMMAND
;		WITH BACKSPACE EDITING.


INPCOM:	CALL	OSTR	;ADDRESS IN CALLING ROUTINE
	CALL 	RESET	;RESET IF ERROR
	LXI	H,BUFFER;POINT AT BUFFER
IPC1:	CALL	KEYIN	;READ FROM KEYBOARD
	CPI	13	;IS IT CARRIAGE RETURN ?
	JZ	IPC3	;YES, GO PROCESS CR
	CPI	26	;IS IT BACK-SPACE ?
	JZ	IPC2	;YES, GO PROCESS BS
	MOV	M,A	;STORE CHARACTER
	INX	H	;INCREASE POINTER
	MOV	A,L	;TEST LO BYTE OF POINTER
	CPI	40H
	JZ	INPCOM	;RESTART IF TOO BIG
	JMP	IPC1

IPC2:	MVI	A,20H	;BLANK TO ERASE
	CALL	LO	;TO THE SCREEN
	MVI	A,26	;CURSOR LEFT
	CALL	LO	;DO IT
	DCX	H	;AS YOU WERE
	JMP	IPC1	;CONTINUE LOOP

IPC3:	MVI	M,0	;INSERT TERMINATOR
	RET
;
;	INFO:
;	SETUP FILE AND PRINTER PARAMETERS
;	GETS INFORMATION FROM COMMAND LINE BUFFER

INFO:	LXI	H,BUFFER;POINT AT BUFFER
	LXI	D,FPB1	;POINT AT INPUT FPB
	LXI	B,DEFAULT;POINT AT DEFAULT
	CALL	PFSPC	;PARSE FILE SPEC
	JC	EMESS	;IF CARRY, ERROR
	CALL	GTPRM	;GET PARAM FOR PRINTER
	XRA	A	;ZERO CHAR COUNTER
	STA	CCOUNT
	STA	LCOUNT
	LXI	H,FPB1	;INPUT FPB ADDRESS
	MOV	M,A
	CALL	OPEN	;OPEN THE FILE
	JC	EMESS	;IF CARRY, IT'S NO GOOD
	LXI	H,TEXT	;TEXT BUFFER ADDRESS
	SHLD	FPB1+FBUF;SAVE TEXT BUFFER ADDRESS
	CALL	TYPSET	;CORRECT TEXT ADDRESS IF 'DOC'
	PUSH	D	;SAVE D
	XCHG		;KBDBUF ADDRESS
	LHLD	80ACH	;END OF RAM (32940)
	CALL	SUBHD	;HL-DE=TEXT BUFFER SIZE
	POP	D
	SHLD	FPB1+FXBC;SAVE BUFFER SIZE
	LXI	H,FPB1	;RECALL BUFFER ADDRESS
	CALL	RWSEQI	;REWIND INPUT FILE
	STC		;SET ERROR STATUS
	CMC		;SET NO ERROR STATUS
	RET

TYPSET:	PUSH	PSW
	PUSH	H	;CONTAINS TEXT BUFFER ADDRESS
	LXI	H,FPB1+FTYP
	MVI	A,'D'	;FIRST LETTER OF 'DOC'
	CMP	M
	POP	H
	JNZ	TYP01
	PUSH	D
	LXI	D,0040H	;ALLOWANCE FOR SCRIBE DOC FILE
	CALL	SUBHD
	SHLD	FPB1+FBUF;LOAD ADDRESS FOR 'DOC' FILE
	POP	D
TYP01:	POP	PSW
	RET

;	GTPRM
;	GETS THE PRINTER PARAMETERS
;
GTPRM:	CALL	SCND	;SCAN FOR DIGITS
	RC		;NO DIGITS
	CALL	GVAL	;GET VALUE IN <A> (BAUD RATE)
	CALL	SETBR	;CONVERT FROM TABLE
	STA	RATE	;RECALL IN PRINTER DRIVER
	RET
;
;	SCAN PAST SPACES AND COMMA FOR DIGIT
;
SCND:	INX	H	;NEXT CHARACTER
SCND01:	MOV	A,M	;LOOK AT IT
	CPI	20H	;IS IT A SPACE ?
	JZ	SCND	;IF YES, NEXT CHARACTER
	CPI	2CH	;IS IT A COMMA ?
	JZ	SCND	;IF YES, LOOK AGAIN
	CALL	DIGIT	;DIGIT ? <C>=YES
	CMC		;<NC>=YES
	RET
;
;	GETS VALUE FROM BUFFER AND CONVERTS TO DECIMAL
;
GVAL:	MVI	B,0	;ZERO <B>
	CALL 	GVAL1	;GET SUM IN <B>
	MOV	A,B	;TO <A>
	STC		;SET CARRY
	CMC		;SET <NC> FOR ERROR
	RET

GVAL1:	MOV	A,M	;GET DIGIT
	SUI	30H	;CHECK IF LESS THAN '0'
	RC		;NO
	CPI	0AH	;MORE THAN 9 ?
	RNC		;NO
	MOV	M,A	;BACK TO MEMORY
	MOV	A,B	;GET CURRENT SUM
	RLC		;*2
	RLC		;*4
	ADD	B	;*5
	RLC		;*10 FOR SUM
	ADD	M	;ADD DIGIT
	MOV	B,A	;SAVE IN B
	INX	H	;POINT TO NEXT DIGIT
	JMP	GVAL1

SETBR:	PUSH	H	;SAVE HL
	LXI	H,BAUDTB;ACCESS BAUD RATE TABLE
	CALL	ADHLA	;ADDRESS OF BAUD RATE
	MOV	A,M	;CORRECTED RATE
	POP	H
	RET

;		KBDINP:KEYBOARD INPUT

KBDINP:	CALL	SAVE	;SAVE ALL REGISTERS
	LXI	H,KBDBUF;TYPING BUFFER
	MVI	A,30	;LENGTH OF BUFFER
	CMP	M	;SEE IF BUFFER IS FULL
	RC		;IF IT IS, IGNORE CHARACTER
	INR	M	;INCREMENT COUNTER
	MOV	A,M	;PUT COUNT IN A
	CALL	ADHLA	;ADD COUNTER TO BUFFER
	MOV	A,E	;CHARACTER IS IN E
	CPI	10	;SEE IF ESCAPE WANTED
	JZ	EXIT	;USER WANTS TO EXIT
	ANI	127	;MAKE SURE IT'S ASCII
	MOV	M,A	;STORE IT
	RET

KBDBUF:	DS	32	;KEYBOARD HOLDING TANK
;
;	KEYIN READS AND ECHOS ONE CHARACTER
;
KEYIN:	PUSH	H	;SAVE H
	LXI	H,KBDBUF;TANK ADDRESS
KEYIN1:	MOV	A,M	;READ COUNTER
	ANA	A
	JZ	KEYIN1	;LOOK AND WAIT IF ZERO
	DI		;HOLD OFF INTERRUPTS
	PUSH	D	;SAVE D
	DCR	M	;REDUCE BUFFER COUNTER
	MOV	D,M
	INX	H	;POINT TO COUNTER
	MOV	A,M	;READ IT
	PUSH	PSW	;STACK IT
KEYIN2:	DCR	D	;PACK TANK BUFFER
	JM	KEYIN3	;WHEN DONE
	INX	H	;CHARACTER TO BE SHIFTED
	MOV	A,M
	DCX	H	;POINT TO NEW HOME
	MOV	M,A	;NEW HOME
	INX	H
	JMP	KEYIN2	;LOOP UNTIL DONE
KEYIN3:	EI		;ENABLE INTERRUPTS
	POP 	PSW	;THE CHARACTER
	PUSH	PSW	;SAVED AGAIN
	CALL	LO	;DISPLAY
	POP	PSW	;BACK HOME
	POP	D	;<DE> AND <HL>
	POP	H	;UNCHANGED
	RET

ERROR:	LXI	H,MSG03	;PRINT ERROR MESSAGE
	CALL	OSTR

OPSYS:	MVI	A,13	;RESET PAUSE FLAG
	STA	PAUSE
	LXI	H,MSG14
	CALL	OSTR
	CALL	GETANS	;PAUSE
	LXI	H,GNUFIL+2
	SHLD	GNUFIL	;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	0AH	;PASS LINE FEED
	JZ	MBF03
	CPI	1FH	;DISCARD CONTROL CHARACTERS
	JC	ADJUST
	CPI	7BH	;DUMP IT, NOT USED BY CC II
	JNC	ADJUST
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

ADJUST:	PUSH	H	;ADJUST COUNT FOR DISCARD
	LHLD	SAVADR
	INX	H
	SHLD	SAVADR
	POP	H

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	SAVDAT

;	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
	CALL	PGNUM	;WANT PAGE NUMBERS?

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
	STA	LCOUNT
	LDA	PAUSE	;PAUSE FLAG
	CPI	0DH
	RNZ
	LXI	H,MSG14
	CALL	OSTR
	LXI	H,MSG15
	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:	MOV	E,A	;MUST BE IN E FOR S1OUT
	CALL	S1OUT	;CHARACTER TO PRINTER
	RET

;		PAGE NUMBERING

PGNUM:	LDA	PGFL
	ORA	A
	RZ
	LDA	PNUM
	INR	A
	STA	PNUM
	CPI	2
	RC		;START WITH PAGE 2
	MVI	B,3	;3 LINES BELOW TEXT
	MVI	A,0AH
PG01:	CALL	PRT01
	DCR	B
	JNZ	PG01
	LDA	PNUM
	LXI	H,PGMSG
	CALL	CONV1	;CONVERT TO ASCII
	MVI	B,9
	MVI	A,20H
PRTIND:	CALL	PRT02
	DCR	B
	JNZ	PRTIND
	LXI	H,PAGE
	CALL	PG03
	LXI	H,PGMSG
PG02:	MOV	A,M
	CPI	'0'	;LEADING ZERO?
	JZ	PG04
	CALL	PRINT
	INX	H
	MOV	A,M
PG03:	CALL	PRINT
	INX	H
	MOV	A,M
	CPI	239
	RZ		;ALL DONE
	JMP	PG03

PG04:	INX	H
	JMP	PG02

CONV1:	STA	TEMP	;CONVERT HEX TO ASCII
	LXI	B,VAL
CONV2:	LDAX	B
	MOV	D,A
	MVI	M,30H
CONV3:	LDA	TEMP
	SUB	D
	JM	NEXT
	STA	TEMP
	INR	M
	JNZ	CONV3
	RET
NEXT:	INX	H
	INX	B
	JMP	CONV2

PAGE:	DB	0,18,9,9,9,'   PAGE ',239
PGMSG:	DB	'    ',22,13,10,239


NUFILE:	PUSH	PSW	;SAVE CHARACTER
	LDA	SFILE
	CPI	1
	JNZ	PASS	;NO NEW FILE
	POP	PSW
	PUSH	H
	LHLD	GNUFIL	;FILE CHARACTER ADDRESS
	MOV	M,A	;STORE IT
	INX	H
	SHLD	GNUFIL	;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,GNUFIL;CLEAR ALL RAM
MEM01:	MVI	M,00	;ABOVE BUFFERS
	INX	H
	MVI	A,0FFH
	CMP	H
	JNZ	MEM01
	CMP	L
	RZ
	JMP	MEM01

SAVDAT:	LDA	SFILE	;SRC FLAG SET ?
	ORA	A
	JZ	EXIT
	LXI	D,GNUFIL+2	;START OF TEXT
	LHLD	GNUFIL		;COUNTER
	CALL	SUBHD
	SHLD	BYTCNT
	XRA	A
	CMP	H
	JNZ	SVDT01
	CMP	L
	JZ	GNODAT	;BUFFER IS EMPTY
SVDT01:	LXI	H,MSG16	;WANT TO SAVE IT ?
	CALL	OSTR
	LHLD	BYTCNT
	CALL	HXCONV	;PRINT NUMBER OF BYTES
	LXI	H,MSG17
	CALL	OSTR
	CALL	GETANS
	CPI	'N'
	JZ	EXIT

	LXI	H,NFADR
	LXI	D,MSG19B+2
	CALL	ASC1
	INX	H
	LXI	D,MSG19B
	CALL	ASC1

	LHLD	GNUFIL	;GET COUNTER
	DCX	H	;SUBTRACT 1
	SHLD	GNUFIL
	LXI	H,GNUFIL
	LXI	D,MSG19C+2
	CALL	ASC1
	INX	H
	LXI	D,MSG19C
	CALL	ASC1
	JMP	NAMEIT

ASC1:	MOV	A,M	;CONVERT BYTE TO ASCII CHARACTERS
	PUSH	PSW
	RRC
	RRC
	RRC
	RRC
	CALL	B2HEX
	STAX	D
	POP	PSW
	INX	D
	CALL	B2HEX
	STAX	D
	RET

NAMEIT:	LXI	H,MSG18
	CALL	OSTR
	CALL	GETANS
	CALL	VECTOR
	LXI	H,MSG23
	CALL	INPCOM
	MVI	B,0	;COUNTER FOR DISC NAME
	LXI	H,BUFFER
DSKNAM:	MOV	A,M
	ORA	A	;DETERMINE LENGTH OF NAME
	JZ	DSK01
	INX	H
	INR	B
	JMP	DSKNAM
DSK01:	LXI	D,MSG19A+5
	DCX	H	;BACK UP ONE FOR LAST LETTER
FILNAM:	MOV	A,M
	STAX	D
	DCR	B
	JZ	FLN01	;END OF NAME
	DCX	H
	DCX	D
	JMP	FILNAM
FLN01:	LXI	H,MSG19
SVDT02:	MOV	A,M
	CPI	239
	JZ	EXIT
	CALL	0033H
	INX	H
	JMP	SVDT02

HXCONV:	MOV	A,H
	CALL	LBYT
	MOV	A,L
	CALL	LBYT
	RET

GNODAT:	LXI	H,MSG20
	CALL	OSTR
	JMP	EXIT

ADVNC:	MVI	A,0AH
	CALL	PRT02	;PAPER ADVANCE
	DCR	B
	JNZ	ADVNC
	RET

EXIT:	LDA	LCOUNT	;NUMBER LAST PAGE
	CPI	56
	JNC	EX02
	MOV	B,A
	MVI	A,56
	SUB	B
	MOV	B,A	;NUMBER OF L/F'S TO BOTTOM
	CALL	ADVNC	;OF LAST PAGE
	CALL	PGNUM
	MVI	B,6
	CALL	ADVNC	;END OF PAGE
EX02:	LXI	H,MSG04	;RE-ENTRY MESSAGE
	CALL	OSTR
	CALL	GETANS
	CPI	'U'	;RE-ENTER RETAINING FILE
	JZ	RENTR
	CPI	'P'
	JZ	4000H
	CALL	CRLF
	CALL	CRLF
	LHLD	FCSSP	;RESTORE FCS STACK POINTER
	SPHL
	MVI	A,44H	;ESC 'D'
	JMP	ESC1	;RETURN TO FCS


;---------JUMP TABLE FOR VERSIONS 6.78 OR 8.79 BASIC----------

SETUP:	LDA	0001H
	CPI	006CH	;VER. 6.78
	RNZ
	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	3392H		;LO
	JMP	33F4H		;OSTR
	JMP	262DH		;EMESS
	JMP	3077H		;PFSPC
	JMP	26A5H		;RESET
	JMP	2DABH		;OPEN
	JMP	30C6H		;RWSEQI
	JMP	322CH		;GTBYT
	JMP	3518H		;ADHLA
	JMP	33C3H		;S1OUT
	JMP	053AH		;ESC1
	JMP	3459H		;SUBHD
	JMP	3476H		;DIGIT
	JMP	3FD0H		;SAVE
	JMP	3460H		;SPNOR
	JMP	338BH		;CRLF
	JMP	3429H		;WATL
	JMP	343BH		;MOVDH
	JMP	339BH		;LBYT
	JMP	33AAH		;B2HEX

LENTAB	EQU	$-OLDTAB

NEWTAB:
LO:	JMP	17C8H
OSTR:	JMP	182AH
EMESS:	JMP	0AD6H
PFSPC:	JMP	14ADH
RESET:	JMP	0B48H
OPEN:	JMP	11E1H
RWSEQI:	JMP	14FCH
GTBYT:	JMP	1662H
ADHLA:	JMP	194EH
S1OUT:	JMP	17F9H
ESC1:	JMP	2420H
SUBHD:	JMP	188FH
DIGIT:	JMP	18ACH
SAVE:	JMP	0A2EH
SPNOR:	JMP	1896H
CRLF:	JMP	17C1H
WATL:	JMP	185FH
MOVDH:	JMP	1871H
LBYT:	JMP	17D1H
B2HEX:	JMP	17E0H

BAUDTB:	DB	0,01,82H,84H,88H,90H,0A0H,0C0H

SAVADR:	DW	1	;TEMP ADDRESS 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
TEMP:	DS	1	;TEMP STORAGE FOR CONV1
VAL:	DB	64H,0AH,01H,0
PGFL:	DB	1	;PAGE NUMBERING FLAG
PNUM:	DB	0	;PAGE NUMBER


;	MESSAGES

DEFAULT:DB	'SRC'

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 ',13,10,10
	DB	9,9,18,'RE-ENTER with ',17,'ESCAPE ^ (USER) '
	DB	18,13,10,10,239

MSG02:	DB	13,10,19,'< FILE NAME. TYPE; VERSION, '
	DB	'BAUD RATE > ',20,'( DEFAULTS TO 7 )'
	DB	21,13,10,10,'PRINT >  ',18,239

MSG03:	DB	17,' HARDWARE ERROR ! ',13,10,239

MSG04:	DB	19,13,10,10,9,'FOR A NEW FILE, PRESS ',17, ' P'
	DB	21,13,10,10,9,'TO RETAIN THIS FILE, USE ',17
	DB	' U',19,13,10,10,9,'TO  RE-ENTER THIS PROGRAM '
	DB	'FROM FCS, USE ',17,' ESCAPE ^',18,13,10,10,9
	DB	'FOR ',19,'FCS, ',18,'PRESS ',17,'RETURN '
	DB	18,239

MSG05:	DB	18,13,10,10,'ENTER:',19,9,'NUMBER OF '
	DB	'CHARACTERS PER LINE ',20,' DEFAULTS TO '
	DB	17,'60 ',19,239

MSG06:	DB	19,13,10,10,9,'NUMBER OF LINES PER '
	DB	'PAGE ',20,' DEFAULTS TO ',17,'56 ',19,239

MSG07:	DB	19,13,10,10,9,'NUMBER OF FORM FEEDS PER '
	DB	'PAGE ',20,' DEFAULTS TO ',17,'10 ',19,239

MSG08:	DB	19,13,10,10,9,'BLANK LINES AT '
	DB	'TOP FIRST PAGE ',20, ' DEFAULTS TO '
	DB	17,'0 ',19,239

MSG09:	DB	19,13,10,10,9,'BAUD RATE 1/7 (9600) ',20
	DB	'DEFAULTS TO ',17,'7 ',19,239


MSG10:	DB	19,13,10,10,9,'CANCEL PAGE NUMBERING ? '
	DB	20,'DEFAULTS TO 56/10 LINES '
	DB	17,'NO ',19,239

MSG11:	DB	19,13,10,10,9,'CREATE A NEW SOURCE FILE ? '
	DB	20,'DEFAULTS TO ',17,'NO ',19,239

MSG12:	DB	19,13,10,10,9,'CANCEL JUSTIFICATION ? '
	DB	20,'DEFAULTS TO ',17,'NO ',19,239

MSG13:	DB	19,13,10,10,9,'REJUSTIFY AN OLD FILE ? '
	DB	20,'DEFAULTS TO ',17,'NO ',22,239

MSG14:	DB	19,13,10,10,9,9,'TO CONTINUE, PRESS RETURN ',22
	DB	13,10,10,239

MSG15:	DB	21,9,9,'TO CANCEL PAUSE, PRESS SPACE BAR'
	DB	22,13,10,10,239

MSG16:	DB	19,13,10,10,9
	DB	'THE NEW FILE CONTAINS ',17,239

MSG17:	DB	'H ',19,'BYTES ',13,10,10,9
	DB	'DO YOU WISH TO SAVE IT ON DISC ? ',239

MSG18:	DB	13,10,10,18,'INSTALL A DISC WITH SUFFICIENT '
	DB	'SPACE IN THE DEFAULT DRIVE.',13,10,10
	DB	'WHEN READY, PRESS RETURN:',13,10,239

MSG19:	DB	6,3,27,'DSAV '
MSG19A:	DB	'     X.SRC '
MSG19B:	DB	'8302-'
MSG19C:	DB	'830C',13,27,27,13,10,10,239

MSG20:	DB	13,10,10,9,21,'THERE IS NO DATA IN THE '
	DB	'BUFFER.',19,13,10,10,239

MSG21:	DB	13,10,10,21,'WHICH DISC DRIVE WILL YOU '
	DB	'USING ? ',19,239
MSG21A:	DB	'  ',27,'DDEV0:',13,27,27,239

MSG22:	DB	19,27,'DDIR',13,27,27,239

MSG23:	DB	13,10,10,19,'TYPE THE NAME OF THE NEW FILE, '
	DB	'6 LETTERS OR LESS:  ',17,239

;	DATA AREAS

;	ORG	(($/256)+1)*256; PUT ON EVEN PAGE

;	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	56	;NUMBER OF LINES ON PAGE
WHITE:	DB	6	;BLANK LINES AT TOP OF PAGE
RATE:	DB	192  	;BAUD RATE (DEFAULTS TO 9600)
RJFLG:	DB	0	;REJUSTIFY FLAG
BYTCNT:	DW	1	;FOR NEW SRC FILE

NFADR:	DW	8302H	;HOLDS NEW FILE START ADDRESS

BUFFER:	DS	256

	DS	300	;STACK AREA
STACK:
FCSSP:	DW	01	;FCS STACK POINTER
FPB1:	DS	38	;INPUT FPB

LINBUF:	DS	50H

PRTBUF:	DS	50H


	ORG	8300H
GNUFIL:			;START A NEW FILE HERE


	ORG	9300H	;LOAD TEXT FILE HERE
TEXT:

	END	START