From 7a52ce4e4caac4497f3b4c6fe660af1a809436e6 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Mon, 18 Apr 2022 16:40:16 +0200 Subject: [PATCH] implement custom base address for GES --- examples/curlywas/tim_ges.cwa | 1 + platform/bin/platform.uw8 | Bin 3656 -> 3685 bytes platform/src/ges.cwa | 69 +++++++++++++++++----------------- platform/src/platform.cwa | 4 ++ site/content/docs.md | 7 +++- src/run-web.html | 2 +- 6 files changed, 46 insertions(+), 37 deletions(-) diff --git a/examples/curlywas/tim_ges.cwa b/examples/curlywas/tim_ges.cwa index c8a9e0e..d44ada8 100644 --- a/examples/curlywas/tim_ges.cwa +++ b/examples/curlywas/tim_ges.cwa @@ -55,6 +55,7 @@ data 80 { include "../../platform/src/ges.cwa" import "env.pow" fn pow(f32, f32) -> f32; +import "env.exp" fn exp(f32) -> f32; import "env.sin" fn sin(f32) -> f32; export fn snd(t: i32) -> f32 { diff --git a/platform/bin/platform.uw8 b/platform/bin/platform.uw8 index 1d57bdca63cf300e1d39084b48216faab7cea2fb..ed7a546a7d8ca90e28222b64558054af97461279 100644 GIT binary patch literal 3685 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 a$5w@_u!RQw;7>X*Hay_5A6kvWDqv^#u^`j{ diff --git a/platform/src/ges.cwa b/platform/src/ges.cwa index b10f362..dc97114 100644 --- a/platform/src/ges.cwa +++ b/platform/src/ges.cwa @@ -7,21 +7,22 @@ const GesChannelState.Size = 8; const GesState.Filter = GesChannelState.Size * 4; const GesState.Size = GesState.Filter + 8*4; -const GesStateOffset = 112; -const GesBufferOffset = 112 + GesState.Size; +const GesStateOffset = 32; +const GesBufferOffset = 32 + GesState.Size; export fn gesSnd(t: i32) -> f32 { + let baseAddr = 0!0x12c78; if !(t & 127) { let i: i32; loop clearLoop { - i!GesBufferOffset = 0; + (baseAddr + i)!GesBufferOffset = 0; branch_if (i := i + 4) < 128*8: clearLoop; } let ch: i32; loop channelLoop { - let lazy channelState = GesStateOffset + ch * GesChannelState.Size; - let lazy channelReg = 80 + ch * 6; + let lazy channelState = baseAddr + GesStateOffset + ch * GesChannelState.Size; + let lazy channelReg = baseAddr + ch * 6; let envState = channelState?GesChannelState.EnvState; let envVol = i32.load16_u(channelState, GesChannelState.EnvVol); @@ -77,7 +78,7 @@ export fn gesSnd(t: i32) -> f32 { let saw2 = saw2 - polyBlep((p - pulsePhase1) >> 16, invPhaseInc, -saw) - polyBlep((p - pulsePhase2) >> 16, invPhaseInc, saw); - i!(GesBufferOffset + 128*4) = saw2; + (baseAddr + i)!(GesBufferOffset + 128*4) = saw2; phase = phase + phaseInc; branch_if (i := i + 4) < 64*4: sawLoop; } @@ -86,7 +87,7 @@ export fn gesSnd(t: i32) -> f32 { { let pulsePhase = 32768 + pulseWidth * 128; loop rectLoop { - i!(GesBufferOffset + 128*4) = select((phase & 65535) < pulsePhase, -32768, 32767) - + (baseAddr + i)!(GesBufferOffset + 128*4) = select((phase & 65535) < pulsePhase, -32768, 32767) - polyBlep(phase, invPhaseInc, -32767) - polyBlep(phase - pulsePhase, invPhaseInc, 32767); phase = phase + phaseInc; @@ -101,7 +102,7 @@ export fn gesSnd(t: i32) -> f32 { s = (s ^ (s >> 31)); s = (s >> 8) * scale; s = (s ^ (s >> 31)); - i!(GesBufferOffset + 128*4) = (s >> 15) - 32768; + (baseAddr + i)!(GesBufferOffset + 128*4) = (s >> 15) - 32768; phase = phase + phaseInc; branch_if (i := i + 4) < 64*4: triLoop; } @@ -111,7 +112,7 @@ export fn gesSnd(t: i32) -> f32 { let inline pulse = ((phase >> 8) & 255) >= pulseWidth; s = s * 0x6746ba73; s = s ^ (s >> 15) * pulse; - i!(GesBufferOffset + 128*4) = (s * 0x835776c7) >> 16; + (baseAddr + i)!(GesBufferOffset + 128*4) = (s * 0x835776c7) >> 16; phase = phase + phaseInc; branch_if (i := i + 4) < 64*4: noiseLoop; } @@ -122,8 +123,8 @@ export fn gesSnd(t: i32) -> f32 { if ctrl & 32 { let lazy modSrc = (ch - 1) & 3; - let inline channelState = GesStateOffset + modSrc * GesChannelState.Size; - let inline channelReg = 80 + modSrc * 6; + let inline channelState = baseAddr + GesStateOffset + modSrc * GesChannelState.Size; + let inline channelReg = baseAddr + modSrc * 6; let inline note = i32.load16_u(channelReg, 2); let inline freq = 440 as f32 * pow(2.0, (note - 69*256) as f32 / (12*256) as f32); @@ -138,13 +139,13 @@ export fn gesSnd(t: i32) -> f32 { loop ringLoop { let s = phase << 16; s = (s ^ (s >> 31)); - i!(GesBufferOffset + 128*4) = (i!(GesBufferOffset + 128*4) * ((s >> 15) - 32768)) >> 15; + (baseAddr + i)!(GesBufferOffset + 128*4) = ((baseAddr + i)!(GesBufferOffset + 128*4) * ((s >> 15) - 32768)) >> 15; phase = phase + phaseInc; branch_if (i := i + 4) < 64*4: ringLoop; } } - let channelVol = ((ch >> 1)?0x68 >> ((ch & 1) * 4)) & 15; + let channelVol = ((baseAddr + (ch >> 1))?24 >> ((ch & 1) * 4)) & 15; envVol = envVol * channelVol / 15; let leftVol = (select(ctrl & 16, 0x3d5b, 0x6a79) >> (ch * 4)) & 15; @@ -156,30 +157,30 @@ export fn gesSnd(t: i32) -> f32 { if filter < 2 { if filter { let f = (4096 as f32 - min(4096 as f32, 4096 as f32 * exp(freq * (-8.0 * 3.141 / 44100.0)))) as i32; - let low = (ch * 8)!(GesStateOffset + GesState.Filter); + let low = (baseAddr + ch * 8)!(GesStateOffset + GesState.Filter); loop filterLoop { - let in = (i!(GesBufferOffset + 128*4) * envVol) >> 18; + let in = ((baseAddr + i)!(GesBufferOffset + 128*4) * envVol) >> 18; low = low + (((in - low) * f) >> 12); - (i * 2)!GesBufferOffset = (i * 2)!GesBufferOffset + ((low * leftVol) >> 4); - (i * 2)!(GesBufferOffset + 4) = (i * 2)!(GesBufferOffset + 4) + ((low * rightVol) >> 4); + (baseAddr + i * 2)!GesBufferOffset = (baseAddr + i * 2)!GesBufferOffset + ((low * leftVol) >> 4); + (baseAddr + i * 2)!(GesBufferOffset + 4) = (baseAddr + i * 2)!(GesBufferOffset + 4) + ((low * rightVol) >> 4); branch_if (i := i + 4) < 64*4: filterLoop; - (ch * 8)!(GesStateOffset + GesState.Filter) = low; - (ch * 8)!(GesStateOffset + GesState.Filter + 4) = 0; + (baseAddr + ch * 8)!(GesStateOffset + GesState.Filter) = low; + (baseAddr + ch * 8)!(GesStateOffset + GesState.Filter + 4) = 0; } } else { loop mixLoop { - let sample = (i!(GesBufferOffset + 128*4) * envVol) >> 18; - (i * 2)!GesBufferOffset = (i * 2)!GesBufferOffset + ((sample * leftVol) >> 4); - (i * 2)!(GesBufferOffset + 4) = (i * 2)!(GesBufferOffset + 4) + ((sample * rightVol) >> 4); + let sample = ((baseAddr + i)!(GesBufferOffset + 128*4) * envVol) >> 18; + (baseAddr + i * 2)!GesBufferOffset = (baseAddr + i * 2)!GesBufferOffset + ((sample * leftVol) >> 4); + (baseAddr + i * 2)!(GesBufferOffset + 4) = (baseAddr + i * 2)!(GesBufferOffset + 4) + ((sample * rightVol) >> 4); branch_if (i := i + 4) < 64*4: mixLoop; - (ch * 8)!(GesStateOffset + GesState.Filter) = sample; - (ch * 8)!(GesStateOffset + GesState.Filter + 4) = 0; + (baseAddr + ch * 8)!(GesStateOffset + GesState.Filter) = sample; + (baseAddr + ch * 8)!(GesStateOffset + GesState.Filter + 4) = 0; } } } else { filter = filter - 2; - let ctrl = filter?0x6a; - let note = i32.load16_u(filter * 2, 0x6c); + let ctrl = (baseAddr + filter)?26; + let note = i32.load16_u(baseAddr + filter * 2, 28); let inline freq = 440 as f32 * pow(2.0, (note - 69*256) as f32 / (12*256) as f32); let F = (8192 as f32 * sin(min(0.25, freq / 44100 as f32) * 3.1415)) as i32; let Q = 8192 - (ctrl >> 4) * (7000/15); @@ -190,28 +191,28 @@ export fn gesSnd(t: i32) -> f32 { let low_out = ctrl & 1; let high_out = (ctrl >> 1) & 1; let band_out = (ctrl >> 2) & 1; - let low = (ch * 8)!(GesStateOffset + GesState.Filter); - let band = (ch * 8)!(GesStateOffset + GesState.Filter + 4); + let low = (baseAddr + ch * 8)!(GesStateOffset + GesState.Filter); + let band = (baseAddr + ch * 8)!(GesStateOffset + GesState.Filter + 4); loop filterLoop { - let in = (i!(GesBufferOffset + 128*4) * envVol) >> 18; + let in = ((baseAddr + i)!(GesBufferOffset + 128*4) * envVol) >> 18; let high = in - low - ((band * Q) >> 12); band = band + ((F * high) >> 12); low = low + ((F * band) >> 12); let sample = low * low_out + high * high_out + band * band_out; - (i * 2)!GesBufferOffset = (i * 2)!GesBufferOffset + ((sample * leftVol) >> 4); - (i * 2)!(GesBufferOffset + 4) = (i * 2)!(GesBufferOffset + 4) + ((sample * rightVol) >> 4); + (baseAddr + i * 2)!GesBufferOffset = (baseAddr + i * 2)!GesBufferOffset + ((sample * leftVol) >> 4); + (baseAddr + i * 2)!(GesBufferOffset + 4) = (baseAddr + i * 2)!(GesBufferOffset + 4) + ((sample * rightVol) >> 4); branch_if (i := i + 4) < 64*4: filterLoop; - (ch * 8)!(GesStateOffset + GesState.Filter) = low; - (ch * 8)!(GesStateOffset + GesState.Filter + 4) = band; + (baseAddr + ch * 8)!(GesStateOffset + GesState.Filter) = low; + (baseAddr + ch * 8)!(GesStateOffset + GesState.Filter + 4) = band; } } branch_if (ch := ch + 1) < 4: channelLoop; } } - (((t & 127) * 4)!GesBufferOffset) as f32 / 32768 as f32 + ((baseAddr + (t & 127) * 4)!GesBufferOffset) as f32 / 32768 as f32 } fn polyBlep(transientPhase: i32, invPhaseInc: f32, magnitude: i32) -> i32 { diff --git a/platform/src/platform.cwa b/platform/src/platform.cwa index 9b14afe..69e683e 100644 --- a/platform/src/platform.cwa +++ b/platform/src/platform.cwa @@ -576,6 +576,10 @@ data 80 { ) } +data 0x12c78 { + i32(80) +} + data 0x13000+192*4 { i32( 0x2c1c1a, diff --git a/site/content/docs.md b/site/content/docs.md index fdd3df0..f2cbec0 100644 --- a/site/content/docs.md +++ b/site/content/docs.md @@ -19,10 +19,13 @@ The memory has to be imported as `env` `memory` and has a maximum size of 256kb 00040-00044: time since module start in ms 00044-0004c: gamepad state 0004c-00050: reserved -00050-00070: sound registers +00050-00070: sound data (synced to sound thread) 00070-00078: reserved 00078-12c78: frame buffer -12c78-13000: reserved +12c78-12c7c: sound registers/work area base address (for sndGes function) +12c7c-12c80: reserved +12c80-12ca0: sound data (synced from sound thread) +12ca0-13000: reserved 13000-13400: palette 13400-13c00: font 13c00-14000: reserved diff --git a/src/run-web.html b/src/run-web.html index c8c4956..2a07e98 100644 --- a/src/run-web.html +++ b/src/run-web.html @@ -1 +1 @@ -uw8-run
\ No newline at end of file +uw8-run
\ No newline at end of file