ac6502 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +2 -2
  2. package/dist/components/IO/EmptyCard.js +17 -0
  3. package/dist/components/IO/EmptyCard.js.map +1 -0
  4. package/dist/components/IO/GPIOAttachments/GPIOKeypadAttachment.js +141 -0
  5. package/dist/components/IO/GPIOAttachments/GPIOKeypadAttachment.js.map +1 -0
  6. package/dist/components/IO/GPIOAttachments/GPIOLCDAttachment.js +716 -0
  7. package/dist/components/IO/GPIOAttachments/GPIOLCDAttachment.js.map +1 -0
  8. package/dist/components/IO/SerialCard.js +4 -4
  9. package/dist/components/IO/SerialCard.js.map +1 -1
  10. package/dist/components/Machine.js +84 -45
  11. package/dist/components/Machine.js.map +1 -1
  12. package/dist/index.js +175 -52
  13. package/dist/index.js.map +1 -1
  14. package/dist/tests/IO/GPIOAttachments/GPIOKeypadAttachment.test.js +323 -0
  15. package/dist/tests/IO/GPIOAttachments/GPIOKeypadAttachment.test.js.map +1 -0
  16. package/dist/tests/IO/GPIOAttachments/GPIOLCDAttachment.test.js +627 -0
  17. package/dist/tests/IO/GPIOAttachments/GPIOLCDAttachment.test.js.map +1 -0
  18. package/dist/tests/IO/SerialCard.test.js +4 -4
  19. package/dist/tests/IO/SerialCard.test.js.map +1 -1
  20. package/dist/tests/Machine.test.js +9 -3
  21. package/dist/tests/Machine.test.js.map +1 -1
  22. package/package.json +3 -3
  23. package/src/components/IO/EmptyCard.ts +16 -0
  24. package/src/components/IO/GPIOAttachments/GPIOKeypadAttachment.ts +153 -0
  25. package/src/components/IO/GPIOAttachments/GPIOLCDAttachment.ts +791 -0
  26. package/src/components/IO/SerialCard.ts +4 -4
  27. package/src/components/Machine.ts +107 -61
  28. package/src/index.ts +179 -87
  29. package/src/tests/IO/GPIOAttachments/GPIOKeypadAttachment.test.ts +389 -0
  30. package/src/tests/IO/GPIOAttachments/GPIOLCDAttachment.test.ts +795 -0
  31. package/src/tests/IO/SerialCard.test.ts +4 -4
  32. package/src/tests/Machine.test.ts +10 -3
