dos33fsprogs/demos/lores_escape/create_update_type1.s

228 lines
4.4 KiB
ArmAsm

; Autogenerates code that does interleaved Page0/Page1 lores mode
; but leaving room for 14 pixels/line of per-scanline color
; originally 183,589
; takes roughly 17 + 192*((49*16)+2+46) + 15 = 159,776!!!!
; want to play sound every 15787 cycles (10.1)
; so every 19 times through loop
; 11 times should update???
UPDATE_START = $9800
DEFAULT_COLOR = $0
create_update_type1:
ldx #192 ; 2
lda #<UPDATE_START ; 2
sta OUTL ; 3
lda #>UPDATE_START ; 2
sta OUTH ; 3
lda #19 ; 2
sta FORCE_MUSIC ; 3
;===========
; 17
create_update_outer_loop:
ldy #48 ; 2
create_update_inner_loop:
lda one_scanline,Y ; 4+
sta (OUTL),Y ; 6
dey ; 2
bpl create_update_inner_loop ; 3
;============
; 16
; -1
; toggle PAGE0/PAGE1
txa ; 2
and #$1 ; ror? ; 2
clc ; 2
adc #$54 ; 2
ldy #1 ; 2
sta (OUTL),Y ; 6
clc ; 2
lda #49 ; 2
adc OUTL ; 3
sta OUTL ; 3
lda OUTH ; 3
adc #0 ; 2
sta OUTH ; 3
dec FORCE_MUSIC ; 5
bne no_force_music ; 3
lda #19
sta FORCE_MUSIC
txa
pha
jsr play_frame_compressed
pla
tax
no_force_music:
dex ; 2
bne create_update_outer_loop ; 3
;===========
; 46
; -1
ldy #0 ; 2
lda #$60 ; 2
sta (OUTL),Y ; 6
rts ; 6
;=============
; 15
BARS_START = 46
;============================
; setup rasterbars
;===========================
; from 40 to 168?
;
; 22+ NUM*(7+14*(66)+32+11) +5
; NUM=128 -> 123,286 /15787 = 8 ... every 16 times
; NUM=32 -> 30,838 / 15787 = 2
;
; original:
; setup_rasterbars_page_smc=4
; setup_rasterbars_offset_smc=13
; setup_rasterbars_bars_start_smc=46
; setup_rasterbars_bars_end_smc=184
; setup_rasterbars_start_addr1_smc:=#<(UPDATE_START+(BARS_START*49))
; setup_rasterbars_start_addr2_smc:=#<(UPDATE_START+(BARS_START*49))
; missing:
; setup_rasterbars_page_smc=4
; setup_rasterbars_offset_smc=2
; setup_rasterbars_bars_start_smc=16
; setup_rasterbars_bars_end_smc=48
; setup_rasterbars_start_addr1_smc:=#<(UPDATE_START+(16*49))
; setup_rasterbars_start_addr2_smc:=#<(UPDATE_START+(16*49))
setup_rasterbars:
setup_rasterbars_page_smc:
lda #4 ; which page ; 2
sta RASTER_PAGE ; 3
setup_rasterbars_bars_start_smc:
ldx #BARS_START ; 2
setup_rasterbars_start_addr1_smc:
lda #<(UPDATE_START+(BARS_START*49)) ; 2
sta OUTL ; 3
setup_rasterbars_start_addr2_smc:
lda #>(UPDATE_START+(BARS_START*49)) ; 2
sta OUTH ; 3
lda #0 ; 2
sta FORCE_MUSIC ; 3
;===========
; 22
setup_rasterbars_outer_loop:
ldy #6 ; 2
setup_rasterbars_offset_smc:
lda #13 ; 2
sta RASTER_X ; 3
;===========
; 7
setup_rasterbars_inner_loop:
txa ; 2
pha ; 3
inx ; 2
txa ; start one earlier ; 2
lsr ; 2
lsr ; 2
and #$fe ; 2
tax ; 2
clc ; 2
lda gr_offsets,X ; 4+
adc RASTER_X ; 3
inc RASTER_X ; 3
sta (OUTL),Y ; 6
iny ; 2
clc ; 2
lda gr_offsets+1,X ; 4
adc RASTER_PAGE ; 2
sta (OUTL),Y ; 6
iny ; 2
iny ; 2
pla ; 4
tax ; 2
cpy #48 ; 2
bne setup_rasterbars_inner_loop ; 3
;============
; 66
;-1
inc FORCE_MUSIC ; 6
and #$f ; 2
bne no_music_this_time ; 3
;===========
; 11
txa
pha
jsr play_frame_compressed
pla
tax
no_music_this_time:
clc ; 2
lda #49 ; 2
adc OUTL ; 3
sta OUTL ; 3
lda OUTH ; 3
adc #0 ; 2
sta OUTH ; 3
lda RASTER_PAGE ; 3
eor #$04 ; 2
sta RASTER_PAGE ; 3
inx ; 2
setup_rasterbars_bars_end_smc:
cpx #184 ; 2
bne setup_rasterbars_outer_loop ; 3
;============
; 32
rts ; -1
; 6
one_scanline:
.byte $2C,$54,$C0 ; bit PAGE0 ; 4
.byte $A9,DEFAULT_COLOR ; lda #$0b ; 2
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $8D,$00,$02 ; sta $200 ; 4
.byte $A5,$FA ; lda TEMP ; 3