; NCRGRAF.ASM
; -----------
;
; NCR Decision Mate V - NCRGRAF.REL
;
; Disassembled by:
;
; ROCHE Emmanuel
; 8 rue HERLUISON
; 10000 TROYES
; FRANCE
; ------
;
;--------------------------------
;
; Summary of graphics routines
; ----------------------------
;
; NAME	BASIC FORMAT	PARAMETERS	DESCRIPTION
; ----	------------	----------	-----------
;
; GARC	GARC (R,S,E)	R = 1:255	Arc with radius R,
;			S = -360:360	starting angle S,
;			E = -360:360	and ending angle E.
;
; GBOX	GBOX (H,V,D)	H = 1:640	Filled rectangle with
;			V = 1:640	sides of length H and V,
;			D = 0:7		drawn in direction D.
;
; GCIRCL  GCIRCL (R)	R = 1:255	Circle with radius R.
;
; GCLEAR  GCLEAR			Erase screen.
;
; GEXIT   GEXIT				Leave graphics mode.
;
; GINIT   GINIT				Initialize graphics mode.
;
; GLINE   GLINE (X,Y)	X = 0:639	Line from cursor to (X,Y).
;			Y = 0:399
;
; GMODE   GMODE (M)	M = 0:3		Drawing mode.
;
; GPATT   GPATT (P)	P = 0:15	Pattern to fill box or line.
;
; GPOINT  GPOINT (X,Y)	X = 0:639	Set cursor at (X,Y).
;			Y = 0:399
;
; GPRINT  GPRINT (P,L)	P = 0,1,2,4,5	Output screen image to printer P
;			L = 0:99	with linefeed L.
;
; GRECT  GRECT (H,V,D)  H = 2:640	Rectangle with sides
;			V = 2:640	of length H and V,
;			D = 0:7		drawn in direction D.
;
; GTEXT  GTEXT (A$,D)	A$ = ASCII string  Draw A$
;			D  = 0:7           in direction D.
;
; GZOOM  GZOOM (Z)	Z = 0:15	Zoom parameter for text and boxes.
;
;--------------------------------
;
; NCRGRAF and assembler programs
; ------------------------------
;
;	To program graphics on the NCR DECISION MATE V with an
; assembler program, all graphics routines must be declared as
; externals in your program. The address of the first parameter
; for a routine must be in register pair HL; the address of the
; second parameter must be in register pair DE; and the address
; of the third parameter must be in register pair BC.
;
;	The integer parameters are always stored with 2 bytes,
; low-order first. The string parameters are stored with 3
; bytes. The first byte is the length of the string and the
; second and third bytes contain the address of the actual
; text.
;
;	The program should be assembled with the MACRO-80
; assembler from MICROSOFT (or any other relocatable assembler)
; and then linked with NCRGRAF.REL.
;
;--------------------------------
;
	PAGE	0		; Listing without page breaks
;
;--------------------------------
;
	NAME	'NCR11R'	; REL module name
;
	PUBLIC	GSTAT		; Error status byte
	PUBLIC	GINIT		; Erase screen and init graphics memory
	PUBLIC	GPOINT		; Set cursor at (X,Y) on screen
	PUBLIC	GZOOM		; Select param for text and boxes
	PUBLIC	GCIRCL		; Draw a circle with radius R
	PUBLIC	GLINE		; Draw a line from cur pos to (X,Y)
	PUBLIC	GBOX		; Draw a filled rectangle (H,V,D)
	PUBLIC	GRECT		; Draw a rectangle (H,V,D)
	PUBLIC	GPATT		; Select a pattern for a box/line
	PUBLIC	GMODE		; Select the drawing mode
	PUBLIC	GTEXT		; Draw a string in a given direction
	PUBLIC	GEXIT		; Era screen, leaves graph mode and exit
	PUBLIC	GPRINT		; Outputs screen image to printer
	PUBLIC	GARC		; Draw an arc with radius, start/end angle
	PUBLIC	GCLEAR		; Era screen but don't reset some values
;
;--------------------------------
; CP/M-related equates  (used only one time: in GEXIT)
;
conout	equ	2		; Console output
ctrlZ	equ	1AH		; = CLS (CLear Screen)
bdos	equ	0005H		; Basic Disk Operating System
;
;--------------------------------
; NEC uPD7220 GDC commands  (Cf. "Data Sheet", p.3-8-14)
;
status	equ	0A0H		; Status register
FIFO	equ	0A1H		; FIFO buffer
;
; Video control commands:
;
RESET1	equ	 00H		; 0000 0000
RESET2	equ	 01H		; 0000 0001
RESET3	equ	 09H		; 0000 1001
SYNC	equ	 0EH		; 0000 111 DE  (0EH or 0FH)
VSYNC	equ	 6EH		; 0110 111 M   (6EH or 6FH)
CCHAR	equ	 4BH		; 0100 1011
;
; Display control commands:
;
START	equ	 6BH		; 0110 1011
BCTRL1	equ	 0CH		; 0000 110 DE  (0CH or 0DH)
BCTRL2	equ	 05H		; 0000 0101
ZOOM	equ	 46H		; 0100 0110
CURS	equ	 49H		; 0100 1001
PRAM	equ	 70H		; 0111 SA      (70H to 7FH)
PITCH	equ	 47H		; 0100 0111
;
; Drawing control commands:
;
WDAT	equ	 20H		; 001 TYPE 0 MOD
MASK	equ	 4AH		; 0100 1010
FIGS	equ	 4CH		; 0100 1100
FIGD	equ	 6CH		; 0110 1100
GCHRD	equ	 68H		; 0110 1000
;
; Data read commands:
;
RDAT	equ	0A0H		; 101 TYPE 0 MOD
CURD	equ	0E0H		; 1110 0000
LPRD	equ	0C0H		; 1100 0000
;
; DMA control commands:
;
DMAR	equ	0A4H		; 101 TYPE 1 MOD
DMAW	equ	 24H		; 001 TYPE 1 MOD
;
; DE bits:
;
DE0	equ	0		; Display blanked
DE1	equ	1		; Display enabled
;
; M bits:
;
M0	equ	0		; Slave Mode
M1	equ	1		; Master Mode
;
; SA bits:  SA means  "Starting Address in Parameter RAM"
; 1 to 16 (zero-based) bytes to be loaded into the Parameter
; RAM, starting at the RAM address specified by SA.
;
; TYPE bits:
;
TYPE00	equ	0		; Word: Low then High Byte
TYPE01	equ	1		; Invalid
TYPE10	equ	2		; Low  Byte of the Word only
TYPE11	equ	3		; High Byte of the Word only
;
; MOD bits:
;
MOD00	equ	0		; REPLACE with pattern
MOD01	equ	1		; COMPLEMENT
MOD10	equ	2		; RESET to zero
MOD11	equ	3		; SET to one
;
;--------------------------------
; Error status byte
;
GSTAT:	DB	00H
;
;
; 	The routine GINIT sets this status byte to 00H and,
; when an error occurs, drawing stops and this byte is changed
; to a number greater than 00H.
;
;
;   Error code     Routine      Description
;   ----------     -------      -----------
;
; 	 1	   GPOINT	The X coordinate is less than 0.
;	 2	   GPOINT	The X coordinate is greater than 639.
;	 3	   GPOINT	The Y coordinate is less than 0.
;	 4	   GPOINT	The Y coordinate is greater than 399.
;	 5	   GLINE	The X coordinate is less than 0.
;	 6	   GLINE	The X coordinate is greater than 639.
;	 7	   GLINE	The Y coordinate is less than 0.
;	 8	   GLINE	The Y coordinate is greater than 399.
;	10	   GZOOM	The zomm parameter is out of range.
;	20	   GCIRCL	The radius parameter is out of range.
;	21	   GARC		The radius parameter is out of range.
;	22	   GARC		The starting angle is less than -360.
;	23	   GARC		The starting angle is greater than 360.
;	24	   GARC		The ending angle is less than -360.
;	25	   GARC		The ending angle is greater than 360.
;	30	   GBOX		The direction parameter is out of range.
;		   GRECT
;	40	   GPATT	The pattern parameter is out of range.
;	50	   GMODE	The mode parameter is out of range.
;	60	   GTEXT	The direction parameter is out of range.
;	70	   GPRINT	The printer selector is out of range.
;	71	   GPRINT	The linefeed parameter is out of range.
;	80	   GRECT	The H parameter is less than 2.
;		   GBOX		The H parameter is less than 1.
;	81	   GRECT	The H parameter is greater than 640.
;		   GBOX		The H parameter for a zoomed box is greater than 640.
;	82	   GRECT	The V parameter is less than 2.
;		   GBOX		The V parameter is less than 1.
;	83	   GRECT	The V parameter is greater than 640.
;		   GBOX		The V parameter for a zoomed box is greater than 640.
;
; NOTE: If a picture is drawn over the edges of the CRT screen,
; it will extend over the other parts of the screen and no error
; status byte is set.
;
;--------------------------------
;
noerr:	LDA	GSTAT
	CPI	00H		; No error ?
	JNZ	finis		; Go back to calling routine
	RET
;
;--------------------------------
;
noerH:	MOV	A,H
	CPI	00H		; No error ?
	JM	noerB
	CMP	D
	JNC	noerC
	DCR	D
	CMP	D
	JZ	noerL
	RET
;
;--------------------------------
;
noerL:	MOV	A,L
	CMP	E
	JNC	noerC
	RET
;
;--------------------------------
;
noerB:	MOV	A,B
	STA	GSTAT
	JMP	noerr
;
;--------------------------------
;
noerC:	MOV	A,C
	STA	GSTAT
	JMP	noerr
;
;--------------------------------
;
errH:	MOV	A,H
	CPI	00H		; No error ?
	JNZ	errD
	MOV	A,L
	CMP	E
	JNC	errD
	RET
;
;--------------------------------
;
errD:	MOV	A,D
	STA	GSTAT
	JMP	noerr
;
;--------------------------------
;
param1:	DB	00H		; ZOOM param (no zoom)
	DB	00H		; CCHAR param (no cursor)
	DB	00H		; PRAM params: P1
	DB	00H		; P2
	DB	00H		; P3
	DB	59H		; P4
	DB	00H		; P5
	DB	00H		; P6
	DB	00H		; P7
	DB	59H		; P8
	DB	0FFH		; P9
	DB	0FFH		; P10
	DB	0FFH		; P11
	DB	0FFH		; P12
	DB	0FFH		; P13
	DB	0FFH		; P14
	DB	0FFH		; P15
	DB	0FFH		; P16
	DB	00H		; CURS params: P1
Do0154:	DB	00H		; P2 
	DB	00H		; P3
	DB	0FFH		; MASK params: P1: 0FFFFH
	DB	0FFH		; P2
	DB	02H		; FIGS params: P1: 02H: DIR (right)
	DB	0FFH		; P2: 7FFFH
	DB	7FH		; P3
	DB	08H		; P4: 0008H
	DB	00H		; P5
	DB	08H		; P6: 0008H
	DB	00H		; P7
	DB	0FFH		; P8: 3FFFH
	DB	3FH		; P9
	DB	0FFH		; P10: 3FFFH
	DB	3FH		; P11
	DB	0FFH		; WDAT params: P1
	DB	0FFH		; P2
