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.
- package/LICENSE +21 -0
- package/README.md +261 -0
- package/dist/components/CPU.js +1170 -0
- package/dist/components/CPU.js.map +1 -0
- package/dist/components/Cart.js +23 -0
- package/dist/components/Cart.js.map +1 -0
- package/dist/components/IO/Empty.js +19 -0
- package/dist/components/IO/Empty.js.map +1 -0
- package/dist/components/IO/GPIOAttachments/GPIOAttachment.js +71 -0
- package/dist/components/IO/GPIOAttachments/GPIOAttachment.js.map +1 -0
- package/dist/components/IO/GPIOAttachments/GPIOJoystickAttachment.js +90 -0
- package/dist/components/IO/GPIOAttachments/GPIOJoystickAttachment.js.map +1 -0
- package/dist/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.js +489 -0
- package/dist/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.js.map +1 -0
- package/dist/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.js +274 -0
- package/dist/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.js.map +1 -0
- package/dist/components/IO/GPIOCard.js +597 -0
- package/dist/components/IO/GPIOCard.js.map +1 -0
- package/dist/components/IO/InputBoard.js +19 -0
- package/dist/components/IO/InputBoard.js.map +1 -0
- package/dist/components/IO/LCDCard.js +19 -0
- package/dist/components/IO/LCDCard.js.map +1 -0
- package/dist/components/IO/RAMCard.js +63 -0
- package/dist/components/IO/RAMCard.js.map +1 -0
- package/dist/components/IO/RTCCard.js +483 -0
- package/dist/components/IO/RTCCard.js.map +1 -0
- package/dist/components/IO/SerialCard.js +282 -0
- package/dist/components/IO/SerialCard.js.map +1 -0
- package/dist/components/IO/SoundCard.js +620 -0
- package/dist/components/IO/SoundCard.js.map +1 -0
- package/dist/components/IO/StorageCard.js +428 -0
- package/dist/components/IO/StorageCard.js.map +1 -0
- package/dist/components/IO/VGACard.js +9 -0
- package/dist/components/IO/VGACard.js.map +1 -0
- package/dist/components/IO/VideoCard.js +623 -0
- package/dist/components/IO/VideoCard.js.map +1 -0
- package/dist/components/IO.js +3 -0
- package/dist/components/IO.js.map +1 -0
- package/dist/components/Machine.js +310 -0
- package/dist/components/Machine.js.map +1 -0
- package/dist/components/RAM.js +24 -0
- package/dist/components/RAM.js.map +1 -0
- package/dist/components/ROM.js +23 -0
- package/dist/components/ROM.js.map +1 -0
- package/dist/index.js +441 -0
- package/dist/index.js.map +1 -0
- package/dist/tests/CPU.test.js +1626 -0
- package/dist/tests/CPU.test.js.map +1 -0
- package/dist/tests/Cart.test.js +119 -0
- package/dist/tests/Cart.test.js.map +1 -0
- package/dist/tests/IO/GPIOAttachments/GPIOAttachment.test.js +339 -0
- package/dist/tests/IO/GPIOAttachments/GPIOAttachment.test.js.map +1 -0
- package/dist/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.js +126 -0
- package/dist/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.js.map +1 -0
- package/dist/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.js +779 -0
- package/dist/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.js.map +1 -0
- package/dist/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.js +355 -0
- package/dist/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.js.map +1 -0
- package/dist/tests/IO/GPIOCard.test.js +503 -0
- package/dist/tests/IO/GPIOCard.test.js.map +1 -0
- package/dist/tests/IO/RAMCard.test.js +229 -0
- package/dist/tests/IO/RAMCard.test.js.map +1 -0
- package/dist/tests/IO/RTCCard.test.js +177 -0
- package/dist/tests/IO/RTCCard.test.js.map +1 -0
- package/dist/tests/IO/SerialCard.test.js +423 -0
- package/dist/tests/IO/SerialCard.test.js.map +1 -0
- package/dist/tests/IO/SoundCard.test.js +528 -0
- package/dist/tests/IO/SoundCard.test.js.map +1 -0
- package/dist/tests/IO/StorageCard.test.js +647 -0
- package/dist/tests/IO/StorageCard.test.js.map +1 -0
- package/dist/tests/IO/VideoCard.test.js +549 -0
- package/dist/tests/IO/VideoCard.test.js.map +1 -0
- package/dist/tests/Machine.test.js +383 -0
- package/dist/tests/Machine.test.js.map +1 -0
- package/dist/tests/RAM.test.js +160 -0
- package/dist/tests/RAM.test.js.map +1 -0
- package/dist/tests/ROM.test.js +123 -0
- package/dist/tests/ROM.test.js.map +1 -0
- package/jest.config.cjs +9 -0
- package/package.json +43 -0
- package/src/components/CPU.ts +1371 -0
- package/src/components/Cart.ts +20 -0
- package/src/components/IO/GPIOAttachments/GPIOAttachment.ts +189 -0
- package/src/components/IO/GPIOAttachments/GPIOJoystickAttachment.ts +99 -0
- package/src/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.ts +465 -0
- package/src/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.ts +287 -0
- package/src/components/IO/GPIOCard.ts +677 -0
- package/src/components/IO/RAMCard.ts +68 -0
- package/src/components/IO/RTCCard.ts +518 -0
- package/src/components/IO/SerialCard.ts +335 -0
- package/src/components/IO/SoundCard.ts +711 -0
- package/src/components/IO/StorageCard.ts +473 -0
- package/src/components/IO/VideoCard.ts +730 -0
- package/src/components/IO.ts +11 -0
- package/src/components/Machine.ts +364 -0
- package/src/components/RAM.ts +23 -0
- package/src/components/ROM.ts +19 -0
- package/src/index.ts +474 -0
- package/src/tests/CPU.test.ts +2045 -0
- package/src/tests/Cart.test.ts +149 -0
- package/src/tests/IO/GPIOAttachments/GPIOAttachment.test.ts +413 -0
- package/src/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.ts +147 -0
- package/src/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.ts +961 -0
- package/src/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.ts +449 -0
- package/src/tests/IO/GPIOCard.test.ts +644 -0
- package/src/tests/IO/RAMCard.test.ts +284 -0
- package/src/tests/IO/RTCCard.test.ts +222 -0
- package/src/tests/IO/SerialCard.test.ts +530 -0
- package/src/tests/IO/SoundCard.test.ts +659 -0
- package/src/tests/IO/StorageCard.test.ts +787 -0
- package/src/tests/IO/VideoCard.test.ts +668 -0
- package/src/tests/Machine.test.ts +437 -0
- package/src/tests/RAM.test.ts +196 -0
- package/src/tests/ROM.test.ts +154 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"IO.js","sourceRoot":"","sources":["../../src/components/IO.ts"],"names":[],"mappings":""}
|