gigatron/rom/Contrib/at67/gbas/demos/Boing64k.gbas
2025-01-28 19:17:01 +03:00

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