mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-01 01:06:33 +00:00
d4cedf0e7a
a hack but maybe good enough for now
519 lines
7.6 KiB
ArmAsm
519 lines
7.6 KiB
ArmAsm
; Chess board, polyhedrons, circles, interference
|
|
|
|
; o/~ One night in Bangkok makes a hard man humble... o/~
|
|
|
|
;
|
|
; by deater (Vince Weaver) <vince@deater.net>
|
|
|
|
.include "../zp.inc"
|
|
.include "../hardware.inc"
|
|
.include "../qload.inc"
|
|
.include "../music.inc"
|
|
|
|
mod7_table = $1c00
|
|
div7_table = $1d00
|
|
hposn_low = $1e00
|
|
hposn_high = $1f00
|
|
|
|
chess_start:
|
|
;=====================
|
|
; initializations
|
|
;=====================
|
|
|
|
; some of this not necessary as we come in in HGR
|
|
|
|
bit SET_GR
|
|
bit HIRES
|
|
bit FULLGR
|
|
bit PAGE1
|
|
bit KEYRESET
|
|
|
|
lda #$00
|
|
jsr hgr_page2_clearscreen
|
|
|
|
;===================
|
|
; Load graphics
|
|
;===================
|
|
|
|
|
|
|
|
;=============================
|
|
; load chessboard image offscreen $6000
|
|
;=============================
|
|
|
|
lda #<chess_data
|
|
sta zx_src_l+1
|
|
lda #>chess_data
|
|
sta zx_src_h+1
|
|
lda #$60
|
|
jsr zx02_full_decomp
|
|
|
|
|
|
|
|
|
|
; wait until pattern1
|
|
pattern2_loop:
|
|
lda #2
|
|
jsr wait_for_pattern
|
|
bcc pattern2_loop
|
|
|
|
; technically the above, but we're not fast enough
|
|
|
|
; lda #175
|
|
; jsr wait_ticks
|
|
|
|
; lda #$FF
|
|
; jsr hgr_page1_clearscreen
|
|
|
|
|
|
;==========================
|
|
; Falling board animation
|
|
;==========================
|
|
|
|
; TODO
|
|
|
|
; 148-192 = full = 44
|
|
|
|
; 0 frames in = 0 high, bottom=125+13 Y=125
|
|
; 4 frames in, 130-138 = 8 high bottom=138+17 Y=130
|
|
; 8 frames in, from 135-155 = 20 bottom=155+25 Y=135
|
|
;12 frames in, from 145-180 = 35 bottom=180 Y=145
|
|
|
|
|
|
; first collapse down, top to 125 bottom up to 133
|
|
; so 125 whie other 60
|
|
|
|
ldx #0
|
|
lda #191
|
|
sta COUNT
|
|
compact_loop:
|
|
|
|
txa
|
|
lsr
|
|
bcc compact_not_even
|
|
|
|
stx SAVEX
|
|
|
|
ldx COUNT
|
|
|
|
lda hposn_low,X
|
|
sta GBASL
|
|
lda hposn_high,X
|
|
sta GBASH
|
|
|
|
lda #0
|
|
ldy #39
|
|
compact_inner_loop2:
|
|
sta (GBASL),Y
|
|
dey
|
|
bpl compact_inner_loop2
|
|
|
|
dec COUNT
|
|
|
|
ldx SAVEX
|
|
|
|
compact_not_even:
|
|
|
|
lda hposn_low,X
|
|
sta GBASL
|
|
lda hposn_high,X
|
|
sta GBASH
|
|
|
|
lda #0
|
|
ldy #39
|
|
compact_inner_loop:
|
|
sta (GBASL),Y
|
|
dey
|
|
bpl compact_inner_loop
|
|
|
|
lda #30
|
|
jsr wait
|
|
|
|
inx
|
|
cpx #122
|
|
bne compact_loop
|
|
|
|
|
|
;=============================
|
|
; dropping board
|
|
;=============================
|
|
|
|
ldx #0
|
|
stx BOARD_COUNT
|
|
|
|
drop_board_loop:
|
|
jsr hgr_clear_screen
|
|
|
|
ldx BOARD_COUNT
|
|
lda board_y,X
|
|
sta HGR_DEST
|
|
|
|
lda board_starty,X
|
|
sta HGR_Y1
|
|
|
|
lda #0
|
|
sta HGR_X1
|
|
lda #40
|
|
sta HGR_X2
|
|
lda #192
|
|
sta HGR_Y2
|
|
|
|
jsr hgr_partial
|
|
|
|
jsr hgr_page_flip
|
|
|
|
; jsr wait_until_keypress
|
|
|
|
lda #10
|
|
jsr wait_ticks
|
|
|
|
inc BOARD_COUNT
|
|
lda BOARD_COUNT
|
|
cmp #7
|
|
bne drop_board_loop
|
|
|
|
|
|
;=============================
|
|
; Bouncing on board animation
|
|
;=============================
|
|
|
|
lda #10
|
|
jsr setup_timeout
|
|
|
|
bit PAGE2
|
|
|
|
lda #0
|
|
sta COUNT
|
|
sta DRAW_PAGE
|
|
chess_bounce_loop:
|
|
|
|
lda #$60 ; copy to screen
|
|
jsr hgr_copy
|
|
|
|
ldx COUNT
|
|
|
|
lda bounce_coords_x,X
|
|
sta SPRITE_X
|
|
lda bounce_coords_y,X
|
|
sta SPRITE_Y
|
|
cmp #100
|
|
bcs do_squashed
|
|
|
|
lda #<object_data
|
|
sta INL
|
|
lda #>object_data
|
|
jmp done_pick_object
|
|
do_squashed:
|
|
lda #<squished
|
|
sta INL
|
|
lda #>squished
|
|
done_pick_object:
|
|
sta INH
|
|
|
|
|
|
jsr hgr_draw_sprite_big
|
|
|
|
jsr hgr_page_flip
|
|
|
|
inc COUNT
|
|
lda COUNT
|
|
cmp #36
|
|
bne no_chess_bounce_oflo
|
|
lda #0
|
|
sta COUNT
|
|
|
|
no_chess_bounce_oflo:
|
|
|
|
jsr check_timeout
|
|
bcc chess_bounce_loop ; clear if not timed out
|
|
|
|
done_chess_bounce_loop:
|
|
|
|
|
|
;=============================
|
|
; Orange Blob Animation
|
|
;=============================
|
|
|
|
|
|
; load image offscreen $6000
|
|
|
|
lda #<orange_data
|
|
sta zx_src_l+1
|
|
lda #>orange_data
|
|
sta zx_src_h+1
|
|
lda #$60
|
|
jsr zx02_full_decomp
|
|
|
|
ldx #0
|
|
stx COUNT
|
|
|
|
orange_loop:
|
|
|
|
lda #$60 ; copy to screen
|
|
jsr hgr_copy
|
|
|
|
ldx COUNT
|
|
|
|
lda object_coords_x,X
|
|
; cmp #$FF ; needed?
|
|
; beq done_orange_loop
|
|
|
|
sta SPRITE_X
|
|
lda object_coords_y,X
|
|
sta SPRITE_Y
|
|
|
|
lda #<object_data
|
|
sta INL
|
|
lda #>object_data
|
|
sta INH
|
|
|
|
jsr hgr_draw_sprite_big
|
|
|
|
jsr hgr_page_flip
|
|
|
|
inc COUNT
|
|
lda COUNT
|
|
cmp #48
|
|
bne no_orange_oflo
|
|
lda #0
|
|
sta COUNT
|
|
|
|
no_orange_oflo:
|
|
|
|
; finish at music pattern #10 or keypress
|
|
lda #10
|
|
jsr wait_for_pattern
|
|
bcc orange_loop
|
|
|
|
; lda KEYPRESS
|
|
; bpl orange_loop
|
|
|
|
;done_orange_loop:
|
|
; bit KEYRESET
|
|
|
|
chess_done:
|
|
|
|
|
|
|
|
;==================
|
|
;==================
|
|
;==================
|
|
; DO TUNNEL HERE
|
|
;==================
|
|
;==================
|
|
;==================
|
|
|
|
; load image $2000
|
|
|
|
lda #<tunnel1_data
|
|
sta zx_src_l+1
|
|
lda #>tunnel1_data
|
|
sta zx_src_h+1
|
|
lda #$20
|
|
jsr zx02_full_decomp
|
|
|
|
; load image $4000
|
|
|
|
lda #<tunnel2_data
|
|
sta zx_src_l+1
|
|
lda #>tunnel2_data
|
|
sta zx_src_h+1
|
|
lda #$40
|
|
jsr zx02_full_decomp
|
|
|
|
tunnel_loop:
|
|
bit PAGE1
|
|
lda #8
|
|
jsr wait_irq
|
|
|
|
bit PAGE2
|
|
lda #8
|
|
jsr wait_irq
|
|
|
|
; finish at music pattern #13 or keypress
|
|
lda #13
|
|
jsr wait_for_pattern
|
|
bcc tunnel_loop
|
|
|
|
main_tunnel_done:
|
|
|
|
;==================
|
|
;==================
|
|
;==================
|
|
; DO circles HERE
|
|
;==================
|
|
;==================
|
|
;==================
|
|
|
|
jsr zooming_circles
|
|
|
|
|
|
lda #$ff
|
|
sta clear_all_color+1
|
|
jsr clear_all
|
|
|
|
; todo, fade to white
|
|
|
|
;==================
|
|
;==================
|
|
;==================
|
|
; DO INTERFERENCE #1 HERE
|
|
;==================
|
|
;==================
|
|
;==================
|
|
|
|
; first until pattern 18
|
|
|
|
lda #18
|
|
sta interference_end_smc+1
|
|
jsr interference
|
|
|
|
;======================
|
|
; TODO: falling bars
|
|
;======================
|
|
lda #0
|
|
sta DRAW_PAGE
|
|
bit PAGE1
|
|
jsr clear_all
|
|
|
|
; left
|
|
|
|
lda #$FF
|
|
sta BAR_X1
|
|
lda #13
|
|
sta BAR_X2
|
|
jsr falling_bars
|
|
|
|
lda #15
|
|
jsr wait_ticks
|
|
|
|
; middle
|
|
|
|
lda #13
|
|
sta BAR_X1
|
|
lda #26
|
|
sta BAR_X2
|
|
jsr falling_bars
|
|
|
|
lda #15
|
|
jsr wait_ticks
|
|
|
|
; right
|
|
|
|
lda #26
|
|
sta BAR_X1
|
|
lda #39
|
|
sta BAR_X2
|
|
jsr falling_bars
|
|
|
|
lda #15
|
|
jsr wait_ticks
|
|
|
|
|
|
;==================
|
|
;==================
|
|
;==================
|
|
; DO INTERFERENCE #2 HERE
|
|
;==================
|
|
;==================
|
|
;==================
|
|
|
|
; again until pattern 25
|
|
|
|
; lda #25
|
|
; sta interference_end_smc+1
|
|
; jsr interference
|
|
|
|
jsr sier_zoom
|
|
|
|
main_interference_done:
|
|
|
|
rts
|
|
|
|
|
|
;.align $100
|
|
.include "../wait_keypress.s"
|
|
; .include "../zx02_optim.s"
|
|
; .include "../hgr_table.s"
|
|
.include "../hgr_clear_screen.s"
|
|
.include "../hgr_copy_fast.s"
|
|
.include "../hgr_sprite_big.s"
|
|
.include "../irq_wait.s"
|
|
|
|
.include "interference.s"
|
|
.include "circles.s"
|
|
.include "sierzoom.s"
|
|
.include "../hgr_page_flip.s"
|
|
.include "falling_bars.s"
|
|
.include "hgr_partial.s"
|
|
|
|
; wait A * 1/50s
|
|
wait_irq:
|
|
; lda #50
|
|
sta IRQ_COUNTDOWN
|
|
wait_irq_loop:
|
|
lda IRQ_COUNTDOWN
|
|
bne wait_irq_loop
|
|
rts
|
|
|
|
chess_data:
|
|
.incbin "graphics/chessboard.hgr.zx02"
|
|
orange_data:
|
|
.incbin "graphics/orange_bg.hgr.zx02"
|
|
|
|
object_data:
|
|
.include "graphics/object.inc"
|
|
|
|
tunnel1_data:
|
|
.incbin "graphics/tunnel1_cropped.hgr.zx02"
|
|
tunnel2_data:
|
|
.incbin "graphics/tunnel2_cropped.hgr.zx02"
|
|
|
|
|
|
; object is roughly 15 wide?
|
|
|
|
; this is a triangle pattern
|
|
; we could reverse at some point
|
|
|
|
; 12*4 = 48
|
|
object_coords_x:
|
|
.byte 13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2
|
|
.byte 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12
|
|
.byte 13,14,15,16,17,18,19,20,21,22,23,24
|
|
.byte 25,24,23,22,21,20,19,18,17,16,15,14
|
|
|
|
object_coords_y:
|
|
.byte 5,10,16,23,30,36,43,49,55,62,68,75
|
|
.byte 82,82,82,82,82,82,82,82,82,82,82,82
|
|
.byte 82,82,82,82,82,82,82,82,82,82,82,82
|
|
.byte 75,68,62,55,49,43,36,30,23,16,10, 5
|
|
|
|
|
|
|
|
|
|
; 9*4=36
|
|
bounce_coords_x:
|
|
.byte 12, 12, 12, 12, 12, 12, 12, 10, 10
|
|
.byte 10, 10, 12, 12, 12, 12, 12, 12, 12
|
|
.byte 12, 12, 12, 12, 12, 12, 12, 10, 10
|
|
.byte 10, 10, 12, 12, 12, 12, 12, 12, 12
|
|
|
|
bounce_coords_y:
|
|
.byte 4, 20, 35, 45, 60, 70, 82, 102, 115
|
|
.byte 115,102, 82, 70, 60, 45, 35, 20, 4
|
|
.byte 4, 20, 35, 45, 60, 70, 82, 102, 115
|
|
.byte 115,102, 82, 70, 60, 45, 35, 20, 4
|
|
|
|
; 148-192 = full = 44
|
|
|
|
; 0 frames in = 0 high, bottom=125+13 Y=125
|
|
; 4 frames in, 130-138 = 8 high bottom=138+17 Y=130
|
|
; 8 frames in, from 135-155 = 20 bottom=155+25 Y=135
|
|
;12 frames in, from 145-180 = 35 bottom=180 Y=145
|
|
|
|
board_y:
|
|
.byte 125,130,135,145,139,145,139
|
|
|
|
board_starty:
|
|
.byte 184,184,172,157,139,157,139
|