;************************************************
;*                                              *
;*           GRAPHIC PRINTING ROUTINE           *
;*              OKI 84 PRINTER                  *
;************************************************
;
	.PABS
	.PHEX
	.XSYM
BASE	=	2000H
;
	.LOC	BASE+1800H
;
	JMP	DUMPS
;
HOM	=	1EH
HL	=	22H
HLBOLD	=	26H
SPC	=	20H
ESC	=	1BH
CR	=	0DH
LF	=	0AH
SPRTR	=	0F3H
DPRTR	=	0F2H
SDSPY	=	0EEH
DDSPY	=	0FEH
CONIN	=	BASE+9
CONOUT	=	BASE+6
VALDSP	=	BASE+6
DUMPMN	=	BASE+64H
LINOFS	=	BASE+6DH
LINDSP	=	BASE+21H
VALMSG	=	BASE+24H
RETVAL	=	BASE+0CH
BADKEY	=	BASE+37H
SOUND	=	BASE+1EH
GETDMP	=	BASE+6FH
CONST	=	BASE+7BH
;
;
DUMPS:	MVI	A,239
	STA	GRFY
	CALL	LINDSP
	MOV	A,B
	STA	LINOFS
	XRA	A
	STA	DUBFLG
	MOV	H,A
	MOV	L,B
	SHLD	COL
DUMPS1:	LHLD	DUMPMN
	CALL	VALMSG
	LXI	H,DUMPMS
	CALL	VALMSG
	CALL	GETDMP
	CPI	LF	
	JRNZ	NLF
	MOV	C,A
	CALL	LIST
	JMPR	DUMPS1
NLF:	CPI	ESC
	JZ	RETVAL
	ORA	A
	JZ	QIKTEX
	CPI	4
	JZ	RETVAL
	PUSH	PSW
	CALL	SETPRN
	POP	PSW
	DCR	A
	JZ	DUMPTX
	DCR	A
	JZ	DUMPGR
;
DOSCR:	MVI	C,CR
	CALL	LIST
	JMP	SETPRN
;
ESCOUT:	MVI	C,ESC
	CALL	CONOUT
	MOV	C,D
	JMP	CONOUT
;
;
LIST:	PUSH	B
	CALL	CONST
	POP	B
	JRZ	LST2
	PUSH	B
	CALL	CONIN
	POP	B
	CPI	ESC
	POP	B
	JZ	RETURN
LST2:	MVI	A,10H
	OUT	SPRTR	;OUTPUT TO PRINTER PORT
	IN	SPRTR
	ANI	24H
	CPI	24H
	JRNZ	LST2
	MOV	A,C
	OUT	DPRTR
	RET
;
;
QIKLIN:	MVI	B,80
	LXI	H,DSPBUF
	JMP	OUT42+5
;
;
QIKTEX:	MVI	C,CR
	CALL	LIST
	MVI	B,24
..Z1:	PUSH	B
	LXI	H,DSPBUF
..L1:	PUSH	H
	CALL	REDTEX
..L2:	PUSH	PSW
	LDA	CHAR
	CPI	7FH
	JRNC	..N2
	CPI	20H
	JRNC	..N1
..N2:	MVI	A,"*"
	STA	CHAR
..N1:	POP	PSW
	BIT	4,A	;DOUBLE WIDTH
	JRZ	..NODB	
	INR	H
	XTHL
	MVI	M,20H	;REPLACE 1ST CHAR
	INX	H	;WITH A SPACE
	XTHL
..NODB:	INR	H
	SHLD	COL
	MOV	B,H
	POP	H
	LDA	CHAR
	MOV	M,A
	INX	H
	MOV	A,B	
	CPI	80
	JRC	..L1
	CALL	INCOL	;RETURNS ZERO IF BLANK 
 	CNZ	QIKLIN	;LINE
	MVI	C,CR
	CALL	LST2	
	MVI	C,LF
	CALL	LST2
	CALL	CONST
	JRZ	..N3
	CALL	CONIN
	POP	B
	CPI	ESC
	JRZ	EXT
	PUSH	B
