dos33fsprogs/demos/mode7_demo/rasterbars.s

276 lines
5.8 KiB
ArmAsm

; 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
;===========
ELEMENTS EQU 64
NUM_ROWS EQU 20
;=====================
; Rasterbars
;=====================
;===========================
;===========================
; Main Loop
;===========================
;===========================
draw_rasters:
; clear rows
ldy #(NUM_ROWS-1) ; 2
lda #0 ; 2
init_rows:
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
ldy SCREEN_Y ; 3
lda #COLOR_BOTH_AQUA ; aqua ; 2
jsr set_row_color ; 6+136
lda #COLOR_BOTH_MEDIUMBLUE ; medium blue ; 2
jsr set_row_color ; 6+136
lda #COLOR_BOTH_LIGHTGREEN ; light green ; 2
jsr set_row_color ; 6+136
lda #COLOR_BOTH_DARKGREEN ; green ; 2
jsr set_row_color ; 6+136
lda #COLOR_BOTH_YELLOW ; yellow ; 2
jsr set_row_color ; 6+136
lda #COLOR_BOTH_ORANGE ; orange ; 2
jsr set_row_color ; 6+136
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
ldy #(NUM_ROWS-1) ; 2
draw_rows_loop:
lda row_color,Y ; 5
beq draw_rows_skip ; skip if black ; 2nt/3
sta COLOR ; 3
sty TEMPY ; 3
tya ; 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
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 ; 2nt/3
;======================
; 2+20*(53+11*40)=9862
; *note* worst case
;==================
; update y pointer
;==================
ldy SCREEN_Y ; 3
iny ; 2
cpy #ELEMENTS ; 2
bne not_there ; 2nt/3
ldy #0 ; 2
not_there:
sty SCREEN_Y ; 3
rts ; 6
;=============
; 24
;===================
;===================
; set_row_color
;===================
;===================
; color in A
; Y=offset
; Y incremented
; A, X trashed
set_row_color:
sta COLOR ; 3
tya ; wrap y offset ; 2
and #(ELEMENTS-1) ; 2
tax ; 2
lda fine_sine,X ; lookup sine value ; 4
; pre-shifted right by 4, sign-extended
; 18 added to center
sin_no_more:
pha ; save row value ; 3
jsr put_color ; put color at row ; 6+44
pla ; restore row value ; 4
clc ; increment row value ; 2
adc #1 ; 2
jsr put_color ; put color at row ; 6+44
iny ; increment for next time ; 2
rts ; 6
;============
; 132
;==================
; put_color
;==================
; A = row to set color of
; A trashed
put_color:
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 ; 2nt/3
odd_line:
lda #$f0 ; load mask for odd ; 2
bcs finish_line ; 2nt/3
even_line:
lda #$0f ; load mask for even ; 2
finish_line:
sta MASK ; 3
and COLOR ; mask off color ; 3
sta COLOR2 ; store for later ; 3
lda MASK ; 3
eor #$ff ; invert mask ; 2
and row_color,X ; load existing color ; 4
ora COLOR2 ; combine ; 3
sta row_color,X ; store back ; 5
rts ; 6
;============
; 44
;======================
; some arrays
;======================
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, 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+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 $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