@modplayjs/fmt-sid 0.0.0-stage → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +111 -2
  2. package/dist/c64.d.ts +8 -0
  3. package/dist/c64.d.ts.map +1 -0
  4. package/dist/c64.js +325 -0
  5. package/dist/c64.js.map +1 -0
  6. package/dist/c64types.d.ts +209 -0
  7. package/dist/c64types.d.ts.map +1 -0
  8. package/dist/c64types.js +181 -0
  9. package/dist/c64types.js.map +1 -0
  10. package/dist/cia.d.ts +19 -0
  11. package/dist/cia.d.ts.map +1 -0
  12. package/dist/cia.js +160 -0
  13. package/dist/cia.js.map +1 -0
  14. package/dist/combiwaves.d.ts +9 -0
  15. package/dist/combiwaves.d.ts.map +1 -0
  16. package/dist/combiwaves.js +533 -0
  17. package/dist/combiwaves.js.map +1 -0
  18. package/dist/config.d.ts +15 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +23 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/cpu.d.ts +12 -0
  23. package/dist/cpu.d.ts.map +1 -0
  24. package/dist/cpu.js +848 -0
  25. package/dist/cpu.js.map +1 -0
  26. package/dist/filtercurves.d.ts +13 -0
  27. package/dist/filtercurves.d.ts.map +1 -0
  28. package/dist/filtercurves.js +546 -0
  29. package/dist/filtercurves.js.map +1 -0
  30. package/dist/host.d.ts +4 -0
  31. package/dist/host.d.ts.map +1 -0
  32. package/dist/host.js +14 -0
  33. package/dist/host.js.map +1 -0
  34. package/dist/index.d.ts +7 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +36 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/instance.d.ts +119 -0
  39. package/dist/instance.d.ts.map +1 -0
  40. package/dist/instance.js +51 -0
  41. package/dist/instance.js.map +1 -0
  42. package/dist/loader.d.ts +26 -0
  43. package/dist/loader.d.ts.map +1 -0
  44. package/dist/loader.js +383 -0
  45. package/dist/loader.js.map +1 -0
  46. package/dist/mem.d.ts +30 -0
  47. package/dist/mem.d.ts.map +1 -0
  48. package/dist/mem.js +187 -0
  49. package/dist/mem.js.map +1 -0
  50. package/dist/psiddigi.d.ts +3 -0
  51. package/dist/psiddigi.d.ts.map +1 -0
  52. package/dist/psiddigi.js +73 -0
  53. package/dist/psiddigi.js.map +1 -0
  54. package/dist/settings.d.ts +41 -0
  55. package/dist/settings.d.ts.map +1 -0
  56. package/dist/settings.js +64 -0
  57. package/dist/settings.js.map +1 -0
  58. package/dist/sid.d.ts +21 -0
  59. package/dist/sid.d.ts.map +1 -0
  60. package/dist/sid.js +78 -0
  61. package/dist/sid.js.map +1 -0
  62. package/dist/sidadsr.d.ts +9 -0
  63. package/dist/sidadsr.d.ts.map +1 -0
  64. package/dist/sidadsr.js +105 -0
  65. package/dist/sidadsr.js.map +1 -0
  66. package/dist/sidoscwaves.d.ts +15 -0
  67. package/dist/sidoscwaves.d.ts.map +1 -0
  68. package/dist/sidoscwaves.js +475 -0
  69. package/dist/sidoscwaves.js.map +1 -0
  70. package/dist/sidoutputs.d.ts +17 -0
  71. package/dist/sidoutputs.d.ts.map +1 -0
  72. package/dist/sidoutputs.js +185 -0
  73. package/dist/sidoutputs.js.map +1 -0
  74. package/dist/sidplugin.d.ts +18 -0
  75. package/dist/sidplugin.d.ts.map +1 -0
  76. package/dist/sidplugin.js +174 -0
  77. package/dist/sidplugin.js.map +1 -0
  78. package/dist/sidrouting.d.ts +8 -0
  79. package/dist/sidrouting.d.ts.map +1 -0
  80. package/dist/sidrouting.js +560 -0
  81. package/dist/sidrouting.js.map +1 -0
  82. package/dist/sidseek.d.ts +8 -0
  83. package/dist/sidseek.d.ts.map +1 -0
  84. package/dist/sidseek.js +60 -0
  85. package/dist/sidseek.js.map +1 -0
  86. package/dist/sincwindow.d.ts +3 -0
  87. package/dist/sincwindow.d.ts.map +1 -0
  88. package/dist/sincwindow.js +78 -0
  89. package/dist/sincwindow.js.map +1 -0
  90. package/dist/songlengths.d.ts +20 -0
  91. package/dist/songlengths.d.ts.map +1 -0
  92. package/dist/songlengths.js +81 -0
  93. package/dist/songlengths.js.map +1 -0
  94. package/dist/vic.d.ts +14 -0
  95. package/dist/vic.d.ts.map +1 -0
  96. package/dist/vic.js +63 -0
  97. package/dist/vic.js.map +1 -0
  98. package/package.json +48 -4