..N3:	POP	B
	DJNZ	..Z1
EXT:	MVI	C,LF
	CALL	LST2
	JMP	RETVAL
;
GRFLIN:	LDA	GRFY	;READ 320 BYTES
	MOV	D,A
	XRA	A	;OF GRAPHICS
	MOV	B,A
	MVI	C,DDSPY
	LXI	H,GRFBUF
..L2:	MVI	E,4	;READ FOUR VERTICAL BYTES
..L1:	MOV	A,D
	PUSH	H
	PUSH	B
	CALL	LINDSP
	POP	B
	POP	H
	OUT	SDSPY
	INP	A
	MOV	M,A
	INX	H
	DCR	D	;MOVE DOWN TWO SCAN LINES
	DCR	D	;(1 BYTE)
	DCR	E	
	JRNZ	..L1
	INR	B	;NEXT COLUMN
	MOV	A,B	
	CPI	80	;CHECK FOR COLUMN 80
	JRZ	RETG
	MOV	A,D	;IF NOT THEN MOVE UP 8 SCAN
	ADI	8	;LINES (4 BYTES) AND DO IT
	MOV	D,A	;AGAIN
	JMPR	..L2
RETG:	MOV	A,D
	STA	GRFY	;SAVE GRFY FOR NEXT LINE
	LXI	H,GRFBUF
	MVI	E,2
..L2:	MVI	B,160	
..L1:	MOV	A,M	;CHECK FOR EMPTY LINE
	ORA	A
	JRNZ	PRNGRF	;IF NOT EMPTY THEN 
	INX	H	;OUTPUT IT TO PRINTER
	DJNZ	..L1Š	DCR	E
	JRNZ	..L2	
	RET
;
PRNGRF:	CALL	HIRES	;SEND CODE FOR GRAPHICS LINE
	LXI	H,GRFBUF
	MVI	B,80	;80 COLUMNS
..L1:	LXI	D,BYTES
	PUSH	B
	LXI	B,4	;READ FOUR VERTICAL BYTES
	LDIR
	PUSH	H
	CALL	OUT4	;CONVERT & OUTPUT
	POP	H
	POP	B
	DJNZ	..L1
	MVI	C,CR	;PRINT LINE 
	JMP	LIST
;
OUT4:	PUSH	D
	CALL	MAKE	;CONVERT TO PRINTER FORMAT
	LXI	H,PRNBYT
	MVI	B,4	;AND OUTPUT EACH BYTE TWICE
..L1:	MOV	C,M
	CALL	LST2
	MOV	C,M
	CALL	LST2
	INX	H
	DJNZ	..L1
	POP	D
	RET
;
OUT42:	MVI	B,8	;OUTPUT ONCE FOR TEXT
	LXI	H,PRNBYT
..L1:	MOV	C,M	
	CALL	LST2
	INX	H
	DJNZ	..L1
	RET	
;
ZROPRN:	LXI	H,PRNBYT
	SHLD	PRNPNT	;CLEAR PRINTER BUFFER
	XRA	A
	MVI	B,8	
..L1:	MOV	M,A
	INX	H
	DJNZ	..L1
	RET
;
ESCOD:	MVI	C,1BH
	CALL	LST2	;SEND ESC
	MOV	C,B	;AND CODE IN [B]Š	JMP	LST2
;
TEXLIN:	LXI	H,DSPBUF	;CHAR BUFFER
	LXI	D,ATTBUF	;ATTRIBUTE BUFFER
..L1:	PUSH	H	
	PUSH	D
	CALL	REDTEX	;READ CAHR & ATTRIBUTE
	POP	D	;SAVE ATTRIBUTE
	XCHG
	MOV	M,A
	XCHG
	INR	H	;NEXT COLUMN
	SHLD	COL
	MOV	B,H
	POP	H
	LDA	CHAR
	MOV	M,A	
	INX	H	;DSPBUF
	INX	D	;ATTBUF
