@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.
- package/README.md +111 -2
- package/dist/c64.d.ts +8 -0
- package/dist/c64.d.ts.map +1 -0
- package/dist/c64.js +325 -0
- package/dist/c64.js.map +1 -0
- package/dist/c64types.d.ts +209 -0
- package/dist/c64types.d.ts.map +1 -0
- package/dist/c64types.js +181 -0
- package/dist/c64types.js.map +1 -0
- package/dist/cia.d.ts +19 -0
- package/dist/cia.d.ts.map +1 -0
- package/dist/cia.js +160 -0
- package/dist/cia.js.map +1 -0
- package/dist/combiwaves.d.ts +9 -0
- package/dist/combiwaves.d.ts.map +1 -0
- package/dist/combiwaves.js +533 -0
- package/dist/combiwaves.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -0
- package/dist/cpu.d.ts +12 -0
- package/dist/cpu.d.ts.map +1 -0
- package/dist/cpu.js +848 -0
- package/dist/cpu.js.map +1 -0
- package/dist/filtercurves.d.ts +13 -0
- package/dist/filtercurves.d.ts.map +1 -0
- package/dist/filtercurves.js +546 -0
- package/dist/filtercurves.js.map +1 -0
- package/dist/host.d.ts +4 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +14 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/instance.d.ts +119 -0
- package/dist/instance.d.ts.map +1 -0
- package/dist/instance.js +51 -0
- package/dist/instance.js.map +1 -0
- package/dist/loader.d.ts +26 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +383 -0
- package/dist/loader.js.map +1 -0
- package/dist/mem.d.ts +30 -0
- package/dist/mem.d.ts.map +1 -0
- package/dist/mem.js +187 -0
- package/dist/mem.js.map +1 -0
- package/dist/psiddigi.d.ts +3 -0
- package/dist/psiddigi.d.ts.map +1 -0
- package/dist/psiddigi.js +73 -0
- package/dist/psiddigi.js.map +1 -0
- package/dist/settings.d.ts +41 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +64 -0
- package/dist/settings.js.map +1 -0
- package/dist/sid.d.ts +21 -0
- package/dist/sid.d.ts.map +1 -0
- package/dist/sid.js +78 -0
- package/dist/sid.js.map +1 -0
- package/dist/sidadsr.d.ts +9 -0
- package/dist/sidadsr.d.ts.map +1 -0
- package/dist/sidadsr.js +105 -0
- package/dist/sidadsr.js.map +1 -0
- package/dist/sidoscwaves.d.ts +15 -0
- package/dist/sidoscwaves.d.ts.map +1 -0
- package/dist/sidoscwaves.js +475 -0
- package/dist/sidoscwaves.js.map +1 -0
- package/dist/sidoutputs.d.ts +17 -0
- package/dist/sidoutputs.d.ts.map +1 -0
- package/dist/sidoutputs.js +185 -0
- package/dist/sidoutputs.js.map +1 -0
- package/dist/sidplugin.d.ts +18 -0
- package/dist/sidplugin.d.ts.map +1 -0
- package/dist/sidplugin.js +174 -0
- package/dist/sidplugin.js.map +1 -0
- package/dist/sidrouting.d.ts +8 -0
- package/dist/sidrouting.d.ts.map +1 -0
- package/dist/sidrouting.js +560 -0
- package/dist/sidrouting.js.map +1 -0
- package/dist/sidseek.d.ts +8 -0
- package/dist/sidseek.d.ts.map +1 -0
- package/dist/sidseek.js +60 -0
- package/dist/sidseek.js.map +1 -0
- package/dist/sincwindow.d.ts +3 -0
- package/dist/sincwindow.d.ts.map +1 -0
- package/dist/sincwindow.js +78 -0
- package/dist/sincwindow.js.map +1 -0
- package/dist/songlengths.d.ts +20 -0
- package/dist/songlengths.d.ts.map +1 -0
- package/dist/songlengths.js +81 -0
- package/dist/songlengths.js.map +1 -0
- package/dist/vic.d.ts +14 -0
- package/dist/vic.d.ts.map +1 -0
- package/dist/vic.js +63 -0
- package/dist/vic.js.map +1 -0
- package/package.json +48 -4
package/README.md
CHANGED
|
@@ -1,3 +1,112 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @modplayjs/fmt-sid
|
|
2
2
|
|
|
3
|
-
|
|
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
|
package/dist/c64.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"c64.js","sourceRoot":"","sources":["../src/c64.ts"],"names":[],"mappings":"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"}
|