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,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RAMCard = void 0;
4
+ /**
5
+ * RAMCard - Emulates banked RAM with 256KB total capacity
6
+ *
7
+ * Provides 256KB of banked RAM divided into 256 banks of 1KB each.
8
+ * A bank control register at address 0x3FF selects which bank is currently visible.
9
+ *
10
+ * Address Map:
11
+ * $000-$3FE: Bank data (1K window into selected bank)
12
+ * $3FF: Bank control register (read/write)
13
+ */
14
+ class RAMCard {
15
+ constructor() {
16
+ this.data = [...Array(RAMCard.TOTAL_SIZE)].fill(0x00);
17
+ this.currentBank = 0;
18
+ this.raiseIRQ = () => { };
19
+ this.raiseNMI = () => { };
20
+ }
21
+ /**
22
+ * Read from RAM or bank control register
23
+ */
24
+ read(address) {
25
+ // Reading from bank control register returns current bank number
26
+ if (address === RAMCard.BANK_CONTROL_REGISTER) {
27
+ return this.currentBank;
28
+ }
29
+ // Calculate actual address in RAM: bank * bank_size + offset and return data
30
+ return this.data[this.currentBank * RAMCard.BANK_SIZE + address];
31
+ }
32
+ /**
33
+ * Write to RAM or bank control register
34
+ */
35
+ write(address, data) {
36
+ // Writing to bank control register switches banks
37
+ if (address === RAMCard.BANK_CONTROL_REGISTER) {
38
+ this.currentBank = data & 0xFF; // Ensure 0-255 range
39
+ return;
40
+ }
41
+ // Calculate actual address in RAM: bank * bank_size + offset and store data
42
+ this.data[this.currentBank * RAMCard.BANK_SIZE + address] = data & 0xFF;
43
+ }
44
+ /**
45
+ * Tick - no timing behavior for RAM
46
+ */
47
+ tick(frequency) { }
48
+ /**
49
+ * Reset the RAM card
50
+ */
51
+ reset(coldStart) {
52
+ if (coldStart) {
53
+ this.currentBank = 0;
54
+ this.data.fill(0x00);
55
+ }
56
+ }
57
+ }
58
+ exports.RAMCard = RAMCard;
59
+ RAMCard.TOTAL_SIZE = 256 * 1024; // 256k bytes
60
+ RAMCard.BANK_SIZE = 1024; // 1k per bank
61
+ RAMCard.NUM_BANKS = RAMCard.TOTAL_SIZE / RAMCard.BANK_SIZE; // 256 banks
62
+ RAMCard.BANK_CONTROL_REGISTER = 0x3FF; // Last byte in 1k window
63
+ //# sourceMappingURL=RAMCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RAMCard.js","sourceRoot":"","sources":["../../../src/components/IO/RAMCard.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;GASG;AACH,MAAa,OAAO;IAApB;QAOE,SAAI,GAAa,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1D,gBAAW,GAAW,CAAC,CAAA;QAEvB,aAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;QACnB,aAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;IA4CrB,CAAC;IA1CC;;OAEG;IACH,IAAI,CAAC,OAAe;QAClB,iEAAiE;QACjE,IAAI,OAAO,KAAK,OAAO,CAAC,qBAAqB,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,WAAW,CAAA;QACzB,CAAC;QAED,6EAA6E;QAC7E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,CAAA;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe,EAAE,IAAY;QACjC,kDAAkD;QAClD,IAAI,OAAO,KAAK,OAAO,CAAC,qBAAqB,EAAE,CAAC;YAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,IAAI,CAAA,CAAC,qBAAqB;YACpD,OAAM;QACR,CAAC;QAED,4EAA4E;QAC5E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;IACzE,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,SAAiB,IAAS,CAAC;IAEhC;;OAEG;IACH,KAAK,CAAC,SAAkB;QACtB,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,WAAW,GAAG,CAAC,CAAA;YACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;;AArDH,0BAuDC;AArDQ,kBAAU,GAAW,GAAG,GAAG,IAAI,AAArB,CAAqB,CAAC,aAAa;AAC7C,iBAAS,GAAW,IAAI,AAAf,CAAe,CAAC,cAAc;AACvC,iBAAS,GAAW,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,AAAjD,CAAiD,CAAC,YAAY;AACvE,6BAAqB,GAAW,KAAK,AAAhB,CAAgB,CAAC,yBAAyB"}
@@ -0,0 +1,483 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RTCCard = void 0;
4
+ /**
5
+ * DS1511Y Real-Time Clock IC Emulation
6
+ *
7
+ * Register Map (0x00-0x1F):
8
+ * 0x00: Seconds (BCD, 00-59)
9
+ * 0x01: Minutes (BCD, 00-59)
10
+ * 0x02: Hours (BCD, 00-23)
11
+ * 0x03: Day of Week (1-7, 1=Sunday)
12
+ * 0x04: Date (BCD, 01-31)
13
+ * 0x05: Month (BCD, 01-12) + Control bits (EOSC, E32K)
14
+ * 0x06: Year (BCD, 00-99)
15
+ * 0x07: Century (BCD, 00-39)
16
+ * 0x08: Alarm Seconds (BCD, 00-59) + AM1 bit
17
+ * 0x09: Alarm Minutes (BCD, 00-59) + AM2 bit
18
+ * 0x0A: Alarm Hours (BCD, 00-23) + AM3 bit
19
+ * 0x0B: Alarm Day/Date + AM4, DY/DT bits
20
+ * 0x0C: Watchdog (0.1 Second and 0.01 Second)
21
+ * 0x0D: Watchdog (0.1 Second and Second)
22
+ * 0x0E: Control A (BLF1, BLF2, PBS, PAB, TDF, KSF, WDF, IRQF)
23
+ * 0x0F: Control B (TE, CS, BME, TPE, TIE, KIE, WDE, WDS)
24
+ * 0x10: RAM Address (Extended RAM Address pointer)
25
+ * 0x11: Reserved
26
+ * 0x12: Reserved
27
+ * 0x13: RAM Data (Extended RAM Data at address pointed to by 0x10)
28
+ */
29
+ class RTCCard {
30
+ constructor() {
31
+ this.raiseIRQ = () => { };
32
+ this.raiseNMI = () => { };
33
+ // RTC Registers (user-visible)
34
+ this.userSeconds = 0; // 0x00
35
+ this.userMinutes = 0; // 0x01
36
+ this.userHours = 0; // 0x02
37
+ this.userDayOfWeek = 1; // 0x03 (1=Sunday)
38
+ this.userDate = 1; // 0x04
39
+ this.userMonth = 1; // 0x05 (bits 0-4)
40
+ this.monthControl = 0; // 0x05 (bits 5-7: EOSC, E32K)
41
+ this.userYear = 0; // 0x06 (00-99)
42
+ this.userCentury = 20; // 0x07 (00-39)
43
+ // Internal timekeeping registers
44
+ this.internalSeconds = 0;
45
+ this.internalMinutes = 0;
46
+ this.internalHours = 0;
47
+ this.internalDayOfWeek = 1;
48
+ this.internalDate = 1;
49
+ this.internalMonth = 1;
50
+ this.internalYear = 0;
51
+ this.internalCentury = 20;
52
+ // Alarm registers
53
+ this.alarmSeconds = 0; // 0x08 (bits 0-6, bit 7 = AM1)
54
+ this.alarmMinutes = 0; // 0x09 (bits 0-6, bit 7 = AM2)
55
+ this.alarmHours = 0; // 0x0A (bits 0-6, bit 7 = AM3)
56
+ this.alarmDayDate = 0; // 0x0B (bits 0-5, bit 6 = DY/DT, bit 7 = AM4)
57
+ // Watchdog
58
+ this.watchdog1 = 0; // 0x0C (0.1 Second and 0.01 Second)
59
+ this.watchdog2 = 0; // 0x0D (0.1 Second and Second)
60
+ this.watchdogCounterCentis = 0;
61
+ this.watchdogCycleCounter = 0;
62
+ // Control registers
63
+ this.controlA = 0; // 0x0E
64
+ this.controlB = 0; // 0x0F
65
+ // Extended RAM
66
+ this.ramAddress = 0; // 0x10
67
+ this.ramData = new Uint8Array(256); // 256 bytes of extended RAM
68
+ // Time tracking for incrementing
69
+ this.cycleCounter = 0; // Accumulator for CPU cycles
70
+ this.cpuFrequency = 2000000; // Default 2MHz
71
+ this.transferCycleCounter = 0;
72
+ this.pendingUserToInternal = false;
73
+ this.userSyncNeeded = false;
74
+ this.lastTEEnabled = false;
75
+ this.initializeWithCurrentTime();
76
+ }
77
+ /**
78
+ * Initialize RTC with current system time
79
+ */
80
+ initializeWithCurrentTime() {
81
+ const now = new Date();
82
+ this.internalSeconds = this.decimalToBCD(now.getSeconds());
83
+ this.internalMinutes = this.decimalToBCD(now.getMinutes());
84
+ this.internalHours = this.decimalToBCD(now.getHours());
85
+ this.internalDayOfWeek = now.getDay() === 0 ? 1 : now.getDay(); // 1=Sunday
86
+ this.internalDate = this.decimalToBCD(now.getDate());
87
+ this.internalMonth = this.decimalToBCD(now.getMonth() + 1);
88
+ this.internalYear = this.decimalToBCD(now.getFullYear() % 100);
89
+ this.internalCentury = this.decimalToBCD(Math.floor(now.getFullYear() / 100));
90
+ this.monthControl = 0x80; // EOSC enabled by default (bit 7)
91
+ this.copyInternalToUser();
92
+ this.pendingUserToInternal = false;
93
+ this.userSyncNeeded = false;
94
+ this.transferCycleCounter = 0;
95
+ this.lastTEEnabled = (this.controlB & 0x80) !== 0;
96
+ }
97
+ /**
98
+ * Convert decimal to BCD (Binary Coded Decimal)
99
+ */
100
+ decimalToBCD(decimal) {
101
+ return ((Math.floor(decimal / 10) << 4) | (decimal % 10)) & 0xFF;
102
+ }
103
+ /**
104
+ * Convert BCD to decimal
105
+ */
106
+ bcdToDecimal(bcd) {
107
+ return (((bcd >> 4) & 0x0F) * 10) + (bcd & 0x0F);
108
+ }
109
+ /**
110
+ * Get the number of days in a month
111
+ */
112
+ getDaysInMonth(month, year, century) {
113
+ const fullYear = (century * 100) + year;
114
+ if ([1, 3, 5, 7, 8, 10, 12].includes(month))
115
+ return 31;
116
+ if ([4, 6, 9, 11].includes(month))
117
+ return 30;
118
+ // February
119
+ if ((fullYear % 4 === 0 && fullYear % 100 !== 0) || fullYear % 400 === 0) {
120
+ return 29;
121
+ }
122
+ return 28;
123
+ }
124
+ /**
125
+ * Get next day of week
126
+ */
127
+ getNextDayOfWeek(currentDay) {
128
+ return currentDay === 7 ? 1 : currentDay + 1;
129
+ }
130
+ copyInternalToUser() {
131
+ this.userSeconds = this.internalSeconds;
132
+ this.userMinutes = this.internalMinutes;
133
+ this.userHours = this.internalHours;
134
+ this.userDayOfWeek = this.internalDayOfWeek;
135
+ this.userDate = this.internalDate;
136
+ this.userMonth = this.internalMonth;
137
+ this.userYear = this.internalYear;
138
+ this.userCentury = this.internalCentury;
139
+ }
140
+ copyUserToInternal() {
141
+ this.internalSeconds = this.userSeconds;
142
+ this.internalMinutes = this.userMinutes;
143
+ this.internalHours = this.userHours;
144
+ this.internalDayOfWeek = this.userDayOfWeek;
145
+ this.internalDate = this.userDate;
146
+ this.internalMonth = this.userMonth;
147
+ this.internalYear = this.userYear;
148
+ this.internalCentury = this.userCentury;
149
+ }
150
+ getTransferCyclesRequired() {
151
+ return Math.max(1, Math.ceil(this.cpuFrequency * 366 / 1000000));
152
+ }
153
+ markUserTimeWrite() {
154
+ this.pendingUserToInternal = true;
155
+ if ((this.controlB & 0x80) !== 0 &&
156
+ this.transferCycleCounter >= this.getTransferCyclesRequired()) {
157
+ this.copyUserToInternal();
158
+ this.pendingUserToInternal = false;
159
+ this.userSyncNeeded = false;
160
+ }
161
+ }
162
+ /**
163
+ * Increment time by one second
164
+ */
165
+ incrementTime() {
166
+ let sec = this.bcdToDecimal(this.internalSeconds);
167
+ let min = this.bcdToDecimal(this.internalMinutes);
168
+ let hour = this.bcdToDecimal(this.internalHours);
169
+ let date = this.bcdToDecimal(this.internalDate);
170
+ let month = this.bcdToDecimal(this.internalMonth);
171
+ let year = this.bcdToDecimal(this.internalYear);
172
+ const century = this.bcdToDecimal(this.internalCentury);
173
+ sec++;
174
+ if (sec >= 60) {
175
+ sec = 0;
176
+ min++;
177
+ if (min >= 60) {
178
+ min = 0;
179
+ hour++;
180
+ if (hour >= 24) {
181
+ hour = 0;
182
+ this.internalDayOfWeek = this.getNextDayOfWeek(this.internalDayOfWeek);
183
+ date++;
184
+ const daysInMonth = this.getDaysInMonth(month, year, century);
185
+ if (date > daysInMonth) {
186
+ date = 1;
187
+ month++;
188
+ if (month > 12) {
189
+ month = 1;
190
+ year++;
191
+ if (year > 99) {
192
+ year = 0;
193
+ let cent = this.bcdToDecimal(this.internalCentury);
194
+ cent++;
195
+ if (cent > 39)
196
+ cent = 0;
197
+ this.internalCentury = this.decimalToBCD(cent);
198
+ }
199
+ }
200
+ }
201
+ }
202
+ }
203
+ }
204
+ this.internalSeconds = this.decimalToBCD(sec);
205
+ this.internalMinutes = this.decimalToBCD(min);
206
+ this.internalHours = this.decimalToBCD(hour);
207
+ this.internalDate = this.decimalToBCD(date);
208
+ this.internalMonth = this.decimalToBCD(month);
209
+ this.internalYear = this.decimalToBCD(year);
210
+ }
211
+ /**
212
+ * Check if alarm should trigger
213
+ */
214
+ checkAlarm() {
215
+ const am1 = (this.alarmSeconds & 0x80) !== 0;
216
+ const am2 = (this.alarmMinutes & 0x80) !== 0;
217
+ const am3 = (this.alarmHours & 0x80) !== 0;
218
+ const am4 = (this.alarmDayDate & 0x80) !== 0;
219
+ // If all AM bits are set, alarm is disabled
220
+ if (am1 && am2 && am3 && am4)
221
+ return;
222
+ // Check matching based on AM bits
223
+ const secondsMatch = am1 || (this.internalSeconds === (this.alarmSeconds & 0x7F));
224
+ const minutesMatch = am2 || (this.internalMinutes === (this.alarmMinutes & 0x7F));
225
+ const hoursMatch = am3 || (this.internalHours === (this.alarmHours & 0x7F));
226
+ let dayDateMatch = true;
227
+ if (!am4) {
228
+ const dyDt = (this.alarmDayDate & 0x40) !== 0;
229
+ const alarmValue = this.alarmDayDate & 0x3F;
230
+ if (dyDt) {
231
+ // Day of week match
232
+ dayDateMatch = this.internalDayOfWeek === alarmValue;
233
+ }
234
+ else {
235
+ // Date match
236
+ dayDateMatch = this.internalDate === alarmValue;
237
+ }
238
+ }
239
+ if (secondsMatch && minutesMatch && hoursMatch && dayDateMatch) {
240
+ this.controlA |= 0x08; // Set TDF flag (bit 3)
241
+ this.raiseInterruptIfEnabled(0x08, 0x08);
242
+ }
243
+ }
244
+ raiseInterruptIfEnabled(flagMask, enableMask) {
245
+ if ((this.controlA & flagMask) === 0)
246
+ return;
247
+ if ((this.controlB & enableMask) === 0)
248
+ return;
249
+ this.controlA |= 0x01; // Set IRQF flag (bit 0)
250
+ this.raiseIRQ();
251
+ }
252
+ setKickstartFlag() {
253
+ this.controlA |= 0x04; // Set KSF flag (bit 2)
254
+ this.raiseInterruptIfEnabled(0x04, 0x04);
255
+ }
256
+ decodeWatchdogCentis() {
257
+ const hundredths = this.watchdog1 & 0x0F;
258
+ const tenths = (this.watchdog1 >> 4) & 0x0F;
259
+ const seconds = this.watchdog2 & 0x0F;
260
+ const tensSeconds = (this.watchdog2 >> 4) & 0x0F;
261
+ const totalSeconds = (tensSeconds * 10) + seconds;
262
+ const totalCentis = (tenths * 10) + hundredths;
263
+ return (totalSeconds * 100) + totalCentis;
264
+ }
265
+ reloadWatchdog() {
266
+ this.watchdogCounterCentis = this.decodeWatchdogCentis();
267
+ this.watchdogCycleCounter = 0;
268
+ }
269
+ stepWatchdog() {
270
+ if ((this.controlB & 0x02) === 0)
271
+ return; // WDE disabled
272
+ if (this.watchdogCounterCentis <= 0)
273
+ return;
274
+ const cyclesPerCentisecond = Math.max(1, Math.floor(this.cpuFrequency / 100));
275
+ this.watchdogCycleCounter++;
276
+ if (this.watchdogCycleCounter < cyclesPerCentisecond)
277
+ return;
278
+ this.watchdogCycleCounter = 0;
279
+ this.watchdogCounterCentis -= 1;
280
+ if (this.watchdogCounterCentis > 0)
281
+ return;
282
+ this.controlA |= 0x02; // Set WDF flag (bit 1)
283
+ if ((this.controlB & 0x01) === 0) {
284
+ this.raiseInterruptIfEnabled(0x02, 0x02);
285
+ }
286
+ else {
287
+ // WDS=1 steers watchdog to reset; emulate by clearing WDE
288
+ this.controlB &= ~0x02;
289
+ this.raiseNMI();
290
+ }
291
+ }
292
+ read(address) {
293
+ address &= 0x1F;
294
+ switch (address) {
295
+ case 0x00: return this.userSeconds;
296
+ case 0x01: return this.userMinutes;
297
+ case 0x02: return this.userHours;
298
+ case 0x03: return this.userDayOfWeek & 0x07;
299
+ case 0x04: return this.userDate;
300
+ case 0x05: return this.userMonth | this.monthControl;
301
+ case 0x06: return this.userYear;
302
+ case 0x07: return this.userCentury;
303
+ case 0x08: return this.alarmSeconds;
304
+ case 0x09: return this.alarmMinutes;
305
+ case 0x0A: return this.alarmHours;
306
+ case 0x0B: return this.alarmDayDate;
307
+ case 0x0C: return this.watchdog1;
308
+ case 0x0D: return this.watchdog2;
309
+ case 0x0E:
310
+ // Reading Control A clears the interrupt flags: IRQF, WDF, KSF, TDF
311
+ const result = this.controlA;
312
+ this.controlA &= 0xF0; // Clear bits 0-3 (IRQF, WDF, KSF, TDF)
313
+ return result;
314
+ case 0x0F: return this.controlB;
315
+ case 0x10: return this.ramAddress;
316
+ case 0x11: return 0; // Reserved
317
+ case 0x12: return 0; // Reserved
318
+ case 0x13: {
319
+ const value = this.ramData[this.ramAddress];
320
+ if ((this.controlB & 0x20) !== 0) {
321
+ this.ramAddress = (this.ramAddress + 1) & 0xFF;
322
+ }
323
+ return value;
324
+ }
325
+ default: return 0;
326
+ }
327
+ }
328
+ write(address, data) {
329
+ data &= 0xFF;
330
+ address &= 0x1F;
331
+ switch (address) {
332
+ case 0x00:
333
+ this.userSeconds = data;
334
+ this.markUserTimeWrite();
335
+ break;
336
+ case 0x01:
337
+ this.userMinutes = data;
338
+ this.markUserTimeWrite();
339
+ break;
340
+ case 0x02:
341
+ this.userHours = data;
342
+ this.markUserTimeWrite();
343
+ break;
344
+ case 0x03:
345
+ this.userDayOfWeek = data & 0x07;
346
+ this.markUserTimeWrite();
347
+ break;
348
+ case 0x04:
349
+ this.userDate = data;
350
+ this.markUserTimeWrite();
351
+ break;
352
+ case 0x05:
353
+ this.userMonth = data & 0x1F;
354
+ this.monthControl = data & 0xE0;
355
+ this.markUserTimeWrite();
356
+ break;
357
+ case 0x06:
358
+ this.userYear = data;
359
+ this.markUserTimeWrite();
360
+ break;
361
+ case 0x07:
362
+ this.userCentury = data;
363
+ this.markUserTimeWrite();
364
+ break;
365
+ case 0x08:
366
+ this.alarmSeconds = data;
367
+ break;
368
+ case 0x09:
369
+ this.alarmMinutes = data;
370
+ break;
371
+ case 0x0A:
372
+ this.alarmHours = data;
373
+ break;
374
+ case 0x0B:
375
+ this.alarmDayDate = data;
376
+ break;
377
+ case 0x0C:
378
+ this.watchdog1 = data;
379
+ this.reloadWatchdog();
380
+ break;
381
+ case 0x0D:
382
+ this.watchdog2 = data;
383
+ this.reloadWatchdog();
384
+ break;
385
+ case 0x0E:
386
+ // Writing 1 to flag bits (0-3) clears them; control bits (4-7) are written normally
387
+ this.controlA = (data & 0xF0) | ((this.controlA & 0x0F) & ~(data & 0x0F));
388
+ break;
389
+ case 0x0F:
390
+ this.controlB = data;
391
+ this.raiseInterruptIfEnabled(0x04, 0x04);
392
+ if ((this.controlB & 0x02) !== 0) {
393
+ this.reloadWatchdog();
394
+ }
395
+ break;
396
+ case 0x10:
397
+ this.ramAddress = data; // Set RAM address pointer
398
+ break;
399
+ case 0x11:
400
+ case 0x12:
401
+ // Reserved, ignore writes
402
+ break;
403
+ case 0x13:
404
+ this.ramData[this.ramAddress] = data; // Write to RAM at current address
405
+ if ((this.controlB & 0x20) !== 0) {
406
+ this.ramAddress = (this.ramAddress + 1) & 0xFF;
407
+ }
408
+ break;
409
+ }
410
+ }
411
+ tick(frequency) {
412
+ // Advance RTC based on CPU frequency
413
+ // Store the frequency for use in time calculations
414
+ this.cpuFrequency = frequency > 0 ? frequency : 2000000;
415
+ const teEnabled = (this.controlB & 0x80) !== 0;
416
+ if (teEnabled !== this.lastTEEnabled) {
417
+ this.lastTEEnabled = teEnabled;
418
+ this.transferCycleCounter = 0;
419
+ }
420
+ if (teEnabled) {
421
+ this.transferCycleCounter++;
422
+ }
423
+ else {
424
+ this.transferCycleCounter = 0;
425
+ }
426
+ const transferReady = teEnabled &&
427
+ this.transferCycleCounter >= this.getTransferCyclesRequired();
428
+ if (transferReady && this.pendingUserToInternal) {
429
+ this.copyUserToInternal();
430
+ this.pendingUserToInternal = false;
431
+ this.userSyncNeeded = false;
432
+ }
433
+ if ((this.monthControl & 0x80) === 0) {
434
+ // Oscillator disabled
435
+ this.stepWatchdog();
436
+ return;
437
+ }
438
+ this.cycleCounter++;
439
+ // Advance time when we've accumulated enough cycles for 1 second
440
+ if (this.cycleCounter >= this.cpuFrequency) {
441
+ this.cycleCounter = 0;
442
+ this.incrementTime();
443
+ this.checkAlarm();
444
+ if (transferReady) {
445
+ this.copyInternalToUser();
446
+ this.userSyncNeeded = false;
447
+ }
448
+ else {
449
+ this.userSyncNeeded = true;
450
+ }
451
+ }
452
+ else if (transferReady && this.userSyncNeeded) {
453
+ this.copyInternalToUser();
454
+ this.userSyncNeeded = false;
455
+ }
456
+ this.stepWatchdog();
457
+ }
458
+ reset(coldStart) {
459
+ if (coldStart) {
460
+ // Cold start: Initialize with current time
461
+ this.initializeWithCurrentTime();
462
+ this.cycleCounter = 0;
463
+ this.watchdogCounterCentis = 0;
464
+ this.watchdogCycleCounter = 0;
465
+ this.transferCycleCounter = 0;
466
+ this.pendingUserToInternal = false;
467
+ this.userSyncNeeded = false;
468
+ this.setKickstartFlag();
469
+ }
470
+ else {
471
+ // Warm start: Keep time, reset some control flags but preserve settings
472
+ this.controlA &= 0xF0; // Clear interrupt flags
473
+ this.cycleCounter = 0;
474
+ this.watchdogCounterCentis = 0;
475
+ this.watchdogCycleCounter = 0;
476
+ this.transferCycleCounter = 0;
477
+ this.pendingUserToInternal = false;
478
+ this.userSyncNeeded = false;
479
+ }
480
+ }
481
+ }
482
+ exports.RTCCard = RTCCard;
483
+ //# sourceMappingURL=RTCCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RTCCard.js","sourceRoot":"","sources":["../../../src/components/IO/RTCCard.ts"],"names":[],"mappings":"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"}