;************************************************
;ª                                              *
;*           GRAPHIC PRINTING ROUTINE           *
;*                ANADEX 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
	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
	JMP	DUMPAL
;
;
ESCOUT:	MVI	C,ESC
	CALL	CONOUT
	MOV	C,D
	JMP	CONOUT
;
LIST:	MOV	C,A
	PUSH	B
	CALL	CONST
	POP	B
	JRZ	LST2
	PUSH	B
	CALL	CONIN
	POP	B
	CPI	ESC
	JZ	RETURN
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
..L1:	MOV	C,M
	CALL	LST2
	INX	H
	DJNZ	..L1
	RET
;
;
QIKTEX:	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	QIKLIN	;LINE
	MVI	C,CR
	CALL	LST2	
	MVI	C,LF
	CALL	LST2
	CALL	CONST
	JRZ	..NN1
	CALL	CONIN
	POP	B
	CPI	ESC
	JRZ	ETX
	PUSH	B
..NN1:	POP	B
	DJNZ	..Z1
ETX:	MVI	C,LF
	CALL	LST2
	JMP	RETVAL
;
;
GRFLIN:	LDA	GRFY
	MOV	D,A
	XRA	A
	MOV	B,A
	MVI	C,DDSPY
	LXI	H,GRFBUF
..L2:	MVI	E,3	
..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	6
	MOV	D,A
	JMPR	..L2
RETG:	MOV	A,D
	STA	GRFY	;FALL	IN
;
PRNGRF:	CALL	HIRES
	LXI	H,GRFBUF
	MVI	B,80
..L1:	LXI	D,BYTES
	PUSH	B
	LXI	B,3	
	LDIR
	PUSH	H
	CALL	OUT4
	POP	H
	POP	B
	DJNZ	..L1
DON:	MVI	C,CR
	JMP	LST2
;
;
;
OUT4:	PUSH	D
	CALL	MAKE
	LXI	H,PRNBYT
	MVI	B,4
..L1:	MOV	A,M
	RRC
	RRC
	SET	6,A	
	MOV	C,A
	CALL	LST2
	CALL	LST2
	INX	H
	DJNZ	..L1
	POP	D
	RET
;
;
OUT42:	MVI	B,8	
	LXI	H,PRNBYT
..L1:	MOV	A,M	
	RRC
	RRC
	SET	6,A
	MOV	C,A
;INX	H
;DCR	B
;MOV	A,M
;RRC
;RRC
;SET	6,A
;ORA	C
;MOV	C,A
	CALL	LST2
	INX	H
	DJNZ	..L1
	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
;
;
GETTEX:	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
;
TEX6:	CALL	GETTEX
	JMPR	DOLIN
;
TEX4:	LHLD	COL
	MVI	H,0
	SHLD	COL
	CALL	GETTEX
	CALL	INCOL
	JMPR	LIN2
;
TEXLIN:	CALL	TEX6
	CALL	SCRL6
	JMPR	TEX4
;
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
;
;
SETLIN:	CALL	HIRES
	LXI	H,DSPBUF
	LXI	D,ATTBUF
	MVI	B,80
	RET
;
DOLIN:	CALL	SETLIN
..L1:	PUSH	B
	MOV	A,M
	PUSH	H
	PUSH	D
	CALL	GETCHR	
	CALL	MAKE
	SDED	PRNPNT
	INX	H
	CALL	MAK9	
	CALL	OUT42
	POP	D
	POP	H
	INX	H
	INX	D
	POP	B
	DJNZ	..L1
	JMP	DON
;
LIN2:	CALL	SETLIN
..L2:	PUSH	B
	MOV	A,M
	PUSH	H
	PUSH	D
	CALL	GETCHR
	CALL	MAKE2
	SDED	PRNPNT
	INX	H
	CALL	MAC4+9
	CALL	OUT42
	POP	D
	POP	H
	INX	D
	INX	H
	POP	B
	DJNZ	..L2
	JMP	DON