..L4:	MOV	A,B
	CPI	80	
	JRC	..L1
	CALL	INCOL	;DONE - CHECK FOR EMPTY LINE
	JRNZ	DOLIN	;OUTPUT IF NOT EMPTY
	JMÐ	SCRL2	
;
REDTEX:	LHLD	COL
	MOV	A,L	;READ 1 CHARACTER
	ORI	0E0H	;AND ATTRIBUTE 
	MOV	E,A
	OUT	SDSPY	;FROM SCREEN LINE & COLUMN
	MOV	B,H	;INDICATED BY COL
	MVI	C,DDSPY
	INP	A
	STA	CHAR
	MOV	A,E	
	ANI	0DFH
	OUT	SDSPY
	ANI	1FH
	MOV	L,A
	INP	A	;RETURN WITH ATTRIBUTE IN A
	RET
;	
INCOL:	LHLD	COL	;MOVE TO NEXT LINE
	INR	L
	MOV	A,L
	CPI	24
	JRNZ	..L2
	MVI	L,0	;SET COLUMN TO ZERO
..L2:	XRA	A
	MOV	H,A
	SHLD	COL	;FALL	IN
;
CHKLIN:	MVI	B,80		;CHECK FOR EMPTY LINEŠ	LXI	H,DSPBUF
..L3:	MOV	A,M
	CPI	20H
	RNZ	
	INX	H
	DJNZ	..L3	
	RET
;	
SETLIN:	CALL	HIRES	;SET UP FOR TEXT LINE
	LXI	H,DSPBUF
	LXI	D,ATTBUF
	MVI	B,80
	RET
;			
DOLIN:	CALL	SETLIN	
..L1:	PUSH	B	;OUTPUT THE TOP 8 BITS
	MOV	A,M	;OF THE TEXT LINE
	PUSH	H
	PUSH	D
	CALL	GETCHR	;FIND IMAGE FROM CHARACTER
	CALL	MAKE	;GENERATOR TABLE & CONVERT
	SDED	PRNPNT	;TO PRINTER FORMAT
	INX	H
	CALL	MAKE99
	CALL	OUT42	;OUTPUT 1 CHARACTER
	POP	D
	POP	H
	INX	H	;DSPBUF
	INX	D	;ATTBUF
	POP	B
	DJNZ	..L1
	CALL	SCRL2	
;
LIN2:	CALL	SETLIN
..L2:	PUSH	B
	MOV	A,M	;DO THE LAST TWO BITS
	PUSH	H
	PUSH	D
	CALL	GETCHR
	CALL	MAKE2
	SDED	PRNPNT
	INX	H
	CALL	MAC2
	CALL	OUT42
	POP	D
	POP	H
	INX	D
	INX	H
	POP	B
	DJNZ	..L2
	MVI	C,CR
	JMP	LIST	
;
;
FINDCR:	LXI	H,CHRTBL
	MOV	E,A
	MVI	D,0
	MVI	B,10
..L1:	DAD	D
	DJNZ	..L1
	LXI	B,10
	LXI	D,BYTES
	LDIR
	RET
;
;
GETCHR:	CALL	FINDCR
	POP	H	;FIND CAHRACTER
	XTHL		;AND CHECK ATTRIBUTE
	MOV	A,M
	ANI	0FEH
	XTHL
	PUSH	H
	RZ              ;FALL THROUGH TO
			;ATTFIX IF NEEDED
;
	.PAGE
;############################################
;         START OF PRINTER DEPENDANT CODE
;
;ATTFIX DEPENDS ON THE CHRGRF TABLE USED
;
;THIS CODE IS FOR CHRGRF.TAB
;
;
ATTFIX:	MOV	C,A
	BIT	4,A
	CNZ	DUBFIX
	MOV	A,C
	BIT	3,A
	CNZ	BLDFAC
	MOV	A,C
	BIT	5,A	;UNDERLINE
	CNZ	UNDLIN
	MOV	A,C
	BIT	6,A
	JRZ	..L1
	BIT	7,A
	JRNZ	STRKTH
	CALL	SUPSCR	;SUPERSCRIPT
	JMPR	REVRS
