dos33fsprogs/demos/lores_escape/appleII_intro.s

453 lines
7.6 KiB
ArmAsm

; Display a 40x96 lo-res image
; by deater (Vince Weaver) <vince@deater.net>
appleII_intro:
;===================
; init screen
; jsr TEXT
; jsr HOME
; bit KEYRESET
;===================
; init vars
lda #0
sta DRAW_PAGE
sta DUDE_X
sta FOREVER_OFFSET
;=============================
; Load graphic page0
lda #<appleII_low
sta GBASL
lda #>appleII_low
sta GBASH
lda #$c
jsr load_rle_gr
;=============================
; Load graphic page1
lda #<appleII_high
sta GBASL
lda #>appleII_high
sta GBASH
lda #$10
jsr load_rle_gr
; GR part
bit PAGE0
; jsr wait_until_keypressed
;==============================
; setup graphics for vapor lock
;==============================
jsr vapor_lock ; 6+
; vapor lock returns with us at beginning of hsync in line
; 114 (7410 cycles), so with 5070 lines to go to vblank
; 5070+17030+4550=26650
; GR part
bit LORES ; 4
bit SET_GR ; 4
bit FULLGR ; 4
lda #0 ; 2
sta DRAW_PAGE ; 3
jsr gr_clear_all ; 6+ 5454
lda #4 ; 2
sta DRAW_PAGE ; 3
jsr gr_clear_all ; 6+ 5454
; 26650
; -12 GR init
; -5465 clear page0
; -5465 clear page1
;==========
; 15708
; Try X=29 Y=104 cycles=15705R3
lda TEMP
ldy #104 ; 2
loopA: ldx #29 ; 2
loopB: dex ; 2
bne loopB ; 2nt/3
dey ; 2
bne loopA ; 2nt/3
; jmp display_loop ; 3
;.align $100
;================================================
; Display Loop
;================================================
; each scan line 65 cycles
; 1 cycle each byte (40cycles) + 25 for horizontal
; Total of 12480 cycles to draw screen
; Vertical blank = 4550 cycles (70 scan lines)
; Total of 17030 cycles to get back to where was
; We want to alternate between page1 and page2 every 65 cycles
; vblank = 4550 cycles to do scrolling
; 2 + 48*( (4+2+25*(2+3)) + (4+2+23*(2+3)+4+5)) + 9)
; 48*[(6+125)-1] + [(6+115+10)-1]
display_loop:
ldy #48 ; 2
outer_loop:
bit PAGE1 ; 4
ldx #25 ; 130 cycles with PAGE0 ; 2
page0_loop: ; delay 126+bit
dex ; 2
bne page0_loop ; 2/3
bit PAGE0 ; 4
ldx #23 ; 130 cycles with PAGE1 ; 2
page1_loop: ; delay 115+(7 loop)+4 (bit)+4(extra)
dex ; 2
bne page1_loop ; 2/3
nop ; 2
lda DRAW_PAGE ; 3
dey ; 2
bne outer_loop ; 2/3
;======================================================
; We have 4550 cycles in the vblank, use them wisely
;======================================================
; do_nothing should be:
; 4550
; +1 (fallthrough)
; -2 initial conditions
; -1174
; -7 (keypress)
; -3 (jump)
; -1243 (play_music)
; =====
; 2122 2179
jsr do_nothing ; 6
;========================
; Add 8 to wipe_right
; Add 12 to wipe_left
; Add 16 to forever
; Add 15 to donothing
ldx DUDE_X ; 3
cpx #40 ; 2
bcc wipe_right ; blt ; 3
; -1
cpx #80 ; 2
bcc wipe_left ; blt ; 3
; -1
cpx #192 ; 2
bcc forever ; blt ; 3
; -1
;=========================
; hold steady
done_done:
; -1
;===========================
; delay 1174-15-3=1156
; delay
; Try X=45 Y=5 cycles=1156
ldy #5 ; 2
loop11: ldx #45 ; 2
loop21: dex ; 2
bne loop21 ; 2nt/3
dey ; 2
bne loop11 ; 2nt/3
jmp intro_wipe_done ; 3
;=====================
;=====================
; wipe right
;=====================
;=====================
; 24*(30+18)-1 +5+3 = 1159
; 1174-1159-8=7
; page0 -- copy from $c00
wipe_right:
nop ; 2
nop ; 2
lda WASTE_CYCLES ; 3
;=====
; 7
page0_loopy:
lda gr_offsets,Y ; 4+
sta page0_store_smc+1 ; 4
sta page0_load_smc+1 ; 4
lda gr_offsets+1,Y ; 4+
clc ; 2
adc #$4 ; 2
sta page0_store_smc+2 ; 4
adc #$8 ; 2
sta page0_load_smc+2 ; 4
;=====
; 30
page0_load_smc:
lda $1000,X ; 4+
page0_store_smc:
sta $1000,X ; 5
iny ; 2
iny ; 2
cpy #48 ; 2
bne page0_loopy ; 3
;================
; 18
; -1
inc DUDE_X ; 5
jmp intro_wipe_done ; 3
;=====================
;=====================
; wipe left
;=====================
;=====================
; 11+ 24*(28+18)-1 +5+3 = 1170
; 1174-1122-12=40
; page0 -- copy from $c00
wipe_left:
inc WASTE_CYCLES ; 5
inc WASTE_CYCLES ; 5
inc WASTE_CYCLES ; 5
inc WASTE_CYCLES ; 5
inc WASTE_CYCLES ; 5
inc WASTE_CYCLES ; 5
inc WASTE_CYCLES ; 5
inc WASTE_CYCLES ; 5
; 40 -> 79 map to 39->0 = 39 - (X-40) = 79-X
lda #79 ; 2
sec ; 2
sbc DUDE_X ; 3
tax ; 2
ldy #0 ; 2
;=====
; 11
page1_loopy:
lda gr_offsets,Y ; 4+
sta page1_store_smc+1 ; 4
sta page1_load_smc+1 ; 4
lda gr_offsets+1,Y ; 4+
clc ; 2
sta page1_store_smc+2 ; 4
adc #$8 ; 2
sta page1_load_smc+2 ; 4
;=====
; 28
page1_load_smc:
lda $1000,X ; 4+
page1_store_smc:
sta $1000,X ; 5
iny ; 2
iny ; 2
cpy #48 ; 2
bne page1_loopy ; 3
;================
; 18
; -1
inc DUDE_X ; 5
jmp intro_wipe_done ; 3
;=========================
; FOREVER
;==========================
; F@80, 11,32
; O@96
; R@112
; E@128
; V@144
; E@160
; R@176
forever:
; -1
;===========================
; forever:
; 1174 base
; -16 previous if/else
; -7 check
; -18 new_forever
; -38 colors
; -14 putchar prep
; -365 putchar
; -8 end
;=====================
; 708
txa ; 2
and #$f ; 2
beq new_forever ; 3
; -1
nop ; 2
nop ; 2
nop ; 2
nop ; 2
nop ; 2
nop ; 2
nop ; 2
nop ; 2
jmp write_forever ; 3
new_forever:
inc forever_string_smc+1 ; 6
lda forever_x_smc+1 ; 4
clc ; 2
adc #4 ; 2
sta forever_x_smc+1 ; 4
;=======
; 18
write_forever:
txa ; 2
and #$0c ; 2
tax ; 2
lda colors_first,X ; 4+
sta colors_hi ; 4
lda colors_first+1,X ; 4+
sta colors_hi+1 ; 4
lda colors_first+2,X ; 4+
sta colors_hi+2 ; 4
lda colors_first+3,X ; 4+
sta colors_hi+3 ; 4
;======
; 38
; Colors
; 0 0 0 4
; 0 0 4 C
; 0 4 C F
forever_string_smc:
lda forever_string ; 4+
forever_x_smc:
ldx #7 ; 2
ldy #32 ; 2
jsr put_char ; 6+365
;=======
; delay
; Try X=19 Y=7 cycles=708
ldy #7 ; 2
loop19: ldx #19 ; 2
loop29: dex ; 2
bne loop29 ; 2nt/3
dey ; 2
bne loop19 ; 2nt/3
inc DUDE_X ; 5
jmp intro_wipe_done ; 3
;==========================
;==========================
intro_wipe_done:
lda FRAME_PLAY_PAGE ; 3
cmp #2 ; 2
beq appleii_done ; 3
; -1
; lda KEYPRESS ; 4
; bpl no_keypress2 ; 3
; jmp appleii_done
no_keypress2:
jsr play_frame_compressed ; 6+1237
jmp display_loop ; 3
appleii_done:
rts
;.align $100
;=================================
; do nothing
;=================================
; and take 2122-12 = 2110 cycles to do it
do_nothing:
; Try X=21 Y=19 cycles=2110
ldy #19 ; 2
loop1: ldx #21 ; 2
loop2: dex ; 2
bne loop2 ; 2nt/3
dey ; 2
bne loop1 ; 2nt/3
rts ; 6
do_nothing_end:
forever_string:
.byte ' ','F','O','R','E','V','E','R'
colors_first: .byte $00,$00,$00,$00
colors_second: .byte $00,$04,$40,$00
colors_third: .byte $40,$4C,$C4,$04
colors_fourth: .byte $C4,$CF,$FC,$4C
.if 0
colors_first: .byte $00,$00,$00,$00
colors_second: .byte $00,$40,$04,$00
colors_third: .byte $04,$C4,$4C,$40
colors_fourth: .byte $4C,$FC,$CF,$C4
.endif
.assert >do_nothing = >do_nothing_end, error, "do_nothing crosses page"