;
param2:	DB	8FH		; CHAR param: (display cursor)
	DB	00H		; ZOOM param: (no zoom)
	DB	00H		; PRAM params: P1
	DB	00H		; P2
	DB	00H		; P3
	DB	19H		; P4
	DB	00H		; P5
	DB	00H		; P6
	DB	00H		; P7
	DB	19H		; P8
	DB	0FFH		; P9
	DB	0FFH		; P10
	DB	0FFH		; P11
	DB	0FFH		; P12
	DB	0FFH		; P13
	DB	0FFH		; P14
	DB	0FFH		; P15
	DB	0FFH		; P16
;
;--------------------------------
; Transfer parameters from memory to register pair HL.
;
loadHL:	MOV	E,M		; HL = M(HL)
	INX	H
	MOV	D,M
	XCHG
	RET
;
;--------------------------------
; Save area for register pairs HL, DE and BC.
;
saveHL:	DW	0000H		; BASIC First  parameter
saveDE:	DW	0000H		; BASIC Second parameter
saveBC:	DW	0000H		; BASIC Third  parameter
;
;--------------------------------
; Erase the screen and initialize the graphics memory.
; Sets default values for GPATT (P = 0), GZOOM (Z = 0),
; GMODE (M = 0) and GSTAT (0).
; GINIT (or GCLEAR) must be the first graphics statement
; in a program.
; If a special terminal function, for example: reverse video,
; is set before starting graphics, GINIT will reset this.
;
GINIT:	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	NOP			; ???
	SUB	A		; Why not XOR A ??? (complement Carry)
	STA	GSTAT		; GSTAT = 00H
	STA	valueP		; P = 00H
	STA	valueZ		; Z = 00H
	MVI	A,20H		; (WDAT command with MOD: REPLACE)
	STA	valueM		; M = 20H (WDAT command...)
	CALL	init		; CLS and init graphics memory
	JMP	finis		; Go back to calling routine
;
;--------------------------------
; Erase the screen and initialize the graphics memory
; WITHOUT resetting the values for GPATT, GZOOM,
; GMODE and GSTAT.
;
GCLEAR:	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	CALL	init		; CLS and init graphics memory
	JMP	finis		; Go back to calling routine
;
;---------------------------------
; Erase the screen and initialize the graphics memory.
;
init:	CALL	noerr
	MVI	A,0CH		; BCTRL1: display blanked
	CALL	outA
	LXI	H,param1	; String of GDC bytes
	CALL	outzom		; (no zoom)
	CALL	outCHR		; (no cursor)
	CALL	outPRM		; (load Parameter RAM)
	XRA	A
	STA	Do0154		; ???

	MVI	B,03H		; 4 times init2 (4 banks of RAM ?)
init2:	CALL	outCRS
	CALL	outMSK
	CALL	outFGS
	MVI	A,22H		; WDAT (type: word, mod: reset to zero)
	CALL	outA
	MVI	C,02H		; 2 bytes follow
	CALL	outC
	LXI	H,Do0154	; ???
	MOV	A,M
	ADI	40H		; ???
	MOV	M,A
	DCX	H
	DCR	B
	JNZ	init2

	LDA	valueM		; Outputs Mode value
	CALL	outA
	CALL	gpat2		; Outputs Pattern bytes
	LXI	H,valueZ	; Outputs Zoom value
	CALL	outzom
	MVI	A,0DH		; BCTRL1: display enabled
	CALL	outA

	LXI	H,0001H
	SHLD	startX		; Position cursor at lower
	SHLD	startY		;   left corner of screen
	CALL	point2		; Position cursor at (startX,startY)
	RET
;
;--------------------------------
; Erase the screen, leave the graphics mode
; and return to the alpha mode.
; GEXIT should always be used to leave the graphics mode.
; After GEXIT is called, the next graphics routine must
; begin with GINIT.
;
GEXIT:	NOP			; ???
	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	LXI	H,param2	; String of GDC bytes
	CALL	outCHR		; (display cursor)
	CALL	outzom		; (no zoom)
	CALL	outPRM		; ???
	MVI	E,ctrlZ		; = CLS (CLear Screen)
	MVI	C,conout	; Console output
	CALL	BDOS
	JMP	finis		; Go back to calling routine
;
;--------------------------------
; Set the cursor at a specific point (X,Y) on the screen.
; The valid range of values for X is 0:639.
; The valid range of values for Y is 0:399.
; The coordinates (0,0) set the cursor at the lower left
; corner of the screen.
; GPOINT should be used in conjunction with GCIRCL,
; GRECT, GBOX, GLINE and GTEXT to define the starting
; point of these routines.
; Calling GPOINT sets the cursor at a specific point
; on the screen, but the point remains invisible.
; To see the point, call GLINE using the same X and Y
; coordinates as GPOINT.
;
GPOINT:	SHLD	saveHL		; X value
	XCHG
	SHLD	saveDE		; Y value
	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	CALL	noerr

	LHLD	saveHL		; Load X value
	CALL	loadHL
	LXI	D,0380H		; 0280H = 640 (check for 0:639)
	LXI	B,0102H		; 01H = error 1, 02H = error 2
	CALL	noerH
	INX	H
	SHLD	startX		; X = X + 1  (so 0 = first pixel)

	LHLD	saveDE		; Load Y value
	CALL	loadHL
	LXI	D,0290H		; 0190H = 400 (check for 0:399)
	LXI	B,0304H		; 03H = error 3, 04H = error 4
	CALL	noerH
	INX	H
	SHLD	startY		; Y = Y + 1  (so 0 = first pixel)

	CALL	point2		; Position cursor at (X,Y)
	JMP	finis		; Go back to calling routine
;
;--------------------------------
; Position cursor at (X,Y) (contained in startX, startY)
;
point2:	CALL	EADdAD		; Compute EAD and dAD
	LXI	H,Do0995	; save a 2 bytes value
	CALL	outCRS		; CURSor position
	RET
;
;--------------------------------
; Select a zoom parameter for text and boxes.
; The valid range of values for Z is 0:15 (default = 0).
; (Refer to GBOX and GTEXT for the specific zoom formulas.)
; Once a specific zoom parameter is set, it remains so
; until another GZOOM or GINIT routine is called.
;
GZOOM:	SHLD	saveHL		; Zoom value
	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	CALL	noerr
	LHLD	saveHL		; Load zoom value
	CALL	loadHL
	LXI	D,0A10H		; Check for 0:15  (0AH = error 10)
gzoom2:	CALL	errH
	XCHG
	LXI	H,valueZ	; Zoom value
	MOV	M,E
	CALL	outzom		; Outputs zoom parameter
	JMP	finis		; Go back to calling routine
;
;--------------------------------
; Draw a circle with the radius R.
; The valid range of values for R is 1:255.
; The center of the circle is defined with GPOINT.
;
GCIRCL:	SHLD	saveHL		; Radius R
	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	CALL	noerr
	LXI	H,0000H		; Starting angle = 0 degrees
	SHLD	angleS
	LXI	H,0168H		; Ending angle = 360 degrees
	SHLD	angleE
	LXI	D,14FFH		; Check for 1:255  (14H = error 20)
	JMP	garc3		; End of GARC routine below
;
;--------------------------------
; Draw an arc with radius R, starting angle S
; and ending angle E.
; The valid range of values for R is 1:255.
; The valid range of values for S and E is -360 to +360.
; (A starting angle S of +360 is equal to 0.)
; GPOINT defines the center and the arc is drawn
; starting at angle S and ending at angle E.
; Arcs are always drawn counterclockwise.
;
GARC:	SHLD	saveHL		; Radius R
	XCHG
	SHLD	saveDE		; Starting angle S
	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	CALL	noerr
	MOV	L,C
	MOV	H,B
	SHLD	saveBC		; Ending angle E

	LHLD	saveDE		; Load starting angle S
	CALL	loadHL
	SHLD	angleS
	LXI	D,0168H		; = 360 degrees ?
	DAD	D
	LXI	D,03D1H		; 02D1H = 721     (360+360+1)
	LXI	B,1617H		; 16H = error 22, 17H = error 23
	CALL	noerH
	LHLD	angleS
	LXI	B,0168H		; = 360 degrees
	CALL	garc8
	SHLD	angleS

	LHLD	saveBC		; Load ending angle E
	CALL	loadHL
	SHLD	angleE
garc2:	LXI	D,0168H		; = 360 degrees ?
	DAD	D
	LXI	D,03D1H		; 02D1H = 721     (360+360+1)
	LXI	B,1819H		; 18H = error 24, 19H = error 25
	CALL	noerH
	LHLD	angleE
	LXI	B,0169H		; = 0169H = 361
	CALL	garc8
	SHLD	angleE

	LXI	D,15FFH		; Check for 1:255  (15H = error 21)
garc3:	PUSH	D

	LHLD	saveHL		; Load radius R
	CALL	loadHL
	DCX	H		; R = R - 1  (because overflow with 255)
	POP	D
	CALL	errH		; (Check for 1:255)
	INX	H		; R = R + 1
	SHLD	radius

	CALL	garc31
	CALL	garc32
	CALL	garc33
	CALL	garc34
	CALL	garc35
	CALL	garc36
	LDA	Do0AEB
	STA	Do0AE6
	LXI	H,Io0AEC
	SUB	M
	JNZ	garc4
	CALL	garc37
	JMP	garc7
;
;--------------------------------
;
garc4:	CALL	garc41
	CALL	garc42
garc5:	CALL	garc51
	CALL	garc52
	LHLD	Do0AE7
	LXI	B,0FFD3H	; 211
	DAD	B
	JNC	garc6
	CALL	garc53
	MVI	A,2DH		; "-"  (2DH = 45)
	STA	Do0AE9
	JMP	garc5
;
;--------------------------------
;
garc6:	CALL	C$0C3F
garc7:	JMP	finis		; Go back to calling routine
;
;--------------------------------
;
garc8:	LXI	D,0168H		; = 360 degrees ?
	MOV	A,H
	CPI	00H
	JP	garc9
	DAD	D
	JMP	garcA
;
;--------------------------------
;
garc9:	LXI	D,0FE98H	; 98H = 152
	CMP	B
	JNZ	garcA
	MOV	A,L
	CMP	C
	JNZ	garcA
	DAD	D
