@modplayjs/fmt-sid 0.0.0-stage → 0.2.1

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/README.md CHANGED
@@ -1,3 +1,112 @@
1
- # Temporary Holding Version
1
+ # @modplayjs/fmt-sid
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **Commodore 64 SID music (PSID/RSID) plugin** for `@modplayjs/core` — a
4
+ pristine 1:1 TypeScript port of **libcRSID 1.58** by Mihály Horváth
5
+ (Hermit), from the reference copy in
6
+ [`reference/cRSID-1.58`](../../reference/cRSID-1.58/README.txt).
7
+
8
+ Unlike the tracker formats, SID is a *machine emulation*: the plugin
9
+ contains the whole C64 playback machine, not a pattern player —
10
+
11
+ - **6510 CPU** with the illegal opcodes scene tunes use (CPU.c, 510 lines)
12
+ - **SID chip**: oscillators (light + high-quality oversampled paths),
13
+ combined waveforms (4×4096 sampled tables), filter, ADSR with the
14
+ exponential curve + DAC table, $D418 volume-register digi and the
15
+ PSID $D4xx digi player
16
+ - **CIA1/2 timers, VIC raster IRQ, PLA memory banking, KERNAL stub ROM**
17
+ - **PSID/RSID loader** with Vsync/CIA timing-source selection, subtune
18
+ handling, video-standard (PAL/NTSC) clock selection
19
+
20
+ All data tables (combined waveforms, filter curves, Sinc window, ADSR
21
+ DAC) are verbatim copies, verified byte-identical against the C build.
22
+
23
+ ## Verification
24
+
25
+ Rendered audio is **sample-exact** against a C oracle built from the
26
+ reference tree: byte-identical on all 48 test-corpus .sid files (incl.
27
+ the RSID file, CIA-timed tunes, multi-subtune files), and corr 1.0000 /
28
+ maxdiff 0.000 through the standard player pipeline at 48 kHz.
29
+
30
+ Note on engine fidelity: this is the cRSID implementation's own audio —
31
+ table-based filter/waveform models, not reSIDfp's sampled-from-silicon
32
+ analog models (which are GPL-licensed and cannot be ported here). See
33
+ the repository README for the engine comparison.
34
+
35
+ ## Install
36
+
37
+ ```sh
38
+ npm install @modplayjs/fmt-sid
39
+ ```
40
+
41
+ ## Usage
42
+
43
+ ```ts
44
+ import { CorePlayer } from '@modplayjs/core';
45
+ import { plugin as sidPlugin, sidDsp, sidStartTune } from '@modplayjs/fmt-sid';
46
+
47
+ const core = new CorePlayer();
48
+ core.registries.registerFormat(sidPlugin);
49
+ core.registries.registerDsp(sidDsp);
50
+ core.loadModule(bytes); // .sid file
51
+
52
+ // at playback start (engine is sample-paced, not tick-paced):
53
+ core.setDsp('sid');
54
+ core.setSampleRate(deviceRate);
55
+ core.startPlayer();
56
+ sidStartTune(bytes, deviceRate, 1); // subtune 1
57
+ ```
58
+
59
+ The engine renders through the `sid` DSP plugin at exact host-buffer
60
+ pacing; the tracker player just keeps the pipeline flowing. Loop
61
+ semantics: the stub module loops forever (`loop=0` in `playBuffer`).
62
+
63
+ ## Settings
64
+
65
+ ```ts
66
+ import { getSidSettings, applySidSettings } from '@modplayjs/fmt-sid';
67
+
68
+ applySidSettings({
69
+ volume: 255, // 0..255 engine master volume
70
+ highQualitySID: true, // oversampled waveform path (light = sample-rate)
71
+ highQualityResampler: false, // Sinc FIR decimator (only with highQualitySID)
72
+ stereo: 0, // 0 mono / 1 stereo / 3 narrow (2SID+ tunes)
73
+ model: 0, // 0 header default / 6581 / 8580 (forced)
74
+ videoStandard: undefined, // undefined header default / 0 NTSC / 1 PAL
75
+ });
76
+ ```
77
+
78
+ `volume`, `highQualitySID`, `highQualityResampler` and `stereo` apply
79
+ **live** (the engine reads them through its per-sample shadow sync, as in
80
+ the C host). `model` and `videoStandard` are **init-time** — they take
81
+ effect on the next `sidStartTune` call (the C player re-inits the tune for
82
+ these as well). `getSidSettings()` reads the current values back.
83
+
84
+ Note: `stereo` only routes differently on multi-SID tunes (PSID v3+ with
85
+ a SID2 address in the header) — single-SID tunes always play mono, so
86
+ `getSidChipCount()` lets players disable the control for them.
87
+
88
+ ## Seek
89
+
90
+ ```ts
91
+ import { sidSeek, getSidPlayTimeSeconds } from '@modplayjs/fmt-sid';
92
+
93
+ sidSeek(180); // fast-forward the engine to 3:00
94
+ const t = getSidPlayTimeSeconds(); // engine runtime in seconds
95
+ ```
96
+
97
+ cRSID has no native seek — `sidSeek` fast-forwards the machine emulation
98
+ (rendering the skipped samples into a discard buffer, ≈20× realtime) and
99
+ restarts the tune first for backwards seeks. Pair with the Songlengths
100
+ database for a working seek bar on known tunes.
101
+
102
+ ## Also exports
103
+
104
+ Full engine surface for direct use without the player core:
105
+ `cRSID_init`, `cRSID_initSIDtune`, `cRSID_generateSample`,
106
+ `cRSID_processSIDfileData`, `cRSID_playSIDtune`, `cRSID_pauseSIDtune`,
107
+ `cRSID_close`, plus the `cRSID`/`cRSID_C64` global objects for
108
+ inspection.
109
+
110
+ Part of the [modplayjs monorepo](../../README.md). BSD-3-Clause for the
111
+ port; the underlying cRSID is WTF license by the original author (see
112
+ [NOTICE](../../NOTICE)).
package/dist/c64.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { type CRC64instance, type CRSIDOutput } from './c64types.js';
2
+ /** cRSID_createC64 (C64.c:17-43). */
3
+ export declare function cRSID_createC64(C64: CRC64instance, samplerate: number): CRC64instance;
4
+ export declare function cRSID_setSIDmodels(): void;
5
+ export declare function cRSID_setC64(): void;
6
+ export declare function cRSID_initC64(C64: CRC64instance): void;
7
+ export declare function cRSID_emulateC64(C64: CRC64instance): CRSIDOutput;
8
+ //# sourceMappingURL=c64.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c64.d.ts","sourceRoot":"","sources":["../src/c64.ts"],"names":[],"mappings":"AAMA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,WAAW,EACjB,MAAM,eAAe,CAAC;AAmBvB,qCAAqC;AACrC,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAqBrF;AAaD,wBAAgB,kBAAkB,IAAI,IAAI,CAsCzC;AAOD,wBAAgB,YAAY,IAAI,IAAI,CAyEnC;AAQD,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAkBtD;AAiBD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,WAAW,CAsGhE"}
package/dist/c64.js ADDED
@@ -0,0 +1,325 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ // Copyright (c) 2026 Bitti09 — modplayjs contributors
3
+ // Ported from: cRSID 1.58 libcRSID/C64/C64.c — C64 instance creation,
4
+ // hardware setup, reset and the cycle-based emulation frame.
5
+ // (c) Hermit (Mihaly Horvath), license: WTF ("do what the frick you want").
6
+ import { CRSpecC64, CRChannel, CRAudioLevels, CRMemAddresses, } from './c64types.js';
7
+ import { CRSID_FILEVERSION_WEBSID } from './host.js';
8
+ import { cRSID, cRSID_C64 } from './instance.js';
9
+ import { cRSID_initMem, cRSID_setROMcontent, cRSID_readMem } from './mem.js';
10
+ import { cRSID_initCPU, cRSID_emulateCPU, cRSID_handleCPUinterrupts } from './cpu.js';
11
+ import { cRSID_initCIAchip, cRSID_emulateCIA } from './cia.js';
12
+ import { cRSID_initSIDchip } from './sid.js';
13
+ import { cRSID_emulateVIC } from './vic.js';
14
+ // ---------------------------------------------------------------------------
15
+ // cRSID_createC64 (C64.c:17-43) — init a basic PAL C64 instance
16
+ // ---------------------------------------------------------------------------
17
+ /** enum SIDspecs (C64.c:22). */
18
+ const VOLUME_MAX = 0xf;
19
+ const CHANNELS = 3 + 1;
20
+ const SID_FULLVOLUME = CHANNELS * VOLUME_MAX; /* 64 */ // digi-channel is counted too in attenuation
21
+ void VOLUME_MAX;
22
+ /** cRSID_createC64 (C64.c:17-43). */
23
+ export function cRSID_createC64(C64, samplerate) {
24
+ let sr = samplerate;
25
+ if (sr)
26
+ C64.SampleRate = sr;
27
+ else
28
+ C64.SampleRate = sr = CRSpecC64.CRSID_DEFAULT_SAMPLERATE;
29
+ C64.SampleClockRatio = ((CRSpecC64.CRSID_PAL_CPUCLK << CRSpecC64.CRSID_CLOCK_FRACTIONAL_BITS) / sr) | 0; // shifting (multiplication) enhances SampleClockRatio precision
30
+ C64.OversampleClockRatio = ((sr << CRSpecC64.CRSID_RESAMPLER_FRACTIONAL_BITS) / CRSpecC64.CRSID_PAL_AUDIO_CLOCK) | 0; // round( SID_AUDIO_CLOCK / C64->SampleRate );
31
+ C64.OversampleClockRatioReciproc = (CRSpecC64.CRSID_PAL_AUDIO_CLOCK / sr) | 0; // round?
32
+ C64.SIDchipCount = C64.AudioThread_SIDchipCount = 1; // init audio-thread's version as well
33
+ C64.Attenuation = Math.trunc(((SID_FULLVOLUME + 26) * CRAudioLevels.CRSID_PRESAT_ATT_NOM) /
34
+ (CRAudioLevels.CRSID_PRESAT_ATT_DENOM * CRAudioLevels.CRSID_WAVGEN_PREDIV)); // C integer division
35
+ cRSID_createSIDchip(C64, C64.SID[1], 8580, CRChannel.CRSID_CHANNEL_BOTH, 0xd400); // default C64 setup with only 1 SID and 2 CIAs and 1 VIC
36
+ cRSID_createCIAchip(C64, C64.CIA[1], 0xdc00);
37
+ cRSID_createCIAchip(C64, C64.CIA[2], 0xdd00);
38
+ cRSID_createVICchip(C64, 0xd000);
39
+ cRSID_generateMemoryBankPointers(C64);
40
+ // if(cRSID.RealSIDmode) {
41
+ cRSID_setROMcontent(C64); //no KERNAL/BASIC ROM is set, but fake content must be used for extra compatibility
42
+ cRSID_initC64(C64);
43
+ return C64;
44
+ }
45
+ // imported late to avoid a cycle at module-eval time (C has the same
46
+ // file-include ordering: MEM.c functions are used above)
47
+ import { cRSID_createSIDchip } from './sid.js';
48
+ import { cRSID_createCIAchip } from './cia.js';
49
+ import { cRSID_createVICchip } from './vic.js';
50
+ import { cRSID_generateMemoryBankPointers } from './mem.js';
51
+ // ---------------------------------------------------------------------------
52
+ // cRSID_setSIDmodels (C64.c:46-80) — based on SIDheader-data
53
+ // ---------------------------------------------------------------------------
54
+ export function cRSID_setSIDmodels() {
55
+ const h = cRSID.SIDheader;
56
+ let SIDmodel;
57
+ SIDmodel = (h.ModelFormatStandard & 0x30) >= 0x20 ? 8580 : 6581;
58
+ cRSID_C64.SID[1].ChipModel = cRSID.SelectedSIDmodel ? cRSID.SelectedSIDmodel : SIDmodel;
59
+ if (h.Version !== CRSID_FILEVERSION_WEBSID) {
60
+ SIDmodel = h.ModelFormatStandard & 0xc0;
61
+ if (SIDmodel)
62
+ SIDmodel = SIDmodel >= 0x80 ? 8580 : 6581;
63
+ else
64
+ SIDmodel = cRSID_C64.SID[1].ChipModel;
65
+ if (cRSID.SelectedSIDmodel)
66
+ SIDmodel = cRSID.SelectedSIDmodel;
67
+ cRSID_C64.SID[2].ChipModel = SIDmodel;
68
+ SIDmodel = h.ModelFormatStandardH & 0x03;
69
+ if (SIDmodel)
70
+ SIDmodel = SIDmodel >= 0x02 ? 8580 : 6581;
71
+ else
72
+ SIDmodel = cRSID_C64.SID[1].ChipModel;
73
+ if (cRSID.SelectedSIDmodel)
74
+ SIDmodel = cRSID.SelectedSIDmodel;
75
+ cRSID_C64.SID[3].ChipModel = SIDmodel;
76
+ }
77
+ else {
78
+ SIDmodel = h.SID2flagsL & 0x30;
79
+ if (SIDmodel)
80
+ SIDmodel = SIDmodel >= 0x20 ? 8580 : 6581;
81
+ else
82
+ SIDmodel = cRSID_C64.SID[1].ChipModel;
83
+ if (cRSID.SelectedSIDmodel)
84
+ SIDmodel = cRSID.SelectedSIDmodel;
85
+ cRSID_C64.SID[2].ChipModel = SIDmodel;
86
+ SIDmodel = h.SID3flagsL & 0x30;
87
+ if (SIDmodel)
88
+ SIDmodel = SIDmodel >= 0x20 ? 8580 : 6581;
89
+ else
90
+ SIDmodel = cRSID_C64.SID[1].ChipModel;
91
+ if (cRSID.SelectedSIDmodel)
92
+ SIDmodel = cRSID.SelectedSIDmodel;
93
+ cRSID_C64.SID[3].ChipModel = SIDmodel;
94
+ SIDmodel = h.SID4flagsL & 0x30;
95
+ if (SIDmodel)
96
+ SIDmodel = SIDmodel >= 0x20 ? 8580 : 6581;
97
+ else
98
+ SIDmodel = cRSID_C64.SID[1].ChipModel;
99
+ if (cRSID.SelectedSIDmodel)
100
+ SIDmodel = cRSID.SelectedSIDmodel;
101
+ cRSID_C64.SID[4].ChipModel = SIDmodel;
102
+ }
103
+ }
104
+ // ---------------------------------------------------------------------------
105
+ // cRSID_setC64 (C64.c:82-153) — set hardware-parameters (Models, SIDs) for
106
+ // playback of loaded SID-tune
107
+ // ---------------------------------------------------------------------------
108
+ export function cRSID_setC64() {
109
+ // enum C64clocks { C64_PAL_CPUCLK=985248, C64_NTSC_CPUCLK=1022727 }; (C64.c:85-88)
110
+ const C64_PAL_SCANLINES = 312, C64_NTSC_SCANLINES = 263;
111
+ const C64_PAL_SCANLINE_CYCLES = 63, C64_NTSC_SCANLINE_CYCLES = 65;
112
+ // enum C64framerates { PAL_FRAMERATE = 50, NTSC_FRAMERATE = 60 }; //Hz
113
+ const CPUspeeds = [CRSpecC64.CRSID_NTSC_CPUCLK, CRSpecC64.CRSID_PAL_CPUCLK];
114
+ const ScanLines = [C64_NTSC_SCANLINES, C64_PAL_SCANLINES];
115
+ const ScanLineCycles = [C64_NTSC_SCANLINE_CYCLES, C64_PAL_SCANLINE_CYCLES];
116
+ const Attenuations = [
117
+ // manually tweaked attenuation, increase for 2SID (to 43) and 3SID (to 137) and 4SID (200)
118
+ Math.trunc(((SID_FULLVOLUME + 0) * CRAudioLevels.CRSID_PRESAT_ATT_NOM) /
119
+ (CRAudioLevels.CRSID_PRESAT_ATT_DENOM * CRAudioLevels.CRSID_WAVGEN_PREDIV)), // CRSID_WAVGEN_PREDIV compensates for dividing by it in envelope-multiplier
120
+ Math.trunc(((SID_FULLVOLUME + 26) * CRAudioLevels.CRSID_PRESAT_ATT_NOM) /
121
+ (CRAudioLevels.CRSID_PRESAT_ATT_DENOM * CRAudioLevels.CRSID_WAVGEN_PREDIV)), // (64+26) = 90 *28/(16*1..16)=157..9
122
+ Math.trunc(((SID_FULLVOLUME + 43) * CRAudioLevels.CRSID_PRESAT_ATT_NOM) /
123
+ (CRAudioLevels.CRSID_PRESAT_ATT_DENOM * CRAudioLevels.CRSID_WAVGEN_PREDIV)), // (64+43) = 107 *28/(16*1..16)=187..11
124
+ Math.trunc(((SID_FULLVOLUME + 137) * CRAudioLevels.CRSID_PRESAT_ATT_NOM) /
125
+ (CRAudioLevels.CRSID_PRESAT_ATT_DENOM * CRAudioLevels.CRSID_WAVGEN_PREDIV)), // (64+137) = 201 *28/(16*1..16)=351..21
126
+ Math.trunc(((SID_FULLVOLUME + 200) * CRAudioLevels.CRSID_PRESAT_ATT_NOM) /
127
+ (CRAudioLevels.CRSID_PRESAT_ATT_DENOM * CRAudioLevels.CRSID_WAVGEN_PREDIV)), // (64+200) = 264 *28/(16*1..16)=462..28
128
+ ];
129
+ const h = cRSID.SIDheader;
130
+ let SIDchannel;
131
+ cRSID.VideoStandard = ((h.ModelFormatStandard & 0x0c) >> 2) !== 2 ? 1 : 0;
132
+ if (cRSID.ForcedVideoStandard !== undefined)
133
+ cRSID.VideoStandard = cRSID.ForcedVideoStandard; // settings override (init-time)
134
+ if (cRSID_C64.SampleRate === 0)
135
+ cRSID_C64.SampleRate = 44100;
136
+ cRSID_C64.CPUfrequency = CPUspeeds[cRSID.VideoStandard];
137
+ cRSID_C64.SampleClockRatio = ((cRSID_C64.CPUfrequency << CRSpecC64.CRSID_CLOCK_FRACTIONAL_BITS) / cRSID_C64.SampleRate) | 0; // shifting (multiplication) enhances SampleClockRatio precision
138
+ cRSID_C64.OversampleClockRatio = ((cRSID_C64.SampleRate << CRSpecC64.CRSID_RESAMPLER_FRACTIONAL_BITS) / CRSpecC64.CRSID_PAL_AUDIO_CLOCK) | 0; // round( SID_AUDIO_CLOCK / C64->SampleRate );
139
+ cRSID_C64.OversampleClockRatioReciproc = (CRSpecC64.CRSID_PAL_AUDIO_CLOCK / cRSID_C64.SampleRate) | 0; // round?
140
+ cRSID_C64.VIC.RasterLines = ScanLines[cRSID.VideoStandard];
141
+ cRSID_C64.VIC.RasterRowCycles = ScanLineCycles[cRSID.VideoStandard];
142
+ cRSID.FrameCycles = cRSID_C64.VIC.RasterLines * cRSID_C64.VIC.RasterRowCycles; // 1x speed tune with VIC Vertical-blank timing
143
+ cRSID_C64.PrevRasterLine = -1; // so if $d012 is set once only don't disturb FrameCycleCnt
144
+ cRSID_setSIDmodels();
145
+ if (h.Version !== CRSID_FILEVERSION_WEBSID) {
146
+ cRSID_C64.SID[1].Channel = CRChannel.CRSID_CHANNEL_LEFT;
147
+ cRSID_createSIDchip(cRSID_C64, cRSID_C64.SID[2], cRSID_C64.SID[2].ChipModel, CRChannel.CRSID_CHANNEL_RIGHT, 0xd000 + h.SID2baseAddress * 16);
148
+ cRSID_createSIDchip(cRSID_C64, cRSID_C64.SID[3], cRSID_C64.SID[3].ChipModel, CRChannel.CRSID_CHANNEL_BOTH, 0xd000 + h.SID3baseAddress * 16);
149
+ // ensure disabling SID4 in non-WebSID format: (NULL-ing not preferred as it can overwrite stuff and cause Segfault in sample-thread)
150
+ cRSID_C64.SID[4].BaseAddress = 0x0000;
151
+ cRSID_C64.SID[4].BasePtr = cRSID_C64.SID[4].BasePtrRD = CRMemAddresses.CRSID_SID_SAFE_ADDRESS;
152
+ }
153
+ else {
154
+ cRSID_C64.SID[1].Channel = h.ModelFormatStandardH & 0x40 ? CRChannel.CRSID_CHANNEL_RIGHT : CRChannel.CRSID_CHANNEL_LEFT;
155
+ if (h.ModelFormatStandardH & 0x80)
156
+ cRSID_C64.SID[1].Channel = CRChannel.CRSID_CHANNEL_BOTH; // my own proposal for 'middle' channel
157
+ SIDchannel = h.SID2flagsL & 0x40 ? CRChannel.CRSID_CHANNEL_RIGHT : CRChannel.CRSID_CHANNEL_LEFT;
158
+ if (h.SID2flagsL & 0x80)
159
+ SIDchannel = CRChannel.CRSID_CHANNEL_BOTH;
160
+ cRSID_createSIDchip(cRSID_C64, cRSID_C64.SID[2], cRSID_C64.SID[2].ChipModel, SIDchannel, 0xd000 + h.SID2baseAddress * 16);
161
+ SIDchannel = h.SID3flagsL & 0x40 ? CRChannel.CRSID_CHANNEL_RIGHT : CRChannel.CRSID_CHANNEL_LEFT;
162
+ if (h.SID3flagsL & 0x80)
163
+ SIDchannel = CRChannel.CRSID_CHANNEL_BOTH;
164
+ cRSID_createSIDchip(cRSID_C64, cRSID_C64.SID[3], cRSID_C64.SID[3].ChipModel, SIDchannel, 0xd000 + h.SID3baseAddress * 16);
165
+ SIDchannel = h.SID4flagsL & 0x40 ? CRChannel.CRSID_CHANNEL_RIGHT : CRChannel.CRSID_CHANNEL_LEFT;
166
+ if (h.SID4flagsL & 0x80)
167
+ SIDchannel = CRChannel.CRSID_CHANNEL_BOTH;
168
+ cRSID_createSIDchip(cRSID_C64, cRSID_C64.SID[4], cRSID_C64.SID[4].ChipModel, SIDchannel, 0xd000 + h.SID4baseAddress * 16);
169
+ }
170
+ cRSID_C64.SIDchipCount =
171
+ 1 + (cRSID_C64.SID[2].BaseAddress > 0 ? 1 : 0) + (cRSID_C64.SID[3].BaseAddress > 0 ? 1 : 0) + (cRSID_C64.SID[4].BaseAddress > 0 ? 1 : 0);
172
+ if (cRSID_C64.SIDchipCount === 1)
173
+ cRSID_C64.SID[1].Channel = CRChannel.CRSID_CHANNEL_BOTH;
174
+ cRSID_C64.Attenuation = Attenuations[cRSID_C64.SIDchipCount];
175
+ }
176
+ // ---------------------------------------------------------------------------
177
+ // cRSID_initC64 (C64.c:155-178) — C64 Reset
178
+ // ---------------------------------------------------------------------------
179
+ const C64_RESET_VECTOR = 0xfffc;
180
+ export function cRSID_initC64(C64) {
181
+ cRSID_initSIDchip(C64, C64.SID[1]);
182
+ cRSID_initCIAchip(C64, C64.CIA[1]);
183
+ cRSID_initCIAchip(C64, C64.CIA[2]);
184
+ /* cRSID_setROMcontent(); */ cRSID_initMem(C64);
185
+ cRSID_initCPU(C64, (cRSID_readMem(C64, C64_RESET_VECTOR + 1) << 8) + cRSID_readMem(C64, C64_RESET_VECTOR));
186
+ C64.IRQ = C64.NMI = 0;
187
+ if (cRSID.HighQualitySID) {
188
+ C64.SID[1].NonFiltedSample = C64.SID[1].FilterInputSample = 0;
189
+ C64.SID[2].NonFiltedSample = C64.SID[2].FilterInputSample = 0;
190
+ C64.SID[3].NonFiltedSample = C64.SID[3].FilterInputSample = 0;
191
+ C64.SID[4].NonFiltedSample = C64.SID[4].FilterInputSample = 0;
192
+ C64.SID[1].PrevNonFiltedSample = C64.SID[1].PrevFilterInputSample = 0;
193
+ C64.SID[2].PrevNonFiltedSample = C64.SID[2].PrevFilterInputSample = 0;
194
+ C64.SID[3].PrevNonFiltedSample = C64.SID[3].PrevFilterInputSample = 0;
195
+ C64.SID[4].PrevNonFiltedSample = C64.SID[4].PrevFilterInputSample = 0;
196
+ }
197
+ C64.SampleCycleCnt = C64.OverSampleCycleCnt = 0;
198
+ }
199
+ // ---------------------------------------------------------------------------
200
+ // cRSID_emulateC64 (C64.c:179-286) — the per-sample emulation entry.
201
+ // ---------------------------------------------------------------------------
202
+ /** enum VUmeterParameters (C64.c:186). */
203
+ /** C integer division (truncates toward zero; JS `/` is not integer and
204
+ * `Math.floor` rounds down — not the same for negative operands). */
205
+ function divTrunc(a, b) {
206
+ return Math.trunc(a / b);
207
+ }
208
+ const VUMETER_LOWPASS_DIV = 16;
209
+ const VUMETER_DIVSHIFTS = 4 - CRAudioLevels.CRSID_WAVGEN_PRESHIFT;
210
+ export function cRSID_emulateC64(C64) {
211
+ let InstructionCycles;
212
+ let VUmeterUpdateCounter = C64.VIC.RowCycleCnt & 0; // (C: static unsigned char, only used in the !CLImode VU-meter path; 1-in-256 update)
213
+ // Cycle-based/-paced part of emulations:
214
+ while (C64.SampleCycleCnt <= C64.SampleClockRatio) {
215
+ if (!C64.RealSIDmode) {
216
+ if (C64.FrameCycleCnt >= cRSID.FrameCycles) {
217
+ C64.FrameCycleCnt -= cRSID.FrameCycles;
218
+ if (C64.Finished) {
219
+ // some tunes (e.g. Barbarian, A-Maze-Ing) don't always finish in 1 frame
220
+ cRSID_initCPU(C64, cRSID.PlayAddress); // (PSID docs say bank-register should always be set for each call's region)
221
+ C64.Finished = 0; // C64.SampleCycleCnt=0; //PSID workaround for some tunes (e.g. Galdrumway):
222
+ if (cRSID.TimerSource === 0)
223
+ C64.IObankRD[0xd019] = 0x81; // always simulate to player-calls that VIC-IRQ happened
224
+ else
225
+ C64.IObankRD[0xdc0d] = 0x83; // always simulate to player-calls that CIA TIMERA/TIMERB-IRQ happened
226
+ }
227
+ }
228
+ if (C64.Finished === 0) {
229
+ InstructionCycles = cRSID_emulateCPU(C64);
230
+ if (InstructionCycles >= 0xfe) {
231
+ InstructionCycles = 6;
232
+ C64.Finished = 1;
233
+ }
234
+ }
235
+ else
236
+ InstructionCycles = 7; // idle between player-calls
237
+ C64.FrameCycleCnt += InstructionCycles;
238
+ C64.IObankRD[0xdc04] = (C64.IObankRD[0xdc04] + InstructionCycles) & 0xff; // very simple CIA1 TimerA simulation for PSID (e.g. Delta-Mix_E-Load_loader)
239
+ }
240
+ else {
241
+ // RealSID emulations:
242
+ if (cRSID_handleCPUinterrupts(C64)) {
243
+ C64.Finished = 0;
244
+ InstructionCycles = 7;
245
+ }
246
+ else if (C64.Finished === 0) {
247
+ InstructionCycles = cRSID_emulateCPU(C64);
248
+ if (InstructionCycles >= 0xfe) {
249
+ /* if (InstructionCycles!=0xFE && !(C64.CPU.ST&I)) */
250
+ C64.Finished = 1;
251
+ InstructionCycles = 6;
252
+ }
253
+ }
254
+ else
255
+ InstructionCycles = 7; // idle between IRQ-calls
256
+ C64.IRQ = C64.NMI = 0; // prepare for collecting IRQ sources
257
+ C64.IRQ |= cRSID_emulateCIA(C64, C64.CIA[1], InstructionCycles);
258
+ C64.NMI |= cRSID_emulateCIA(C64, C64.CIA[2], InstructionCycles);
259
+ C64.IRQ |= cRSID_emulateVIC(C64, InstructionCycles);
260
+ }
261
+ C64.SampleCycleCnt += InstructionCycles << CRSpecC64.CRSID_CLOCK_FRACTIONAL_BITS;
262
+ cRSID_emulateADSRs(C64, C64.SID[1], InstructionCycles);
263
+ if (C64.SID[2].BaseAddress !== 0)
264
+ cRSID_emulateADSRs(C64, C64.SID[2], InstructionCycles);
265
+ if (C64.SID[3].BaseAddress !== 0)
266
+ cRSID_emulateADSRs(C64, C64.SID[3], InstructionCycles);
267
+ if (C64.SID[4].BaseAddress !== 0)
268
+ cRSID_emulateADSRs(C64, C64.SID[4], InstructionCycles);
269
+ } // end of 1MHz cycle-based emulations (CPU, VIC, CIA, ADSR)
270
+ C64.SampleCycleCnt -= C64.SampleClockRatio;
271
+ if (C64.HighQualitySID) {
272
+ // oversampled waveform-generation (although delayed ~22 cycles (~5 instructions) compared to CPU, shouldn't cause many issues (apart from cycle-exact SID-routines reading OSC3))
273
+ if (C64.HighQualityResampler)
274
+ cRSID_emulateHQresampledSIDs(C64); // high-quality but more CPU-hungry Sinc-based resampler (decimator)
275
+ else
276
+ cRSID_emulateOversampledSIDwaves(C64); // fast simple (but lower-quality) averager (box-filter) resampler
277
+ }
278
+ // Samplerate-based/-paced part of emulations:
279
+ if (!C64.RealSIDmode) {
280
+ // some PSID tunes use CIA TOD-clock (e.g. Kawasaki Synthesizer Demo)
281
+ --C64.TenthSecondCnt;
282
+ if (C64.TenthSecondCnt <= 0) {
283
+ C64.TenthSecondCnt = C64.SampleRate / 10;
284
+ ++C64.IObankRD[0xdc08];
285
+ if (C64.IObankRD[0xdc08] >= 10) {
286
+ C64.IObankRD[0xdc08] = 0;
287
+ ++C64.IObankRD[0xdc09];
288
+ // if (C64.IObankRD[0xDC09]%… (C source comment block truncated here too)
289
+ }
290
+ }
291
+ }
292
+ if (C64.SecondCnt < C64.SampleRate)
293
+ ++C64.SecondCnt;
294
+ else {
295
+ C64.SecondCnt = 0;
296
+ if (cRSID.PlayTime < 3600)
297
+ ++cRSID.PlayTime;
298
+ }
299
+ let Output;
300
+ if (C64.HighQualitySID) {
301
+ // SID output-stages and mono/stereo handling for High-Quality SID-emulation
302
+ Output = C64.HighQualityResampler ? cRSID_emulateHQresampledSIDoutputs(C64) : cRSID_emulateOversampledSIDoutputs(C64);
303
+ }
304
+ else
305
+ Output = cRSID_emulateLightSIDs(C64); // with special lightweight waveform-antialiasing code
306
+ // Output.L /= cRSID_C64.Attenuation (moved to the routing functions, as in C)
307
+ if (!cRSID.CLImode && !++VUmeterUpdateCounter) {
308
+ // average level (for VU-meter)
309
+ C64.SID[1].Level += divTrunc((Math.abs(C64.SID[1].Output) >> VUMETER_DIVSHIFTS) - C64.SID[1].Level, VUMETER_LOWPASS_DIV); // 16; //4; //1024;
310
+ if (C64.SID[2].BaseAddress !== 0)
311
+ C64.SID[2].Level += divTrunc((Math.abs(C64.SID[2].Output) >> VUMETER_DIVSHIFTS) - C64.SID[2].Level, VUMETER_LOWPASS_DIV); // 16; //1024;
312
+ if (C64.SID[3].BaseAddress !== 0)
313
+ C64.SID[3].Level += divTrunc((Math.abs(C64.SID[3].Output) >> VUMETER_DIVSHIFTS) - C64.SID[3].Level, VUMETER_LOWPASS_DIV); // 16; //1024;
314
+ if (C64.SID[4].BaseAddress !== 0)
315
+ C64.SID[4].Level += divTrunc((Math.abs(C64.SID[4].Output) >> VUMETER_DIVSHIFTS) - C64.SID[4].Level, VUMETER_LOWPASS_DIV); // 16; //1024;
316
+ }
317
+ return Output;
318
+ }
319
+ // ---------------------------------------------------------------------------
320
+ // The SID-routing functions (C64_SIDrouting.c) live in sidoscwaves-routing;
321
+ // imported here (C includes C64_SIDrouting.c after C64.c's own functions).
322
+ // ---------------------------------------------------------------------------
323
+ import { cRSID_emulateLightSIDs, cRSID_emulateOversampledSIDwaves, cRSID_emulateOversampledSIDoutputs, cRSID_emulateHQresampledSIDs, cRSID_emulateHQresampledSIDoutputs } from './sidrouting.js';
324
+ import { cRSID_emulateADSRs } from './sidadsr.js';
325
+ //# sourceMappingURL=c64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c64.js","sourceRoot":"","sources":["../src/c64.ts"],"names":[],"mappings":"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"}