@@ -0,0 +1,323 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const GPIOKeypadAttachment_1 = require("../../../components/IO/GPIOAttachments/GPIOKeypadAttachment");
4
+ describe('GPIOKeypadAttachment', () => {
5
+ let keypadA; // attached to Port A
6
+ let keypadB; // attached to Port B
7
+ beforeEach(() => {
8
+ keypadA = new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true, 0);
9
+ keypadB = new GPIOKeypadAttachment_1.GPIOKeypadAttachment(false, 0);
10
+ });
11
+ // ---------------------------------------------------------------------------
12
+ describe('Initialization', () => {
13
+ it('should have no data ready after construction', () => {
14
+ expect(keypadA.hasDataReady()).toBe(false);
15
+ expect(keypadB.hasDataReady()).toBe(false);
16
+ });
17
+ it('should have no interrupt pending after construction', () => {
18
+ expect(keypadA.hasCA1Interrupt()).toBe(false);
19
+ expect(keypadA.hasCB1Interrupt()).toBe(false);
20
+ expect(keypadB.hasCA1Interrupt()).toBe(false);
21
+ expect(keypadB.hasCB1Interrupt()).toBe(false);
22
+ });
23
+ it('should return 0xFF on port reads when idle (Port A)', () => {
24
+ expect(keypadA.readPortA(0x00, 0x00)).toBe(0xFF);
25
+ });
26
+ it('should return 0xFF on port reads when idle (Port B)', () => {
27
+ expect(keypadB.readPortB(0x00, 0x00)).toBe(0xFF);
28
+ });
29
+ it('should be enabled by default', () => {
30
+ expect(keypadA.isEnabled()).toBe(true);
31
+ });
32
+ it('should report the correct priority', () => {
33
+ const kp = new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true, 7);
34
+ expect(kp.getPriority()).toBe(7);
35
+ });
36
+ it('getCurrentKey should return 0xFF when no data is ready', () => {
37
+ expect(keypadA.getCurrentKey()).toBe(0xFF);
38
+ });
39
+ });
40
+ // ---------------------------------------------------------------------------
41
+ describe('Reset', () => {
42
+ it('should clear data ready, interrupt, and keypad value', () => {
43
+ keypadA.updateKey(0x1E, true); // press '1'
44
+ expect(keypadA.hasDataReady()).toBe(true);
45
+ keypadA.reset();
46
+ expect(keypadA.hasDataReady()).toBe(false);
47
+ expect(keypadA.hasCA1Interrupt()).toBe(false);
48
+ expect(keypadA.getCurrentKey()).toBe(0xFF);
49
+ });
50
+ });
51
+ // ---------------------------------------------------------------------------
52
+ describe('Key press → keypad value mapping', () => {
53
+ // Helpers: assert OE (CA2/CB2 LOW) then press and read
54
+ const pressAndReadA = (kp, hid) => {
55
+ kp.updateControlLines(false, false, false, true); // CA2 LOW → OE asserted for Port A
56
+ kp.updateKey(hid, true);
57
+ return kp.readPortA(0x00, 0x00);
58
+ };
59
+ const pressAndReadB = (kp, hid) => {
60
+ kp.updateControlLines(false, true, false, false); // CB2 LOW → OE asserted for Port B
61
+ kp.updateKey(hid, true);
62
+ return kp.readPortB(0x00, 0x00);
63
+ };
64
+ it('Left Arrow (0x50) → $00 ◄', () => {
65
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x50)).toBe(0x00);
66
+ });
67
+ it('Backspace is not on this keypad', () => {
68
+ const kp = new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true);
69
+ kp.updateControlLines(false, false, false, true);
70
+ kp.updateKey(0x2A, true); // Backspace – unmapped
71
+ expect(kp.readPortA(0x00, 0x00)).toBe(0xFF);
72
+ });
73
+ it('1 (0x1E) → $01', () => {
74
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x1E)).toBe(0x01);
75
+ });
76
+ it('2 (0x1F) → $02', () => {
77
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x1F)).toBe(0x02);
78
+ });
79
+ it('3 (0x20) → $03', () => {
80
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x20)).toBe(0x03);
81
+ });
82
+ it('4 (0x21) → $04', () => {
83
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x21)).toBe(0x04);
84
+ });
85
+ it('5 (0x22) → $05', () => {
86
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x22)).toBe(0x05);
87
+ });
88
+ it('6 (0x23) → $06', () => {
89
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x23)).toBe(0x06);
90
+ });
91
+ it('7 (0x24) → $07', () => {
92
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x24)).toBe(0x07);
93
+ });
94
+ it('8 (0x25) → $08', () => {
95
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x25)).toBe(0x08);
96
+ });
97
+ it('9 (0x26) → $09', () => {
98
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x26)).toBe(0x09);
99
+ });
100
+ it('0 (0x27) → $0A', () => {
101
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x27)).toBe(0x0A);
102
+ });
103
+ it('Right Arrow (0x4F) → $0B ►', () => {
104
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x4F)).toBe(0x0B);
105
+ });
106
+ it('Enter is not mapped to $0B (it maps to $14)', () => {
107
+ const kp = new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true);
108
+ kp.updateControlLines(false, false, false, true);
109
+ kp.updateKey(0x28, true); // Enter → $14
110
+ expect(kp.readPortA(0x00, 0x00)).toBe(0x14);
111
+ });
112
+ it('f (0x09) → $0C F', () => {
113
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x09)).toBe(0x0C);
114
+ });
115
+ it('e (0x08) → $0D E', () => {
116
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x08)).toBe(0x0D);
117
+ });
118
+ it('d (0x07) → $0E D', () => {
119
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x07)).toBe(0x0E);
120
+ });
121
+ it('c (0x06) → $0F C', () => {
122
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x06)).toBe(0x0F);
123
+ });
124
+ it('Escape (0x29) → $10 ESC', () => {
125
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x29)).toBe(0x10);
126
+ });
127
+ it('Insert (0x49) → $11 INS', () => {
128
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x49)).toBe(0x11);
129
+ });
130
+ it('Page Up (0x4B) → $12 PGUP', () => {
131
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x4B)).toBe(0x12);
132
+ });
133
+ it('a (0x04) → $13 A', () => {
134
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x04)).toBe(0x13);
135
+ });
136
+ it('Up Arrow (0x52) → $14 ▲', () => {
137
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x52)).toBe(0x14);
138
+ });
139
+ it('Enter (0x28) → $14 ▲', () => {
140
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x28)).toBe(0x14);
141
+ });
142
+ it('Delete (0x4C) → $15 DEL', () => {
143
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x4C)).toBe(0x15);
144
+ });
145
+ it('Page Down (0x4E) → $16 PGDN', () => {
146
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x4E)).toBe(0x16);
147
+ });
148
+ it('b (0x05) → $17 B', () => {
149
+ expect(pressAndReadA(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(true), 0x05)).toBe(0x17);
150
+ });
151
+ it('should also map correctly on Port B', () => {
152
+ expect(pressAndReadB(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(false), 0x1E)).toBe(0x01); // '1' → $01
153
+ expect(pressAndReadB(new GPIOKeypadAttachment_1.GPIOKeypadAttachment(false), 0x05)).toBe(0x17); // 'b' → $17
154
+ });
155
+ });
156
+ // ---------------------------------------------------------------------------
157
+ describe('Bits 5–7 are always 0 when data is present', () => {
158
+ it('should mask bits 5–7 to 0 on Port A reads', () => {
159
+ keypadA.updateControlLines(false, false, false, true); // CA2 LOW → OE asserted
160
+ keypadA.updateKey(0x05, true); // HID 0x05 (b) → keypad $17 = 0b10111 – highest valid code
161
+ const value = keypadA.readPortA(0x00, 0x00);
162
+ expect(value & 0xE0).toBe(0x00); // bits 5, 6, 7 must be 0
163
+ });
164
+ it('should mask bits 5–7 to 0 on Port B reads', () => {
165
+ keypadB.updateControlLines(false, true, false, false); // CB2 LOW → OE asserted
166
+ keypadB.updateKey(0x05, true); // HID 0x05 (b) → keypad $17
167
+ const value = keypadB.readPortB(0x00, 0x00);
168
+ expect(value & 0xE0).toBe(0x00);
169
+ });
170
+ it('getCurrentKey should never have bits 5–7 set', () => {
171
+ keypadA.updateKey(0x29, true); // HID 0x29 (Escape) → keypad $10; bit 4 set
172
+ expect(keypadA.getCurrentKey() & 0xE0).toBe(0x00); // getCurrentKey is independent of OE
173
+ });
174
+ });
175
+ // ---------------------------------------------------------------------------
176
+ describe('Port attachment routing', () => {
177
+ it('Port A attachment should not drive Port B', () => {
178
+ keypadA.updateKey(0x1E, true); // press '1'
179
+ expect(keypadA.readPortB(0x00, 0x00)).toBe(0xFF);
180
+ });
181
+ it('Port B attachment should not drive Port A', () => {
182
+ keypadB.updateKey(0x1E, true); // press '1'
183
+ expect(keypadB.readPortA(0x00, 0x00)).toBe(0xFF);
184
+ });
185
+ });
186
+ // ---------------------------------------------------------------------------
187
+ describe('Interrupt behaviour (Port A)', () => {
188
+ it('should assert CA1 after a key press', () => {
189
+ keypadA.updateKey(0x1E, true);
190
+ expect(keypadA.hasCA1Interrupt()).toBe(true);
191
+ });
192
+ it('should not assert CB1 when attached to Port A', () => {
193
+ keypadA.updateKey(0x1E, true);
194
+ expect(keypadA.hasCB1Interrupt()).toBe(false);
195
+ });
196
+ it('clearInterrupts(ca1) should deassert CA1 and clear data ready', () => {
197
+ keypadA.updateKey(0x1E, true);
198
+ keypadA.clearInterrupts(true, false, false, false);
199
+ expect(keypadA.hasCA1Interrupt()).toBe(false);
200
+ expect(keypadA.hasDataReady()).toBe(false);
201
+ });
202
+ it('clearInterrupts(cb1) should not affect CA1 keypad', () => {
203
+ keypadA.updateKey(0x1E, true);
204
+ keypadA.clearInterrupts(false, false, true, false); // wrong line
205
+ expect(keypadA.hasCA1Interrupt()).toBe(true);
206
+ expect(keypadA.hasDataReady()).toBe(true);
207
+ });
208
+ it('port reads after clearInterrupts should return 0xFF', () => {
209
+ keypadA.updateKey(0x1E, true);
210
+ keypadA.clearInterrupts(true, false, false, false);
211
+ expect(keypadA.readPortA(0x00, 0x00)).toBe(0xFF);
212
+ });
213
+ });
214
+ // ---------------------------------------------------------------------------
215
+ describe('Interrupt behaviour (Port B)', () => {
216
+ it('should assert CB1 after a key press', () => {
217
+ keypadB.updateKey(0x1E, true);
218
+ expect(keypadB.hasCB1Interrupt()).toBe(true);
219
+ });
220
+ it('should not assert CA1 when attached to Port B', () => {
221
+ keypadB.updateKey(0x1E, true);
222
+ expect(keypadB.hasCA1Interrupt()).toBe(false);
223
+ });
224
+ it('clearInterrupts(cb1) should deassert CB1 and clear data ready', () => {
225
+ keypadB.updateKey(0x1E, true);
226
+ keypadB.clearInterrupts(false, false, true, false);
227
+ expect(keypadB.hasCB1Interrupt()).toBe(false);
228
+ expect(keypadB.hasDataReady()).toBe(false);
229
+ });
230
+ it('clearInterrupts(ca1) should not affect CB1 keypad', () => {
231
+ keypadB.updateKey(0x1E, true);
232
+ keypadB.clearInterrupts(true, false, false, false); // wrong line
233
+ expect(keypadB.hasCB1Interrupt()).toBe(true);
234
+ expect(keypadB.hasDataReady()).toBe(true);
235
+ });
236
+ });
237
+ // ---------------------------------------------------------------------------
238
+ describe('Key release events', () => {
239
+ it('should not set dataReady on key release', () => {
240
+ keypadA.updateKey(0x1E, false);
241
+ expect(keypadA.hasDataReady()).toBe(false);
242
+ });
243
+ it('should not change the port value on key release', () => {
244
+ // Press then read, then release – port stays at 0xFF (interrupt already fired)
245
+ keypadA.updateKey(0x1E, true);
246
+ keypadA.clearInterrupts(true, false, false, false);
247
+ keypadA.updateKey(0x1E, false); // release
248
+ expect(keypadA.readPortA(0x00, 0x00)).toBe(0xFF);
249
+ });
250
+ });
251
+ // ---------------------------------------------------------------------------
252
+ describe('Unmapped keys', () => {
253
+ it('should not set dataReady for a key not on the keypad', () => {
254
+ keypadA.updateKey(0x3A, true); // F1 – not on this keypad
255
+ expect(keypadA.hasDataReady()).toBe(false);
256
+ expect(keypadA.readPortA(0x00, 0x00)).toBe(0xFF);
257
+ });
258
+ it('should not fire an interrupt for an unmapped key', () => {
259
+ keypadA.updateKey(0x3A, true);
260
+ expect(keypadA.hasCA1Interrupt()).toBe(false);
261
+ });
262
+ });
263
+ // ---------------------------------------------------------------------------
264
+ describe('Successive key presses', () => {
265
+ it('should latch the latest key code when a second key is pressed', () => {
266
+ keypadA.updateControlLines(false, false, false, true); // CA2 LOW → OE asserted
267
+ keypadA.updateKey(0x1E, true); // '1' → $01
268
+ keypadA.clearInterrupts(true, false, false, false);
269
+ keypadA.updateKey(0x1F, true); // '2' → $02
270
+ expect(keypadA.readPortA(0x00, 0x00)).toBe(0x02);
271
+ expect(keypadA.hasCA1Interrupt()).toBe(true);
272
+ });
273
+ });
274
+ // ---------------------------------------------------------------------------
275
+ describe('OE (Output Enable) via CA2/CB2', () => {
276
+ it('Port A: data is not driven when CA2 is HIGH (OE disabled)', () => {
277
+ keypadA.updateControlLines(false, true, false, true); // CA2 HIGH → OE deasserted
278
+ keypadA.updateKey(0x1E, true); // '1'
279
+ expect(keypadA.readPortA(0x00, 0x00)).toBe(0xFF);
280
+ });
281
+ it('Port A: data IS driven when CA2 is LOW (OE enabled)', () => {
282
+ keypadA.updateControlLines(false, false, false, true); // CA2 LOW → OE asserted
283
+ keypadA.updateKey(0x1E, true);
284
+ expect(keypadA.readPortA(0x00, 0x00)).toBe(0x01);
285
+ });
286
+ it('Port B: data is not driven when CB2 is HIGH (OE disabled)', () => {
287
+ keypadB.updateControlLines(false, true, false, true); // CB2 HIGH → OE deasserted
288
+ keypadB.updateKey(0x1E, true);
289
+ expect(keypadB.readPortB(0x00, 0x00)).toBe(0xFF);
290
+ });
291
+ it('Port B: data IS driven when CB2 is LOW (OE enabled)', () => {
292
+ keypadB.updateControlLines(false, true, false, false); // CB2 LOW → OE asserted
293
+ keypadB.updateKey(0x1E, true);
294
+ expect(keypadB.readPortB(0x00, 0x00)).toBe(0x01);
295
+ });
296
+ it('CA1 interrupt fires regardless of OE state', () => {
297
+ keypadA.updateControlLines(false, true, false, true); // OE disabled
298
+ keypadA.updateKey(0x1E, true);
299
+ expect(keypadA.hasCA1Interrupt()).toBe(true); // DA line is independent of OE
300
+ });
301
+ it('CB1 interrupt fires regardless of OE state', () => {
302
+ keypadB.updateControlLines(false, true, false, true); // OE disabled
303
+ keypadB.updateKey(0x1E, true);
304
+ expect(keypadB.hasCB1Interrupt()).toBe(true);
305
+ });
306
+ it('toggling OE HIGH then LOW reveals the latched value', () => {
307
+ keypadA.updateKey(0x20, true); // '3' → $03
308
+ // OE still disabled – bus should be high-Z
309
+ expect(keypadA.readPortA(0x00, 0x00)).toBe(0xFF);
310
+ // Now the 6522 asserts CA2 LOW to enable OE
311
+ keypadA.updateControlLines(false, false, false, true);
312
+ expect(keypadA.readPortA(0x00, 0x00)).toBe(0x03);
313
+ });
314
+ it('reset clears OE state to disabled', () => {
315
+ keypadA.updateControlLines(false, false, false, true); // OE asserted
316
+ keypadA.updateKey(0x1E, true);
317
+ keypadA.reset();
318
+ // After reset OE should be HIGH (disabled) and dataReady cleared
319
+ expect(keypadA.readPortA(0x00, 0x00)).toBe(0xFF);
320
+ });
321
+ });
322
+ });
323
+ //# sourceMappingURL=GPIOKeypadAttachment.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GPIOKeypadAttachment.test.js","sourceRoot":"","sources":["../../../../src/tests/IO/GPIOAttachments/GPIOKeypadAttachment.test.ts"],"names":[],"mappings":"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"}