garcA:	RET
;
;--------------------------------
; Draw a line from the current cursor position to the point (X,Y).
; The valid range of values for X is 0:639.
; The valid range of values for Y is 0:399.
; Call GPOINT to define the starting point for the GLINE routine.
; Calling subsequent GLINE routines without defining a new
; starting point causes the end point of one line to be
; the starting point of the next line.
; (The cursor is positioned one point ahead of the end point
; after drawing a line. Use GPOINT for exact cursor positioning
; each time GLINE is called.)
; GPATT may be used in conjunction with GLINE to draw different
; line patterns (see GPATT).
;
GLINE:	SHLD	saveHL		; X value
	XCHG
	SHLD	saveDE		; Y value
	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	CALL	noerr

	LHLD	saveHL		; Load X value
	CALL	loadHL
	LXI	D,0380H		; 0280H = 640
	LXI	B,0506H		; 05H = error 5, 06H = error 6
	CALL	noerH
	INX	H		; X = X + 1  (so 0 = first pixel)
	SHLD	endX

	LHLD	saveDE		; Load Y value
	CALL	loadHL
	LXI	D,0290H		; 0190H = 400
	LXI	B,0708H		; 07H = error 7, 08H = error 8
	CALL	noerH
	INX	H		; Y = Y + 1  (so 0 = first pixel)
	SHLD	endY

	CALL	line2		; Compute everything
	LXI	H,FIGSP1	; Specify line to draw
	CALL	outFG2		; Outputs line specification
	MVI	A,6CH		; FIGD: draw the line
	CALL	outA
	JMP	finis		; Go back to calling routine
;
;--------------------------------
;
gboxz:	DB	00H		; GBOX Zoom value
gboxp:	DW	0000H		; GBOX Pattern value
;
;--------------------------------
; Draw a filled rectangle with sides of length H and V
; in direction D. (H is the number of pixels in the
; horizontal line and V is the number of pixels in the
; vertical line.)
; The valid range of values for H and V is 1:640.
; The valid range of values for D is 0:7 (see GRECT).
; GPOINT defines the lower left corner of the box.
; The pattern that fills the box is selected with the
; GPATT routine and the size of the box is affected
; by the GZOOM routine. Assuming the zoom parameter
; is Z, then the actual length of the sides of the
; box are H=H*(Z+1) and V=V*(Z+1). Make sure the
; results of these calculations do not exceed 640 for H and V.
;
GBOX:	SHLD	saveHL		; H value
	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	MVI	A,01H
	STA	valueD		; Direction = 01H (45 degrees ?)
	LXI	H,0FFFFH
	SHLD	gboxp		; GBOX Pattern value = 0FFFFH
	LHLD	saveHL
	PUSH	H
	LHLD	valueZ		; Zoom value
	MOV	A,L
	ADI	01H
	STA	gboxz		; GBOX Zoom value
	POP	H
	JMP	grect2		; End of GRECT routine below
;
;--------------------------------
; Draw a rectangle with sides of length H and V in direction D.
; (H is the number of pixels in the horizontal line
; and V is the number of pixels in the vertical line.)
; The valid range of values for H is 2:640.
; The valid range of values for V is 2:640.
; The valid range of values for D is 0:7.
; GPOINT defines the lower left corner of the rectangle.
; The direction D rotates the rectangle counterclockwise
; in steps of 45 degrees around the cursor.
;
GRECT:	SHLD	saveHL		; H value
	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	MVI	A,00H
	STA	valueD		; Direction = 00H (0 degrees)
	ADI	01H
	STA	gboxz		; GBOX Zoom value = 01H
	LXI	H,0FFFEH
	SHLD	gboxp		; GBOX Pattern value = 0FFFEH
grect2:	CALL	noerr
	XCHG
	SHLD	saveDE		; V value
	MOV	L,C
	MOV	H,B
	SHLD	saveBC		; D value
	CALL	loadHL
	LXI	D,1E08H		; Check for 0:7  (1EH = error 30)
	CALL	errH
	MOV	A,L
	STA	rectD

	LHLD	saveHL		; Load H value
	CALL	loadHL
	SHLD	rectH
	LXI	B,5051H		; 50H = error 80, 51H = error 81
	CALL	grect4

	LHLD	saveDE		; Load V value
	CALL	loadHL
	SHLD	rectV
	LXI	B,5253H		; 52H = error 82, 53H = error 83
	CALL	grect4

	LHLD	rectD		; Load D value
	MOV	A,H
	ANI	0FH		; 15 
	JNZ	grect3
	CALL	grect9
	LXI	H,FIGSP1	; Specify rectangle
	CALL	outFG2
	MVI	A,6CH		; FIGD: draw the rectangle
	CALL	outA
	JMP	finis		; Go back to calling routine
;
;--------------------------------
;
grect3:	CALL	grec31
	LXI	H,FIGSP1	; Specify rectangle
	CALL	outFG2
	MVI	A,68H		; GCHRD: area filling
	CALL	outA
	JMP	finis		; Go back to calling routine
;
;--------------------------------
;
grect4:	XCHG
	MVI	H,00H
	MVI	L,00H
	LDA	gboxz		; GBOX Zoom value
grect5:	DAD	D
	DCR	A
	JNZ	grect5
	XCHG
	LHLD	gboxp		; GBOX Pattern value
	XCHG
	DAD	D
	PUSH	H
	LXI	H,0381H		; 0281H = 641
	DAD	D
	XCHG
	POP	H
	CALL	noerH		; (check for 2:640)
	RET
;
;--------------------------------
; Select a pattern that fills a box or a line.
; The valid range of values for P is 0:15 (defaut = 0).
; Once a specific pattern is set, it remains so until
; another GPATT or GINIT routine is called.
; NOTE: Arcs, circles, and rectangles are drawn with
; the selected line pattern.
;
GPATT:	SHLD	saveHL		; Pattern value
	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	CALL	noerr
	LHLD	saveHL		; Load pattern
	CALL	loadHL
	LXI	D,2810H		; Check for 0:15  (28H = error 40)
	CALL	errH
	MOV	A,L
	STA	valueP		; Pattern value
	CALL	gpat2		; Outputs pattern bytes
	JMP	finis		; Go back to calling routine
;
;--------------------------------
;
gpat2:	LDA	valueP		; Pattern value
	MVI	H,00H
	MOV	L,A
	DAD	H
	DAD	H		; Each pattern is 8 bytes long
	DAD	H
	LXI	D,tablin	; Table of line patterns
	DAD	D
	CALL	outpat		; Outputs pattern bytes
	RET
;
;--------------------------------
; Select the drawing mode.
; The valid range of values for M is 0:3 (default = 0).
; Once the drawing mode is set, it remains so until
; another GMODE or GINIT routine is called.
; The following table explains these 4 modes:
;
; Parameter	Name		Description
; ---------	----		-----------
;
;     0		Replace		Draws white character fields
;				on a black background.
;				(The black parts of a dashed line
;				or box pattern are drawn black.)
;
;     1		Complement	Draws white characters on a
;				black background and black
;				characters on a white background.
;
;     2		Draw Black	Draws black characters.
;				(Printing is visible only on a
;				white background.)
;
;     3		Draw White	Draws white characters.
;				(Printing is visible only on a
;				black background.)
;
GMODE:	SHLD	saveHL		; Drawing mode value
	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	CALL	noerr
	LHLD	saveHL		; Load drawing mode value
	CALL	loadHL
	LXI	D,3204H		; Check for 0:3  (32H = error 50)
	CALL	errH
	MOV	A,L
	ORI	20H		; 0 (replace) becomes 20H (GINIT)
	STA	valueM		; Mode value
	CALL	outA		; WDAT, with MOD = drawing mode ...
	JMP	finis		; Go back to calling routine
;
;--------------------------------
;
valueM:	DB	00H		; Drawing mode value
;
;--------------------------------
;
tablin:				; Table of line patterns in Hex
				;   and in Symbolic Binary:
				;       0 = ".", 1 = "O"
;--------------------------------
;
	DB	0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
;
; Line pattern 0:
;
; OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
;
;--------------------------------
;
	DB	0AAH,55H,0AAH,55H,0AAH,55H,0AAH,55H
;
; Line pattern 1:
;
; O.O.O.O..O.O.O.OO.O.O.O..O.O.O.OO.O.O.O..O.O.O.OO.O.O.O..O.O.O.O
;
;--------------------------------
;
	DB	88H,44H,22H,11H,88H,44H,22H,11H
;
; Line pattern 2:
;
; O...O....O...O....O...O....O...OO...O....O...O....O...O....O...O
;
;--------------------------------
;
	DB	11H,22H,44H,88H,11H,22H,44H,88H
;
; Line pattern 3:
;
; ...O...O..O...O..O...O..O...O......O...O..O...O..O...O..O...O...
;
;--------------------------------
;
	DB	00H,0AAH,00H,0AAH,00H,0AAH,00H,0AAH
;
; Line pattern 4:
;
; ........O.O.O.O.........O.O.O.O.........O.O.O.O.........O.O.O.O.
;
;--------------------------------
;
	DB	00H,0FFH,00H,0FFH,00H,0FFH,00H,0FFH
;
; Line pattern 5:
;
; ........OOOOOOOO........OOOOOOOO........OOOOOOOO........OOOOOOOO
;
;--------------------------------
;
	DB	0AAH,0AAH,0AAH,0AAH,0AAH,0AAH,0AAH,0AAH
;
; Line pattern 6:
;
; O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.
;
;--------------------------------
;
	DB	81H,42H,24H,18H,18H,24H,42H,81H
;
; Line pattern 7:
;
; O......O.O....O...O..O.....OO......OO.....O..O...O....O.O......O
;
;--------------------------------
;
	DB	0F0H,0FH,0F0H,0FH,0F0H,0FH,0F0H,0FH
;
; Line pattern 8:
;
; OOOO........OOOOOOOO........OOOOOOOO........OOOOOOOO........OOOO
;
;--------------------------------
;
	DB	55H,55H,55H,55H,0AAH,0AAH,0AAH,0AAH
;
; Line pattern 9:
;
; .O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.OO.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.
;
;--------------------------------
;
	DB	33H,0CCH,33H,0CCH,33H,0CCH,33H,0CCH
;
; Line pattern 10:
;
; ..OO..OOOO..OO....OO..OOOO..OO....OO..OOOO..OO....OO..OOOO..OO..
;
;--------------------------------
;
	DB	55H,55H,0AAH,0AAH,55H,55H,0AAH,0AAH
;
; Line pattern 11:
;
; .O.O.O.O.O.O.O.OO.O.O.O.O.O.O.O..O.O.O.O.O.O.O.OO.O.O.O.O.O.O.O.
;
;--------------------------------
;
	DB	52H,0A5H,4AH,94H,29H,52H,0A5H,4AH
;
; Line pattern 12:
;
; .O.O..O.O.O..O.O.O..O.O.O..O.O....O.O..O.O.O..O.O.O..O.O.O..O.O.
;
;--------------------------------
;
	DB	4AH,0A5H,52H,29H,94H,4AH,0A5H,52H
;
; Line pattern 13:
;
; .O..O.O.O.O..O.O.O.O..O...O.O..OO..O.O...O..O.O.O.O..O.O.O.O..O.
;
;--------------------------------
;
	DB	73H,0E7H,0CEH,9CH,39H,73H,0E7H,0CEH
