dos33fsprogs/demosplash/appleII_intro.s

448 lines
7.1 KiB
ArmAsm
Raw Normal View History

2019-09-04 19:46:10 +00:00
; 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
2019-10-12 17:51:02 +00:00
sta DUDE_X
2019-10-13 00:57:36 +00:00
sta FOREVER_OFFSET
2019-09-04 19:46:10 +00:00
;=============================
; Load graphic page0
lda #<appleII_low
sta GBASL
lda #>appleII_low
sta GBASH
lda #$c
jsr load_rle_gr
2019-10-12 14:47:38 +00:00
; lda #$4
; sta DRAW_PAGE
2019-09-04 19:46:10 +00:00
2019-10-12 14:47:38 +00:00
; jsr gr_copy_to_current ; copy to page1
2019-09-04 19:46:10 +00:00
; GR part
2019-10-12 14:47:38 +00:00
; bit PAGE1
; bit LORES ; 4
; bit SET_GR ; 4
; bit FULLGR ; 4
2019-09-04 19:46:10 +00:00
2019-10-12 14:47:38 +00:00
; jsr wait_until_keypressed
2019-09-04 19:46:10 +00:00
;=============================
; Load graphic page1
lda #<appleII_high
sta GBASL
lda #>appleII_high
sta GBASH
2019-10-12 14:47:38 +00:00
lda #$10
2019-09-04 19:46:10 +00:00
jsr load_rle_gr
2019-10-12 14:47:38 +00:00
; lda #$0
; sta DRAW_PAGE
2019-09-04 19:46:10 +00:00
2019-10-12 14:47:38 +00:00
; jsr gr_copy_to_current
2019-09-04 19:46:10 +00:00
; GR part
bit PAGE0
2019-10-12 14:47:38 +00:00
; jsr wait_until_keypressed
2019-09-04 19:46:10 +00:00
;==============================
; setup graphics for vapor lock
;==============================
jsr vapor_lock ; 6+
; vapor lock returns with us at beginning of hsync in line
2019-10-12 17:51:02 +00:00
; 114 (7410 cycles), so with 5070 lines to go to vblank
2019-09-04 19:46:10 +00:00
2019-10-12 17:51:02 +00:00
; 5070+17030+4550=26650
2019-10-12 14:47:38 +00:00
2019-09-04 19:46:10 +00:00
; GR part
bit LORES ; 4
bit SET_GR ; 4
bit FULLGR ; 4
2019-10-12 14:47:38 +00:00
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
2019-09-04 19:46:10 +00:00
2019-10-12 17:51:02 +00:00
; 26650
2019-10-12 14:47:38 +00:00
; -12
; -5465
; -5465
; -3 (jmp)
;==========
2019-10-12 17:51:02 +00:00
; 15705
; FIXME: delay extra 33?
; have no idea why this is needed
lda DRAW_PAGE
lda DRAW_PAGE
lda DRAW_PAGE
lda DRAW_PAGE
lda DRAW_PAGE
lda DRAW_PAGE
lda DRAW_PAGE
lda DRAW_PAGE
lda DRAW_PAGE
lda DRAW_PAGE
lda DRAW_PAGE
; Try X=29 Y=104 cycles=15705
ldy #104 ; 2
loopA: ldx #29 ; 2
2019-09-04 19:46:10 +00:00
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 PAGE0 ; 4
ldx #25 ; 130 cycles with PAGE0 ; 2
page0_loop: ; delay 126+bit
dex ; 2
bne page0_loop ; 2/3
bit PAGE1 ; 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
;======================================================
2019-10-12 22:11:32 +00:00
; do_nothing should be:
2019-10-12 14:47:38 +00:00
; 4550
; +1 (fallthrough)
; -2 initial conditions
2019-10-12 22:11:32 +00:00
; -1174
2019-10-12 14:47:38 +00:00
; -7 (keypress)
; -3 (jump)
; =====
2019-10-12 22:11:32 +00:00
; 3365
2019-09-04 19:46:10 +00:00
jsr do_nothing ; 6
2019-10-12 22:11:32 +00:00
;========================
; Add 8 to wipe_right
; Add 12 to wipe_left
; Add 16 to forever
; Add 15 to donothing
2019-10-12 17:51:02 +00:00
ldx DUDE_X ; 3
cpx #40 ; 2
2019-10-12 22:11:32 +00:00
bcc wipe_right ; blt ; 3
; -1
cpx #80 ; 2
bcc wipe_left ; blt ; 3
; -1
2019-10-12 23:44:07 +00:00
cpx #192 ; 2
2019-10-12 22:11:32 +00:00
bcc forever ; blt ; 3
; -1
;=========================
; hold steady
2019-10-12 17:51:02 +00:00
done_done:
2019-10-12 22:11:32 +00:00
; -1
2019-10-12 17:51:02 +00:00
;===========================
2019-10-12 23:44:07 +00:00
; delay 1174-15-3=1156
2019-10-12 17:51:02 +00:00
; delay
2019-10-12 23:44:07 +00:00
; Try X=45 Y=5 cycles=1156
2019-10-12 17:51:02 +00:00
2019-10-12 23:44:07 +00:00
ldy #5 ; 2
loop11: ldx #45 ; 2
2019-10-12 17:51:02 +00:00
loop21: dex ; 2
bne loop21 ; 2nt/3
dey ; 2
bne loop11 ; 2nt/3
jmp intro_wipe_done ; 3
2019-10-12 22:11:32 +00:00
;=========================
; FOREVER
2019-10-12 23:00:55 +00:00
;==========================
2019-10-12 23:44:07 +00:00
; F@80, 11,32
; O@96
2019-10-12 23:00:55 +00:00
; R@112
2019-10-12 23:44:07 +00:00
; E@128
; V@144
; E@160
; R@176
2019-10-12 22:11:32 +00:00
forever:
; -1
;===========================
2019-10-12 23:44:07 +00:00
; forever:
; 1174 base
; -16 previous if/else
; -7 check
2019-10-13 00:57:36 +00:00
; -18 new_forever
; -14 putchar prep
2019-10-12 23:44:07 +00:00
; -365 putchar
; -8 end
;=====================
2019-10-13 00:57:36 +00:00
; 746
2019-10-12 23:44:07 +00:00
txa ; 2
and #$f ; 2
beq new_forever ; 3
2019-10-12 22:11:32 +00:00
2019-10-12 23:44:07 +00:00
; -1
2019-10-13 00:57:36 +00:00
nop ; 2
nop ; 2
nop ; 2
nop ; 2
nop ; 2
nop ; 2
nop ; 2
nop ; 2
2019-10-12 23:44:07 +00:00
jmp write_forever ; 3
new_forever:
2019-10-13 00:57:36 +00:00
inc forever_string_smc+1 ; 6
2019-10-12 23:44:07 +00:00
lda forever_x_smc+1 ; 4
clc ; 2
adc #4 ; 2
sta forever_x_smc+1 ; 4
;=======
2019-10-13 00:57:36 +00:00
; 18
2019-10-12 23:44:07 +00:00
write_forever:
2019-10-13 00:57:36 +00:00
forever_string_smc:
lda forever_string ; 4+
2019-10-12 23:44:07 +00:00
forever_x_smc:
ldx #7 ; 2
2019-10-12 23:00:55 +00:00
ldy #32 ; 2
2019-10-12 22:11:32 +00:00
2019-10-12 23:00:55 +00:00
jsr put_char ; 6+365
2019-10-12 22:11:32 +00:00
2019-10-12 23:44:07 +00:00
;=======
2019-10-12 22:11:32 +00:00
; delay
2019-10-13 00:57:36 +00:00
; Try X=147 Y=1 cycles=742R4
nop
nop
2019-10-12 22:11:32 +00:00
2019-10-13 00:57:36 +00:00
ldy #1 ; 2
loop19: ldx #147 ; 2
2019-10-12 22:11:32 +00:00
loop29: dex ; 2
bne loop29 ; 2nt/3
dey ; 2
bne loop19 ; 2nt/3
2019-10-12 23:44:07 +00:00
inc DUDE_X ; 5
jmp intro_wipe_done ; 3
2019-10-12 22:11:32 +00:00
2019-10-12 17:51:02 +00:00
;=====================
2019-10-12 14:47:38 +00:00
;=====================
2019-10-12 17:51:02 +00:00
; wipe right
2019-10-12 14:47:38 +00:00
;=====================
2019-10-12 17:51:02 +00:00
;=====================
2019-10-12 22:11:32 +00:00
; 24*(30+18)-1 +5+3 = 1159
; 1174-1159-8=7
2019-10-12 14:47:38 +00:00
; page0 -- copy from $c00
2019-10-12 17:51:02 +00:00
wipe_right:
2019-10-12 22:11:32 +00:00
nop ; 2
nop ; 2
lda DUDE_X ; 3
2019-10-12 14:47:38 +00:00
;=====
2019-10-12 22:11:32 +00:00
; 7
2019-10-12 14:47:38 +00:00
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
2019-10-12 22:11:32 +00:00
adc #$8 ; 2
2019-10-12 14:47:38 +00:00
sta page0_load_smc+2 ; 4
;=====
; 30
page0_load_smc:
lda $1000,X ; 4+
page0_store_smc:
sta $1000,X ; 5
iny ; 2
2019-10-12 17:51:02 +00:00
iny ; 2
cpy #48 ; 2
2019-10-12 14:47:38 +00:00
bne page0_loopy ; 3
;================
2019-10-12 17:51:02 +00:00
; 18
2019-10-12 14:47:38 +00:00
; -1
2019-10-12 17:51:02 +00:00
inc DUDE_X ; 5
jmp intro_wipe_done ; 3
2019-10-12 22:11:32 +00:00
;=====================
;=====================
; 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
2019-10-12 14:47:38 +00:00
;==========================
;==========================
2019-10-12 17:51:02 +00:00
intro_wipe_done:
2019-09-04 19:46:10 +00:00
lda KEYPRESS ; 4
2019-10-02 04:03:00 +00:00
bpl no_keypress2 ; 3
2019-09-04 19:46:10 +00:00
jmp appleii_done
2019-10-02 04:03:00 +00:00
no_keypress2:
2019-09-04 19:46:10 +00:00
jmp display_loop ; 3
appleii_done:
rts
;=================================
; do nothing
;=================================
2019-10-12 22:11:32 +00:00
; and take 3365-12 = 3353 cycles to do it
2019-09-04 19:46:10 +00:00
do_nothing:
2019-10-12 22:11:32 +00:00
; Try X=6 Y=93 cycles=3349R4
2019-09-04 19:46:10 +00:00
2019-10-12 22:11:32 +00:00
nop
2019-10-12 17:51:02 +00:00
nop
2019-09-04 19:46:10 +00:00
2019-10-12 22:11:32 +00:00
ldy #93 ; 2
loop1: ldx #6 ; 2
2019-10-12 14:47:38 +00:00
loop2: dex ; 2
2019-09-04 19:46:10 +00:00
bne loop2 ; 2nt/3
dey ; 2
bne loop1 ; 2nt/3
2019-10-12 14:47:38 +00:00
rts ; 6
2019-09-04 19:46:10 +00:00
2019-10-13 00:57:36 +00:00
forever_string:
.byte ' ','F','O','R','E','V','E','R'