From c71c75c16257b933abd745b3eff58b8debfc4f96 Mon Sep 17 00:00:00 2001
From: "ol.sc" 
Date: Fri, 8 Jan 2010 22:45:59 +0000
Subject: [PATCH] - Added ioctl for mixing graphics with 4 lines of text. -
 Preserve drawing color during CLEAR.
git-svn-id: svn://svn.cc65.org/cc65/trunk@4545 b7a2c559-68d2-44c3-8de9-860c34a00d81
---
 libsrc/apple2/apple2-40-48-16.s | 74 +++++++++++++++++++++++++++++----
 1 file changed, 65 insertions(+), 9 deletions(-)
diff --git a/libsrc/apple2/apple2-40-48-16.s b/libsrc/apple2/apple2-40-48-16.s
index f1c0d576b..b3d319861 100644
--- a/libsrc/apple2/apple2-40-48-16.s
+++ b/libsrc/apple2/apple2-40-48-16.s
@@ -17,13 +17,14 @@
 ; Zero page stuff
 
 H2	:=	$2C
+COLOR	:=	$30
 
 ; ROM entry points
 
 TEXT    :=	$F399
 PLOT	:=	$F800
 HLINE	:=	$F819
-CLRSCR	:=	$F832
+CLRSC2	:=	$F838
 SETCOL	:=	$F864
 SCRN	:=	$F871
 SETGR	:=	$FB40
@@ -62,8 +63,8 @@ NX	:=	regsave+2 	; (2)	LINE
 
 	.byte	$74, $67, $69	; "tgi"
 	.byte	TGI_API_VERSION	; TGI API version number
-xres:	.word	40		; X resolution
-yres:	.word	48		; Y resolution
+	.word	40		; X resolution
+	.word	48		; Y resolution
 	.byte	16		; Number of drawing colors
 	.byte	1		; Number of screens available
 	.byte	8		; System font X size
@@ -101,14 +102,12 @@ yres:	.word	48		; Y resolution
 ; Absolute variables used in the code
 
 ERROR:	.res	1		; Error code
+MIX:	.res	1		; 4 lines of text
 
-; Line routine stuff (combined with circle routine stuff to save space)
+; Line routine stuff
 
-OGora:
 COUNT:	.res	2
-OUkos:
 NY:	.res	2
-Y3:
 DX:	.res	1
 DY:	.res	1
 AX:	.res	1
@@ -123,6 +122,8 @@ AY:	.res	1
 DEFPALETTE: .byte $00, $01, $02, $03, $04, $05, $06, $07
 	    .byte $08, $09, $0A, $0B, $0C, $0D, $0E, $0F
 
+MAXY:	.byte 47, 39
+
 ; ------------------------------------------------------------------------
 
 	.code
@@ -146,6 +147,7 @@ INIT:
 	; Done, reset the error code
 	lda	#TGI_ERR_OK
 	sta	ERROR
+	sta	MIX
 
 	; Fall through
 
@@ -209,7 +211,13 @@ GETERROR:
 ; Must set an error code: NO
 CLEAR:
 	bit	$C082		; Switch in ROM
-	jsr	CLRSCR
+	lda	COLOR		; Save current drawing color
+	pha
+	ldx	MIX
+	ldy	MAXY,x		; Max Y depends on 4 lines of text
+	jsr	CLRSC2
+	pla
+	sta	COLOR		; Save current drawing color
 	bit	$C080		; Switch in LC bank 2 for R/O
 	rts
 
@@ -225,7 +233,55 @@ SETCOLOR:
 ; CONTROL: Platform/driver specific entry point.
 ; Must set an error code: YES
 CONTROL:
-	; Fall through
+	; Check data msb and code to be 0
+	ora	ptr1+1
+	bne	err
+
+	; Check data lsb to be [0..1]
+	lda	ptr1
+	cmp	#1+1
+	bcs	err
+	bit	$C082		; Switch in ROM
+
+	; Switch 4 lines of text
+	tax
+	.assert MIXCLR + 1 = MIXSET, error
+	lda	MIXCLR,x	; No BIT absolute,X available
+
+	; Save current switch setting
+	txa
+	sta	MIX
+	bne	text
+
+	; Clear 8 lines of graphics
+	lda	COLOR		; Save current drawing color
+	pha
+	lda	#39		; Rightmost column
+	sta	H2
+	ldx	#40		; First line
+:	txa
+	ldy	#$00		; Leftmost column
+	sty	COLOR		; Black
+	jsr	HLINE		; Preserves X
+	inx
+	cpx	#47+1		; Last line
+	bcc	:-
+	pla
+	sta	COLOR		; Save current drawing color
+	bcs	:+		; Branch always
+
+	; Clear 4 lines of text
+text:	jsr	HOME
+:	bit	$C080		; Switch in LC bank 2 for R/O
+
+	; Done, reset the error code
+	lda	#TGI_ERR_OK
+	beq	:+		; Branch always
+	
+	; Done, set the error code
+err:	lda	#TGI_ERR_INV_ARG
+:	sta	ERROR
+	rts
 
 ; SETPALETTE: Set the palette (not available with all drivers/hardware).
 ; A pointer to the palette is passed in ptr1. Must set an error if palettes
-- 
2.39.5