..L1:	BIT	7,A
	CNZ	SUBSCR	;SUBSCRIPT
	JMPR	REVRS
STRKTH:	LXI	H,BYTES+2	;STRIKE THROUGH
	CALL	FF
	LXI	H,BYTES+6Š	CALL	FF
REVRS:	MOV	A,C
	BIT	1,A	;REVERSE VIDEO
	JRNZ	REVID	
	RET
;
REVID:	MVI	B,10	
	LXI	H,BYTES
..L1:	MOV	A,M
	CMA		;COMPLEMENT ALL BYTES FOR
	MOV	M,A	;REVERSE VIDEO
	INX	H
	DJNZ	..L1
	RET
;
BLDFAC:	LXI	H,BYTES
	MVI	B,10	;FOR BOLDFACE ROTATE
..L1:	MOV	A,M	;AND OR IT
	ANI	77H	
	RAL
	ORA	M
	MOV	M,A
	INX	H
	DJNZ	..L1
	RET
;
;
UNDLIN:	LXI	H,BYTES+9
	CALL	FF
	DCX	H
FF:	MVI	A,0F0H	
	ORA	M
	MOV	M,A
	RET
;
SUPSCR:	PUSH	D
	LXI	H,BYTES
	MVI	B,3	
..L1:	CALL	SHIFT
	DJNZ	..L1
	LXI	H,BYTES+8
	CALL	SHFRGT
	MOV	D,A
	XRA	A
	MOV	M,A
	LXI	H,BYTES+3	
	CALL	SHFLFTŠ	ORA	D
	MOV	M,A
	INX	H
	MVI	B,3
..L2:	CALL	SHIFT
	DJNZ	..L2
	LXI	H,BYTES+9
	CALL	SHFRGT
	MOV	D,A
	XRA	A
	MOV	M,A
	LXI	H,BYTES+7
	CALL	SHFLFT
	ORA	D
	JMPR	SCRDON
;	
SHFLFT:	MOV	A,M
	RAL
	RAL
	RAL
	RAL
	ANI	0F0H
	RET
;
SHFRGT:	MOV	A,M
	RAR
	RAR
	RAR
	RAR
	ANI	0FH
	RET
;
SHIFT:	CALL	SHFLFT
	INX	H
	MOV	D,A
	CALL	SHFRGT
	ORA	D
	DCX	H
	MOV	M,A
	INX	H
	RET
;
SUBSCR:	PUSH	D
	LXI	H,BYTES+3
	CALL	SHFLFT
	MOV	D,A
	LXI	H,BYTES+8
	CALL	SHFRGT
	ORA	D
	MOV	M,A
	MVI	B,3
	LXI	H,BYTES+3
..L1:	CALL	SHIFT1
	DJNZ	..L1
	XRA	A
	MOV	M,A
	LXI	H,BYTES+7Š	CALL	SHFLFT
	MOV	D,A
	LXI	H,BYTES+9
	ORA	D
	MOV	M,A
	MVI	B,3
	LXI	H,BYTES+7	
..L2:	CALL	SHIFT1
	DJNZ	..L2
	XRA	A
SCRDON:	MOV	M,A
	POP	D
	RET
;
SHIFT1:	CALL	SHFRGT
	MOV	D,A
	DCX	H
	CALL	SHFLFT
	INX	H
	ORA	D
	MOV	M,A
	DCX	H
	RET
;
DUBFIX:	PUSH	B
	PUSH	D
	PUSH	H
	LDA	DUBFLG
	ORA	A
	JRZ	HALF1
HALF2:	XRA	A
	STA	DUBFLG
	LXI	D,BYTES
	LXI	H,BYTES+4
	MVI	B,4	
..L1:	PUSH	B
	CALL	STRCH
	CALL	SHFT
	CALL	STRCH1
	ORA	C
	ORA	B
	MOV	M,A
	INX	H
	INX	D
	POP	B
	DJNZ	..L1
	LXI	H,BYTES+9
	LXI	D,BYTES+8
	CALL	STRCH
	CALL	SHFT
	CALL	STRCH1
	JMPR	HFDON
