@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/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
|
package/dist/mem.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mem.js","sourceRoot":"","sources":["../src/mem.ts"],"names":[],"mappings":"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"}
|