Skip to content

Commit a4f621e

Browse files
committed
implement rust rtc set and get state
1 parent e9e9c70 commit a4f621e

4 files changed

Lines changed: 191 additions & 106 deletions

File tree

src/browser/starter.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ export function V86(options)
7474
"getHours": function (date) { return (new Date(date)).getUTCHours(); },
7575
"getMinutes": function (date) { return (new Date(date)).getUTCMinutes(); },
7676
"getSeconds": function (date) { return (new Date(date)).getUTCSeconds(); },
77+
"newDate": function (year, month, day, hour, minute, second) {
78+
return new Date(Date.UTC(year, month, day, hour, minute, second));
79+
},
7780
"get_rand_int": function() { return get_rand_int(); },
7881
"stop_idling": function() { return cpu.stop_idling(); },
7982

src/cpu.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,37 @@ CPU.prototype.wasm_patch = function()
432432
this.cmos_read = get_import("cmos_read");
433433
this.cmos_write = get_import("cmos_write");
434434
this.rtc_timer = get_import("rtc_timer");
435+
this.get_cmos_index = get_import("get_cmos_index");
436+
this.set_cmos_index = get_import("set_cmos_index");
437+
this.get_cmos_data_byte = get_import("get_cmos_data_byte");
438+
this.set_cmos_data_byte = get_import("set_cmos_data_byte");
439+
this.get_rtc_time = get_import("get_rtc_time");
440+
this.set_rtc_time = get_import("set_rtc_time");
441+
this.get_last_update = get_import("get_last_update");
442+
this.set_last_update = get_import("set_last_update");
443+
this.get_next_interrupt = get_import("get_next_interrupt");
444+
this.set_next_interrupt = get_import("set_next_interrupt");
445+
this.get_next_interrupt_alarm = get_import("get_next_interrupt_alarm");
446+
this.set_next_interrupt_alarm = get_import("set_next_interrupt_alarm");
447+
this.get_periodic_interrupt = get_import("get_periodic_interrupt");
448+
this.set_periodic_interrupt = get_import("set_periodic_interrupt");
449+
this.get_periodic_interrupt_time = get_import("get_periodic_interrupt_time");
450+
this.set_periodic_interrupt_time = get_import("set_periodic_interrupt_time");
451+
this.get_cmos_a = get_import("get_cmos_a");
452+
this.set_cmos_a = get_import("set_cmos_a");
453+
this.get_cmos_b = get_import("get_cmos_b");
454+
this.set_cmos_b = get_import("set_cmos_b");
455+
this.get_cmos_c = get_import("get_cmos_c");
456+
this.set_cmos_c = get_import("set_cmos_c");
457+
this.get_cmos_diag_status = get_import("get_cmos_diag_status");
458+
this.set_cmos_diag_status = get_import("set_cmos_diag_status");
459+
this.get_nmi_disabled = get_import("get_nmi_disabled");
460+
this.set_nmi_disabled = get_import("set_nmi_disabled");
461+
this.get_update_interrupt = get_import("get_update_interrupt");
462+
this.set_update_interrupt = get_import("set_update_interrupt");
463+
this.get_update_interrupt_time = get_import("get_update_interrupt_time");
464+
this.set_update_interrupt_time = get_import("set_update_interrupt_time");
465+
435466

436467
this.zstd_create_ctx = get_import("zstd_create_ctx");
437468
this.zstd_get_src_ptr = get_import("zstd_get_src_ptr");

src/rtc.js

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,48 @@ RTC.prototype.get_state = function()
8383
{
8484
var state = [];
8585

86-
state[0] = this.rtc;
86+
state[0] = Number(this.cpu.get_cmos_index(this.rtc));
87+
var cmos_data = [];
88+
for(var i = 0; i < 128; i++) {
89+
cmos_data[i] = this.cpu.get_cmos_data_byte(this.rtc, i);
90+
}
91+
state[1] = cmos_data;
92+
state[2] = this.cpu.get_rtc_time(this.rtc);
93+
state[3] = this.cpu.get_last_update(this.rtc);
94+
state[4] = this.cpu.get_next_interrupt(this.rtc);
95+
state[5] = this.cpu.get_next_interrupt_alarm(this.rtc);
96+
state[6] = this.cpu.get_periodic_interrupt(this.rtc);
97+
state[7] = this.cpu.get_periodic_interrupt_time(this.rtc);
98+
state[8] = this.cpu.get_cmos_a(this.rtc);
99+
state[9] = this.cpu.get_cmos_b(this.rtc);
100+
state[10] = this.cpu.get_cmos_c(this.rtc);
101+
state[11] = this.cpu.get_nmi_disabled(this.rtc);
102+
state[12] = this.cpu.get_update_interrupt(this.rtc);
103+
state[13] = this.cpu.get_update_interrupt_time(this.rtc);
104+
state[14] = this.cpu.get_cmos_diag_status(this.rtc);
87105

88106
return state;
89107
};
90108

91109
RTC.prototype.set_state = function(state)
92110
{
93-
this.rtc = state[0];
111+
this.cpu.set_cmos_index(this.rtc, state[0]);
112+
for(var i = 0; i < 128; i++) {
113+
this.cpu.set_cmos_data_byte(this.rtc, i, state[1][i]);
114+
}
115+
this.cpu.set_rtc_time(this.rtc, state[2]);
116+
this.cpu.set_last_update(this.rtc, state[3]);
117+
this.cpu.set_next_interrupt(this.rtc, state[4]);
118+
this.cpu.set_next_interrupt_alarm(this.rtc, state[5]);
119+
this.cpu.set_periodic_interrupt(this.rtc, state[6]);
120+
this.cpu.set_periodic_interrupt_time(this.rtc, state[7]);
121+
this.cpu.set_cmos_a(this.rtc, state[8]);
122+
this.cpu.set_cmos_b(this.rtc, state[9]);
123+
this.cpu.set_cmos_c(this.rtc, state[10]);
124+
this.cpu.set_nmi_disabled(this.rtc, state[11]);
125+
this.cpu.set_update_interrupt(this.rtc, state[12] || false);
126+
this.cpu.set_update_interrupt_time(this.rtc, state[13] || 0);
127+
this.cpu.set_cmos_diag_status(this.rtc, state[14] || 0);
94128
};
95129

96130
RTC.prototype.timer = function (time, legacy_mode) {

0 commit comments

Comments
 (0)