358 lines
8.5 KiB
Plaintext
358 lines
8.5 KiB
Plaintext
|
var
|
||
|
|
||
|
long vsync_addr
|
||
|
long random_addr
|
||
|
long stack[40]
|
||
|
|
||
|
byte music
|
||
|
byte mute
|
||
|
byte amoeba
|
||
|
byte magic_wall
|
||
|
byte v1cnt, v1ctl
|
||
|
byte v2cnt, v2ctl
|
||
|
byte v3cnt, v3ctl
|
||
|
|
||
|
obj
|
||
|
|
||
|
sd : "SIDemu"
|
||
|
|
||
|
pub start(video_params, pin, rnd_addr)
|
||
|
|
||
|
vsync_addr := long[video_params + constant(6 * 4)]
|
||
|
random_addr := rnd_addr
|
||
|
|
||
|
v1cnt := 0
|
||
|
v2cnt := 0
|
||
|
v3cnt := 0
|
||
|
|
||
|
mute := false
|
||
|
music := false
|
||
|
amoeba := false
|
||
|
magic_wall := false
|
||
|
|
||
|
cognew(process, @stack)
|
||
|
|
||
|
sd.start(pin)
|
||
|
|
||
|
sd.set_register(23, $07) 'turn main volume half-up
|
||
|
|
||
|
pub music_on
|
||
|
|
||
|
v1cnt := 0
|
||
|
v2cnt := 0
|
||
|
v3cnt := 0
|
||
|
|
||
|
music_init
|
||
|
|
||
|
music := true
|
||
|
|
||
|
pub music_off
|
||
|
|
||
|
sd.set_register(4, sd#CREG_TRIANGLE) 'gate off
|
||
|
sd.set_register(11, sd#CREG_TRIANGLE) 'gate off
|
||
|
|
||
|
music := false
|
||
|
|
||
|
pub moving_sound(surface)
|
||
|
|
||
|
if mute
|
||
|
return
|
||
|
|
||
|
if surface == $00
|
||
|
sd.set_register(7, $00) 'freq
|
||
|
sd.set_register(8, $35)
|
||
|
else ' $01
|
||
|
sd.set_register(7, $00) 'freq
|
||
|
sd.set_register(8, $A5)
|
||
|
sd.set_register(12, $30) 'attack/decay
|
||
|
sd.set_register(13, $C0) 'sustain/release
|
||
|
sd.set_register(11, sd#CREG_NOISE | sd#CREG_GATE)
|
||
|
|
||
|
v2ctl := sd#CREG_NOISE
|
||
|
v2cnt := 2
|
||
|
|
||
|
pub boulder_sound
|
||
|
|
||
|
if mute
|
||
|
return
|
||
|
|
||
|
if v1cnt
|
||
|
return
|
||
|
|
||
|
sd.set_register(0, $32) 'freq
|
||
|
sd.set_register(1, $09)
|
||
|
sd.set_register(5, $00) 'attack/decay
|
||
|
sd.set_register(6, $F9) 'sustain/release
|
||
|
sd.set_register(4, sd#CREG_NOISE | sd#CREG_GATE)
|
||
|
|
||
|
v1ctl := sd#CREG_NOISE
|
||
|
v1cnt := 1
|
||
|
|
||
|
pub diamond_sound
|
||
|
|
||
|
if mute
|
||
|
return
|
||
|
|
||
|
if v1cnt
|
||
|
return
|
||
|
|
||
|
sd.set_register(0, byte[random_addr]) 'freq
|
||
|
sd.set_register(1, $86 + byte[random_addr] & $07)
|
||
|
sd.set_register(5, $00) 'attack/decay
|
||
|
sd.set_register(6, $F0) 'sustain/release
|
||
|
sd.set_register(4, sd#CREG_TRIANGLE | sd#CREG_GATE)
|
||
|
|
||
|
v1ctl := sd#CREG_TRIANGLE
|
||
|
v1cnt := 2
|
||
|
|
||
|
pub pick_sound
|
||
|
|
||
|
if mute
|
||
|
return
|
||
|
|
||
|
if v1cnt
|
||
|
return
|
||
|
|
||
|
sd.set_register(0, $78) 'freq
|
||
|
sd.set_register(1, $14)
|
||
|
sd.set_register(5, $00) 'attack/decay
|
||
|
sd.set_register(6, $F9) 'sustain/release
|
||
|
sd.set_register(4, sd#CREG_TRIANGLE | sd#CREG_GATE)
|
||
|
|
||
|
v1ctl := sd#CREG_TRIANGLE
|
||
|
v1cnt := 1
|
||
|
|
||
|
pub explosion_sound
|
||
|
|
||
|
if mute
|
||
|
return
|
||
|
|
||
|
if v1cnt
|
||
|
return
|
||
|
|
||
|
sd.set_register(0, $32) 'freq
|
||
|
sd.set_register(1, $14)
|
||
|
sd.set_register(5, $19) '$1D 'attack/decay
|
||
|
sd.set_register(6, $00) 'sustain/release
|
||
|
sd.set_register(4, sd#CREG_NOISE | sd#CREG_GATE)
|
||
|
|
||
|
v1ctl := sd#CREG_NOISE
|
||
|
v1cnt := 200
|
||
|
|
||
|
pub crack_sound
|
||
|
|
||
|
if mute
|
||
|
return
|
||
|
|
||
|
if v3cnt
|
||
|
return
|
||
|
|
||
|
sd.set_register(19, $19) 'attack/decay
|
||
|
sd.set_register(20, $01) 'sustain/release
|
||
|
sd.set_register(14, $32) 'freq
|
||
|
sd.set_register(15, $2F)
|
||
|
sd.set_register(18, sd#CREG_NOISE | sd#CREG_GATE)
|
||
|
|
||
|
v3ctl := sd#CREG_NOISE
|
||
|
v3cnt := 80
|
||
|
|
||
|
pub magic_wall_sound_on
|
||
|
|
||
|
if not magic_wall
|
||
|
magic_wall := true
|
||
|
sd.set_register(18, sd#CREG_TRIANGLE)
|
||
|
|
||
|
pub magic_wall_sound_off
|
||
|
|
||
|
if magic_wall
|
||
|
magic_wall := false
|
||
|
v3ctl := sd#CREG_TRIANGLE
|
||
|
v3cnt := 1
|
||
|
|
||
|
pub amoeba_sound_on
|
||
|
|
||
|
if not amoeba
|
||
|
amoeba := true
|
||
|
sd.set_register(18, sd#CREG_TRIANGLE)
|
||
|
|
||
|
pub amoeba_sound_off
|
||
|
|
||
|
if amoeba
|
||
|
amoeba := false
|
||
|
v3ctl := sd#CREG_TRIANGLE
|
||
|
v3cnt := 1
|
||
|
|
||
|
var
|
||
|
|
||
|
byte last_val
|
||
|
|
||
|
pub time_ending_sound(sec_left)
|
||
|
|
||
|
mute := true
|
||
|
|
||
|
if sec_left == last_val
|
||
|
return
|
||
|
|
||
|
last_val := sec_left
|
||
|
|
||
|
if sec_left == 0
|
||
|
mute := false
|
||
|
|
||
|
sd.set_register(4, sd#CREG_TRIANGLE)
|
||
|
waitcnt(clkfreq / 1000 + cnt)
|
||
|
|
||
|
sd.set_register(0, $00)
|
||
|
sd.set_register(1, $27 - sec_left)
|
||
|
sd.set_register(5, $0A) 'attack/decay
|
||
|
sd.set_register(6, $00) 'sustain/release
|
||
|
sd.set_register(4, sd#CREG_TRIANGLE | sd#CREG_GATE)
|
||
|
|
||
|
v1cnt := 0
|
||
|
|
||
|
pub bonus_point_sound(pts) | i
|
||
|
|
||
|
sd.set_register(5, $00) 'attack/decay
|
||
|
sd.set_register(6, $A0) 'sustain/release
|
||
|
sd.set_register(4, sd#CREG_TRIANGLE | sd#CREG_GATE)
|
||
|
repeat i from 2 to 30 step 2
|
||
|
sd.set_register(0, $00)
|
||
|
sd.set_register(1, $B0 - pts + i)
|
||
|
waitcnt(clkfreq / 500 + cnt)
|
||
|
sd.set_register(4, sd#CREG_TRIANGLE)
|
||
|
|
||
|
pub cover_sound
|
||
|
|
||
|
if v2cnt
|
||
|
return
|
||
|
|
||
|
sd.set_register(12, $05) 'attack/decay
|
||
|
sd.set_register(13, $00) 'sustain/release
|
||
|
sd.set_register(7, $00)
|
||
|
sd.set_register(8, $64 + byte[random_addr] & $7F) 'freq
|
||
|
sd.set_register(11, sd#CREG_TRIANGLE | sd#CREG_GATE)
|
||
|
|
||
|
v2ctl := sd#CREG_TRIANGLE
|
||
|
v2cnt := 1
|
||
|
|
||
|
pub process | r
|
||
|
|
||
|
repeat
|
||
|
|
||
|
'wait for vsync
|
||
|
repeat while byte[vsync_addr] == 0
|
||
|
repeat while byte[vsync_addr] <> 0
|
||
|
|
||
|
if music
|
||
|
play_note
|
||
|
|
||
|
if v1cnt
|
||
|
if --v1cnt == 0
|
||
|
sd.set_register(4, v1ctl)
|
||
|
|
||
|
if v2cnt
|
||
|
if --v2cnt == 0
|
||
|
sd.set_register(11, v2ctl)
|
||
|
|
||
|
if v3cnt
|
||
|
if --v3cnt == 0
|
||
|
sd.set_register(18, v3ctl)
|
||
|
|
||
|
if amoeba
|
||
|
if mute
|
||
|
sd.set_register(18, sd#CREG_TRIANGLE)
|
||
|
else
|
||
|
sd.set_register(19, $00) 'attack/decay
|
||
|
sd.set_register(20, $40) 'sustain/release
|
||
|
repeat
|
||
|
r := byte[random_addr] & $1F
|
||
|
while r < $07
|
||
|
sd.set_register(14, $00) 'freq
|
||
|
sd.set_register(15, r)
|
||
|
sd.set_register(18, sd#CREG_TRIANGLE | sd#CREG_GATE)
|
||
|
v3cnt := 2
|
||
|
|
||
|
elseif magic_wall
|
||
|
if mute
|
||
|
sd.set_register(18, sd#CREG_TRIANGLE)
|
||
|
else
|
||
|
sd.set_register(19, $00) 'attack/decay
|
||
|
sd.set_register(20, $A0) 'sustain/release
|
||
|
r := byte[random_addr] & $03
|
||
|
sd.set_register(14, $00) 'freq
|
||
|
sd.set_register(15, $86 + (r << 3))
|
||
|
sd.set_register(18, sd#CREG_TRIANGLE | sd#CREG_GATE)
|
||
|
v3cnt := 2
|
||
|
|
||
|
dat
|
||
|
|
||
|
notes
|
||
|
byte $16, $22, $1D, $26, $22, $29, $25, $2E, $14, $24, $1F, $27, $20, $29, $27, $30
|
||
|
byte $12, $2A, $12, $2C, $1E, $2E, $12, $31, $20, $2C, $33, $37, $21, $2D, $31, $35
|
||
|
byte $16, $22, $16, $2E, $16, $1D, $16, $24, $14, $20, $14, $30, $14, $24, $14, $20
|
||
|
byte $16, $22, $16, $2E, $16, $1D, $16, $24, $1E, $2A, $1E, $3A, $1E, $2E, $1E, $2A
|
||
|
byte $14, $20, $14, $2C, $14, $1B, $14, $22, $1C, $28, $1C, $38, $1C, $2C, $1C, $28
|
||
|
byte $11, $1D, $29, $2D, $11, $1F, $29, $2E, $0F, $27, $0F, $27, $16, $33, $16, $27
|
||
|
byte $16, $2E, $16, $2E, $16, $2E, $16, $2E, $22, $2E, $22, $2E, $16, $2E, $16, $2E
|
||
|
byte $14, $2E, $14, $2E, $14, $2E, $14, $2E, $20, $2E, $20, $2E, $14, $2E, $14, $2E
|
||
|
byte $16, $2E, $32, $2E, $16, $2E, $33, $2E, $22, $2E, $32, $2E, $16, $2E, $33, $2E
|
||
|
byte $14, $2E, $32, $2E, $14, $2E, $33, $2E, $20, $2C, $30, $2C, $14, $2C, $31, $2C
|
||
|
byte $16, $2E, $16, $3A, $16, $2E, $35, $38, $22, $2E, $22, $37, $16, $2E, $31, $35
|
||
|
byte $14, $2C, $14, $38, $14, $2C, $14, $38, $20, $2C, $20, $33, $14, $2C, $14, $38
|
||
|
byte $16, $2E, $32, $2E, $16, $2E, $33, $2E, $22, $2E, $32, $2E, $16, $2E, $33, $2E
|
||
|
byte $14, $2E, $32, $2E, $14, $2E, $33, $2E, $20, $2C, $30, $2C, $14, $2C, $31, $2C
|
||
|
byte $2E, $32, $29, $2E, $26, $29, $22, $26, $2C, $30, $27, $2C, $24, $27, $14, $20
|
||
|
byte $35, $32, $32, $2E, $2E, $29, $29, $26, $27, $30, $24, $2C, $20, $27, $14, $20
|
||
|
|
||
|
freqs
|
||
|
word $02DC, $030A, $033A, $036C, $03A0, $03D2, $0412, $044C
|
||
|
word $0492, $04D6, $0520, $056E, $05B8, $0614, $0674, $06D8
|
||
|
word $0740, $07A4, $0824, $0898, $0924, $09AC, $0A40, $0ADC
|
||
|
word $0B70, $0C28, $0CE8, $0DB0, $0E80, $0F48, $1048, $1130
|
||
|
word $1248, $1358, $1480, $15B8, $16E0, $1850, $19D0, $1B60
|
||
|
word $1D00, $1E90, $2090, $2260, $2490, $26B0, $2900, $2B70
|
||
|
word $2DC0, $0100, $0200, $0101, $0105, $0100, $0101, $0306
|
||
|
word $0101, $0102, $0101
|
||
|
|
||
|
var
|
||
|
|
||
|
long note
|
||
|
byte v1sr
|
||
|
|
||
|
pri music_init
|
||
|
|
||
|
note := 0
|
||
|
v1sr := $B0
|
||
|
|
||
|
sd.set_register(4, sd#CREG_TRIANGLE)
|
||
|
sd.set_register(5, $4F)
|
||
|
sd.set_register(6, $00)
|
||
|
|
||
|
sd.set_register(11, sd#CREG_TRIANGLE)
|
||
|
sd.set_register(12, $24) '$78)
|
||
|
sd.set_register(13, $75) '$78)
|
||
|
|
||
|
pub play_note | n, f
|
||
|
|
||
|
if v1sr == $B0
|
||
|
sd.set_register(4, sd#CREG_TRIANGLE)
|
||
|
sd.set_register(11, sd#CREG_TRIANGLE)
|
||
|
n := notes.byte[note++]
|
||
|
f := word[@freqs + 2*n - $14]
|
||
|
sd.set_register(0, f & $FF)
|
||
|
sd.set_register(1, f >> 8)
|
||
|
n := notes.byte[note++]
|
||
|
f := word[@freqs + 2*n - $14]
|
||
|
sd.set_register(7, f & $FF)
|
||
|
sd.set_register(8, f >> 8)
|
||
|
v1sr := $A0
|
||
|
return
|
||
|
|
||
|
if note == 256
|
||
|
note := 0
|
||
|
sd.set_register(6, v1sr | $01)
|
||
|
sd.set_register(4, sd#CREG_TRIANGLE | sd#CREG_GATE)
|
||
|
sd.set_register(11, sd#CREG_TRIANGLE | sd#CREG_GATE)
|
||
|
v1sr -= $10
|
||
|
if v1sr < $40
|
||
|
v1sr := $B0
|
||
|
|