;************************************************
;*                                              *
;*           GRAPHIC PRINTING ROUTINE           *
;*        OKI 83A  AND 84 STEP 2 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
;
	JMP	0
	JMP	0
;
DUMPMS:	.BYTE	HOM,ESC,"S","1",ESC,"U",HLBOLD
NAME:	.ASCII	"   OKI 83   "	
	.BYTE	ESC,"S","0",ESC,"c"+080H
;
SCRSTR:	.BYTE	5,ESC,"%","9",12,CR	;CR FOR OKI83
;					;LF FOR OKI84 STEP 2
DUMPS:	MVI	A,239
	STA	GRFY
	XRA	A
	STA	DUBFLG
	MOV	H,A
	LDA	LINOFS
	MOV	L,A
	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
;
DUMPAL:	MVI	D,"7"
	CALL	ESCOUT	
	MVI	A,3AH	;CODE FOR LDA
	STA	GRFLIN	;RESTORE GRFLIN CODE
DUMPER:	MVI	B,8	
..L3:	PUSH	B
	CALL	GRFLIN
	CALL	TEX6H
	CALL	SCRL6	
	CALL	TEX4H
	CALL	INCOL
	CALL	GRFLIN
	CALL	TEX2L	
	CALL	SCRL6
	CALL	TEX6M	
	CALL	GRFLIN
	CALL	SCRL6	
	CALL	TEX2H	Š	CALL	INCOL
	CALL	GRFLIN
	CALL	TEX4L
	CALL	SCRL6	
	CALL	TEX6L
	CALL	INCOL
	CALL	GRFLIN
	CALL	SCRL6
	POP	B
	DJNZ	..L3
	JMP	RETURN
;
ESCOUT:	MVI	C,ESC
	CALL	CONOUT
	MOV	C,D
	JMP	CONOUT
;
LIST:	PUSH	B
	CALL	CONST
	JRZ	..L1
	CALL	CONIN
	CPI	ESC
	POP	B
	JZ	RETURN
	PUSH	B
..L1:	POP	B
LST2:	MVI	A,10H
	OUT	SPRTR
	IN	SPRTR
	ANI	24H
	CPI	24H
	JRNZ	LST2
	MOV	A,C
	OUT	DPRTR
	RET
;
QIKLIN:	MVI	B,80
	LXI	H,DSPBUF
	JMP	L1
;
QIKTEX:	LXI	H,NULL
	SHLD	MOD2+1
	MVI	C,CR
	CALL	LST2
	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 
	CALL	CHKLIN
 	CNZ	QIKLIN	;LINE
	LXI	H,CRLFS
	CALL	SNDSTR
	CALL	CONST
	JRZ	..M1
	CALL	CONIN
	POP	B
	CPI	ESC
	JRZ	ETX
	PUSH	B
..M1:	POP	B
	DJNZ	..Z1
ETX:	MVI	C,LF
	CALL	LST2
	JMP	RETVAL
;
CRLFS:	.BYTE	2,CR,LF
;
DUMPTX:	MVI	A,0C9H	;CODE FOR RETURN
	STA	GRFLIN	;DISABLE GRFLIN
	JMP	DUMPER
;
DUMPGR:	MVI	A,3AH
	STA	GRFLIN
	MVI	D,"7"
	CALL	ESCOUT
	MVI	A,239	;DUMP GRAPHICS ONLY
	STA	GRFY
	MVI	B,40
..L1:	PUSH	B
	CALL	GRFLIN
	CALL	SCRL6	
	POP	B
	DJNZ	..L1
	JMP	RETURN
;	
GRFLIN:	LDA	GRFY
	MOV	D,A
	XRA	A
	MOV	B,A
	MVI	C,DDSPY
	LXI	H,GRFBUF
..L2:	MVI	E,4
	PUSH	D
..L1:	MOV	A,D
	PUSH	B
	PUSH	H
	CALL	LINDSP
	POP	H
	POP	B
	OUT	SDSPY
	INP	A
	MOV	M,A
	INX	H
	DCR	D
	DCR	D
	DCR	E
	JRNZ	..L1
	INR	B
	MOV	A,B
	CPI	80	
	POP	D
	JRNZ	..L2
RETG:	MOV	A,D
	SUI	6
	STA	GRFY
	LXI	H,GRFBUF
	MVI	E,2
