
HGR_SHAPE =	$1A
HGR_SHAPE_H =	$1B
HGR_BITS =	$1C
HGR_COUNT =	$1D

HMASK	=	$30

DSCTMP	=	$9D

HGR_DX	=	$D0
HGR_DX_H =	$D1
HGR_DY	=	$D2
HGR_QUADRANT =	$D3
HGR_E	=	$D4
HGR_E_H	=	$D5
HGR_X	=	$E0
HGR_X_H	=	$E1
HGR_Y	=	$E2
;HGR_COLOR =	$E4
HGR_HORIZ =	$E5
HGR_PAGE =	$E6


TXTCLR	=	$C050
MIXSET	=	$C053
LOWSCR	=	$C054
MIXCLR	=	$C052
HISCR	=	$C055


;.align	$100

.assert >hgr = >hgr_after, error, "hgr crosses page"

	;==========================
	; HGR
	;==========================
hgr:
	; F3E2
	lda	#$20		; HIRES Page 1 at $2000
	bit	LOWSCR		; BIT SW.LOWSCR Use PAGE1 ($C054)
;	bit	MIXSET		;  BIT SW.MIXSET (Mixed text)
sethpg:
	; F3EA
	sta	HGR_PAGE
;	lda	HIRES
;	lda	TXTCLR
hclr:
	lda	#0			; black background
	sta	HGR_BITS
bkgnd:
	; F3F6
	lda	HGR_PAGE
	sta	HGR_SHAPE+1
	ldy	#0
	sty	HGR_SHAPE
bkgnd_loop:
	lda	HGR_BITS

	sta	(HGR_SHAPE),y

	jsr	color_shift

	iny
	bne	bkgnd_loop

	inc	HGR_SHAPE+1
	lda	HGR_SHAPE+1
	and	#$1f			; see if $40 or $60
	bne	bkgnd_loop
	rts
hgr_after:


.assert >msktbl = >msktbl_after, error, "msktbl crosses page"

msktbl:	.byte $81,$82,$84,$88,$90,$A0,$C0	; original
msktbl_after:

.align $100


.assert >hposn = >hposn_after, error, "hposn crosses page"

	;====================================================
	; HPOSN
	;	time = 9 + 61 + 31 + 22 + 42 + 22 + 23 = 210

