diff --git a/games/sb/hgr_vscroll.s b/games/sb/hgr_vscroll.s index 21b59253..5d7ba8b0 100644 --- a/games/sb/hgr_vscroll.s +++ b/games/sb/hgr_vscroll.s @@ -12,7 +12,7 @@ hgr_vscroll: stx SCROLL ; SCROLL = 0 ; 3 vscroll_loop: - +.if 0 ; for x=0 to SCROLL ; write 40 bytes of 00 @@ -45,52 +45,56 @@ vscroll_line: ; assume SCROLL=96 ; 96*(14+443+7)-1 ; +.endif + ; Original = 66629 + ; optimize = 58564 + ;==================== ; draw bottom part lda #0 ; 2 sta SCROLL_OFFSET ; 3 + ldx SCROLL ; 3 vscroll_bottom: - stx XSAVE ; 3 - ldx SCROLL_OFFSET ; 3 - lda hposn_high,X ; 4 - clc ; 2 - adc #$80 ; ora instead? ; 2 - sta INH ; 3 - lda hposn_low,X ; 4 - sta INL ; 3 + ldy SCROLL_OFFSET ; 3 + lda hposn_high,Y ; 4 + ora #$80 ; $20->$A0 ; 2 + sta vscroll_in_smc+2 ; INH ; 4 + lda hposn_low,Y ; 4 + sta vscroll_in_smc+1 ; INL ; 4 ;==== - ; 24 + ; 21 inc SCROLL_OFFSET ; 5 - ldx XSAVE ; 3 - lda hposn_high,X ; 4 - sta OUTH ; 3 + sta vscroll_out_smc+2 ; OUTH ; 4 lda hposn_low,X ; 4 - sta OUTL ; 3 + sta vscroll_out_smc+1 ; OUTL ; 4 ;==== - ; 22 + ; 21 ldy #39 ; 2 vscroll_bottom_line: - lda (INL),Y ; 5 - sta (OUTL),Y ; 6 + +vscroll_in_smc: + lda $A000,Y ; 4 +vscroll_out_smc: + sta $2000,Y ; 5 dey ; 2 bpl vscroll_bottom_line ; 2/3 ;===== - ; 2+40*(16)-1 - ; 641 + ; 2+40*(14)-1 + ; 561 inx ; 2 cpx #192 ; 2 bne vscroll_bottom ; 2/3 ;========== - ;5+96*(46+641+7)-1 - ; 66629 + ;5+96*(42+561+7)-1 + ; 58564 ;===================== ; scroll whole screen diff --git a/games/sb/hgr_vscroll_slow.s b/games/sb/hgr_vscroll_slow.s new file mode 100644 index 00000000..21b59253 --- /dev/null +++ b/games/sb/hgr_vscroll_slow.s @@ -0,0 +1,101 @@ + ;================================ + ; HGR vscroll + ;================================ + ; image to scroll in is in $A000 + ; + ; At SCROLL=96 timing = 44,543 + 66,629 = 111,172 cycles + ; = approx 9 frames/second so 21s to scroll screen + +hgr_vscroll: + + ldx #191 ; 2 + stx SCROLL ; SCROLL = 0 ; 3 + +vscroll_loop: + + ; for x=0 to SCROLL + ; write 40 bytes of 00 + + ldx #0 ; 2 +vscroll_inner: + lda hposn_high,X ; 4 + sta OUTH ; 3 + lda hposn_low,X ; 4 + sta OUTL ; 3 + ;==== + ; 14 + + ldy #39 ; 2 + lda #0 ; 2 + ;=== + ; 4 +vscroll_line: + sta (OUTL),Y ; 6 + dey ; 2 + bpl vscroll_line ; 2/3 + ;===== + ; 4+(40*11)-1 + ; 443 + + inx ; 2 + cpx SCROLL ; 2 + bne vscroll_inner ; 2/3 + + ;=============== + ; assume SCROLL=96 + ; 96*(14+443+7)-1 + ; + + ;==================== + ; draw bottom part + + lda #0 ; 2 + sta SCROLL_OFFSET ; 3 +vscroll_bottom: + stx XSAVE ; 3 + + ldx SCROLL_OFFSET ; 3 + lda hposn_high,X ; 4 + clc ; 2 + adc #$80 ; ora instead? ; 2 + sta INH ; 3 + lda hposn_low,X ; 4 + sta INL ; 3 + ;==== + ; 24 + + inc SCROLL_OFFSET ; 5 + + ldx XSAVE ; 3 + + lda hposn_high,X ; 4 + sta OUTH ; 3 + lda hposn_low,X ; 4 + sta OUTL ; 3 + ;==== + ; 22 + + ldy #39 ; 2 +vscroll_bottom_line: + lda (INL),Y ; 5 + sta (OUTL),Y ; 6 + dey ; 2 + bpl vscroll_bottom_line ; 2/3 + ;===== + ; 2+40*(16)-1 + ; 641 + + inx ; 2 + cpx #192 ; 2 + bne vscroll_bottom ; 2/3 + ;========== + ;5+96*(46+641+7)-1 + ; 66629 + + ;===================== + ; scroll whole screen + + dec SCROLL + bne vscroll_loop + + rts