..L2:	MVI	B,160	
..L1:	MOV	A,M
	ANI	3FH
	JRNZ	PRNGRF
	INX	H
	DJNZ	..L1
	DCR	E
	JRNZ	..L2	
	RET
;
PRNGRF:	CALL	HIRES
	LXI	H,GRFBUF
	MVI	B,80
..L1:	LXI	D,BYTES
	PUSH	B
	LXI	B,4
	LDIR
	PUSH	H
	CALL	OUT4
	POP	H
	POP	B
	DJNZ	..L1
DON:	LXI	H,ENDGR
	JMP	SNDSTR
;
ENDGR:	.BYTE	3
	.BYTE	3,2,CR
;
OUT4:	CALL	MAKE
	LXI	H,PRNBYT
	MVI	B,4
.SD:	CALL	SND2
	MOV	A,M
	ANI	3FH
	CPI	3
	CZ	SND2
	INX	H
	DJNZ	.SD
	RET
;
SND2:	MOV	A,M
	ANI	3FH
	MOV	C,A
	CALL	LST2
	JMP	LST2
;
;
OUT42:	MVI	B,8	
	LXI	H,PRNBYT
L1:	MOV	A,M	
	INX	H
MOD2:	CALL	SIXHI	;MODIFIED
	MOV	C,A
	ANI	7FH
	CPI	3
	CZ	LST2
	CALL	LST2
	DJNZ	L1
	RET	
;
TWOHI:	RLC
	RLC
	ANI	3
	RET
;
FOURLO:	RLC
	RLC
	ANI	3CH	
	RET
;
SIXLL:	RRC
	RRC
SIXHI:	ANI	03FH	
NULL:	RET
;
TWOLO:	RLC
	RLC
	RLC
	RLC
	ANI	030H
	RET
;
ZROPRN:	LXI	H,PRNBYT
	PUSH	H
	SHLD	PRNPNT
	XRA	AŠ	MVI	B,8	
..L1:	MOV	M,A
	INX	H
	DJNZ	..L1
	POP	D
	LXI	H,BYTES
	RET
;
STLIN:	SHLD	MOD2+1
	CALL	REDLIN
	CALL	CHKLIN
	JNZ	SETLIN
	POP	H
	RET
;
TEX4L:	LXI	H,FOURLO
;
FIRST8:	CALL	STLIN
EL1:	PUSH	B
	MOV	A,M
	PUSH	H
	PUSH	D
	CALL	GETCHR
	CALL	MAKE
	SDED	PRNPNT
	INX	H
	CALL	MAKE99
	CALL	OUT42
	POP	D
	POP	H
	INX	H
	INX	D
	POP	B
	DJNZ	EL1
	JMP	DON
;
TEX6L:	LXI	H,SIXLL
;
LAST8:	CALL	STLIN
LL:	PUSH	B
	MOV	A,M
	PUSH	H
	PUSH	D
	CALL	GETCHR
	CALL	MAKE8
	SDED	PRNPNT
	LXI	H,BYTES+5
	CALL	MAKE88
	CALL	OUT42
	POP	D
	POP 	H
	INX	D
	INX	H
	POP	B
	DJNZ	LL
	JMP	DON
;
INCOL:	LHLD	COLŠ	INR	L
	MOV	A,L
	CPI	24
	JRNZ	..L2
	MVI	L,0
..L2:	XRA	A
	MOV	H,A
	SHLD	COL	
	RET
;
TEX6M:	LXI	H,SIXHI	
	JMPR	LAST8
;
TEX2L:	LXI	H,TWOLO
	JMPR	FIRST8
;
TEX6H:	LXI	H,SIXHI	
	JMPR	FIRST8
;
TEX4H:	LXI	H,FOURHI
	JMPR	LAST8
;
TEX2H:	LXI	H,TWOHI
	JMPR	LAST8
;
REDLIN:	XRA	A
	STA	COL+1	;ZERO COLUMN NUMBER
	LXI	H,DSPBUF
	LXI	D,ATTBUF
..L1:	PUSH	H
	PUSH	D
	CALL	REDTEX
	POP	D	;SAVE ATTRIBUTE
	XCHG
	MOV	M,A
	XCHG
	INR	H
	SHLD	COL
	MOV	B,H
	POP	H
	LDA	CHAR
	MOV	M,A	
	INX	H
	INX	D
