mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-01-08 03:31:10 +00:00
600 lines
9.2 KiB
ArmAsm
600 lines
9.2 KiB
ArmAsm
|
|
;=============================
|
|
; draw the fireplace scene
|
|
;=============================
|
|
fireplace_restart:
|
|
lda #0
|
|
sta FRAMEL
|
|
sta FRAMEH
|
|
|
|
bit LORES
|
|
|
|
bit PAGE2
|
|
|
|
lda #4
|
|
sta DRAW_PAGE
|
|
|
|
lda #<fireplace_data
|
|
sta INL
|
|
lda #>fireplace_data
|
|
sta INH
|
|
|
|
; speed up for second time
|
|
lda #1
|
|
sta wait_delay_smc+1
|
|
|
|
jsr draw_scene
|
|
|
|
lda #$DD
|
|
sta FIRE_COLOR
|
|
|
|
bit KEYRESET
|
|
|
|
jmp fireplace_scroller
|
|
|
|
|
|
;=============================
|
|
; draw the fireplace scene
|
|
;=============================
|
|
fireplace_opener:
|
|
lda #0
|
|
sta FRAMEL
|
|
sta FRAMEH
|
|
|
|
lda #120
|
|
sta HGR_COPY_Y1
|
|
lda #160
|
|
sta HGR_COPY_Y2
|
|
|
|
bit SET_GR
|
|
bit LORES
|
|
bit FULLGR
|
|
bit PAGE1
|
|
|
|
lda #<merry_graphics
|
|
sta zx_src_l+1
|
|
lda #>merry_graphics
|
|
sta zx_src_h+1
|
|
lda #$40
|
|
jsr zx02_full_decomp
|
|
|
|
bit SET_GR
|
|
bit LORES
|
|
bit FULLGR
|
|
bit PAGE2
|
|
|
|
lda #4
|
|
sta DRAW_PAGE
|
|
|
|
bit KEYRESET
|
|
|
|
lda #<fireplace_data
|
|
sta INL
|
|
lda #>fireplace_data
|
|
sta INH
|
|
|
|
jsr draw_scene
|
|
|
|
; write text to page2
|
|
; this is inefficient at best
|
|
|
|
ldy #39
|
|
text_loop:
|
|
lda merry_text+6,Y
|
|
ora #$80
|
|
sta $A50,Y
|
|
|
|
lda merry_text+4,Y
|
|
ora #$80
|
|
sta $AD0,Y
|
|
|
|
lda merry_text+2,Y
|
|
ora #$80
|
|
sta $B50,Y
|
|
|
|
lda merry_text,Y
|
|
ora #$80
|
|
sta $BD0,Y
|
|
early_out:
|
|
dey
|
|
bpl text_loop
|
|
|
|
|
|
|
|
bit PAGE1
|
|
|
|
lda #$DD
|
|
sta FIRE_COLOR
|
|
|
|
|
|
|
|
; attempt vapor lock
|
|
|
|
jmp pad_skip
|
|
.align $100
|
|
pad_skip:
|
|
jsr vapor_lock
|
|
|
|
bit PAGE2
|
|
|
|
; vapor lock returns with us at beginning of hsync in line
|
|
; 114 (7410 cycles)
|
|
|
|
|
|
; we want to do the split at line 160, so 46 more lines, or
|
|
; 2990 cycles
|
|
|
|
; Try X=11 Y=49 cycles=2990
|
|
|
|
ldy #49 ; 2
|
|
loop11: ldx #11 ; 2
|
|
loop22: dex ; 2
|
|
bne loop22 ; 2nt/3
|
|
dey ; 2
|
|
bne loop11 ; 2nt/3
|
|
|
|
|
|
loop_forever:
|
|
;================================================
|
|
; 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
|
|
|
|
; want 32 lines of hires, which will take us into VBLANK
|
|
; 2080 cycles - 4 = 2076
|
|
|
|
; -4
|
|
bit HIRES ; 4
|
|
|
|
; Try X=137 Y=3 cycles=2074
|
|
|
|
nop ; 2
|
|
|
|
ldy #3 ; 2
|
|
loop1: ldx #137 ; 2
|
|
loop2: dex ; 2
|
|
bne loop2 ; 2nt/3
|
|
dey ; 2
|
|
bne loop1 ; 2nt/3
|
|
|
|
; do the VBLANK
|
|
; 4550 cycles
|
|
|
|
; Try X=19 Y=45 cycles=4546
|
|
|
|
nop
|
|
nop
|
|
|
|
ldy #45 ; 2
|
|
loop10: ldx #19 ; 2
|
|
loop20: dex ; 2
|
|
bne loop20 ; 2nt/3
|
|
dey ; 2
|
|
bne loop10 ; 2nt/3
|
|
|
|
;===================================
|
|
; LORES SCREEN
|
|
|
|
; DO THINGS
|
|
; count FRAMES
|
|
; every 1/2 second flicker fireplace
|
|
; show for 1s
|
|
; copy over text, 32 lines, 10 frames each = 3.2s
|
|
|
|
;=================
|
|
; set LORES
|
|
|
|
bit LORES ; 4
|
|
|
|
;==================
|
|
; frame increment
|
|
|
|
inc FRAMEL ; 5
|
|
lda FRAMEL ; 3
|
|
and #$3f ; 2
|
|
sta FRAMEL ; 3
|
|
|
|
bne frame_noflo ; 2/3
|
|
|
|
inc FRAMEH ; 5
|
|
|
|
jmp frame_inc_done ; 3
|
|
; 23
|
|
frame_noflo:
|
|
; 16
|
|
lda $0 ; nop3 ; 3
|
|
nop ; 2
|
|
nop ; 2
|
|
frame_inc_done:
|
|
; 23 / 23
|
|
|
|
|
|
|
|
;==================
|
|
; do the action
|
|
|
|
; FRAMEH = 0/1 do nothing
|
|
; FRAMEH = 2 every other line do copy
|
|
; FRAMEH = 3 exit
|
|
; FRAMEL = 1 exactly, flicker
|
|
|
|
check_action:
|
|
|
|
; 0
|
|
lda FRAMEL ; 3
|
|
cmp #1 ; 2
|
|
beq do_flicker ; 2/3
|
|
; 7
|
|
and #1 ; 2
|
|
bne do_nothing_odd ; 2/3
|
|
; 11
|
|
lda FRAMEH ; 3
|
|
cmp #3 ; 2
|
|
beq done_cycle_count ; 2/3
|
|
; 18
|
|
cmp #2 ; 2
|
|
bcc do_nothing_less_than_2 ; blt ; 2/3
|
|
; 22
|
|
|
|
|
|
;========================
|
|
; copy text
|
|
|
|
copy_text:
|
|
|
|
ldx HGR_COPY_Y1 ; 3
|
|
lda hposn_high,X ; 4
|
|
clc ; 2
|
|
adc #$20 ; 2
|
|
sta INH ; 3
|
|
lda hposn_low,X ; 4
|
|
sta INL ; 3
|
|
; 21
|
|
|
|
ldx HGR_COPY_Y2 ; 3
|
|
lda hposn_high,X ; 4
|
|
clc ; 2
|
|
adc #$20 ; 2
|
|
sta OUTH ; 3
|
|
lda hposn_low,X ; 4
|
|
sta OUTL ; 3
|
|
; 21
|
|
|
|
|
|
ldy #39 ; 2
|
|
copy_hgr_line_loop:
|
|
lda (INL),Y ; 5
|
|
sta (OUTL),Y ; 6
|
|
dey ; 2
|
|
bpl copy_hgr_line_loop ; 2/3
|
|
|
|
; 2+(40*16)-1 = 641
|
|
|
|
inc HGR_COPY_Y1 ; 5
|
|
inc HGR_COPY_Y2 ; 5
|
|
|
|
jmp done_action ; 3
|
|
|
|
; 22 + 21 + 21 + 641 + 10 + 3 = 718
|
|
|
|
do_flicker:
|
|
; 8
|
|
|
|
lda FIRE_COLOR ; 3
|
|
eor #$0D ; 2
|
|
sta FIRE_COLOR ; 3
|
|
sta $9A8+34 ; 4
|
|
sta $9A8+35 ; 4
|
|
; 24
|
|
|
|
|
|
|
|
; 718-27 = 691
|
|
; Try X=8 Y=15 cycles=691
|
|
|
|
ldy #15 ; 2
|
|
loop5: ldx #8 ; 2
|
|
loop6: dex ; 2
|
|
bne loop6 ; 2nt/3
|
|
dey ; 2
|
|
bne loop5 ; 2nt/3
|
|
|
|
jmp done_action ; 3
|
|
|
|
do_nothing_odd:
|
|
; 12 if from odd
|
|
lda $0 ; nop3
|
|
lda $0 ; nop3
|
|
lda $0 ; nop3
|
|
nop ; 2
|
|
|
|
do_nothing_less_than_2:
|
|
; 23 if from less than 2
|
|
|
|
; 718-23=695
|
|
; Try X=68 Y=2 cycles=693
|
|
|
|
nop
|
|
|
|
ldy #2 ; 2
|
|
loop7: ldx #68 ; 2
|
|
loop8: dex ; 2
|
|
bne loop8 ; 2nt/3
|
|
dey ; 2
|
|
bne loop7 ; 2nt/3
|
|
|
|
|
|
done_action:
|
|
|
|
; 718 from copy_text
|
|
|
|
|
|
; do the lores screen, 160 lines
|
|
; 10400
|
|
; -4 (bit LORES)
|
|
; -23 (inc FRAME)
|
|
; -3 (jmp)
|
|
; -718 actions
|
|
;=======
|
|
; 9652
|
|
|
|
; Try X=39 Y=48 cycles=9649
|
|
|
|
lda $0 ; nop3
|
|
|
|
ldy #48 ; 2
|
|
loop3: ldx #39 ; 2
|
|
loop4: dex ; 2
|
|
bne loop4 ; 2nt/3
|
|
dey ; 2
|
|
bne loop3 ; 2nt/3
|
|
|
|
|
|
|
|
jmp loop_forever ; 3
|
|
|
|
|
|
|
|
|
|
done_cycle_count:
|
|
bit TEXTGR
|
|
|
|
|
|
;==========================
|
|
; start music
|
|
|
|
lda SOUND_STATUS
|
|
and #SOUND_MOCKINGBOARD
|
|
beq no_music
|
|
cli ; enable sound
|
|
no_music:
|
|
|
|
;=================================
|
|
;=================================
|
|
;=================================
|
|
; main fireplace loop
|
|
;=================================
|
|
;=================================
|
|
;=================================
|
|
|
|
lda #$DD
|
|
sta FIRE_COLOR
|
|
|
|
lda #0
|
|
sta FRAMEL
|
|
sta FRAMEH
|
|
|
|
|
|
new_loop:
|
|
|
|
; update frame count
|
|
|
|
inc FRAMEL ; 5
|
|
lda FRAMEL ; 3
|
|
and #$3f ; 2
|
|
sta FRAMEL ; 3
|
|
bne frame_noflo2 ; 2/3
|
|
inc FRAMEH ; 5
|
|
frame_noflo2:
|
|
|
|
lda #255
|
|
jsr wait
|
|
|
|
jsr toggle_flame
|
|
|
|
lda KEYPRESS
|
|
bmi totally_done_fireplace
|
|
|
|
; wait for_pattern / end
|
|
|
|
lda SOUND_STATUS
|
|
and #SOUND_MOCKINGBOARD
|
|
beq no_music2
|
|
|
|
lda #1
|
|
cmp current_pattern_smc+1
|
|
; bcc totally_done_fireplace
|
|
beq totally_done_fireplace
|
|
jmp done_music2
|
|
|
|
no_music2:
|
|
lda FRAMEH
|
|
cmp #1
|
|
beq totally_done_fireplace
|
|
|
|
done_music2:
|
|
|
|
|
|
jmp new_loop
|
|
|
|
totally_done_fireplace:
|
|
bit KEYRESET
|
|
|
|
|
|
|
|
;=================================
|
|
;=================================
|
|
;=================================
|
|
; scroller
|
|
;=================================
|
|
;=================================
|
|
;=================================
|
|
fireplace_scroller:
|
|
|
|
lda #0
|
|
sta OFFSET
|
|
sta FRAMEL
|
|
sta FRAMEH
|
|
|
|
lda #4
|
|
sta DRAW_PAGE
|
|
|
|
lda #<greets_raw_zx02
|
|
sta zx_src_l+1
|
|
lda #>greets_raw_zx02
|
|
sta zx_src_h+1
|
|
lda #$20
|
|
jsr zx02_full_decomp
|
|
|
|
bit FULLGR
|
|
do_scroll:
|
|
|
|
; update frame count
|
|
|
|
inc FRAMEL ; 5
|
|
lda FRAMEL ; 3
|
|
and #$3f ; 2
|
|
sta FRAMEL ; 3
|
|
bne frame_noflo3 ; 2/3
|
|
inc FRAMEH ; 5
|
|
frame_noflo3:
|
|
|
|
lda FRAMEL
|
|
and #$3
|
|
bne no_scroll_flame
|
|
|
|
jsr toggle_flame
|
|
no_scroll_flame:
|
|
|
|
jsr scroll_loop
|
|
|
|
lda #128
|
|
jsr wait
|
|
|
|
|
|
lda KEYPRESS
|
|
bmi totally_done_scroll
|
|
|
|
; wait for_pattern / end
|
|
|
|
lda SOUND_STATUS
|
|
and #SOUND_MOCKINGBOARD
|
|
beq no_music3
|
|
|
|
; lda #3
|
|
; cmp current_pattern_smc+1
|
|
; bcc totally_done_scroll
|
|
; beq totally_done_scroll
|
|
; jmp done_music3
|
|
|
|
no_music3:
|
|
lda FRAMEH
|
|
cmp #4
|
|
beq totally_done_scroll
|
|
|
|
done_music3:
|
|
|
|
|
|
|
|
|
|
jmp do_scroll
|
|
|
|
done_scroll:
|
|
totally_done_scroll:
|
|
bit KEYRESET
|
|
|
|
rts
|
|
|
|
|
|
;=========================
|
|
; toggle flame
|
|
;=========================
|
|
|
|
toggle_flame:
|
|
lda FIRE_COLOR ; 3
|
|
eor #$0D ; 2
|
|
sta FIRE_COLOR ; 3
|
|
sta $9A8+34 ; 4
|
|
sta $9A8+35 ; 4
|
|
|
|
rts
|
|
|
|
.include "gr_scroll.s"
|
|
|
|
greets_raw_zx02:
|
|
.incbin "graphics/greets.raw.zx02"
|
|
credits_raw_zx02:
|
|
.incbin "graphics/credits.raw.zx02"
|
|
|
|
fireplace_data:
|
|
|
|
.byte SET_COLOR | YELLOW
|
|
.byte BOX, 0,0,39,29 ; wall
|
|
.byte SET_COLOR | BROWN
|
|
.byte BOX,0,30,39,39 ; monitor back
|
|
.byte BOX,1,0,9,20 ; window
|
|
.byte SET_COLOR | BLACK
|
|
.byte BOX,2,0,8,9 ; upper
|
|
.byte SET_COLOR | WHITE
|
|
.byte BOX,2,12,8,18 ; bottom snow
|
|
.byte SET_COLOR | RED
|
|
.byte 27,12,39,30 ; fireplace
|
|
.byte SET_COLOR | BLACK
|
|
.byte 30,17,39,30 ; hearth
|
|
.byte SET_COLOR | BROWN
|
|
.byte 32,27,38,29 ; wood
|
|
.byte SET_COLOR | WHITE
|
|
.byte 26,10,39,11 ; mantle
|
|
.byte SET_COLOR | GREEN
|
|
.byte 15,0,17,39 ; tree center
|
|
.byte 13,5,19,39 ; tree middle
|
|
.byte 12,15,20,39 ; tree wider
|
|
.byte 10,23,22,39 ; tree wide
|
|
.byte SET_COLOR | LIGHT_BLUE
|
|
.byte 13,11,16,12 ; garland top
|
|
.byte 17,13,19,14 ; garland top
|
|
.byte 12,23,15,24 ; garland middle
|
|
.byte 16,25,19,26 ; garland middle
|
|
.byte 20,27,22,28 ; garland middle
|
|
.byte 10,36,14,37 ; garland bottom
|
|
.byte 15,38,18,39 ; garland bottom
|
|
.byte SET_COLOR | RED
|
|
.byte 14,7,15,9 ; ball1
|
|
.byte 18,17,19,19 ; ball2
|
|
.byte 11,31,12,33 ; ball3
|
|
.byte 20,34,21,36 ; ball4
|
|
.byte SET_COLOR | YELLOW
|
|
.byte 34,22,36,26 ; fire
|
|
.byte SET_COLOR | ORANGE
|
|
.byte 35,24,35,26 ; fire
|
|
.byte SET_COLOR | BLACK
|
|
.byte 34,22,35,22 ; flicker
|
|
.byte SET_COLOR | YELLOW
|
|
.byte BOX,34,22,35,22 ; flicker
|
|
.byte END
|
|
|
|
|
|
|
|
;0123456789012345678901234567890123456789
|
|
merry_text:
|
|
.byte " MERRY CHRISTMAS!!! MERRY CHRISTMAS!!! ME"
|
|
|
|
merry_graphics:
|
|
.incbin "graphics/merry.hgr.zx02"
|
|
|
|
.include "vapor_lock.s"
|
|
.include "delay_a.s"
|
|
.include "draw_blocks.s"
|