;
;
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
;
MAKE2:	CALL	ZROPRN
	LXI	H,BYTES+6	
	LXI	D,PRNBYT
	JMP	MAC4+9
;
GETCHR:	CALL	FINDCR
	POP	H
	XTHL
	MOV	A,M
	ANI	0FEH
	XTHL
	PUSH	H
	RZ		;FALL IN
;
	.PAGE
;###################################
;	START OF PRINTER CODE
;
;ATTFIX DEPENDS ON THE CHRGRF TABLE USED
;
;THIS CODE IS FOR CHRGRF2.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+5
	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
	MOV	M,A
	INX	H
	DJNZ	..L1
	RET
;
BLDFAC:	LXI	H,BYTES
	MVI	B,10
..L1:	MOV	A,M
	ANI	77H	;CHANGED FROM 07H
	RAL
	ORA	M
	MOV	M,A
	INX	H
	DJNZ	..L1
	RET
;
;
UNDLIN:	LXI	H,BYTES+9
	CALL	FF
	DCX	H
	DCX	H
FF:	MVI	A,0F0H	
	ORA	M
	MOV	M,A
	RET
;
SUPSCR:	PUSH	D
	LXI	H,BYTES
	MVI	B,2	
..L1:	CALL	SHIFT
	DJNZ	..L1
	LXI	H,BYTES+6
	PUSH	H
	CALL	SHFRGT
	MOV	D,A
	LXI	H,BYTES+2	
	CALL	SHFLFT
	ORA	D
	MOV	M,A
	POP	H
	CALL	SHIFT
	XRA	A
	MOV	M,A
	LXI	H,BYTES+3
	MVI	B,2	
..L2:	CALL	SHIFT
	DJNZ	..L2
	LXI	H,BYTES+8
	PUSH	H
	CALL	SHFRGT
	MOV	D,A
	LXI	H,BYTES+5
	CALL	SHFLFT
	ORA	D
	MOV	M,A
	POP	H
	CALL	SHIFT
	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+7
	CALL	SHIFT1
	LXI	H,BYTES+2
	PUSH	H
	CALL	SHFLFT
	MOV	D,A
	LXI	H,BYTES+6
	CALL	SHFRGT
	ORA	D
	MOV	M,A
	POP	H
	MVI	B,2	
..L1:	CALL	SHIFT1
	DJNZ	..L1
	XRA	A
	MOV	M,A
	LXI	H,BYTES+9
	CALL	SHIFT1
	LXI	H,BYTES+5
	PUSH	H
	CALL	SHFLFT
	MOV	D,A
	LXI	H,BYTES+8	
	CALL	SHFRGT
	ORA	D
	MOV	M,A
	MVI	B,2
	POP	H	
..L2:	CALL	SHIFT1
	DJNZ	..L2
SCRDON:	XRA	A
	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+3
	MVI	B,3	
	CALL	HALFDO
	XCHG		;D=BYTES+6
	LXI	H,BYTES+8
	MVI	B,2
	CALL	HALFDO
	JMPR	HFDON
;
HALFDO:	PUSH	B
	CALL	STRCH
	CALL	SHFT
	CALL	STRCH1
	ORA	C
	ORA	B
	MOV	M,A
	INX	H
	INX	D
	POP	B
	DJNZ	HALFDO
	RET

HALF1:	CMA	
	STA	DUBFLG
	LXI	D,BYTES+3
	LXI	H,BYTES
	MVI	B,3	
	CALL	DOHALF
	XCHG		;H=BYTES+6
	LXI	D,BYTES+8
	MVI	B,2
	CALL	DOHALF
HFDON:	POP	H
	POP	D
	POP	B
	RET
;
DOHALF:	PUSH	B
	CALL	STRCH1
	CALL	SHFT
	CALL	STRCH
	ORA	C
	ORA	B
	MOV	M,A
	INX	H
	INX	D
	POP	B
	DJNZ	DOHALF
	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
;
SETPRN:	MVI	B,"4"
	CALL	ESCOD
	LXI	H,LEN