;
; Line pattern 14:
;
; .OOO..OOOOO..OOOOO..OOO.O..OOO....OOO..O.OOO..OOOOO..OOOOO..OOO.
;
;--------------------------------
;
	DB	0FH,0FH,0FH,0FH,0F0H,0F0H,0F0H,0F0H
;
; Line pattern 15:
;
; ....OOOO....OOOO....OOOO....OOOO....OOOO....OOOO....OOOO....OOOO
;
;--------------------------------
;
; P.S.
;       The doc (Appendix J, "NCR Graphics Extension for MS-BASIC")
; shows the following fill patterns for boxes:
;
; tabbox:			; Table of fill patterns for boxes
;				;   in Hex and Symbolic Binary:
;				;      0 = ".", 1 = "O"
;
;-------------------------------; Box pattern O:
;
;	DB	0FFH		; OOOOOOOO	
;	DB	0FFH		; OOOOOOOO
;	DB	0FFH		; OOOOOOOO
;	DB	0FFH		; OOOOOOOO
;	DB	0FFH		; OOOOOOOO
;	DB	0FFH		; OOOOOOOO
;	DB	0FFH		; OOOOOOOO
;	DB	0FFH		; OOOOOOOO
;
;-------------------------------; Box pattern 1:
;
;	DB	 55H		; .O.O.O.O
;	DB	0AAH		; O.O.O.O.
;	DB	 55H		; .O.O.O.O
;	DB	0AAH		; O.O.O.O.
;	DB	 55H		; .O.O.O.O
;	DB	0AAH		; O.O.O.O.
;	DB	 55H		; .O.O.O.O
;	DB	0AAH		; O.O.O.O.
;
;-------------------------------; Box pattern 2:
;
;	DB	 11H		; ...O...O
;	DB	 22H		; ..O...O.
;	DB	 44H		; .O...O..
;	DB	 88H		; O...O...
;	DB	 11H		; ...O...O
;	DB	 22H		; ..O...O.
;	DB	 44H		; .O...O..
;	DB	 88H		; O...O...
;
;-------------------------------; Box pattern 3:
;
;	DB	 88H		; O...O...
;	DB	 44H		; .O...O..
;	DB	 22H		; ..O...O.
;	DB	 11H		; ...O...O
;	DB	 88H		; O...O...
;	DB	 44H		; .O...O..
;	DB	 22H		; ..O...O.
;	DB	 11H		; ...O...O
;
;-------------------------------; Box pattern 4:
;
;	DB	 00H		; ........
;	DB	 55H		; .O.O.O.O
;	DB	 00H		; ........
;	DB	 55H		; .O.O.O.O
;	DB	 00H		; ........
;	DB	 55H		; .O.O.O.O
;	DB	 00H		; ........
;	DB	 55H		; .O.O.O.O
;
;-------------------------------; Box pattern 5:
;
;	DB	 00H		; ........
;	DB	0FFH		; OOOOOOOO
;	DB	 00H		; ........
;	DB	0FFH		; OOOOOOOO
;	DB	 00H		; ........
;	DB	0FFH		; OOOOOOOO
;	DB	 00H		; ........
;	DB	0FFH		; OOOOOOOO
;
;-------------------------------; Box pattern 6:
;
;	DB	 55H		; .O.O.O.O
;	DB	 55H		; .O.O.O.O
;	DB	 55H		; .O.O.O.O
;	DB	 55H		; .O.O.O.O
;	DB	 55H		; .O.O.O.O
;	DB	 55H		; .O.O.O.O
;	DB	 55H		; .O.O.O.O
;	DB	 55H		; .O.O.O.O
;
;-------------------------------; Box pattern 7:
;
;	DB	 81H		; O......O
;	DB	 42H		; .O....O.
;	DB	 24H		; ..O..O..
;	DB	 18H		; ...OO...
;	DB	 18H		; ...OO...
;	DB	 24H		; ..O..O..
;	DB	 42H		; .O....O.
;	DB	 81H		; O......O
;
;-------------------------------; Box pattern 8:
;
;	DB	 0FH		; ....OOOO
;	DB	0F0H		; OOOO....
;	DB	 0FH		; ....OOOO
;	DB	0F0H		; OOOO....
;	DB	 0FH		; ....OOOO
;	DB	0F0H		; OOOO....
;	DB	 0FH		; ....OOOO
;	DB	0F0H		; OOOO....
;
;-------------------------------; Box pattern 9:
;
;	DB	0AAH		; O.O.O.O.
;	DB	0AAH		; O.O.O.O.
;	DB	0AAH		; O.O.O.O.
;	DB	0AAH		; O.O.O.O.
;	DB	0AAH		; .O.O.O.O
;	DB	0AAH		; .O.O.O.O
;	DB	0AAH		; .O.O.O.O
;	DB	0AAH		; .O.O.O.O
;
;-------------------------------; Box pattern 10:
;
;	DB	0CCH		; OO..OO..
;	DB	 33H		; ..OO..OO
;	DB	0CCH		; OO..OO..
;	DB	 33H		; ..OO..OO
;	DB	0CCH		; OO..OO..
;	DB	 33H		; ..OO..OO
;	DB	0CCH		; OO..OO..
;	DB	 33H		; ..OO..OO
;
;-------------------------------; Box pattern 11:
;
;	DB	0AAH		; O.O.O.O.
;	DB	0AAH		; O.O.O.O.
;	DB	 55H		; .O.O.O.O
;	DB	 55H		; .O.O.O.O
;	DB	0AAH		; O.O.O.O.
;	DB	0AAH		; O.O.O.O.
;	DB	 55H		; .O.O.O.O
;	DB	 55H		; .O.O.O.O
;
;-------------------------------; Box pattern 12:
;
;	DB	 4AH		; .O..O.O.
;	DB	0A5H		; O.O..O.O
;	DB	 52H		; .O.O..O.
;	DB	 29H		; ..O.O..O
;	DB	 94H		; O..O.O..
;	DB	 4AH		; .O..O.O.
;	DB	0A5H		; O.O..O.O
;	DB	 52H		; .O.O..O.
;
;-------------------------------; Box pattern 13:
;
;	DB	 52H		; .O.O..O.
;	DB	0A5H		; O.O..O.O
;	DB	 4AH		; .O..O.O.
;	DB	 94H		; O..O.O..
;	DB	 29H		; ..O.O..O
;	DB	 52H		; .O.O..O.
;	DB	0A5H		; O.O..O.O
;	DB	 4AH		; .O..O.O.
;
;-------------------------------; Box pattern 14:
;
;	DB	0CEH		; OO..OOO.
;	DB	0E7H		; OOO..OOO
;	DB	 73H		; .OOO..OO
;	DB	 39H		; ..OOO..O
;	DB	 9CH		; O..OOO..
;	DB	0CEH		; OO..OOO.
;	DB	0E7H		; OOO..OOO
;	DB	 73H		; .OOO..OO
;
;-------------------------------; Box pattern 15:
;
;	DB	0F0H		; OOOO....
;	DB	0F0H		; OOOO....
;	DB	0F0H		; OOOO....
;	DB	0F0H		; OOOO....
;	DB	 0FH		; ....OOOO
;	DB	 0FH		; ....OOOO
;	DB	 0FH		; ....OOOO
;	DB	 0FH		; ....OOOO
;
;--------------------------------
;
valueP:	DB	00H		; Pattern value
;
	DB	00H,00H		; ???
	DB	00H,00H		; ???
	DB	00H,00H		; ???
;
startX:	DW	0000H		; Starting point X
;
	DB	00H,00H		; ???
;
startY:	DW	0000H		; Starting point Y
;
	DB	00H,00H		; ???
	DB	00H,00H		; ???
;
;--------------------------------
; Draw a string A$ in a specific direction D.
; The valid range of values for D is 0:7.
; A$ may be any alphanumeric string defined in the program
; (ASCII characters only).
; GPOINT defines the lower left corner of the text string.
; The direction D rotates the text counterclockwise in
; steps of 45 degrees around the cursor.
; GZOOM affects the size of the text. For a zoom factor of 0,
; the maximum size of the character field is 16 pixels high
; and 8 pixels wide. The maximum size of the character
; itself is 9 pixels high and 6 pixels wide. Assuming the
; zoom parameter is Z, the actual size of a character field
; is height = 16*(Z+1) pixels by width = 8*(Z+1) pixels.
; For example, a text 3 characters long with a zoom parameter
; of 4 is height = 3*(16*(4+1)) by width = 3*(8*(4+1)) pixels.
; There is no error checking done on these calculations,
; so make sure the results do not exceed the height and width
; of the screen.
;
GTEXT:	SHLD	saveHL		; Length of string A$ (one byte)
	XCHG
	SHLD	saveDE		; Direction D

	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	CALL	noerr

	LHLD	saveDE		; Direction D
	SHLD	saveBC
	CALL	loadHL
	LXI	D,3C08H		; Check for 0:7  (3CH = error 60)
	CALL	errH
	MOV	A,L
	STA	gtextD

	ADI	02H		; 2 
	ANI	07H		; 7 
	ORI	10H		; 16 
	STA	gtextX		; GTEXT unknown...

	LHLD	saveHL		; Load length of string A$
	MOV	C,M
	MVI	A,00H		; Empty string ?
	CMP	C
	JZ	finis		; Go back to calling routine
	INX	H
	CALL	loadHL		; Load first char of string A$

gtext2:	MOV	B,M
	INX	H
	PUSH	H
	PUSH	B
	MOV	A,B
	CALL	gtext3
	LXI	H,I$0F0F	; Pattern ?
	CALL	gtext5
	LXI	H,Io0F07	; Pattern ?
	CALL	gtext5
	CALL	gtext6
	CALL	point2		; Position cursor at (X,Y)
	POP	B
	POP	H
	DCR	C
	JNZ	gtext2

	CALL	gpat2		; Outputs pattern bytes
	JMP	finis		; Go back to calling routine
;
;--------------------------------
;
gtextD:	DB	 00H		; GTEXT direction D
;
gtextX:	DB	 10H		; FIGS params: P1: Graphics Character (ON)
	DB	 07H		; P2
	DB	 40H		; P3
	DB	 08H		; P4
	DB	 00H		; P5
	DB	 08H		; P6
	DB	 00H		; P7
	DB	0FFH		; P8
	DB	 3FH		; P9
	DB	0FFH		; P10
	DB	 3FH		; P11
