;	Sudoku Character Generator 2.0
;
	org	61008
	sta	xchar	;X offset
	sta	xchar1
	ret
	sta	ychar	;Y offset
	sta	ychar1
	ret
	sta	val	;Value
	lda	xchar
	mov	d,a
	lda	ychar
	adi	3
	mov	e,a
	push	de
	lda	val
	sbi	0AH
	jm	Min0	;Not minus
	sta	val
	call	744CH	;Plot
	pop	de
	inr	d
	call	744CH	;Plot
	jmp	Number
Min0	call	744DH	;Unplot
	pop	de
	inr	d
	call	744DH	;Unplot
Number	lda	xchar1
	adi	3
	sta	xchar
	lda	ychar1
	sta	ychar
	lda	val
	ora	a
	jz	Addr2
	mov	b,a	;Find value in Digit table
	mvi	a,0
Addr1	adi	3	;Fields 3 bytes long
	dcr	b
	jnz	Addr1
Addr2	mvi	b,0
	mov	c,a
	lxi	h,digits
	dad	bc	;HL=digit posn
	mvi	a,0
	sta	pmode
	mvi	b,4	;4 pixels wide
	mvi	a,6	;6 pixels high
	sta 	pixhi
	call	Rotat
	ret		;To Basic
Rotat	mov	c,a
	mvi	d,8	;8 bits/byte
	mov	a,m	;1st graphic byte
	sta	bits
Rotat1	lda	pmode	;0=unplot 0 & plot1
	ora	a	;1=unplot 1's ignore 0's
	jnz	PM12	;2=plot 1's ignore 0's
	lda	bits
	ana	a
	ral
	sta	bits	;Keep rest of graphic byte
	push	af
	push	bc
	push	de
	push	hl
	lda	xchar	;Setup for unplot/plot
	mov	d,a
	lda	ychar
	mov	e,a
	jnc	Unplot
	jmp	Plot
PM12	lda	bits
	ana	a
	ral
	sta	bits	;Keep rest of digit byte
	jnc	End1	;Ignore 0's
	push	af
	push	bc
	push	de
	push	hl
	lda	xchar	;Setup for unplot/plot
	mov	d,a
	lda	ychar
	mov	e,a
	lda	pmode
	cpi	2
	jnz	Unplot
Plot	call	744CH	;Plot
	jmp	Endplot
Unplot	call	744DH	;Unplot
Endplot	pop	hl
	pop	de
	pop	bc
	pop	af
End1	dcr	c	;Pixels high -1
	jz	Botrow	;Bottom pixels
	lda	ychar	;Next pixel posn
	inr	a
	sta	ychar
Nextpx	dcr	d
	jz	Nextby	;Graphic byte finised
	jmp	Rotat1
Nextby	mvi	d,8
	inx	h
	mov	a,m
	sta	bits
	jmp	Rotat1	;Got next graphic byte
Botrow	dcr	b	;Last pixel?
	mov	a,b
	ora	a
	jnz	Botro2
	ret
Botro2	lda	xchar	;Next pixel column
	inr	a
	sta	xchar
	lda	ychar1
	sta	ychar
	lda	pixhi
	mov	c,a
	jmp	Nextpx
;
; Flashing cursor & keystroke input
;
Cbeep	adi	7	;Cursor start pixel
	sta	curx	;X offset
	mvi	a,1	;Do beep-man
	sta	beep
	ret
Cursor	adi	7	;Cursor start pixel
	sta	curx	;X offset
	ret
	sta	cury	;Y offset
	shld	hlbuf	;Return variable
	mov	a,m	;Value
	sta	val
	di
	lxi	h,inton ;Intercept Int 7.5
	lxi	d,F5FFH
	mvi	b,3
	call	2542H	;Block move
	ei
Cur1	mvi	a,1	;Set underline
	sta	curs
Cur2	call 	Disp
	lda	beep
	ora	a
	jz	Cur6
	lda	curs
	ora	a
	jnz	Lman1
	mvi	a,1
	sta	pmode
	call 	Lman
	mvi	a,2
	sta	pmode
	call	Uman
	jmp	Cur6
Lman1	mvi	a,1
	sta	pmode
	call	Uman
	mvi	a,2
	sta	pmode
	call	Lman
Cur6	lda	curs
	ora	a
	jnz	Cur6a
	lda	val	;No poss=0
	cpi	1	;Poss=1
	jnz	Cur6a
	di
	lxi	h,intoff ;Restore Int 7.5
	lxi	d,f5ffh
	mvi	b,3
	call	2542h
	ei
	mvi	a,1
	ret	
	
Cur6a	mvi	a,125	;Reset cursor delay
	sta	curcnt
