Core updates for BG1 scanline support

This commit is contained in:
Lucas Scharenbroich 2023-03-11 03:41:41 -06:00
parent d31bd30649
commit 065603a758

View File

@ -307,6 +307,7 @@ _ApplyScanlineBG1YPos
:shift_value equ tmp5 :shift_value equ tmp5
; Avoid local var collision ; Avoid local var collision
:ptr2 equ tmp8
:ytbl_idx_pos_x2 equ tmp10 :ytbl_idx_pos_x2 equ tmp10
:virt_line_pos_x2 equ tmp11 :virt_line_pos_x2 equ tmp11
:total_left_x2 equ tmp12 :total_left_x2 equ tmp12
@ -317,7 +318,12 @@ _ApplyScanlineBG1YPos
sta :ptr sta :ptr
lda StartXMod164Tbl+2 lda StartXMod164Tbl+2
sta :ptr+2 sta :ptr+2
ora :ptr
lda BG1StartXMod164Tbl
sta :ptr2
lda BG1StartXMod164Tbl+2
sta :ptr2+2
ora :ptr2
lda BG1StartY lda BG1StartY
jsr Mod208 jsr Mod208
@ -387,22 +393,11 @@ _ApplyScanlineBG1YPos
cmp #164+1 cmp #164+1
bcc *+5 bcc *+5
sbc #164 sbc #164
sta :shift_value ; Base shift value
; sec cmp #165
; sbc BG1StartXMod164 bcc *+4
; bpl *+6 brk $04
; clc
; adc #164
; cmp #164
; bcc *+3
; sbc #164
; clc
; adc :shift_value
sta :shift_value
; cmp #160
; beq *+4
; brk $55
phb ; Save the existing bank phb ; Save the existing bank
tsc tsc
@ -428,9 +423,9 @@ _ApplyScanlineBG1YPos
tax tax
lda :ytbl_idx_x2 ; Read from this location in the BG1YTable lda :ytbl_idx_x2 ; Read from this location in the BG1YTable
clc ; clc
CopyBG1YTableToBG1Addr3 :shift_value ; CopyBG1YTableToBG1Addr3 :shift_value
; jsr CopyBG1YTableToBG1Addr CopyBG1YTableToBG1Addr4 :shift_value;blttmp
lda :virt_line_x2 ; advance to the virtual line after lda :virt_line_x2 ; advance to the virtual line after
adc :draw_count_x2 ; filled in adc :draw_count_x2 ; filled in
@ -704,8 +699,43 @@ x01 ldal BG1YTable+00,x
sta: BG1_ADDR+$0000,y sta: BG1_ADDR+$0000,y
none <<< none <<<
; Copy routine to move BG1YTable entries into BG1_ADDR position with an additional
; shift on every line form the user-provided BG1StartXMod164Tbl.
;
; A = index into the BG1YTable array (x2)
; Y = starting line * $1000
; X = number of lines (x2)
;
; ]1 = constant shift value
; ]2 = temp storage space
CopyBG1YTableToBG1Addr4 mac
phy ; save the registers
phx
phb
pha
jsr _SetDataBank ; Set to toolbox data bank
clc
lda 1,s ; virtual_index_x2
adc BG1StartXMod164Tbl ; Get the starting address in the array for this chunk
tay
lda BG1StartXMod164Tbl+1 ; Set the bank to the array location
pha
plb
plb
pla ; POp back the original value
ApplyBG1ModXToShift ]1;]2 ; Copy the array into direct page storage and apply the shift
plb ; Restore the code field bank
plx ; x is used directly in this routine
ply
ApplyBG1ShiftToCode ]2
<<<
; Unrolled copy routine to move BG1YTable entries into BG1_ADDR position with an additional ; Unrolled copy routine to move BG1YTable entries into BG1_ADDR position with an additional
; shifton every line. This has to be split into two ; shift on every line. This has to be split into two
; ;
; A = index into the BG1YTable array (x2) ; A = index into the BG1YTable array (x2)
; Y = starting line * $1000 ; Y = starting line * $1000
@ -855,3 +885,105 @@ ApplyBG1OffsetValues
:do01 ldal BG1YCache+00 :do01 ldal BG1YCache+00
sta: BG1_ADDR+$0000,y sta: BG1_ADDR+$0000,y
:none rts :none rts
; Apply the per-scanline shift from the BG1StartXMod164Tbl pointer. Save the relevant values to the
; direct page since the array could be in any bank.
;
; This does bounds checking to make sure the shift value remains in the valid range
;
; ]1 = source array offset
; ]2 = constant shift value
; ]3 = destination address
_BG1ShiftTemplate mac
lda ]1,y ; Load the value from the array
adc ]2 ; Add to the direct page shift_value
cmp #165 ; If below this value, we're good
bcc *+6
sbc #164
clc
adcl BG1YTable+]1,x
sta ]3+]1
<<<
AToX mac
tax
brl ]1
<<<
ApplyBG1ModXToShift mac
jmp (agmxts_tbl,x)
agmxts_tbl da none
da do01,do02,do03,do04
da do05,do06,do07,do08
da do09,do10,do11,do12
da do13,do14,do15,do16
do16 AToX o16
do15 AToX o15
do14 AToX o14
do13 AToX o13
do12 AToX o12
do11 AToX o11
do10 AToX o10
do09 AToX o09
do08 AToX o08
do07 AToX o07
do06 AToX o06
do05 AToX o05
do04 AToX o04
do03 AToX o03
do02 AToX o02
do01 AToX o01
o16 _BG1ShiftTemplate 30;]1;]2
o15 _BG1ShiftTemplate 28;]1;]2
o14 _BG1ShiftTemplate 26;]1;]2
o13 _BG1ShiftTemplate 24;]1;]2
o12 _BG1ShiftTemplate 22;]1;]2
o11 _BG1ShiftTemplate 20;]1;]2
o10 _BG1ShiftTemplate 18;]1;]2
o09 _BG1ShiftTemplate 16;]1;]2
o08 _BG1ShiftTemplate 14;]1;]2
o07 _BG1ShiftTemplate 12;]1;]2
o06 _BG1ShiftTemplate 10;]1;]2
o05 _BG1ShiftTemplate 8;]1;]2
o04 _BG1ShiftTemplate 6;]1;]2
o03 _BG1ShiftTemplate 4;]1;]2
o02 _BG1ShiftTemplate 2;]1;]2
o01 _BG1ShiftTemplate 0;]1;]2
none <<<
; After the values are saved, the data bank can be repointed at the current code bank and the values copied in
; from the direct page
;
; ]1 = offset in temp buffer
; ]2 = address of temp buffer
; ]3 = 4k offset in code buffer
_BG1ShiftToCodeTemplate mac
lda ]2+]1
sta: BG1_ADDR+]3,y
<<<
ApplyBG1ShiftToCode mac
jmp (abstc_tbl,x)
abstc_tbl da none
da do01,do02,do03,do04
da do05,do06,do07,do08
da do09,do10,do11,do12
da do13,do14,do15,do16
do16 _BG1ShiftToCodeTemplate 30;]1;$F000
do15 _BG1ShiftToCodeTemplate 28;]1;$E000
do14 _BG1ShiftToCodeTemplate 26;]1;$D000
do13 _BG1ShiftToCodeTemplate 24;]1;$C000
do12 _BG1ShiftToCodeTemplate 22;]1;$B000
do11 _BG1ShiftToCodeTemplate 20;]1;$A000
do10 _BG1ShiftToCodeTemplate 18;]1;$9000
do09 _BG1ShiftToCodeTemplate 16;]1;$8000
do08 _BG1ShiftToCodeTemplate 14;]1;$7000
do07 _BG1ShiftToCodeTemplate 12;]1;$6000
do06 _BG1ShiftToCodeTemplate 10;]1;$5000
do05 _BG1ShiftToCodeTemplate 8;]1;$4000
do04 _BG1ShiftToCodeTemplate 6;]1;$3000
do03 _BG1ShiftToCodeTemplate 4;]1;$2000
do02 _BG1ShiftToCodeTemplate 2;]1;$1000
do01 _BG1ShiftToCodeTemplate 0;]1;$0000
none <<<