;
;--------------------------------
; Output a screen image to a printer.
; GPRINT outputs an entire screen image to a printer.
; All white areas on the screen are output as black
; on the printer, and black areas are output as white.
; When the output is finished, one additional linefeed
; is printed. (Printing a screen can be interrupted
; only by switching off the NCR DECISION MATE V.)
; The valid range of values for a Printer is 0,1,2,4,5.
; The following printers can be used with GPRINT:
;     EPSON MX-80
;     EPSON MX-82
;     EPSON MX-110
;     EPSON FX-80
;     NCR 6411-8510  (C-ITOH M8510A)
; The Printer parameters are assigned as follows:
;     0  EPSON MX-80, MX-82, MX-100;
;	 single density, one directional
;     1  EPSON MX-80, MX-82, MX-100;
;	 Double density, one directional
;     2  EPSON FX-80; single density, one directional
;     4  NCR 6411-8510  (C-ITOH M8510A);
;	 single density, bi-directional
;     5  NCR 6411-8510  (C-ITOH M8510A);
;	 single density, one directional
;	 (When the graphics output is completed,
;	  bi-directional printing is automatically restored.)
; Some of the above printers are not capable of printing
; the whole screen image horizontally. Below is a list of the
; maximum horizontal width for each printer:
;     480 pixels - EPSON MX-80
;     576 pixels - EPSON MX-82
;     640 pixels - EPSON MX-100
;     640 pixels - EPSON FX-80
;     640 pixels - NCR 6411-8510  (C-ITOH M8510A)
; Using the recommended Linefeeds, the EPSON MX-82 does not
; distort the screen image on paper; the EPSON FX-80, MX-80
; and MX-100 distort horizontally; The NCR (C-ITOH) printer
; distorts vertically.
; The valid range of values for the Linefeed parameter is 0:99.
; The recommended Linefeed for the EPSON MX-80, MX-82, and
; MX-100 printers is 8; EPSON FX-80 is 7; and NCR 6411-8510
; (C-ITOH M8510A) is 16. These recommended values produce
; the best output. Smaller values produce overlapped lines
; and larger values produce lines with a visible distance
; between them. When the graphics output is completed,
; the normal linefeed value is automatically restored.
;
GPRINT:	SHLD	saveHL		; Printer P
	XCHG
	SHLD	saveDE		; Linefeed L
	LXI	H,0000H
	DAD	SP
	SHLD	oldSP
	LXI	SP,stack
	CALL	noerr

	LHLD	saveHL		; Load printer value
	CALL	loadHL
	LXI	D,4606H		; Check for 0:5  (46H = error 70)
	CALL	errH
	MOV	A,L
	STA	printr

	LXI	H,tabESC	; Table of ESCape codes
	RLC
	RLC
	RLC
	MVI	D,00H
	MOV	E,A		; A-reg = printer number
	DAD	D
	SHLD	ESCod		; ESCape code to send

	LDA	printr
	CPI	03H		; Not valid ?
	JNZ	validP
	MVI	A,46H		; = error 70 (Printer out of range)
	STA	GSTAT
	JMP	finis		; Go back to calling routine
;
;--------------------------------
; Valid printer numbers
;
validP:	CPI	04H		; 5
	JNC	J$0674
	CPI	01H		; 2
	JZ	valid2
	SUB	A
valid2:	STA	Do0820		; 1
	SUB	A
	STA	Do081F		; 0
	CALL	chkLF		; Check number of linefeeds L
	STA	valueL
	LXI	H,I$083C
	SHLD	Do0824
	LXI	H,I$087E
	SHLD	Do0828
	JMP	Jo06C3
;
;--------------------------------
;
J$0674:	MVI	A,01H		; 1 
	STA	Do081F
	SUB	A
	STA	D$081E		; 0
	STA	Do0820
	MOV	B,A
	CALL	chkLF		; Check number of linefeeds L
J$0684:	CPI	0AH		; 10 
	JC	J$068F
	SUI	0AH		; 10 
	INR	B
	JMP	J$0684
;
;--------------------------------
;
J$068F:	ADI	30H		; "0"
	STA	D$0845
	STA	D$084B
	MOV	A,B
	ADI	30H		; "0"
	STA	D$0844
	STA	D$084A
	LDA	printr
	CPI	04H		; NCR single density bidirect
	JZ	J$06B7
	LXI	H,I$0848
	SHLD	Do0824
	LXI	H,I$0888
	SHLD	Do0828
	JMP	Jo06C3
;
;--------------------------------
;
J$06B7:	LXI	H,I$0842
	SHLD	Do0824
	LXI	H,I$0883
	SHLD	Do0828
Jo06C3:	LHLD	Do0824
	LXI	B,0605H
	CALL	Co088F
J$06CC:	LHLD	ESCod		; ESCape code to send
	LXI	B,0805H
	CALL	Co088F
J$06D5:	LXI	H,Io082C
	SHLD	Do082A
	LDA	Do0817
	ORA	A
	JNZ	J$06F6
	LXI	H,0000H
	SHLD	Do0818
	SHLD	Do081B
	MVI	A,32H		; "2"
	STA	Do0817
	LDA	Do0821
	STA	Do0816
J$06F6:	LXI	H,I$07F6
	MVI	A,78H		; PRAM: 2 bytes follow
	CALL	outA
	MVI	C,02H		; 2 bytes follow
	CALL	outC
	LXI	H,Do0818
	CALL	outCRS		; CURS
	LXI	H,I$07F8
	CALL	outMSK		; MASK
	LXI	H,I$07FA
	CALL	outFGS
	MVI	A,0A0H		; RDAT
	CALL	outA
	LXI	H,0805H
	LXI	D,Io080D
	MVI	C,08H		; 8 
	CALL	Co07E2
	LHLD	Do082A
	XCHG
	CALL	C$0799
	XCHG
	SHLD	Do082A
	LHLD	Do0818
	INX	H
	SHLD	Do0818
	LDA	Do0820
	STA	Do0822
	LXI	H,Io082C
	LXI	B,1005H
	CALL	Co088F
	MVI	A,00H
	STA	Do0822
	LDA	Do0816
	DCR	A
	STA	Do0816
	JNZ	J$06D5
	LXI	B,0205H
	LXI	H,I$088D
	CALL	Co088F
	LXI	H,0028H
	DAD	H
	DAD	H
	DAD	H
	XCHG
	LHLD	Do081B
	DAD	D
	SHLD	Do0818
	SHLD	Do081B
	LDA	Do0821
	STA	Do0816
	LDA	Do0817
	DCR	A
	STA	Do0817
	JNZ	J$06CC
	LHLD	Do0828
	LXI	B,0505H
	CALL	Co088F
	JMP	finis		; Go back to calling routine
;
;--------------------------------
;
chkLF:	LHLD	saveDE		; Load Linefeed value
	CALL	loadHL
	LXI	D,4764H		; Check for 0:99  (47H = error 71)
	CALL	errH
	MOV	A,L
	RET
;
;--------------------------------
;
C$0799:	MVI	A,01H		; 1 
	STA	Do0815
J$079E:	LXI	B,0808H
;
J$07A1:	DB	21H		; ?
;
;	LXI	H,0805H
;
Do07A2:	DW	0805H		; ?
;
J$07A4:	LDA	Do081F
	CPI	00H
	JZ	J$07B4
	MOV	A,M
	RAR
	MOV	M,A
	LDAX	D
	RAR
	JMP	J$07B9
;
;--------------------------------
;
J$07B4:	MOV	A,M
	RAR
	MOV	M,A
	LDAX	D
	RAL
J$07B9:	INX	H
	STAX	D
	DCR	B
	JNZ	J$07A4
	INX	D
	MVI	B,08H		; 8 
	DCR	C
	JNZ	J$07A1
	LDA	Do0815
	ANI	01H		; 1 
	JZ	J$07DB
	LXI	H,Io080D
	SHLD	Do07A2		; ?
	DCR	A
	STA	Do0815
	JMP	J$079E
;
;--------------------------------
;
J$07DB:	LXI	H,0805H
	SHLD	Do07A2		; ?
	RET
;
;--------------------------------
; Probably outputs screen dump to RAM ?
;
Co07E2:	IN	status		; Read status register
	ANI	00000001B  	; Status register flags:
;		::::::::
;		:::::::+-> Bit 0: Data Ready
;		::::::+--> Bit 1: 
;		:::::+---> Bit 2: 
;		::::+----> Bit 3: 
;		:::+-----> Bit 4: 
;		::+------> Bit 5: 
;		:+-------> Bit 6: 
;		+--------> Bit 7: 
	JZ	Co07E2
	IN	FIFO		; FIFO write a byte ?
	MOV	M,A
	INX	H
	IN	FIFO		; FIFO write a byte ?
	STAX	D
	INX	D
	DCR	C
	JNZ	Co07E2
	RET
;
;--------------------------------
;
I$07F6:	DB	0FFH,0FFH
;
I$07F8:	DB	0FFH,0FFH
;
I$07FA:	DB	 00H		; P1
	DB	 08H		; P2
	DB	 40H		; P3
	DB	 08H		; P4
	DB	 00H		; P5
	DB	 08H		; P6
	DB	 00H		; P7
	DB	0FFH		; P8
	DB	 3FH		; P9
	DB	0FFH		; P10
	DB	 3FH		; P11
;
; Set program counter P070D
;
	DB	00H,00H,00H
	DB	00H,00H,00H,00H,00H
Io080D:	DB	00H
	DB	00H,00H,00H,00H,00H,00H,00H
;
; Set program counter P0715
;
Do0815:	DB	00H
Do0816:	DB	00H
Do0817:	DB	00H
Do0818:	DB	00H,00H,00H
Do081B:	DB	00H,00H,00H
D$081E:	DB	00H
Do081F:	DB	00H
Do0820:	DB	00H
Do0821:	DB	28H
Do0822:	DB	00H
;
printr:	DB	00H		; Printer number
;
Do0824:	DB	00H,00H
;
ESCod:	DW	0000H		; Address of ESCape code to send
;
Do0828:	DB	00H,00H
;
Do082A:	DW	2C07H		; ?
;
; 16 octets en trop...
;
Io082C:	DB	00H,00H,00H,00H,00H,00H,00H,00H
	DB	00H,00H,00H,00H,00H,00H,00H,00H
;
; Set program counter P073C
;
I$083C:	DB	1BH,41H
;
valueL:	DB	00H,00H,00H,00H
;
I$0842:	DB	1BH,54H
D$0844:	DB	00H
D$0845:	DB	00H,00H,00H
I$0848:	DB	1BH,54H
D$084A:	DB	00H
D$084B:	DB	00H,1BH,3EH
;
tabESC:	DB	00H,00H,00H,00H,1BH,4BH,80H,02H  ; Printer 0: MX-80
	DB	00H,00H,00H,00H,1BH,4CH,00H,05H	 ; Printer 1: MX-82
	DB	00H,00H,00H,1BH,2AH,04H,80H,02H  ; Printer 2: MX-100
	DB	00H,00H,00H,00H,00H,00H,00H,00H  ; Printer 3: (none)
	DB	00H,00H,1BH,53H,30H,36H,34H,30H  ; Printer 4: FX-80
	DB	00H,00H,1BH,53H,30H,36H,34H,30H  ; Printer 5: 8510
;
I$087E:	DB	1BH,41H,0CH,00H,0AH
I$0883:	DB	1BH,41H,00H
	DB	00H,0AH
I$0888:	DB	1BH,41H,1BH,3CH,0AH
I$088D:	DB	0DH,0AH
;
;--------------------------------
;
Co088F:	LDA	Do0822
	MOV	D,A
