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,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"}
|