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
21 void TIMER::initialize()
23 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
24 memset(sr_vectors, 0, sizeof(sr_vectors));
38 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
49 void TIMER::write_io8(uint32_t addr, uint32_t data)
52 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
61 sr_vectors[addr & 7] = data;
66 // d_mem->set_portF3(data);
80 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
91 uint32_t TIMER::read_io8(uint32_t addr)
94 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
103 return sr_vectors[addr & 7];
115 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
126 void TIMER::event_callback(int event_id, int err)
128 if(event_id == EVENT_TIMER) {
129 write_signal(SIG_TIMER_IRQ_TIMER, 1, 1);
131 // register next event
133 register_event(this, EVENT_TIMER, 2000.0, false, &timer_id);
135 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
136 if(static_cast<VM *>(vm)->sr_mode) {
137 register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 0x80, false, &timer_id);
140 register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 4, false, &timer_id);
145 void TIMER::set_portB0(uint32_t data)
150 cancel_event(this, timer_id);
157 // first period is 1msec
158 register_event(this, EVENT_TIMER, 1000.0, false, &timer_id);
160 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
161 if(static_cast<VM *>(vm)->sr_mode) {
162 register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 0x80, false, &timer_id);
165 register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 4, false, &timer_id);
171 void TIMER::write_signal(int id, uint32_t data, uint32_t mask)
181 uint32_t TIMER::get_intr_ack()
183 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
184 if(static_cast<VM *>(vm)->sr_mode) {
185 for(int i = 0, bit = 1; i < 8; i++, bit <<= 1) {
189 return sr_vectors[i];
196 if(NewIRQ & 0x01) { // Sub-CPU
203 return d_sub->get_intr_ack();
206 else if(NewIRQ & 0x02) { // Joystick
214 else if(NewIRQ & 0x04) { // Timer
223 else if(NewIRQ & 0x08) { // Voice
227 else if(NewIRQ & 0x10) { // VRTC
231 else if(NewIRQ & 0x20) { // RS-232C
235 else if(NewIRQ & 0x40) { // Printer
239 else if(NewIRQ & 0x80) { // Ext Int
244 return 0x06; // dummy
247 void TIMER::notify_intr_reti()
252 void TIMER::update_intr()
256 NewIRQ &= 0x05; // Only Sub-CPU and Timer
258 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
259 if(static_cast<VM *>(vm)->sr_mode) {
276 d_cpu->write_signal(SIG_CPU_IRQ, 1, 1);
278 // d_cpu->write_signal(SIG_CPU_IRQ, 0, 1);
282 #define STATE_VERSION 1
284 bool TIMER::process_state(FILEIO* state_fio, bool loading)
286 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
289 if(!state_fio->StateCheckInt32(this_device_id)) {
292 state_fio->StateUint8(IRQ);
293 state_fio->StateUint8(NewIRQ);
294 state_fio->StateInt32(timer_id);
296 #if defined(_PC6601SR) || defined(_PC6001MK2SR)
297 state_fio->StateBuffer(sr_vectors, sizeof(sr_vectors), 1);
298 state_fio->StateUint8(portFA);
299 state_fio->StateUint8(portFB);
301 state_fio->StateUint8(portF3);
302 state_fio->StateUint8(portF4);
303 state_fio->StateUint8(portF5);
304 state_fio->StateUint8(portF6);
305 state_fio->StateUint8(portF7);