134 lines
3.2 KiB
Plaintext
134 lines
3.2 KiB
Plaintext
_runtimePath_ "../runtime"
|
|
_runtimeStart_ &hFFFF
|
|
_codeRomType_ ROMv3
|
|
|
|
'move string work area for scrolling of text, (defaults to &h7FA0)
|
|
_stringWorkArea_ &h69A0
|
|
|
|
'defines the amount of contiguous RAM needed for sprite stripes, (in this case 15*6 + 1), min address and search direction
|
|
_spriteStripeChunks_ 15, &h16A0, ascending 'allocates from &h16A0 to _runtimeStart_
|
|
|
|
'alloc offscreen scrolling area, (<address>, <optional size>, <optional count>, <optional offset>), so that compiler does not try and use it
|
|
alloc &h6AA0, 96, 22, &h0100
|
|
|
|
'volume extinction function, (modelled in Desmos), used to control ADSR
|
|
const V_LUT=&h13A0
|
|
const V_SIZ=64
|
|
def byte(V_LUT, y, 0.0, 0.5, V_SIZ) = 63.0 - exp(-0.5*y)*(1.0-exp(-3.0*y))*1.6125*63.0
|
|
|
|
'frequency sweep
|
|
const F_LUT=&h13E0
|
|
const F_SIZ=16
|
|
def word(F_LUT, y, 0.0, 360.0, F_SIZ) = sin(y)*200.0 + 1000.0
|
|
|
|
module "BoingData64k.m"
|
|
|
|
'audio fix for ROMv5a
|
|
poke &h21, peek(&h21) OR 3
|
|
sound off
|
|
|
|
mode 2
|
|
set FGBG_COLOUR, &h3F15
|
|
cls
|
|
|
|
set FG_COLOUR, 0
|
|
rectf 0, 97, 159 + 96, 119 'clear text scrolling onscreen and offscreen area
|
|
|
|
'i and l = 6, m and w = 18, space = 6
|
|
'static initialisation of the array produces no code, always attempt this first
|
|
dim fontWidths(26) = 12, 12, 12, 12, 12, 12, 12, 12, 6, 12, 12, 6, 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18, 12, 12, 12, 6
|
|
|
|
const g = 4
|
|
f = boingStart : y = &h0100 : text = 160 : fstep = 1 : xstep = 100
|
|
x = 0 : ystep = x : scrl = ystep : char = scrl : stamp = char : width = stamp : quote = width : crash = quote : time = crash
|
|
|
|
loop:
|
|
wait
|
|
set SOUND_TIMER, 2
|
|
|
|
sprite noFlip, f, x.hi, y.hi
|
|
|
|
'boing frame
|
|
f = f + fstep
|
|
if f &&> boingStart + 13 then f = boingStart
|
|
if f &&< boingStart then f = boingStart + 13
|
|
|
|
'boing xpos
|
|
x = x + xstep
|
|
if x.hi &&> 111 'performs the following check if (x.hi > 111) or (x.hi < 0)
|
|
xstep = -xstep : x = xstep + x
|
|
fstep = -fstep
|
|
crash = 1
|
|
time = 0
|
|
endif
|
|
|
|
'boing ypos
|
|
ystep = ystep + g
|
|
y = y + ystep
|
|
if y.hi &> 56
|
|
y.hi = 56
|
|
ystep = -ystep
|
|
crash = 1
|
|
time = 0
|
|
endif
|
|
|
|
'collision sound
|
|
if crash &&= 1
|
|
gosub crashSound
|
|
endif
|
|
|
|
'print character one at a time offscreen
|
|
gosub printText
|
|
|
|
'scrolling text
|
|
poke &h01C5, scrl
|
|
inc scrl
|
|
goto loop
|
|
|
|
|
|
printText:
|
|
if stamp &&= 0
|
|
getChar:
|
|
c = peek(addr(quotes$(quote)) + 1 + char) '+1 to get past the length byte
|
|
inc char
|
|
|
|
if c &&= 0
|
|
char = 0
|
|
inc quote
|
|
if quote &&= 21
|
|
quote = 0
|
|
endif
|
|
goto getChar
|
|
elseif c &&= 32
|
|
c = 26
|
|
else
|
|
c = c - 97
|
|
endif
|
|
|
|
sprite noFlip, fontStart + c, text, 98
|
|
|
|
width = fontWidths(c)
|
|
text = text + width
|
|
endif
|
|
|
|
inc stamp
|
|
if stamp &&= width
|
|
stamp = 0
|
|
endif
|
|
return
|
|
|
|
crashSound:
|
|
volume = peek(V_LUT + (time AND (V_SIZ-1)))
|
|
freq = deek(F_LUT + ((time AND (F_SIZ-1)) LSL 1))
|
|
foffs = 0
|
|
for i=1 to 4
|
|
sound on, i, freq + foffs, volume, 0
|
|
foffs = foffs + 100
|
|
next i
|
|
|
|
inc time
|
|
if time &&= 64
|
|
time = 0 : crash = 0
|
|
endif
|
|
return
|