RTC irq flag

This commit is contained in:
copy 2014-02-23 23:32:41 +01:00
parent f9dd551448
commit 621671bf21

View file

@ -18,7 +18,9 @@ function RTC(dev, diskette_type, boot_order)
last_update = rtc_time,
// used for periodic interrupt
next_interrupt,
next_interrupt = 0,
cmos_c_was_read = true,
periodic_interrupt = false,
@ -27,20 +29,21 @@ function RTC(dev, diskette_type, boot_order)
var cmos_a = 0x26,
cmos_b = 2;
cmos_b = 2,
cmos_c = 0;
this.nmi_disabled = 0;
this.timer = function(time)
{
if(periodic_interrupt)
if(periodic_interrupt && cmos_c_was_read && next_interrupt < time)
{
while(next_interrupt < time)
{
next_interrupt += periodic_interrupt_time;
cmos_c_was_read = false;
pic.push_irq(8);
cmos_c |= 1 << 6;
pic.push_irq(8);
}
next_interrupt += periodic_interrupt_time *
Math.ceil((time - next_interrupt) / periodic_interrupt_time);
}
rtc_time += time - last_update;
@ -108,18 +111,20 @@ function RTC(dev, diskette_type, boot_order)
// post info
return 0;
case 0xC:
//dbg_log("cmos read from index " + h(index));
cmos_c_was_read = true;
// TODO:
// It is important to know that upon a IRQ 8, Status Register C
// will contain a bitmask telling which interrupt happened.
// What is important is that if register C is not read after an
// IRQ 8, then the interrupt will not happen again.
//dbg_log("cmos Ch read");
return 0;
dbg_log("cmos reg C read", LOG_RTC);
// Missing IRQF flag
//return cmos_b & 0x70;
return cmos_c;
case 0xF:
return 0;