CODE:	MVI	B,3
..L1:	MOV	C,M
	CALL	LST2
	INX	H
	DJNZ	..L1
	RET
;
LEN:	.BYTE	30H,36H,36H
;
DUMPAL:	MVI	D,"7"
	CALL	ESCOUT
	MVI	B,8
..L1:	PUSH	B
	CALL	TEX6
	CALL	SCRL0
	CALL	GRFLIN
	CALL	SCRL6	
	CALL	TEX4
	CALL	SCRL0
	CALL	GRFLIN
	CALL	SCRL4
	CALL	TEX6
	CALL	SCRL2
	CALL	GRFLIN
	CALL	SCRL4	
	CALL	TEX4
	CALL	SCRL2	
	CALL	GRFLIN
	CALL	SCRL2
	CALL	TEX6
	CALL	SCRL4
	CALL	GRFLIN
	CALL	SCRL2
	CALL	TEX4
	CALL	SCRL4
	POP	B
	DJNZ	..L1
	MVI	A,LF
	CALL	LIST	
	JMP	RETURN
;
DUMPTX:	MVI	B,24
..L1:	PUSH	B
	CALL	TEXLIN
	CALL	SCRL4	
	POP	B
	DJNZ	..L1
	JMP	RETURN
;
;
DUMPGR:	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
;
SCRL0:	MVI	B,30H
	JMPR	SCRLL
;
SCRL2:	MVI	B,32H
	JMPR	SCRLL
;
SCRL4:	MVI	B,34H
	JMPR	SCRLL
;			
SCRL6:	MVI	B,36H
;
SCRLL:	MOV	C,B
	CALL	LST2
	MVI	C,29
	CALL	LST2
	CALL	SETPRN
	MVI	A,CR
	JMP	LIST
;
MAK9:	CALL	MAC4+9
	JMPR	MAKE1
;
MAKE:	CALL	MAC4
	JMPR	MAKE1
;
;
MAC4:	CALL	ZROPRN
	LXI	D,PRNBYT
	LXI	H,BYTES
	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
	JMPR	CVRT21
;
MAKE1:	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
	RET
;
CVRT20:	CALL	CVERT2	
	JMPR	PUTIN
;
;
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
;
CVRT21:	CALL	CVERT2
	JMPR	IN3	
;
CVRT22:	CALL	CVERT2
	JMPR	IN2
;
;
HIRES:	MVI	C,28	;GRAPHICS MODE
	JMP	LST2
;
RETURN:	MVI	D,"6"
	CALL	ESCOUT
	LXI	H,RESETP
	MVI	B,11
..L1:	MOV	C,M
	INX	H
	CALL	LST2
	DJNZ	..L1
	MVI	C,LF
	CALL	LST2
	JMP	RETVAL
;
RESETP:	.BYTE	1BH,"H",1BH,"4","0","6","6",1BH,"%","0","4"
;
;
;END OF PRINTER DEPENDANT CODE
;###########################################
;
;	PUT UP PRINTER NAME ON MENU
;
DUMPMS:	.BYTE	HOM,ESC,"S","1",ESC,"U",HLBOLD
	.ASCII	"   ANADEX   "
	.BYTE	ESC,"S","0",ESC,"=",23+20H,80+0A0H
;
;
GRFY:	.BYTE	239
DUBFLG:	.BYTE	0
;
	.LOC	BASE+1800H+5FFH	;TABLE START
;
CHRTBL:	.BLKB	2560	;CHARACTER GENERATOR ROM IMAGE
;
LSTBYT	=	.
;
	.LOC	BASE+1800H-320
;
GRFBUF:	.BLKB	80
ATTBUF:	.BLKB	80
DSPBUF:	.BLKB	80
PRNPNT:	.BLKW	1
CHAR:	.BLKB	1
COL:	.BLKW	1
BYTES:	.BLKB	4
TEXBYT:	.BLKB	6
PRNBYT:	.BLKB	8
;
	.END
