// Called externally from debug.cpp void ForceEventUpdates(const uint32 timestamp) { next_king_ts = KING_Update(timestamp); next_pad_ts = FXINPUT_Update(timestamp); next_timer_ts = FXTIMER_Update(timestamp); next_adpcm_ts = SoundBox_ADPCMUpdate(timestamp); //printf("Meow: %d\n", CalcNextTS()); PCFX_V810.SetEventNT(CalcNextTS()); //printf("FEU: %d %d %d %d\n", next_pad_ts, next_timer_ts, next_adpcm_ts, next_king_ts); }
uint16 FXTIMER_Read16(uint32 A, const v810_timestamp_t timestamp) { FXTIMER_Update(timestamp); switch(A & 0xFC0) { default: return(0); case 0xF00: return(control); case 0xF80: return(period); case 0xFC0: return((counter + 14) / 15); } return(0); }
int32 MDFN_FASTCALL pcfx_event_handler(const v810_timestamp_t timestamp) { if(timestamp >= next_king_ts) next_king_ts = KING_Update(timestamp); if(timestamp >= next_pad_ts) next_pad_ts = FXINPUT_Update(timestamp); if(timestamp >= next_timer_ts) next_timer_ts = FXTIMER_Update(timestamp); if(timestamp >= next_adpcm_ts) next_adpcm_ts = SoundBox_ADPCMUpdate(timestamp); #if 1 assert(next_king_ts > timestamp); assert(next_pad_ts > timestamp); assert(next_timer_ts > timestamp); assert(next_adpcm_ts > timestamp); #endif return(CalcNextTS()); }
void FXTIMER_Write16(uint32 A, uint16 V, const v810_timestamp_t timestamp) { FXTIMER_Update(timestamp); switch(A & 0xFC0) { default: break; case 0xF00: if(!(control & 0x2) && (V & 0x2)) counter = EFF_PERIOD; control = V & 0x7; if(V & 0x4) FXDBG("Timer control write with D2 set?"); PCFXIRQ_Assert(PCFXIRQ_SOURCE_TIMER, (bool)(control & 0x4)); PCFX_SetEvent(PCFX_EVENT_TIMER, CalcNextEventTS(timestamp)); break; case 0xF80: period = V; PCFX_SetEvent(PCFX_EVENT_TIMER, CalcNextEventTS(timestamp)); break; } }
uint8 FXTIMER_Read8(uint32 A, const v810_timestamp_t timestamp) { FXTIMER_Update(timestamp); return(FXTIMER_Read16(A&~1, timestamp) >> ((A & 1) * 8)); }