J$0893:	MOV	E,M
	PUSH	H
	PUSH	B
	PUSH	D
	CALL	BDOS
	POP	D
	POP	B
	POP	H
	DCR	D
	JZ	J$0893
	INX	H
	DCR	B
	JNZ	Co088F
	RET
;
;--------------------------------
; Outputs GDC command in A-reg
;
outA:	PUSH	H		; HL used by following outC
	PUSH	PSW
outA2:	IN	status		; Read Status register
	ANI	00001010B  	; Status register flags:
;		::::::::
;		:::::::+-> Bit 0: 
;		::::::+--> Bit 1: FIFO Full
;		:::::+---> Bit 2: 
;		::::+----> Bit 3: Drawing in Progress
;		:::+-----> Bit 4: 
;		::+------> Bit 5: 
;		:+-------> Bit 6: 
;		+--------> Bit 7: 
	JNZ	outA2
	POP	PSW		; GDC command in A-reg
	OUT	FIFO		; FIFO read GDC command
	POP	H
	RET
;
;--------------------------------
; Outputs GDC parameters in M(HL)  (length in C-reg)
;
outC:	IN	status		; Read Status register
	ANI	00001010B  	; Status register flags:
;		::::::::
;		:::::::+-> Bit 0: 
;		::::::+--> Bit 1: FIFO Full
;		:::::+---> Bit 2: 
;		::::+----> Bit 3: Drawing in Progress
;		:::+-----> Bit 4: 
;		::+------> Bit 5: 
;		:+-------> Bit 6: 
;		+--------> Bit 7: 
	JNZ	outC
	MOV	A,M		; Get GDC parameter
	OUT	status		; Write Parameter into FIFO
	INX	H		; Next GDC parameter
	DCR	C		; Decrements Counter
	JNZ	outC
	RET
;
;--------------------------------
; Outputs ZOOM parameter
;
outzom:	MVI	A,ZOOM		; GDC command
	CALL	outA
	MVI	C,01H		; 1 byte follows
	CALL	outC
	RET
;
;--------------------------------
; Outputs CCHAR parameter
;
outCHR:	MVI	A,CCHAR		; GDC command
	CALL	outA
	MVI	C,01H		; 1 byte follows
	CALL	outC
	RET
;
;--------------------------------
; Outputs PRAM parameters
;
outPRM:	MVI	A,PRAM		; GDC command
	CALL	outA
	MVI	C,10H		; 16 byte follow
	CALL	outC
	RET
;
;--------------------------------
; Outputs CURS parameters
;
outCRS:	MVI	A,CURS		; GDC command
	CALL	outA
	MVI	C,03H		; 3 bytes follow
	CALL	outC
	RET
;
;--------------------------------
; Outputs MASK parameters
;
outMSK:	MVI	A,MASK		; GDC command
	CALL	outA
	MVI	C,02H		; 2 bytes follow
	CALL	outC
	RET
;
;--------------------------------
; Outputs FIGS parameters
;
outFGS:	MVI	A,FIGS		; GDC command
	CALL	outA
	MVI	C,0BH		; 11 bytes follow
	CALL	outC
	RET
;
;--------------------------------
; Outputs FIGS command and switch Graphics Drawing flag
;
outFG2:	MVI	A,FIGS		; GDC command
	CALL	outA
	CALL	SGDflg		; Switch Graphics Drawing flag
	MVI	C,0BH		; 11 bytes follow
	CALL	outC
	RET
;
;--------------------------------
; Outputs PRAM command (8 bytes version)
;
outpat:	MVI	A,78H		; PRAM GDC command
	CALL	outA
	MVI	C,08H		; 8 bytes follow
	CALL	outC
	RET
;
;--------------------------------
; Switch Graphics Drawing flag
;
SGDflg:	LDA	FIGSP3		; FIGS P3
	ORI	40H		; 0100 0000B: Graphics Drawing flag
	STA	FIGSP3
	RET
;
;--------------------------------
; Compute EAD and dAD for CURS
;
EADdAD:	PUSH	H
	PUSH	B
	PUSH	D
	PUSH	PSW
	LHLD	startY		; Starting point Y
	SHLD	strtY2
	CALL	Co0977
	SHLD	startY		; Starting point Y
	LXI	B,0000H
	LHLD	startX		; Starting point X
	DCX	H
	MOV	A,L
	ANI	0FH		; 15 
	STA	Do099A
	RLC
	RLC
	RLC
	RLC
	STA	Do0997
	MOV	A,L
	ANI	0F0H
	MOV	L,A
	LXI	D,0FFF0H
	CALL	Co0A48
	MOV	A,C
	STA	Do0998
	LHLD	startY		; Starting point Y
	DCX	H
	XCHG
	LXI	H,0000H
	LXI	B,0028H
	CALL	Co0982
	XCHG
	LDA	Do0998
	MOV	L,A
	DAD	D
	SHLD	Do0995
	POP	PSW
	POP	D
	POP	B
	POP	H
	RET
;
;--------------------------------
;
Co0977:	CALL	Co1002
	XCHG
	MVI	H,01H		; 1 
	MVI	L,90H
	INX	H
	DAD	D
	RET
;
;--------------------------------
;
Co0982:	MVI	A,00H
	CMP	E
	JZ	J$098D
	DAD	B
	DCR	E
	JMP	Co0982
;
;--------------------------------
;
J$098D:	CMP	D
	RZ
	DAD	B
	DCR	E
	DCR	D
	JMP	Co0982
;
;--------------------------------
;
Do0995:	DB	00H,00H
;
Do0997:	DB	00H
;
Do0998:	DB	00H,00H
;
Do099A:	DB	00H,00H
;
;--------------------------------
;
garc31:	PUSH	H
	PUSH	B
	PUSH	D
	PUSH	PSW

	MVI	A,20H
	STA	FIGSP1		; 20H = Arc

	LHLD	radius
	XCHG
	LHLD	Do0995
	LXI	B,0028H
	CALL	Co0A40
	CALL	Co0982
	SHLD	Do0A51
	SHLD	D$0A60

	LHLD	radius
	XCHG
	LHLD	Do0995
	LXI	B,0028H
	CALL	Co0982
	SHLD	D$0A54
	SHLD	D$0A5D

	LDA	Do0997
	STA	D$0A53
	STA	D$0A62
	STA	D$0A56
	STA	D$0A5F

	LHLD	radius
	MOV	A,L
	STA	Do0A69
	ANI	0F0H
	MOV	L,A

	LXI	D,0FFF0H
	LXI	B,0000H
	CALL	Co0A48
	PUSH	B

	LDA	Do0A69
	ANI	0FH		; 15 
	CALL	Co0A2C
	STA	D$0A5C
	STA	D$0A65

	LHLD	Do0995
	DAD	B
	SHLD	D$0A5A
	SHLD	D$0A63
	POP	B

	LDA	Do0A69
	ANI	0FH		; 15 
	CMA
	INR	A
	CALL	Co0A2C
	STA	D$0A59
	STA	D$0A68
	CALL	Co0A40

	LHLD	Do0995
	DAD	B
	SHLD	D$0A57
	SHLD	D$0A66

	POP	PSW
	POP	D
	POP	B
	POP	H
	RET
;
;--------------------------------
;
Co0A2C:	MOV	E,A
	LDA	Do099A
	ADD	E
	MOV	E,A
	ANI	0F0H
	JZ	J$0A38
	INX	B
J$0A38:	MOV	A,E
	RLC
	RLC
	RLC
	RLC
	ANI	0F0H
	RET
;
;--------------------------------
;
Co0A40:	MOV	A,C
	CMA
	MOV	C,A
	MOV	A,B
	CMA
	MOV	B,A
	INX	B
	RET
;
;--------------------------------
;
Co0A48:	DAD	D
	INR	C
	JC	Co0A48
	DCR	C
	RET
;
;--------------------------------
;
radius:	DB	00H,00H
Do0A51:	DB	00H,00H
D$0A53:	DB	00H
D$0A54:	DB	00H,00H
D$0A56:	DB	00H
D$0A57:	DB	00H,00H
D$0A59:	DB	00H
D$0A5A:	DB	00H,00H
D$0A5C:	DB	00H
D$0A5D:	DB	00H,00H
D$0A5F:	DB	00H
D$0A60:	DB	00H,00H
D$0A62:	DB	00H
D$0A63:	DB	00H,00H
D$0A65:	DB	00H
D$0A66:	DB	00H
	DB	00H
D$0A68:	DB	00H
Do0A69:	DB	00H
;
;--------------------------------
;
garc32:	LHLD	radius
	DCX	H
	SHLD	FIGSP4
	DAD	H
	SHLD	FIGSP6
	LXI	H,3FFFH
	SHLD	FIGSP8
	LXI	H,0000H
	SHLD	FIGSPA
	RET
;
;--------------------------------
;
garc41:	LDA	Do0AE6
	ANI	01H		; 1 
	JZ	J$0AAA
	LDA	Do0AE9
	CPI	2DH		; "-"
	JNZ	J$0A95
	CALL	Co0CAA
J$0A95:	LDA	Do0AE9
	MOV	L,A
	MVI	H,00H
	CALL	Co0D09
	LXI	B,0001H
	LXI	H,FIGSPA
	CALL	Co0CA6
	JMP	J$0AC5
;
;--------------------------------
;
J$0AAA:	CALL	Co0CAA
	LDA	Do0AED
	ANI	01H		; 1 
	JZ	J$0AB9
	LXI	H,FIGSP2
	INR	M
J$0AB9:	MVI	A,2DH		; "-"
	LXI	H,Do0AE9
	SUB	M
	MOV	L,A
	MVI	H,00H
	CALL	Co0D13
J$0AC5:	RET
;
;--------------------------------
;
garc33:	MVI	B,0FFH
	LHLD	angleS
	LXI	D,0FFD3H
J$0ACE:	DAD	D
	INR	B
	JC	J$0ACE
	LXI	H,Do0AEB
	MOV	M,B
	MVI	B,0FFH
	LHLD	angleE
J$0ADC:	DAD	D
	INR	B
	JC	J$0ADC
	LXI	H,Io0AEC
	MOV	M,B
	RET
;
;--------------------------------
;
Do0AE6:	DB	00H
Do0AE7:	DB	00H,00H
Do0AE9:	DB	00H,00H
Do0AEB:	DB	00H
Io0AEC:	DB	00H
Do0AED:	DB	00H
;
;--------------------------------
;
garc35:	LHLD	angleS
	MOV	C,L
	MOV	B,H
	CALL	Co0A40
	LHLD	angleE
	DAD	B
	MOV	A,H
	ANI	80H
	JZ	J$0B09
	LXI	H,0168H		; = 360
	DAD	B
	XCHG
	LHLD	angleE
	DAD	D
J$0B09:	SHLD	Do0AE7
	RET
