ac6502 1.0.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.
Files changed (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +261 -0
  3. package/dist/components/CPU.js +1170 -0
  4. package/dist/components/CPU.js.map +1 -0
  5. package/dist/components/Cart.js +23 -0
  6. package/dist/components/Cart.js.map +1 -0
  7. package/dist/components/IO/Empty.js +19 -0
  8. package/dist/components/IO/Empty.js.map +1 -0
  9. package/dist/components/IO/GPIOAttachments/GPIOAttachment.js +71 -0
  10. package/dist/components/IO/GPIOAttachments/GPIOAttachment.js.map +1 -0
  11. package/dist/components/IO/GPIOAttachments/GPIOJoystickAttachment.js +90 -0
  12. package/dist/components/IO/GPIOAttachments/GPIOJoystickAttachment.js.map +1 -0
  13. package/dist/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.js +489 -0
  14. package/dist/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.js.map +1 -0
  15. package/dist/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.js +274 -0
  16. package/dist/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.js.map +1 -0
  17. package/dist/components/IO/GPIOCard.js +597 -0
  18. package/dist/components/IO/GPIOCard.js.map +1 -0
  19. package/dist/components/IO/InputBoard.js +19 -0
  20. package/dist/components/IO/InputBoard.js.map +1 -0
  21. package/dist/components/IO/LCDCard.js +19 -0
  22. package/dist/components/IO/LCDCard.js.map +1 -0
  23. package/dist/components/IO/RAMCard.js +63 -0
  24. package/dist/components/IO/RAMCard.js.map +1 -0
  25. package/dist/components/IO/RTCCard.js +483 -0
  26. package/dist/components/IO/RTCCard.js.map +1 -0
  27. package/dist/components/IO/SerialCard.js +282 -0
  28. package/dist/components/IO/SerialCard.js.map +1 -0
  29. package/dist/components/IO/SoundCard.js +620 -0
  30. package/dist/components/IO/SoundCard.js.map +1 -0
  31. package/dist/components/IO/StorageCard.js +428 -0
  32. package/dist/components/IO/StorageCard.js.map +1 -0
  33. package/dist/components/IO/VGACard.js +9 -0
  34. package/dist/components/IO/VGACard.js.map +1 -0
  35. package/dist/components/IO/VideoCard.js +623 -0
  36. package/dist/components/IO/VideoCard.js.map +1 -0
  37. package/dist/components/IO.js +3 -0
  38. package/dist/components/IO.js.map +1 -0
  39. package/dist/components/Machine.js +310 -0
  40. package/dist/components/Machine.js.map +1 -0
  41. package/dist/components/RAM.js +24 -0
  42. package/dist/components/RAM.js.map +1 -0
  43. package/dist/components/ROM.js +23 -0
  44. package/dist/components/ROM.js.map +1 -0
  45. package/dist/index.js +441 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/tests/CPU.test.js +1626 -0
  48. package/dist/tests/CPU.test.js.map +1 -0
  49. package/dist/tests/Cart.test.js +119 -0
  50. package/dist/tests/Cart.test.js.map +1 -0
  51. package/dist/tests/IO/GPIOAttachments/GPIOAttachment.test.js +339 -0
  52. package/dist/tests/IO/GPIOAttachments/GPIOAttachment.test.js.map +1 -0
  53. package/dist/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.js +126 -0
  54. package/dist/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.js.map +1 -0
  55. package/dist/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.js +779 -0
  56. package/dist/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.js.map +1 -0
  57. package/dist/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.js +355 -0
  58. package/dist/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.js.map +1 -0
  59. package/dist/tests/IO/GPIOCard.test.js +503 -0
  60. package/dist/tests/IO/GPIOCard.test.js.map +1 -0
  61. package/dist/tests/IO/RAMCard.test.js +229 -0
  62. package/dist/tests/IO/RAMCard.test.js.map +1 -0
  63. package/dist/tests/IO/RTCCard.test.js +177 -0
  64. package/dist/tests/IO/RTCCard.test.js.map +1 -0
  65. package/dist/tests/IO/SerialCard.test.js +423 -0
  66. package/dist/tests/IO/SerialCard.test.js.map +1 -0
  67. package/dist/tests/IO/SoundCard.test.js +528 -0
  68. package/dist/tests/IO/SoundCard.test.js.map +1 -0
  69. package/dist/tests/IO/StorageCard.test.js +647 -0
  70. package/dist/tests/IO/StorageCard.test.js.map +1 -0
  71. package/dist/tests/IO/VideoCard.test.js +549 -0
  72. package/dist/tests/IO/VideoCard.test.js.map +1 -0
  73. package/dist/tests/Machine.test.js +383 -0
  74. package/dist/tests/Machine.test.js.map +1 -0
  75. package/dist/tests/RAM.test.js +160 -0
  76. package/dist/tests/RAM.test.js.map +1 -0
  77. package/dist/tests/ROM.test.js +123 -0
  78. package/dist/tests/ROM.test.js.map +1 -0
  79. package/jest.config.cjs +9 -0
  80. package/package.json +43 -0
  81. package/src/components/CPU.ts +1371 -0
  82. package/src/components/Cart.ts +20 -0
  83. package/src/components/IO/GPIOAttachments/GPIOAttachment.ts +189 -0
  84. package/src/components/IO/GPIOAttachments/GPIOJoystickAttachment.ts +99 -0
  85. package/src/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.ts +465 -0
  86. package/src/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.ts +287 -0
  87. package/src/components/IO/GPIOCard.ts +677 -0
  88. package/src/components/IO/RAMCard.ts +68 -0
  89. package/src/components/IO/RTCCard.ts +518 -0
  90. package/src/components/IO/SerialCard.ts +335 -0
  91. package/src/components/IO/SoundCard.ts +711 -0
  92. package/src/components/IO/StorageCard.ts +473 -0
  93. package/src/components/IO/VideoCard.ts +730 -0
  94. package/src/components/IO.ts +11 -0
  95. package/src/components/Machine.ts +364 -0
  96. package/src/components/RAM.ts +23 -0
  97. package/src/components/ROM.ts +19 -0
  98. package/src/index.ts +474 -0
  99. package/src/tests/CPU.test.ts +2045 -0
  100. package/src/tests/Cart.test.ts +149 -0
  101. package/src/tests/IO/GPIOAttachments/GPIOAttachment.test.ts +413 -0
  102. package/src/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.ts +147 -0
  103. package/src/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.ts +961 -0
  104. package/src/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.ts +449 -0
  105. package/src/tests/IO/GPIOCard.test.ts +644 -0
  106. package/src/tests/IO/RAMCard.test.ts +284 -0
  107. package/src/tests/IO/RTCCard.test.ts +222 -0
  108. package/src/tests/IO/SerialCard.test.ts +530 -0
  109. package/src/tests/IO/SoundCard.test.ts +659 -0
  110. package/src/tests/IO/StorageCard.test.ts +787 -0
  111. package/src/tests/IO/VideoCard.test.ts +668 -0
  112. package/src/tests/Machine.test.ts +437 -0
  113. package/src/tests/RAM.test.ts +196 -0
  114. package/src/tests/ROM.test.ts +154 -0
  115. package/tsconfig.json +12 -0
@@ -0,0 +1,623 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VideoCard = exports.TmsColor = exports.TmsMode = void 0;
4
+ /**
5
+ * TMS9918 Video Display Processor Emulation
6
+ *
7
+ * Port mapping (address bit 0):
8
+ * Even address (bit 0 = 0): VRAM data read/write
9
+ * Odd address (bit 0 = 1): Register/address write / status read
10
+ *
11
+ * Display modes:
12
+ * Graphics I - 32x24 tiles, 8x8 patterns, 1-of-8 color groups
13
+ * Graphics II - 32x24 tiles, 8x8 patterns, per-row color
14
+ * Text - 40x24 tiles, 6x8 patterns, no sprites
15
+ * Multicolor - 32x24 blocks, 4x4 colored cells
16
+ *
17
+ * Output: 256x192 active area centered in a 320x240 RGBA buffer
18
+ *
19
+ * Reference: vrEmuTms9918 by Troy Schrapel
20
+ * https://github.com/visrealm/vrEmuTms9918
21
+ */
22
+ // Display modes
23
+ var TmsMode;
24
+ (function (TmsMode) {
25
+ TmsMode[TmsMode["GRAPHICS_I"] = 0] = "GRAPHICS_I";
26
+ TmsMode[TmsMode["GRAPHICS_II"] = 1] = "GRAPHICS_II";
27
+ TmsMode[TmsMode["TEXT"] = 2] = "TEXT";
28
+ TmsMode[TmsMode["MULTICOLOR"] = 3] = "MULTICOLOR";
29
+ })(TmsMode || (exports.TmsMode = TmsMode = {}));
30
+ // TMS9918 Color indices
31
+ var TmsColor;
32
+ (function (TmsColor) {
33
+ TmsColor[TmsColor["TRANSPARENT"] = 0] = "TRANSPARENT";
34
+ TmsColor[TmsColor["BLACK"] = 1] = "BLACK";
35
+ TmsColor[TmsColor["MED_GREEN"] = 2] = "MED_GREEN";
36
+ TmsColor[TmsColor["LT_GREEN"] = 3] = "LT_GREEN";
37
+ TmsColor[TmsColor["DK_BLUE"] = 4] = "DK_BLUE";
38
+ TmsColor[TmsColor["LT_BLUE"] = 5] = "LT_BLUE";
39
+ TmsColor[TmsColor["DK_RED"] = 6] = "DK_RED";
40
+ TmsColor[TmsColor["CYAN"] = 7] = "CYAN";
41
+ TmsColor[TmsColor["MED_RED"] = 8] = "MED_RED";
42
+ TmsColor[TmsColor["LT_RED"] = 9] = "LT_RED";
43
+ TmsColor[TmsColor["DK_YELLOW"] = 10] = "DK_YELLOW";
44
+ TmsColor[TmsColor["LT_YELLOW"] = 11] = "LT_YELLOW";
45
+ TmsColor[TmsColor["DK_GREEN"] = 12] = "DK_GREEN";
46
+ TmsColor[TmsColor["MAGENTA"] = 13] = "MAGENTA";
47
+ TmsColor[TmsColor["GREY"] = 14] = "GREY";
48
+ TmsColor[TmsColor["WHITE"] = 15] = "WHITE";
49
+ })(TmsColor || (exports.TmsColor = TmsColor = {}));
50
+ // TMS9918 Palette – RGBA bytes (transparent rendered as opaque black)
51
+ const TMS_PALETTE = [
52
+ [0x00, 0x00, 0x00, 0xFF], // 0 Transparent (opaque black on display)
53
+ [0x00, 0x00, 0x00, 0xFF], // 1 Black
54
+ [0x21, 0xC9, 0x42, 0xFF], // 2 Medium Green
55
+ [0x5E, 0xDC, 0x78, 0xFF], // 3 Light Green
56
+ [0x54, 0x55, 0xED, 0xFF], // 4 Dark Blue
57
+ [0x7D, 0x75, 0xFC, 0xFF], // 5 Light Blue
58
+ [0xD3, 0x52, 0x4D, 0xFF], // 6 Dark Red
59
+ [0x43, 0xEB, 0xF6, 0xFF], // 7 Cyan
60
+ [0xFD, 0x55, 0x54, 0xFF], // 8 Medium Red
61
+ [0xFF, 0x79, 0x78, 0xFF], // 9 Light Red
62
+ [0xD3, 0xC1, 0x53, 0xFF], // 10 Dark Yellow
63
+ [0xE5, 0xCE, 0x80, 0xFF], // 11 Light Yellow
64
+ [0x21, 0xB0, 0x3C, 0xFF], // 12 Dark Green
65
+ [0xC9, 0x5B, 0xBA, 0xFF], // 13 Magenta
66
+ [0xCC, 0xCC, 0xCC, 0xFF], // 14 Grey
67
+ [0xFF, 0xFF, 0xFF, 0xFF], // 15 White
68
+ ];
69
+ // VRAM
70
+ const VRAM_SIZE = 1 << 14; // 16KB
71
+ const VRAM_MASK = VRAM_SIZE - 1; // 0x3FFF
72
+ // Active display resolution
73
+ const TMS_PIXELS_X = 256;
74
+ const TMS_PIXELS_Y = 192;
75
+ // Output buffer resolution
76
+ const DISPLAY_WIDTH = 320;
77
+ const DISPLAY_HEIGHT = 240;
78
+ // Tile / character layout
79
+ const GRAPHICS_NUM_COLS = 32;
80
+ const GRAPHICS_CHAR_WIDTH = 8;
81
+ const TEXT_NUM_COLS = 40;
82
+ const TEXT_CHAR_WIDTH = 6;
83
+ const TEXT_PADDING_PX = 8;
84
+ // Pattern table
85
+ const PATTERN_BYTES = 8;
86
+ const GFXI_COLOR_GROUP_SIZE = 8;
87
+ // Sprites
88
+ const MAX_SPRITES = 32;
89
+ const SPRITE_ATTR_Y = 0;
90
+ const SPRITE_ATTR_X = 1;
91
+ const SPRITE_ATTR_NAME = 2;
92
+ const SPRITE_ATTR_COLOR = 3;
93
+ const SPRITE_ATTR_BYTES = 4;
94
+ const LAST_SPRITE_YPOS = 0xD0;
95
+ const MAX_SCANLINE_SPRITES = 4;
96
+ // Status register flags
97
+ const STATUS_INT = 0x80;
98
+ const STATUS_5S = 0x40;
99
+ const STATUS_COL = 0x20;
100
+ // Register 0 bits
101
+ const TMS_R0_MODE_GRAPHICS_II = 0x02;
102
+ // Register 1 bits
103
+ const TMS_R1_DISP_ACTIVE = 0x40;
104
+ const TMS_R1_INT_ENABLE = 0x20;
105
+ const TMS_R1_MODE_MULTICOLOR = 0x08;
106
+ const TMS_R1_MODE_TEXT = 0x10;
107
+ const TMS_R1_SPRITE_16 = 0x02;
108
+ const TMS_R1_SPRITE_MAG2 = 0x01;
109
+ // Register indices
110
+ const TMS_REG_0 = 0;
111
+ const TMS_REG_1 = 1;
112
+ const TMS_REG_NAME_TABLE = 2;
113
+ const TMS_REG_COLOR_TABLE = 3;
114
+ const TMS_REG_PATTERN_TABLE = 4;
115
+ const TMS_REG_SPRITE_ATTR_TABLE = 5;
116
+ const TMS_REG_SPRITE_PATT_TABLE = 6;
117
+ const TMS_REG_FG_BG_COLOR = 7;
118
+ const TMS_NUM_REGISTERS = 8;
119
+ // Timing (NTSC)
120
+ const TOTAL_SCANLINES = 262;
121
+ const FRAMES_PER_SECOND = 60;
122
+ const CYCLES_PER_TICK = 128; // Must match Machine.ts ioTickInterval
123
+ // Border offsets (centering 256x192 in 320x240)
124
+ const BORDER_X = (DISPLAY_WIDTH - TMS_PIXELS_X) / 2; // 32
125
+ const BORDER_Y = (DISPLAY_HEIGHT - TMS_PIXELS_Y) / 2; // 24
126
+ class VideoCard {
127
+ constructor() {
128
+ this.raiseIRQ = () => { };
129
+ this.raiseNMI = () => { };
130
+ // ---- VDP internal state ----
131
+ /** Eight write-only registers */
132
+ this.registers = new Uint8Array(TMS_NUM_REGISTERS);
133
+ /** Status register (read-only from CPU side) */
134
+ this.status = 0;
135
+ /** Current VRAM address for CPU access (auto-increments) */
136
+ this.currentAddress = 0;
137
+ /** Address / register write stage (0 or 1) */
138
+ this.regWriteStage = 0;
139
+ /** Holds first stage byte written to the control port */
140
+ this.regWriteStage0Value = 0;
141
+ /** Read-ahead buffer for VRAM reads */
142
+ this.readAheadBuffer = 0;
143
+ /** Current display mode (derived from registers) */
144
+ this.mode = TmsMode.GRAPHICS_I;
145
+ /** 16 KB Video RAM */
146
+ this.vram = new Uint8Array(VRAM_SIZE);
147
+ /** Per-pixel sprite collision mask for the current scanline */
148
+ this.rowSpriteBits = new Uint8Array(TMS_PIXELS_X);
149
+ /** Temporary scanline pixel buffer (color palette indices) */
150
+ this.scanlinePixels = new Uint8Array(TMS_PIXELS_X);
151
+ /** 320 × 240 RGBA output buffer for SDL rendering */
152
+ this.buffer = Buffer.alloc(DISPLAY_WIDTH * DISPLAY_HEIGHT * 4);
153
+ /** Cycle accumulator for scanline timing */
154
+ this.cycleAccumulator = 0;
155
+ /** Current scanline being processed (0 – 261) */
156
+ this.currentScanline = 0;
157
+ }
158
+ // ================================================================
159
+ // IO Interface
160
+ // ================================================================
161
+ read(address) {
162
+ if (address & 1) {
163
+ return this.readStatus();
164
+ }
165
+ return this.readData();
166
+ }
167
+ write(address, data) {
168
+ if (address & 1) {
169
+ this.writeAddr(data);
170
+ }
171
+ else {
172
+ this.writeData(data);
173
+ }
174
+ }
175
+ tick(frequency) {
176
+ const cyclesPerFrame = frequency / FRAMES_PER_SECOND;
177
+ const cyclesPerScanline = cyclesPerFrame / TOTAL_SCANLINES;
178
+ this.cycleAccumulator += CYCLES_PER_TICK;
179
+ while (this.cycleAccumulator >= cyclesPerScanline) {
180
+ this.cycleAccumulator -= cyclesPerScanline;
181
+ this.processScanline();
182
+ }
183
+ }
184
+ reset(_coldStart) {
185
+ this.regWriteStage0Value = 0;
186
+ this.currentAddress = 0;
187
+ this.regWriteStage = 0;
188
+ this.status = 0;
189
+ this.readAheadBuffer = 0;
190
+ this.registers.fill(0);
191
+ this.cycleAccumulator = 0;
192
+ this.currentScanline = 0;
193
+ this.updateMode();
194
+ // VRAM intentionally left in unknown state (matches C reference)
195
+ this.fillBackground();
196
+ }
197
+ // ================================================================
198
+ // VDP Data / Control Ports
199
+ // ================================================================
200
+ /**
201
+ * Write to the control (address / register) port.
202
+ * Two-stage write:
203
+ * Stage 0 – latches the low byte (address LSB or register value)
204
+ * Stage 1 – interprets the high byte:
205
+ * bit 7 set → register write (bits 0-2 = register index)
206
+ * bit 7 clear → address set (bit 6: 0 = read, 1 = write)
207
+ */
208
+ writeAddr(data) {
209
+ if (this.regWriteStage === 0) {
210
+ this.regWriteStage0Value = data;
211
+ this.regWriteStage = 1;
212
+ }
213
+ else {
214
+ if (data & 0x80) {
215
+ // Register write
216
+ this.registers[data & 0x07] = this.regWriteStage0Value;
217
+ this.updateMode();
218
+ }
219
+ else {
220
+ // Address set
221
+ this.currentAddress = this.regWriteStage0Value | ((data & 0x3F) << 8);
222
+ if ((data & 0x40) === 0) {
223
+ // Read mode – pre-fetch byte and auto-increment
224
+ this.readAheadBuffer = this.vram[this.currentAddress & VRAM_MASK];
225
+ this.currentAddress++;
226
+ }
227
+ }
228
+ this.regWriteStage = 0;
229
+ }
230
+ }
231
+ /** Write data to VRAM at the current address (auto-increments) */
232
+ writeData(data) {
233
+ this.regWriteStage = 0;
234
+ this.readAheadBuffer = data;
235
+ this.vram[this.currentAddress & VRAM_MASK] = data;
236
+ this.currentAddress++;
237
+ }
238
+ /**
239
+ * Read the status register.
240
+ * Clears the status flags and resets the write stage.
241
+ */
242
+ readStatus() {
243
+ const tmp = this.status;
244
+ this.status = 0;
245
+ this.regWriteStage = 0;
246
+ return tmp;
247
+ }
248
+ /** Read data from VRAM via the read-ahead buffer (auto-increments) */
249
+ readData() {
250
+ this.regWriteStage = 0;
251
+ const value = this.readAheadBuffer;
252
+ this.readAheadBuffer = this.vram[this.currentAddress & VRAM_MASK];
253
+ this.currentAddress++;
254
+ return value;
255
+ }
256
+ // ================================================================
257
+ // Mode Detection
258
+ // ================================================================
259
+ updateMode() {
260
+ if (this.registers[TMS_REG_0] & TMS_R0_MODE_GRAPHICS_II) {
261
+ this.mode = TmsMode.GRAPHICS_II;
262
+ }
263
+ else {
264
+ const bits = (this.registers[TMS_REG_1] & (TMS_R1_MODE_MULTICOLOR | TMS_R1_MODE_TEXT)) >> 3;
265
+ switch (bits) {
266
+ case 1:
267
+ this.mode = TmsMode.MULTICOLOR;
268
+ break;
269
+ case 2:
270
+ this.mode = TmsMode.TEXT;
271
+ break;
272
+ default:
273
+ this.mode = TmsMode.GRAPHICS_I;
274
+ break;
275
+ }
276
+ }
277
+ }
278
+ // ================================================================
279
+ // Table Address Helpers
280
+ // ================================================================
281
+ nameTableAddr() {
282
+ return (this.registers[TMS_REG_NAME_TABLE] & 0x0F) << 10;
283
+ }
284
+ colorTableAddr() {
285
+ const mask = this.mode === TmsMode.GRAPHICS_II ? 0x80 : 0xFF;
286
+ return (this.registers[TMS_REG_COLOR_TABLE] & mask) << 6;
287
+ }
288
+ patternTableAddr() {
289
+ const mask = this.mode === TmsMode.GRAPHICS_II ? 0x04 : 0x07;
290
+ return (this.registers[TMS_REG_PATTERN_TABLE] & mask) << 11;
291
+ }
292
+ spriteAttrTableAddr() {
293
+ return (this.registers[TMS_REG_SPRITE_ATTR_TABLE] & 0x7F) << 7;
294
+ }
295
+ spritePatternTableAddr() {
296
+ return (this.registers[TMS_REG_SPRITE_PATT_TABLE] & 0x07) << 11;
297
+ }
298
+ // ================================================================
299
+ // Color Helpers
300
+ // ================================================================
301
+ /** Backdrop / border color (low nibble of register 7) */
302
+ mainBgColor() {
303
+ return this.registers[TMS_REG_FG_BG_COLOR] & 0x0F;
304
+ }
305
+ /** Text-mode foreground (high nibble of register 7, transparent → backdrop) */
306
+ mainFgColor() {
307
+ const c = this.registers[TMS_REG_FG_BG_COLOR] >> 4;
308
+ return c === TmsColor.TRANSPARENT ? this.mainBgColor() : c;
309
+ }
310
+ /** Foreground from a color byte (high nibble, transparent → backdrop) */
311
+ fgColor(colorByte) {
312
+ const c = colorByte >> 4;
313
+ return c === TmsColor.TRANSPARENT ? this.mainBgColor() : c;
314
+ }
315
+ /** Background from a color byte (low nibble, transparent → backdrop) */
316
+ bgColor(colorByte) {
317
+ const c = colorByte & 0x0F;
318
+ return c === TmsColor.TRANSPARENT ? this.mainBgColor() : c;
319
+ }
320
+ // ================================================================
321
+ // Sprite Helpers
322
+ // ================================================================
323
+ spriteSize() {
324
+ return this.registers[TMS_REG_1] & TMS_R1_SPRITE_16 ? 16 : 8;
325
+ }
326
+ spriteMag() {
327
+ return !!(this.registers[TMS_REG_1] & TMS_R1_SPRITE_MAG2);
328
+ }
329
+ displayEnabled() {
330
+ return !!(this.registers[TMS_REG_1] & TMS_R1_DISP_ACTIVE);
331
+ }
332
+ // ================================================================
333
+ // Timing / Scanline Processing
334
+ // ================================================================
335
+ processScanline() {
336
+ if (this.currentScanline === 0) {
337
+ this.fillBackground();
338
+ }
339
+ if (this.currentScanline < TMS_PIXELS_Y) {
340
+ this.renderScanline(this.currentScanline);
341
+ }
342
+ this.currentScanline++;
343
+ if (this.currentScanline >= TOTAL_SCANLINES) {
344
+ this.currentScanline = 0;
345
+ }
346
+ }
347
+ // ================================================================
348
+ // Scanline Rendering
349
+ // ================================================================
350
+ renderScanline(y) {
351
+ const pixels = this.scanlinePixels;
352
+ if (!this.displayEnabled() || y >= TMS_PIXELS_Y) {
353
+ pixels.fill(this.mainBgColor());
354
+ }
355
+ else {
356
+ switch (this.mode) {
357
+ case TmsMode.GRAPHICS_I:
358
+ this.graphicsIScanLine(y, pixels);
359
+ break;
360
+ case TmsMode.GRAPHICS_II:
361
+ this.graphicsIIScanLine(y, pixels);
362
+ break;
363
+ case TmsMode.TEXT:
364
+ this.textScanLine(y, pixels);
365
+ break;
366
+ case TmsMode.MULTICOLOR:
367
+ this.multicolorScanLine(y, pixels);
368
+ break;
369
+ }
370
+ }
371
+ // Set interrupt flag at end of active display
372
+ if (y === TMS_PIXELS_Y - 1 && (this.registers[TMS_REG_1] & TMS_R1_INT_ENABLE)) {
373
+ this.status |= STATUS_INT;
374
+ this.raiseIRQ();
375
+ }
376
+ this.writeScanlineToBuffer(y, pixels);
377
+ }
378
+ // ---- Graphics I ----
379
+ graphicsIScanLine(y, pixels) {
380
+ const tileY = y >> 3;
381
+ const pattRow = y & 0x07;
382
+ const rowNamesAddr = this.nameTableAddr() + tileY * GRAPHICS_NUM_COLS;
383
+ const patternBase = this.patternTableAddr();
384
+ const colorBase = this.colorTableAddr();
385
+ for (let tileX = 0; tileX < GRAPHICS_NUM_COLS; tileX++) {
386
+ const pattIdx = this.vram[(rowNamesAddr + tileX) & VRAM_MASK];
387
+ let pattByte = this.vram[(patternBase + pattIdx * PATTERN_BYTES + pattRow) & VRAM_MASK];
388
+ const colorByte = this.vram[(colorBase + (pattIdx >>> 3)) & VRAM_MASK];
389
+ const fg = this.fgColor(colorByte);
390
+ const bg = this.bgColor(colorByte);
391
+ const base = tileX * GRAPHICS_CHAR_WIDTH;
392
+ for (let bit = 0; bit < GRAPHICS_CHAR_WIDTH; bit++) {
393
+ pixels[base + bit] = (pattByte & 0x80) ? fg : bg;
394
+ pattByte = (pattByte << 1) & 0xFF;
395
+ }
396
+ }
397
+ this.outputSprites(y, pixels);
398
+ }
399
+ // ---- Graphics II ----
400
+ graphicsIIScanLine(y, pixels) {
401
+ const tileY = y >> 3;
402
+ const pattRow = y & 0x07;
403
+ const rowNamesAddr = this.nameTableAddr() + tileY * GRAPHICS_NUM_COLS;
404
+ const nameMask = ((this.registers[TMS_REG_COLOR_TABLE] & 0x7F) << 3) | 0x07;
405
+ const pageThird = ((tileY & 0x18) >> 3)
406
+ & (this.registers[TMS_REG_PATTERN_TABLE] & 0x03);
407
+ const pageOffset = pageThird << 11;
408
+ const patternBase = this.patternTableAddr() + pageOffset;
409
+ const colorBase = this.colorTableAddr()
410
+ + (pageOffset & ((this.registers[TMS_REG_COLOR_TABLE] & 0x60) << 6));
411
+ for (let tileX = 0; tileX < GRAPHICS_NUM_COLS; tileX++) {
412
+ const pattIdx = this.vram[(rowNamesAddr + tileX) & VRAM_MASK] & nameMask;
413
+ const pattRowOffset = pattIdx * PATTERN_BYTES + pattRow;
414
+ const pattByte = this.vram[(patternBase + pattRowOffset) & VRAM_MASK];
415
+ const colorByte = this.vram[(colorBase + pattRowOffset) & VRAM_MASK];
416
+ const fg = this.fgColor(colorByte);
417
+ const bg = this.bgColor(colorByte);
418
+ const base = tileX * GRAPHICS_CHAR_WIDTH;
419
+ for (let bit = 0; bit < GRAPHICS_CHAR_WIDTH; bit++) {
420
+ pixels[base + bit] = ((pattByte << bit) & 0x80) ? fg : bg;
421
+ }
422
+ }
423
+ this.outputSprites(y, pixels);
424
+ }
425
+ // ---- Text ----
426
+ textScanLine(y, pixels) {
427
+ const tileY = y >> 3;
428
+ const pattRow = y & 0x07;
429
+ const rowNamesAddr = this.nameTableAddr() + tileY * TEXT_NUM_COLS;
430
+ const patternBase = this.patternTableAddr();
431
+ const bg = this.mainBgColor();
432
+ const fg = this.mainFgColor();
433
+ // Left and right padding
434
+ for (let i = 0; i < TEXT_PADDING_PX; i++) {
435
+ pixels[i] = bg;
436
+ pixels[TMS_PIXELS_X - TEXT_PADDING_PX + i] = bg;
437
+ }
438
+ for (let tileX = 0; tileX < TEXT_NUM_COLS; tileX++) {
439
+ const pattIdx = this.vram[(rowNamesAddr + tileX) & VRAM_MASK];
440
+ const pattByte = this.vram[(patternBase + pattIdx * PATTERN_BYTES + pattRow) & VRAM_MASK];
441
+ for (let bit = 0; bit < TEXT_CHAR_WIDTH; bit++) {
442
+ pixels[TEXT_PADDING_PX + tileX * TEXT_CHAR_WIDTH + bit] =
443
+ ((pattByte << bit) & 0x80) ? fg : bg;
444
+ }
445
+ }
446
+ // No sprites in Text mode
447
+ }
448
+ // ---- Multicolor ----
449
+ multicolorScanLine(y, pixels) {
450
+ const tileY = y >> 3;
451
+ const pattRow = (Math.floor(y / 4) & 0x01) + (tileY & 0x03) * 2;
452
+ const namesAddr = this.nameTableAddr() + tileY * GRAPHICS_NUM_COLS;
453
+ const patternBase = this.patternTableAddr();
454
+ for (let tileX = 0; tileX < GRAPHICS_NUM_COLS; tileX++) {
455
+ const pattIdx = this.vram[(namesAddr + tileX) & VRAM_MASK];
456
+ const colorByte = this.vram[(patternBase + pattIdx * PATTERN_BYTES + pattRow) & VRAM_MASK];
457
+ const fg = this.fgColor(colorByte);
458
+ const bg = this.bgColor(colorByte);
459
+ const base = tileX * 8;
460
+ for (let i = 0; i < 4; i++)
461
+ pixels[base + i] = fg;
462
+ for (let i = 4; i < 8; i++)
463
+ pixels[base + i] = bg;
464
+ }
465
+ this.outputSprites(y, pixels);
466
+ }
467
+ // ================================================================
468
+ // Sprite Rendering
469
+ // ================================================================
470
+ outputSprites(y, pixels) {
471
+ const mag = this.spriteMag();
472
+ const sprite16 = this.spriteSize() === 16;
473
+ const sprSize = this.spriteSize();
474
+ const spriteSizePx = sprSize * (mag ? 2 : 1);
475
+ const attrTableAddr = this.spriteAttrTableAddr();
476
+ const pattTableAddr = this.spritePatternTableAddr();
477
+ let spritesShown = 0;
478
+ // Clear status at start of frame (matches C reference)
479
+ if (y === 0) {
480
+ this.status = 0;
481
+ }
482
+ for (let spriteIdx = 0; spriteIdx < MAX_SPRITES; spriteIdx++) {
483
+ const attrBase = attrTableAddr + spriteIdx * SPRITE_ATTR_BYTES;
484
+ let yPos = this.vram[(attrBase + SPRITE_ATTR_Y) & VRAM_MASK];
485
+ // Stop processing at sentinel value
486
+ if (yPos === LAST_SPRITE_YPOS) {
487
+ if ((this.status & STATUS_5S) === 0) {
488
+ this.status |= spriteIdx;
489
+ }
490
+ break;
491
+ }
492
+ // Handle wrap-around for sprites above the top of the screen
493
+ if (yPos > 0xE0) {
494
+ yPos -= 256;
495
+ }
496
+ // First visible row is yPos + 1
497
+ yPos += 1;
498
+ let pattRow = y - yPos;
499
+ if (mag) {
500
+ pattRow >>= 1;
501
+ }
502
+ // Skip sprite if not visible on this scanline
503
+ if (pattRow < 0 || pattRow >= sprSize) {
504
+ continue;
505
+ }
506
+ // Clear collision mask on first visible sprite of this scanline
507
+ if (spritesShown === 0) {
508
+ this.rowSpriteBits.fill(0);
509
+ }
510
+ const spriteColor = this.vram[(attrBase + SPRITE_ATTR_COLOR) & VRAM_MASK] & 0x0F;
511
+ // Check scanline sprite limit
512
+ spritesShown++;
513
+ if (spritesShown > MAX_SCANLINE_SPRITES) {
514
+ if ((this.status & STATUS_5S) === 0) {
515
+ this.status |= STATUS_5S | spriteIdx;
516
+ }
517
+ break;
518
+ }
519
+ // Sprite pattern data
520
+ const pattIdx = this.vram[(attrBase + SPRITE_ATTR_NAME) & VRAM_MASK];
521
+ const pattOffset = pattTableAddr + pattIdx * PATTERN_BYTES + pattRow;
522
+ // Early clock shifts sprite 32 pixels left
523
+ const earlyClockBit = this.vram[(attrBase + SPRITE_ATTR_COLOR) & VRAM_MASK] & 0x80;
524
+ const earlyClockOffset = earlyClockBit ? -32 : 0;
525
+ const xPos = this.vram[(attrBase + SPRITE_ATTR_X) & VRAM_MASK] + earlyClockOffset;
526
+ let pattByte = this.vram[pattOffset & VRAM_MASK];
527
+ let screenBit = 0;
528
+ let pattBit = 0;
529
+ const endXPos = Math.min(xPos + spriteSizePx, TMS_PIXELS_X);
530
+ for (let screenX = xPos; screenX < endXPos; screenX++, screenBit++) {
531
+ if (screenX >= 0) {
532
+ // Check high bit of pattern byte
533
+ if (pattByte & 0x80) {
534
+ // Write pixel if sprite is non-transparent and no higher-priority non-transparent sprite already wrote here
535
+ if (spriteColor !== TmsColor.TRANSPARENT && this.rowSpriteBits[screenX] < 2) {
536
+ pixels[screenX] = spriteColor;
537
+ }
538
+ // Collision detection
539
+ if (this.rowSpriteBits[screenX]) {
540
+ this.status |= STATUS_COL;
541
+ }
542
+ else {
543
+ this.rowSpriteBits[screenX] = spriteColor + 1;
544
+ }
545
+ }
546
+ }
547
+ // Advance pattern bit (every pixel, or every other pixel if magnified)
548
+ if (!mag || (screenBit & 0x01)) {
549
+ pattByte = (pattByte << 1) & 0xFF;
550
+ pattBit++;
551
+ if (pattBit === GRAPHICS_CHAR_WIDTH && sprite16) {
552
+ // Switch from left half (A/B) to right half (C/D) of 16×16 sprite
553
+ pattBit = 0;
554
+ pattByte = this.vram[(pattOffset + PATTERN_BYTES * 2) & VRAM_MASK];
555
+ }
556
+ }
557
+ }
558
+ }
559
+ }
560
+ // ================================================================
561
+ // Buffer Management
562
+ // ================================================================
563
+ /** Fill entire output buffer with the current backdrop color */
564
+ fillBackground() {
565
+ const bgIdx = this.mainBgColor();
566
+ const [r, g, b, a] = TMS_PALETTE[bgIdx];
567
+ for (let i = 0; i < this.buffer.length; i += 4) {
568
+ this.buffer[i] = r;
569
+ this.buffer[i + 1] = g;
570
+ this.buffer[i + 2] = b;
571
+ this.buffer[i + 3] = a;
572
+ }
573
+ }
574
+ /** Write a rendered scanline into the output buffer at the correct position */
575
+ writeScanlineToBuffer(y, pixels) {
576
+ const bufferY = y + BORDER_Y;
577
+ if (bufferY < 0 || bufferY >= DISPLAY_HEIGHT)
578
+ return;
579
+ const rowOffset = bufferY * DISPLAY_WIDTH * 4;
580
+ for (let x = 0; x < TMS_PIXELS_X; x++) {
581
+ const offset = rowOffset + (BORDER_X + x) * 4;
582
+ const [r, g, b, a] = TMS_PALETTE[pixels[x] & 0x0F];
583
+ this.buffer[offset] = r;
584
+ this.buffer[offset + 1] = g;
585
+ this.buffer[offset + 2] = b;
586
+ this.buffer[offset + 3] = a;
587
+ }
588
+ }
589
+ // ================================================================
590
+ // Public Accessors (testing / debugging)
591
+ // ================================================================
592
+ /** Read a VDP register value */
593
+ getRegister(reg) {
594
+ return this.registers[reg & 0x07];
595
+ }
596
+ /** Write a VDP register value directly (bypasses control-port staging) */
597
+ setRegister(reg, value) {
598
+ this.registers[reg & 0x07] = value;
599
+ this.updateMode();
600
+ }
601
+ /** Read a VRAM byte directly (does not affect read-ahead buffer) */
602
+ getVramByte(addr) {
603
+ return this.vram[addr & VRAM_MASK];
604
+ }
605
+ /** Write a VRAM byte directly (does not affect address pointer) */
606
+ setVramByte(addr, value) {
607
+ this.vram[addr & VRAM_MASK] = value;
608
+ }
609
+ /** Peek at the status register without clearing it */
610
+ getStatus() {
611
+ return this.status;
612
+ }
613
+ /** Get the current display mode */
614
+ getMode() {
615
+ return this.mode;
616
+ }
617
+ /** Get the display-enabled state */
618
+ isDisplayEnabled() {
619
+ return this.displayEnabled();
620
+ }
621
+ }
622
+ exports.VideoCard = VideoCard;
623
+ //# sourceMappingURL=VideoCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoCard.js","sourceRoot":"","sources":["../../../src/components/IO/VideoCard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IO.js","sourceRoot":"","sources":["../../src/components/IO.ts"],"names":[],"mappings":""}