;************************************************
;*                                              *
;*           GRAPHIC PRINTING ROUTINE           *
;*                AXIOM 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
OUTBLK	=	BASE+72H
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
..L1:	MVI	A,10H
	OUT	SPRTR
	IN	SPRTR
	ANI	24H
	CPI	24H
	JRNZ	..L1
	MOV	A,C
	OUT	DPRTR
	RET
;
;
QIKLIN:	MVI	B,80
	LXI	H,DSPBUF
	JMP	OUT42+5
;
;
QIKTEX:	MVI	A,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	A,CR
	CALL	LIST	
	MVI	A,LF
	CALL	LIST
	CALL	CONST
	JRZ	..NN1
	CALL	CONIN
	POP	B
	CPI	ESC
	JRZ	ETX
	PUSH	B
..NN1:	POP	B
	DJNZ	..Z1
ETX:	MVI	A,LF
	CALL	LIST
	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
	LXI	H,GRFBUF
..L2:	MVI	B,240	
..L1:	MOV	A,M
	ORA	A
	JRNZ	PRNGRF
	INX	H
	DJNZ	..L1
	JMPR	DON
;
;
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	A,CR
	JMP	LIST
;
;
;
OUT4:	PUSH	D
	CALL	MAKE
	LXI	H,PRNBYT
	MVI	B,4
..L1:	MOV	A,M
	CALL	LIST
	MOV	A,M
	CALL	LIST
	INX	H
	DJNZ	..L1
	POP	D
	RET
;
;
OUT42:	MVI	B,8	
	LXI	H,PRNBYT
..L1:	MOV	A,M	
	CALL	LIST
	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	A,1BH
	CALL	LIST
	MOV	A,B
	JMP	LIST
;
;
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
	CALL	CHKLIN
	JRNZ	DOLIN
	RET
;
TEX4:	LHLD	COL
	MVI	H,0
	SHLD	COL
	CALL	GETTEX
	CALL	INCOL
	JRNZ	LIN2
	RET
;
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	;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
	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,"7"	;132 COLUMNS
	CALL	ESCOD
	MVI	B,"9"	;STOP ENHANCED PRINT
	CALL	ESCOD
	MVI	B,3BH	;CANCEL DOUBLE DENSITY
	JMP	ESCOD
;
;
DUMPAL:	MVI	D,"7"
	CALL	ESCOUT
	MVI	B,8
..L1:	PUSH	B
	CALL	TEX6
	CALL	GRFLIN
	CALL	SCRL6	
	CALL	TEX4
	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
;
SCRL2:	MVI	B,4
	JMPR	SCRLL
;
SCRL4:	MVI	B,8
	JMPR	SCRLL
;
SCRL6:	MVI	B,12
;
SCRLL:	PUSH	B
	CALL	CONST
	POP	B
	JRZ	..L2
	CALL	CONIN
	CPI	ESC
	JZ	RETURN
..L2:	PUSH	B
	MVI	B,">"
	CALL	ESCOD
	CALL	DON
	POP	B
	DJNZ	SCRLL
	RET
;
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	;FALL	IN
;
PUTIN:	RRC
	RRC
IN3:	RRC
	RRC
IN2:	RRC
	RRC
IN1:	XCHG
	ORA	M
	ANI	3FH
	MOV	M,A
	INX	H
	XCHG
	RET
;
	
;
CVRT21:	CALL	CVERT2
	JMPR	IN3	
;
CVRT22:	CALL	CVERT2
	JMPR	IN2
;
;
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	B,"8"	;ENHANCED
	CALL	ESCOD
	MVI	B,":"	;DOUBLE DENSITY
	CALL	ESCOD
	MVI	B,01CH	;GRAPHICS MODE
	CALL	ESCOD
	MVI	A,80
	JMP	LIST
;
RETURN:	CALL	SETPRN
	MVI	D,"6"
	CALL	ESCOUT
	MVI	A,LF
	CALL	LIST
	JMP	RETVAL
;
;END OF PRINTER DEPENDANT CODE
;###########################################
;
;	PUT UP PRINTER NAME ON MENU
;
DUMPMS:	.BYTE	HOM,ESC,"S","1",ESC,"U",HLBOLD
	.ASCII	"   AXIOM    "
	.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
