mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-07-13 22:29:14 +00:00
need to change a bunch to make this work Now load at $4000 as was too big to fit between $1000 and $2000 also turns out our lz4 code was writing past the end, which you notice when you have important code right after the end of HGR1
400 lines
7.4 KiB
ArmAsm
400 lines
7.4 KiB
ArmAsm
; Display fancy Fireworks
|
|
|
|
; HGR plus 40x48d page1/page2 every-1-scanline pageflip mode
|
|
|
|
; Zero Page
|
|
FRAMEBUFFER = $00 ; $00 - $0F
|
|
;YPOS = $10
|
|
FRAME = $60
|
|
WAITING = $62
|
|
LETTERL = $63
|
|
LETTERH = $64
|
|
LETTERX = $65
|
|
LETTERY = $66
|
|
LETTERD = $67
|
|
LETTER = $68
|
|
BLARGH = $69
|
|
HGR_COLOR = $E4
|
|
STATE = $ED
|
|
;DRAW_PAGE = $EE
|
|
LASTKEY = $F1
|
|
PADDLE_STATUS = $F2
|
|
|
|
|
|
;==================================
|
|
;==================================
|
|
fireworks:
|
|
|
|
|
|
setup_background:
|
|
|
|
;===================
|
|
; init screen
|
|
jsr TEXT
|
|
jsr HOME
|
|
jsr hgr
|
|
bit KEYRESET
|
|
|
|
;gom:
|
|
; jmp gom
|
|
|
|
|
|
;===================
|
|
; init vars
|
|
|
|
lda #0
|
|
sta DRAW_PAGE
|
|
sta STATE
|
|
sta WAITING
|
|
init_letters:
|
|
lda #<letters
|
|
sta LETTERL
|
|
lda #>letters
|
|
sta LETTERH
|
|
lda #39
|
|
sta LETTERX
|
|
lda #22
|
|
sta LETTERY
|
|
lda #25
|
|
sta LETTERD
|
|
|
|
|
|
|
|
;=============================
|
|
; Load graphic page0
|
|
|
|
lda #$0c
|
|
sta BASH
|
|
lda #$00
|
|
sta BASL ; load image to $c00
|
|
|
|
lda #<bg_final_low
|
|
sta GBASL
|
|
lda #>bg_final_low
|
|
sta GBASH
|
|
jsr load_rle_gr
|
|
|
|
lda #4
|
|
sta DRAW_PAGE
|
|
|
|
jsr gr_copy_to_current ; copy to page1
|
|
|
|
; GR part
|
|
bit PAGE1
|
|
bit LORES ; 4
|
|
bit SET_GR ; 4
|
|
bit FULLGR ; 4
|
|
|
|
; jsr wait_until_keypressed
|
|
|
|
|
|
;=============================
|
|
; Load graphic page1
|
|
|
|
lda #$0c
|
|
sta BASH
|
|
lda #$00
|
|
sta BASL ; load image to $c00
|
|
|
|
lda #<bg_final_high
|
|
sta GBASL
|
|
lda #>bg_final_high
|
|
sta GBASH
|
|
jsr load_rle_gr
|
|
|
|
lda #0
|
|
sta DRAW_PAGE
|
|
|
|
jsr gr_copy_to_current
|
|
|
|
; 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
|
|
|
|
; so we have 5070 + 4550 = 9620 to kill
|
|
|
|
jsr gr_copy_to_current ; 6+ 9292
|
|
|
|
; now we have 322 left
|
|
|
|
; GR part
|
|
bit LORES ; 4
|
|
bit SET_GR ; 4
|
|
bit FULLGR ; 4
|
|
|
|
; 322 - 12 = 310
|
|
; - 3 for jmp
|
|
; 307
|
|
|
|
; Try X=9 Y=6 cycles=307
|
|
|
|
ldy #6 ; 2
|
|
fwloopA:ldx #9 ; 2
|
|
fwloopB:dex ; 2
|
|
bne fwloopB ; 2nt/3
|
|
dey ; 2
|
|
bne fwloopA ; 2nt/3
|
|
|
|
jmp fw_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]
|
|
|
|
fw_display_loop:
|
|
|
|
;===================================
|
|
; HIRES PAGE0 for the top 152 lines
|
|
;===================================
|
|
|
|
; 152 * 65 = 9880
|
|
; -12 for HIRES/PAGE0 at top
|
|
; -5 for LORES+ldy+br fallthrough at bottom
|
|
; -132 for move_letters
|
|
; 9731
|
|
|
|
bit HIRES ; 4
|
|
bit PAGE0 ; 4
|
|
bit FULLGR ; 4
|
|
;===========
|
|
; 12
|
|
jsr move_letters ; 6+126
|
|
|
|
; Try X=242 Y=8 cycles=9729 R2
|
|
|
|
nop ; 2
|
|
|
|
|
|
ldy #8 ; 2
|
|
hgloop1:ldx #242 ; 2
|
|
hgloop2:dex ; 2
|
|
bne hgloop2 ; 2nt/3
|
|
dey ; 2
|
|
bne hgloop1 ; 2nt/3
|
|
|
|
bit LORES ; 4
|
|
|
|
|
|
;====================================================
|
|
; LORES PAGE0/PAGE1 alternating for the next 24 lines
|
|
;====================================================
|
|
|
|
|
|
ldy #12 ; *2=24 lines ; 2
|
|
|
|
; we set PAGE0 (4) then want to NOP (61) for a total of 65
|
|
bouter_loop:
|
|
bit PAGE0 ; 4
|
|
ldx #12 ; 65 cycles with PAGE0 ; 2
|
|
bpage0_loop: ; delay 61+bit
|
|
dex ; 2
|
|
bne bpage0_loop ; 2/3
|
|
;=============
|
|
; 6+(12*5)-1=65
|
|
|
|
; we set PAGE1 (4) as well as dey (2) and bne (3) then nop (55)
|
|
;
|
|
|
|
bit PAGE1 ; 4
|
|
ldx #11 ; 65 cycles with PAGE1 ; 2
|
|
bpage1_loop:
|
|
dex ; 2
|
|
bne bpage1_loop ; 2/3
|
|
;=============
|
|
; 6+(11*5)-1=60
|
|
|
|
dey ; 2
|
|
bne bouter_loop ; 2/3
|
|
;==============
|
|
; 5 to make 65
|
|
|
|
|
|
|
|
;=========================================================
|
|
; LORES PAGE0/PAGE1+TEXT alternating for the next 16 lines
|
|
;=========================================================
|
|
|
|
|
|
ldy #8 ; *2=16 lines ; 2
|
|
|
|
; we set PAGE0 (4) then want to NOP (61) for a total of 65
|
|
couter_loop:
|
|
bit FULLGR ; 4
|
|
bit PAGE0 ; 4
|
|
ldx #5 ; 2
|
|
cpage0_loop:
|
|
dex ; 2
|
|
bne cpage0_loop ; 2/3
|
|
;=============
|
|
; 10+(5*5)-1=34
|
|
bit $1000 ; 4
|
|
bit $1000 ; 4
|
|
bit TEXTGR ; 4
|
|
bit $1000 ; 4
|
|
bit $1000 ; 4
|
|
bit $1000 ; 4
|
|
bit $1000 ; 4
|
|
lda DRAW_PAGE ; 3
|
|
|
|
; we set PAGE1 (4) as well as dey (2) and bne (3) then nop (55)
|
|
;
|
|
|
|
bit FULLGR ; 4
|
|
bit PAGE1 ; 4
|
|
ldx #5 ; 2
|
|
cpage1_loop:
|
|
dex ; 2
|
|
bne cpage1_loop ; 2/3
|
|
;=============
|
|
; 10+(5*5)-1=34
|
|
|
|
bit $1000 ; 4
|
|
bit $1000 ; 4
|
|
bit TEXTGR ; 4
|
|
|
|
bit $1000 ; 4
|
|
lda DRAW_PAGE ; 3
|
|
nop ; 2
|
|
lda DRAW_PAGE ; 3
|
|
nop ; 2
|
|
|
|
dey ; 2
|
|
bne couter_loop ; 2/3
|
|
;==============
|
|
; 5 to make 65
|
|
|
|
|
|
|
|
;======================================================
|
|
; We have 4550 cycles in the vblank, use them wisely
|
|
;======================================================
|
|
; 4550
|
|
; +1 fallthrough
|
|
; -2 for ldy in previous
|
|
; -35 call through jumptable
|
|
; -7 keyboard
|
|
; -3 jmp
|
|
; ========
|
|
; 4504
|
|
;========================
|
|
; each subunit should take 4504 cycles
|
|
|
|
firework_state_machine:
|
|
|
|
; if killing time, 16+19 = 35
|
|
; if not, 16+19 = 35
|
|
|
|
ldy STATE ; 3
|
|
inc FRAME ; 5
|
|
lda FRAME ; 3
|
|
and #$3 ; 2
|
|
beq kill_time ; 3
|
|
;===========
|
|
; 16
|
|
|
|
|
|
; Set up jump table that runs same speed on 6502 and 65c02
|
|
;-1
|
|
lda jump_table+1,y ; 4
|
|
pha ; 3
|
|
lda jump_table,y ; 4
|
|
pha ; 3
|
|
rts ; 6
|
|
|
|
;=============
|
|
; 19
|
|
|
|
kill_time:
|
|
|
|
; need 16 cycles nop
|
|
ldy STATE ; (nop) ; 3
|
|
ldy STATE ; (nop) ; 3
|
|
ldy STATE ; (nop) ; 3
|
|
ldy STATE ; (nop) ; 3
|
|
nop ; 2
|
|
nop ; 2
|
|
jmp action_stars ; 3
|
|
|
|
;=============
|
|
; 19
|
|
|
|
fw_check_keyboard:
|
|
|
|
lda KEYPRESS ; 4
|
|
bpl fw_no_keypress ; 3
|
|
jmp restart
|
|
fw_no_keypress:
|
|
|
|
jmp fw_display_loop ; 3
|
|
|
|
|
|
; Restart and toggle sound
|
|
restart:
|
|
; self mofifying code, flip from bit C030 to bit 0030
|
|
lda sound1+2
|
|
eor #$C0
|
|
sta sound1+2
|
|
|
|
; lda sound2+2
|
|
; eor #$C0
|
|
; sta sound2+2
|
|
|
|
lda sound3+2
|
|
eor #$C0
|
|
sta sound3+2
|
|
|
|
jmp setup_background
|
|
|
|
|
|
jump_table:
|
|
.word (action_launch_firework-1)
|
|
.word (action_move_rocket-1)
|
|
.word (action_start_explosion-1)
|
|
.word (action_continue_explosion-1)
|
|
.word (action_stall_rocket-1)
|
|
|
|
|
|
|
|
.include "fw_state_machine.s"
|
|
.include "fw.s"
|
|
|
|
;.include "gr_hline.s"
|
|
;.include "../asm_routines/gr_unrle.s"
|
|
;.include "../asm_routines/keypress.s"
|
|
;.include "gr_copy.s"
|
|
;.include "random16.s"
|
|
|
|
;.include "hgr.s"
|
|
;.include "vapor_lock.s"
|
|
;.include "move_letters.s"
|
|
;.include "delay_a.s"
|
|
|
|
background:
|
|
|
|
.include "fw_background.inc"
|