From af0d298dbee2540e6ae9c66df2875047cb5c9390 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 27 Feb 2018 22:46:19 -0500 Subject: [PATCH] chiptune/mode7: update rasterbars code comments --- chiptune_player/rasterbars.s | 12 +- mode7_demo/rasterbars.s | 305 +++++++++++++++++++---------------- 2 files changed, 174 insertions(+), 143 deletions(-) diff --git a/chiptune_player/rasterbars.s b/chiptune_player/rasterbars.s index ea9d1314..a8bcf73a 100644 --- a/chiptune_player/rasterbars.s +++ b/chiptune_player/rasterbars.s @@ -66,19 +66,19 @@ init_rows: ldy SCREEN_Y ; 3 - lda #COLOR_BOTH_DARKBLUE ; red ; 2 + lda #COLOR_BOTH_DARKBLUE ; d. blue ; 2 jsr set_row_color ; 6+136 - lda #COLOR_BOTH_MEDIUMBLUE ; red ; 2 + lda #COLOR_BOTH_MEDIUMBLUE ; m.blue ; 2 jsr set_row_color ; 6+136 - lda #COLOR_BOTH_AQUA ; red ; 2 + lda #COLOR_BOTH_AQUA ; aqua ; 2 jsr set_row_color ; 6+136 - lda #COLOR_BOTH_PINK ; red ; 2 + lda #COLOR_BOTH_PINK ; pink ; 2 jsr set_row_color ; 6+136 - lda #COLOR_BOTH_RED ; red ; 2 + lda #COLOR_BOTH_RED ; red ; 2 jsr set_row_color ; 6+136 ;============== @@ -96,7 +96,7 @@ draw_rows_loop: sta COLOR ; 3 sty TEMPY ; 3 - tya ; 2 + tya ; y*2 ; 2 asl ; 2 tay ; 2 diff --git a/mode7_demo/rasterbars.s b/mode7_demo/rasterbars.s index bbab20de..aa54b821 100644 --- a/mode7_demo/rasterbars.s +++ b/mode7_demo/rasterbars.s @@ -1,5 +1,8 @@ ; Not quite a raster-bar, but why not +; Turns out this is quite the CPU hog. +; Optimized a bit based on the version in the chiptune player + ;=========== ; CONSTANTS ;=========== @@ -20,42 +23,47 @@ draw_rasters: ; clear rows - ldy #(NUM_ROWS-1) ; 2 - lda #0 ; 2 + ldy #(NUM_ROWS-1) ; 2 + lda #0 ; 2 init_rows: - sta row_color,Y ; 5 - dey ; 2 - bpl init_rows ; 2nt/3 - + sta row_color,Y ; 5 + dey ; 2 + bpl init_rows ; 2nt/3 + ;================ + ; 4+(10*20) = 204 + ; could be 82 if unroll + ; at 6*code size ;================ ; set colors - lda #COLOR_BOTH_AQUA ; aqua - ldy SCREEN_Y - jsr set_row_color + ldy SCREEN_Y ; 3 - lda #COLOR_BOTH_MEDIUMBLUE ; medium blue - jsr set_row_color + lda #COLOR_BOTH_AQUA ; aqua ; 2 + jsr set_row_color ; 6+136 - lda #COLOR_BOTH_LIGHTGREEN ; light green - jsr set_row_color + lda #COLOR_BOTH_MEDIUMBLUE ; medium blue ; 2 + jsr set_row_color ; 6+136 - lda #COLOR_BOTH_DARKGREEN ; green - jsr set_row_color + lda #COLOR_BOTH_LIGHTGREEN ; light green ; 2 + jsr set_row_color ; 6+136 - lda #COLOR_BOTH_YELLOW ; yellow - jsr set_row_color + lda #COLOR_BOTH_DARKGREEN ; green ; 2 + jsr set_row_color ; 6+136 - lda #COLOR_BOTH_ORANGE ; orange - jsr set_row_color + lda #COLOR_BOTH_YELLOW ; yellow ; 2 + jsr set_row_color ; 6+136 - lda #COLOR_BOTH_PINK ; pink - jsr set_row_color + lda #COLOR_BOTH_ORANGE ; orange ; 2 + jsr set_row_color ; 6+136 - lda #COLOR_BOTH_RED ; red - jsr set_row_color + lda #COLOR_BOTH_PINK ; pink ; 2 + jsr set_row_color ; 6+136 + lda #COLOR_BOTH_RED ; red ; 2 + jsr set_row_color ; 6+136 + ;====================== + ; 3+(8*144) = 1155 ;================= ; draw rows @@ -66,34 +74,52 @@ draw_rows_loop: sta COLOR ; 3 - + sty TEMPY ; 3 tya ; 2 - pha ; 3 - asl ; 2 + asl ; y*2 ; 2 + tay ; 2 + + ; hlin_setup inlined + + lda gr_offsets,Y ; lookup low-res memory address ; 4 + sta GBASL ; 3 + iny ; 2 + lda gr_offsets,Y ; 4 + clc ; 2 + adc DRAW_PAGE ; add in draw page offset ; 3 + sta GBASH ; 3 ldy #39 ; 2 - sty V2 ; 3 - ldy #0 ; 2 - jsr hlin_double ; hlin y,V2 at A ; 63+(X*16) - pla ; 4 - tay ; 2 + lda COLOR ; 3 +double_loop: + sta (GBASL),Y ; 6 + dey ; 2 + bpl double_loop ; 2nt/3 + + ldy TEMPY ; 3 + draw_rows_skip: dey ; 2 - bpl draw_rows_loop ; 2 + bpl draw_rows_loop ; 2nt/3 + ;====================== + ; 2+20*(53+11*40)=9862 + ; *note* worst case ;================== ; update y pointer ;================== - ldy SCREEN_Y - iny - cpy #ELEMENTS - bne not_there - ldy #0 + ldy SCREEN_Y ; 3 + iny ; 2 + cpy #ELEMENTS ; 2 + bne not_there ; 2nt/3 + ldy #0 ; 2 not_there: - sty SCREEN_Y + sty SCREEN_Y ; 3 - rts + rts ; 6 + ;============= + ; 24 ;=================== ;=================== @@ -106,62 +132,64 @@ not_there: ; A, X trashed set_row_color: - sta COLOR - tya ; wrap y offset - and #(ELEMENTS-1) - tax + sta COLOR ; 3 + tya ; wrap y offset ; 2 + and #(ELEMENTS-1) ; 2 + tax ; 2 - lda fine_sine,X ; lookup sine value + lda fine_sine,X ; lookup sine value ; 4 ; pre-shifted right by 4, sign-extended - - clc - adc #18 ; add in 18 to center on screen + ; 18 added to center sin_no_more: - pha ; save row value - jsr put_color ; put color at row - pla ; restore row value + pha ; save row value ; 3 + jsr put_color ; put color at row ; 6+44 + pla ; restore row value ; 4 - clc ; increment row value - adc #1 + clc ; increment row value ; 2 + adc #1 ; 2 - jsr put_color ; put color at row + jsr put_color ; put color at row ; 6+44 - iny ; increment for next time - - rts + iny ; increment for next time ; 2 + rts ; 6 + ;============ + ; 132 ;================== ; put_color ;================== ; A = row to set color of ; A trashed put_color: - clc - ror ; row/2, with even/odd in carry - tax ; put row/2 in X + clc ; 2 + ror ; row/2, with even/odd in carry ; 2 + tax ; put row/2 in X ; 2 - bcc even_line ; if even, skip to even + bcc even_line ; if even, skip to even ; 2nt/3 odd_line: - lda #$f0 ; load mask for odd - bcs finish_line + lda #$f0 ; load mask for odd ; 2 + bcs finish_line ; 2nt/3 even_line: - lda #$0f ; load mask for even + lda #$0f ; load mask for even ; 2 finish_line: - sta MASK + sta MASK ; 3 - and COLOR ; mask off color - sta COLOR2 ; store for later + and COLOR ; mask off color ; 3 + sta COLOR2 ; store for later ; 3 - lda MASK - eor #$ff ; invert mask - and row_color,X ; load existing color + lda MASK ; 3 + eor #$ff ; invert mask ; 2 + and row_color,X ; load existing color ; 4 - ora COLOR2 ; combine - sta row_color,X ; store back + ora COLOR2 ; combine ; 3 + sta row_color,X ; store back ; 5 - rts + rts ; 6 + + ;============ + ; 44 ;====================== ; some arrays @@ -171,74 +199,77 @@ row_color: .byte $00,$00,$00,$00,$00, $00,$00,$00,$00,$00 .byte $00,$00,$00,$00,$00, $00,$00,$00,$00,$00 -; arithmatically shifted right by 4 +; arithmatically shifted right by 4, sign extended, added 18 to center ; FIXME: exploit symmetry and get rid of 3/4 of this table ; possibly not worth the extra code fine_sine: -.byte $00 ; 0.000000 -.byte $01 ; 0.098017 -.byte $03 ; 0.195090 -.byte $04 ; 0.290285 -.byte $06 ; 0.382683 -.byte $07 ; 0.471397 -.byte $08 ; 0.555570 -.byte $0A ; 0.634393 -.byte $0B ; 0.707107 -.byte $0C ; 0.773010 -.byte $0D ; 0.831470 -.byte $0E ; 0.881921 -.byte $0E ; 0.923880 -.byte $0F ; 0.956940 -.byte $0F ; 0.980785 -.byte $0F ; 0.995185 -.byte $0F ; 1.000000 -.byte $0F ; 0.995185 -.byte $0F ; 0.980785 -.byte $0F ; 0.956940 -.byte $0E ; 0.923880 -.byte $0E ; 0.881921 -.byte $0D ; 0.831470 -.byte $0C ; 0.773010 -.byte $0B ; 0.707107 -.byte $0A ; 0.634393 -.byte $08 ; 0.555570 -.byte $07 ; 0.471397 -.byte $06 ; 0.382683 -.byte $04 ; 0.290285 -.byte $03 ; 0.195090 -.byte $01 ; 0.098017 -.byte $00 ; 0.000000 +.byte $00+18 ; 0.000000 ; a[y] 00..10 +.byte $01+18 ; 0.098017 ; a[32-y] 11..20 +.byte $03+18 ; 0.195090 ; ~a[y-33] 21..30 +.byte $04+18 ; 0.290285 ; ~a[64-y] 31..3f +.byte $06+18 ; 0.382683 +.byte $07+18 ; 0.471397 +.byte $08+18 ; 0.555570 +.byte $0A+18 ; 0.634393 +.byte $0B+18 ; 0.707107 +.byte $0C+18 ; 0.773010 +.byte $0D+18 ; 0.831470 +.byte $0E+18 ; 0.881921 +.byte $0E+18 ; 0.923880 +.byte $0F+18 ; 0.956940 +.byte $0F+18 ; 0.980785 +.byte $0F+18 ; 0.995185 -.byte $FE ; -0.098017 -.byte $FC ; -0.195090 -.byte $FB ; -0.290285 -.byte $F9 ; -0.382683 -.byte $F8 ; -0.471397 -.byte $F7 ; -0.555570 -.byte $F5 ; -0.634393 -.byte $F4 ; -0.707107 -.byte $F3 ; -0.773010 -.byte $F2 ; -0.831470 -.byte $F1 ; -0.881921 -.byte $F1 ; -0.923880 -.byte $F0 ; -0.956940 -.byte $F0 ; -0.980785 -.byte $F0 ; -0.995185 -.byte $F0 ; -1.000000 -.byte $F0 ; -0.995185 -.byte $F0 ; -0.980785 -.byte $F0 ; -0.956940 -.byte $F1 ; -0.923880 -.byte $F1 ; -0.881921 -.byte $F2 ; -0.831470 -.byte $F3 ; -0.773010 -.byte $F4 ; -0.707107 -.byte $F5 ; -0.634393 -.byte $F7 ; -0.555570 -.byte $F8 ; -0.471397 -.byte $F9 ; -0.382683 -.byte $FB ; -0.290285 -.byte $FC ; -0.195090 -.byte $FE ; -0.098017 +.byte $0F+18 ; 1.000000 + +.byte $0F+18 ; 0.995185 +.byte $0F+18 ; 0.980785 +.byte $0F+18 ; 0.956940 +.byte $0E+18 ; 0.923880 +.byte $0E+18 ; 0.881921 +.byte $0D+18 ; 0.831470 +.byte $0C+18 ; 0.773010 +.byte $0B+18 ; 0.707107 +.byte $0A+18 ; 0.634393 +.byte $08+18 ; 0.555570 +.byte $07+18 ; 0.471397 +.byte $06+18 ; 0.382683 +.byte $04+18 ; 0.290285 +.byte $03+18 ; 0.195090 +.byte $01+18 ; 0.098017 + +.byte $00+18 ; 0.000000 +.byte ($FE+18)&$ff ; -0.098017 +.byte ($FC+18)&$ff ; -0.195090 +.byte ($FB+18)&$ff ; -0.290285 +.byte ($F9+18)&$ff ; -0.382683 +.byte ($F8+18)&$ff ; -0.471397 +.byte ($F7+18)&$ff ; -0.555570 +.byte ($F5+18)&$ff ; -0.634393 +.byte ($F4+18)&$ff ; -0.707107 +.byte ($F3+18)&$ff ; -0.773010 +.byte ($F2+18)&$ff ; -0.831470 +.byte ($F1+18)&$ff ; -0.881921 +.byte ($F1+18)&$ff ; -0.923880 +.byte ($F0+18)&$ff ; -0.956940 +.byte ($F0+18)&$ff ; -0.980785 +.byte ($F0+18)&$ff ; -0.995185 + +.byte ($F0+18)&$ff ; -1.000000 +.byte ($F0+18)&$ff ; -0.995185 +.byte ($F0+18)&$ff ; -0.980785 +.byte ($F0+18)&$ff ; -0.956940 +.byte ($F1+18)&$ff ; -0.923880 +.byte ($F1+18)&$ff ; -0.881921 +.byte ($F2+18)&$ff ; -0.831470 +.byte ($F3+18)&$ff ; -0.773010 +.byte ($F4+18)&$ff ; -0.707107 +.byte ($F5+18)&$ff ; -0.634393 +.byte ($F7+18)&$ff ; -0.555570 +.byte ($F8+18)&$ff ; -0.471397 +.byte ($F9+18)&$ff ; -0.382683 +.byte ($FB+18)&$ff ; -0.290285 +.byte ($FC+18)&$ff ; -0.195090 +.byte ($FE+18)&$ff ; -0.098017