..L4:	MOV	A,B
	CPI	80	
	JRC	..L1
	RET
;
REDTEX:	LHLD	COL
	MOV	A,L
	ORI	0E0H
	MOV	E,A
	OUT	SDSPY
	MOV	B,H
	MVI	C,DDSPY
	INP	A
	STA	CHAR
	MOV	A,E	
	ANI	0DFH
	OUT	SDSPY
	ANI	1FH
	MOV	L,A
	INP	A
	RET
;
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
	LXI	H,DSPBUF
	LXI	D,ATTBUF
	MVI	B,80
	RET
;			
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
;
CVRT20:	CALL	CVERT2
	JMP	PUTIN
;
CVRT21:	CALL	CVERT2
	JMP	IN3	
;
DOSIX:	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
CVRT22:	CALL	CVERT2
	JMP	IN2
;
MAKE8:	CALL	ZROPRN
	INX	H
	CALL	DOSIX
	LXI	H,BYTES+8
	JMPR	MAC2
;
MAKE88:	CALL	DOSIX
	LXI	H,BYTES+9
	JMPR	MAC2
;
MAKE:	CALL	ZROPRN	
MAKE99:	CALL 	DOSIX
	INX	H
MAC2:	LDED	PRNPNT
	MOV	A,M
	CALL	CVERT
	CALL	IN1
	MVI	B,1
	CALL	CVRT23
	MVI	B,2
	CALL	CVRT23
	MVI	B,3
CVRT23:	CALL	CVERT2
	JMP	IN1
;
GETCHR:	CALL	FINDCR
	POP	H
	XTHL
	MOV	A,M
	ANI	0FEH
	XTHL
	PUSH	H
	RZ	;FALL INTO ATTFIX IF NEEDED
;
	.PAGE
;###########################################
;PRINTER DEPENDANT CODE
;ATTFIX DEPENDS ON THE CHRGRF TABLE
;USED. THIS 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
	RZ
;
REVID:	MVI	B,10
	LXI	H,BYTES
..L1:	MOV	A,M
	CMA
	MOV	M,A
	INX	H
	DJNZ	..L1
	RET
;
BLDFAC:	LXI	H,BYTES
	MVI	B,10
..L1:	MOV	A,M
	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
FOURHI:	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
;
;THE FOLLOWING CODE IS DEPENDANT ON THE
;ACTUAL ESCAPE CODE AND ARRANGEMENT OF
;BITS ON THE PRINT HEAD
;
SETSTR:	.BYTE	7
	.BYTE	LF,29,ESC,"%","9",12,LF
;
SETPRN:	LXI	H,SETSTR
SNDSTR:	MOV	B,M
	INX	H
SND1:	MOV	C,M
	CALL	LST2
	INX	H
	DJNZ	SND1
	RET
;
SCRL6:	LXI	H,SCRSTR
	JMP	SNDSTR
;
PUTIN:	RRC
	RRC
IN3:	RRC
	RRC
IN2:	RRC
	RRC
IN1:	XCHG
	ORA	M
	MOV	M,A
	INX	H
	XCHG
	RET
;
CVERT2:	MOV	A,M
..L1:	RLC
	DJNZ	..L1
CVERT:	ANI	88H
	RRC
	MOV	B,A
	RRC
	RRC
	RRC
	ORA	B
	ANI	0C0H
	RET
;
HIRES:	MVI	C,3
	JMP	LIST
;
RETSTR:	.BYTE	5	
	.BYTE	ESC,"%","9",0,30
;
RETURN:	LXI	H,RETSTR
	CALL	SNDSTR
	MVI	D,"6"
	CALL	ESCOUT
	JMP	RETVAL	;EXEC MODULE
;
;END OF PRINTER DEPENDANT CODE
;###########################################
;
;	PUT UP PRINTER NAME ON MENU
;
PRNPNT:	.BLKW	1
DUBFLG:	.BYTE	0					
CHAR:	.BLKB	1
COL:	.BLKW	1
GRFY:	.BYTE	239
BYTES:	.BLKB	10
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
ATTBUF:	.BLKB	80
	.BLKB	80
DSPBUF:	.BLKB	80
;
;
	.END
