2 FUJITSU FMR-50 Emulator 'eFMR-50'
3 FUJITSU FMR-60 Emulator 'eFMR-60'
5 Author : Takeda.Toshiya
13 #include "../msm58321.h"
14 #include "../pcm1bit.h"
18 void TIMER::initialize()
21 intr_reg = rtc_data = 0;
22 tmout0 = tmout1 = false;
25 void TIMER::write_io8(uint32_t addr, uint32_t data)
34 d_pcm->write_signal(SIG_PCM1BIT_ON, data, 4);
37 d_rtc->write_signal(SIG_MSM58321_DATA, data, 0x0f);
40 d_rtc->write_signal(SIG_MSM58321_CS, data, 0x80);
41 d_rtc->write_signal(SIG_MSM58321_READ, data, 0x04);
42 d_rtc->write_signal(SIG_MSM58321_WRITE, data, 0x02);
43 d_rtc->write_signal(SIG_MSM58321_ADDR_WRITE, data, 0x01);
48 uint32_t TIMER::read_io8(uint32_t addr)
52 free_run_counter = (uint16_t)get_passed_usec(0);
53 return free_run_counter & 0xff;
55 return free_run_counter >> 8;
57 return (tmout0 ? 1 : 0) | (tmout1 ? 2 : 0) | ((intr_reg & 7) << 2) | 0xe0;
64 void TIMER::write_signal(int id, uint32_t data, uint32_t mask)
66 if(id == SIG_TIMER_CH0) {
71 } else if(id == SIG_TIMER_CH1) {
72 tmout1 = ((data & mask) != 0);
74 } else if(id == SIG_TIMER_RTC) {
75 rtc_data = (data & mask) | (rtc_data & ~mask);
79 void TIMER::update_intr()
81 if((tmout0 && (intr_reg & 1)) || (tmout1 && (intr_reg & 2))) {
82 d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR0, 1, 1);
84 d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR0, 0, 1);
88 #define STATE_VERSION 1
90 bool TIMER::process_state(FILEIO* state_fio, bool loading)
92 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
95 if(!state_fio->StateCheckInt32(this_device_id)) {
98 state_fio->StateUint16(free_run_counter);
99 state_fio->StateUint8(intr_reg);
100 state_fio->StateUint8(rtc_data);
101 state_fio->StateBool(tmout0);
102 state_fio->StateBool(tmout1);