void fmtimer_setreg(UINT reg, REG8 value) { // TRACEOUT(("fm %x %x [%.4x:%.4x]", reg, value, CPU_CS, CPU_IP)); switch(reg) { case 0x24: fmtimer.timera = (value << 2) + (fmtimer.timera & 3); break; case 0x25: fmtimer.timera = (fmtimer.timera & 0x3fc) + (value & 3); break; case 0x26: fmtimer.timerb = value; break; case 0x27: fmtimer.reg = value; fmtimer.status &= ~((value & 0x30) >> 4); if (value & 0x01) { if (!nevent_iswork(NEVENT_FMTIMERA)) { set_fmtimeraevent(NEVENT_ABSOLUTE); } } else { nevent_reset(NEVENT_FMTIMERA); } if (value & 0x02) { if (!nevent_iswork(NEVENT_FMTIMERB)) { set_fmtimerbevent(NEVENT_ABSOLUTE); } } else { nevent_reset(NEVENT_FMTIMERB); } if (!(value & 0x03)) { pic_resetirq(fmtimer.irq); } break; } }
void S98_close(void) { if (s98log.fh != FILEH_INVALID) { S98_putint(); S98_putc(0xFD); /* END MARK */ S98_flush(); nevent_reset(NEVENT_S98TIMER); file_close(s98log.fh); s98log.fh = FILEH_INVALID; } }
void nevent_set(UINT id, SINT32 eventclock, NEVENTCB proc, BOOL absolute) { SINT32 clock; NEVENTITEM item; UINT eventid; UINT i; // TRACEOUT(("event %d - %xclocks", id, eventclock)); clock = CPU_BASECLOCK - CPU_REMCLOCK; item = &nevent.item[id]; item->proc = proc; item->flag = 0; if (absolute) { item->clock = eventclock + clock; } else { item->clock += eventclock; } #if 0 if (item->clock < clock) { item->clock = clock; } #endif // イベントの削除 nevent_reset(id); // イベントの挿入位置の検索 for (eventid=0; eventid<nevent.readyevents; eventid++) { if (item->clock < nevent.item[nevent.level[eventid]].clock) { break; } } // イベントの挿入 for (i=nevent.readyevents; i>eventid; i--) { nevent.level[i] = nevent.level[i-1]; } nevent.level[eventid] = id; nevent.readyevents++; // もし最短イベントだったら... if (eventid == 0) { clock = CPU_BASECLOCK - item->clock; CPU_BASECLOCK -= clock; CPU_REMCLOCK -= clock; // TRACEOUT(("reset nextbase -%d (%d)", clock, CPU_REMCLOCK)); } }
void fddmtr_reset(void) { fddmtr.busy = 0; nevent_reset(NEVENT_FDBIOSBUSY); }