ice-web-components 1.0.0 → 1.1.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.
@@ -108,4 +108,5 @@ export * from './model/ICEMinesweeperModel';
108
108
  export * from './model/ICETetrisModel';
109
109
  export * from './model/ICESnakeModel';
110
110
  export * from './model/ICEHighScoreModel';
111
+ export * from './model/ICEChip8Model';
111
112
  export * from './model/ICE2048Model';
@@ -0,0 +1,86 @@
1
+ /**
2
+ * CHIP-8 虚拟机(纯逻辑,不碰 canvas)。
3
+ *
4
+ * 掌机的第四块卡带用它:前三个模型是"某款游戏的规则",这是一个**真的微处理器模拟器**——
5
+ * 4KB 内存、16 个 8 位寄存器、16 位地址寄存器 I、64×32 单色显存、两个 60Hz 定时器、16 键键盘。
6
+ * 画面交给 `ICETileMap`(2048 格仍然只有 1 个节点)画,音效走掌机那套 WebAudio。
7
+ *
8
+ * 支持指令(跑 demo / 小 ROM 足够):00E0 / 00EE / 1NNN / 2NNN / 3XNN / 4XNN / 5XY0 / 9XY0 /
9
+ * 6XNN / 7XNN / 8XY0-8XYE / 9XY0 / ANNN / BNNN / CXNN / DXYN / EX9E / EXA1 / FX07 / FX0A /
10
+ * FX15 / FX18 / FX1E / FX29 / FX33 / FX55 / FX65。
11
+ */
12
+ export declare const ICE_CHIP8_KEYS: readonly ["1", "2", "3", "C", "4", "5", "6", "D", "7", "8", "9", "E", "A", "0", "B", "F"];
13
+ /**
14
+ * 自带的 demo ROM(自写,不依赖任何外部 ROM,避开版权)。
15
+ *
16
+ * 它做的事:清屏 → 在 (V0,V1) 画一个 8×8 笑脸 → 按 (V2,V3) 走一步 → 撞到边就把速度取反 → 跳回清屏重画。
17
+ * 也就是**在屏幕里来回弹**的笑脸:既不会裂到对边,也把条件跳过(4XNN)、补码减法(7XNN / 6XNN 的 0xFE)
18
+ * 和自建循环这几条最常用的指令演了一遍。
19
+ * 地址:程序 0x200 起(20 条指令 = 40 字节),精灵数据在 0x228(8 字节)。
20
+ */
21
+ export declare const ICE_CHIP8_DEMO_ROM: number[];
22
+ export declare const ICE_CHIP8_WIDTH = 64;
23
+ export declare const ICE_CHIP8_HEIGHT = 32;
24
+ /** 状态变化通知(掌机外壳拿它驱动重绘,和另外三个游戏模型是同一套契约)。 */
25
+ export declare type ICEChip8Listener = (model: ICEChip8Model) => void;
26
+ export declare class ICEChip8Model {
27
+ private memory;
28
+ private v;
29
+ private i;
30
+ private pc;
31
+ private sp;
32
+ private stack;
33
+ private display;
34
+ private keys;
35
+ private delay;
36
+ private sound;
37
+ private cycles;
38
+ private random;
39
+ private paused;
40
+ /** 本条指令改了显存 → 执行完统一通知一次(别在 600 条/秒的频率上惊动渲染) */
41
+ private displayDirty;
42
+ private listeners;
43
+ /** FX0A 正在等按键时记住键位寄存器 */
44
+ private waitingForKey;
45
+ constructor(options?: {
46
+ random?: () => number;
47
+ });
48
+ getPC(): number;
49
+ getI(): number;
50
+ getV(index: number): number;
51
+ getDisplay(): Uint8Array;
52
+ getPixel(row: number, col: number): number;
53
+ getDelayTimer(): number;
54
+ getSoundTimer(): number;
55
+ getCycles(): number;
56
+ isWaitingForKey(): boolean;
57
+ memoryRead(address: number): number;
58
+ isKeyDown(index: number): boolean;
59
+ /** 暂停中(调试/切走标签页):`step()` 与 `tickTimers()` 都不推进。 */
60
+ isPaused(): boolean;
61
+ /** VM 没有"输赢",但掌机外壳按统一契约询问,这里老实回答"没结束"。 */
62
+ isGameOver(): boolean;
63
+ pause(): void;
64
+ resume(): void;
65
+ /**
66
+ * 订阅状态变化:显存画了新东西、按键变了、定时器走了、机器复位了都会通知。
67
+ * 返回取消订阅的函数(和其它模型一致)。
68
+ */
69
+ addChangeListener(listener: ICEChip8Listener): () => void;
70
+ loadProgram(bytes: ArrayLike<number>, address?: number): void;
71
+ memoryWrite(address: number, value: number): void;
72
+ setKey(index: number, down: boolean): void;
73
+ /** 清掉所有按键(切卡带/失焦时用)。 */
74
+ clearKeys(): void;
75
+ setVForTest(index: number, value: number): void;
76
+ reset(): void;
77
+ /** 60Hz:递减延时/声音定时器。 */
78
+ tickTimers(): void;
79
+ /** 执行一条指令(FX0A 等按键时 PC 不动,直接返回)。 */
80
+ step(): void;
81
+ private notify;
82
+ private __alu;
83
+ /** DXYN:按位异或画精灵;撞到亮点就把 VF 置 1。 */
84
+ private __draw;
85
+ private __misc;
86
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ice-web-components",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Swing-style Canvas UI components built on ice-render.",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",