ac6502 1.16.1 → 1.16.2
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/dist/components/IO/ACIA.js +19 -17
- package/dist/components/IO/ACIA.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/tests/IO/ACIA.test.js +62 -21
- package/dist/tests/IO/ACIA.test.js.map +1 -1
- package/package.json +1 -1
- package/src/components/IO/ACIA.ts +22 -20
- package/src/index.ts +1 -1
- package/src/tests/IO/ACIA.test.ts +72 -24
|
@@ -29,6 +29,9 @@ class ACIA {
|
|
|
29
29
|
this.framingError = false;
|
|
30
30
|
this.irqFlag = false;
|
|
31
31
|
this.echoMode = false;
|
|
32
|
+
// Receive queue — buffers incoming bytes from host serial port
|
|
33
|
+
// and delivers them one at a time via tick() to the single-byte rxRegister
|
|
34
|
+
this.rxQueue = [];
|
|
32
35
|
}
|
|
33
36
|
/**
|
|
34
37
|
* Read from ACIA register
|
|
@@ -160,8 +163,19 @@ class ACIA {
|
|
|
160
163
|
if ((this.commandRegister & 0x0C) === 0x04) {
|
|
161
164
|
this.irqFlag = true;
|
|
162
165
|
}
|
|
163
|
-
|
|
164
|
-
|
|
166
|
+
}
|
|
167
|
+
// Deliver next queued byte to rxRegister when empty
|
|
168
|
+
if (!this.rxRegFull && this.rxQueue.length > 0) {
|
|
169
|
+
this.rxRegister = this.rxQueue.shift();
|
|
170
|
+
this.rxRegFull = true;
|
|
171
|
+
// Trigger receive IRQ if enabled (bit 1 = 0 means enabled, active low)
|
|
172
|
+
if (!(this.commandRegister & 0x02)) {
|
|
173
|
+
this.irqFlag = true;
|
|
174
|
+
}
|
|
175
|
+
// Echo mode: automatically transmit received data
|
|
176
|
+
if (this.echoMode && this.transmit) {
|
|
177
|
+
this.transmit(this.rxRegister);
|
|
178
|
+
}
|
|
165
179
|
}
|
|
166
180
|
// Return IRQ status
|
|
167
181
|
return this.irqFlag ? 0x80 : 0;
|
|
@@ -182,25 +196,13 @@ class ACIA {
|
|
|
182
196
|
this.framingError = false;
|
|
183
197
|
this.irqFlag = false;
|
|
184
198
|
this.echoMode = false;
|
|
199
|
+
this.rxQueue = [];
|
|
185
200
|
}
|
|
186
201
|
/**
|
|
187
|
-
* Receive data from external source
|
|
202
|
+
* Receive data from external source — queues the byte for delivery via tick()
|
|
188
203
|
*/
|
|
189
204
|
onData(data) {
|
|
190
|
-
|
|
191
|
-
// Overrun: new data arrived before the previous byte was read
|
|
192
|
-
this.overrun = true;
|
|
193
|
-
}
|
|
194
|
-
this.rxRegister = data & 0xFF;
|
|
195
|
-
this.rxRegFull = true;
|
|
196
|
-
// Trigger receive IRQ if enabled (bit 1 = 0 means enabled, active low)
|
|
197
|
-
if (!(this.commandRegister & 0x02)) {
|
|
198
|
-
this.irqFlag = true;
|
|
199
|
-
}
|
|
200
|
-
// Echo mode: automatically transmit received data
|
|
201
|
-
if (this.echoMode && this.transmit) {
|
|
202
|
-
this.transmit(data & 0xFF);
|
|
203
|
-
}
|
|
205
|
+
this.rxQueue.push(data & 0xFF);
|
|
204
206
|
}
|
|
205
207
|
}
|
|
206
208
|
exports.ACIA = ACIA;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ACIA.js","sourceRoot":"","sources":["../../../src/components/IO/ACIA.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;GAWG;AACH,MAAa,IAAI;IAAjB;QAIE,YAAY;QACJ,eAAU,GAAW,CAAC,CAAA;QACtB,eAAU,GAAW,CAAC,CAAA;QACtB,oBAAe,GAAW,CAAC,CAAA;QAC3B,oBAAe,GAAW,CAAC,CAAA;QAEnC,eAAe;QACP,eAAU,GAAY,IAAI,CAAA;QAC1B,cAAS,GAAY,KAAK,CAAA;QAC1B,cAAS,GAAY,KAAK,CAAA;QAC1B,YAAO,GAAY,KAAK,CAAA;QACxB,gBAAW,GAAY,KAAK,CAAA;QAC5B,iBAAY,GAAY,KAAK,CAAA;QAC7B,YAAO,GAAY,KAAK,CAAA;QACxB,aAAQ,GAAY,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"ACIA.js","sourceRoot":"","sources":["../../../src/components/IO/ACIA.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -20,7 +20,7 @@ const serialport_1 = require("serialport");
|
|
|
20
20
|
const sdl_1 = __importDefault(require("@kmamal/sdl"));
|
|
21
21
|
const promises_1 = require("fs/promises");
|
|
22
22
|
const fs_1 = require("fs");
|
|
23
|
-
const VERSION = '1.16.
|
|
23
|
+
const VERSION = '1.16.2';
|
|
24
24
|
const WIDTH = 320;
|
|
25
25
|
const HEIGHT = 240;
|
|
26
26
|
// Audio constants
|
|
@@ -29,17 +29,20 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
29
29
|
});
|
|
30
30
|
it('should read data from receive buffer', () => {
|
|
31
31
|
serialCard.onData(0x42);
|
|
32
|
+
serialCard.tick(1000000);
|
|
32
33
|
const data = serialCard.read(0x00);
|
|
33
34
|
expect(data).toBe(0x42);
|
|
34
35
|
});
|
|
35
36
|
it('should mask data to 8 bits', () => {
|
|
36
37
|
serialCard.write(0x00, 0x1FF); // More than 8 bits
|
|
37
38
|
serialCard.onData(0x1FF);
|
|
39
|
+
serialCard.tick(1000000);
|
|
38
40
|
const data = serialCard.read(0x00);
|
|
39
41
|
expect(data).toBe(0xFF);
|
|
40
42
|
});
|
|
41
43
|
it('should return last received data if no new data available', () => {
|
|
42
44
|
serialCard.onData(0x42);
|
|
45
|
+
serialCard.tick(1000000);
|
|
43
46
|
let data = serialCard.read(0x00); // Read the data
|
|
44
47
|
data = serialCard.read(0x00); // Read again with empty buffer
|
|
45
48
|
// Should return last value received
|
|
@@ -49,11 +52,13 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
49
52
|
describe('Status Register (0x01)', () => {
|
|
50
53
|
it('should report Receive Data Register Full when data available', () => {
|
|
51
54
|
serialCard.onData(0x50);
|
|
55
|
+
serialCard.tick(1000000);
|
|
52
56
|
const status = serialCard.read(0x01);
|
|
53
57
|
expect(status & 0x08).toBe(0x08); // RDRF bit set
|
|
54
58
|
});
|
|
55
59
|
it('should clear RDRF after reading data', () => {
|
|
56
60
|
serialCard.onData(0x50);
|
|
61
|
+
serialCard.tick(1000000);
|
|
57
62
|
serialCard.read(0x00); // Read the data
|
|
58
63
|
const status = serialCard.read(0x01);
|
|
59
64
|
expect(status & 0x08).toBe(0); // RDRF bit clear
|
|
@@ -109,12 +114,14 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
109
114
|
it('should enable receive IRQ when RIIE bit (bit 1) is clear', () => {
|
|
110
115
|
serialCard.write(0x02, 0x04); // bit 1 = 0: receive IRQ enabled
|
|
111
116
|
serialCard.onData(0x42);
|
|
117
|
+
serialCard.tick(1000000);
|
|
112
118
|
const status = serialCard.read(0x01);
|
|
113
119
|
expect(status & 0x80).toBe(0x80); // IRQ flag set in status
|
|
114
120
|
});
|
|
115
121
|
it('should disable receive IRQ when RIIE bit (bit 1) is set', () => {
|
|
116
122
|
serialCard.write(0x02, 0x02); // RIIE=1: receive IRQ disabled (R6551: bit1=1 disables)
|
|
117
123
|
serialCard.onData(0x42);
|
|
124
|
+
serialCard.tick(1000000);
|
|
118
125
|
const status = serialCard.read(0x01);
|
|
119
126
|
expect(status & 0x80).toBe(0); // IRQ flag not set
|
|
120
127
|
});
|
|
@@ -123,7 +130,8 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
123
130
|
serialCard.transmit = mockTransmit;
|
|
124
131
|
serialCard.write(0x02, 0x10); // REM=1: echo mode enabled (bit 4 per 6551 spec)
|
|
125
132
|
serialCard.onData(0x42);
|
|
126
|
-
|
|
133
|
+
serialCard.tick(1000000);
|
|
134
|
+
// In echo mode, received data is echoed when delivered to rxRegister via tick
|
|
127
135
|
expect(mockTransmit).toHaveBeenCalledWith(0x42);
|
|
128
136
|
});
|
|
129
137
|
});
|
|
@@ -175,23 +183,33 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
175
183
|
describe('Data Reception', () => {
|
|
176
184
|
it('should receive data from external source', () => {
|
|
177
185
|
serialCard.onData(0x55);
|
|
186
|
+
serialCard.tick(1000000);
|
|
178
187
|
const data = serialCard.read(0x00);
|
|
179
188
|
expect(data).toBe(0x55);
|
|
180
189
|
});
|
|
181
190
|
it('should set RDRF flag when data received', () => {
|
|
182
191
|
serialCard.onData(0x55);
|
|
192
|
+
serialCard.tick(1000000);
|
|
183
193
|
const status = serialCard.read(0x01);
|
|
184
194
|
expect(status & 0x08).toBe(0x08);
|
|
185
195
|
});
|
|
186
|
-
it('should
|
|
196
|
+
it('should queue multiple received bytes and deliver them in order', () => {
|
|
187
197
|
serialCard.onData(0x41); // 'A'
|
|
188
|
-
serialCard.onData(0x42); // 'B'
|
|
189
|
-
serialCard.onData(0x43); // 'C'
|
|
190
|
-
//
|
|
198
|
+
serialCard.onData(0x42); // 'B'
|
|
199
|
+
serialCard.onData(0x43); // 'C'
|
|
200
|
+
// First byte delivered on tick
|
|
201
|
+
serialCard.tick(1000000);
|
|
202
|
+
expect(serialCard.read(0x00)).toBe(0x41);
|
|
203
|
+
// Second byte delivered on next tick after read
|
|
204
|
+
serialCard.tick(1000000);
|
|
205
|
+
expect(serialCard.read(0x00)).toBe(0x42);
|
|
206
|
+
// Third byte
|
|
207
|
+
serialCard.tick(1000000);
|
|
191
208
|
expect(serialCard.read(0x00)).toBe(0x43);
|
|
192
209
|
});
|
|
193
210
|
it('should mask received data to 8 bits', () => {
|
|
194
211
|
serialCard.onData(0x1FF);
|
|
212
|
+
serialCard.tick(1000000);
|
|
195
213
|
const data = serialCard.read(0x00);
|
|
196
214
|
expect(data).toBe(0xFF);
|
|
197
215
|
});
|
|
@@ -200,6 +218,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
200
218
|
it('should set IRQ flag on receive when interrupt enabled', () => {
|
|
201
219
|
serialCard.write(0x02, 0x00); // bit 1 = 0: receive IRQ enabled
|
|
202
220
|
serialCard.onData(0x42);
|
|
221
|
+
serialCard.tick(1000000);
|
|
203
222
|
expect(serialCard.read(0x01) & 0x80).toBe(0x80); // IRQ flag set
|
|
204
223
|
});
|
|
205
224
|
it('should return IRQ status from tick on transmit complete when enabled', () => {
|
|
@@ -216,36 +235,52 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
216
235
|
it('should not set IRQ flag on receive when disabled', () => {
|
|
217
236
|
serialCard.write(0x02, 0x02); // RIIE=1: receive IRQ disabled
|
|
218
237
|
serialCard.onData(0x42);
|
|
238
|
+
serialCard.tick(1000000);
|
|
219
239
|
const status = serialCard.read(0x01);
|
|
220
240
|
expect(status & 0x80).toBe(0); // IRQ flag not set
|
|
221
241
|
});
|
|
222
242
|
it('should clear IRQ flag when data is read', () => {
|
|
223
243
|
serialCard.write(0x02, 0x00); // Enable receive IRQ
|
|
224
244
|
serialCard.onData(0x42);
|
|
245
|
+
serialCard.tick(1000000);
|
|
225
246
|
expect(serialCard.read(0x01) & 0x80).toBe(0x80); // IRQ set
|
|
226
247
|
serialCard.read(0x00); // Read data
|
|
227
248
|
expect(serialCard.read(0x01) & 0x80).toBe(0); // IRQ cleared
|
|
228
249
|
});
|
|
229
250
|
});
|
|
230
|
-
describe('
|
|
231
|
-
it('should
|
|
251
|
+
describe('Receive Queue', () => {
|
|
252
|
+
it('should buffer multiple bytes and deliver in order', () => {
|
|
253
|
+
serialCard.onData(0x42);
|
|
254
|
+
serialCard.onData(0x43);
|
|
255
|
+
// First byte delivered on tick
|
|
256
|
+
serialCard.tick(1000000);
|
|
257
|
+
expect(serialCard.read(0x01) & 0x08).toBe(0x08); // RDRF set
|
|
258
|
+
expect(serialCard.read(0x00)).toBe(0x42);
|
|
259
|
+
// Second byte delivered on next tick
|
|
260
|
+
serialCard.tick(1000000);
|
|
261
|
+
expect(serialCard.read(0x01) & 0x08).toBe(0x08); // RDRF set
|
|
262
|
+
expect(serialCard.read(0x00)).toBe(0x43);
|
|
263
|
+
// Queue empty
|
|
264
|
+
serialCard.tick(1000000);
|
|
265
|
+
expect(serialCard.read(0x01) & 0x08).toBe(0); // RDRF clear
|
|
266
|
+
});
|
|
267
|
+
it('should not deliver next byte until current is read', () => {
|
|
232
268
|
serialCard.onData(0x42);
|
|
233
|
-
const statusBefore = serialCard.read(0x01);
|
|
234
|
-
// Send another byte before first is read
|
|
235
269
|
serialCard.onData(0x43);
|
|
236
|
-
|
|
237
|
-
|
|
270
|
+
serialCard.tick(1000000); // delivers 0x42
|
|
271
|
+
serialCard.tick(1000000); // rxRegFull still true, 0x43 stays in queue
|
|
272
|
+
serialCard.tick(1000000); // still waiting
|
|
273
|
+
expect(serialCard.read(0x00)).toBe(0x42); // first byte still there
|
|
274
|
+
serialCard.tick(1000000); // NOW delivers 0x43
|
|
275
|
+
expect(serialCard.read(0x00)).toBe(0x43);
|
|
238
276
|
});
|
|
239
|
-
it('should clear
|
|
277
|
+
it('should clear queue on reset', () => {
|
|
240
278
|
serialCard.onData(0x42);
|
|
241
|
-
serialCard.onData(0x43);
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
//
|
|
246
|
-
serialCard.read(0x00);
|
|
247
|
-
const statusAfter = serialCard.read(0x01);
|
|
248
|
-
expect(statusAfter & 0x04).toBe(0);
|
|
279
|
+
serialCard.onData(0x43);
|
|
280
|
+
serialCard.onData(0x44);
|
|
281
|
+
serialCard.reset(true);
|
|
282
|
+
serialCard.tick(1000000);
|
|
283
|
+
expect(serialCard.read(0x01) & 0x08).toBe(0); // RDRF clear — queue was emptied
|
|
249
284
|
});
|
|
250
285
|
});
|
|
251
286
|
describe('Echo Mode', () => {
|
|
@@ -254,7 +289,8 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
254
289
|
serialCard.transmit = mockTransmit;
|
|
255
290
|
serialCard.write(0x02, 0x10); // REM=1: echo mode enabled (bit 4 per 6551 spec)
|
|
256
291
|
serialCard.onData(0x42);
|
|
257
|
-
|
|
292
|
+
serialCard.tick(1000000);
|
|
293
|
+
// Echo happens when byte is delivered from queue to rxRegister in tick
|
|
258
294
|
expect(mockTransmit).toHaveBeenCalledWith(0x42);
|
|
259
295
|
});
|
|
260
296
|
it('should not echo when echo mode disabled', () => {
|
|
@@ -262,6 +298,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
262
298
|
serialCard.transmit = mockTransmit;
|
|
263
299
|
serialCard.write(0x02, 0x00); // Echo mode disabled
|
|
264
300
|
serialCard.onData(0x42);
|
|
301
|
+
serialCard.tick(1000000);
|
|
265
302
|
expect(mockTransmit).not.toHaveBeenCalled();
|
|
266
303
|
});
|
|
267
304
|
it('should not echo data through TX register (echoes directly)', () => {
|
|
@@ -269,6 +306,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
269
306
|
serialCard.transmit = mockTransmit;
|
|
270
307
|
serialCard.write(0x02, 0x10); // Echo mode enabled
|
|
271
308
|
serialCard.onData(0x42);
|
|
309
|
+
serialCard.tick(1000000);
|
|
272
310
|
// Echo goes directly through transmit callback, TDRE stays set
|
|
273
311
|
const status = serialCard.read(0x01);
|
|
274
312
|
expect(status & 0x10).toBe(0x10); // TDRE set (TX register not used for echo)
|
|
@@ -294,6 +332,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
294
332
|
serialCard.write(0x00, 0x43);
|
|
295
333
|
serialCard.write(0x02, 0xFF); // Set command register
|
|
296
334
|
serialCard.onData(0x44);
|
|
335
|
+
serialCard.tick(1000000);
|
|
297
336
|
// Now perform programmed reset
|
|
298
337
|
serialCard.write(0x01, 0x00); // Programmed reset via status register write
|
|
299
338
|
const status = serialCard.read(0x01);
|
|
@@ -306,6 +345,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
306
345
|
serialCard.write(0x02, 0xFF);
|
|
307
346
|
serialCard.write(0x03, 0xFF);
|
|
308
347
|
serialCard.onData(0x42);
|
|
348
|
+
serialCard.tick(1000000);
|
|
309
349
|
serialCard.reset(true);
|
|
310
350
|
expect(serialCard.read(0x01) & 0x10).toBe(0x10); // TDRE set
|
|
311
351
|
expect(serialCard.read(0x01) & 0x08).toBe(0); // RDRF clear
|
|
@@ -319,6 +359,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
319
359
|
});
|
|
320
360
|
it('should clear receive buffer on reset', () => {
|
|
321
361
|
serialCard.onData(0x42);
|
|
362
|
+
serialCard.tick(1000000);
|
|
322
363
|
serialCard.reset(true);
|
|
323
364
|
expect(serialCard.read(0x01) & 0x08).toBe(0); // RDRF should be clear (buffer empty)
|
|
324
365
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ACIA.test.js","sourceRoot":"","sources":["../../../src/tests/IO/ACIA.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ACIA.test.js","sourceRoot":"","sources":["../../../src/tests/IO/ACIA.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -32,6 +32,10 @@ export class ACIA implements IO {
|
|
|
32
32
|
private irqFlag: boolean = false
|
|
33
33
|
private echoMode: boolean = false
|
|
34
34
|
|
|
35
|
+
// Receive queue — buffers incoming bytes from host serial port
|
|
36
|
+
// and delivers them one at a time via tick() to the single-byte rxRegister
|
|
37
|
+
private rxQueue: number[] = []
|
|
38
|
+
|
|
35
39
|
/**
|
|
36
40
|
* Read from ACIA register
|
|
37
41
|
*/
|
|
@@ -188,9 +192,22 @@ export class ACIA implements IO {
|
|
|
188
192
|
if ((this.commandRegister & 0x0C) === 0x04) {
|
|
189
193
|
this.irqFlag = true
|
|
190
194
|
}
|
|
195
|
+
}
|
|
191
196
|
|
|
192
|
-
|
|
193
|
-
|
|
197
|
+
// Deliver next queued byte to rxRegister when empty
|
|
198
|
+
if (!this.rxRegFull && this.rxQueue.length > 0) {
|
|
199
|
+
this.rxRegister = this.rxQueue.shift()!
|
|
200
|
+
this.rxRegFull = true
|
|
201
|
+
|
|
202
|
+
// Trigger receive IRQ if enabled (bit 1 = 0 means enabled, active low)
|
|
203
|
+
if (!(this.commandRegister & 0x02)) {
|
|
204
|
+
this.irqFlag = true
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Echo mode: automatically transmit received data
|
|
208
|
+
if (this.echoMode && this.transmit) {
|
|
209
|
+
this.transmit(this.rxRegister)
|
|
210
|
+
}
|
|
194
211
|
}
|
|
195
212
|
|
|
196
213
|
// Return IRQ status
|
|
@@ -214,28 +231,13 @@ export class ACIA implements IO {
|
|
|
214
231
|
this.framingError = false
|
|
215
232
|
this.irqFlag = false
|
|
216
233
|
this.echoMode = false
|
|
234
|
+
this.rxQueue = []
|
|
217
235
|
}
|
|
218
236
|
|
|
219
237
|
/**
|
|
220
|
-
* Receive data from external source
|
|
238
|
+
* Receive data from external source — queues the byte for delivery via tick()
|
|
221
239
|
*/
|
|
222
240
|
onData(data: number): void {
|
|
223
|
-
|
|
224
|
-
// Overrun: new data arrived before the previous byte was read
|
|
225
|
-
this.overrun = true
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
this.rxRegister = data & 0xFF
|
|
229
|
-
this.rxRegFull = true
|
|
230
|
-
|
|
231
|
-
// Trigger receive IRQ if enabled (bit 1 = 0 means enabled, active low)
|
|
232
|
-
if (!(this.commandRegister & 0x02)) {
|
|
233
|
-
this.irqFlag = true
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// Echo mode: automatically transmit received data
|
|
237
|
-
if (this.echoMode && this.transmit) {
|
|
238
|
-
this.transmit(data & 0xFF)
|
|
239
|
-
}
|
|
241
|
+
this.rxQueue.push(data & 0xFF)
|
|
240
242
|
}
|
|
241
243
|
}
|
package/src/index.ts
CHANGED
|
@@ -34,6 +34,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
34
34
|
|
|
35
35
|
it('should read data from receive buffer', () => {
|
|
36
36
|
serialCard.onData(0x42)
|
|
37
|
+
serialCard.tick(1000000)
|
|
37
38
|
const data = serialCard.read(0x00)
|
|
38
39
|
expect(data).toBe(0x42)
|
|
39
40
|
})
|
|
@@ -41,12 +42,14 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
41
42
|
it('should mask data to 8 bits', () => {
|
|
42
43
|
serialCard.write(0x00, 0x1FF) // More than 8 bits
|
|
43
44
|
serialCard.onData(0x1FF)
|
|
45
|
+
serialCard.tick(1000000)
|
|
44
46
|
const data = serialCard.read(0x00)
|
|
45
47
|
expect(data).toBe(0xFF)
|
|
46
48
|
})
|
|
47
49
|
|
|
48
50
|
it('should return last received data if no new data available', () => {
|
|
49
51
|
serialCard.onData(0x42)
|
|
52
|
+
serialCard.tick(1000000)
|
|
50
53
|
let data = serialCard.read(0x00) // Read the data
|
|
51
54
|
data = serialCard.read(0x00) // Read again with empty buffer
|
|
52
55
|
// Should return last value received
|
|
@@ -57,12 +60,14 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
57
60
|
describe('Status Register (0x01)', () => {
|
|
58
61
|
it('should report Receive Data Register Full when data available', () => {
|
|
59
62
|
serialCard.onData(0x50)
|
|
63
|
+
serialCard.tick(1000000)
|
|
60
64
|
const status = serialCard.read(0x01)
|
|
61
65
|
expect(status & 0x08).toBe(0x08) // RDRF bit set
|
|
62
66
|
})
|
|
63
67
|
|
|
64
68
|
it('should clear RDRF after reading data', () => {
|
|
65
69
|
serialCard.onData(0x50)
|
|
70
|
+
serialCard.tick(1000000)
|
|
66
71
|
serialCard.read(0x00) // Read the data
|
|
67
72
|
const status = serialCard.read(0x01)
|
|
68
73
|
expect(status & 0x08).toBe(0) // RDRF bit clear
|
|
@@ -130,6 +135,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
130
135
|
it('should enable receive IRQ when RIIE bit (bit 1) is clear', () => {
|
|
131
136
|
serialCard.write(0x02, 0x04) // bit 1 = 0: receive IRQ enabled
|
|
132
137
|
serialCard.onData(0x42)
|
|
138
|
+
serialCard.tick(1000000)
|
|
133
139
|
|
|
134
140
|
const status = serialCard.read(0x01)
|
|
135
141
|
expect(status & 0x80).toBe(0x80) // IRQ flag set in status
|
|
@@ -138,6 +144,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
138
144
|
it('should disable receive IRQ when RIIE bit (bit 1) is set', () => {
|
|
139
145
|
serialCard.write(0x02, 0x02) // RIIE=1: receive IRQ disabled (R6551: bit1=1 disables)
|
|
140
146
|
serialCard.onData(0x42)
|
|
147
|
+
serialCard.tick(1000000)
|
|
141
148
|
|
|
142
149
|
const status = serialCard.read(0x01)
|
|
143
150
|
expect(status & 0x80).toBe(0) // IRQ flag not set
|
|
@@ -149,8 +156,9 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
149
156
|
|
|
150
157
|
serialCard.write(0x02, 0x10) // REM=1: echo mode enabled (bit 4 per 6551 spec)
|
|
151
158
|
serialCard.onData(0x42)
|
|
159
|
+
serialCard.tick(1000000)
|
|
152
160
|
|
|
153
|
-
// In echo mode, received data is echoed
|
|
161
|
+
// In echo mode, received data is echoed when delivered to rxRegister via tick
|
|
154
162
|
expect(mockTransmit).toHaveBeenCalledWith(0x42)
|
|
155
163
|
})
|
|
156
164
|
})
|
|
@@ -218,27 +226,39 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
218
226
|
describe('Data Reception', () => {
|
|
219
227
|
it('should receive data from external source', () => {
|
|
220
228
|
serialCard.onData(0x55)
|
|
229
|
+
serialCard.tick(1000000)
|
|
221
230
|
const data = serialCard.read(0x00)
|
|
222
231
|
expect(data).toBe(0x55)
|
|
223
232
|
})
|
|
224
233
|
|
|
225
234
|
it('should set RDRF flag when data received', () => {
|
|
226
235
|
serialCard.onData(0x55)
|
|
236
|
+
serialCard.tick(1000000)
|
|
227
237
|
const status = serialCard.read(0x01)
|
|
228
238
|
expect(status & 0x08).toBe(0x08)
|
|
229
239
|
})
|
|
230
240
|
|
|
231
|
-
it('should
|
|
241
|
+
it('should queue multiple received bytes and deliver them in order', () => {
|
|
232
242
|
serialCard.onData(0x41) // 'A'
|
|
233
|
-
serialCard.onData(0x42) // 'B'
|
|
234
|
-
serialCard.onData(0x43) // 'C'
|
|
243
|
+
serialCard.onData(0x42) // 'B'
|
|
244
|
+
serialCard.onData(0x43) // 'C'
|
|
245
|
+
|
|
246
|
+
// First byte delivered on tick
|
|
247
|
+
serialCard.tick(1000000)
|
|
248
|
+
expect(serialCard.read(0x00)).toBe(0x41)
|
|
249
|
+
|
|
250
|
+
// Second byte delivered on next tick after read
|
|
251
|
+
serialCard.tick(1000000)
|
|
252
|
+
expect(serialCard.read(0x00)).toBe(0x42)
|
|
235
253
|
|
|
236
|
-
//
|
|
254
|
+
// Third byte
|
|
255
|
+
serialCard.tick(1000000)
|
|
237
256
|
expect(serialCard.read(0x00)).toBe(0x43)
|
|
238
257
|
})
|
|
239
258
|
|
|
240
259
|
it('should mask received data to 8 bits', () => {
|
|
241
260
|
serialCard.onData(0x1FF)
|
|
261
|
+
serialCard.tick(1000000)
|
|
242
262
|
const data = serialCard.read(0x00)
|
|
243
263
|
expect(data).toBe(0xFF)
|
|
244
264
|
})
|
|
@@ -248,6 +268,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
248
268
|
it('should set IRQ flag on receive when interrupt enabled', () => {
|
|
249
269
|
serialCard.write(0x02, 0x00) // bit 1 = 0: receive IRQ enabled
|
|
250
270
|
serialCard.onData(0x42)
|
|
271
|
+
serialCard.tick(1000000)
|
|
251
272
|
|
|
252
273
|
expect(serialCard.read(0x01) & 0x80).toBe(0x80) // IRQ flag set
|
|
253
274
|
})
|
|
@@ -270,6 +291,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
270
291
|
it('should not set IRQ flag on receive when disabled', () => {
|
|
271
292
|
serialCard.write(0x02, 0x02) // RIIE=1: receive IRQ disabled
|
|
272
293
|
serialCard.onData(0x42)
|
|
294
|
+
serialCard.tick(1000000)
|
|
273
295
|
|
|
274
296
|
const status = serialCard.read(0x01)
|
|
275
297
|
expect(status & 0x80).toBe(0) // IRQ flag not set
|
|
@@ -278,6 +300,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
278
300
|
it('should clear IRQ flag when data is read', () => {
|
|
279
301
|
serialCard.write(0x02, 0x00) // Enable receive IRQ
|
|
280
302
|
serialCard.onData(0x42)
|
|
303
|
+
serialCard.tick(1000000)
|
|
281
304
|
|
|
282
305
|
expect(serialCard.read(0x01) & 0x80).toBe(0x80) // IRQ set
|
|
283
306
|
|
|
@@ -287,30 +310,49 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
287
310
|
})
|
|
288
311
|
})
|
|
289
312
|
|
|
290
|
-
describe('
|
|
291
|
-
it('should
|
|
313
|
+
describe('Receive Queue', () => {
|
|
314
|
+
it('should buffer multiple bytes and deliver in order', () => {
|
|
292
315
|
serialCard.onData(0x42)
|
|
293
|
-
const statusBefore = serialCard.read(0x01)
|
|
294
|
-
|
|
295
|
-
// Send another byte before first is read
|
|
296
316
|
serialCard.onData(0x43)
|
|
297
|
-
const statusAfter = serialCard.read(0x01)
|
|
298
317
|
|
|
299
|
-
|
|
318
|
+
// First byte delivered on tick
|
|
319
|
+
serialCard.tick(1000000)
|
|
320
|
+
expect(serialCard.read(0x01) & 0x08).toBe(0x08) // RDRF set
|
|
321
|
+
expect(serialCard.read(0x00)).toBe(0x42)
|
|
322
|
+
|
|
323
|
+
// Second byte delivered on next tick
|
|
324
|
+
serialCard.tick(1000000)
|
|
325
|
+
expect(serialCard.read(0x01) & 0x08).toBe(0x08) // RDRF set
|
|
326
|
+
expect(serialCard.read(0x00)).toBe(0x43)
|
|
327
|
+
|
|
328
|
+
// Queue empty
|
|
329
|
+
serialCard.tick(1000000)
|
|
330
|
+
expect(serialCard.read(0x01) & 0x08).toBe(0) // RDRF clear
|
|
300
331
|
})
|
|
301
332
|
|
|
302
|
-
it('should
|
|
333
|
+
it('should not deliver next byte until current is read', () => {
|
|
303
334
|
serialCard.onData(0x42)
|
|
304
|
-
serialCard.onData(0x43)
|
|
305
|
-
|
|
306
|
-
//
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
//
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
expect(
|
|
335
|
+
serialCard.onData(0x43)
|
|
336
|
+
|
|
337
|
+
serialCard.tick(1000000) // delivers 0x42
|
|
338
|
+
serialCard.tick(1000000) // rxRegFull still true, 0x43 stays in queue
|
|
339
|
+
serialCard.tick(1000000) // still waiting
|
|
340
|
+
|
|
341
|
+
expect(serialCard.read(0x00)).toBe(0x42) // first byte still there
|
|
342
|
+
|
|
343
|
+
serialCard.tick(1000000) // NOW delivers 0x43
|
|
344
|
+
expect(serialCard.read(0x00)).toBe(0x43)
|
|
345
|
+
})
|
|
346
|
+
|
|
347
|
+
it('should clear queue on reset', () => {
|
|
348
|
+
serialCard.onData(0x42)
|
|
349
|
+
serialCard.onData(0x43)
|
|
350
|
+
serialCard.onData(0x44)
|
|
351
|
+
|
|
352
|
+
serialCard.reset(true)
|
|
353
|
+
|
|
354
|
+
serialCard.tick(1000000)
|
|
355
|
+
expect(serialCard.read(0x01) & 0x08).toBe(0) // RDRF clear — queue was emptied
|
|
314
356
|
})
|
|
315
357
|
})
|
|
316
358
|
|
|
@@ -321,8 +363,9 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
321
363
|
|
|
322
364
|
serialCard.write(0x02, 0x10) // REM=1: echo mode enabled (bit 4 per 6551 spec)
|
|
323
365
|
serialCard.onData(0x42)
|
|
366
|
+
serialCard.tick(1000000)
|
|
324
367
|
|
|
325
|
-
// Echo happens
|
|
368
|
+
// Echo happens when byte is delivered from queue to rxRegister in tick
|
|
326
369
|
expect(mockTransmit).toHaveBeenCalledWith(0x42)
|
|
327
370
|
})
|
|
328
371
|
|
|
@@ -332,6 +375,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
332
375
|
|
|
333
376
|
serialCard.write(0x02, 0x00) // Echo mode disabled
|
|
334
377
|
serialCard.onData(0x42)
|
|
378
|
+
serialCard.tick(1000000)
|
|
335
379
|
|
|
336
380
|
expect(mockTransmit).not.toHaveBeenCalled()
|
|
337
381
|
})
|
|
@@ -342,6 +386,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
342
386
|
|
|
343
387
|
serialCard.write(0x02, 0x10) // Echo mode enabled
|
|
344
388
|
serialCard.onData(0x42)
|
|
389
|
+
serialCard.tick(1000000)
|
|
345
390
|
|
|
346
391
|
// Echo goes directly through transmit callback, TDRE stays set
|
|
347
392
|
const status = serialCard.read(0x01)
|
|
@@ -371,6 +416,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
371
416
|
serialCard.write(0x00, 0x43)
|
|
372
417
|
serialCard.write(0x02, 0xFF) // Set command register
|
|
373
418
|
serialCard.onData(0x44)
|
|
419
|
+
serialCard.tick(1000000)
|
|
374
420
|
|
|
375
421
|
// Now perform programmed reset
|
|
376
422
|
serialCard.write(0x01, 0x00) // Programmed reset via status register write
|
|
@@ -386,6 +432,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
386
432
|
serialCard.write(0x02, 0xFF)
|
|
387
433
|
serialCard.write(0x03, 0xFF)
|
|
388
434
|
serialCard.onData(0x42)
|
|
435
|
+
serialCard.tick(1000000)
|
|
389
436
|
|
|
390
437
|
serialCard.reset(true)
|
|
391
438
|
|
|
@@ -405,6 +452,7 @@ describe('ACIA (6551 ACIA)', () => {
|
|
|
405
452
|
|
|
406
453
|
it('should clear receive buffer on reset', () => {
|
|
407
454
|
serialCard.onData(0x42)
|
|
455
|
+
serialCard.tick(1000000)
|
|
408
456
|
|
|
409
457
|
serialCard.reset(true)
|
|
410
458
|
|