Cur6b	call	7242h	;Scan keyboard
	ora	a
	jnz	Cur5	;Key pressed
	lda	curcnt	;Check delay
	ora	a
	jp	Cur6b
	lda	curs
	ora	a
	jnz	Cur4	;Is cursor inverse?
	jmp	Cur1	;Not, invert
Cur4	mvi	a,0
	sta	curs	;Cursor clear
	jmp	Cur2
Cur5	sta	inp	;Input char
	di
	lxi	h,intoff ;Restore Int 7.5
	lxi	d,f5ffh
	mvi	b,3
	call	2542h
	ei
	mvi	a,0	;Clear cursor
	sta 	curs
	call	Disp
	lda	beep
	ora	a
	jz	Cur7
	mvi	a,1
	sta	pmode
	call	Lman
	call	Uman
	mvi	a,0
	sta	beep
Cur7	lda	inp
	lhld	hlbuf
	mov	m,a
	ret		;To Basic
Disp	mvi	c,6
	lda	curx
	mov	d,a
	lda	cury
	mov	e,a
Disp1	push	de
	push	bc
	lda	curs
	ora	a
	jnz	Disp2
	call	744DH	;Unplot
	jmp	Disp3
Disp2	call	744CH	;Plot
Disp3	pop	bc
	pop	de
	dcr	c
	rz
	inr	e
	jmp	Disp1
Int	push	hl	;Int 7.5 intercept
	push	psw
	lxi	hl,curcnt
	dcr	m
	pop	psw
	pop	hl
	ret
;
; Sudoku Title
;
Sud1	mvi	a,176	;X offset
	sta	xchar
	mvi	a,5	;Y offset
	sta 	ychar
	sta	ychar1
	mvi	a,2
	sta	pmode
	mvi	b,64	;64 pixels wide
	mvi	a,13	;13 pixels high
	sta	pixhi
	lxi	h,sudoku
	call	rotat
	ret
Lman	mvi	a,200	;X offset
	sta	xchar
	mvi	a,47	;Y offset
	sta 	ychar
	sta	ychar1
	mvi	b,10	;10 pixels wide
	mvi	a,17	;17 pixels high
	sta	pixhi
	lxi	h,lowman
	call	rotat
	ret
Uman	mvi	a,200	;X offset
	sta	xchar
	mvi	a,40	;Y offset
	sta 	ychar
	sta	ychar1
	mvi	b,12	;12 pixels wide
	mvi	a,16	;16 pixels high
	sta	pixhi
	lxi	h,upman
	call	rotat
	ret
;
;	WIN routine ver 1.0
; by Philip Avery, July 2005
; Assembly language version of CIRCLE.BA (Club100 Graphics programs) to produce Smiley faces.
;
START	STA 	XOFF	;X offset
	MVI	A,FFH
	STA	CLS
	LDA	XOFF
	ORA	A
	JNZ	START1	;Reset LH face
	MVI	A,0	;Reset RH face
	STA	XTEMP
	MVI	A,160
	STA	XOFF
	JMP	START2
START1	MVI	A,160
	STA	XTEMP
	MVI	A,0
	STA	XOFF
START2	MVI	A,3
	STA	COUNT
	LXI	H,VARS
START3	LDA	XOFF
	ADD	M
	STA	XC	;Add X offset
	INX	H
	MOV	A,M
	STA	YC
	INX	H
	MOV	A,M
	STA	R
	STA	XX
	INX	H
	MOV	A,M
	STA	YY
	INX	H
	MOV	A,M
	STA	R1
	INX	H
	PUSH	H
FIRST	LDA	COUNT
	ORA	A
	JZ	SECOND
	LDA	XX
	LXI	H,XC
	ADD	M
	MOV	D,A
	LDA	YY
	LXI	H,YC
	ADD	M
	MOV	E,A
	CALL	PLOTP
SECOND	LDA	XC
	LXI	H,YY
	ADD	M
	MOV	D,A
	LDA	YC
	LXI	H,XX
	ADD	M
	MOV	E,A
	CALL	PLOTP
THIRD	LDA	XC
	LXI	H,YY
	SUB	M
	MOV	D,A
	LDA	YC
	LXI	H,XX
	ADD	M
	MOV	E,A
	CALL	PLOTP
	LDA	COUNT
	ORA	A
	JZ	FINISH	;Mouth
FOURTH	LDA	XC
	LXI	H,XX
	SUB	M
	MOV	D,A
	LDA	YC
	LXI	H,YY
	ADD	M
	MOV	E,A
	CALL	PLOTP
FIFTH	LDA	XC
	LXI	H,XX
	SUB	M
	MOV	D,A
	LDA	YC
	LXI	H,YY
	SUB	M
	MOV	E,A
	CALL	PLOTP
SIXTH	LDA	XC
	LXI	H,YY
	SUB	M
	MOV	D,A
	LDA	YC
	LXI	H,XX
	SUB	M
	MOV	E,A
	CALL	PLOTP
