#include "timer.h"
#ifndef _PC6001
-#include "memory.h"
+#include "./memory.h"
#endif
#define EVENT_TIMER 0
+namespace PC6001 {
+
void TIMER::initialize()
{
#if defined(_PC6601SR) || defined(_PC6001MK2SR)
}
#ifndef _PC6001
-void TIMER::write_io8(uint32 addr, uint32 data)
+void TIMER::write_io8(uint32_t addr, uint32_t data)
{
switch(addr & 0xff) {
#if defined(_PC6601SR) || defined(_PC6001MK2SR)
}
}
-uint32 TIMER::read_io8(uint32 addr)
+uint32_t TIMER::read_io8(uint32_t addr)
{
switch(addr & 0xff) {
#if defined(_PC6601SR) || defined(_PC6001MK2SR)
register_event(this, EVENT_TIMER, 2000.0, false, &timer_id);
#else
#if defined(_PC6601SR) || defined(_PC6001MK2SR)
- if(vm->sr_mode) {
+ if(static_cast<VM *>(vm)->sr_mode) {
register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 0x80, false, &timer_id);
} else
#endif
}
}
-void TIMER::set_portB0(uint32 data)
+void TIMER::set_portB0(uint32_t data)
{
if(data & 1) {
// stop
register_event(this, EVENT_TIMER, 1000.0, false, &timer_id);
#else
#if defined(_PC6601SR) || defined(_PC6001MK2SR)
- if(vm->sr_mode) {
+ if(static_cast<VM *>(vm)->sr_mode) {
register_event(this, EVENT_TIMER, 2000.0 * (portF6 + 1) / 0x80, false, &timer_id);
} else
#endif
}
}
-void TIMER::write_signal(int id, uint32 data, uint32 mask)
+void TIMER::write_signal(int id, uint32_t data, uint32_t mask)
{
if(data & mask) {
IRQ |= (1 << id);
update_intr();
}
-uint32 TIMER::intr_ack()
+uint32_t TIMER::get_intr_ack()
{
#if defined(_PC6601SR) || defined(_PC6001MK2SR)
- if(vm->sr_mode) {
+ if(static_cast<VM *>(vm)->sr_mode) {
for(int i = 0, bit = 1; i < 8; i++, bit <<= 1) {
if(NewIRQ & bit) {
if(portFB & bit) {
return portF4;
}
#endif
- return d_sub->intr_ack();
+ return d_sub->get_intr_ack();
}
#ifndef _PC6001
else if(NewIRQ & 0x02) { // Joystick
return 0x06; // dummy
}
-void TIMER::intr_reti()
+void TIMER::notify_intr_reti()
{
update_intr();
}
NewIRQ &= 0x05; // Only Sub-CPU and Timer
#else
#if defined(_PC6601SR) || defined(_PC6001MK2SR)
- if(vm->sr_mode) {
+ if(static_cast<VM *>(vm)->sr_mode) {
NewIRQ &= ~portFA;
} else
#endif
}
}
+#define STATE_VERSION 1
+
+bool TIMER::process_state(FILEIO* state_fio, bool loading)
+{
+ if(!state_fio->StateCheckUint32(STATE_VERSION)) {
+ return false;
+ }
+ if(!state_fio->StateCheckInt32(this_device_id)) {
+ return false;
+ }
+ state_fio->StateUint8(IRQ);
+ state_fio->StateUint8(NewIRQ);
+ state_fio->StateInt32(timer_id);
+#ifndef _PC6001
+#if defined(_PC6601SR) || defined(_PC6001MK2SR)
+ state_fio->StateBuffer(sr_vectors, sizeof(sr_vectors), 1);
+ state_fio->StateUint8(portFA);
+ state_fio->StateUint8(portFB);
+#endif
+ state_fio->StateUint8(portF3);
+ state_fio->StateUint8(portF4);
+ state_fio->StateUint8(portF5);
+ state_fio->StateUint8(portF6);
+ state_fio->StateUint8(portF7);
+#endif
+ return true;
+}
+
+}
+