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.
Files changed (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +261 -0
  3. package/dist/components/CPU.js +1170 -0
  4. package/dist/components/CPU.js.map +1 -0
  5. package/dist/components/Cart.js +23 -0
  6. package/dist/components/Cart.js.map +1 -0
  7. package/dist/components/IO/Empty.js +19 -0
  8. package/dist/components/IO/Empty.js.map +1 -0
  9. package/dist/components/IO/GPIOAttachments/GPIOAttachment.js +71 -0
  10. package/dist/components/IO/GPIOAttachments/GPIOAttachment.js.map +1 -0
  11. package/dist/components/IO/GPIOAttachments/GPIOJoystickAttachment.js +90 -0
  12. package/dist/components/IO/GPIOAttachments/GPIOJoystickAttachment.js.map +1 -0
  13. package/dist/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.js +489 -0
  14. package/dist/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.js.map +1 -0
  15. package/dist/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.js +274 -0
  16. package/dist/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.js.map +1 -0
  17. package/dist/components/IO/GPIOCard.js +597 -0
  18. package/dist/components/IO/GPIOCard.js.map +1 -0
  19. package/dist/components/IO/InputBoard.js +19 -0
  20. package/dist/components/IO/InputBoard.js.map +1 -0
  21. package/dist/components/IO/LCDCard.js +19 -0
  22. package/dist/components/IO/LCDCard.js.map +1 -0
  23. package/dist/components/IO/RAMCard.js +63 -0
  24. package/dist/components/IO/RAMCard.js.map +1 -0
  25. package/dist/components/IO/RTCCard.js +483 -0
  26. package/dist/components/IO/RTCCard.js.map +1 -0
  27. package/dist/components/IO/SerialCard.js +282 -0
  28. package/dist/components/IO/SerialCard.js.map +1 -0
  29. package/dist/components/IO/SoundCard.js +620 -0
  30. package/dist/components/IO/SoundCard.js.map +1 -0
  31. package/dist/components/IO/StorageCard.js +428 -0
  32. package/dist/components/IO/StorageCard.js.map +1 -0
  33. package/dist/components/IO/VGACard.js +9 -0
  34. package/dist/components/IO/VGACard.js.map +1 -0
  35. package/dist/components/IO/VideoCard.js +623 -0
  36. package/dist/components/IO/VideoCard.js.map +1 -0
  37. package/dist/components/IO.js +3 -0
  38. package/dist/components/IO.js.map +1 -0
  39. package/dist/components/Machine.js +310 -0
  40. package/dist/components/Machine.js.map +1 -0
  41. package/dist/components/RAM.js +24 -0
  42. package/dist/components/RAM.js.map +1 -0
  43. package/dist/components/ROM.js +23 -0
  44. package/dist/components/ROM.js.map +1 -0
  45. package/dist/index.js +441 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/tests/CPU.test.js +1626 -0
  48. package/dist/tests/CPU.test.js.map +1 -0
  49. package/dist/tests/Cart.test.js +119 -0
  50. package/dist/tests/Cart.test.js.map +1 -0
  51. package/dist/tests/IO/GPIOAttachments/GPIOAttachment.test.js +339 -0
  52. package/dist/tests/IO/GPIOAttachments/GPIOAttachment.test.js.map +1 -0
  53. package/dist/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.js +126 -0
  54. package/dist/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.js.map +1 -0
  55. package/dist/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.js +779 -0
  56. package/dist/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.js.map +1 -0
  57. package/dist/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.js +355 -0
  58. package/dist/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.js.map +1 -0
  59. package/dist/tests/IO/GPIOCard.test.js +503 -0
  60. package/dist/tests/IO/GPIOCard.test.js.map +1 -0
  61. package/dist/tests/IO/RAMCard.test.js +229 -0
  62. package/dist/tests/IO/RAMCard.test.js.map +1 -0
  63. package/dist/tests/IO/RTCCard.test.js +177 -0
  64. package/dist/tests/IO/RTCCard.test.js.map +1 -0
  65. package/dist/tests/IO/SerialCard.test.js +423 -0
  66. package/dist/tests/IO/SerialCard.test.js.map +1 -0
  67. package/dist/tests/IO/SoundCard.test.js +528 -0
  68. package/dist/tests/IO/SoundCard.test.js.map +1 -0
  69. package/dist/tests/IO/StorageCard.test.js +647 -0
  70. package/dist/tests/IO/StorageCard.test.js.map +1 -0
  71. package/dist/tests/IO/VideoCard.test.js +549 -0
  72. package/dist/tests/IO/VideoCard.test.js.map +1 -0
  73. package/dist/tests/Machine.test.js +383 -0
  74. package/dist/tests/Machine.test.js.map +1 -0
  75. package/dist/tests/RAM.test.js +160 -0
  76. package/dist/tests/RAM.test.js.map +1 -0
  77. package/dist/tests/ROM.test.js +123 -0
  78. package/dist/tests/ROM.test.js.map +1 -0
  79. package/jest.config.cjs +9 -0
  80. package/package.json +43 -0
  81. package/src/components/CPU.ts +1371 -0
  82. package/src/components/Cart.ts +20 -0
  83. package/src/components/IO/GPIOAttachments/GPIOAttachment.ts +189 -0
  84. package/src/components/IO/GPIOAttachments/GPIOJoystickAttachment.ts +99 -0
  85. package/src/components/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.ts +465 -0
  86. package/src/components/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.ts +287 -0
  87. package/src/components/IO/GPIOCard.ts +677 -0
  88. package/src/components/IO/RAMCard.ts +68 -0
  89. package/src/components/IO/RTCCard.ts +518 -0
  90. package/src/components/IO/SerialCard.ts +335 -0
  91. package/src/components/IO/SoundCard.ts +711 -0
  92. package/src/components/IO/StorageCard.ts +473 -0
  93. package/src/components/IO/VideoCard.ts +730 -0
  94. package/src/components/IO.ts +11 -0
  95. package/src/components/Machine.ts +364 -0
  96. package/src/components/RAM.ts +23 -0
  97. package/src/components/ROM.ts +19 -0
  98. package/src/index.ts +474 -0
  99. package/src/tests/CPU.test.ts +2045 -0
  100. package/src/tests/Cart.test.ts +149 -0
  101. package/src/tests/IO/GPIOAttachments/GPIOAttachment.test.ts +413 -0
  102. package/src/tests/IO/GPIOAttachments/GPIOJoystickAttachment.test.ts +147 -0
  103. package/src/tests/IO/GPIOAttachments/GPIOKeyboardEncoderAttachment.test.ts +961 -0
  104. package/src/tests/IO/GPIOAttachments/GPIOKeyboardMatrixAttachment.test.ts +449 -0
  105. package/src/tests/IO/GPIOCard.test.ts +644 -0
  106. package/src/tests/IO/RAMCard.test.ts +284 -0
  107. package/src/tests/IO/RTCCard.test.ts +222 -0
  108. package/src/tests/IO/SerialCard.test.ts +530 -0
  109. package/src/tests/IO/SoundCard.test.ts +659 -0
  110. package/src/tests/IO/StorageCard.test.ts +787 -0
  111. package/src/tests/IO/VideoCard.test.ts +668 -0
  112. package/src/tests/Machine.test.ts +437 -0
  113. package/src/tests/RAM.test.ts +196 -0
  114. package/src/tests/ROM.test.ts +154 -0
  115. package/tsconfig.json +12 -0
@@ -0,0 +1,597 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GPIOCard = void 0;
4
+ /**
5
+ * GPIOCard - Emulates the 65C22 VIA (Versatile Interface Adapter)
6
+ *
7
+ * The 65C22 VIA provides:
8
+ * - Two 8-bit bidirectional I/O ports (Port A and Port B)
9
+ * - Two 16-bit timers with interrupt generation
10
+ * - Shift register for serial I/O
11
+ * - Handshaking lines for data transfer
12
+ */
13
+ class GPIOCard {
14
+ constructor() {
15
+ // VIA Registers
16
+ this.regORB = 0x00;
17
+ this.regORA = 0x00;
18
+ this.regDDRB = 0x00;
19
+ this.regDDRA = 0x00;
20
+ this.regT1C = 0xFFFF;
21
+ this.regT1L = 0xFFFF;
22
+ this.regT2C = 0xFFFF;
23
+ this.regT2L = 0xFF;
24
+ this.regSR = 0x00;
25
+ this.regACR = 0x00;
26
+ this.regPCR = 0x00;
27
+ this.regIFR = 0x00;
28
+ this.regIER = 0x00;
29
+ // Control lines
30
+ this.CA1 = false;
31
+ this.CA2 = false;
32
+ this.CB1 = false;
33
+ this.CB2 = false;
34
+ // Timer states
35
+ this.T1_running = false;
36
+ this.T2_running = false;
37
+ this.T1_IRQ_enabled = false;
38
+ this.T2_IRQ_enabled = false;
39
+ // Timing
40
+ this.tickCounter = 0;
41
+ this.ticksPerMicrosecond = 1;
42
+ // Attachments
43
+ this.portA_attachments = [];
44
+ this.portB_attachments = [];
45
+ this.portA_attachmentCount = 0;
46
+ this.portB_attachmentCount = 0;
47
+ this.raiseIRQ = () => { };
48
+ this.raiseNMI = () => { };
49
+ this.reset(true);
50
+ }
51
+ reset(coldStart) {
52
+ // Reset all VIA registers
53
+ this.regORB = 0x00;
54
+ this.regORA = 0x00;
55
+ this.regDDRB = 0x00;
56
+ this.regDDRA = 0x00;
57
+ this.regT1C = 0xFFFF;
58
+ this.regT1L = 0xFFFF;
59
+ this.regT2C = 0xFFFF;
60
+ this.regT2L = 0xFF;
61
+ this.regSR = 0x00;
62
+ this.regACR = 0x00;
63
+ this.regPCR = 0x00;
64
+ this.regIFR = 0x00;
65
+ this.regIER = 0x00;
66
+ // Reset control lines
67
+ this.CA1 = false;
68
+ this.CA2 = false;
69
+ this.CB1 = false;
70
+ this.CB2 = false;
71
+ // Reset timer states
72
+ this.T1_running = false;
73
+ this.T2_running = false;
74
+ this.T1_IRQ_enabled = false;
75
+ this.T2_IRQ_enabled = false;
76
+ // Initialize attachment arrays
77
+ this.portA_attachmentCount = 0;
78
+ this.portB_attachmentCount = 0;
79
+ for (let i = 0; i < GPIOCard.MAX_ATTACHMENTS_PER_PORT; i++) {
80
+ this.portA_attachments[i] = null;
81
+ this.portB_attachments[i] = null;
82
+ }
83
+ // Reset all attachments
84
+ for (let i = 0; i < this.portA_attachmentCount; i++) {
85
+ if (this.portA_attachments[i] !== null) {
86
+ this.portA_attachments[i].reset();
87
+ }
88
+ }
89
+ for (let i = 0; i < this.portB_attachmentCount; i++) {
90
+ if (this.portB_attachments[i] !== null) {
91
+ this.portB_attachments[i].reset();
92
+ }
93
+ }
94
+ // Reset timing
95
+ this.tickCounter = 0;
96
+ this.ticksPerMicrosecond = 1;
97
+ }
98
+ read(address) {
99
+ const reg = address & 0x0F;
100
+ let value = 0x00;
101
+ switch (reg) {
102
+ case GPIOCard.VIA_ORB:
103
+ // Reading ORB clears CB1 and CB2 interrupt flags
104
+ this.clearIRQFlag(GPIOCard.IRQ_CB1 | GPIOCard.IRQ_CB2);
105
+ value = this.readPortB();
106
+ // Notify attachments that interrupts were cleared
107
+ for (let i = 0; i < this.portB_attachmentCount; i++) {
108
+ if (this.portB_attachments[i] !== null) {
109
+ this.portB_attachments[i].clearInterrupts(false, false, true, true);
110
+ }
111
+ }
112
+ break;
113
+ case GPIOCard.VIA_ORA:
114
+ // Reading ORA clears CA1 and CA2 interrupt flags
115
+ this.clearIRQFlag(GPIOCard.IRQ_CA1 | GPIOCard.IRQ_CA2);
116
+ value = this.readPortA();
117
+ // Notify attachments that interrupts were cleared
118
+ for (let i = 0; i < this.portA_attachmentCount; i++) {
119
+ if (this.portA_attachments[i] !== null) {
120
+ this.portA_attachments[i].clearInterrupts(true, true, false, false);
121
+ }
122
+ }
123
+ break;
124
+ case GPIOCard.VIA_DDRB:
125
+ value = this.regDDRB;
126
+ break;
127
+ case GPIOCard.VIA_DDRA:
128
+ value = this.regDDRA;
129
+ break;
130
+ case GPIOCard.VIA_T1CL:
131
+ // Reading T1CL clears T1 interrupt flag
132
+ this.clearIRQFlag(GPIOCard.IRQ_T1);
133
+ value = this.regT1C & 0xFF;
134
+ break;
135
+ case GPIOCard.VIA_T1CH:
136
+ value = (this.regT1C >> 8) & 0xFF;
137
+ break;
138
+ case GPIOCard.VIA_T1LL:
139
+ value = this.regT1L & 0xFF;
140
+ break;
141
+ case GPIOCard.VIA_T1LH:
142
+ value = (this.regT1L >> 8) & 0xFF;
143
+ break;
144
+ case GPIOCard.VIA_T2CL:
145
+ // Reading T2CL clears T2 interrupt flag
146
+ this.clearIRQFlag(GPIOCard.IRQ_T2);
147
+ value = this.regT2C & 0xFF;
148
+ break;
149
+ case GPIOCard.VIA_T2CH:
150
+ value = (this.regT2C >> 8) & 0xFF;
151
+ break;
152
+ case GPIOCard.VIA_SR:
153
+ // Reading SR clears SR interrupt flag
154
+ this.clearIRQFlag(GPIOCard.IRQ_SR);
155
+ value = this.regSR;
156
+ break;
157
+ case GPIOCard.VIA_ACR:
158
+ value = this.regACR;
159
+ break;
160
+ case GPIOCard.VIA_PCR:
161
+ value = this.regPCR;
162
+ break;
163
+ case GPIOCard.VIA_IFR:
164
+ value = this.regIFR;
165
+ // Bit 7 is set if any enabled interrupt is active
166
+ if (this.regIFR & this.regIER & 0x7F) {
167
+ value |= GPIOCard.IRQ_IRQ;
168
+ }
169
+ break;
170
+ case GPIOCard.VIA_IER:
171
+ value = this.regIER | 0x80; // Bit 7 always reads as 1
172
+ break;
173
+ case GPIOCard.VIA_ORA_NH:
174
+ // Reading ORA without handshake (no interrupt flag clearing)
175
+ value = this.readPortA();
176
+ break;
177
+ }
178
+ return value & 0xFF;
179
+ }
180
+ write(address, data) {
181
+ const reg = address & 0x0F;
182
+ const value = data & 0xFF;
183
+ switch (reg) {
184
+ case GPIOCard.VIA_ORB:
185
+ // Writing ORB clears CB1 and CB2 interrupt flags
186
+ this.clearIRQFlag(GPIOCard.IRQ_CB1 | GPIOCard.IRQ_CB2);
187
+ this.regORB = value;
188
+ this.writePortB(value);
189
+ break;
190
+ case GPIOCard.VIA_ORA:
191
+ // Writing ORA clears CA1 and CA2 interrupt flags
192
+ this.clearIRQFlag(GPIOCard.IRQ_CA1 | GPIOCard.IRQ_CA2);
193
+ this.regORA = value;
194
+ this.writePortA(value);
195
+ break;
196
+ case GPIOCard.VIA_DDRB:
197
+ this.regDDRB = value;
198
+ break;
199
+ case GPIOCard.VIA_DDRA:
200
+ this.regDDRA = value;
201
+ break;
202
+ case GPIOCard.VIA_T1CL:
203
+ case GPIOCard.VIA_T1LL:
204
+ // Write to T1 low latch
205
+ this.regT1L = (this.regT1L & 0xFF00) | value;
206
+ break;
207
+ case GPIOCard.VIA_T1CH:
208
+ // Write to T1 high counter - loads latch into counter and starts timer
209
+ this.regT1L = (this.regT1L & 0x00FF) | (value << 8);
210
+ this.regT1C = this.regT1L;
211
+ this.clearIRQFlag(GPIOCard.IRQ_T1);
212
+ this.T1_running = true;
213
+ break;
214
+ case GPIOCard.VIA_T1LH:
215
+ // Write to T1 high latch
216
+ this.regT1L = (this.regT1L & 0x00FF) | (value << 8);
217
+ this.clearIRQFlag(GPIOCard.IRQ_T1);
218
+ break;
219
+ case GPIOCard.VIA_T2CL:
220
+ // Write to T2 low latch
221
+ this.regT2L = value;
222
+ break;
223
+ case GPIOCard.VIA_T2CH:
224
+ // Write to T2 high counter - loads latch into counter and starts timer
225
+ this.regT2C = (value << 8) | this.regT2L;
226
+ this.clearIRQFlag(GPIOCard.IRQ_T2);
227
+ this.T2_running = true;
228
+ break;
229
+ case GPIOCard.VIA_SR:
230
+ this.regSR = value;
231
+ this.clearIRQFlag(GPIOCard.IRQ_SR);
232
+ break;
233
+ case GPIOCard.VIA_ACR:
234
+ this.regACR = value;
235
+ // ACR controls timer modes, shift register, and latching
236
+ break;
237
+ case GPIOCard.VIA_PCR:
238
+ this.regPCR = value;
239
+ // PCR controls CA1, CA2, CB1, CB2 behavior
240
+ this.updateCA2();
241
+ this.updateCB2();
242
+ break;
243
+ case GPIOCard.VIA_IFR:
244
+ // Writing to IFR clears the corresponding interrupt flags
245
+ this.regIFR &= ~(value & 0x7F);
246
+ this.updateIRQ();
247
+ break;
248
+ case GPIOCard.VIA_IER:
249
+ // Bit 7 determines set (1) or clear (0)
250
+ if (value & 0x80) {
251
+ this.regIER |= (value & 0x7F);
252
+ }
253
+ else {
254
+ this.regIER &= ~(value & 0x7F);
255
+ }
256
+ this.updateIRQ();
257
+ break;
258
+ case GPIOCard.VIA_ORA_NH:
259
+ // Writing ORA without handshake (no interrupt flag clearing)
260
+ this.regORA = value;
261
+ this.writePortA(value);
262
+ break;
263
+ }
264
+ }
265
+ tick(frequency) {
266
+ this.tickCounter++;
267
+ // Update Timer 1
268
+ if (this.T1_running && this.regT1C > 0) {
269
+ this.regT1C--;
270
+ if (this.regT1C === 0) {
271
+ this.setIRQFlag(GPIOCard.IRQ_T1);
272
+ // Check if timer is in free-run mode (ACR bit 6)
273
+ if (this.regACR & 0x40) {
274
+ this.regT1C = this.regT1L; // Reload from latch
275
+ }
276
+ else {
277
+ this.T1_running = false;
278
+ }
279
+ // Toggle PB7 if enabled (ACR bit 7)
280
+ if (this.regACR & 0x80) {
281
+ this.regORB ^= 0x80;
282
+ }
283
+ }
284
+ }
285
+ // Update Timer 2
286
+ if (this.T2_running && this.regT2C > 0) {
287
+ this.regT2C--;
288
+ if (this.regT2C === 0) {
289
+ this.setIRQFlag(GPIOCard.IRQ_T2);
290
+ this.T2_running = false;
291
+ }
292
+ }
293
+ // Tick all attachments
294
+ for (let i = 0; i < this.portA_attachmentCount; i++) {
295
+ if (this.portA_attachments[i] !== null) {
296
+ this.portA_attachments[i].tick(frequency);
297
+ }
298
+ }
299
+ for (let i = 0; i < this.portB_attachmentCount; i++) {
300
+ if (this.portB_attachments[i] !== null) {
301
+ this.portB_attachments[i].tick(frequency);
302
+ }
303
+ }
304
+ // Check for attachment interrupts
305
+ for (let i = 0; i < this.portA_attachmentCount; i++) {
306
+ if (this.portA_attachments[i] !== null) {
307
+ if (this.portA_attachments[i].hasCA1Interrupt()) {
308
+ this.setIRQFlag(GPIOCard.IRQ_CA1);
309
+ }
310
+ if (this.portA_attachments[i].hasCA2Interrupt()) {
311
+ this.setIRQFlag(GPIOCard.IRQ_CA2);
312
+ }
313
+ }
314
+ }
315
+ for (let i = 0; i < this.portB_attachmentCount; i++) {
316
+ if (this.portB_attachments[i] !== null) {
317
+ if (this.portB_attachments[i].hasCB1Interrupt()) {
318
+ this.setIRQFlag(GPIOCard.IRQ_CB1);
319
+ }
320
+ if (this.portB_attachments[i].hasCB2Interrupt()) {
321
+ this.setIRQFlag(GPIOCard.IRQ_CB2);
322
+ }
323
+ }
324
+ }
325
+ // Raise IRQ if any enabled interrupt is active
326
+ if (this.regIFR & this.regIER & 0x7F) {
327
+ this.raiseIRQ();
328
+ }
329
+ }
330
+ updateIRQ() {
331
+ // Update bit 7 of IFR based on enabled interrupts
332
+ if (this.regIFR & this.regIER & 0x7F) {
333
+ this.regIFR |= GPIOCard.IRQ_IRQ;
334
+ }
335
+ else {
336
+ this.regIFR &= ~GPIOCard.IRQ_IRQ;
337
+ }
338
+ }
339
+ setIRQFlag(flag) {
340
+ this.regIFR |= flag;
341
+ this.updateIRQ();
342
+ }
343
+ clearIRQFlag(flag) {
344
+ this.regIFR &= ~flag;
345
+ this.updateIRQ();
346
+ }
347
+ readPortA() {
348
+ let value = 0xFF;
349
+ // Determine input sources from attachments (priority-based multiplexing)
350
+ let externalInput = 0xFF;
351
+ // Query all Port A attachments in priority order
352
+ for (let i = 0; i < this.portA_attachmentCount; i++) {
353
+ if (this.portA_attachments[i] !== null && this.portA_attachments[i].isEnabled()) {
354
+ const attachmentData = this.portA_attachments[i].readPortA(this.regDDRA, this.regORA);
355
+ // First enabled attachment with data (not 0xFF) wins, or AND all values together
356
+ externalInput &= attachmentData;
357
+ }
358
+ }
359
+ // Apply DDR settings: output bits come from ORA, input bits from external
360
+ for (let bit = 0; bit < 8; bit++) {
361
+ if (this.regDDRA & (1 << bit)) {
362
+ // Output mode - read from register
363
+ if (this.regORA & (1 << bit)) {
364
+ value |= (1 << bit);
365
+ }
366
+ else {
367
+ value &= ~(1 << bit);
368
+ }
369
+ }
370
+ else {
371
+ // Input mode - read from external source
372
+ if (externalInput & (1 << bit)) {
373
+ value |= (1 << bit);
374
+ }
375
+ else {
376
+ value &= ~(1 << bit);
377
+ }
378
+ }
379
+ }
380
+ return value & 0xFF;
381
+ }
382
+ readPortB() {
383
+ let value = 0xFF;
384
+ // Determine input sources from attachments (priority-based multiplexing)
385
+ let externalInput = 0xFF;
386
+ // Query all Port B attachments in priority order
387
+ for (let i = 0; i < this.portB_attachmentCount; i++) {
388
+ if (this.portB_attachments[i] !== null && this.portB_attachments[i].isEnabled()) {
389
+ const attachmentData = this.portB_attachments[i].readPortB(this.regDDRB, this.regORB);
390
+ // First enabled attachment with data (not 0xFF) wins, or AND all values together
391
+ externalInput &= attachmentData;
392
+ }
393
+ }
394
+ // Apply DDR settings: output bits come from ORB, input bits from external
395
+ for (let bit = 0; bit < 8; bit++) {
396
+ if (this.regDDRB & (1 << bit)) {
397
+ // Output mode - read from register
398
+ if (this.regORB & (1 << bit)) {
399
+ value |= (1 << bit);
400
+ }
401
+ else {
402
+ value &= ~(1 << bit);
403
+ }
404
+ }
405
+ else {
406
+ // Input mode - read from external source
407
+ if (externalInput & (1 << bit)) {
408
+ value |= (1 << bit);
409
+ }
410
+ else {
411
+ value &= ~(1 << bit);
412
+ }
413
+ }
414
+ }
415
+ return value & 0xFF;
416
+ }
417
+ writePortA(value) {
418
+ // Notify all Port A attachments of the write
419
+ for (let i = 0; i < this.portA_attachmentCount; i++) {
420
+ if (this.portA_attachments[i] !== null) {
421
+ this.portA_attachments[i].writePortA(value, this.regDDRA);
422
+ }
423
+ }
424
+ }
425
+ writePortB(value) {
426
+ // Notify all Port B attachments of the write
427
+ for (let i = 0; i < this.portB_attachmentCount; i++) {
428
+ if (this.portB_attachments[i] !== null) {
429
+ this.portB_attachments[i].writePortB(value, this.regDDRB);
430
+ }
431
+ }
432
+ }
433
+ updateCA2() {
434
+ // CA2 control based on PCR bits 1-3
435
+ const ca2_control = (this.regPCR >> 1) & 0x07;
436
+ switch (ca2_control) {
437
+ case 0x00: // Input mode - negative edge
438
+ case 0x01: // Independent interrupt input - negative edge
439
+ case 0x02: // Input mode - positive edge
440
+ case 0x03: // Independent interrupt input - positive edge
441
+ // Input modes
442
+ break;
443
+ case 0x04: // Handshake output
444
+ case 0x05: // Pulse output
445
+ // Output modes
446
+ break;
447
+ case 0x06: // Manual output LOW
448
+ this.CA2 = false;
449
+ break;
450
+ case 0x07: // Manual output HIGH
451
+ this.CA2 = true;
452
+ break;
453
+ }
454
+ // Notify all attachments of control line changes
455
+ this.notifyAttachmentsControlLines();
456
+ }
457
+ updateCB2() {
458
+ // CB2 control based on PCR bits 5-7
459
+ const cb2_control = (this.regPCR >> 5) & 0x07;
460
+ switch (cb2_control) {
461
+ case 0x00: // Input mode - negative edge
462
+ case 0x01: // Independent interrupt input - negative edge
463
+ case 0x02: // Input mode - positive edge
464
+ case 0x03: // Independent interrupt input - positive edge
465
+ // Input modes
466
+ break;
467
+ case 0x04: // Handshake output
468
+ case 0x05: // Pulse output
469
+ // Output modes
470
+ break;
471
+ case 0x06: // Manual output LOW
472
+ this.CB2 = false;
473
+ break;
474
+ case 0x07: // Manual output HIGH
475
+ this.CB2 = true;
476
+ break;
477
+ }
478
+ // Notify all attachments of control line changes
479
+ this.notifyAttachmentsControlLines();
480
+ }
481
+ notifyAttachmentsControlLines() {
482
+ // Notify all attachments of control line state changes
483
+ for (let i = 0; i < this.portA_attachmentCount; i++) {
484
+ if (this.portA_attachments[i] !== null) {
485
+ this.portA_attachments[i].updateControlLines(this.CA1, this.CA2, this.CB1, this.CB2);
486
+ }
487
+ }
488
+ for (let i = 0; i < this.portB_attachmentCount; i++) {
489
+ if (this.portB_attachments[i] !== null) {
490
+ this.portB_attachments[i].updateControlLines(this.CA1, this.CA2, this.CB1, this.CB2);
491
+ }
492
+ }
493
+ }
494
+ sortAttachmentsByPriority() {
495
+ // Simple bubble sort for Port A attachments by priority (lower = higher priority)
496
+ for (let i = 0; i < this.portA_attachmentCount - 1; i++) {
497
+ for (let j = 0; j < this.portA_attachmentCount - i - 1; j++) {
498
+ if (this.portA_attachments[j] !== null && this.portA_attachments[j + 1] !== null) {
499
+ if (this.portA_attachments[j].getPriority() > this.portA_attachments[j + 1].getPriority()) {
500
+ // Swap
501
+ const temp = this.portA_attachments[j];
502
+ this.portA_attachments[j] = this.portA_attachments[j + 1];
503
+ this.portA_attachments[j + 1] = temp;
504
+ }
505
+ }
506
+ }
507
+ }
508
+ // Simple bubble sort for Port B attachments by priority
509
+ for (let i = 0; i < this.portB_attachmentCount - 1; i++) {
510
+ for (let j = 0; j < this.portB_attachmentCount - i - 1; j++) {
511
+ if (this.portB_attachments[j] !== null && this.portB_attachments[j + 1] !== null) {
512
+ if (this.portB_attachments[j].getPriority() > this.portB_attachments[j + 1].getPriority()) {
513
+ // Swap
514
+ const temp = this.portB_attachments[j];
515
+ this.portB_attachments[j] = this.portB_attachments[j + 1];
516
+ this.portB_attachments[j + 1] = temp;
517
+ }
518
+ }
519
+ }
520
+ }
521
+ }
522
+ /**
523
+ * Attach a GPIO device to Port A
524
+ * @param attachment - The attachment to add
525
+ */
526
+ attachToPortA(attachment) {
527
+ if (attachment !== null && this.portA_attachmentCount < GPIOCard.MAX_ATTACHMENTS_PER_PORT) {
528
+ this.portA_attachments[this.portA_attachmentCount++] = attachment;
529
+ this.sortAttachmentsByPriority();
530
+ // Notify the attachment of current control line states
531
+ attachment.updateControlLines(this.CA1, this.CA2, this.CB1, this.CB2);
532
+ }
533
+ }
534
+ /**
535
+ * Attach a GPIO device to Port B
536
+ * @param attachment - The attachment to add
537
+ */
538
+ attachToPortB(attachment) {
539
+ if (attachment !== null && this.portB_attachmentCount < GPIOCard.MAX_ATTACHMENTS_PER_PORT) {
540
+ this.portB_attachments[this.portB_attachmentCount++] = attachment;
541
+ this.sortAttachmentsByPriority();
542
+ // Notify the attachment of current control line states
543
+ attachment.updateControlLines(this.CA1, this.CA2, this.CB1, this.CB2);
544
+ }
545
+ }
546
+ /**
547
+ * Get a Port A attachment by index
548
+ * @param index - The attachment index
549
+ * @returns The attachment or null if not found
550
+ */
551
+ getPortAAttachment(index) {
552
+ if (index < this.portA_attachmentCount) {
553
+ return this.portA_attachments[index];
554
+ }
555
+ return null;
556
+ }
557
+ /**
558
+ * Get a Port B attachment by index
559
+ * @param index - The attachment index
560
+ * @returns The attachment or null if not found
561
+ */
562
+ getPortBAttachment(index) {
563
+ if (index < this.portB_attachmentCount) {
564
+ return this.portB_attachments[index];
565
+ }
566
+ return null;
567
+ }
568
+ }
569
+ exports.GPIOCard = GPIOCard;
570
+ // VIA Register addresses (offset from base address)
571
+ GPIOCard.VIA_ORB = 0x00; // Output Register B
572
+ GPIOCard.VIA_ORA = 0x01; // Output Register A
573
+ GPIOCard.VIA_DDRB = 0x02; // Data Direction Register B
574
+ GPIOCard.VIA_DDRA = 0x03; // Data Direction Register A
575
+ GPIOCard.VIA_T1CL = 0x04; // Timer 1 Counter Low
576
+ GPIOCard.VIA_T1CH = 0x05; // Timer 1 Counter High
577
+ GPIOCard.VIA_T1LL = 0x06; // Timer 1 Latch Low
578
+ GPIOCard.VIA_T1LH = 0x07; // Timer 1 Latch High
579
+ GPIOCard.VIA_T2CL = 0x08; // Timer 2 Counter Low
580
+ GPIOCard.VIA_T2CH = 0x09; // Timer 2 Counter High
581
+ GPIOCard.VIA_SR = 0x0A; // Shift Register
582
+ GPIOCard.VIA_ACR = 0x0B; // Auxiliary Control Register
583
+ GPIOCard.VIA_PCR = 0x0C; // Peripheral Control Register
584
+ GPIOCard.VIA_IFR = 0x0D; // Interrupt Flag Register
585
+ GPIOCard.VIA_IER = 0x0E; // Interrupt Enable Register
586
+ GPIOCard.VIA_ORA_NH = 0x0F; // Output Register A (No Handshake)
587
+ // Interrupt flags
588
+ GPIOCard.IRQ_CA2 = 0x01;
589
+ GPIOCard.IRQ_CA1 = 0x02;
590
+ GPIOCard.IRQ_SR = 0x04;
591
+ GPIOCard.IRQ_CB2 = 0x08;
592
+ GPIOCard.IRQ_CB1 = 0x10;
593
+ GPIOCard.IRQ_T2 = 0x20;
594
+ GPIOCard.IRQ_T1 = 0x40;
595
+ GPIOCard.IRQ_IRQ = 0x80; // Master IRQ flag
596
+ GPIOCard.MAX_ATTACHMENTS_PER_PORT = 8;
597
+ //# sourceMappingURL=GPIOCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GPIOCard.js","sourceRoot":"","sources":["../../../src/components/IO/GPIOCard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InputBoard = void 0;
4
+ class InputBoard {
5
+ constructor() {
6
+ this.raiseIRQ = () => { };
7
+ this.raiseNMI = () => { };
8
+ }
9
+ read(address) { return 0; }
10
+ write(address, data) { }
11
+ tick() { }
12
+ reset() { }
13
+ description() {
14
+ return InputBoard.DESCRIPTION;
15
+ }
16
+ }
17
+ exports.InputBoard = InputBoard;
18
+ InputBoard.DESCRIPTION = { className: 'InputBoard', title: 'Input Board' };
19
+ //# sourceMappingURL=InputBoard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputBoard.js","sourceRoot":"","sources":["../../../src/components/IO/InputBoard.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAU;IAAvB;QAIE,aAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;QACnB,aAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;IAWrB,CAAC;IATC,IAAI,CAAC,OAAe,IAAY,OAAO,CAAC,CAAA,CAAC,CAAC;IAC1C,KAAK,CAAC,OAAe,EAAE,IAAY,IAAS,CAAC;IAC7C,IAAI,KAAU,CAAC;IACf,KAAK,KAAU,CAAC;IAEhB,WAAW;QACT,OAAO,UAAU,CAAC,WAAW,CAAA;IAC/B,CAAC;;AAdH,gCAgBC;AAdQ,sBAAW,GAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,AAAnE,CAAmE"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LCDCard = void 0;
4
+ class LCDCard {
5
+ constructor() {
6
+ this.raiseIRQ = () => { };
7
+ this.raiseNMI = () => { };
8
+ }
9
+ read(address) { return 0; }
10
+ write(address, data) { }
11
+ tick() { }
12
+ reset() { }
13
+ description() {
14
+ return LCDCard.DESCRIPTION;
15
+ }
16
+ }
17
+ exports.LCDCard = LCDCard;
18
+ LCDCard.DESCRIPTION = { className: 'LCDCard', title: 'LCD Card' };
19
+ //# sourceMappingURL=LCDCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LCDCard.js","sourceRoot":"","sources":["../../../src/components/IO/LCDCard.ts"],"names":[],"mappings":";;;AAEA,MAAa,OAAO;IAApB;QAIE,aAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;QACnB,aAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;IAWrB,CAAC;IATC,IAAI,CAAC,OAAe,IAAY,OAAO,CAAC,CAAA,CAAC,CAAC;IAC1C,KAAK,CAAC,OAAe,EAAE,IAAY,IAAS,CAAC;IAC7C,IAAI,KAAU,CAAC;IACf,KAAK,KAAU,CAAC;IAEhB,WAAW;QACT,OAAO,OAAO,CAAC,WAAW,CAAA;IAC5B,CAAC;;AAdH,0BAgBC;AAdQ,mBAAW,GAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,AAA7D,CAA6D"}