package/dist/loader.js ADDED
@@ -0,0 +1,383 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: cRSID 1.58 libcRSID/host/file.c (cRSID_processSIDfileData)
4
+ // and libcRSID/libcRSID.c (cRSID_init / cRSID_initSIDtune / sample
5
+ // generation entry).
6
+ // (c) Hermit (Mihaly Horvath), license: WTF ("do what the frick you want").
7
+ //
8
+ // cRSID_processSIDfileData in C reads the header through a struct overlaid
9
+ // on the raw file bytes (big-endian multi-byte fields on a little-endian
10
+ // host are read byte-wise via LoadAddressH/L etc.). The TS port decodes the
11
+ // big-endian byte layout explicitly into a CRSIDheader, then runs the same
12
+ // processing steps.
13
+ import { cRSID, cRSID_C64 } from './instance.js';
14
+ import { CRSID_FILEVERSION_WEBSID, CRSID_SECONDS_PER_MINUTE } from './host.js';
15
+ import { cRSID_setC64, cRSID_initC64, cRSID_emulateC64 } from './c64.js';
16
+ import { cRSID_playPSIDdigi } from './psiddigi.js';
17
+ import { cRSID_initCPU, cRSID_emulateCPU } from './cpu.js';
18
+ import { cRSID_readMem } from './mem.js';
19
+ // ---------------------------------------------------------------------------
20
+ // Header decode (host/file.c struct-overlay → explicit BE decoding)
21
+ // ---------------------------------------------------------------------------
22
+ /** Decode the PSID/RSID header from raw file bytes (libcRSID.h:10-56 layout).
23
+ * Strings are using 1252 codepage per the spec — decoded latin1 here. */
24
+ export function cRSID_decodeSIDheader(filedata) {
25
+ const be16 = (o) => (filedata[o] << 8) | filedata[o + 1];
26
+ const magic = String.fromCharCode(filedata[0], filedata[1], filedata[2], filedata[3]);
27
+ const version = filedata[5];
28
+ const headerSize = filedata[7];
29
+ return {
30
+ MagicString: magic,
31
+ Version: version,
32
+ HeaderSize: headerSize,
33
+ LoadAddress: be16(8), // if 0 it's a PRG and its loadaddress is used
34
+ InitAddress: be16(10), // if 0 it's taken from load-address (but should be set)
35
+ PlayAddress: be16(12), // if 0 play-routine-call is set by the initializer
36
+ SubtuneAmount: be16(14), // 1..256
37
+ DefaultSubtune: filedata[17], // 1..256 (optional, defaults to 1)
38
+ SubtuneTimeSources: ((filedata[0x12] << 24) | (filedata[0x13] << 16) | (filedata[0x14] << 8) | filedata[0x15]) >>> 0,
39
+ Title: latin1(filedata, 0x16, 32),
40
+ Author: latin1(filedata, 0x36, 32),
41
+ ReleaseInfo: latin1(filedata, 0x56, 32),
42
+ ModelFormatStandardH: filedata[0x76],
43
+ ModelFormatStandard: filedata[0x77],
44
+ RelocStartPage: filedata[0x78],
45
+ RelocFreePages: filedata[0x79],
46
+ SID2baseAddress: filedata[0x7a],
47
+ SID3baseAddress: filedata[0x7b],
48
+ SID2flagsH: filedata[0x7a],
49
+ SID2flagsL: filedata[0x7b],
50
+ SID3flagsH: filedata[0x7c],
51
+ SID3flagsL: filedata[0x7d],
52
+ SID4baseAddress: filedata[0x7e],
53
+ SID4flagsL: filedata[0x7f],
54
+ };
55
+ }
56
+ function latin1(b, o, n) {
57
+ let s = '';
58
+ for (let i = 0; i < n; ++i) {
59
+ const c = b[o + i];
60
+ if (c === 0)
61
+ break; // C char[] printed via %s stops at NUL
62
+ s += String.fromCharCode(c);
63
+ }
64
+ return s;
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // cRSID_processSIDfileData (host/file.c:141-185)
68
+ // ---------------------------------------------------------------------------
69
+ export function cRSID_processSIDfileData(filedata, filesize) {
70
+ let i;
71
+ let SIDdataOffset;
72
+ const MagicStringPSID = 'PSID';
73
+ const header = cRSID_decodeSIDheader(filedata);
74
+ cRSID.SIDheader = header;
75
+ // copy KERNAL & BASIC ROM contents into the RAM under them? (So PSIDs that
76
+ // don't select bank correctly will work better.)
77
+ for (i = 0xa000; i < 0x10000; ++i)
78
+ cRSID_C64.RAMbank[i] = cRSID_C64.ROMbanks[i];
79
+ for (i = 0x0000; i < 0xa000; ++i)
80
+ cRSID_C64.RAMbank[i] = 0; // fresh start (maybe some bugged SIDs want 0 at certain RAM-locations)
81
+ for (i = 0xc000; i < 0xd000; ++i)
82
+ cRSID_C64.RAMbank[i] = 0;
83
+ const m = header.MagicString;
84
+ if (m[0] !== 'P' && m[0] !== 'R')
85
+ return null;
86
+ for (i = 1; i < MagicStringPSID.length; ++i) {
87
+ if (m[i] !== MagicStringPSID[i])
88
+ return null;
89
+ }
90
+ cRSID.RealSIDmode = m[0] === 'R' ? 1 : 0;
91
+ cRSID_C64.RealSIDmode = cRSID.RealSIDmode; // update shadowed copy used by the audio thread (sound-thread shouldn't run at this moment)
92
+ if (header.LoadAddress === 0) {
93
+ // load-address taken from first 2 bytes of the C64 PRG
94
+ cRSID.LoadAddress = ((filedata[header.HeaderSize + 1] << 8) + filedata[header.HeaderSize + 0]) >>> 0;
95
+ SIDdataOffset = header.HeaderSize + 2;
96
+ }
97
+ else {
98
+ // load-adress taken from SID-header
99
+ cRSID.LoadAddress = header.LoadAddress;
100
+ SIDdataOffset = header.HeaderSize;
101
+ }
102
+ // Used by subtune-playback too after first init, so tunes that modify
103
+ // memory can start with a freshly loaded data:
104
+ for (i = SIDdataOffset; i < filesize; ++i) {
105
+ cRSID_C64.RAMbank[(cRSID.LoadAddress + (i - SIDdataOffset)) & 0xffff] = filedata[i];
106
+ }
107
+ i = (cRSID.LoadAddress + (filesize - SIDdataOffset)) & 0x1ffff; // (C: plain int math, clamped below)
108
+ cRSID.EndAddress = i < 0x10000 ? i : 0xffff;
109
+ cRSID.PSIDdigiMode = (!cRSID.RealSIDmode && (header.ModelFormatStandard & 2)) === 1 ? 1 : 0;
110
+ // cRSID_getPlaylengths (host/file.c:37-79): only active when
111
+ // cRSID.SongLengths != NULL, which the TS port never sets (no MD5
112
+ // song-length database support) — the loop below is the direct equivalent
113
+ // of the C fallback-fill that runs after it.
114
+ if (cRSID.FallbackPlayTime > 0) {
115
+ for (i = 0; i <= 256; ++i) {
116
+ if (cRSID.SubtuneDurations[i] <= 0)
117
+ cRSID.SubtuneDurations[i] = cRSID.FallbackPlayTime;
118
+ }
119
+ }
120
+ return cRSID.SIDheader;
121
+ }
122
+ // ---------------------------------------------------------------------------
123
+ // cRSID_init (libcRSID.c:35-67) — init emulation objects; the host-sound
124
+ // call (cRSID_initSound, CRSID_PLATFORM_PC only) is out of scope, matching
125
+ // the embedded build path where `buflen` only silences an unused-param
126
+ // warning. PlaySID-compat defaults from cRSID_init.
127
+ // ---------------------------------------------------------------------------
128
+ export function cRSID_init(samplerate, buflen) {
129
+ cRSID.RealSIDmode = 1;
130
+ cRSID.Stereo = 0 /* CRSID_CHANNELMODE_MONO */;
131
+ cRSID.HighQualitySID = 1;
132
+ cRSID.HighQualityResampler = 0; // was problematic (noisy) with lowpass-filtered triangles on all SID-channels
133
+ cRSID_C64.RealSIDmode = cRSID.RealSIDmode;
134
+ cRSID_C64.Stereo = cRSID.Stereo; // init shadow-variables to defaults for audio-thread as well
135
+ cRSID_C64.HighQualitySID = cRSID.HighQualitySID;
136
+ cRSID_C64.HighQualityResampler = cRSID.HighQualityResampler;
137
+ cRSID.SelectedSIDmodel = 0; // default model and mode selections
138
+ cRSID.PlaybackSpeed = 1;
139
+ cRSID.MainVolume = 255; // 230;
140
+ cRSID.CLImode = 0;
141
+ cRSID.AutoExit = cRSID.BuiltInMusic = cRSID.BuiltInMusicSize = 0;
142
+ cRSID.BuiltInMusicData = null;
143
+ cRSID.OpenedMusic = 0;
144
+ cRSID.AutoAdvance = cRSID.FadeOut = 1;
145
+ cRSID_C64.FadeLevel = 0xf;
146
+ cRSID.PlayListSize = 0;
147
+ cRSID.PlayListNumber = 1;
148
+ cRSID.PlayListPlayPosition = cRSID.PlayListAdvance = 0;
149
+ cRSID.SongLengths = null;
150
+ cRSID.KERNALfileData = null;
151
+ cRSID.BASICfileData = null;
152
+ cRSID_setCallBack__autoAdvance(dummyCallBack, null); // to prevent segfault if not assigned by user
153
+ cRSID_createC64(cRSID_C64, samplerate);
154
+ if (buflen)
155
+ return cRSID_C64; // this is here just to eliminate unused 'buflen' variable warning
156
+ return cRSID_C64;
157
+ }
158
+ function dummyCallBack(_subtunestepping, _data) {
159
+ return;
160
+ }
161
+ export function cRSID_setCallBack__autoAdvance(callback, data) {
162
+ cRSID_C64.callBack__autoAdvance = callback;
163
+ cRSID_C64.callBackData__autoAdvance = data;
164
+ }
165
+ import { cRSID_createC64 } from './c64.js';
166
+ // ---------------------------------------------------------------------------
167
+ // cRSID_initSIDtune (libcRSID.c:69-140) — subtune: 1..255
168
+ // ---------------------------------------------------------------------------
169
+ /** PowersOf2 (libcRSID.c:70). */
170
+ const PowersOf2 = new Uint8Array([0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80]);
171
+ export function cRSID_initSIDtune(SIDheader, subtune) {
172
+ const C64 = cRSID_C64;
173
+ let InitTimeout = 10000000; // allowed instructions, value should be selected to allow for long-running memory-copiers in init-routines (e.g. Synth Sample)
174
+ cRSID.PlaytimeExpired = 0;
175
+ C64.FadeLevel = 0xf;
176
+ cRSID.Paused = 1;
177
+ if (subtune === 0)
178
+ subtune = 1;
179
+ else if (subtune > SIDheader.SubtuneAmount)
180
+ subtune = SIDheader.SubtuneAmount; // printf( "Subtune: %d\n", subtune );
181
+ cRSID.SubTune = subtune;
182
+ C64.SecondCnt = cRSID.PlayTime = 0;
183
+ cRSID.PlaybackSpeed = 1; // cRSID.Paused = 0; //don't unpause this early, before init!
184
+ cRSID_setC64();
185
+ cRSID_initC64(C64); // cRSID_writeMemC64(C64,0xD418,0xF); //set C64 hardware and init (reset) it
186
+ // cRSID.Paused = 0;
187
+ // determine init-address:
188
+ cRSID.InitAddress = SIDheader.InitAddress; // get info from BASIC-startupcode for some tunes
189
+ if (C64.RAMbank[1] === 0x37) {
190
+ // are there SIDs with routine under IO area? some PSIDs don't set bank-registers themselves
191
+ if ((0xa000 <= cRSID.InitAddress && cRSID.InitAddress < 0xc000) ||
192
+ (cRSID.LoadAddress < 0xc000 && cRSID.EndAddress >= 0xa000))
193
+ C64.RAMbank[1] = 0x36;
194
+ else if (cRSID.InitAddress >= 0xe000 || cRSID.EndAddress >= 0xe000)
195
+ C64.RAMbank[1] = 0x35;
196
+ }
197
+ cRSID_initCPU(C64, cRSID.InitAddress); // prepare init-routine call
198
+ C64.CPU.A = subtune - 1;
199
+ if (!cRSID.RealSIDmode) {
200
+ // call init-routine:
201
+ for (InitTimeout = 10000000; InitTimeout > 0; InitTimeout--) {
202
+ if (cRSID_emulateCPU(C64) >= 0xfe)
203
+ break;
204
+ } // give error when timed out?
205
+ }
206
+ // determine timing-source, if CIA, replace FrameCycles previouisly set to
207
+ // VIC-timing
208
+ // C: SubtuneTimeSources[0] — byte $12 of the file (the byte overlaid at
209
+ // array index 0), which is the MSB of the BE u32.
210
+ if (subtune > 32)
211
+ cRSID.TimerSource = (SIDheader.SubtuneTimeSources >>> 24) & 0x80; // subtunes above 32 should use subtune32's timing
212
+ else {
213
+ const byteIdx = (32 - subtune) >> 3; // C: SubtuneTimeSources[(32-subtune)>>3]
214
+ const bitIdx = (subtune - 1) & 7; // C: PowersOf2[(subtune-1)&7]
215
+ // The C byte-array overlay reads file bytes $12..$15 in file order:
216
+ // byte0 = filedata[0x12] … byte3 = filedata[0x15]; reconstruct per-byte:
217
+ const bytes = [
218
+ (SIDheader.SubtuneTimeSources >>> 24) & 0xff,
219
+ (SIDheader.SubtuneTimeSources >>> 16) & 0xff,
220
+ (SIDheader.SubtuneTimeSources >>> 8) & 0xff,
221
+ SIDheader.SubtuneTimeSources & 0xff,
222
+ ];
223
+ cRSID.TimerSource = bytes[byteIdx] & PowersOf2[bitIdx];
224
+ }
225
+ if (cRSID.TimerSource || C64.IObankWR[0xdc05] !== 0x40 || C64.IObankWR[0xdc04] !== 0x24) {
226
+ // CIA1-timing (probably multispeed tune)
227
+ cRSID.FrameCycles = C64.IObankWR[0xdc04] + (C64.IObankWR[0xdc05] << 8);
228
+ cRSID.TimerSource = 1; // if init-routine changed DC04 or DC05, assume CIA-timing
229
+ }
230
+ // determine playaddress:
231
+ cRSID.PlayAddress = SIDheader.PlayAddress;
232
+ if (cRSID.PlayAddress) {
233
+ // normal play-address called with JSR
234
+ if (C64.RAMbank[1] === 0x37) {
235
+ // are there SIDs with routine under IO area?
236
+ if (0xa000 <= cRSID.PlayAddress && cRSID.PlayAddress < 0xc000)
237
+ C64.RAMbank[1] = 0x36;
238
+ }
239
+ else if (cRSID.PlayAddress >= 0xe000)
240
+ C64.RAMbank[1] = 0x35; // player under KERNAL (e.g. Crystal Kingdom Dizzy)
241
+ }
242
+ else {
243
+ // IRQ-playaddress for multispeed-tunes set by init-routine (some tunes
244
+ // turn off KERNAL ROM but doesn't set IRQ-vector!)
245
+ cRSID.PlayAddress =
246
+ (C64.RAMbank[1] & 3) < 2
247
+ ? cRSID_readMem(C64, 0xfffe) + (cRSID_readMem(C64, 0xffff) << 8) // for PSID
248
+ : cRSID_readMem(C64, 0x314) + (cRSID_readMem(C64, 0x315) << 8);
249
+ if (cRSID.PlayAddress === 0) {
250
+ // if 0, still try with RSID-mode fallback
251
+ cRSID_initCPU(C64, cRSID.PlayAddress); // point CPU to play-routine
252
+ C64.Finished = 1;
253
+ C64.Returned = 1;
254
+ cRSID.Paused = 0;
255
+ return;
256
+ }
257
+ }
258
+ if (!cRSID.RealSIDmode) {
259
+ // prepare (PSID) play-routine playback:
260
+ cRSID_initCPU(C64, cRSID.PlayAddress); // point CPU to play-routine
261
+ C64.FrameCycleCnt = 0;
262
+ C64.Finished = 1;
263
+ C64.SampleCycleCnt = 0; // C64.CIAisSet=0;
264
+ }
265
+ else {
266
+ C64.Finished = 0;
267
+ C64.Returned = 0;
268
+ }
269
+ cRSID.Paused = 0;
270
+ }
271
+ // ---------------------------------------------------------------------------
272
+ // cRSID_generateSample (host/audio.c:306-335) — the sample-generation entry
273
+ // that the modplayjs host buffer loop calls. Everything between `Paused`
274
+ // short-circuit and the saturation is host-audio-private (commented-out
275
+ // shadow-variable sync + dither noise) — ported verbatim.
276
+ // ---------------------------------------------------------------------------
277
+ /** C integer division (truncates toward zero; JS `/` is not integer and
278
+ * `Math.floor` rounds down — not the same for negative operands). */
279
+ function divTrunc(a, b) {
280
+ return Math.trunc(a / b);
281
+ }
282
+ const MIX_SCALING = 256 * 16 /* FADE_SCALING */;
283
+ const SCRAMBLER_BITS = 8;
284
+ const DITHERNOISE_DIVSHIFTS = 6 /* 5 */;
285
+ const DITHERNOISE_MID = (1 << (SCRAMBLER_BITS - DITHERNOISE_DIVSHIFTS)) / 2;
286
+ export let ditherLFSR = 0x0055a5aa;
287
+ export function cRSID_generateSample() {
288
+ const C64 = cRSID_C64;
289
+ let VolumeMul;
290
+ let Insert;
291
+ const Output = { L: 0, R: 0 };
292
+ if (cRSID.Paused) {
293
+ Output.L = Output.R = 0;
294
+ return Output;
295
+ }
296
+ // If calling cRSID_generateSample() directly, don't forget to keep the
297
+ // audio-thread shadow-variables updated, as seen above in
298
+ // cRSID_generateSound() (host/audio.c:283-296):
299
+ C64.RealSIDmode = cRSID.RealSIDmode;
300
+ C64.AudioThread_SIDchipCount = C64.SIDchipCount;
301
+ C64.Stereo = C64.AudioThread_SIDchipCount > 1 ? cRSID.Stereo : 0 /* CRSID_CHANNELMODE_MONO */; // this might be changed regularly during playback by the user
302
+ C64.HighQualitySID = cRSID.HighQualitySID;
303
+ C64.HighQualityResampler = cRSID.HighQualityResampler;
304
+ const emulatedOutput = cRSID_emulateC64(C64);
305
+ Output.L = emulatedOutput.L;
306
+ Output.R = emulatedOutput.R;
307
+ if (cRSID.PSIDdigiMode) {
308
+ Insert = cRSID_playPSIDdigi();
309
+ Output.L += Insert;
310
+ Output.R += Insert;
311
+ }
312
+ VolumeMul = cRSID.MainVolume * C64.FadeLevel;
313
+ Output.L = divTrunc(Output.L * VolumeMul, MIX_SCALING); // Having the attenuator before saturation allows avoiding filter/many-SIDs overdrive-distortion
314
+ Output.R = divTrunc(Output.R * VolumeMul, MIX_SCALING); // (By simply adjusting the main volume knob to a lower level. Real SID distorts as well in those cases btw.)
315
+ // Add dithering noise for more natural sound and to override any small
316
+ // quantization/correlated/mixdown noises (might add C64 bus-noise in the
317
+ // future)
318
+ // This is my fast LFSR+scrambler-routine generating perfect even
319
+ // white-noise spectrum (measured with 'ENT' tool)
320
+ // 23bit LFSR (pow(2,23)-1=8388607 states) with XOR-ed taps of bit22 and
321
+ // bit13 (realized by 24 bits = 3 bytes and bit23^bit14 (LFSR_HH[7],
322
+ // LFSR_H[6]) feedback to bit1)
323
+ const fb = (ditherLFSR & 0x800000) ^ ((ditherLFSR & 0x004000) << 9);
324
+ // C: `LFSR <<= 1` on a signed int — 32-bit wraparound, then `>> 16` reads
325
+ // are ARITHMETIC (sign-extending). Keep the variable as a signed int32.
326
+ ditherLFSR = (Math.imul(ditherLFSR, 2) | (fb ? 2 : 0)) | 0;
327
+ if (fb)
328
+ ditherLFSR |= 2; // (redundant with the |2 above; kept for C parity)
329
+ // scramble 24bit value into a 8bit output (e.g. make LFSR 8bit output
330
+ // non-linear and therefore more random)
331
+ // We use AND-masks to combine into output (instead of free bit-to-bit
332
+ // mapping)
333
+ // (this method has ENT-correlation=0.000002, PI-error=0.02%, a nice evenly
334
+ // distributed spectrum that fits between -45.4..-45.8dB)
335
+ Insert =
336
+ ((((ditherLFSR >> 16) & 0x99) + ((ditherLFSR >> 8) & 0x72) + (ditherLFSR & 0xb4) + 0x7c) & 0xff) >>>
337
+ DITHERNOISE_DIVSHIFTS;
338
+ // (signed char) cast — reinterpret the byte as signed:
339
+ const sc = Insert > 127 ? Insert - 256 : Insert;
340
+ Insert = sc - DITHERNOISE_MID;
341
+ Output.L += Insert;
342
+ Output.R += Insert;
343
+ if (Output.L >= 32767)
344
+ Output.L = 32767;
345
+ else if (Output.L <= -32768)
346
+ Output.L = -32768; // saturation arithmetic on overflow
347
+ if (Output.R >= 32767)
348
+ Output.R = 32767;
349
+ else if (Output.R <= -32768)
350
+ Output.R = -32768; // saturation arithmetic on overflow
351
+ return Output;
352
+ }
353
+ /** cRSID_generateSound (host/audio.c:299-304) — fill a buffer with samples
354
+ * (S16LE interleaved stereo), matching the C helper's shadow-update
355
+ * references above. */
356
+ export function cRSID_generateSound(buf, len) {
357
+ // C: cRSID_soundCallback sets SoundStarted then calls generateSound +
358
+ // autoAdvance; the host loop equivalent only generates.
359
+ for (let i = 0; i < len; i += 4) {
360
+ const out = cRSID_generateSample();
361
+ const L = out.L > 32767 ? 32767 : out.L < -32768 ? -32768 : out.L;
362
+ const R = out.R > 32767 ? 32767 : out.R < -32768 ? -32768 : out.R;
363
+ buf[i + 0] = L & 0xff;
364
+ buf[i + 1] = (L >>> 8) & 0xff;
365
+ buf[i + 2] = R & 0xff;
366
+ buf[i + 3] = (R >>> 8) & 0xff;
367
+ }
368
+ }
369
+ /** cRSID_playSIDtune / cRSID_pauseSIDtune (libcRSID.c:158-176) — the
370
+ * host-sound #ifdef blocks are PC-only; the TS port keeps the Paused flag.
371
+ */
372
+ export function cRSID_playSIDtune() {
373
+ cRSID.Paused = 0;
374
+ }
375
+ export function cRSID_pauseSIDtune() {
376
+ cRSID.Paused = 1;
377
+ }
378
+ /** cRSID_close (libcRSID.c:152-156) — host-sound close is PC-only. */
379
+ export function cRSID_close() {
380
+ cRSID.Paused = 1;
381
+ }
382
+ export { CRSID_SECONDS_PER_MINUTE, CRSID_FILEVERSION_WEBSID };
383
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
package/dist/mem.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ import type { CRC64instance } from './c64types.js';
2
+ import { CRMemAddresses } from './c64types.js';
3
+ /** cRSID_generateMemoryBankPointers (MEM.c:10-25). */
4
+ export declare function cRSID_generateMemoryBankPointers(C64: CRC64instance): void;
5
+ /**
6
+ * cRSID_getMemReadPtr (MEM.c:28-51) — TS-port form: instead of returning a
7
+ * raw pointer, this reads the byte through the resolved (bank, address).
8
+ *
9
+ * The special case that made C return `&IObankWR[address]` (SID-read
10
+ * bitfading of the last written register, e.g. Lift Off `ROR $D400,x`)
11
+ * reads from IObankWR here — same value.
12
+ */
13
+ export declare function cRSID_readMemPtr(C64: CRC64instance, address: number): number;
14
+ /**
15
+ * cRSID_getMemWritePtr (MEM.c:76-106) — TS-port form: writes the byte through
16
+ * the resolved (bank, address), including the SID-mirror redirect.
17
+ */
18
+ export declare function cRSID_writeMemPtr(C64: CRC64instance, address: number, data: number): void;
19
+ /** cRSID_readMem (MEM.c:110-112). */
20
+ export declare function cRSID_readMem(C64: CRC64instance, address: number): number;
21
+ /** cRSID_writeMem (MEM.c:118-120). */
22
+ export declare function cRSID_writeMem(C64: CRC64instance, address: number, data: number): void;
23
+ /** cRSID_setROMcontent (MEM.c:124-166) — fill KERNAL/BASIC-ROM areas with
24
+ * content needed for SID-playback. */
25
+ export declare function cRSID_setROMcontent(C64: CRC64instance): void;
26
+ /** cRSID_initMem (MEM.c:168-197) — set default values that normally KERNEL
27
+ * ensures after startup/reset (only SID-playback related). */
28
+ export declare function cRSID_initMem(C64: CRC64instance): void;
29
+ export { CRMemAddresses };
30
+ //# sourceMappingURL=mem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem.d.ts","sourceRoot":"","sources":["../src/mem.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,sDAAsD;AACtD,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAmBzE;AASD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAW5E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAsBzF;AAED,qCAAqC;AACrC,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,sCAAsC;AACtC,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEtF;AAgBD;uCACuC;AACvC,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAuB5D;AAED;+DAC+D;AAC/D,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAqCtD;AAGD,OAAO,EAAE,cAAc,EAAE,CAAC"}
package/dist/mem.js ADDED
@@ -0,0 +1,187 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: cRSID 1.58 libcRSID/C64/MEM.c — emulation of C64 memories and
4
+ // memory bus (PLA & MUXes). (c) Hermit (Mihaly Horvath), license: WTF
5
+ // ("do what the frick you want", mention the author).
6
+ //
7
+ // C stores raw `unsigned char*` per (bank, page) in
8
+ // MemoryBankPointersRD/WR and compares them against the four base arrays.
9
+ // The TS port encodes each entry as bankCode<<16 with bankCode:
10
+ // 0 = RAMbank, 1 = IObankRD, 2 = ROMbanks, 3 = IObankWR
11
+ // and resolves to (array, offset) at access time — same dispatch semantics.
12
+ import { BANK_RAM, BANK_IO_RD, BANK_ROM, BANK_IO_WR, bankCode } from './c64types.js';
13
+ import { CRMemAddresses } from './c64types.js';
14
+ import { cRSID } from './instance.js';
15
+ /** cRSID_generateMemoryBankPointers (MEM.c:10-25). */
16
+ export function cRSID_generateMemoryBankPointers(C64) {
17
+ for (let i = 0; i < 4; ++i) {
18
+ for (let j = 0; j < 256; ++j) {
19
+ // RD table (MEM.c:14-17)
20
+ let rd;
21
+ if (j < 0xA0)
22
+ rd = BANK_RAM;
23
+ else if (0xD0 <= j && j < 0xE0 && i)
24
+ rd = BANK_IO_RD;
25
+ else if ((j < 0xC0 && i === 3) || (0xE0 <= j && i & 2))
26
+ rd = BANK_ROM;
27
+ else
28
+ rd = BANK_RAM;
29
+ C64.MemoryBankPointersRD[(i << 8) | j] = rd << 16;
30
+ // WR table (MEM.c:19-21)
31
+ let wr;
32
+ if (j < 0xD0 || 0xE0 <= j)
33
+ wr = BANK_RAM;
34
+ else if (i)
35
+ wr = BANK_IO_WR;
36
+ else
37
+ wr = BANK_RAM;
38
+ C64.MemoryBankPointersWR[(i << 8) | j] = wr << 16;
39
+ }
40
+ }
41
+ }
42
+ var BankSel;
43
+ (function (BankSel) {
44
+ BankSel[BankSel["RAM"] = 0] = "RAM";
45
+ BankSel[BankSel["IO_RD"] = 1] = "IO_RD";
46
+ BankSel[BankSel["ROM"] = 2] = "ROM";
47
+ BankSel[BankSel["IO_WR"] = 3] = "IO_WR";
48
+ })(BankSel || (BankSel = {}));
49
+ /**
50
+ * cRSID_getMemReadPtr (MEM.c:28-51) — TS-port form: instead of returning a
51
+ * raw pointer, this reads the byte through the resolved (bank, address).
52
+ *
53
+ * The special case that made C return `&IObankWR[address]` (SID-read
54
+ * bitfading of the last written register, e.g. Lift Off `ROR $D400,x`)
55
+ * reads from IObankWR here — same value.
56
+ */
57
+ export function cRSID_readMemPtr(C64, address) {
58
+ const entry = C64.MemoryBankPointersRD[((C64.RAMbank[1] & 3) << 8) | (address >>> 8)];
59
+ const bank = bankCode(entry);
60
+ if (bank !== BankSel.IO_RD) {
61
+ return bank === BankSel.ROM ? C64.ROMbanks[address] : C64.RAMbank[address];
62
+ }
63
+ // MOSTLY (address < 0xD400 || 0xD419 <= address) → IObankRD
64
+ if (address < 0xd400 || 0xd419 <= address)
65
+ return C64.IObankRD[address];
66
+ // else return &IObankWR[address] — emulate bitfading aka SID-read of last
67
+ // written reg (e.g. Lift Off ROR $D400,x)
68
+ return C64.IObankWR[address];
69
+ }
70
+ /**
71
+ * cRSID_getMemWritePtr (MEM.c:76-106) — TS-port form: writes the byte through
72
+ * the resolved (bank, address), including the SID-mirror redirect.
73
+ */
74
+ export function cRSID_writeMemPtr(C64, address, data) {
75
+ const entry = C64.MemoryBankPointersWR[((C64.RAMbank[1] & 3) << 8) | (address >>> 8)];
76
+ const bank = bankCode(entry);
77
+ if (bank !== BankSel.IO_WR) {
78
+ // MOSTLY branch: RAM (the WR table only stores RAM or IO_WR)
79
+ C64.RAMbank[address] = data;
80
+ return;
81
+ }
82
+ // else if ( RARELY (0xD420 <= address && address < 0xD800) ) — CIA/VIC mirrors
83
+ if (0xd420 <= address && address < 0xd800) {
84
+ if (!(cRSID.PSIDdigiMode && 0xd418 <= address && address < 0xd500) &&
85
+ !(C64.SID[2].BaseAddress <= address && address < C64.SID[2].BaseAddress + 0x20) &&
86
+ !(C64.SID[3].BaseAddress <= address && address < C64.SID[3].BaseAddress + 0x20) &&
87
+ !(C64.SID[4].BaseAddress <= address && address < C64.SID[4].BaseAddress + 0x20)) {
88
+ // write to $D400..D41F if not in SID2/SID3 address-space
89
+ C64.IObankWR[0xd400 + (address & 0x1f)] = data;
90
+ return;
91
+ }
92
+ }
93
+ C64.IObankWR[address] = data;
94
+ }
95
+ /** cRSID_readMem (MEM.c:110-112). */
96
+ export function cRSID_readMem(C64, address) {
97
+ return cRSID_readMemPtr(C64, address);
98
+ }
99
+ /** cRSID_writeMem (MEM.c:118-120). */
100
+ export function cRSID_writeMem(C64, address, data) {
101
+ cRSID_writeMemPtr(C64, address, data);
102
+ }
103
+ // ---------------------------------------------------------------------------
104
+ // ROM stub content (MEM.c:124-166)
105
+ // ---------------------------------------------------------------------------
106
+ /** CIA1-acknowledge IRQ-return (MEM.c:127). */
107
+ const ROM_IRQreturnCode = [0xad, 0x0d, 0xdc, 0x68, 0xa8, 0x68, 0xaa, 0x68, 0x40];
108
+ /** SEI and jmp($0318) (MEM.c:128). */
109
+ const ROM_NMIstartCode = [0x78, 0x6c, 0x18, 0x03, 0x40];
110
+ /** Full IRQ-return (handling BRK with the same RAM vector as IRQ) (MEM.c:129-134). */
111
+ const ROM_IRQBRKstartCode = [
112
+ 0x48, 0x8a, 0x48, 0x98, 0x48, 0xba, 0xbd, 0x04, 0x01, 0x29, 0x10, 0xea, 0xea, 0xea, 0xea, 0xea, 0x6c, 0x14, 0x03,
113
+ ];
114
+ /** cRSID_setROMcontent (MEM.c:124-166) — fill KERNAL/BASIC-ROM areas with
115
+ * content needed for SID-playback. */
116
+ export function cRSID_setROMcontent(C64) {
117
+ for (let i = 0xa000; i < 0x10000; ++i)
118
+ C64.ROMbanks[i] = 0x60; // RTS (at least return if some unsupported call is made to ROM)
119
+ if (cRSID.BASICfileData != null) {
120
+ for (let i = 0; i < 0x2000; ++i)
121
+ C64.ROMbanks[0xa000 + i] = cRSID.BASICfileData[i];
122
+ }
123
+ if (cRSID.KERNALfileData != null) {
124
+ for (let i = 0; i < 0x2000; ++i)
125
+ C64.ROMbanks[0xe000 + i] = cRSID.KERNALfileData[i];
126
+ }
127
+ else {
128
+ for (let i = 0xea31; i < 0xea7e; ++i)
129
+ C64.ROMbanks[i] = 0xea; // NOP (full IRQ-return leading to simple IRQ-return without other tasks)
130
+ for (let i = 0; i < 9; ++i)
131
+ C64.ROMbanks[0xea7e + i] = ROM_IRQreturnCode[i];
132
+ for (let i = 0; i < 4; ++i)
133
+ C64.ROMbanks[0xfe43 + i] = ROM_NMIstartCode[i];
134
+ for (let i = 0; i < 19; ++i)
135
+ C64.ROMbanks[0xff48 + i] = ROM_IRQBRKstartCode[i];
136
+ C64.ROMbanks[0xfffb] = 0xfe;
137
+ C64.ROMbanks[0xfffa] = 0x43; // ROM NMI-vector
138
+ C64.ROMbanks[0xffff] = 0xff;
139
+ C64.ROMbanks[0xfffe] = 0x48; // ROM IRQ-vector
140
+ }
141
+ // copy KERNAL & BASIC ROM contents into the RAM under them? (So PSIDs that
142
+ // don't select bank correctly will work better.)
143
+ for (let i = 0xa000; i < 0x10000; ++i)
144
+ C64.RAMbank[i] = C64.ROMbanks[i];
145
+ }
146
+ /** cRSID_initMem (MEM.c:168-197) — set default values that normally KERNEL
147
+ * ensures after startup/reset (only SID-playback related). */
148
+ export function cRSID_initMem(C64) {
149
+ // data required by both PSID and RSID (according to HVSC SID_file_format.txt):
150
+ cRSID_writeMem(C64, 0x02a6, cRSID.VideoStandard); // $02A6 should be pre-set to: 0:NTSC / 1:PAL
151
+ cRSID_writeMem(C64, 0x0001, 0x37); // initialize bank-reg. (ROM-banks and IO enabled)
152
+ // if (C64.ROMbanks[0xE000]==0) — wasn't a KERNAL-ROM loaded? (e.g. PSID)
153
+ cRSID_writeMem(C64, 0x00cb, 0x40); // Some tunes might check for keypress here (e.g. Master Blaster Intro)
154
+ // if (cRSID.RealSIDmode) {
155
+ cRSID_writeMem(C64, 0x0315, 0xea);
156
+ cRSID_writeMem(C64, 0x0314, 0x31); // IRQ
157
+ cRSID_writeMem(C64, 0x0319, 0xea /*0xFE*/);
158
+ cRSID_writeMem(C64, 0x0318, 0x81 /*0x47*/); // NMI
159
+ // }
160
+ for (let i = 0xd000; i < 0xd7ff; ++i)
161
+ C64.IObankRD[i] = C64.IObankWR[i] = 0; // initialize the whole IO area for a known base-state
162
+ if (cRSID.RealSIDmode) {
163
+ C64.IObankWR[0xd012] = 0x37;
164
+ C64.IObankWR[0xd011] = 0x8b;
165
+ } // else C64.IObankWR[0xD012] = 0;
166
+ // C64.IObankWR[0xD019] = 0; // PSID: rasterrow: any value <= $FF, IRQ:enable later if there is VIC-timingsource
167
+ C64.IObankRD[0xdc00] = 0x10;
168
+ C64.IObankRD[0xdc01] = 0xff; // Imitate CIA1 keyboard/joy port, some tunes check if buttons are not pressed
169
+ if (cRSID.VideoStandard) {
170
+ C64.IObankWR[0xdc04] = 0x24;
171
+ C64.IObankWR[0xdc05] = 0x40;
172
+ } // initialize CIAs
173
+ else {
174
+ C64.IObankWR[0xdc04] = 0x95;
175
+ C64.IObankWR[0xdc05] = 0x42;
176
+ }
177
+ if (cRSID.RealSIDmode)
178
+ C64.IObankWR[0xdc0d] = 0x81; // Reset-default, but for PSID CIA1 TimerA IRQ should be enabled anyway if SID is CIA-timed
179
+ C64.IObankWR[0xdc0e] = 0x01; // some tunes (and PSID doc) expect already running CIA (Reset-default)
180
+ C64.IObankWR[0xdc0f] = 0x00; // All counters other than CIA1 TimerA should be disabled and set to 0xFF for PSID:
181
+ C64.IObankWR[0xdd00] = C64.IObankRD[0xdd00] = 0x03; // VICbank-selector default
182
+ C64.IObankWR[0xdd04] = C64.IObankWR[0xdd05] = 0xff;
183
+ // C64.IObankWR[0xDD0E] = C64.IObank[0xDD0F] = 0x08;
184
+ }
185
+ // re-exported for the module-safety zone (C's CRSID_SID_SAFE_ADDRESS base)
186
+ export { CRMemAddresses };
187
+ //# sourceMappingURL=mem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem.js","sourceRoot":"","sources":["../src/mem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** cRSID_playPSIDdigi (C64_SIDrouting.c:377-427) — returns short. */
2
+ export declare function cRSID_playPSIDdigi(): number;
3
+ //# sourceMappingURL=psiddigi.d.ts.map