;
;--------------------------------
;
garc36:	LDA	Do0AEB
	RLC
	MVI	D,00H
	MOV	E,A
	LXI	H,table1
	DAD	D
	MOV	E,M
	INX	H
	MOV	D,M
	XCHG
	PUSH	H
	LHLD	angleS
	MOV	B,H
	MOV	C,L
	CALL	Co0A40
	POP	H
	DAD	B
	MOV	A,L
	STA	Do0AE9
	RET
;
;--------------------------------
; Error: table angleS/octants ? (8 datas)
;
table1:	DW	 2D00H		; ?
	DW	 5A00H		; ?
	DW	 8700H		; ?
	DW	0B400H		; ?
	DW	0E100H		; ?
	DW	 0E01H		; ?
	DW	 3B01H		; ?
	DW	 6801H		; ?
;
;--------------------------------
;
garc42:	LDA	Do0AE6
	RLC
	LXI	H,Do0AE6
	ADD	M
	MOV	C,A
	MVI	B,00H
	LXI	H,table2
	DAD	B
	PUSH	H
	MOV	A,M
	MOV	E,A
	INX	H
	MOV	A,M
	MOV	D,A
	XCHG
	CALL	outCRS		; CURS: position cursor
	POP	H
	INX	H
	INX	H
	MOV	A,M
	LXI	H,FIGSP1	; Get FIGS P1 (first param)
	ORI	20H		; Reset Arc bit
	MOV	M,A
	CALL	outFG2		; FIGS and switch Graphics Drawing flag
	MVI	A,6CH		; FIGD: Draw the Arc
	CALL	outA
	RET
;
;--------------------------------
;
; Table of addr + byte (between 00H and 07H)
;
table2:	DW	D$0A5A		; ?
	DB	04H		; ?

	DW	Do0A51		; ?
	DB	01H		; ?

	DW	Do0A51		; ?
	DB	06H		; ?

	DW	D$0A57		; ?
	DB	03H		; ?

	DW	D$0A57		; ?
	DB	00H		; ?

	DW	D$0A54		; ?
	DB	05H		; ?

	DW	D$0A54		; ?
	DB	02H		; ?

	DW	D$0A5A		; ?
	DB	07H		; ?
;
;--------------------------------
;
garc51:	LDA	Do0AE9
	MOV	C,A
	MVI	B,00H
	CALL	Co0A40
	LHLD	Do0AE7
	DAD	B
	SHLD	Do0AE7
	RET
;
;--------------------------------
;
garc52:	LDA	Do0AE6
	INR	A
	ANI	07H		; 7 
	STA	Do0AE6
	RET
;
;--------------------------------
;
garc53:	CALL	Co0CAA
	LDA	Do0AE6
	LXI	H,0001H
	SHLD	FIGSPA
	ANI	01H		; 1 
	JNZ	Jo0BBE
	LXI	H,0000H
	SHLD	FIGSPA
	LDA	Do0AED
	ANI	01H		; 1 
	JZ	Jo0BBE
	LXI	H,FIGSP2
	INR	M
Jo0BBE:	CALL	garc42
	RET
;
;--------------------------------
;
garc37:	LDA	Do0AEB
	ANI	01H		; 1 
	JZ	J$0BE5

	LHLD	angleS
	SHLD	Do0D24
	CALL	Co0C01
	CALL	Co0D09

	LHLD	angleE
	SHLD	Do0D24
	CALL	Co0C01
	CALL	Co0D13
	JMP	J$0BFD
;
;--------------------------------
;
J$0BE5:	LHLD	angleE
	SHLD	Do0D24
	CALL	Co0C1C
	CALL	Co0D09

	LHLD	angleS
	SHLD	Do0D24
	CALL	Co0C1C
	CALL	Co0D13
J$0BFD:	CALL	garc42
	RET
;
;--------------------------------
;
Co0C01:	LDA	Do0AEB
	RLC
	MVI	D,00H
	MOV	E,A
	LXI	H,table1
	DAD	D
	MOV	E,M
	INX	H
	MOV	D,M
	XCHG
	PUSH	H
	LHLD	Do0D24
	MOV	B,H
	MOV	C,L
	CALL	Co0A40
	POP	H
	DAD	B
	RET
;
;--------------------------------
;
Co0C1C:	LDA	Do0AEB
	RLC
	MVI	D,00H
	MOV	E,A		; DE = 00 + Do0AEB
	LXI	H,table3	; HL = 0000
	DAD	D		; HL = HL + DE
	MOV	E,M
	INX	H
	MOV	D,M		; DE = M(HL)
	LHLD	Do0D24		; HL = Do0D24
	DAD	D		; HL = HL + DE
	RET
;
;--------------------------------
;
; Table ?
;
table3:	DW	 0000H		; ?
	DW	0D3FFH		; ?
	DW	0A6FFH		; ?
	DW	 79FFH		; ?
	DW	 4CFFH		; ?
	DW	 1FFFH		; ?
	DW	0F2FEH		; ?
	DW	0C5FEH		; ?
;
;--------------------------------
;
C$0C3F:	LDA	Do0AE7
	STA	Do0AE9
	CPI	00H
	RZ
	LDA	Do0AE6
	ANI	01H		; 1 
	JZ	J$0C62
	CALL	Co0CAA
	MVI	A,2DH		; "-"
	LXI	H,Do0AE9
	SUB	M
	MOV	L,A
	MVI	H,00H
	CALL	Co0D13
	JMP	J$0C71
;
;--------------------------------
;
J$0C62:	LDA	Do0AE9
	MOV	L,A
	MVI	H,00H
	CALL	Co0D09
	LXI	H,0000H
	SHLD	FIGSPA
J$0C71:	CALL	garc42
	RET
;
;--------------------------------
;
Co0C75:	MOV	A,L
	ORI	00H
	JNZ	J$0C81
	LXI	B,0000H
	JMP	Jo0CA5
;
;--------------------------------
;
J$0C81:	LXI	B,table4
	DAD	B
	MOV	B,M
	LHLD	radius
	XCHG
	LHLD	radius
J$0C8D:	DAD	D
	MVI	C,00H
	JNC	J$0C95
	MVI	C,01H		; 1 
J$0C95:	DCR	B
	MVI	A,00H
	CMP	B
	JNZ	J$0C8D
	MOV	B,C
	MOV	C,H
	MOV	A,L
	ANI	80H
	JZ	Jo0CA5
	INR	C
Jo0CA5:	RET
;
;--------------------------------
;
Co0CA6:	MOV	M,C
	INX	H
	MOV	M,B
	RET
;
;--------------------------------
;
Co0CAA:	LHLD	radius
	LXI	B,table5
	DAD	B
	MOV	C,M
	LDA	Do0AED
	ANI	01H		; 1 
	JZ	J$0CCD
	MOV	A,C
	CMA
	INR	A
	ADI	7FH
	MOV	C,A
	LHLD	radius
	MVI	A,0B5H
	CMP	L
	JNZ	Jo0CD1
	DCR	C
	JMP	Jo0CD1
;
;--------------------------------
;
J$0CCD:	MOV	A,C
	ADI	7FH
	MOV	C,A
Jo0CD1:	MVI	B,00H
	LXI	H,FIGSP2
	CALL	Co0CA6
	RET
;
;--------------------------------
;
garc34:	MVI	A,00H
	STA	Do0AED
	LHLD	radius
	LXI	B,table5
	DAD	B
	MOV	B,M
	LDA	radius
	CPI	0B4H		; = 180
	JNC	J$0CFD
	MOV	A,B
	ANI	80H
	JNZ	Jo0D08
	MVI	A,01H		; 1 
	STA	Do0AED
	JMP	Jo0D08
;
;--------------------------------
;
J$0CFD:	MOV	A,B
	ANI	80H
	JZ	Jo0D08
	MVI	A,01H		; 1 
	STA	Do0AED
Jo0D08:	RET
;
;--------------------------------
;
Co0D09:	CALL	Co0C75
	LXI	H,FIGSP2
	CALL	Co0CA6
	RET
;
;--------------------------------
;
Co0D13:	CALL	Co0C75
	LXI	H,FIGSPA
	CALL	Co0CA6
	RET
;
;--------------------------------
;
?o0D1D:	DB	00H,00H,00H
;
angleS:	DW	0000H		; GCIRCL sets this to 0.
;
angleE:	DW	0000H		; GCIRCL sets this to 360.
;
Do0D24:	DB	00H,00H
;
; Tables ?
;
table4:	DB	00H,04H,09H,0DH,11H,16H,1AH,1FH
	DB	23H,28H,2CH,30H,35H,39H,3DH
	DB	42H,46H,4AH,4FH,53H,57H,5BH,5FH
	DB	64H,68H,6CH,70H,74H,78H,7CH,80H
	DB	83H,87H,8BH,8FH,92H,96H,9AH,9DH
	DB	0A1H,0A4H,0A7H,0ABH,0AEH,0B1H,0B4H
;
table5:	DB	81H,82H,82H,7EH,83H,84H,7CH,7BH
	DB	86H,87H,79H,88H,89H,77H,76H,8BH
	DB	8CH
	DB	74H,8DH,8EH,72H,71H,90H,91H,6FH
	DB	92H,93H,6DH,6CH,95H,6BH,6AH,97H
	DB	98H,68H,99H,9AH,66H,65H,9CH,9DH
	DB	63H,9EH,9FH,61H,60H,0A1H,5FH,5EH
	DB	0A3H,0A4H,5CH,5BH,0A6H,5AH,59H,0A8H
	DB	0A9H,57H,0AAH,0ABH,55H,54H,0ADH,0AEH
	DB	52H,0AFH,0B0H,50H,4FH,0B2H,4EH,4DH
	DB	0B4H,0B5H,4BH,0B6H,0B7H,49H,48H,0B9H
	DB	0BAH,46H,0BBH,0BCH,44H,43H,0BEH,42H
	DB	41H,0C0H,0C1H,3FH,3EH,0C3H,3DH,3CH
	DB	0C5H,0C6H,3AH,0C7H,0C8H,38H,37H,0CAH
	DB	36H,35H,0CCH,0CDH,33H,32H,0CFH,31H
	DB	30H,0D1H,0D2H,2EH,0D3H,0D4H,2CH,2BH
	DB	0D6H,0D7H,29H,0D8H,0D9H,27H,26H,0DBH
	DB	25H,24H,0DDH,0DEH,22H,0DFH,0E0H,20H
	DB	1FH,0E2H,0E3H,1DH,0E4H,0E5H,1BH,1AH
	DB	0E7H,19H,18H,0E9H,0EAH,16H,15H,0ECH
	DB	14H,13H,0EEH,0EFH,11H,0F0H,0F1H,0FH
	DB	0EH,0F3H,0F4H,0CH,0F5H,0F6H,0AH,09H
	DB	0F8H,08H,07H,0FAH,0FBH,05H,0FCH,0FDH
	DB	03H,02H,0FFH,00H,0FFH,01H,02H,0FEH
	DB	0FDH,04H,0FCH,0FBH,06H,07H,0F9H,0F8H
	DB	09H,0F7H,0F6H,0BH,0CH,0F4H,0DH,0EH
	DB	0F2H,0F1H,10H,0F0H,0EFH,12H,13H,0EDH
	DB	0ECH,15H,0EBH,0EAH,17H,18H,0E8H,19H
	DB	1AH,0E6H,0E5H,1CH,1DH,0E3H,1EH,1FH
	DB	0E1H,0E0H,21H,0DFH,0DEH,23H,24H,0DCH
	DB	0DBH,26H,0DAH,0D9H,28H,29H,0D7H,2AH
	DB	2BH,0D5H,0D4H,2DH,0D3H,0D2H,2FH,30H
	DB	0D0H,0CFH,32H,0CEH,0CDH,34H,35H