;
HALF1:	CMA	
	STA	DUBFLG
	LXI	D,BYTES+4
	LXI	H,BYTESŠ	MVI	B,4	
..L1:	PUSH	B
	CALL	STRCH1
	CALL	SHFT
	CALL	STRCH
	ORA	C
	ORA	B
	MOV	M,A
	INX	H
	INX	D
	POP	B
	DJNZ	..L1
	LXI	H,BYTES+8
	LXI	D,BYTES+9
	CALL	STRCH1
	CALL	SHFT
	CALL	STRCH
HFDON:	ORA	C
	ORA	B
	MOV	M,A
	POP	H
	POP	D
	POP	B
	RET
;
STRCH:	MOV	A,M
	MOV	C,A
	ANI	44H
	RRC
	RRC
	MOV	B,A
	RLC
	ORA	B
	MOV	B,A
	MOV	A,C
	ANI	88H
	RRC
	MOV	C,A
	RLC
	RET
;
STRCH1:	MOV	A,M
	MOV	C,A
	ANI	22H
	RLC
	RLC
	MOV	B,A
	RRC
	ORA	B
	MOV	B,A
	MOV	A,C
	ANI	11H
	RLC
	MOV	C,A
	RRC
	RETŠ;
SHFT:	ORA	C
	ORA	B
	XCHG
	MOV	M,A
	XCHG
	RET
;
	.PAGE
;
DUMPALº	MVI	D,"7"
	CALL	ESCOUT
	MVÉ	B,¶	;DUMÐ ENTIRÅ SCREEN
..L3:	PUSH	B
	CALL	GRFLIN	;LOOP THROUGH THIS SEQUENCE
	CALL	TEXLIN
	CALL	SCRL6	;6 TIMES
	CALL	GRFLIN
	CALL	SCRL2
	CALL	TEXLIN
	CALL	SCRL4	
	CALL	GRFLIN
	CALL	SCRL4
	CALL	TEXLIN
	CALL	SCRL2	
	CALL	GRFLINŠ	CALL	SCRL6
	CALL	TEXLIN
	CALL	GRFLIN
	CALL	SCRL8
	POP	B
	DJNZ	..L3
	CALL	SCRL2	
	MVI	C,LF
	CALL	LIST	
	JMP	RETURN
;
DUMPTX:	MVI	B,24	;DUMP TEXT ONLY
..L1:	PUSH	B	;WITH ALTERNATE SETS
	CALL	TEXLIN	;AND ATTRIBUTES
	CALL	SCRL8	
	POP	B
	DJNZ	..L1
	JMP	RETURN
;
DUMPGR:	MVI	D,"7"
	CALL	ESCOUT
	MVI	A,239	;DUMP GRAPHICS ONLY
	STA	GRFY
	MVI	B,30
..L1:	PUSH	B
	CALL	GRFLIN
	CALL	SCRL8	
	POP	B
	DJNZ	..L1
	JMP	RETURN
;
;
SETPRN:	MVI	C,29	;CONDENSED PRINT
	CALL	LIST
	MVI	C,CR
	JMP	LIST
;
;
;
SCRL2:	MVI	B,4
	JMPR	SCRLL
;
SCRL4:	MVI	B,7		
	JMPR	SCRLL
;
SCRL6:	MVI	B,12	
	JMPR	SCRLL
;		
SCRL8:	MVI	B,16		
;
SCRLL:	PUSH	B
	CALL	CONST
	POP	B
	JRZ	..L2
	CALL	CONIN
	CPI	ESC
	JZ	RETURN
..L2:	PUSH	B
	MVI	B,"%"
	CALL	ESCOD
	MVI	C,"9"	;
	CALL	LIST
	POP	B
	MOV	C,B
	CALL	LIST
	MVI	C,LF	
	JMP	LIST
