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,423 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const SerialCard_1 = require("../../components/IO/SerialCard");
|
|
4
|
+
describe('SerialCard (6551 ACIA)', () => {
|
|
5
|
+
let serialCard;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
serialCard = new SerialCard_1.SerialCard();
|
|
8
|
+
});
|
|
9
|
+
describe('Initialization', () => {
|
|
10
|
+
it('should initialize with correct default values', () => {
|
|
11
|
+
// Status register should have Transmit Data Register Empty flag set
|
|
12
|
+
const status = serialCard.read(0x01);
|
|
13
|
+
expect(status & 0x10).toBe(0x10); // TDRE bit set
|
|
14
|
+
});
|
|
15
|
+
it('should have empty transmit and receive buffers', () => {
|
|
16
|
+
// Write should succeed, indicating buffers are empty
|
|
17
|
+
serialCard.write(0x00, 0x42);
|
|
18
|
+
expect(serialCard.read(0x01) & 0x10).toBe(0); // TDRE should be clear after write
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('Register Operations', () => {
|
|
22
|
+
describe('Data Register (0x00)', () => {
|
|
23
|
+
it('should write data to transmit buffer', () => {
|
|
24
|
+
const initialStatus = serialCard.read(0x01);
|
|
25
|
+
serialCard.write(0x00, 0x55);
|
|
26
|
+
const statusAfter = serialCard.read(0x01);
|
|
27
|
+
// TDRE should be clear after writing data
|
|
28
|
+
expect((statusAfter & 0x10)).toBe(0);
|
|
29
|
+
});
|
|
30
|
+
it('should read data from receive buffer', () => {
|
|
31
|
+
serialCard.onData(0x42);
|
|
32
|
+
const data = serialCard.read(0x00);
|
|
33
|
+
expect(data).toBe(0x42);
|
|
34
|
+
});
|
|
35
|
+
it('should mask data to 8 bits', () => {
|
|
36
|
+
serialCard.write(0x00, 0x1FF); // More than 8 bits
|
|
37
|
+
serialCard.onData(0x1FF);
|
|
38
|
+
const data = serialCard.read(0x00);
|
|
39
|
+
expect(data).toBe(0xFF);
|
|
40
|
+
});
|
|
41
|
+
it('should return last received data if no new data available', () => {
|
|
42
|
+
serialCard.onData(0x42);
|
|
43
|
+
let data = serialCard.read(0x00); // Read the data
|
|
44
|
+
data = serialCard.read(0x00); // Read again with empty buffer
|
|
45
|
+
// Should return last value received
|
|
46
|
+
expect(data).toBe(0x42);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('Status Register (0x01)', () => {
|
|
50
|
+
it('should report Receive Data Register Full when data available', () => {
|
|
51
|
+
serialCard.onData(0x50);
|
|
52
|
+
const status = serialCard.read(0x01);
|
|
53
|
+
expect(status & 0x08).toBe(0x08); // RDRF bit set
|
|
54
|
+
});
|
|
55
|
+
it('should clear RDRF after reading data', () => {
|
|
56
|
+
serialCard.onData(0x50);
|
|
57
|
+
serialCard.read(0x00); // Read the data
|
|
58
|
+
const status = serialCard.read(0x01);
|
|
59
|
+
expect(status & 0x08).toBe(0); // RDRF bit clear
|
|
60
|
+
});
|
|
61
|
+
it('should report Transmit Data Register Empty when buffer empty', () => {
|
|
62
|
+
const status = serialCard.read(0x01);
|
|
63
|
+
expect(status & 0x10).toBe(0x10); // TDRE bit set
|
|
64
|
+
});
|
|
65
|
+
it('should clear TDRE after writing data', () => {
|
|
66
|
+
serialCard.write(0x00, 0x42);
|
|
67
|
+
const status = serialCard.read(0x01);
|
|
68
|
+
expect(status & 0x10).toBe(0); // TDRE bit clear
|
|
69
|
+
});
|
|
70
|
+
it('should report Data Set Ready (DSR) always set', () => {
|
|
71
|
+
const status = serialCard.read(0x01);
|
|
72
|
+
expect(status & 0x40).toBe(0x40); // DSR bit set
|
|
73
|
+
});
|
|
74
|
+
it('should report Data Carrier Detect (DCD) always clear', () => {
|
|
75
|
+
const status = serialCard.read(0x01);
|
|
76
|
+
expect(status & 0x20).toBe(0); // DCD bit clear
|
|
77
|
+
});
|
|
78
|
+
it('should report parity error flag', () => {
|
|
79
|
+
// Trigger parity error by writing then reading programmed reset
|
|
80
|
+
serialCard.onData(0x50);
|
|
81
|
+
serialCard.write(0x01, 0x00); // Programmed reset clears errors
|
|
82
|
+
let status = serialCard.read(0x01);
|
|
83
|
+
expect(status & 0x01).toBe(0); // Parity error cleared
|
|
84
|
+
// Note: This test verifies the flag can be cleared
|
|
85
|
+
});
|
|
86
|
+
it('should report framing error flag', () => {
|
|
87
|
+
const status = serialCard.read(0x01);
|
|
88
|
+
expect(status & 0x02).toBe(0); // Framing error not set initially
|
|
89
|
+
});
|
|
90
|
+
it('should report overrun flag', () => {
|
|
91
|
+
const status = serialCard.read(0x01);
|
|
92
|
+
expect(status & 0x04).toBe(0); // Overrun not set initially
|
|
93
|
+
});
|
|
94
|
+
it('should report IRQ flag', () => {
|
|
95
|
+
const status = serialCard.read(0x01);
|
|
96
|
+
expect(status & 0x80).toBe(0); // IRQ not set initially
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe('Command Register (0x02)', () => {
|
|
100
|
+
it('should return 0 on read (write-only)', () => {
|
|
101
|
+
serialCard.write(0x02, 0xFF);
|
|
102
|
+
const data = serialCard.read(0x02);
|
|
103
|
+
expect(data).toBe(0);
|
|
104
|
+
});
|
|
105
|
+
it('should mask command data to 8 bits', () => {
|
|
106
|
+
serialCard.write(0x02, 0x1FF);
|
|
107
|
+
// Should not throw and should process command
|
|
108
|
+
});
|
|
109
|
+
it('should enable receive IRQ when bit 2 is set', () => {
|
|
110
|
+
const mockIRQ = jest.fn();
|
|
111
|
+
serialCard.raiseIRQ = mockIRQ;
|
|
112
|
+
serialCard.write(0x02, 0x04); // Enable receive IRQ
|
|
113
|
+
serialCard.onData(0x42);
|
|
114
|
+
expect(mockIRQ).toHaveBeenCalled();
|
|
115
|
+
});
|
|
116
|
+
it('should disable receive IRQ when bit 2 is clear', () => {
|
|
117
|
+
const mockIRQ = jest.fn();
|
|
118
|
+
serialCard.raiseIRQ = mockIRQ;
|
|
119
|
+
serialCard.write(0x02, 0x00); // Disable receive IRQ
|
|
120
|
+
serialCard.onData(0x42);
|
|
121
|
+
expect(mockIRQ).not.toHaveBeenCalled();
|
|
122
|
+
});
|
|
123
|
+
it('should enable echo mode when bit 5 is set', () => {
|
|
124
|
+
serialCard.write(0x02, 0x20); // Enable echo mode
|
|
125
|
+
serialCard.onData(0x42);
|
|
126
|
+
// In echo mode, received data is added to transmit buffer
|
|
127
|
+
// Verify the transmit buffer will send the echoed byte
|
|
128
|
+
const statusBeforeTick = serialCard.read(0x01);
|
|
129
|
+
expect(statusBeforeTick & 0x10).toBe(0); // TDRE should be clear (data in transmit buffer)
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
describe('Control Register (0x03)', () => {
|
|
133
|
+
it('should return 0 on read (write-only)', () => {
|
|
134
|
+
serialCard.write(0x03, 0xFF);
|
|
135
|
+
const data = serialCard.read(0x03);
|
|
136
|
+
expect(data).toBe(0);
|
|
137
|
+
});
|
|
138
|
+
it('should mask control data to 8 bits', () => {
|
|
139
|
+
serialCard.write(0x03, 0x1FF);
|
|
140
|
+
// Should not throw and should process control
|
|
141
|
+
});
|
|
142
|
+
it('should set default baud rate to 115200', () => {
|
|
143
|
+
serialCard.write(0x03, 0x00); // Code 0000
|
|
144
|
+
serialCard.write(0x00, 0x42);
|
|
145
|
+
// Baud rate affects tick behavior; we'll test tick timing later
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
describe('Data Transmission', () => {
|
|
150
|
+
it('should transmit data byte via callback', () => {
|
|
151
|
+
const mockTransmit = jest.fn();
|
|
152
|
+
serialCard.transmit = mockTransmit;
|
|
153
|
+
serialCard.write(0x00, 0x42);
|
|
154
|
+
// Need to tick enough times for byte transmission
|
|
155
|
+
// With default baud of 115200 and 1MHz clock: ~87 cycles per byte
|
|
156
|
+
for (let i = 0; i < 100; i++) {
|
|
157
|
+
serialCard.tick(1000000);
|
|
158
|
+
}
|
|
159
|
+
expect(mockTransmit).toHaveBeenCalledWith(0x42);
|
|
160
|
+
});
|
|
161
|
+
it('should handle multiple bytes in transmission', () => {
|
|
162
|
+
const mockTransmit = jest.fn();
|
|
163
|
+
serialCard.transmit = mockTransmit;
|
|
164
|
+
serialCard.write(0x00, 0x42);
|
|
165
|
+
serialCard.write(0x00, 0x43);
|
|
166
|
+
serialCard.write(0x00, 0x44);
|
|
167
|
+
for (let i = 0; i < 300; i++) {
|
|
168
|
+
serialCard.tick(1000000);
|
|
169
|
+
}
|
|
170
|
+
expect(mockTransmit).toHaveBeenNthCalledWith(1, 0x42);
|
|
171
|
+
expect(mockTransmit).toHaveBeenNthCalledWith(2, 0x43);
|
|
172
|
+
expect(mockTransmit).toHaveBeenNthCalledWith(3, 0x44);
|
|
173
|
+
});
|
|
174
|
+
it('should set TDRE flag after transmission complete', () => {
|
|
175
|
+
const mockTransmit = jest.fn();
|
|
176
|
+
serialCard.transmit = mockTransmit;
|
|
177
|
+
serialCard.write(0x00, 0x42);
|
|
178
|
+
expect(serialCard.read(0x01) & 0x10).toBe(0); // TDRE clear
|
|
179
|
+
for (let i = 0; i < 100; i++) {
|
|
180
|
+
serialCard.tick(1000000);
|
|
181
|
+
}
|
|
182
|
+
expect(serialCard.read(0x01) & 0x10).toBe(0x10); // TDRE set
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('Data Reception', () => {
|
|
186
|
+
it('should receive data from external source', () => {
|
|
187
|
+
serialCard.onData(0x55);
|
|
188
|
+
const data = serialCard.read(0x00);
|
|
189
|
+
expect(data).toBe(0x55);
|
|
190
|
+
});
|
|
191
|
+
it('should set RDRF flag when data received', () => {
|
|
192
|
+
serialCard.onData(0x55);
|
|
193
|
+
const status = serialCard.read(0x01);
|
|
194
|
+
expect(status & 0x08).toBe(0x08);
|
|
195
|
+
});
|
|
196
|
+
it('should handle multiple received bytes', () => {
|
|
197
|
+
serialCard.onData(0x41); // 'A'
|
|
198
|
+
serialCard.onData(0x42); // 'B'
|
|
199
|
+
serialCard.onData(0x43); // 'C'
|
|
200
|
+
expect(serialCard.read(0x00)).toBe(0x41);
|
|
201
|
+
expect(serialCard.read(0x00)).toBe(0x42);
|
|
202
|
+
expect(serialCard.read(0x00)).toBe(0x43);
|
|
203
|
+
});
|
|
204
|
+
it('should mask received data to 8 bits', () => {
|
|
205
|
+
serialCard.onData(0x1FF);
|
|
206
|
+
const data = serialCard.read(0x00);
|
|
207
|
+
expect(data).toBe(0xFF);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
describe('Interrupt Handling', () => {
|
|
211
|
+
it('should trigger IRQ on receive interrupt enabled', () => {
|
|
212
|
+
const mockIRQ = jest.fn();
|
|
213
|
+
serialCard.raiseIRQ = mockIRQ;
|
|
214
|
+
serialCard.write(0x02, 0x04); // Enable receive IRQ
|
|
215
|
+
serialCard.onData(0x42);
|
|
216
|
+
expect(mockIRQ).toHaveBeenCalled();
|
|
217
|
+
expect(serialCard.read(0x01) & 0x80).toBe(0x80); // IRQ flag set
|
|
218
|
+
});
|
|
219
|
+
it('should trigger IRQ on transmit complete when enabled', () => {
|
|
220
|
+
const mockIRQ = jest.fn();
|
|
221
|
+
const mockTransmit = jest.fn();
|
|
222
|
+
serialCard.raiseIRQ = mockIRQ;
|
|
223
|
+
serialCard.transmit = mockTransmit;
|
|
224
|
+
serialCard.write(0x03, 0x00); // Set control register
|
|
225
|
+
serialCard.write(0x02, 0x08); // Enable transmit IRQ
|
|
226
|
+
serialCard.write(0x00, 0x42);
|
|
227
|
+
for (let i = 0; i < 100; i++) {
|
|
228
|
+
serialCard.tick(1000000);
|
|
229
|
+
}
|
|
230
|
+
// Should trigger IRQ when transmission complete
|
|
231
|
+
expect(serialCard.read(0x01) & 0x80).toBe(0x80);
|
|
232
|
+
});
|
|
233
|
+
it('should not trigger receive IRQ when disabled', () => {
|
|
234
|
+
const mockIRQ = jest.fn();
|
|
235
|
+
serialCard.raiseIRQ = mockIRQ;
|
|
236
|
+
serialCard.write(0x02, 0x00); // Disable receive IRQ
|
|
237
|
+
serialCard.onData(0x42);
|
|
238
|
+
expect(mockIRQ).not.toHaveBeenCalled();
|
|
239
|
+
});
|
|
240
|
+
it('should clear IRQ flag when data is read', () => {
|
|
241
|
+
const mockIRQ = jest.fn();
|
|
242
|
+
serialCard.raiseIRQ = mockIRQ;
|
|
243
|
+
serialCard.write(0x02, 0x04); // Enable receive IRQ
|
|
244
|
+
serialCard.onData(0x42);
|
|
245
|
+
expect(serialCard.read(0x01) & 0x80).toBe(0x80); // IRQ set
|
|
246
|
+
serialCard.read(0x00); // Read data
|
|
247
|
+
expect(serialCard.read(0x01) & 0x80).toBe(0); // IRQ cleared
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
describe('Overrun Handling', () => {
|
|
251
|
+
it('should detect overrun condition', () => {
|
|
252
|
+
serialCard.onData(0x42);
|
|
253
|
+
const statusBefore = serialCard.read(0x01);
|
|
254
|
+
// Send another byte before first is read
|
|
255
|
+
serialCard.onData(0x43);
|
|
256
|
+
const statusAfter = serialCard.read(0x01);
|
|
257
|
+
expect(statusAfter & 0x04).toBe(0x04); // Overrun flag set
|
|
258
|
+
});
|
|
259
|
+
it('should clear overrun after all buffered data is read', () => {
|
|
260
|
+
serialCard.onData(0x42);
|
|
261
|
+
serialCard.onData(0x43); // Cause overrun
|
|
262
|
+
serialCard.read(0x00); // Read first byte (0x42)
|
|
263
|
+
let status = serialCard.read(0x01);
|
|
264
|
+
expect(status & 0x04).toBe(0x04); // Overrun still set (0x43 in buffer)
|
|
265
|
+
serialCard.read(0x00); // Read second byte (0x43)
|
|
266
|
+
status = serialCard.read(0x01);
|
|
267
|
+
expect(status & 0x04).toBe(0); // Overrun cleared now (buffer empty)
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
describe('Echo Mode', () => {
|
|
271
|
+
it('should echo received data when echo mode enabled', () => {
|
|
272
|
+
const mockTransmit = jest.fn();
|
|
273
|
+
serialCard.transmit = mockTransmit;
|
|
274
|
+
serialCard.write(0x02, 0x20); // Enable echo mode
|
|
275
|
+
serialCard.onData(0x42);
|
|
276
|
+
// Tick to allow transmission
|
|
277
|
+
for (let i = 0; i < 100; i++) {
|
|
278
|
+
serialCard.tick(1000000);
|
|
279
|
+
}
|
|
280
|
+
expect(mockTransmit).toHaveBeenCalledWith(0x42);
|
|
281
|
+
});
|
|
282
|
+
it('should not echo when echo mode disabled', () => {
|
|
283
|
+
const mockTransmit = jest.fn();
|
|
284
|
+
serialCard.transmit = mockTransmit;
|
|
285
|
+
serialCard.write(0x02, 0x00); // Echo mode disabled
|
|
286
|
+
serialCard.onData(0x42);
|
|
287
|
+
for (let i = 0; i < 100; i++) {
|
|
288
|
+
serialCard.tick(1000000);
|
|
289
|
+
}
|
|
290
|
+
expect(mockTransmit).not.toHaveBeenCalled();
|
|
291
|
+
});
|
|
292
|
+
it('should clear TDRE flag in echo mode', () => {
|
|
293
|
+
serialCard.write(0x02, 0x20); // Enable echo mode
|
|
294
|
+
serialCard.onData(0x42);
|
|
295
|
+
const status = serialCard.read(0x01);
|
|
296
|
+
expect(status & 0x10).toBe(0); // TDRE should be clear
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
describe('Baud Rate Configuration', () => {
|
|
300
|
+
it('should support multiple baud rates', () => {
|
|
301
|
+
const baudRates = [
|
|
302
|
+
[0x00, 115200],
|
|
303
|
+
[0x01, 50],
|
|
304
|
+
[0x02, 75],
|
|
305
|
+
[0x03, 110],
|
|
306
|
+
[0x04, 135],
|
|
307
|
+
[0x05, 150],
|
|
308
|
+
[0x06, 300],
|
|
309
|
+
[0x07, 600],
|
|
310
|
+
[0x08, 1200],
|
|
311
|
+
[0x09, 1800],
|
|
312
|
+
[0x0A, 2400],
|
|
313
|
+
[0x0B, 3600],
|
|
314
|
+
[0x0C, 4800],
|
|
315
|
+
[0x0D, 7200],
|
|
316
|
+
[0x0E, 9600],
|
|
317
|
+
[0x0F, 19200]
|
|
318
|
+
];
|
|
319
|
+
baudRates.forEach(([code, rate]) => {
|
|
320
|
+
const card = new SerialCard_1.SerialCard();
|
|
321
|
+
card.write(0x03, code); // Control register with baud rate code
|
|
322
|
+
// Baud rate affects tick timing - verify no errors occur
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
describe('Reset Operations', () => {
|
|
327
|
+
it('should perform programmed reset', () => {
|
|
328
|
+
// First setup: send some data so transmit buffer is not empty
|
|
329
|
+
serialCard.write(0x00, 0x42);
|
|
330
|
+
serialCard.write(0x00, 0x43);
|
|
331
|
+
serialCard.write(0x02, 0xFF); // Set command register
|
|
332
|
+
serialCard.onData(0x44);
|
|
333
|
+
// Now perform programmed reset
|
|
334
|
+
serialCard.write(0x01, 0x00); // Programmed reset via status register write
|
|
335
|
+
const status = serialCard.read(0x01);
|
|
336
|
+
// Programmed reset clears status flags and IRQ, but does not clear buffers
|
|
337
|
+
expect(status & 0x80).toBe(0); // IRQ flag cleared
|
|
338
|
+
expect(status & 0x60).toBe(0x40); // DSR set, DCD clear
|
|
339
|
+
});
|
|
340
|
+
it('should reset all registers on cold start', () => {
|
|
341
|
+
serialCard.write(0x00, 0x42);
|
|
342
|
+
serialCard.write(0x02, 0xFF);
|
|
343
|
+
serialCard.write(0x03, 0xFF);
|
|
344
|
+
serialCard.onData(0x42);
|
|
345
|
+
serialCard.reset(true);
|
|
346
|
+
expect(serialCard.read(0x01) & 0x10).toBe(0x10); // TDRE set
|
|
347
|
+
expect(serialCard.read(0x01) & 0x08).toBe(0); // RDRF clear
|
|
348
|
+
expect(serialCard.read(0x01) & 0x80).toBe(0); // IRQ clear
|
|
349
|
+
});
|
|
350
|
+
it('should clear transmit buffer on reset', () => {
|
|
351
|
+
serialCard.write(0x00, 0x42);
|
|
352
|
+
serialCard.write(0x00, 0x43);
|
|
353
|
+
serialCard.reset(true);
|
|
354
|
+
expect(serialCard.read(0x01) & 0x10).toBe(0x10); // TDRE should be set (buffer empty)
|
|
355
|
+
});
|
|
356
|
+
it('should clear receive buffer on reset', () => {
|
|
357
|
+
serialCard.onData(0x42);
|
|
358
|
+
serialCard.reset(true);
|
|
359
|
+
expect(serialCard.read(0x01) & 0x08).toBe(0); // RDRF should be clear (buffer empty)
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
describe('Register Address Masking', () => {
|
|
363
|
+
it('should mask address to lower 2 bits', () => {
|
|
364
|
+
// Test with different address values that map to same register
|
|
365
|
+
serialCard.write(0x00, 0x42);
|
|
366
|
+
serialCard.write(0x04, 0x43); // Should write to register 0
|
|
367
|
+
const status = serialCard.read(0x01);
|
|
368
|
+
expect(status & 0x10).toBe(0); // TDRE clear, so there's data
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
describe('Callback Functions', () => {
|
|
372
|
+
it('should support custom transmit callback', () => {
|
|
373
|
+
const mockTransmit = jest.fn();
|
|
374
|
+
serialCard.transmit = mockTransmit;
|
|
375
|
+
serialCard.write(0x00, 0x42);
|
|
376
|
+
for (let i = 0; i < 100; i++) {
|
|
377
|
+
serialCard.tick(1000000);
|
|
378
|
+
}
|
|
379
|
+
expect(mockTransmit).toHaveBeenCalled();
|
|
380
|
+
});
|
|
381
|
+
it('should support custom IRQ callback', () => {
|
|
382
|
+
const mockIRQ = jest.fn();
|
|
383
|
+
serialCard.raiseIRQ = mockIRQ;
|
|
384
|
+
serialCard.write(0x02, 0x04);
|
|
385
|
+
serialCard.onData(0x42);
|
|
386
|
+
expect(mockIRQ).toHaveBeenCalled();
|
|
387
|
+
});
|
|
388
|
+
it('should support custom NMI callback', () => {
|
|
389
|
+
const mockNMI = jest.fn();
|
|
390
|
+
serialCard.raiseNMI = mockNMI;
|
|
391
|
+
// NMI not currently triggered in implementation, but callback exists
|
|
392
|
+
expect(typeof serialCard.raiseNMI).toBe('function');
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
describe('Edge Cases', () => {
|
|
396
|
+
it('should handle zero-length tick', () => {
|
|
397
|
+
serialCard.write(0x00, 0x42);
|
|
398
|
+
serialCard.tick(0);
|
|
399
|
+
// Should not crash
|
|
400
|
+
});
|
|
401
|
+
it('should handle rapid consecutive writes', () => {
|
|
402
|
+
for (let i = 0; i < 100; i++) {
|
|
403
|
+
serialCard.write(0x00, i & 0xFF);
|
|
404
|
+
}
|
|
405
|
+
// Should queue all data without error
|
|
406
|
+
});
|
|
407
|
+
it('should handle rapid consecutive reads from empty receive buffer', () => {
|
|
408
|
+
for (let i = 0; i < 100; i++) {
|
|
409
|
+
const data = serialCard.read(0x00);
|
|
410
|
+
expect(typeof data).toBe('number');
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
it('should handle interleaved reads and writes', () => {
|
|
414
|
+
serialCard.write(0x00, 0x42);
|
|
415
|
+
const data1 = serialCard.read(0x01); // Read status
|
|
416
|
+
serialCard.write(0x00, 0x43);
|
|
417
|
+
const data2 = serialCard.read(0x01); // Read status again
|
|
418
|
+
expect(typeof data1).toBe('number');
|
|
419
|
+
expect(typeof data2).toBe('number');
|
|
420
|
+
});
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
//# sourceMappingURL=SerialCard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SerialCard.test.js","sourceRoot":"","sources":["../../../src/tests/IO/SerialCard.test.ts"],"names":[],"mappings":"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"}
|