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 @@
|
|
|
1
|
+
{"version":3,"file":"StorageCard.test.js","sourceRoot":"","sources":["../../../src/tests/IO/StorageCard.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const VideoCard_1 = require("../../components/IO/VideoCard");
|
|
4
|
+
/**
|
|
5
|
+
* Helper: write a register value through the control port (two-stage write)
|
|
6
|
+
*/
|
|
7
|
+
const writeRegister = (vdp, reg, value) => {
|
|
8
|
+
vdp.write(1, value); // Stage 0: register value
|
|
9
|
+
vdp.write(1, 0x80 | reg); // Stage 1: register number with bit 7 set
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Helper: set VRAM write address through the control port
|
|
13
|
+
*/
|
|
14
|
+
const setWriteAddress = (vdp, addr) => {
|
|
15
|
+
vdp.write(1, addr & 0xFF); // Stage 0: address low byte
|
|
16
|
+
vdp.write(1, ((addr >> 8) & 0x3F) | 0x40); // Stage 1: address high + write flag
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Helper: set VRAM read address through the control port
|
|
20
|
+
*/
|
|
21
|
+
const setReadAddress = (vdp, addr) => {
|
|
22
|
+
vdp.write(1, addr & 0xFF); // Stage 0: address low byte
|
|
23
|
+
vdp.write(1, (addr >> 8) & 0x3F); // Stage 1: address high (no write flag)
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Helper: write a sequence of bytes to VRAM starting at an address
|
|
27
|
+
*/
|
|
28
|
+
const writeVramBytes = (vdp, addr, bytes) => {
|
|
29
|
+
setWriteAddress(vdp, addr);
|
|
30
|
+
for (const b of bytes) {
|
|
31
|
+
vdp.write(0, b); // Data port
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Helper: setup Graphics I mode with standard table addresses
|
|
36
|
+
*/
|
|
37
|
+
const setupGraphicsI = (vdp) => {
|
|
38
|
+
writeRegister(vdp, 0, 0x00); // No external VDP, Graphics I
|
|
39
|
+
writeRegister(vdp, 1, 0x60); // 16K, display active, interrupts enabled, Graphics I
|
|
40
|
+
writeRegister(vdp, 2, 0x0E); // Name table at 0x3800
|
|
41
|
+
writeRegister(vdp, 3, 0x00); // Color table at 0x0000
|
|
42
|
+
writeRegister(vdp, 4, 0x04); // Pattern table at 0x2000
|
|
43
|
+
writeRegister(vdp, 5, 0x76); // Sprite attr at 0x3B00
|
|
44
|
+
writeRegister(vdp, 6, 0x03); // Sprite pattern at 0x1800
|
|
45
|
+
writeRegister(vdp, 7, 0x17); // FG=black(1), BG=cyan(7)
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Helper: setup Graphics II mode with standard table addresses
|
|
49
|
+
*/
|
|
50
|
+
const setupGraphicsII = (vdp) => {
|
|
51
|
+
writeRegister(vdp, 0, 0x02); // Graphics II mode
|
|
52
|
+
writeRegister(vdp, 1, 0x60); // 16K, display active, interrupts enabled
|
|
53
|
+
writeRegister(vdp, 2, 0x0E); // Name table at 0x3800
|
|
54
|
+
writeRegister(vdp, 3, 0x7F); // Color table mask
|
|
55
|
+
writeRegister(vdp, 4, 0x07); // Pattern table mask
|
|
56
|
+
writeRegister(vdp, 5, 0x76); // Sprite attr at 0x3B00
|
|
57
|
+
writeRegister(vdp, 6, 0x03); // Sprite pattern at 0x1800
|
|
58
|
+
writeRegister(vdp, 7, 0x17); // FG=black(1), BG=cyan(7)
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Helper: setup Text mode
|
|
62
|
+
*/
|
|
63
|
+
const setupTextMode = (vdp) => {
|
|
64
|
+
writeRegister(vdp, 0, 0x00); // No external VDP
|
|
65
|
+
writeRegister(vdp, 1, 0x70); // 16K, display active, interrupts, Text mode
|
|
66
|
+
writeRegister(vdp, 2, 0x0E); // Name table at 0x3800
|
|
67
|
+
writeRegister(vdp, 4, 0x04); // Pattern table at 0x2000
|
|
68
|
+
writeRegister(vdp, 7, 0xF4); // FG=white(15), BG=dark blue(4)
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Helper: tick enough times to render exactly one complete frame.
|
|
72
|
+
* Must not overshoot into the next frame (scanline 0 of the next
|
|
73
|
+
* frame clears the status register during sprite processing).
|
|
74
|
+
*/
|
|
75
|
+
const renderOneFrame = (vdp, frequency = 2000000) => {
|
|
76
|
+
// At 2MHz: cyclesPerFrame ≈ 33333, each tick = 128 cycles → ~261 ticks/frame
|
|
77
|
+
const ticksPerFrame = Math.ceil((frequency / 60) / 128);
|
|
78
|
+
for (let i = 0; i < ticksPerFrame; i++) {
|
|
79
|
+
vdp.tick(frequency);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Helper: clear sprite attribute table (set all Y positions to 0xD0 = stop)
|
|
84
|
+
*/
|
|
85
|
+
const clearSprites = (vdp, spriteAttrAddr = 0x3B00) => {
|
|
86
|
+
setWriteAddress(vdp, spriteAttrAddr);
|
|
87
|
+
for (let i = 0; i < 32; i++) {
|
|
88
|
+
vdp.write(0, 0xD0); // Y = stop sentinel
|
|
89
|
+
vdp.write(0, 0x00); // X
|
|
90
|
+
vdp.write(0, 0x00); // Name
|
|
91
|
+
vdp.write(0, 0x00); // Color
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
describe('VideoCard (TMS9918 VDP)', () => {
|
|
95
|
+
let vdp;
|
|
96
|
+
beforeEach(() => {
|
|
97
|
+
vdp = new VideoCard_1.VideoCard();
|
|
98
|
+
});
|
|
99
|
+
// ================================================================
|
|
100
|
+
// Initialization & Reset
|
|
101
|
+
// ================================================================
|
|
102
|
+
describe('Initialization', () => {
|
|
103
|
+
it('should initialize with all registers zeroed', () => {
|
|
104
|
+
for (let i = 0; i < 8; i++) {
|
|
105
|
+
expect(vdp.getRegister(i)).toBe(0);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
it('should initialize in Graphics I mode', () => {
|
|
109
|
+
expect(vdp.getMode()).toBe(VideoCard_1.TmsMode.GRAPHICS_I);
|
|
110
|
+
});
|
|
111
|
+
it('should initialize with display disabled', () => {
|
|
112
|
+
expect(vdp.isDisplayEnabled()).toBe(false);
|
|
113
|
+
});
|
|
114
|
+
it('should initialize status register to 0', () => {
|
|
115
|
+
expect(vdp.getStatus()).toBe(0);
|
|
116
|
+
});
|
|
117
|
+
it('should have a 320x240 RGBA output buffer', () => {
|
|
118
|
+
expect(vdp.buffer.length).toBe(320 * 240 * 4);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('Reset', () => {
|
|
122
|
+
it('should clear registers on reset', () => {
|
|
123
|
+
writeRegister(vdp, 1, 0x60);
|
|
124
|
+
writeRegister(vdp, 7, 0xF1);
|
|
125
|
+
vdp.reset(true);
|
|
126
|
+
for (let i = 0; i < 8; i++) {
|
|
127
|
+
expect(vdp.getRegister(i)).toBe(0);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
it('should clear status register on reset', () => {
|
|
131
|
+
// Trigger an interrupt
|
|
132
|
+
writeRegister(vdp, 1, 0x60);
|
|
133
|
+
renderOneFrame(vdp);
|
|
134
|
+
expect(vdp.getStatus() & 0x80).toBeTruthy();
|
|
135
|
+
vdp.reset(true);
|
|
136
|
+
expect(vdp.getStatus()).toBe(0);
|
|
137
|
+
});
|
|
138
|
+
it('should reset write stage on reset', () => {
|
|
139
|
+
// Write only the first stage byte
|
|
140
|
+
vdp.write(1, 0x42); // Stage 0 only
|
|
141
|
+
vdp.reset(true);
|
|
142
|
+
// Now writing two bytes should work correctly as a fresh two-stage write
|
|
143
|
+
writeRegister(vdp, 7, 0xAB);
|
|
144
|
+
expect(vdp.getRegister(7)).toBe(0xAB);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
// ================================================================
|
|
148
|
+
// Register Read/Write
|
|
149
|
+
// ================================================================
|
|
150
|
+
describe('Register Access', () => {
|
|
151
|
+
it('should write and read back register values', () => {
|
|
152
|
+
for (let reg = 0; reg < 8; reg++) {
|
|
153
|
+
writeRegister(vdp, reg, 0x55 + reg);
|
|
154
|
+
expect(vdp.getRegister(reg)).toBe(0x55 + reg);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
it('should mask register index to 3 bits', () => {
|
|
158
|
+
writeRegister(vdp, 0x08, 0xAA); // reg 8 → reg 0
|
|
159
|
+
expect(vdp.getRegister(0)).toBe(0xAA);
|
|
160
|
+
});
|
|
161
|
+
it('should update display mode on register write', () => {
|
|
162
|
+
// Graphics II: reg 0 bit 1
|
|
163
|
+
writeRegister(vdp, 0, 0x02);
|
|
164
|
+
expect(vdp.getMode()).toBe(VideoCard_1.TmsMode.GRAPHICS_II);
|
|
165
|
+
// Text: reg 1 bit 4
|
|
166
|
+
writeRegister(vdp, 0, 0x00);
|
|
167
|
+
writeRegister(vdp, 1, 0x10);
|
|
168
|
+
expect(vdp.getMode()).toBe(VideoCard_1.TmsMode.TEXT);
|
|
169
|
+
// Multicolor: reg 1 bit 3
|
|
170
|
+
writeRegister(vdp, 1, 0x08);
|
|
171
|
+
expect(vdp.getMode()).toBe(VideoCard_1.TmsMode.MULTICOLOR);
|
|
172
|
+
// Graphics I: no special bits
|
|
173
|
+
writeRegister(vdp, 0, 0x00);
|
|
174
|
+
writeRegister(vdp, 1, 0x00);
|
|
175
|
+
expect(vdp.getMode()).toBe(VideoCard_1.TmsMode.GRAPHICS_I);
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
// ================================================================
|
|
179
|
+
// VRAM Access
|
|
180
|
+
// ================================================================
|
|
181
|
+
describe('VRAM Access', () => {
|
|
182
|
+
it('should write and read VRAM data', () => {
|
|
183
|
+
setWriteAddress(vdp, 0x0000);
|
|
184
|
+
vdp.write(0, 0x42);
|
|
185
|
+
vdp.write(0, 0x43);
|
|
186
|
+
vdp.write(0, 0x44);
|
|
187
|
+
// Read back
|
|
188
|
+
setReadAddress(vdp, 0x0000);
|
|
189
|
+
expect(vdp.read(0)).toBe(0x42); // Pre-fetched during address set
|
|
190
|
+
expect(vdp.read(0)).toBe(0x43); // Next byte
|
|
191
|
+
expect(vdp.read(0)).toBe(0x44);
|
|
192
|
+
});
|
|
193
|
+
it('should auto-increment address on write', () => {
|
|
194
|
+
setWriteAddress(vdp, 0x1000);
|
|
195
|
+
for (let i = 0; i < 10; i++) {
|
|
196
|
+
vdp.write(0, i);
|
|
197
|
+
}
|
|
198
|
+
// Verify the bytes were written sequentially
|
|
199
|
+
for (let i = 0; i < 10; i++) {
|
|
200
|
+
expect(vdp.getVramByte(0x1000 + i)).toBe(i);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
it('should auto-increment address on read', () => {
|
|
204
|
+
// Write sequential values
|
|
205
|
+
for (let i = 0; i < 5; i++) {
|
|
206
|
+
vdp.setVramByte(0x2000 + i, 0xA0 + i);
|
|
207
|
+
}
|
|
208
|
+
setReadAddress(vdp, 0x2000);
|
|
209
|
+
for (let i = 0; i < 5; i++) {
|
|
210
|
+
expect(vdp.read(0)).toBe(0xA0 + i);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
it('should implement read-ahead buffer correctly', () => {
|
|
214
|
+
vdp.setVramByte(0x0000, 0x11);
|
|
215
|
+
vdp.setVramByte(0x0001, 0x22);
|
|
216
|
+
vdp.setVramByte(0x0002, 0x33);
|
|
217
|
+
// Setting read address pre-fetches first byte
|
|
218
|
+
setReadAddress(vdp, 0x0000);
|
|
219
|
+
// First read returns the pre-fetched byte (0x11), and fetches next (0x22)
|
|
220
|
+
expect(vdp.read(0)).toBe(0x11);
|
|
221
|
+
// Second read returns 0x22 (previously fetched), fetches 0x33
|
|
222
|
+
expect(vdp.read(0)).toBe(0x22);
|
|
223
|
+
expect(vdp.read(0)).toBe(0x33);
|
|
224
|
+
});
|
|
225
|
+
it('should wrap VRAM address at 16KB boundary', () => {
|
|
226
|
+
// Write at the end of VRAM
|
|
227
|
+
setWriteAddress(vdp, 0x3FFF);
|
|
228
|
+
vdp.write(0, 0xEE);
|
|
229
|
+
// Next write should wrap to 0x0000
|
|
230
|
+
vdp.write(0, 0xFF);
|
|
231
|
+
expect(vdp.getVramByte(0x3FFF)).toBe(0xEE);
|
|
232
|
+
expect(vdp.getVramByte(0x0000)).toBe(0xFF);
|
|
233
|
+
});
|
|
234
|
+
it('should reset write stage on data port operations', () => {
|
|
235
|
+
// Start a control port write (stage 0)
|
|
236
|
+
vdp.write(1, 0x42); // Stage 0
|
|
237
|
+
// A data write should reset the write stage
|
|
238
|
+
setWriteAddress(vdp, 0x0000); // Need address set first
|
|
239
|
+
vdp.write(0, 0x55);
|
|
240
|
+
// Now a full two-stage register write should work
|
|
241
|
+
writeRegister(vdp, 7, 0xCC);
|
|
242
|
+
expect(vdp.getRegister(7)).toBe(0xCC);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
// ================================================================
|
|
246
|
+
// Status Register
|
|
247
|
+
// ================================================================
|
|
248
|
+
describe('Status Register', () => {
|
|
249
|
+
it('should read and clear status register', () => {
|
|
250
|
+
// Enable display and interrupts
|
|
251
|
+
writeRegister(vdp, 1, 0x60);
|
|
252
|
+
clearSprites(vdp);
|
|
253
|
+
renderOneFrame(vdp);
|
|
254
|
+
// Status should have interrupt flag
|
|
255
|
+
const status = vdp.read(1); // Read status through control port
|
|
256
|
+
expect(status & 0x80).toBeTruthy();
|
|
257
|
+
// Reading status should have cleared it
|
|
258
|
+
expect(vdp.getStatus()).toBe(0);
|
|
259
|
+
});
|
|
260
|
+
it('should reset write stage on status read', () => {
|
|
261
|
+
// Start a control port write (stage 0)
|
|
262
|
+
vdp.write(1, 0x42); // Stage 0
|
|
263
|
+
// Reading status should reset the write stage
|
|
264
|
+
vdp.read(1);
|
|
265
|
+
// Now a full two-stage register write should work
|
|
266
|
+
writeRegister(vdp, 7, 0xDD);
|
|
267
|
+
expect(vdp.getRegister(7)).toBe(0xDD);
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
// ================================================================
|
|
271
|
+
// Mode Detection
|
|
272
|
+
// ================================================================
|
|
273
|
+
describe('Mode Detection', () => {
|
|
274
|
+
it('should detect Graphics I mode', () => {
|
|
275
|
+
writeRegister(vdp, 0, 0x00);
|
|
276
|
+
writeRegister(vdp, 1, 0x00);
|
|
277
|
+
expect(vdp.getMode()).toBe(VideoCard_1.TmsMode.GRAPHICS_I);
|
|
278
|
+
});
|
|
279
|
+
it('should detect Graphics II mode (reg 0 bit 1)', () => {
|
|
280
|
+
writeRegister(vdp, 0, 0x02);
|
|
281
|
+
expect(vdp.getMode()).toBe(VideoCard_1.TmsMode.GRAPHICS_II);
|
|
282
|
+
});
|
|
283
|
+
it('should detect Text mode (reg 1 bit 4)', () => {
|
|
284
|
+
writeRegister(vdp, 0, 0x00);
|
|
285
|
+
writeRegister(vdp, 1, 0x10);
|
|
286
|
+
expect(vdp.getMode()).toBe(VideoCard_1.TmsMode.TEXT);
|
|
287
|
+
});
|
|
288
|
+
it('should detect Multicolor mode (reg 1 bit 3)', () => {
|
|
289
|
+
writeRegister(vdp, 0, 0x00);
|
|
290
|
+
writeRegister(vdp, 1, 0x08);
|
|
291
|
+
expect(vdp.getMode()).toBe(VideoCard_1.TmsMode.MULTICOLOR);
|
|
292
|
+
});
|
|
293
|
+
it('should prioritize Graphics II over other modes', () => {
|
|
294
|
+
writeRegister(vdp, 0, 0x02);
|
|
295
|
+
writeRegister(vdp, 1, 0x10); // Also set Text bit
|
|
296
|
+
expect(vdp.getMode()).toBe(VideoCard_1.TmsMode.GRAPHICS_II);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
// ================================================================
|
|
300
|
+
// Display-Enabled Flag
|
|
301
|
+
// ================================================================
|
|
302
|
+
describe('Display Enable', () => {
|
|
303
|
+
it('should report display disabled when BLANK bit is clear', () => {
|
|
304
|
+
writeRegister(vdp, 1, 0x00); // Display inactive
|
|
305
|
+
expect(vdp.isDisplayEnabled()).toBe(false);
|
|
306
|
+
});
|
|
307
|
+
it('should report display enabled when BLANK bit is set', () => {
|
|
308
|
+
writeRegister(vdp, 1, 0x40); // Display active
|
|
309
|
+
expect(vdp.isDisplayEnabled()).toBe(true);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
// ================================================================
|
|
313
|
+
// Interrupt Generation
|
|
314
|
+
// ================================================================
|
|
315
|
+
describe('Interrupt Generation', () => {
|
|
316
|
+
it('should set interrupt flag after rendering active display', () => {
|
|
317
|
+
writeRegister(vdp, 1, 0x60); // Display active + interrupts enabled
|
|
318
|
+
clearSprites(vdp);
|
|
319
|
+
renderOneFrame(vdp);
|
|
320
|
+
expect(vdp.getStatus() & 0x80).toBeTruthy();
|
|
321
|
+
});
|
|
322
|
+
it('should not set interrupt flag when interrupts are disabled', () => {
|
|
323
|
+
writeRegister(vdp, 1, 0x40); // Display active, interrupts disabled
|
|
324
|
+
renderOneFrame(vdp);
|
|
325
|
+
expect(vdp.getStatus() & 0x80).toBe(0);
|
|
326
|
+
});
|
|
327
|
+
it('should call raiseIRQ when interrupt flag is set', () => {
|
|
328
|
+
const irqFn = jest.fn();
|
|
329
|
+
vdp.raiseIRQ = irqFn;
|
|
330
|
+
writeRegister(vdp, 1, 0x60); // Display active + interrupts enabled
|
|
331
|
+
clearSprites(vdp);
|
|
332
|
+
renderOneFrame(vdp);
|
|
333
|
+
expect(irqFn).toHaveBeenCalled();
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
// ================================================================
|
|
337
|
+
// Graphics I Rendering
|
|
338
|
+
// ================================================================
|
|
339
|
+
describe('Graphics I Mode Rendering', () => {
|
|
340
|
+
it('should render a tile with pattern data', () => {
|
|
341
|
+
setupGraphicsI(vdp);
|
|
342
|
+
clearSprites(vdp);
|
|
343
|
+
// Set name table entry: tile 0 at position (0,0)
|
|
344
|
+
vdp.setVramByte(0x3800, 0x00); // Name table: tile index 0
|
|
345
|
+
// Set a simple pattern for tile 0 (alternating lines)
|
|
346
|
+
// Pattern table at 0x2000
|
|
347
|
+
vdp.setVramByte(0x2000, 0xFF); // Row 0: all pixels on
|
|
348
|
+
vdp.setVramByte(0x2001, 0x00); // Row 1: all pixels off
|
|
349
|
+
vdp.setVramByte(0x2002, 0xFF); // Row 2: all pixels on
|
|
350
|
+
vdp.setVramByte(0x2003, 0x00); // Row 3: all pixels off
|
|
351
|
+
vdp.setVramByte(0x2004, 0xFF); // Row 4: all pixels on
|
|
352
|
+
vdp.setVramByte(0x2005, 0x00); // Row 5: all pixels off
|
|
353
|
+
vdp.setVramByte(0x2006, 0xFF); // Row 6: all pixels on
|
|
354
|
+
vdp.setVramByte(0x2007, 0x00); // Row 7: all pixels off
|
|
355
|
+
// Set color for tile 0 (group 0, indices 0-7)
|
|
356
|
+
// Color table at 0x0000, each entry covers 8 tiles
|
|
357
|
+
// FG = white (0xF), BG = black (0x1) → 0xF1
|
|
358
|
+
vdp.setVramByte(0x0000, 0xF1);
|
|
359
|
+
renderOneFrame(vdp);
|
|
360
|
+
// Check pixel at (0,0) in the active area → should be FG color (white = 15)
|
|
361
|
+
// Buffer position: (BORDER_X, BORDER_Y) = (32, 24) in RGBA
|
|
362
|
+
const offset = (24 * 320 + 32) * 4;
|
|
363
|
+
// White = (0xFF, 0xFF, 0xFF, 0xFF)
|
|
364
|
+
expect(vdp.buffer[offset]).toBe(0xFF);
|
|
365
|
+
expect(vdp.buffer[offset + 1]).toBe(0xFF);
|
|
366
|
+
expect(vdp.buffer[offset + 2]).toBe(0xFF);
|
|
367
|
+
expect(vdp.buffer[offset + 3]).toBe(0xFF);
|
|
368
|
+
// Row 1 (pattern byte = 0x00) should be BG color (black = 1)
|
|
369
|
+
const offsetRow1 = (25 * 320 + 32) * 4;
|
|
370
|
+
expect(vdp.buffer[offsetRow1]).toBe(0x00);
|
|
371
|
+
expect(vdp.buffer[offsetRow1 + 1]).toBe(0x00);
|
|
372
|
+
expect(vdp.buffer[offsetRow1 + 2]).toBe(0x00);
|
|
373
|
+
expect(vdp.buffer[offsetRow1 + 3]).toBe(0xFF);
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
// ================================================================
|
|
377
|
+
// Text Mode Rendering
|
|
378
|
+
// ================================================================
|
|
379
|
+
describe('Text Mode Rendering', () => {
|
|
380
|
+
it('should render left and right padding with background color', () => {
|
|
381
|
+
setupTextMode(vdp);
|
|
382
|
+
renderOneFrame(vdp);
|
|
383
|
+
// Left padding: first 8 pixels should be BG color (dark blue = 4)
|
|
384
|
+
// Dark blue palette: [0x54, 0x55, 0xED, 0xFF]
|
|
385
|
+
const offset = (24 * 320 + 32) * 4; // First active pixel in buffer
|
|
386
|
+
expect(vdp.buffer[offset]).toBe(0x54); // R
|
|
387
|
+
expect(vdp.buffer[offset + 1]).toBe(0x55); // G
|
|
388
|
+
expect(vdp.buffer[offset + 2]).toBe(0xED); // B
|
|
389
|
+
expect(vdp.buffer[offset + 3]).toBe(0xFF); // A
|
|
390
|
+
// Right padding: last 8 pixels of active area
|
|
391
|
+
const rightPaddingX = 32 + 248; // BORDER_X + (256 - 8)
|
|
392
|
+
const offsetRight = (24 * 320 + rightPaddingX) * 4;
|
|
393
|
+
expect(vdp.buffer[offsetRight]).toBe(0x54);
|
|
394
|
+
expect(vdp.buffer[offsetRight + 1]).toBe(0x55);
|
|
395
|
+
expect(vdp.buffer[offsetRight + 2]).toBe(0xED);
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
// ================================================================
|
|
399
|
+
// Border Rendering
|
|
400
|
+
// ================================================================
|
|
401
|
+
describe('Border Rendering', () => {
|
|
402
|
+
it('should fill border with backdrop color', () => {
|
|
403
|
+
writeRegister(vdp, 1, 0x40); // Display active
|
|
404
|
+
writeRegister(vdp, 7, 0x07); // BG = cyan (7)
|
|
405
|
+
renderOneFrame(vdp);
|
|
406
|
+
// Check top-left corner (border area)
|
|
407
|
+
// Cyan palette: [0x43, 0xEB, 0xF6, 0xFF]
|
|
408
|
+
expect(vdp.buffer[0]).toBe(0x43);
|
|
409
|
+
expect(vdp.buffer[1]).toBe(0xEB);
|
|
410
|
+
expect(vdp.buffer[2]).toBe(0xF6);
|
|
411
|
+
expect(vdp.buffer[3]).toBe(0xFF);
|
|
412
|
+
});
|
|
413
|
+
it('should use black for transparent backdrop', () => {
|
|
414
|
+
writeRegister(vdp, 1, 0x40); // Display active
|
|
415
|
+
writeRegister(vdp, 7, 0x00); // BG = transparent (0)
|
|
416
|
+
renderOneFrame(vdp);
|
|
417
|
+
// Transparent renders as opaque black
|
|
418
|
+
expect(vdp.buffer[0]).toBe(0x00);
|
|
419
|
+
expect(vdp.buffer[1]).toBe(0x00);
|
|
420
|
+
expect(vdp.buffer[2]).toBe(0x00);
|
|
421
|
+
expect(vdp.buffer[3]).toBe(0xFF);
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
// ================================================================
|
|
425
|
+
// Blanked Display
|
|
426
|
+
// ================================================================
|
|
427
|
+
describe('Blanked Display', () => {
|
|
428
|
+
it('should fill active area with backdrop when display is disabled', () => {
|
|
429
|
+
writeRegister(vdp, 1, 0x20); // Display disabled, interrupts enabled
|
|
430
|
+
writeRegister(vdp, 7, 0x04); // BG = dark blue (4)
|
|
431
|
+
renderOneFrame(vdp);
|
|
432
|
+
// Active area pixel should be backdrop color
|
|
433
|
+
const offset = (24 * 320 + 32) * 4;
|
|
434
|
+
// Dark blue: [0x54, 0x55, 0xED, 0xFF]
|
|
435
|
+
expect(vdp.buffer[offset]).toBe(0x54);
|
|
436
|
+
expect(vdp.buffer[offset + 1]).toBe(0x55);
|
|
437
|
+
expect(vdp.buffer[offset + 2]).toBe(0xED);
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
// ================================================================
|
|
441
|
+
// Sprite Processing
|
|
442
|
+
// ================================================================
|
|
443
|
+
describe('Sprite Processing', () => {
|
|
444
|
+
beforeEach(() => {
|
|
445
|
+
setupGraphicsI(vdp);
|
|
446
|
+
clearSprites(vdp);
|
|
447
|
+
});
|
|
448
|
+
it('should render a simple 8x8 sprite', () => {
|
|
449
|
+
// Sprite pattern at 0x1800 (sprite pattern table)
|
|
450
|
+
// Pattern 0: solid 8x8 block
|
|
451
|
+
for (let row = 0; row < 8; row++) {
|
|
452
|
+
vdp.setVramByte(0x1800 + row, 0xFF); // All pixels set
|
|
453
|
+
}
|
|
454
|
+
// Sprite 0 attribute: Y=0, X=0, Name=0, Color=white(15)
|
|
455
|
+
vdp.setVramByte(0x3B00 + 0, 0xFF); // Y = 0xFF → yPos becomes 0 (+1 offset)
|
|
456
|
+
vdp.setVramByte(0x3B00 + 1, 0x00); // X = 0
|
|
457
|
+
vdp.setVramByte(0x3B00 + 2, 0x00); // Name = 0
|
|
458
|
+
vdp.setVramByte(0x3B00 + 3, 0x0F); // Color = 15 (white)
|
|
459
|
+
// Sentinel for sprite 1
|
|
460
|
+
vdp.setVramByte(0x3B00 + 4, 0xD0);
|
|
461
|
+
renderOneFrame(vdp);
|
|
462
|
+
// Check pixel at sprite position (0,0) in active area
|
|
463
|
+
const offset = (24 * 320 + 32) * 4;
|
|
464
|
+
// White overlay: [0xFF, 0xFF, 0xFF, 0xFF]
|
|
465
|
+
expect(vdp.buffer[offset]).toBe(0xFF);
|
|
466
|
+
expect(vdp.buffer[offset + 1]).toBe(0xFF);
|
|
467
|
+
expect(vdp.buffer[offset + 2]).toBe(0xFF);
|
|
468
|
+
expect(vdp.buffer[offset + 3]).toBe(0xFF);
|
|
469
|
+
});
|
|
470
|
+
it('should stop processing sprites at Y = 0xD0 sentinel', () => {
|
|
471
|
+
// Sprite 0: sentinel
|
|
472
|
+
vdp.setVramByte(0x3B00 + 0, 0xD0);
|
|
473
|
+
// Sprite 1: should not be processed
|
|
474
|
+
vdp.setVramByte(0x3B00 + 4, 0x00);
|
|
475
|
+
vdp.setVramByte(0x3B00 + 5, 0x00);
|
|
476
|
+
vdp.setVramByte(0x3B00 + 6, 0x00);
|
|
477
|
+
vdp.setVramByte(0x3B00 + 7, 0x0F);
|
|
478
|
+
// Pattern for sprite 1
|
|
479
|
+
for (let row = 0; row < 8; row++) {
|
|
480
|
+
vdp.setVramByte(0x1800 + row, 0xFF);
|
|
481
|
+
}
|
|
482
|
+
renderOneFrame(vdp);
|
|
483
|
+
// Pixel should NOT be white (sprite 1 not rendered)
|
|
484
|
+
const offset = (25 * 320 + 32) * 4;
|
|
485
|
+
expect(vdp.buffer[offset]).not.toBe(0xFF);
|
|
486
|
+
});
|
|
487
|
+
it('should detect sprite collision (STATUS_COL)', () => {
|
|
488
|
+
// Two sprites overlapping at the same position
|
|
489
|
+
// Sprite 0: Y=0, X=0
|
|
490
|
+
vdp.setVramByte(0x3B00 + 0, 0xFF); // Y → 0
|
|
491
|
+
vdp.setVramByte(0x3B00 + 1, 0x00); // X = 0
|
|
492
|
+
vdp.setVramByte(0x3B00 + 2, 0x00); // Name = 0
|
|
493
|
+
vdp.setVramByte(0x3B00 + 3, 0x0F); // Color = 15
|
|
494
|
+
// Sprite 1: Y=0, X=0 (overlapping)
|
|
495
|
+
vdp.setVramByte(0x3B00 + 4, 0xFF); // Y → 0
|
|
496
|
+
vdp.setVramByte(0x3B00 + 5, 0x00); // X = 0
|
|
497
|
+
vdp.setVramByte(0x3B00 + 6, 0x00); // Name = 0
|
|
498
|
+
vdp.setVramByte(0x3B00 + 7, 0x0E); // Color = 14 (grey)
|
|
499
|
+
// Sentinel
|
|
500
|
+
vdp.setVramByte(0x3B00 + 8, 0xD0);
|
|
501
|
+
// Pattern 0: at least one pixel set
|
|
502
|
+
vdp.setVramByte(0x1800, 0x80); // Top-left pixel
|
|
503
|
+
renderOneFrame(vdp);
|
|
504
|
+
expect(vdp.getStatus() & 0x20).toBeTruthy(); // STATUS_COL
|
|
505
|
+
});
|
|
506
|
+
it('should set 5th sprite flag when more than 4 sprites on a scanline', () => {
|
|
507
|
+
// Place 5 sprites on scanline 0
|
|
508
|
+
for (let i = 0; i < 5; i++) {
|
|
509
|
+
const base = 0x3B00 + i * 4;
|
|
510
|
+
vdp.setVramByte(base + 0, 0xFF); // Y → 0
|
|
511
|
+
vdp.setVramByte(base + 1, i * 16); // X = spaced apart
|
|
512
|
+
vdp.setVramByte(base + 2, 0x00); // Name = 0
|
|
513
|
+
vdp.setVramByte(base + 3, 0x0F); // Color = 15
|
|
514
|
+
}
|
|
515
|
+
// Sentinel after sprite 5
|
|
516
|
+
vdp.setVramByte(0x3B00 + 20, 0xD0);
|
|
517
|
+
// Pattern: all pixels set
|
|
518
|
+
for (let row = 0; row < 8; row++) {
|
|
519
|
+
vdp.setVramByte(0x1800 + row, 0xFF);
|
|
520
|
+
}
|
|
521
|
+
renderOneFrame(vdp);
|
|
522
|
+
const status = vdp.getStatus();
|
|
523
|
+
expect(status & 0x40).toBeTruthy(); // STATUS_5S flag
|
|
524
|
+
expect(status & 0x1F).toBe(4); // 5th sprite index
|
|
525
|
+
});
|
|
526
|
+
});
|
|
527
|
+
// ================================================================
|
|
528
|
+
// Direct Accessor Methods
|
|
529
|
+
// ================================================================
|
|
530
|
+
describe('Direct Accessors', () => {
|
|
531
|
+
it('should read/write VRAM directly', () => {
|
|
532
|
+
vdp.setVramByte(0x1234, 0xAB);
|
|
533
|
+
expect(vdp.getVramByte(0x1234)).toBe(0xAB);
|
|
534
|
+
});
|
|
535
|
+
it('should mask VRAM address to 14 bits', () => {
|
|
536
|
+
vdp.setVramByte(0xFFFF, 0xCD);
|
|
537
|
+
expect(vdp.getVramByte(0x3FFF)).toBe(0xCD);
|
|
538
|
+
});
|
|
539
|
+
it('should read/write registers directly', () => {
|
|
540
|
+
vdp.setRegister(3, 0xFF);
|
|
541
|
+
expect(vdp.getRegister(3)).toBe(0xFF);
|
|
542
|
+
});
|
|
543
|
+
it('should update mode when setting register directly', () => {
|
|
544
|
+
vdp.setRegister(0, 0x02);
|
|
545
|
+
expect(vdp.getMode()).toBe(VideoCard_1.TmsMode.GRAPHICS_II);
|
|
546
|
+
});
|
|
547
|
+
});
|
|
548
|
+
});
|
|
549
|
+
//# sourceMappingURL=VideoCard.test.js.map
|