2 NEC PC-6001 Emulator 'yaPC-6001'
3 NEC PC-6001mkII Emulator 'yaPC-6201'
4 NEC PC-6001mkIISR Emulator 'yaPC-6401'
5 NEC PC-6601 Emulator 'yaPC-6601'
6 NEC PC-6601SR Emulator 'yaPC-6801'
8 Author : Takeda.Toshiya
23 void TIMER::initialize()
25 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
26 memset(sr_vectors, 0, sizeof(sr_vectors));
40 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
51 void TIMER::write_io8(uint32_t addr, uint32_t data)
54 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
63 sr_vectors[addr & 7] = data;
68 // d_mem->set_portF3(data);
82 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
93 uint32_t TIMER::read_io8(uint32_t addr)
96 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
105 return sr_vectors[addr & 7];
117 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
128 void TIMER::event_callback(int event_id, int err)
130 if(event_id == EVENT_TIMER) {
131 write_signal(SIG_TIMER_IRQ_TIMER, 1, 1);
133 // register next event
135 register_event(this, EVENT_TIMER, 2000.0, false, &timer_id);
137 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
138 if(static_cast<VM *>(vm)->sr_mode) {
139 register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 0x80, false, &timer_id);
142 register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 4, false, &timer_id);
147 void TIMER::set_portB0(uint32_t data)
152 cancel_event(this, timer_id);
159 // first period is 1msec
160 register_event(this, EVENT_TIMER, 1000.0, false, &timer_id);
162 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
163 if(static_cast<VM *>(vm)->sr_mode) {
164 register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 0x80, false, &timer_id);
167 register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 4, false, &timer_id);
173 void TIMER::write_signal(int id, uint32_t data, uint32_t mask)
183 uint32_t TIMER::get_intr_ack()
185 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
186 if(static_cast<VM *>(vm)->sr_mode) {
187 for(int i = 0, bit = 1; i < 8; i++, bit <<= 1) {
191 return sr_vectors[i];
198 if(NewIRQ & 0x01) { // Sub-CPU
205 return d_sub->get_intr_ack();
208 else if(NewIRQ & 0x02) { // Joystick
216 else if(NewIRQ & 0x04) { // Timer
225 else if(NewIRQ & 0x08) { // Voice
229 else if(NewIRQ & 0x10) { // VRTC
233 else if(NewIRQ & 0x20) { // RS-232C
237 else if(NewIRQ & 0x40) { // Printer
241 else if(NewIRQ & 0x80) { // Ext Int
246 return 0x06; // dummy
249 void TIMER::notify_intr_reti()
254 void TIMER::update_intr()
258 NewIRQ &= 0x05; // Only Sub-CPU and Timer
260 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
261 if(static_cast<VM *>(vm)->sr_mode) {
278 d_cpu->write_signal(SIG_CPU_IRQ, 1, 1);
280 // d_cpu->write_signal(SIG_CPU_IRQ, 0, 1);
284 #define STATE_VERSION 1
286 bool TIMER::process_state(FILEIO* state_fio, bool loading)
288 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
291 if(!state_fio->StateCheckInt32(this_device_id)) {
294 state_fio->StateUint8(IRQ);
295 state_fio->StateUint8(NewIRQ);
296 state_fio->StateInt32(timer_id);
298 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
299 state_fio->StateBuffer(sr_vectors, sizeof(sr_vectors), 1);
300 state_fio->StateUint8(portFA);
301 state_fio->StateUint8(portFB);
303 state_fio->StateUint8(portF3);
304 state_fio->StateUint8(portF4);
305 state_fio->StateUint8(portF5);
306 state_fio->StateUint8(portF6);
307 state_fio->StateUint8(portF7);