ac6502 1.3.0 → 1.4.1

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 (141) hide show
  1. package/README.md +139 -32
  2. package/dist/components/IO/ACIA.d.ts +76 -0
  3. package/dist/components/IO/ACIA.js +282 -0
  4. package/dist/components/IO/ACIA.js.map +1 -0
  5. package/dist/components/IO/Attachments/Attachment.d.ts +112 -0
  6. package/dist/components/IO/Attachments/Attachment.js +71 -0
  7. package/dist/components/IO/Attachments/Attachment.js.map +1 -0
  8. package/dist/components/IO/Attachments/JoystickAttachment.d.ts +53 -0
  9. package/dist/components/IO/Attachments/JoystickAttachment.js +90 -0
  10. package/dist/components/IO/Attachments/JoystickAttachment.js.map +1 -0
  11. package/dist/components/IO/Attachments/KeyboardEncoderAttachment.d.ts +63 -0
  12. package/dist/components/IO/Attachments/KeyboardEncoderAttachment.js +489 -0
  13. package/dist/components/IO/Attachments/KeyboardEncoderAttachment.js.map +1 -0
  14. package/dist/components/IO/Attachments/KeyboardMatrixAttachment.d.ts +44 -0
  15. package/dist/components/IO/Attachments/KeyboardMatrixAttachment.js +274 -0
  16. package/dist/components/IO/Attachments/KeyboardMatrixAttachment.js.map +1 -0
  17. package/dist/components/IO/Attachments/KeypadAttachment.d.ts +47 -0
  18. package/dist/components/IO/Attachments/KeypadAttachment.js +141 -0
  19. package/dist/components/IO/Attachments/KeypadAttachment.js.map +1 -0
  20. package/dist/components/IO/Attachments/LCDAttachment.d.ts +110 -0
  21. package/dist/components/IO/Attachments/LCDAttachment.js +716 -0
  22. package/dist/components/IO/Attachments/LCDAttachment.js.map +1 -0
  23. package/dist/components/IO/Attachments/SNESAttachment.d.ts +85 -0
  24. package/dist/components/IO/Attachments/SNESAttachment.js +184 -0
  25. package/dist/components/IO/Attachments/SNESAttachment.js.map +1 -0
  26. package/dist/components/IO/Empty.d.ts +9 -0
  27. package/dist/components/IO/Empty.js +5 -7
  28. package/dist/components/IO/Empty.js.map +1 -1
  29. package/dist/components/IO/GPIOCard.d.ts +5 -5
  30. package/dist/components/IO/GPIOCard.js.map +1 -1
  31. package/dist/components/IO/RAMBank.d.ts +37 -0
  32. package/dist/components/IO/RAMBank.js +63 -0
  33. package/dist/components/IO/RAMBank.js.map +1 -0
  34. package/dist/components/IO/RTC.d.ts +107 -0
  35. package/dist/components/IO/RTC.js +483 -0
  36. package/dist/components/IO/RTC.js.map +1 -0
  37. package/dist/components/IO/Sound.d.ts +120 -0
  38. package/dist/components/IO/Sound.js +622 -0
  39. package/dist/components/IO/Sound.js.map +1 -0
  40. package/dist/components/IO/Storage.d.ts +74 -0
  41. package/dist/components/IO/Storage.js +409 -0
  42. package/dist/components/IO/Storage.js.map +1 -0
  43. package/dist/components/IO/Terminal.d.ts +19 -0
  44. package/dist/components/IO/Terminal.js +33 -0
  45. package/dist/components/IO/Terminal.js.map +1 -0
  46. package/dist/components/IO/VIA.d.ts +105 -0
  47. package/dist/components/IO/VIA.js +597 -0
  48. package/dist/components/IO/VIA.js.map +1 -0
  49. package/dist/components/IO/Video.d.ts +141 -0
  50. package/dist/components/IO/Video.js +630 -0
  51. package/dist/components/IO/Video.js.map +1 -0
  52. package/dist/components/Machine.d.ts +20 -24
  53. package/dist/components/Machine.js +249 -166
  54. package/dist/components/Machine.js.map +1 -1
  55. package/dist/index.js +28 -14
  56. package/dist/index.js.map +1 -1
  57. package/dist/lib.d.ts +16 -16
  58. package/dist/lib.js +32 -32
  59. package/dist/lib.js.map +1 -1
  60. package/dist/tests/IO/ACIA.test.d.ts +1 -0
  61. package/dist/tests/IO/ACIA.test.js +423 -0
  62. package/dist/tests/IO/ACIA.test.js.map +1 -0
  63. package/dist/tests/IO/Attachments/Attachment.test.d.ts +1 -0
  64. package/dist/tests/IO/Attachments/Attachment.test.js +339 -0
  65. package/dist/tests/IO/Attachments/Attachment.test.js.map +1 -0
  66. package/dist/tests/IO/Attachments/JoystickAttachment.test.d.ts +1 -0
  67. package/dist/tests/IO/Attachments/JoystickAttachment.test.js +126 -0
  68. package/dist/tests/IO/Attachments/JoystickAttachment.test.js.map +1 -0
  69. package/dist/tests/IO/Attachments/KeyboardEncoderAttachment.test.d.ts +1 -0
  70. package/dist/tests/IO/Attachments/KeyboardEncoderAttachment.test.js +779 -0
  71. package/dist/tests/IO/Attachments/KeyboardEncoderAttachment.test.js.map +1 -0
  72. package/dist/tests/IO/Attachments/KeyboardMatrixAttachment.test.d.ts +1 -0
  73. package/dist/tests/IO/Attachments/KeyboardMatrixAttachment.test.js +355 -0
  74. package/dist/tests/IO/Attachments/KeyboardMatrixAttachment.test.js.map +1 -0
  75. package/dist/tests/IO/Attachments/KeypadAttachment.test.d.ts +1 -0
  76. package/dist/tests/IO/Attachments/KeypadAttachment.test.js +323 -0
  77. package/dist/tests/IO/Attachments/KeypadAttachment.test.js.map +1 -0
  78. package/dist/tests/IO/Attachments/LCDAttachment.test.d.ts +1 -0
  79. package/dist/tests/IO/Attachments/LCDAttachment.test.js +627 -0
  80. package/dist/tests/IO/Attachments/LCDAttachment.test.js.map +1 -0
  81. package/dist/tests/IO/Attachments/SNESAttachment.test.d.ts +1 -0
  82. package/dist/tests/IO/Attachments/SNESAttachment.test.js +331 -0
  83. package/dist/tests/IO/Attachments/SNESAttachment.test.js.map +1 -0
  84. package/dist/tests/IO/Empty.test.d.ts +1 -0
  85. package/dist/tests/IO/Empty.test.js +121 -0
  86. package/dist/tests/IO/Empty.test.js.map +1 -0
  87. package/dist/tests/IO/GPIOCard.test.js.map +1 -1
  88. package/dist/tests/IO/RAMBank.test.d.ts +1 -0
  89. package/dist/tests/IO/RAMBank.test.js +229 -0
  90. package/dist/tests/IO/RAMBank.test.js.map +1 -0
  91. package/dist/tests/IO/RTC.test.d.ts +1 -0
  92. package/dist/tests/IO/RTC.test.js +177 -0
  93. package/dist/tests/IO/RTC.test.js.map +1 -0
  94. package/dist/tests/IO/Sound.test.d.ts +1 -0
  95. package/dist/tests/IO/Sound.test.js +528 -0
  96. package/dist/tests/IO/Sound.test.js.map +1 -0
  97. package/dist/tests/IO/Storage.test.d.ts +1 -0
  98. package/dist/tests/IO/Storage.test.js +656 -0
  99. package/dist/tests/IO/Storage.test.js.map +1 -0
  100. package/dist/tests/IO/VIA.test.d.ts +1 -0
  101. package/dist/tests/IO/VIA.test.js +503 -0
  102. package/dist/tests/IO/VIA.test.js.map +1 -0
  103. package/dist/tests/IO/Video.test.d.ts +1 -0
  104. package/dist/tests/IO/Video.test.js +549 -0
  105. package/dist/tests/IO/Video.test.js.map +1 -0
  106. package/dist/tests/Machine.test.js +27 -42
  107. package/dist/tests/Machine.test.js.map +1 -1
  108. package/package.json +1 -1
  109. package/src/components/IO/{SerialCard.ts → ACIA.ts} +2 -2
  110. package/src/components/IO/{GPIOAttachments/GPIOAttachment.ts → Attachments/Attachment.ts} +2 -2
  111. package/src/components/IO/{GPIOAttachments/GPIOJoystickAttachment.ts → Attachments/JoystickAttachment.ts} +3 -3
  112. package/src/components/IO/{GPIOAttachments/GPIOKeyboardEncoderAttachment.ts → Attachments/KeyboardEncoderAttachment.ts} +3 -3
  113. package/src/components/IO/{GPIOAttachments/GPIOKeyboardMatrixAttachment.ts → Attachments/KeyboardMatrixAttachment.ts} +5 -5
  114. package/src/components/IO/{GPIOAttachments/GPIOKeypadAttachment.ts → Attachments/KeypadAttachment.ts} +3 -3
  115. package/src/components/IO/{GPIOAttachments/GPIOLCDAttachment.ts → Attachments/LCDAttachment.ts} +7 -7
  116. package/src/components/IO/{EmptyCard.ts → Empty.ts} +1 -1
  117. package/src/components/IO/{RAMCard.ts → RAMBank.ts} +8 -8
  118. package/src/components/IO/{RTCCard.ts → RTC.ts} +1 -1
  119. package/src/components/IO/{SoundCard.ts → Sound.ts} +2 -2
  120. package/src/components/IO/{StorageCard.ts → Storage.ts} +70 -73
  121. package/src/components/IO/{DevOutputBoard.ts → Terminal.ts} +2 -2
  122. package/src/components/IO/{GPIOCard.ts → VIA.ts} +64 -64
  123. package/src/components/IO/{VideoCard.ts → Video.ts} +1 -1
  124. package/src/components/Machine.ts +276 -176
  125. package/src/index.ts +34 -21
  126. package/src/lib.ts +16 -16
  127. package/src/tests/IO/{SerialCard.test.ts → ACIA.test.ts} +5 -5
  128. package/src/tests/IO/{GPIOAttachments/GPIOAttachment.test.ts → Attachments/Attachment.test.ts} +12 -12
  129. package/src/tests/IO/{GPIOAttachments/GPIOJoystickAttachment.test.ts → Attachments/JoystickAttachment.test.ts} +23 -23
  130. package/src/tests/IO/{GPIOAttachments/GPIOKeyboardEncoderAttachment.test.ts → Attachments/KeyboardEncoderAttachment.test.ts} +4 -4
  131. package/src/tests/IO/{GPIOAttachments/GPIOKeyboardMatrixAttachment.test.ts → Attachments/KeyboardMatrixAttachment.test.ts} +5 -5
  132. package/src/tests/IO/{GPIOAttachments/GPIOKeypadAttachment.test.ts → Attachments/KeypadAttachment.test.ts} +38 -38
  133. package/src/tests/IO/{GPIOAttachments/GPIOLCDAttachment.test.ts → Attachments/LCDAttachment.test.ts} +12 -12
  134. package/src/tests/IO/Empty.test.ts +143 -0
  135. package/src/tests/IO/{RAMCard.test.ts → RAMBank.test.ts} +33 -33
  136. package/src/tests/IO/{RTCCard.test.ts → RTC.test.ts} +6 -6
  137. package/src/tests/IO/{SoundCard.test.ts → Sound.test.ts} +6 -6
  138. package/src/tests/IO/{StorageCard.test.ts → Storage.test.ts} +34 -25
  139. package/src/tests/IO/{GPIOCard.test.ts → VIA.test.ts} +7 -7
  140. package/src/tests/IO/{VideoCard.test.ts → Video.test.ts} +13 -13
  141. package/src/tests/Machine.test.ts +31 -38
