nes-wasm 0.3.0 → 0.4.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
@@ -65,6 +65,7 @@ loop();
65
65
  | `run_frame()` | 运行一帧,返回帧号 |
66
66
  | `frame_rgba()` | RGBA 帧缓冲(256×240×4),可直接写 `ImageData` |
67
67
  | `frame_pixels()` | 8 位调色板索引帧;`palette_rgb()` 为 64 色系统调色板 |
68
+ | `set_palette(bytes)` / `clear_palette()` | 加载/重置 `.pal` 调色板(FCEUX/Nestopia 格式,192=64 色或 1536=512 色);`palette_rgb_full()` 返回当前 512×3 字节 |
68
69
  | `audio_samples()` / `clear_audio_samples()` / `audio_sample_rate()` / `set_audio_sample_rate(rate)` | 音频 |
69
70
  | `set_controller_bits(port, bits)` / `set_button(port, name, pressed)` | 手柄输入 |
70
71
  | `save_state()` / `load_state(bytes)` | 快照存读档 |
package/nes_wasm.d.ts CHANGED
@@ -20,10 +20,18 @@ export class NesWasm {
20
20
  * 清空累积的音频采样(每轮播放后调用)。
21
21
  */
22
22
  clear_audio_samples(): void;
23
+ /**
24
+ * 恢复默认调色板。
25
+ */
26
+ clear_palette(): void;
23
27
  /**
24
28
  * 当前手柄位掩码。
25
29
  */
26
30
  controller_bits(port: number): number;
31
+ /**
32
+ * 当前帧的颜色强调掩码(bit0=R, bit1=G, bit2=B)。
33
+ */
34
+ emphasis_bits(): number;
27
35
  /**
28
36
  * FDS 磁盘是否被写入过(写回 .sav 用);非 FDS 返回 false。
29
37
  */
@@ -46,6 +54,7 @@ export class NesWasm {
46
54
  frame_pixels(): Uint8Array;
47
55
  /**
48
56
  * RGBA 帧缓冲(256×240×4),可直接写入 `ImageData`。
57
+ * 已应用当前帧的颜色强调($2001 bit5-7)与当前调色板。
49
58
  */
50
59
  frame_rgba(): Uint8Array;
51
60
  /**
@@ -70,9 +79,19 @@ export class NesWasm {
70
79
  master_clock(): bigint;
71
80
  constructor();
72
81
  /**
73
- * 系统调色板,64 色 × 3 字节 RGB。
82
+ * 系统调色板,64 色 × 3 字节 RGB(当前调色板的基色块,不含强调)。
83
+ */
84
+ palette_rgb(): Uint8Array;
85
+ /**
86
+ * 当前调色板完整 512 色 × 3 字节 RGB
87
+ * (8 个强调块,布局 `(emphasis<<6|color)*3`,供 JS 构建 LUT)。
88
+ */
89
+ palette_rgb_full(): Uint8Array;
90
+ /**
91
+ * 应用颜色强调后的系统调色板,64 色 × 3 字节 RGB
92
+ * (emphasis 为 `emphasis_bits` 返回的掩码,取自当前调色板)。
74
93
  */
75
- static palette_rgb(): Uint8Array;
94
+ palette_rgb_tinted(emphasis: number): Uint8Array;
76
95
  /**
77
96
  * 模拟断电重启(CPU RAM 清零后复位)。
78
97
  */
@@ -106,6 +125,11 @@ export class NesWasm {
106
125
  * 设置手柄位掩码:A=1 B=2 Select=4 Start=8 Up=16 Down=32 Left=64 Right=128。
107
126
  */
108
127
  set_controller_bits(port: number, bits: number): void;
128
+ /**
129
+ * 加载 .pal 调色板文件内容(FCEUX/Nestopia 通用格式):
130
+ * 192 字节 = 64 色基色(强调块自动合成);1536 字节 = 512 色(自带强调块)。
131
+ */
132
+ set_palette(bytes: Uint8Array): void;
109
133
  }
110
134
 
111
135
  export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
@@ -117,7 +141,9 @@ export interface InitOutput {
117
141
  readonly neswasm_audio_samples: (a: number) => [number, number];
118
142
  readonly neswasm_battery_ram: (a: number) => [number, number];
119
143
  readonly neswasm_clear_audio_samples: (a: number) => void;
144
+ readonly neswasm_clear_palette: (a: number) => void;
120
145
  readonly neswasm_controller_bits: (a: number, b: number) => number;
146
+ readonly neswasm_emphasis_bits: (a: number) => number;
121
147
  readonly neswasm_fds_dirty: (a: number) => number;
122
148
  readonly neswasm_fds_side_lengths: (a: number) => [number, number];
123
149
  readonly neswasm_fds_sides_flattened: (a: number) => [number, number];
@@ -130,7 +156,9 @@ export interface InitOutput {
130
156
  readonly neswasm_load_state: (a: number, b: number, c: number) => [number, number];
131
157
  readonly neswasm_master_clock: (a: number) => bigint;
132
158
  readonly neswasm_new: () => number;
133
- readonly neswasm_palette_rgb: () => [number, number];
159
+ readonly neswasm_palette_rgb: (a: number) => [number, number];
160
+ readonly neswasm_palette_rgb_full: (a: number) => [number, number];
161
+ readonly neswasm_palette_rgb_tinted: (a: number, b: number) => [number, number];
134
162
  readonly neswasm_power_cycle: (a: number) => void;
135
163
  readonly neswasm_reset: (a: number) => void;
136
164
  readonly neswasm_rom_md5_hex: (a: number) => [number, number];
@@ -139,6 +167,7 @@ export interface InitOutput {
139
167
  readonly neswasm_set_audio_sample_rate: (a: number, b: number) => void;
140
168
  readonly neswasm_set_button: (a: number, b: number, c: number, d: number, e: number) => void;
141
169
  readonly neswasm_set_controller_bits: (a: number, b: number, c: number) => void;
170
+ readonly neswasm_set_palette: (a: number, b: number, c: number) => [number, number];
142
171
  readonly __wbindgen_externrefs: WebAssembly.Table;
143
172
  readonly __wbindgen_free: (a: number, b: number, c: number) => void;
144
173
  readonly __wbindgen_malloc: (a: number, b: number) => number;
package/nes_wasm.js CHANGED
@@ -48,6 +48,12 @@ export class NesWasm {
48
48
  clear_audio_samples() {
49
49
  wasm.neswasm_clear_audio_samples(this.__wbg_ptr);
50
50
  }
51
+ /**
52
+ * 恢复默认调色板。
53
+ */
54
+ clear_palette() {
55
+ wasm.neswasm_clear_palette(this.__wbg_ptr);
56
+ }
51
57
  /**
52
58
  * 当前手柄位掩码。
53
59
  * @param {number} port
@@ -57,6 +63,14 @@ export class NesWasm {
57
63
  const ret = wasm.neswasm_controller_bits(this.__wbg_ptr, port);
58
64
  return ret;
59
65
  }
66
+ /**
67
+ * 当前帧的颜色强调掩码(bit0=R, bit1=G, bit2=B)。
68
+ * @returns {number}
69
+ */
70
+ emphasis_bits() {
71
+ const ret = wasm.neswasm_emphasis_bits(this.__wbg_ptr);
72
+ return ret;
73
+ }
60
74
  /**
61
75
  * FDS 磁盘是否被写入过(写回 .sav 用);非 FDS 返回 false。
62
76
  * @returns {boolean}
@@ -108,6 +122,7 @@ export class NesWasm {
108
122
  }
109
123
  /**
110
124
  * RGBA 帧缓冲(256×240×4),可直接写入 `ImageData`。
125
+ * 已应用当前帧的颜色强调($2001 bit5-7)与当前调色板。
111
126
  * @returns {Uint8Array}
112
127
  */
113
128
  frame_rgba() {
@@ -179,11 +194,34 @@ export class NesWasm {
179
194
  return this;
180
195
  }
181
196
  /**
182
- * 系统调色板,64 色 × 3 字节 RGB。
197
+ * 系统调色板,64 色 × 3 字节 RGB(当前调色板的基色块,不含强调)。
183
198
  * @returns {Uint8Array}
184
199
  */
185
- static palette_rgb() {
186
- const ret = wasm.neswasm_palette_rgb();
200
+ palette_rgb() {
201
+ const ret = wasm.neswasm_palette_rgb(this.__wbg_ptr);
202
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
203
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
204
+ return v1;
205
+ }
206
+ /**
207
+ * 当前调色板完整 512 色 × 3 字节 RGB
208
+ * (8 个强调块,布局 `(emphasis<<6|color)*3`,供 JS 构建 LUT)。
209
+ * @returns {Uint8Array}
210
+ */
211
+ palette_rgb_full() {
212
+ const ret = wasm.neswasm_palette_rgb_full(this.__wbg_ptr);
213
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
214
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
215
+ return v1;
216
+ }
217
+ /**
218
+ * 应用颜色强调后的系统调色板,64 色 × 3 字节 RGB
219
+ * (emphasis 为 `emphasis_bits` 返回的掩码,取自当前调色板)。
220
+ * @param {number} emphasis
221
+ * @returns {Uint8Array}
222
+ */
223
+ palette_rgb_tinted(emphasis) {
224
+ const ret = wasm.neswasm_palette_rgb_tinted(this.__wbg_ptr, emphasis);
187
225
  var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
188
226
  wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
189
227
  return v1;
@@ -261,6 +299,19 @@ export class NesWasm {
261
299
  set_controller_bits(port, bits) {
262
300
  wasm.neswasm_set_controller_bits(this.__wbg_ptr, port, bits);
263
301
  }
302
+ /**
303
+ * 加载 .pal 调色板文件内容(FCEUX/Nestopia 通用格式):
304
+ * 192 字节 = 64 色基色(强调块自动合成);1536 字节 = 512 色(自带强调块)。
305
+ * @param {Uint8Array} bytes
306
+ */
307
+ set_palette(bytes) {
308
+ const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc);
309
+ const len0 = WASM_VECTOR_LEN;
310
+ const ret = wasm.neswasm_set_palette(this.__wbg_ptr, ptr0, len0);
311
+ if (ret[1]) {
312
+ throw takeFromExternrefTable0(ret[0]);
313
+ }
314
+ }
264
315
  }
265
316
  if (Symbol.dispose) NesWasm.prototype[Symbol.dispose] = NesWasm.prototype.free;
266
317
  function __wbg_get_imports() {
package/nes_wasm_bg.wasm CHANGED
Binary file
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "nes-wasm",
3
3
  "type": "module",
4
4
  "description": "WebAssembly bindings for the nes-sim NES emulator core.",
5
- "version": "0.3.0",
5
+ "version": "0.4.0",
6
6
  "license": "MIT",
7
7
  "repository": {
8
8
  "type": "git",
@@ -19,4 +19,4 @@
19
19
  "sideEffects": [
20
20
  "./snippets/*"
21
21
  ]
22
- }
22
+ }