nes-wasm 0.0.0-stage → 0.3.0

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 CHANGED
@@ -1,3 +1,75 @@
1
- # Temporary Holding Version
1
+ # nes-wasm
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
+ [nes-sim](https://crates.io/crates/nes-sim) 核心库的 WebAssembly 绑定(wasm-bindgen)。纯 Rust 实现的 NES/FC 模拟器核心,无依赖,可用于浏览器、Node 及各类 JS 运行时。
4
+
5
+ ## 安装
6
+
7
+ ```sh
8
+ npm install nes-wasm
9
+ ```
10
+
11
+ ```js
12
+ import init, { NesWasm } from "nes-wasm";
13
+ await init();
14
+ ```
15
+
16
+ ## 本地构建
17
+
18
+ ```sh
19
+ wasm-pack build nes-wasm --target web --release
20
+ # 产物输出到 nes-wasm/pkg/
21
+ ```
22
+
23
+ 其他 target:`--target bundler`(webpack/vite)、`--target web`(原生 ESM)、`--target nodejs`。
24
+
25
+ ## 使用示例
26
+
27
+ ```js
28
+ import init, { NesWasm } from "./pkg/nes_wasm.js"; // npm 安装时: from "nes-wasm"
29
+
30
+ await init(); // 或传 URL / 字节: init({ module_or_path: bytes })
31
+
32
+ const nes = new NesWasm();
33
+ nes.load_rom(new Uint8Array(romBytes)); // iNES;FDS 用 load_fds(image, bios)
34
+
35
+ const canvas = document.querySelector("canvas");
36
+ canvas.width = 256;
37
+ canvas.height = 240;
38
+ const ctx = canvas.getContext("2d");
39
+ const imageData = ctx.createImageData(256, 240);
40
+
41
+ // 手柄位掩码:A=1 B=2 Select=4 Start=8 Up=16 Down=32 Left=64 Right=128
42
+ nes.set_controller_bits(0, 0x08 | 0x10); // Start + Up
43
+ // 或按名称:nes.set_button(0, "Start", true)
44
+
45
+ function loop() {
46
+ nes.run_frame(); // 模拟一帧
47
+ imageData.data.set(nes.frame_rgba()); // RGBA 帧缓冲
48
+ ctx.putImageData(imageData, 0, 0);
49
+
50
+ // 音频(单声道 f32,采样率见 nes.audio_sample_rate())
51
+ const samples = nes.audio_samples();
52
+ nes.clear_audio_samples();
53
+
54
+ requestAnimationFrame(loop);
55
+ }
56
+ loop();
57
+ ```
58
+
59
+ ## API 摘要
60
+
61
+ | 方法 | 说明 |
62
+ | --- | --- |
63
+ | `load_rom(rom)` / `load_fds(image, bios)` | 加载 ROM |
64
+ | `reset()` / `power_cycle()` | 复位 / 断电重启 |
65
+ | `run_frame()` | 运行一帧,返回帧号 |
66
+ | `frame_rgba()` | RGBA 帧缓冲(256×240×4),可直接写 `ImageData` |
67
+ | `frame_pixels()` | 8 位调色板索引帧;`palette_rgb()` 为 64 色系统调色板 |
68
+ | `audio_samples()` / `clear_audio_samples()` / `audio_sample_rate()` / `set_audio_sample_rate(rate)` | 音频 |
69
+ | `set_controller_bits(port, bits)` / `set_button(port, name, pressed)` | 手柄输入 |
70
+ | `save_state()` / `load_state(bytes)` | 快照存读档 |
71
+ | `battery_ram()` / `load_battery_ram(data)` | 电池 RAM(.sav) |
72
+ | `fds_dirty()` / `fds_sides_flattened()` / `fds_side_lengths()` | FDS 磁盘写回 |
73
+ | `rom_md5_hex()` / `frame_number()` / `master_clock()` | 元信息 |
74
+
75
+ 冒烟测试:`node nes-wasm/smoke.mjs [rom路径]`(需先构建 pkg)。
package/nes_wasm.d.ts ADDED
@@ -0,0 +1,170 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+
4
+ export class NesWasm {
5
+ free(): void;
6
+ [Symbol.dispose](): void;
7
+ /**
8
+ * 当前音频采样率(Hz)。
9
+ */
10
+ audio_sample_rate(): number;
11
+ /**
12
+ * 自上次读取以来累积的音频采样(单声道 f32)。
13
+ */
14
+ audio_samples(): Float32Array;
15
+ /**
16
+ * 电池后备 PRG RAM(无电池卡带返回 null)。
17
+ */
18
+ battery_ram(): Uint8Array | undefined;
19
+ /**
20
+ * 清空累积的音频采样(每轮播放后调用)。
21
+ */
22
+ clear_audio_samples(): void;
23
+ /**
24
+ * 当前手柄位掩码。
25
+ */
26
+ controller_bits(port: number): number;
27
+ /**
28
+ * FDS 磁盘是否被写入过(写回 .sav 用);非 FDS 返回 false。
29
+ */
30
+ fds_dirty(): boolean;
31
+ /**
32
+ * FDS 每面磁盘数据的字节长度(切分 `fds_sides_flattened` 用)。
33
+ */
34
+ fds_side_lengths(): Uint32Array;
35
+ /**
36
+ * FDS 每面磁盘数据扁平拼接(配合 `fds_side_lengths` 切分);非 FDS 返回 null。
37
+ */
38
+ fds_sides_flattened(): Uint8Array | undefined;
39
+ /**
40
+ * 帧号。
41
+ */
42
+ frame_number(): bigint;
43
+ /**
44
+ * 8 位调色板索引帧(256×240),适合配合 `palette_rgb` 使用。
45
+ */
46
+ frame_pixels(): Uint8Array;
47
+ /**
48
+ * RGBA 帧缓冲(256×240×4),可直接写入 `ImageData`。
49
+ */
50
+ frame_rgba(): Uint8Array;
51
+ /**
52
+ * 载入电池后备 PRG RAM(.sav 文件内容)。
53
+ */
54
+ load_battery_ram(data: Uint8Array): void;
55
+ /**
56
+ * 加载 FDS 磁盘镜像(需提供 BIOS ROM 数据)。
57
+ */
58
+ load_fds(image: Uint8Array, bios: Uint8Array): void;
59
+ /**
60
+ * 按格式嗅探加载 iNES ROM(FDS 请用 `load_fds`)。
61
+ */
62
+ load_rom(rom: Uint8Array): void;
63
+ /**
64
+ * 读档。
65
+ */
66
+ load_state(bytes: Uint8Array): void;
67
+ /**
68
+ * 主时钟周期数。
69
+ */
70
+ master_clock(): bigint;
71
+ constructor();
72
+ /**
73
+ * 系统调色板,64 色 × 3 字节 RGB。
74
+ */
75
+ static palette_rgb(): Uint8Array;
76
+ /**
77
+ * 模拟断电重启(CPU RAM 清零后复位)。
78
+ */
79
+ power_cycle(): void;
80
+ /**
81
+ * 近似硬件 RESET 键。
82
+ */
83
+ reset(): void;
84
+ /**
85
+ * 当前卡带 PRG‖CHR 的 MD5 十六进制字符串。
86
+ */
87
+ rom_md5_hex(): string | undefined;
88
+ /**
89
+ * 运行到下一帧完成,返回新的帧号。
90
+ */
91
+ run_frame(): bigint;
92
+ /**
93
+ * 存档(快照)。
94
+ */
95
+ save_state(): Uint8Array;
96
+ /**
97
+ * 设置 APU 采样率(对齐前端 AudioContext,如 48000)。
98
+ */
99
+ set_audio_sample_rate(rate: number): void;
100
+ /**
101
+ * 便捷方法:按名称按键(其余按键状态保持不变)。
102
+ * 名称为 "A" "B" "Select" "Start" "Up" "Down" "Left" "Right"。
103
+ */
104
+ set_button(port: number, button: string, pressed: boolean): void;
105
+ /**
106
+ * 设置手柄位掩码:A=1 B=2 Select=4 Start=8 Up=16 Down=32 Left=64 Right=128。
107
+ */
108
+ set_controller_bits(port: number, bits: number): void;
109
+ }
110
+
111
+ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
112
+
113
+ export interface InitOutput {
114
+ readonly memory: WebAssembly.Memory;
115
+ readonly __wbg_neswasm_free: (a: number, b: number) => void;
116
+ readonly neswasm_audio_sample_rate: (a: number) => number;
117
+ readonly neswasm_audio_samples: (a: number) => [number, number];
118
+ readonly neswasm_battery_ram: (a: number) => [number, number];
119
+ readonly neswasm_clear_audio_samples: (a: number) => void;
120
+ readonly neswasm_controller_bits: (a: number, b: number) => number;
121
+ readonly neswasm_fds_dirty: (a: number) => number;
122
+ readonly neswasm_fds_side_lengths: (a: number) => [number, number];
123
+ readonly neswasm_fds_sides_flattened: (a: number) => [number, number];
124
+ readonly neswasm_frame_number: (a: number) => bigint;
125
+ readonly neswasm_frame_pixels: (a: number) => [number, number];
126
+ readonly neswasm_frame_rgba: (a: number) => [number, number];
127
+ readonly neswasm_load_battery_ram: (a: number, b: number, c: number) => void;
128
+ readonly neswasm_load_fds: (a: number, b: number, c: number, d: number, e: number) => [number, number];
129
+ readonly neswasm_load_rom: (a: number, b: number, c: number) => [number, number];
130
+ readonly neswasm_load_state: (a: number, b: number, c: number) => [number, number];
131
+ readonly neswasm_master_clock: (a: number) => bigint;
132
+ readonly neswasm_new: () => number;
133
+ readonly neswasm_palette_rgb: () => [number, number];
134
+ readonly neswasm_power_cycle: (a: number) => void;
135
+ readonly neswasm_reset: (a: number) => void;
136
+ readonly neswasm_rom_md5_hex: (a: number) => [number, number];
137
+ readonly neswasm_run_frame: (a: number) => bigint;
138
+ readonly neswasm_save_state: (a: number) => [number, number, number, number];
139
+ readonly neswasm_set_audio_sample_rate: (a: number, b: number) => void;
140
+ readonly neswasm_set_button: (a: number, b: number, c: number, d: number, e: number) => void;
141
+ readonly neswasm_set_controller_bits: (a: number, b: number, c: number) => void;
142
+ readonly __wbindgen_externrefs: WebAssembly.Table;
143
+ readonly __wbindgen_free: (a: number, b: number, c: number) => void;
144
+ readonly __wbindgen_malloc: (a: number, b: number) => number;
145
+ readonly __externref_table_dealloc: (a: number) => void;
146
+ readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
147
+ readonly __wbindgen_start: () => void;
148
+ }
149
+
150
+ export type SyncInitInput = BufferSource | WebAssembly.Module;
151
+
152
+ /**
153
+ * Instantiates the given `module`, which can either be bytes or
154
+ * a precompiled `WebAssembly.Module`.
155
+ *
156
+ * @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated.
157
+ *
158
+ * @returns {InitOutput}
159
+ */
160
+ export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput;
161
+
162
+ /**
163
+ * If `module_or_path` is {RequestInfo} or {URL}, makes a request and
164
+ * for everything else, calls `WebAssembly.instantiate` directly.
165
+ *
166
+ * @param {{ module_or_path: InitInput | Promise<InitInput> }} module_or_path - Passing `InitInput` directly is deprecated.
167
+ *
168
+ * @returns {Promise<InitOutput>}
169
+ */
170
+ export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise<InitInput> } | InitInput | Promise<InitInput>): Promise<InitOutput>;
package/nes_wasm.js ADDED
@@ -0,0 +1,511 @@
1
+ /* @ts-self-types="./nes_wasm.d.ts" */
2
+
3
+ export class NesWasm {
4
+ __destroy_into_raw() {
5
+ const ptr = this.__wbg_ptr;
6
+ this.__wbg_ptr = 0;
7
+ NesWasmFinalization.unregister(this);
8
+ return ptr;
9
+ }
10
+ free() {
11
+ const ptr = this.__destroy_into_raw();
12
+ wasm.__wbg_neswasm_free(ptr, 0);
13
+ }
14
+ /**
15
+ * 当前音频采样率(Hz)。
16
+ * @returns {number}
17
+ */
18
+ audio_sample_rate() {
19
+ const ret = wasm.neswasm_audio_sample_rate(this.__wbg_ptr);
20
+ return ret >>> 0;
21
+ }
22
+ /**
23
+ * 自上次读取以来累积的音频采样(单声道 f32)。
24
+ * @returns {Float32Array}
25
+ */
26
+ audio_samples() {
27
+ const ret = wasm.neswasm_audio_samples(this.__wbg_ptr);
28
+ var v1 = getArrayF32FromWasm0(ret[0], ret[1]).slice();
29
+ wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
30
+ return v1;
31
+ }
32
+ /**
33
+ * 电池后备 PRG RAM(无电池卡带返回 null)。
34
+ * @returns {Uint8Array | undefined}
35
+ */
36
+ battery_ram() {
37
+ const ret = wasm.neswasm_battery_ram(this.__wbg_ptr);
38
+ let v1;
39
+ if (ret[0] !== 0) {
40
+ v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
41
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
42
+ }
43
+ return v1;
44
+ }
45
+ /**
46
+ * 清空累积的音频采样(每轮播放后调用)。
47
+ */
48
+ clear_audio_samples() {
49
+ wasm.neswasm_clear_audio_samples(this.__wbg_ptr);
50
+ }
51
+ /**
52
+ * 当前手柄位掩码。
53
+ * @param {number} port
54
+ * @returns {number}
55
+ */
56
+ controller_bits(port) {
57
+ const ret = wasm.neswasm_controller_bits(this.__wbg_ptr, port);
58
+ return ret;
59
+ }
60
+ /**
61
+ * FDS 磁盘是否被写入过(写回 .sav 用);非 FDS 返回 false。
62
+ * @returns {boolean}
63
+ */
64
+ fds_dirty() {
65
+ const ret = wasm.neswasm_fds_dirty(this.__wbg_ptr);
66
+ return ret !== 0;
67
+ }
68
+ /**
69
+ * FDS 每面磁盘数据的字节长度(切分 `fds_sides_flattened` 用)。
70
+ * @returns {Uint32Array}
71
+ */
72
+ fds_side_lengths() {
73
+ const ret = wasm.neswasm_fds_side_lengths(this.__wbg_ptr);
74
+ var v1 = getArrayU32FromWasm0(ret[0], ret[1]).slice();
75
+ wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
76
+ return v1;
77
+ }
78
+ /**
79
+ * FDS 每面磁盘数据扁平拼接(配合 `fds_side_lengths` 切分);非 FDS 返回 null。
80
+ * @returns {Uint8Array | undefined}
81
+ */
82
+ fds_sides_flattened() {
83
+ const ret = wasm.neswasm_fds_sides_flattened(this.__wbg_ptr);
84
+ let v1;
85
+ if (ret[0] !== 0) {
86
+ v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
87
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
88
+ }
89
+ return v1;
90
+ }
91
+ /**
92
+ * 帧号。
93
+ * @returns {bigint}
94
+ */
95
+ frame_number() {
96
+ const ret = wasm.neswasm_frame_number(this.__wbg_ptr);
97
+ return BigInt.asUintN(64, ret);
98
+ }
99
+ /**
100
+ * 8 位调色板索引帧(256×240),适合配合 `palette_rgb` 使用。
101
+ * @returns {Uint8Array}
102
+ */
103
+ frame_pixels() {
104
+ const ret = wasm.neswasm_frame_pixels(this.__wbg_ptr);
105
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
106
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
107
+ return v1;
108
+ }
109
+ /**
110
+ * RGBA 帧缓冲(256×240×4),可直接写入 `ImageData`。
111
+ * @returns {Uint8Array}
112
+ */
113
+ frame_rgba() {
114
+ const ret = wasm.neswasm_frame_rgba(this.__wbg_ptr);
115
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
116
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
117
+ return v1;
118
+ }
119
+ /**
120
+ * 载入电池后备 PRG RAM(.sav 文件内容)。
121
+ * @param {Uint8Array} data
122
+ */
123
+ load_battery_ram(data) {
124
+ const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc);
125
+ const len0 = WASM_VECTOR_LEN;
126
+ wasm.neswasm_load_battery_ram(this.__wbg_ptr, ptr0, len0);
127
+ }
128
+ /**
129
+ * 加载 FDS 磁盘镜像(需提供 BIOS ROM 数据)。
130
+ * @param {Uint8Array} image
131
+ * @param {Uint8Array} bios
132
+ */
133
+ load_fds(image, bios) {
134
+ const ptr0 = passArray8ToWasm0(image, wasm.__wbindgen_malloc);
135
+ const len0 = WASM_VECTOR_LEN;
136
+ const ptr1 = passArray8ToWasm0(bios, wasm.__wbindgen_malloc);
137
+ const len1 = WASM_VECTOR_LEN;
138
+ const ret = wasm.neswasm_load_fds(this.__wbg_ptr, ptr0, len0, ptr1, len1);
139
+ if (ret[1]) {
140
+ throw takeFromExternrefTable0(ret[0]);
141
+ }
142
+ }
143
+ /**
144
+ * 按格式嗅探加载 iNES ROM(FDS 请用 `load_fds`)。
145
+ * @param {Uint8Array} rom
146
+ */
147
+ load_rom(rom) {
148
+ const ptr0 = passArray8ToWasm0(rom, wasm.__wbindgen_malloc);
149
+ const len0 = WASM_VECTOR_LEN;
150
+ const ret = wasm.neswasm_load_rom(this.__wbg_ptr, ptr0, len0);
151
+ if (ret[1]) {
152
+ throw takeFromExternrefTable0(ret[0]);
153
+ }
154
+ }
155
+ /**
156
+ * 读档。
157
+ * @param {Uint8Array} bytes
158
+ */
159
+ load_state(bytes) {
160
+ const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc);
161
+ const len0 = WASM_VECTOR_LEN;
162
+ const ret = wasm.neswasm_load_state(this.__wbg_ptr, ptr0, len0);
163
+ if (ret[1]) {
164
+ throw takeFromExternrefTable0(ret[0]);
165
+ }
166
+ }
167
+ /**
168
+ * 主时钟周期数。
169
+ * @returns {bigint}
170
+ */
171
+ master_clock() {
172
+ const ret = wasm.neswasm_master_clock(this.__wbg_ptr);
173
+ return BigInt.asUintN(64, ret);
174
+ }
175
+ constructor() {
176
+ const ret = wasm.neswasm_new();
177
+ this.__wbg_ptr = ret;
178
+ NesWasmFinalization.register(this, this.__wbg_ptr, this);
179
+ return this;
180
+ }
181
+ /**
182
+ * 系统调色板,64 色 × 3 字节 RGB。
183
+ * @returns {Uint8Array}
184
+ */
185
+ static palette_rgb() {
186
+ const ret = wasm.neswasm_palette_rgb();
187
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
188
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
189
+ return v1;
190
+ }
191
+ /**
192
+ * 模拟断电重启(CPU RAM 清零后复位)。
193
+ */
194
+ power_cycle() {
195
+ wasm.neswasm_power_cycle(this.__wbg_ptr);
196
+ }
197
+ /**
198
+ * 近似硬件 RESET 键。
199
+ */
200
+ reset() {
201
+ wasm.neswasm_reset(this.__wbg_ptr);
202
+ }
203
+ /**
204
+ * 当前卡带 PRG‖CHR 的 MD5 十六进制字符串。
205
+ * @returns {string | undefined}
206
+ */
207
+ rom_md5_hex() {
208
+ const ret = wasm.neswasm_rom_md5_hex(this.__wbg_ptr);
209
+ let v1;
210
+ if (ret[0] !== 0) {
211
+ v1 = getStringFromWasm0(ret[0], ret[1]).slice();
212
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
213
+ }
214
+ return v1;
215
+ }
216
+ /**
217
+ * 运行到下一帧完成,返回新的帧号。
218
+ * @returns {bigint}
219
+ */
220
+ run_frame() {
221
+ const ret = wasm.neswasm_run_frame(this.__wbg_ptr);
222
+ return BigInt.asUintN(64, ret);
223
+ }
224
+ /**
225
+ * 存档(快照)。
226
+ * @returns {Uint8Array}
227
+ */
228
+ save_state() {
229
+ const ret = wasm.neswasm_save_state(this.__wbg_ptr);
230
+ if (ret[3]) {
231
+ throw takeFromExternrefTable0(ret[2]);
232
+ }
233
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
234
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
235
+ return v1;
236
+ }
237
+ /**
238
+ * 设置 APU 采样率(对齐前端 AudioContext,如 48000)。
239
+ * @param {number} rate
240
+ */
241
+ set_audio_sample_rate(rate) {
242
+ wasm.neswasm_set_audio_sample_rate(this.__wbg_ptr, rate);
243
+ }
244
+ /**
245
+ * 便捷方法:按名称按键(其余按键状态保持不变)。
246
+ * 名称为 "A" "B" "Select" "Start" "Up" "Down" "Left" "Right"。
247
+ * @param {number} port
248
+ * @param {string} button
249
+ * @param {boolean} pressed
250
+ */
251
+ set_button(port, button, pressed) {
252
+ const ptr0 = passStringToWasm0(button, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
253
+ const len0 = WASM_VECTOR_LEN;
254
+ wasm.neswasm_set_button(this.__wbg_ptr, port, ptr0, len0, pressed);
255
+ }
256
+ /**
257
+ * 设置手柄位掩码:A=1 B=2 Select=4 Start=8 Up=16 Down=32 Left=64 Right=128。
258
+ * @param {number} port
259
+ * @param {number} bits
260
+ */
261
+ set_controller_bits(port, bits) {
262
+ wasm.neswasm_set_controller_bits(this.__wbg_ptr, port, bits);
263
+ }
264
+ }
265
+ if (Symbol.dispose) NesWasm.prototype[Symbol.dispose] = NesWasm.prototype.free;
266
+ function __wbg_get_imports() {
267
+ const import0 = {
268
+ __proto__: null,
269
+ __wbg_Error_9dc85fe1bc224456: function(arg0, arg1) {
270
+ const ret = Error(getStringFromWasm0(arg0, arg1));
271
+ return ret;
272
+ },
273
+ __wbg___wbindgen_throw_bbadd78c1bac3a77: function(arg0, arg1) {
274
+ throw new Error(getStringFromWasm0(arg0, arg1));
275
+ },
276
+ __wbindgen_init_externref_table: function() {
277
+ const table = wasm.__wbindgen_externrefs;
278
+ const offset = table.grow(4);
279
+ table.set(0, undefined);
280
+ table.set(offset + 0, undefined);
281
+ table.set(offset + 1, null);
282
+ table.set(offset + 2, true);
283
+ table.set(offset + 3, false);
284
+ },
285
+ };
286
+ return {
287
+ __proto__: null,
288
+ "./nes_wasm_bg.js": import0,
289
+ };
290
+ }
291
+
292
+ const NesWasmFinalization = (typeof FinalizationRegistry === 'undefined')
293
+ ? { register: () => {}, unregister: () => {} }
294
+ : new FinalizationRegistry(ptr => wasm.__wbg_neswasm_free(ptr, 1));
295
+
296
+ function getArrayF32FromWasm0(ptr, len) {
297
+ ptr = ptr >>> 0;
298
+ return getFloat32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);
299
+ }
300
+
301
+ function getArrayU32FromWasm0(ptr, len) {
302
+ ptr = ptr >>> 0;
303
+ return getUint32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);
304
+ }
305
+
306
+ function getArrayU8FromWasm0(ptr, len) {
307
+ ptr = ptr >>> 0;
308
+ return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);
309
+ }
310
+
311
+ let cachedFloat32ArrayMemory0 = null;
312
+ function getFloat32ArrayMemory0() {
313
+ if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) {
314
+ cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer);
315
+ }
316
+ return cachedFloat32ArrayMemory0;
317
+ }
318
+
319
+ function getStringFromWasm0(ptr, len) {
320
+ return decodeText(ptr >>> 0, len);
321
+ }
322
+
323
+ let cachedUint32ArrayMemory0 = null;
324
+ function getUint32ArrayMemory0() {
325
+ if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) {
326
+ cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer);
327
+ }
328
+ return cachedUint32ArrayMemory0;
329
+ }
330
+
331
+ let cachedUint8ArrayMemory0 = null;
332
+ function getUint8ArrayMemory0() {
333
+ if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
334
+ cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
335
+ }
336
+ return cachedUint8ArrayMemory0;
337
+ }
338
+
339
+ function passArray8ToWasm0(arg, malloc) {
340
+ const ptr = malloc(arg.length * 1, 1) >>> 0;
341
+ getUint8ArrayMemory0().set(arg, ptr / 1);
342
+ WASM_VECTOR_LEN = arg.length;
343
+ return ptr;
344
+ }
345
+
346
+ function passStringToWasm0(arg, malloc, realloc) {
347
+ if (realloc === undefined) {
348
+ const buf = cachedTextEncoder.encode(arg);
349
+ const ptr = malloc(buf.length, 1) >>> 0;
350
+ getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);
351
+ WASM_VECTOR_LEN = buf.length;
352
+ return ptr;
353
+ }
354
+
355
+ let len = arg.length;
356
+ let ptr = malloc(len, 1) >>> 0;
357
+
358
+ const mem = getUint8ArrayMemory0();
359
+
360
+ let offset = 0;
361
+
362
+ for (; offset < len; offset++) {
363
+ const code = arg.charCodeAt(offset);
364
+ if (code > 0x7F) break;
365
+ mem[ptr + offset] = code;
366
+ }
367
+ if (offset !== len) {
368
+ if (offset !== 0) {
369
+ arg = arg.slice(offset);
370
+ }
371
+ ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
372
+ const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
373
+ const ret = cachedTextEncoder.encodeInto(arg, view);
374
+
375
+ offset += ret.written;
376
+ ptr = realloc(ptr, len, offset, 1) >>> 0;
377
+ }
378
+
379
+ WASM_VECTOR_LEN = offset;
380
+ return ptr;
381
+ }
382
+
383
+ function takeFromExternrefTable0(idx) {
384
+ const value = wasm.__wbindgen_externrefs.get(idx);
385
+ wasm.__externref_table_dealloc(idx);
386
+ return value;
387
+ }
388
+
389
+ let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
390
+ cachedTextDecoder.decode();
391
+ const MAX_SAFARI_DECODE_BYTES = 2146435072;
392
+ let numBytesDecoded = 0;
393
+ function decodeText(ptr, len) {
394
+ numBytesDecoded += len;
395
+ if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {
396
+ cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
397
+ cachedTextDecoder.decode();
398
+ numBytesDecoded = len;
399
+ }
400
+ return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
401
+ }
402
+
403
+ const cachedTextEncoder = new TextEncoder();
404
+
405
+ if (!('encodeInto' in cachedTextEncoder)) {
406
+ cachedTextEncoder.encodeInto = function (arg, view) {
407
+ const buf = cachedTextEncoder.encode(arg);
408
+ view.set(buf);
409
+ return {
410
+ read: arg.length,
411
+ written: buf.length
412
+ };
413
+ };
414
+ }
415
+
416
+ let WASM_VECTOR_LEN = 0;
417
+
418
+ let wasmModule, wasmInstance, wasm;
419
+ function __wbg_finalize_init(instance, module) {
420
+ wasmInstance = instance;
421
+ wasm = instance.exports;
422
+ wasmModule = module;
423
+ cachedFloat32ArrayMemory0 = null;
424
+ cachedUint32ArrayMemory0 = null;
425
+ cachedUint8ArrayMemory0 = null;
426
+ wasm.__wbindgen_start();
427
+ return wasm;
428
+ }
429
+
430
+ async function __wbg_load(module, imports) {
431
+ if (typeof Response === 'function' && module instanceof Response) {
432
+ if (typeof WebAssembly.instantiateStreaming === 'function') {
433
+ try {
434
+ return await WebAssembly.instantiateStreaming(module, imports);
435
+ } catch (e) {
436
+ const validResponse = module.ok && expectedResponseType(module.type);
437
+
438
+ if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {
439
+ console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
440
+
441
+ } else { throw e; }
442
+ }
443
+ }
444
+
445
+ const bytes = await module.arrayBuffer();
446
+ return await WebAssembly.instantiate(bytes, imports);
447
+ } else {
448
+ const instance = await WebAssembly.instantiate(module, imports);
449
+
450
+ if (instance instanceof WebAssembly.Instance) {
451
+ return { instance, module };
452
+ } else {
453
+ return instance;
454
+ }
455
+ }
456
+
457
+ function expectedResponseType(type) {
458
+ switch (type) {
459
+ case 'basic': case 'cors': case 'default': return true;
460
+ }
461
+ return false;
462
+ }
463
+ }
464
+
465
+ function initSync(module) {
466
+ if (wasm !== undefined) return wasm;
467
+
468
+
469
+ if (module !== undefined) {
470
+ if (Object.getPrototypeOf(module) === Object.prototype) {
471
+ ({module} = module)
472
+ } else {
473
+ console.warn('using deprecated parameters for `initSync()`; pass a single object instead')
474
+ }
475
+ }
476
+
477
+ const imports = __wbg_get_imports();
478
+ if (!(module instanceof WebAssembly.Module)) {
479
+ module = new WebAssembly.Module(module);
480
+ }
481
+ const instance = new WebAssembly.Instance(module, imports);
482
+ return __wbg_finalize_init(instance, module);
483
+ }
484
+
485
+ async function __wbg_init(module_or_path) {
486
+ if (wasm !== undefined) return wasm;
487
+
488
+
489
+ if (module_or_path !== undefined) {
490
+ if (Object.getPrototypeOf(module_or_path) === Object.prototype) {
491
+ ({module_or_path} = module_or_path)
492
+ } else {
493
+ console.warn('using deprecated parameters for the initialization function; pass a single object instead')
494
+ }
495
+ }
496
+
497
+ if (module_or_path === undefined) {
498
+ module_or_path = new URL('nes_wasm_bg.wasm', import.meta.url);
499
+ }
500
+ const imports = __wbg_get_imports();
501
+
502
+ if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {
503
+ module_or_path = fetch(module_or_path);
504
+ }
505
+
506
+ const { instance, module } = await __wbg_load(await module_or_path, imports);
507
+
508
+ return __wbg_finalize_init(instance, module);
509
+ }
510
+
511
+ export { initSync, __wbg_init as default };
Binary file
package/package.json CHANGED
@@ -1,6 +1,22 @@
1
1
  {
2
2
  "name": "nes-wasm",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "type": "module",
4
+ "description": "WebAssembly bindings for the nes-sim NES emulator core.",
5
+ "version": "0.3.0",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/taiyuuki/nes-sim"
10
+ },
11
+ "files": [
12
+ "nes_wasm_bg.wasm",
13
+ "nes_wasm.js",
14
+ "nes_wasm.d.ts"
15
+ ],
16
+ "main": "nes_wasm.js",
17
+ "homepage": "https://github.com/taiyuuki/nes-sim",
18
+ "types": "nes_wasm.d.ts",
19
+ "sideEffects": [
20
+ "./snippets/*"
21
+ ]
6
22
  }