@@ -0,0 +1,107 @@
1
+ import { IO } from '../IO';
2
+ /**
3
+ * DS1511Y Real-Time Clock IC Emulation
4
+ *
5
+ * Register Map (0x00-0x1F):
6
+ * 0x00: Seconds (BCD, 00-59)
7
+ * 0x01: Minutes (BCD, 00-59)
8
+ * 0x02: Hours (BCD, 00-23)
9
+ * 0x03: Day of Week (1-7, 1=Sunday)
10
+ * 0x04: Date (BCD, 01-31)
11
+ * 0x05: Month (BCD, 01-12) + Control bits (EOSC, E32K)
12
+ * 0x06: Year (BCD, 00-99)
13
+ * 0x07: Century (BCD, 00-39)
14
+ * 0x08: Alarm Seconds (BCD, 00-59) + AM1 bit
15
+ * 0x09: Alarm Minutes (BCD, 00-59) + AM2 bit
16
+ * 0x0A: Alarm Hours (BCD, 00-23) + AM3 bit
17
+ * 0x0B: Alarm Day/Date + AM4, DY/DT bits
18
+ * 0x0C: Watchdog (0.1 Second and 0.01 Second)
19
+ * 0x0D: Watchdog (0.1 Second and Second)
20
+ * 0x0E: Control A (BLF1, BLF2, PBS, PAB, TDF, KSF, WDF, IRQF)
21
+ * 0x0F: Control B (TE, CS, BME, TPE, TIE, KIE, WDE, WDS)
22
+ * 0x10: RAM Address (Extended RAM Address pointer)
23
+ * 0x11: Reserved
24
+ * 0x12: Reserved
25
+ * 0x13: RAM Data (Extended RAM Data at address pointed to by 0x10)
26
+ */
27
+ export declare class RTC implements IO {
28
+ raiseIRQ: () => void;
29
+ raiseNMI: () => void;
30
+ private userSeconds;
31
+ private userMinutes;
32
+ private userHours;
33
+ private userDayOfWeek;
34
+ private userDate;
35
+ private userMonth;
36
+ private monthControl;
37
+ private userYear;
38
+ private userCentury;
39
+ private internalSeconds;
40
+ private internalMinutes;
41
+ private internalHours;
42
+ private internalDayOfWeek;
43
+ private internalDate;
44
+ private internalMonth;
45
+ private internalYear;
46
+ private internalCentury;
47
+ private alarmSeconds;
48
+ private alarmMinutes;
49
+ private alarmHours;
50
+ private alarmDayDate;
51
+ private watchdog1;
52
+ private watchdog2;
53
+ private watchdogCounterCentis;
54
+ private watchdogCycleCounter;
55
+ private controlA;
56
+ private controlB;
57
+ private ramAddress;
58
+ private ramData;
59
+ private cycleCounter;
60
+ private cpuFrequency;
61
+ private transferCycleCounter;
62
+ private pendingUserToInternal;
63
+ private userSyncNeeded;
64
+ private lastTEEnabled;
65
+ constructor();
66
+ /**
67
+ * Initialize RTC with current system time
68
+ */
69
+ private initializeWithCurrentTime;
70
+ /**
71
+ * Convert decimal to BCD (Binary Coded Decimal)
72
+ */
73
+ private decimalToBCD;
74
+ /**
75
+ * Convert BCD to decimal
76
+ */
77
+ private bcdToDecimal;
78
+ /**
79
+ * Get the number of days in a month
80
+ */
81
+ private getDaysInMonth;
82
+ /**
83
+ * Get next day of week
84
+ */
85
+ private getNextDayOfWeek;
86
+ private copyInternalToUser;
87
+ private copyUserToInternal;
88
+ private getTransferCyclesRequired;
89
+ private markUserTimeWrite;
90
+ /**
91
+ * Increment time by one second
92
+ */
93
+ private incrementTime;
94
+ /**
95
+ * Check if alarm should trigger
96
+ */
97
+ private checkAlarm;
98
+ private raiseInterruptIfEnabled;
99
+ private setKickstartFlag;
100
+ private decodeWatchdogCentis;
101
+ private reloadWatchdog;
102
+ private stepWatchdog;
103
+ read(address: number): number;
104
+ write(address: number, data: number): void;
105
+ tick(frequency: number): void;
106
+ reset(coldStart: boolean): void;
107
+ }
@@ -0,0 +1,483 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RTC = 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 RTC {
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.RTC = RTC;
483
+ //# sourceMappingURL=RTC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RTC.js","sourceRoot":"","sources":["../../../src/components/IO/RTC.ts"],"names":[],"mappings":"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"}