;PAGE	64

;	.PAGE
;	.TITLE	'PRINTER	***** PRINTP.SRC ***** 3/9/79 *****	4:00:00 P
;
;
;
;
;
;
;
;
;
;
;
;	DEVICE NUMBER OR CODE EQUATES
;

OPNOUT	=	$2	;IOCB OPEN FOR OUTPUT COMMAND
NBUFSZ	=	40	;PRINT NORMAL BUFFER SIZE
DBUFSZ	=	20	;PRINT DOUBLE BUFFFER SIZE
SBUFSZ	=	29	;PRINT SIDEWAYS BUFFER SIZE
PDEVN	=	$40	;PRINTER DEVICE NUMBER
; STATC =	$53	;DCB STATUS COMMAND CODE
WRITEC	=	$57	;DCB WRITE COMMAND
SPACE	=	$20	;ASCII SPACE CHAR.
N	=	$4E	;ASCII "N" CHAR.
D	=	$44	;ASCII "D" CHAR.
; S	=	$53	;ASCII "S" CHAR

; ca65 rejects the line above, saying syntax error:
; so try this, which works.

	_S = $53
;
;
;	PRINTER HANDLER ENTRY POINTS
;
;
;
;
	.ORG	$E430
;
	.WORD	PHOPEN-1	;PRINTER HANDLER OPEN
	.WORD	PHCLOS-1	;PH CLOSE
	.WORD	BADST-1		;PH READ
	.WORD	PHWRIT-1	;PH WRITE
	.WORD	PHSTAT-1	;PH STATUS
	.WORD	BADST-1		;PH SPECIAL
	JMP	PHINIT		;PH INIT.
	.BYTE	0		;ROM FILLER
;
;
;
;
;
	.ORG	PRNORG
;
;
;
;
;	PRINTER HANDLER INITIALIZATION ROUTINE
 

;PAGE	65

;
PHINIT: LDA	#30
	STA	PTIMOT		;SET UP INITIAL PRINTER TIMEOUT OF 30 SEC.
	RTS
;
;
;	PRINTER HANDLER CONSTANTS
;
PHSTLO: .WORD	DVSTAT		;STATUS BUFFER POINTER
PHCHLO: .WORD	PRNBUF		;CHAR. BUFFER POINTER
;
;
;
;	************************
;	PRINTER HANDLER ROUTINES
;	************************
;
;
;
;
;
;	PRINTER HANDLER STATUS ROUTINE
;
PHSTAT: LDA	#4
	STA	PBUFSZ		;SET BUFFER SIZE TO 4 BYTES
	LDX	PHSTLO
	LDY	PHSTLO+1	;SET POINTER TO STATUS BUFFER
	LDA	#STATC		;SET COMMAND TO "STATUS"
	STA	DCOMND		;SET STATUS COMMAND
	STA	DAUX1
	JSR	SETDCB		;GO SETUP DCB
	JSR	SIOV		;SEND STATUS COMMAND
	BMI	BADST		;GO IF ERROR
	JSR	PHPUT		;YES,PUT STATUS INTO GLOBAL BUFFER.
BADST:	RTS
;
;
;
;
;	PRINTER HANDLER OPEN ROUTINE
;
PHOPEN: JSR	PHSTAT		;DO STATUS COMMAND TO SIO
	LDA	#0
	STA	PBPNT		;CLEAR PRINT BUFFER POINTER
	RTS
;
;
;
;
;	PRINTER HANDLER WRITE ROUTINE
;
PHWRIT: STA	PTEMP		;SAVE ACCUM
	JSR	PRMODE		;GO DETERMINE PRINT MODE
	LDX	PBPNT

;PAGE	66

	LDA	PTEMP		;GET CHAR. SENT BY CIO
	STA	PRNBUF,X	;PUT CHAR. IN PRINT BUFFER
	INX			;INCR. BUFFER POINTER
	CPX	PBUFSZ		;BUFFER POINTER=BUFFER SIZE?
	BEQ	BUFFUL
	STX	PBPNT		;SAVE BUFFER POINTER
	CMP	#CR		;IS CHAR. = EOL ?
	BEQ	BLFILL		;IF YES, GO DO BLANK FILL.
	LDY	#SUCCES		;PUT GOOD STATUS IN Y REG FOR CIO.
	RTS