SEVENTH	LDA	XC
	LXI	H,YY
	ADD	M
	MOV	D,A
	LDA	YC
	LXI	H,XX
	SUB	M
	MOV	E,A
	CALL	PLOTP
EIGHTH	LDA	XC
	LXI	H,XX
	ADD	M
	MOV	D,A
	LDA	YC
	LXI	H,YY
	SUB	M
	MOV	E,A
	CALL	PLOTP
FINISH	LDA	YY
	LXI	H,XX
	CMP	M
	JP	NEXTCIR
	LXI	H,YY	;Next coordinate
	INR	M
	LDA	R1
	SUB	M
	STA	R1
	JP	FIRST
	LXI	H,XX
	DCR	M
	LDA	R1
	ADD	M
	STA	R1
	JMP	FIRST
NEXTCIR	POP	H	;Next VARS
	LDA	COUNT
	ORA	A
	JNZ	NEXTC2
XSMILE	LXI	H,SMILE
	MVI	C,6	;No. of Dimple pixels
XSMIL1	LDA	XOFF
	ADD	M
	MOV	D,A
	INX	H
	MOV	E,M
	INX	H
	PUSH	BC
	PUSH	H
	CALL	PLOTP
	POP	H
	POP	BC
	DCR	C
	MOV	A,C
	ORA	A
	JNZ	XSMIL1
	LDA	CLS
	ORA	A
	JNZ	NEXTC1
	RET		;BASIC
NEXTC1	MVI	A,0
	STA	CLS
	LDA	XTEMP
	STA	XOFF
	JMP	START2
NEXTC2	DCR	A
	STA	COUNT
	JMP	START3
PLOTP	LDA	CLS
	ORA	A
	JNZ	PLOTP1
	CALL	744CH	;Set pixel
	RET
PLOTP1	CALL	744DH	;Reset pixel
	RET
;
VARS	DB	40,27,25,0,12	;Face
	DB	28,20,2,0,1	;LH Eye
	DB	52,20,2,0,1	;RH Eye
	DB	40,28,16,0,8	;Smile
;
SMILE	DB	27,39,28,38,29,37
	DB	51,37,52,38,53,39
COUNT	DB	0	;No of Circles-1
CLS	DB	0
XC	DB	0
YC	DB	0
R	DB	0
XX	DB	0
YY	DB	0
R1	DB	0
XOFF	DB	0
XTEMP	DB	0
;
beep	db	0
bits	db	0
curcnt	db	0
curs	db	0
curx	db	0
cury	db	0
hlbuf	db	0,0
inp	db	0
inton	db	C3H,4AH,F0H
intoff	db	C9H,0,0
pixhi	db	0
pmode	db	0
val	db	0
xchar	db	0
xchar1	db	0
ychar	db	0
ychar1	db	0
;
digits	db	00H,80H,00H	;0
	db	01H,1FH,C1H	;1
	db	4EH,5AH,51H	;2
	db	4AH,1AH,56H	;3
	db	31H,4FH,C4H	;4
	db	E6H,9AH,66H	;5
	db	39H,59H,42H	;6
	db	82H,3BH,30H	;7
	db	5AH,9AH,56H	;8
	db	42H,9AH,9CH	;9
;
sudoku	db	FEH,1CH,10H,60H,83H
	db	04H,18H,20H,C1H,06H
	db	0FH,F8H,7FH,00H,00H
	db	00H	;S
	db	3FH,FEH,07H,F0H,00H
	db	80H,04H,00H,20H,01H
	db	00H,08H,00H,7FH,FEH
	db	00H,00H,00H	;U
	db	7FH,FEH,0FH,F0H,01H
	db	80H,0CH,00H,60H,03H
	db	00H,18H,00H,FFH,FCH
	db	00H,00H,00H	;D
	db	FFH,FCH,00H,60H,03H
	db	00H,18H,00H,C0H,06H
	db	00H,30H,01H,80H,0FH
	db	FFH,C0H,00H,00H	;O
	db	0FH,FFH,81H,FCH,08H
	db	00H,40H,02H,00H,10H
	db	3FH,80H,04H,00H,3FH
	db	80H,00H,00H	;K
	db	1FH,FFH,03H,F8H,00H
	db	40H,02H,00H,10H,00H
	db	80H,04H,00H,3FH,FFH ;U
;
lowman	db	00H,20H,80H,21H,CCH,21H
	db	09H,21H,0AH,7FH,05H,3FH
	db	81H,24H,20H,61H,08H,00H
	db	43H,80H,10H,40H
;
upman	db	10H,02H,08H,01H,04H,02H
	db	32H,04H,4AH,08H,A7H,F0H
	db	A7H,F0H,4AH,08H,32H,04H
	db	04H,02H,08H,01H,10H,02H
	end