79 lines
3.8 KiB
C
79 lines
3.8 KiB
C
// helloSample.c - Phase 2.4 docram demo. Stages a small sine-wave
|
|
// sample from caller RAM into the Ensoniq DOC's audio RAM via
|
|
// iigsLoadDocSample(), then triggers playback via iigsPlayDocSample().
|
|
//
|
|
// Exercises the full WriteRamBlock -> FFStartSound path that was
|
|
// previously unwrapped. The marker store at $70 confirms control
|
|
// returned from WriteRamBlock cleanly (the toolbox call has no error
|
|
// return; a hang or stack imbalance would prevent the store).
|
|
//
|
|
// Build with: bash demos/build.sh helloSample
|
|
// Run with: bash scripts/runViaFinder.sh demos/helloSample.omf \
|
|
// --check 0x70=0x99
|
|
//
|
|
// Audio output: a brief sine-wave tone on generator 0. Headless runs
|
|
// will only verify the marker; an interactive run will hear the tone.
|
|
|
|
#include "iigs/sound.h"
|
|
|
|
// 256-byte (one DOC RAM page) signed-8-bit sine wave at full
|
|
// amplitude. Pre-computed at build time to keep the demo standalone
|
|
// (no soft-float dependency just for sin()). Each entry is
|
|
// sin(2*pi*i/256) * 127, rounded to the nearest signed-byte.
|
|
static const signed char gSineWave[256] = {
|
|
0, 3, 6, 9, 12, 15, 18, 21, 24, 28,
|
|
31, 34, 37, 40, 43, 46, 48, 51, 54, 57,
|
|
60, 63, 65, 68, 71, 73, 76, 78, 81, 83,
|
|
85, 88, 90, 92, 94, 96, 98, 100, 102, 104,
|
|
106, 107, 109, 111, 112, 113, 115, 116, 117, 118,
|
|
120, 121, 122, 122, 123, 124, 125, 125, 126, 126,
|
|
126, 127, 127, 127, 127, 127, 127, 127, 126, 126,
|
|
126, 125, 125, 124, 123, 122, 122, 121, 120, 118,
|
|
117, 116, 115, 113, 112, 111, 109, 107, 106, 104,
|
|
102, 100, 98, 96, 94, 92, 90, 88, 85, 83,
|
|
81, 78, 76, 73, 71, 68, 65, 63, 60, 57,
|
|
54, 51, 48, 46, 43, 40, 37, 34, 31, 28,
|
|
24, 21, 18, 15, 12, 9, 6, 3,
|
|
0, -3, -6, -9, -12, -15, -18, -21, -24, -28,
|
|
-31, -34, -37, -40, -43, -46, -48, -51, -54, -57,
|
|
-60, -63, -65, -68, -71, -73, -76, -78, -81, -83,
|
|
-85, -88, -90, -92, -94, -96, -98, -100, -102, -104,
|
|
-106, -107, -109, -111, -112, -113, -115, -116, -117, -118,
|
|
-120, -121, -122, -122, -123, -124, -125, -125, -126, -126,
|
|
-126, -127, -127, -127, -127, -127, -127, -127, -126, -126,
|
|
-126, -125, -125, -124, -123, -122, -122, -121, -120, -118,
|
|
-117, -116, -115, -113, -112, -111, -109, -107, -106, -104,
|
|
-102, -100, -98, -96, -94, -92, -90, -88, -85, -83,
|
|
-81, -78, -76, -73, -71, -68, -65, -63, -60, -57,
|
|
-54, -51, -48, -46, -43, -40, -37, -34, -31, -28,
|
|
-24, -21, -18, -15, -12, -9, -6, -3
|
|
};
|
|
|
|
|
|
int main(void) {
|
|
// SoundManager comes up via Finder's app-launch chain; the
|
|
// tool-reference-count idempotent call still re-arms it just in
|
|
// case (and is required for bare-metal-run scenarios where Finder
|
|
// is bypassed).
|
|
iigsSoundProbeInit();
|
|
|
|
// Stage the 256-byte (1 page) sine wave to DOC RAM at offset 0.
|
|
iigsLoadDocSample(gSineWave, sizeof(gSineWave), 0);
|
|
|
|
// Marker AFTER WriteRamBlock returns - proves the toolbox call
|
|
// didn't hang or imbalance the stack. The audio path past this
|
|
// point is verified by ear (or by reading $E1:8000 DOC registers
|
|
// in a more thorough probe; out of scope for this smoke).
|
|
*(volatile unsigned char *)0x70 = 0x99;
|
|
|
|
// Play on generator 0 at unit pitch (freqOffset = 0x0100 is the
|
|
// natural sample rate for a 1-page wave), full volume.
|
|
iigsPlayDocSample((void *)0, 1, 0x0100, 0xFF, 0);
|
|
|
|
// Linger long enough for the tone to play + the headless harness
|
|
// to snapshot the marker.
|
|
for (volatile unsigned long s = 0; s < 600000UL; s++) { }
|
|
|
|
iigsSoundStop(0xFF);
|
|
return 0;
|
|
}
|