; testing mid-screen mode switching in a small number of bytes on Apple IIe
; originally intended for AppleII Twitter bot, but its emulator didn't
;	support mid-screen mode switching

; by Vince `deater` Weaver

; zero page
GBASL	= $26
GBASH	= $27
V2	= $2D
MASK	= $2E
COLOR	= $30
;CTEMP	= $68
YY	= $69

FRAME	= $FC
SUM	= $FD
SAVEX	= $FE
SAVEY	= $FF

; soft-switches
SET_GR	= $C050
SET_TEXT= $C051
FULLGR	= $C052
TEXTGR	= $C053
PAGE1	= $C054
LORES	= $C056
HIRES	= $C057
VBLANK	= $C019		; *not* RDVBL (VBL signal low)

; ROM routines
SETCOL  = $F864		;; COLOR=A*17
SETGR	= $FB40
VLINE	= $F828			;; VLINE A,$2D at Y
HGR	= $F3E2
HPLOT0  = $F457		; plot at (Y,X), (A)
HGLIN	= $F53A		; line to (X,A),(Y)

	;================================
	; Clear screen and setup graphics
	;================================
split:

	jsr	SETGR		; set lo-res 40x40 mode

	;===================
	; draw lo-res lines

	ldx	#39
draw_lores_lines:
	txa
	tay
	jsr	SETCOL

	lda	#47
	sta	V2
	lda	#0
	jsr	VLINE	; VLINE A,$2D at Y

	dex
	bpl	draw_lores_lines

	;===================
	; draw hi-res lines

	jsr	HGR
	bit	FULLGR		; make it 40x48


	ldx	#0
	ldy	#0
	lda	#96
	jsr	HPLOT0		; plot at (Y,X), (A)

	ldx	#0
	lda	#140
	ldy	#191
	jsr	HGLIN		; line to (X,A),(Y)

	ldx	#1
	lda	#23
	ldy	#96
	jsr	HGLIN		; line to (X,A),(Y)


	; wait for vblank on IIe
	; positive? during vblank

wait_vblank_iie:
	lda	VBLANK
	bmi	wait_vblank_iie		; wait for positive (in vblank)
wait_vblank_done_iie:
	lda	VBLANK			; wait for negative (vlank done)
	bpl	wait_vblank_done_iie

	;
split_loop:
	;===========================
	; text mode first 6*8 (48) lines
	;	each line 65 cycles (25 hblank+40 bytes)

	bit	LORES		; 4
	bit	SET_TEXT	; 4

	; wait 6*8=48 lines
	; (48*65)-8 = 3120-8 = 3112

	jsr	delay_3112

	; lores next 6 lines

	bit	LORES		; 4
	bit	SET_GR		; 4

	jsr	delay_3112

	; hi-res for last 96 lines + horizontal blank
	; vblank = 4550 cycles

	; (96*65)+4550-7 = 6240+4550-7 = 10783

	bit	HIRES		; 4

	; Try X=38 Y=55 cycles=10781

	nop

        ldy     #55                                                     ; 2
loop3:  ldx     #38                                                      ; 2
loop4:  dex                                                             ; 2
        bne     loop4                                                   ; 2nt/3
        dey                                                             ; 2
        bne     loop3                                                   ; 2nt/3



	jmp	split_loop	; 3


	; actually want 3112-12 (6 each for jsr/rts)
	; 3100
	; Try X=6 Y=86 cycles=3097
delay_3112:

	lda	$0		; 3-cycle nop

        ldy     #86                                                     ; 2
loop1:  ldx     #6                                                      ; 2
loop2:  dex                                                             ; 2
        bne     loop2                                                   ; 2nt/3
        dey                                                             ; 2
        bne     loop1                                                   ; 2nt/3

	rts

	; to run on bot, want this to be at $3F5
	; so load at $384

	jmp	split