;
;--------------------------------
; Outputs a char on graphics screen
;
gtext3:	PUSH	B
	PUSH	D
	PUSH	H
	ANI	7FH		; ASCII chars only
	MOV	L,A
	MVI	H,00H		; HL = ?
	DAD	H
	DAD	H
	DAD	H		; 8 bytes
	DAD	H
	LXI	D,1000H		; DE = ?
	DAD	D
	LXI	D,Io0F07	; ?
	MVI	B,10H		; 16 
	OUT	11H		; ?
gtext4:	MOV	A,M
	STAX	D
	INX	H
	INX	D
	DCR	B
	JNZ	gtext4
	OUT	10H		; ?
	POP	H
	POP	D
	POP	B
	RET
;
;--------------------------------
; Initiates the drawing of the graphics character
; (or area filling pattern) stored in Parameter RAM.
;
gtext5:	CALL	outpat		; Outputs pattern value
	LXI	H,gtextX	; GTEXT unknown...
	CALL	outFGS
	MVI	A,GCHRD		; GDC command
	CALL	outA
	RET
;
;--------------------------------
;
gtext6:	LDA	valueZ		; Zoom value ?
	INR	A
	MOV	B,A
	ADD	A
	ADD	A
	ADD	A
	MOV	L,A
	MVI	H,00H
	SHLD	Do0F19

	CALL	Co1002
	SHLD	Do0F1B

	LHLD	strtY2		; Temporary startY
	SHLD	startY		; Starting point Y

	LDA	gtextD		; Test Direction D of text

	CPI	00H		; 0
	JZ	Co0ED7

	CPI	01H		; 1 
	CZ	Co0ED7
	JZ	Jo0EEF

	CPI	02H		; 2 
	JZ	Jo0EEF

	CPI	03H		; 3 
	CZ	Co0EE3
	JZ	Jo0EEF

	CPI	04H		; 4 
	JZ	Co0EE3

	CPI	05H		; 5 
	CZ	Co0EE3
	JZ	Jo0EFB

	CPI	06H		; 6 
	JZ	Jo0EFB
	CALL	Co0ED7		; 7
	JMP	Jo0EFB
;
;--------------------------------
;
Co0ED7:	LHLD	startX		; Starting point X
	XCHG
	LHLD	Do0F19		; ?
	DAD	D
	SHLD	startX		; Starting point X
	RET
;
;--------------------------------
;
Co0EE3:	LHLD	startX		; Starting point X
	XCHG
	LHLD	Do0F1B		; ?
	DAD	D
	SHLD	startX		; Starting point X
	RET
;
;--------------------------------
;
Jo0EEF:	LHLD	strtY2		; Temporary startY
	XCHG
	LHLD	Do0F19		; ?
	DAD	D
	SHLD	startY		; Starting point Y
	RET
;
;--------------------------------
;
Jo0EFB:	LHLD	strtY2		; Temporary startY
	XCHG
	LHLD	Do0F1B		; ?
	DAD	D
	SHLD	startY		; Starting point Y
	RET
;
;--------------------------------
;
; 16 octets en trop...
;
Io0F07:	DB	00H,00H,00H,00H,00H,00H,00H,00H
;
I$0F0F:	DB	00H,00H,00H,00H,00H,00H,00H,00H
;
; Set program counter P0E17
;
strtY2:	DW	0000H		; Temporary startY
;
Do0F19:	DB	00H,00H
;
Do0F1B:	DB	00H,00H
;
I$0F1D:	DB	0DH,0EH
	DB	0AH,09H,0CH,0FH,0BH,08H,0AH,0EH
	DB	0CH,08H,0DH,0FH,0BH,09H
;
;--------------------------------
;
line2:	PUSH	H
	PUSH	D
	PUSH	B
	PUSH	PSW

	XRA	A
	STA	Do1020

	LHLD	endX		; Ending point X
	XCHG
	LHLD	startX		; Starting point X
	MOV	C,L
	MOV	B,H
	CALL	Co0A40
	XCHG
	DAD	B
	CNC	Co1002
	SHLD	Do101C

	MVI	A,02H		; 2 
	CC	Co100C
	LHLD	endY		; Ending point Y
	CALL	Co0977
	SHLD	endY		; Ending point Y
	XCHG
	LHLD	startY		; Starting point Y
	MOV	C,L
	MOV	B,H
	CALL	Co0A40
	XCHG
	DAD	B
	CNC	Co1002
	SHLD	Do101E

	MVI	A,01H		; 1 
	CC	Co100C
	XCHG
	LHLD	Do101C
	MOV	C,L
	MOV	B,H
	CALL	Co0A40
	XCHG
	DAD	B
	MVI	A,04H		; 4 
	CC	Co100C
	MOV	A,L
	ORA	H

	MVI	A,08H		; 8 
	CZ	Co100C
	LHLD	Do101E
	MOV	A,L
	ORA	H
	CZ	C$0FDD
	MOV	A,E
	ORA	D
	CZ	C$0FF1

	LDA	Do1020
	ANI	04H		; 4 
	CZ	exHLDE		; Exchange HL with DE...
	SHLD	FIGSP2
	MOV	C,L
	MOV	B,H
	CALL	Co0A40
	MOV	L,E
	MOV	H,D
	DAD	H
	SHLD	FIGSP8

	DAD	B
	SHLD	FIGSP4
	XCHG
	DAD	B
	DAD	H
	SHLD	FIGSP6

	LXI	H,3FFFH
	SHLD	FIGSPA		; ?

	LXI	H,I$0F1D
	LXI	D,0000H
	LDA	Do1020
	MOV	C,A
	ANI	10H		; 16 
	CNZ	C$0FF9
	MOV	E,C
	DAD	D
	MOV	A,M
	STA	FIGSP1		; ?

	LHLD	endX		; Ending point X
	SHLD	startX		; Starting point X

	LHLD	endY		; Ending point Y
	SHLD	startY		; Starting point Y

	POP	PSW
	POP	B
	POP	D
	POP	H
	RET
;
;--------------------------------
;
C$0FDD:	MVI	A,10H		; 16 
	CALL	Co100C
	LDA	Do1020
	ANI	02H		; 2 
	RZ
	LDA	Do1020
	ANI	0FCH
	STA	Do1020
	RET
;
;--------------------------------
;
C$0FF1:	MVI	A,14H		; 20 
	CALL	Co100C
	RET
;
;--------------------------------
;
exHLDE:	XCHG			; Exchange HL with DE...
	RET
;
;--------------------------------
;
C$0FF9:	LDA	Do1020
	ANI	03H		; 3 
	ORI	08H		; 8 
	MOV	C,A
	RET
;
;--------------------------------
;
Co1002:	PUSH	PSW
	MOV	A,L
	CMA
	MOV	L,A
	MOV	A,H
	CMA
	MOV	H,A
	INX	H
	POP	PSW
	RET
;
;--------------------------------
;
Co100C:	PUSH	H
	LXI	H,Do1020
	ORA	M
	MOV	M,A
	POP	H
	RET
;
;--------------------------------
;
?o1014:	DB	00H,00H,00H,00H
;
endX:	DW	0000H		; End X coord of line
;
endY:	DW	0000H		; End Y coord of line
;
Do101C:	DB	00H,00H		; ?
;
Do101E:	DB	00H,00H		; ?
;
Do1020:	DB	00H		; ?
;
FIGSP1:	DB	00H		; FIGS params: P1
FIGSP2:	DB	00H		; P2
FIGSP3:	DB	00H		; P3
FIGSP4:	DB	00H		; P4
	DB	00H		; P5
FIGSP6:	DB	00H		; P6
	DB	00H		; P7
FIGSP8:	DB	00H		; P8
	DB	00H		; P9
FIGSPA:	DB	00H		; P10 (PA in Hex)
	DB	00H		; P11
;
valueZ:	DB	00H		; Zoom value
;
	DB	00H		; ?
;
;--------------------------------
;
grect9:	PUSH	H
	PUSH	D
	PUSH	B
	PUSH	PSW

	CALL	Co105E
	DCX	H
	DCX	D
	SHLD	FIGSP4
	SHLD	FIGSPA
	XCHG
	SHLD	FIGSP6

	LXI	H,0003H
	SHLD	FIGSP2		; ?

	LXI	H,3FFFH
	SHLD	FIGSP8		; ?

	LDA	rectD
	ADI	02H		; 2 ???
	ANI	07H		; 7 ???
	ORI	40H
	STA	FIGSP1		; 40H = rectangle

	POP	PSW
	POP	B
	POP	D
	POP	H
	RET
;
;--------------------------------
;
Co105E:	LHLD	rectV
	XCHG
	LHLD	rectH
	LDA	rectD
	ANI	07H		; 7 
	ADI	04H		; 4 
	RET
;
;--------------------------------
;
grec31:	PUSH	H
	PUSH	D
	PUSH	B
	PUSH	PSW

	CALL	Co105E
	XCHG
	MOV	A,H
	ANI	3FH		; "?"
	MOV	H,A
	DCX	H
	SHLD	FIGSP2
	XCHG
	SHLD	FIGSP4
	SHLD	FIGSP6

	LXI	H,3FFFH
	SHLD	FIGSP8		; ?
	SHLD	FIGSPA		; ?

	LDA	rectD
	ADI	02H		; 2 
	ANI	07H		; 7 
	ORI	10H
	STA	FIGSP1		; 10H = Graphics Character

	POP	PSW
	POP	B
	POP	D
	POP	H
	RET
;
;--------------------------------
;
rectD:	DB	00H		; GRECT direction ?
;
valueD:	DB	00H,00H,00H	; GRECT direction ?
;
rectH:	DB	00H,00H,00H,00H	; GRECT Horizontal
;
rectV:	DB	00H,00H		; GRECT Vertical
;
;--------------------------------
; See CP/M sample file DUMP...
;
finis:	LHLD	oldSP		; Go back to calling routine
	SPHL
	RET
; P.S.
;      This program is so much similar to those
; published by Digital Research, that I am ready
; to bet that NCR paid DRI to program this driver.
;--------------------------------
;
oldSP:	DS	2		; Entry SP value
	DS	32		; 16 level stack
stack:				; Typical DRI code
;
;--------------------------------
;
the	END			; CP/M REL file