;
MAKE2:	CALL	ZROPRN	;CONVERT THE LAST TWO BYTES
	LXI	H,BYTES+8
	LXI	D,PRNBYT	
	JMP	MAC2	;TO PRINTER FORMAT
	
MAKE:	CALL	ZROPRN
	LXI	D,PRNBYT
	LXI	H,BYTES
MAKE99:	MOV	A,M
	CALL	CVERT
	CALL	PUTIN
	MVI	B,1
	CALL	CVRT20
	MVI	B,2
	CALL	CVRT20
	MVI	B,3
	CALL	CVRT20	
	INX	H	
	LDED	PRNPNT	
	MOV	A,M	
	CALL	CVERT	
	CALL	IN3	
	MVI	B,1	
	CALL	CVRT21	
	MVI	B,2	
	CALL	CVRT21	
	MVI	B,3	Š	CALL	CVRT21	
	INX	H	
	LDED	PRNPNT
	MOV	A,M
	CALL	CVERT
	CALL	IN2
	MVI	B,1	
	CALL	CVRT22
	MVI	B,2
	CALL	CVRT22
	MVI	B,3
	CALL	CVRT22
	INX	H
	LDED	PRNPNT
MAC2:	MOV	A,M
	CALL	CVERT
	CALL	IN1
	MVI	B,1
	CALL	CVRT23
	MVI	B,2
	CALL	CVRT23
	MVI	B,3
	JMP	CVRT23
;
;
;
IN1:	RRC
	RRC
IN2:	RRC
	RRC
IN3:	RRC
	RRC
PUTIN:	XCHG
	ORA	M
	MOV	M,A
	INX	H
	XCHG
	RET
;
CVRT20:	CALL	CVERT2	
	JMP	PUTIN
;
CVRT21:	CALL	CVERT2
	JMP	IN3	
;
CVRT22:	CALL	CVERT2
	JMP	IN2
;
CVRT23:	CALL	CVERT2
	JMP	IN1
;
;
CVERT2:	MOV	A,M
..L1:	RLC
	DJNZ	..L1
CVERT:	ANI	88H
	MOV	B,A
	RLC
	RLC
	RLC
	ORA	B
	ANI	0C0H
	RET
;
HIRES:	MVI	B,"%"
	CALL	ESCOD
	MVI	C,"1"			
	CALL	LST2
	MVI	C,5	;640 BYTES OF 
	CALL	LST2	;GRAPHIC DATA
	MVI	C,0
	JMP	LST2
;	
RETURN:	MVI	B,0	;NORMAL LINE SPACING
	CALL	SCRLL	
	MVI	B,"0"	;SET DATA PROCESSING MODE
	CALL	ESCOD
	MVI	C,30	;NORMAL CHAR WIDTH
	CALL	LST2
	MVI	D,"6"	;GRAPHICS OFF
	CALL	ESCOUT
	MVI	C,LF	
	CALL	LST2
	JMP	RETVAL	;RETURN TO EXECUTIVE
			;MODULE
;
;END OF PRINTER DEPENDANT CODE
;###########################################
;
;	PUT UP PRINTER NAME ON MENU
;
DUMPMS:	.BYTE	HOM,ESC,"S","1",ESC,"U",HLBOLD
	.ASCII	"   OKI 84   "
	.BYTE	ESC,"S","0",ESC,"=",23+20H,80+0A0H
;
;
PRNPNT:	.BLKW	1
DUBFLG:	.BYTE	0					
CHAR:	.BLKB	1
COL:	.BLKW	1
GRFY:	.BYTE	239
BYTES:	.BLKB	4
TEXBYT:	.BLKB	6
PRNBYT:	.BLKB	8
;
	.LOC	BASE+1800H+5FFH	;CHARACTER GENERATOR TABLE START
;	
CHRTBL:	.BLKB	2560	;CHARACTER GENERATOR ROM IMAGE
;
LSTBYT	=	.
;
	.LOC	BASE+1800H-320
;
GRFBUF:	.BLKB	80
	.BLKB	80
ATTBUF:	.BLKB	80
DSPBUF:	.BLKB	80
;
	.END
