case 0x02: /* Timer hooked to PC-Speaker */
// LOG(LOG_PIT,"PIT 2 Timer at %.3g Hz mode %d",PIT_TICK_RATE/(double)p->cntr,p->mode);
// PCSPEAKER_SetCounter(p->cntr,p->mode);
- break;
+ // HACK. A1060 bios hardware diagnostics reads latch with timer gate 2 disabled
+ // and expects original written value.
+ if (!gate2)
+ p->read_latch = p->write_latch;
+ break;
default:
LOG(LOG_PIT,LOG_ERROR)("PIT:Illegal timer selected for writing");
}
}
}
+bool TIMER_GetGate2(void)
+{
+ if (!gate2) {
+ return true;
+ }
+ return false;
+}
+
void TIMER_SetGate2(bool in) {
//No changes if gate doesn't change
if(gate2 == in) return;
void PIC_Destroy(Section* sec);
void TIMER_Destroy(Section*);
void TIMER_Init(Section* sec);
+void TIMER_SetGate2(bool);
+bool TIMER_GetGate2(void);
static Section_prop *dosbox_sec;
Bitu x86_in_keyboard(Bitu port);
void x86_out_keyboard(Bitu port, Bitu val);
if (xb->type >= TYPE_2286) {
x86_out_keyboard(0x61, v);
} else {
+ if (xb->dosbox_cpu) {
+ TIMER_SetGate2(v & 1);
+ }
aio = 0x5f;
}
break;
}
}
v &= ~0x20;
- if (!(xb->amiga_io[0x5f] & 1) && i8253.active[2])
- v |= 0x20;
+ if (!(xb->amiga_io[0x5f] & 1)) {
+ bool timer2 = false;
+ if (xb->dosbox_cpu) {
+ timer2 = TIMER_GetGate2();
+ } else {
+ timer2 = i8253.active[2] != 0;
+ }
+ if (timer2)
+ v |= 0x20;
+ }
//write_log(_T("IN Port C %02x\n"), v);
}
break;