;************************************************
;*                                              *
;*           GRAPHIC PRINTING ROUTINE           *
;*                    EPSON                     *
;************************************************
;
	.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:	LHLD	1
	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 NEXT
;
DUMPAL:	MVI	D,"7"
	CALL	ESCOUT	
	MVI	A,3AH	;CODE FOR LDA
	STA	GRFLIN	;RESTORE GRFLIN CODE
DUMPER:	MVI	B,6	
..L3:	PUSH	B
	CALL	GRFLIN
	CALL	TEX8
	CALL	SCRLL
	CALL	TEX2H
	CALL	GRFLIN
	CALL	TEX6M	
	CALL	SCRLL
	CALL	TEX4H	
	CALL	GRFLIN
	CALL	TEX4L	
	CALL	SCRLL	
	CALL	TEX6H	Š	CALL	GRFLIN
	CALL	TEX2L
	CALL	SCRLL	
	CALL	TEX8H
	CALL	GRFLIN
	CALL	SCRLL
	POP	B
	DJNZ	..L3
	MVI	C,LF
	CALL	LIST	
	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
	MVI	C,CR
	CALL	LST2	
	MVI	C,LF
	CALL	LST2
	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
;
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,30
..L1:	PUSH	B
	CALL	GRFLIN
	CALL	SCRLL	
	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
..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
	DCR	D
	DCR	E
	JRNZ	..L1
	INR	B
	MOV	A,B
	CPI	80	
	JRZ	RETG
	MOV	A,D
	ADI	8
	MOV	D,AŠ	JMPR	..L2
RETG:	MOV	A,D
	STA	GRFY
	LXI	H,GRFBUF
	MVI	E,2
..L2:	MVI	B,160	
..L1:	MOV	A,M
	ORA	A
	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
	MVI	C,CR
	JMP	LIST
;
OUT4:	PUSH	D
	CALL	MAKE
	LXI	H,PRNBYT
	MVI	B,4
..L1:	MOV	C,M
	CALL	LST2
	MOV	C,M
	CALL	LST2
	INX	H
	DJNZ	..L1
	POP	D
	RET
;
OUT42:	MVI	B,8	
	LXI	H,PRNBYT
L1:	MOV	A,M	
MOD2:	CALL	NULL	;MODIFIED
	MOV	C,A
	CALL	LST2
	INX	H
	DJNZ	L1
	RET	
;
NULL:	RET
;
SIXHI:	RAL
	RAL
	ANI	0FCH
	RET
;
;
TWOHI:	RRC
	RRC
	ANI	0C0H
	RET
;
SIXLO:	RAR
	RAR
	ANI	3FH
	RET
;
;
TWOLO:	RLC
	RLC
	ANI	3
	RET
;
ZROPRN:	LXI	H,PRNBYT
	SHLD	PRNPNT
	XRA	AŠ	MVI	B,8	
..L1:	MOV	M,A
	INX	H
	DJNZ	..L1
	RET
;
ESCOD:	MVI	C,1BH
	CALL	LST2
	MOV	C,B
	JMP	LST2
;
TEX8:	LXI	H,NULL
;
FIRST8:	SHLD	MOD2+1
	CALL	REDLIN
	CALL	CHKLIN
	RZ
	CALL	SETLIN
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
	MVI	C,CR
	JMP	LIST
;
TEX8H:	LXI	H,NULL
;
LAST8:	SHLD	MOD2+1
	CALL	CHKLIN
	JZ	INCOL
	CALL	SETLIN
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
	MVI	C,CR
	CALL	LIST
	JMP	INCOL
;
;
TEX6M:	LXI	H,SIXLO
	JMPR	FIRST8
;
TEX4L:	LXI	H,FOURLO
	JMPR	FIRST8
;
TEX2L:	LXI	H,TWOLO
	JMPR	FIRST8
;
;
TEX6H:	LXI	H,SIXHI
	JMPR	LAST8
;
TEX4H:	LXI	H,FOURHI
	JMPR	LAST8
;
TEX2H:	LXI	H,TWOHI
	JMPR	LAST8
;
REDLIN:	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
;
INCOL:	LHLD	COLŠ	INR	L
	MOV	A,L
	CPI	24
	JRNZ	..L2
	MVI	L,0
..L2:	XRA	A
	MOV	H,A
	SHLD	COL	;FALL	IN
	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	
;
CVRT22:	CALL	CVERT2
	JMP	IN2
;
CVRT23:	CALL	CVERT2
	JMP	IN1
;
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
	JMP	CVRT22
;
MAKE8:	CALL	ZROPRN
	LXI	D,PRNBYT
	LXI	H,BYTES+1
	CALL	DOSIX
	LXI	H,BYTES+8
	LDED	PRNPNT
	JMP	MAC2
;
MAKE88:	CALL	DOSIX
	LXI	H,BYTES+9
	LDED	PRNPNT
	JMP	MAC2
;
MAKE:	CALL	ZROPRN	
	LXI	D,PRNBYT
	LXI	H,BYTES	
MAKE99:	CALL 	DOSIX
	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
;
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
	JRNZ	REVID	
	RET
;
;				FALL IN
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
FOURHI:	RAL
	RAL
	RAL
	RAL
	ANI	0F0H
	RET
;
SHFRGT:	MOV	A,M
FOURLO:	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
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;
IN1:	RRC	;THIS CODE IS DEPENDANT ON
	RRC	;THE LAYOUT OF THE HEAD.
IN2:	RRC	;THIS CODE IS FOR A HEAD
	RRC	;WITH BIT 7 ON THE TOP.
IN3:	RRC
	RRC
PUTIN:	XCHG
	ORA	M
	MOV	M,A
	INX	H
	XCHG
	RET
;
CVERT2:	MOV	A,M
..L1:	RLC
	DJNZ	..L1
CVERT:	ANI	88H
	MOV	B,A
	RLC
	RLC
	RLC
	ORA	B
	ANI	0C0H
	RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	.PAGE
;
;THE FOLLOWING CODE IS DEPENDANT ON
;THE ACTUAL ESCAPE CODES USED
;
;DELY:	LXI	H,0FFFFH
;..L2:	DCX	H
;	CALL	CONST
;	JRZ	..L3
;	CALL	CONIN
;	CPI	ESC
;	JZ	RETURN
;..L3:	MOV	A,L	
;	ORA	H
;	JRNZ	..L2
;	RET

;
SETPRN:	MVI	B,'A'	;SET FOR 8 DOT
	CALL	ESCOD	;SCROLL
	MVI	C,8
	CALL	LIST
;
;
SCRLL:	MVI	C,LF
	JMP	LST2
;
HIRES:	LXI	H,SCRSTR
SNDSTR:	MOV	B,M
	INX	H
SND1:	MOV	C,M
	CALL	LST2
	INX	H
	DJNZ	SND1
	RET
;
SCRSTR:	.BYTE	4,ESC,'L',128,2
;	
RETURN:	MVI	D,'6'
	CALL	ESCOUT
	LXI	H,RETSTR
	CALL	SNDSTR
	JMP	RETVAL
;
RETSTR:	.BYTE	3,ESC,'2',LF
;
;END OF PRINTER DEPENDANT CODE
;############################################
	.PAGE
;	
;	PUT UP PRINTER NAME ON MENU
;
DUMPMS:	.BYTE	HOM,ESC,"S","1",ESC,"U",HLBOLD
	.ASCII	"   EPSON    "
	.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
