Compucolor.org – Virtual Media

Listing of file='TEXT.MAC;01' on disk='vmedia/text_formatter-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	SMART PRINTER DRIVER
;	   V3.3	12/80
;
;	COPYRIGHT 1980 BY TREVOR TAYLOR
;
	TITLE	PRINT

;
;	REQD ROUTINES:
;
	EXTRN	JMPVEC,CO,OSTR
	EXTRN	FILVEC,FCS,GTBYT
	EXTRN	SETFIL
	EXTRN	CPYRGT
	EXTRN	PRTCHR
	EXTRN	GENHDR
	EXTRN	FFEED,HEADER
	EXTRN	PRTLIN
;
;	EXTERNAL VARIABLES:
;
	EXTRN	CHRCNT,LINCNT,PAGCNT,HDRMSG
;
;	SYSTEM EQUATES
;
KBDFL	EQU	81DFH		;HOLDS NUMBER OF JUMP VECTOR
BAUD	EQU	81E2H		;CURRENT BAUD RATE
READY	EQU	81FFH		;KEYBOARD STATUS
KBCHA	EQU	81FEH		;KEYBOARD CHAR
;
;	SPECIAL CONTROL CHARACTERS
;
TAB	EQU	9
LF	EQU	10
FF	EQU	12
CR	EQU	13
ESC	EQU	27

FDRV	EQU	29

;..............................................................
;
;	USER DEFINED PARAMETERS
;
	PUBLIC	RATE,LINLEN,PAGLEN,FFFLAG,SKPLEN,SNGLE
	PUBLIC	HDRFLG,DELTIM

RATE:	DB	88H	;BAUD RATE (88H=1200)

LINLEN:	DB	80	;LINE LENGTH

PAGLEN:	DB	60	;PAGE LENGTH (NO. OF LINES
			;   ACTUALLY PRINTED ON A PAGE)

FFFLAG:	DB	0FFH	;FORM FEED FLAG:
			;    0        = PRINTER CANNOT DO FF'S
			;    NOT ZERO = PRINTER CAN FORM FEED

SKPLEN:	DB	0	;NUMBER OF LINES TO SKIP FOR
			;   PAGE PERFORATIONS:
			;    0  = PRINTER DOES IT
			;    N  = NUMBER OF LINE-FEEDS
;
;*** NOTE: IF SKPLEN <> 0, THEN
;		PAGLEN + SKPLEN = ACTUAL PHYSICAL PAGE LENGTH
;

SNGLE:	DB	0	;SINGLE PAGE FLAG (I.E. PAPER IS NOT
			;   CONTINUOUS):
			;    0        = CONTINUOUS FORMS
			;    NOT ZERO = SINGLE SHEETS

HDRFLG:	DB	0FFH	;HEADER FLAG:
			;    0        = NO HEADER
			;    NOT ZERO = PRINT PAGE HEADINGS

DFAULT:	DB	'SRC'	;DEFAULT FILE TYPE

DELTIM:	DB	1	;DELAY TIME FOR MECHANICAL PRINTER
			;   MOTIONS:
			;   CR = 4*DELTIM
			;   LF = DELTIM (OR 2*DELTIM IN FF'S)
			;   FF = 20*DELTIM
;
;*** NOTE: DO NOT SET THIS TO ZERO - ZERO CAUSES ENORMOUS
;	   DELAYS. THE MAXIMUM VALUE EVER USED SHOULD BE 12.
;
;.............................................................
;
;	START OF PROGRAM

PRINT:	DI
	LXI	H,0		;SAVE FCS STACK POINTER
	DAD	SP
	SHLD	FCSSP
	LXI	SP,STACK	;SETUP RUNOFF STACK
	CALL	JMPVEC		;SETUP REQUIRED JUMP VECTORS
	CALL	FILVEC
	MVI	A,12		;SET KEYBOARD INPUT TO DUMP
	STA	KBDFL
	LDA	RATE		;FIX BAUD RATE
	OUT	5
	STA	BAUD
	EI

	XRA	A
	STA	CHRCNT		;START AT COLUMN ZERO,
	STA	LINCNT		;   LINE ZERO AND
	STA	PAGCNT		;   PAGE ZERO

	LXI	H,IDMSG		;PRINT STARTUP MSG
	CALL	OSTR

	LXI	H,IBUF
	CALL	CPYRGT		;PRINT/CHECK COPYRIGHT NOTICE

FILES:	LXI	H,FPB		;OPEN FILE
	LXI	D,IBUF
	LXI	B,DFAULT
	XRA	A
	CALL	SETFIL
	SHLD	FILPTR		;SAVE POINTER TO FILE NAME

	LDA	HDRFLG		;SKIP GENERATING HEADER IF IT
	ORA	A		;   IS NOT REQUIRED
	JZ	LOOP
	LDA	FPB+FDRV	;GET DRIVE NUMBER AND
	LHLD	FILPTR		;   FILE NAME
	XCHG
	LXI	H,HDRMSG	;   AND POINT TO HEADER MSG
	CALL	GENHDR		;MAKE MESSAGE
	CALL	HEADER		;PRINT HEADER TO START WITH

LOOP:	LXI	H,FPB		;POINT AT FILE PARAMETER BLOCK
	CALL	GTBYT		;GET NEXT BYTE
	JC	EOFTST		;<C>=ERROR OR END OF FILE
	CALL	PRTCHR		;PRINT CHAR
ABTEST:	LDA	READY		;SEE IF BREAK
	CPI	50H		;
	JZ	ABTEST		;HANG UNTIL ANOTHER IS STRUCK
	CPI	80H
	JNZ	LOOP
	XRA	A
	STA	READY
	LDA	KBCHA		;READ NEXT CHARACTER
	CPI	LF		;SEE IF LF
	JZ	EXIT		;EXIT IF LF
	CPI	ESC
	JZ	EXIT		;   OR IF ESCAPE
	JMP	LOOP

EOFTST:	JZ	EXIT

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

EXIT:	XRA	A
	STA	SNGLE
	CALL	FFEED		;FINISH WITH A FORM FEED
	MVI	A,13		;RESTORE INPUT TO FCS
	STA	KBDFL
	MVI	B,0		;SETUP NO ERROR
	LHLD	FCSSP		;RESTORE FCS STACK
	SPHL
	RET			;AND EXIT TO FCS

;..............................................................
;
;	MESSAGES

IDMSG:	DB	29,27,11,15,6,1,CR,LF,'   PRINT '
	DB	6,7,'V3.3 ',239
ERRMSG:	DB	17,'*** HARDWARE ERROR ***',13,10,239

;	DATA AREAS

FILPTR:	DS	2	;POINTER TO FILE NAME
IBUF:	DS	1024	;INPUT BUFFER

	DS	300	;STACK AREA
STACK:

	PUBLIC	FCSSP	;USED TO EXIT ELSEWHERE

FCSSP:	DS	2	;FCS STACK POINTER
FPB:	DS	38	;INPUT FPB

	END	PRINT