hposn:
	; F411: move values into expected zp locations
	sta	HGR_Y							; 3
	stx	HGR_X							; 3
	sty	HGR_X+1							; 3
								;===========
								;         9

	; calc y-position addr.  no lookup table?
	pha								; 3
	and	#$C0							; 2
	sta	GBASL							; 3
	lsr								; 2
	lsr								; 2
	ora	GBASL							; 3
	sta	GBASL							; 3
	pla								; 4
	sta	GBASH							; 3
	asl								; 2
	asl								; 2
	asl								; 2
	rol	GBASH							; 5
	asl								; 2
	rol	GBASH							; 5
	asl								; 2
	ror	GBASL							; 5
	lda	GBASH							; 3
	and	#$1f							; 2
	ora	HGR_PAGE						; 3
	sta	GBASH							; 3
								;============
								;	 61
	; F438
	; divide/mod 16-bit x poisition by 7
	; incoming, X=(y,x)
	; outgoing y=q, a=r

	; Divide by 7 (From December '84 Apple Assembly Line)

	txa								; 2
	clc								; 2
	sta	HGR_HORIZ						; 3
	lsr								; 2
	lsr								; 2
	lsr								; 2
	adc	HGR_HORIZ						; 3
	ror								; 2
	lsr								; 2
	lsr								; 2
	adc	HGR_HORIZ						; 3
	ror								; 2
	lsr								; 2
	lsr								; 2
	; x/7 is in A
								;============
								;	 31
	; calculate remainder
	clc								; 2
	sta	HGR_HORIZ						; 3
	asl								; 2
	adc	HGR_HORIZ						; 3
	asl								; 2
	adc	HGR_HORIZ						; 3
	; HGR_HORIZ=x/7, A=HGR_HORIZ*7
	; calculate remainder by X-(Q*7)
	sec								; 2
	eor	#$ff							; 2
	adc	HGR_X							; 3
	; A = remainder						;===========
								;	 22
;============================================================================

	cpy	#0							; 2
	beq	done_mod_nop_23						; 3
								;==========
								;	  5
theres_high:
									; -1
	clc								; 2
	adc	#4		; make remainder match			; 2
	pha								; 3
	lda	HGR_HORIZ						; 3
	adc	#36							; 2
	sta	HGR_HORIZ						; 3
	pla								; 4

	cmp	#7							; 2
	bcc	done_mod_nop14	; blt					; 3
								;============
								;	 23


									; -1
	sec								; 2
	sbc	#7							; 2
	inc	HGR_HORIZ						; 5
	ldy	HGR_HORIZ	; nop					; 3
	jmp	done_mod						; 3
								;============
								;	14
				;===========================
				; Y=HIGH,bcc = 5+23+ 14 = 42
				; Y=HIGH,bcs = 5+23+ 14 = 42
				; Y=LOW = 5 + 14+23 = 42

done_mod_nop_23:
	inc	HGR_HORIZ,X		; (nop)				; 6
	dec	HGR_HORIZ,X		; (nop)				; 6
	ldy	HGR_HORIZ		; (nop)				; 3
	ldy	HGR_HORIZ		; (nop)				; 3
	ldy	HGR_HORIZ		; (nop)				; 3
	nop								; 2
done_mod_nop14:
	inc	HGR_HORIZ,X		; (nop)				; 6
	dec	HGR_HORIZ,X		; (nop)				; 6
	nop								; 2

done_mod:
	ldy	HGR_HORIZ						; 3
	tax								; 2
	lda	msktbl,x						; 4+

	sta	HMASK							; 3
	tya								; 2
	lsr								; 2
	lda	HGR_COLOR						; 3
	sta	HGR_BITS						; 3
								;===========
								;	 22

	bcs	color_shift						; 3
				; cs = 3+20
									;-1

				; need 23 = 2+6+X = 15
	inc	HMASK,X		; nop					; 6
	dec	HMASK,X		; nop					; 6
	lda	HMASK		; nop					; 3


	rts								; 6
								;===========
								;	 23


	;===================================
	; COLOR_SHIFT
	;===================================
	;	positive = 7+(7)+6 = 20
	;	negative = 7+ 7 +6 = 20

color_shift:				; F47E
	asl								; 2
	cmp	#$c0							; 2

	bpl	done_color_shift					; 3
									; -1
	lda	HGR_BITS						; 3
	eor	#$7f							; 2
	sta	HGR_BITS						; 3
	rts								; 6
done_color_shift:
	lda	HGR_BITS	; nop					; 3
	nop								; 2
	nop								; 2
	rts								; 6

hposn_after:

;.align $100

.assert >hplot0 = >hplot0_after, error, "hplot0 crosses page"

	;=====================================
	; HPLOT0
	;=====================================
	; point in (YX),A
	; 244 cycles
hplot0:
	; F457
	jsr	hposn							; 6+210
	lda	HGR_BITS						; 3
	eor	(GBASL),y						; 5+
	and	HMASK							; 3
	eor	(GBASL),y						; 5+
	sta	(GBASL),y						; 6
	rts								; 6
								;============
								;	 244



hplot0_after:

.assert >hcolor_equals = >hcolor_equals_after, error, "hce crosses page"

	;=============================
	; HCOLOR_EQUALS
	;=============================
	; Color in X
	; 13 cycles
hcolor_equals:

	; F6E9
	; TODO: mask to be less than 8

	lda	colortbl,x						; 4+
	sta	HGR_COLOR						; 3
	rts								; 6

colortbl:
	.byte	$00,$2A,$55,$7F,$80,$AA,$D5,$FF

hcolor_equals_after:
