;************************************************
;*                                              *
;*           GRAPHIC PRINTING ROUTINE           *
;*                 C.ITOH 8510A                 *
;************************************************
;
	.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
;
GRLINS:	.BYTE	30	;30 FOR 8 BIT / 40 FOR 6 BIT
;
DUMPMS:	.BYTE	HOM,ESC,"S","1",ESC,"U",HLBOLD
NAME:	.ASCII	"   C.ITOH   "
	.BYTE	ESC,"S","0",ESC,"c"+80H
;
SCRSTR:	.BYTE	2,CR,LF		;SCROLL 8/6 BITS-10 BYTES ALLOCATED
	.BLKB	7
GRFSTR:	.BYTE	8,ESC,'Q',ESC,'S',30H,36H,34H,30H	;GRAPHICS MODE
	.BLKB	1
SETSTR:	.BYTE	6,ESC,'T',31H,36H,ESC,'N'	;SET-UP PRINTER
	.BLKB	3
RETSTR:	.BYTE	3,ESC,'A',LF		
	.BLKB	6
ENDGR:	.BYTE	1,CR
	.BLKB	8
;
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	LST2
	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
	JMP	DUMPAL
;
ESCOUT:	MVI	C,ESC
	CALL	CONOUT
	MOV	C,D
	JMP	CONOUT
;
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	
	CALL	CHKLIN
 	CNZ	QIKLIN
	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
	LDA	GRLINS	;# LINES DEPENDS ON # BITS
	MOV	B,A
..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
DON:	LXI	H,ENDGR
	JMP	SNDSTR
;
STLIN:	SHLD	MOD2+1	
	CALL	REDLIN
	CALL	CHKLIN
	JNZ	SETLIN
	POP	H	;RETURN ADDRESS
	RET
;
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
;
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
;
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
NULL:	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
;
REDLIN:	XRA	A
	STA	COL+1
	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	
	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
;
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
;
CVRT20:	CALL	CVERT2
	JMP	PUTIN
;
CVRT21:	CALL	CVERT2
	JMP	IN3	
;
CVRT22:	CALL	CVERT2
	JMP	IN2
;
CVRT23:	CALL	CVERT2
	JMP	IN1
;
SETPRN:	LXI	H,SETSTR
SNDSTR:	MOV	B,M
	INX	H
SND1:	MOV	C,M
	CALL	LST2
	INX	H
	DJNZ	SND1
	RET
;
SCRLL:	CALL	CONST
	JRZ	..L1
	CALL	CONIN
	CPI	ESC
	JZ	RETURN
..L1:	LXI	H,SCRSTR
	JMP	SNDSTR
;	
HIRES:	LXI	H,GRFSTR
	JMP	SNDSTR	
;
RETURN:	LXI	H,RETSTR
	CALL	SNDSTR
	MVI	D,'6'
	CALL	ESCOUT
	JMP	RETVAL
;
GETCHR:	CALL	FINDCR
	POP	H
	XTHL
	MOV	A,M
	ANI	0FEH
	XTHL
	PUSH	H
	RZ		;FALL INTO ATTFIX IF NEEDED
;
	.PAGE
;
;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
	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
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
;{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
;{                                          {
;{          THIS CODE IS DEPENDANT          {
;{             ON THE # OF BITS             {
;{                                          {
;}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
;
;
DUMPAL:	MVI	D,"7"
	CALL	ESCOUT	
	MVI	A,3AH	;CODE FOR LDA
	STA	GRFLIN	;RESTORE GRFLIN CODE
DUMPER:	MVI	B,6	
..L3:	PUSH	B	;THE CODE HERE IA FOR
	CALL	GRFLIN	;A PRINTER WITH AN 8 BIT HEAD
	CALL	TEX8	;AND BIT 0 ON THE TOP
	CALL	SCRLL
	CALL	TEX2H
	CALL	INCOL
	CALL	GRFLIN
	CALL	TEX6M	
	CALL	SCRLL
	CALL	TEX4H	
	CALL	INCOL
	CALL	GRFLIN
	CALL	TEX4L	
	CALL	SCRLL	
	CALL	TEX6H	Š	CALL	INCOL
	CALL	GRFLIN
	CALL	TEX2L
	CALL	SCRLL	
	CALL	TEX8H
	CALL	INCOL
	CALL	GRFLIN
	CALL	SCRLL
	POP	B
	DJNZ	..L3
	JMP	RETURN
;
TEX8:	LXI	H,NULL
F88:	JMP	FIRST8
;
TEX8H:	LXI	H,NULL
L88:	JMP	LAST8
;
TEX6M:	LXI	H,SIXLO
	JMPR	F88
;
TEX4L:	LXI	H,FOURHI	;REVERSED FOR BIT 0
	JMPR	F88		;ON TOP
;
TEX2L:	LXI	H,TWOLO
	JMPR	F88
;
TEX6H:	LXI	H,SIXHI
	JMPR	L88
;
TEX4H:	LXI	H,FOURLO
	JMPR	L88
;
TEX2H:	LXI	H,TWOHI
	JMPR	L88
;
	.PAGE
;
;[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
;[                                        [
;[         THIS CODE IS DEPENDANT         [
;[           ON THE ORIENTATION           [
;[                                        [
;[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
;
;
PUTIN:	RRC	;THIS CODE IS DEPENDANT
	RRC	;ON THE LAYOUT OF THE HEAD
IN3:	RRC	;THIS CODE IS FOR A HEAD
	RRC	;WITH BIT 0 ON THE TOP
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
;
SIXHI:	RRC
	RRC
	ANI	03FH
	RET
;
TWOHI:	RLC
	RLC
	ANI	3
	RET
;
SIXLO:	RLC
	RLC
	ANI	0FCH
	RET
;
TWOLO:	RRC
	RRC
	ANI	0C0H
	RET
;
	.PAGE
;
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+05FFH	;CHARACTER GENERATOR TABLE START 

CHRTBL:	.BLKB	2560	;CHARACTER GENERATOR ROM IMAGE
;
	.LOC	BASE+1800H-320
;
GRFBUF:	.BLKB	80
	.BLKB	80
ATTBUF:	.BLKB	80
DSPBUF:	.BLKB	80
;
	.END