BLFILL: LDA	#SPACE		;PUT BLANK IN ACCUM.
FILLBF: STA	PRNBUF,X	;STORE IT IN PRINT BUFFER.
	INX
	CPX	PBUFSZ
	BNE	FILLBF		;BUFFER BLANK FILLED?
BUFFUL: LDA	#0
	STA	PBPNT		;CLEAR PRINT BUFFER POINTER
	LDX	PHCHLO
	LDY	PHCHLO+1	;SET POINTER TO PRINT BUFFER
	JSR	SETDCB		;GO SETUP DCB
	JSR	SIOV		;SEND PRINT COMMAND
	RTS			;YES.
;
;
;
;
;	PRINTER HANDLER CLOSE ROUTINE
;
PHCLOS: JSR	PRMODE		;GO DETERMINE PRINT MODE
	LDX	PBPNT
	BNE	BLFILL
	LDY	#SUCCES
	RTS
;
;
;
;
;
;
;
;
;	S U B R O U T I N E S
;
;
;
;
;
;	SET UP DCB TO CALL SIO
;
SETDCB: STX	DBUFLO
	STY	DBUFHI		;SET BUFFER POINTER
	LDA	#PDEVN
	STA	DDEVIC		;SET PRINTER BUS I.D. FOR DCB
	LDA	#1

;PAGE	67

	STA	DUNIT		;SET UNIT NUMBER TO 1
	LDA	#$80		;DEVICE WILL EXPECT DATA
	LDX	DCOMND
	CPX	#STATC		;STATUS COMMAND?
	BNE	PSIOC
	LDA	#$40		;EXPECT DATA FROM DEVICE
PSIOC:	STA	DSTATS		;SET SIO MODE COMMAND.
	LDA	PBUFSZ
	STA	DBYTLO		;SET LO BYTE COUNT
	LDA	#0
	STA	DBYTHI		;SET HI BYTE COUNT
	LDA	PTIMOT
	STA	DTIMLO		;SET DEVICE TIMEOUT COUNT
	RTS
;
;
;
;
; GET DEVICE TIMEOUT FROM STATUS & SAVE IT
;
PHPUT:	LDA	DVSTAT+2
	STA	PTIMOT		;SAVE DEVICE TIMEOUT
	RTS
;
;
;
;
; DETERMINE PRINT MODE & SETUP PRINT BUFFER SIZE, DCB PRINT
; COMMAND, & DCB AUX1 FOR PRINT MODE
;
PRMODE: LDY	#WRITEC		;PUT WRITE COMMAND IN Y REG
	LDA	ICAX2Z		;READ PRINT MODE
CMODE:	CMP	#N
	BNE	CDUBL		;PRINT NORMAL ?
	LDX	#NBUFSZ		;YES, SET NORMAL CHAR. BUFFER SIZE
	BNE	SETBSZ
CDUBL:	CMP	#D
	BNE	CSIDE		;PRINT DOUBLE?
	LDX	#DBUFSZ		;YES, SET DOUBLE CHAR. BUFFER SIZE
	BNE	SETBSZ

; ca65 reports this line has trailing garbage characters:
; CSIDE:	CMP	#S		;PRINT SIDEWAYS ?
; so try this:
CSIDE:	CMP	#_S		;PRINT SIDEWAYS ?

	BNE	GOERR		;IF NOT, GO TO ERROR ROUTINE
	LDX	#SBUFSZ		;YES, SET SIDEWAYS BUFFER SIZE
SETBSZ: STX	PBUFSZ		;STORE PRINT BUFFER SIZE
	STY	DCOMND		;STORE DCB COMMAND
	STA	DAUX1		;STORE DCB AUX1 PRINT MODE
	RTS
GOERR:	LDA	#N		;SET DEFAULT PRINT MODE TO NORMAL
	BNE	CMODE
;*************************************************************
;
;
; SPARE BYTE OR MODULE TOO LONG FLAG
;
;PAGE	68

CRNTP5	=	*
;
	.ORG	$14
;
PRNSPR: .BYTE	CASORG-CRNTP5 ;^GPRINTP TOO LONG
;
 

