OSDN Git Service

[VM][WIP] Pre-process to apply new state framework.Still not buildable.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pasopia / floppy.cpp
index 8a041ac..cf4bd54 100644 (file)
-/*\r
-       TOSHIBA PASOPIA Emulator 'EmuPIA'\r
-\r
-       Author : Takeda.Toshiya\r
-       Date   : 2012.03.01 -\r
-\r
-       [ floppy ]\r
-*/\r
-\r
-#include "floppy.h"\r
-#include "../upd765a.h"\r
-#include "../../fileio.h"\r
-\r
-void FLOPPY::initialize()\r
-{\r
-       intr = false;\r
-}\r
-\r
-void FLOPPY::write_io8(uint32 addr, uint32 data)\r
-{\r
-       if(!supported) {\r
-               // OA-BASIC without floppy drives\r
-               return;\r
-       }\r
-       \r
-       switch(addr & 0xff) {\r
-       case 0xe0:\r
-               // tc off\r
-               d_fdc->write_signal(SIG_UPD765A_TC, 0, 1);\r
-               break;\r
-       case 0xe2:\r
-               // tc on\r
-               d_fdc->write_signal(SIG_UPD765A_TC, 1, 1);\r
-               break;\r
-       case 0xe4:\r
-       case 0xe5:\r
-               d_fdc->write_io8(addr, data);\r
-               break;\r
-       case 0xe6:\r
-               // fdc reset\r
-               if(data & 0x80) {\r
-                       d_fdc->reset();\r
-               }\r
-               // motor on/off\r
-               d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x40);\r
-               break;\r
-       }\r
-}\r
-\r
-uint32 FLOPPY::read_io8(uint32 addr)\r
-{\r
-       if(!supported) {\r
-               // OA-BASIC without floppy drives\r
-               return 0xff;\r
-       }\r
-       \r
-       switch(addr & 0xff) {\r
-       case 0xe4:\r
-       case 0xe5:\r
-               return d_fdc->read_io8(addr);\r
-       case 0xe6:\r
-               // fdc intr\r
-               return intr ? 0x80 : 0;\r
-       }\r
-       return 0xff;\r
-}\r
-\r
-void FLOPPY::write_signal(int id, uint32 data, uint32 mask)\r
-{\r
-       if(id == SIG_FLOPPY_INTR) {\r
-               intr = ((data & mask) != 0);\r
-       }\r
-}\r
-\r
-#define STATE_VERSION  1\r
-\r
-void FLOPPY::save_state(FILEIO* state_fio)\r
-{\r
-       state_fio->FputUint32(STATE_VERSION);\r
-       state_fio->FputInt32(this_device_id);\r
-       \r
-       state_fio->FputBool(intr);\r
-       state_fio->FputBool(supported);\r
-}\r
-\r
-bool FLOPPY::load_state(FILEIO* state_fio)\r
-{\r
-       if(state_fio->FgetUint32() != STATE_VERSION) {\r
-               return false;\r
-       }\r
-       if(state_fio->FgetInt32() != this_device_id) {\r
-               return false;\r
-       }\r
-       intr = state_fio->FgetBool();\r
-       supported = state_fio->FgetBool();\r
-       return true;\r
-}\r
-\r
+/*
+       TOSHIBA PASOPIA Emulator 'EmuPIA'
+
+       Author : Takeda.Toshiya
+       Date   : 2012.03.01 -
+
+       [ floppy ]
+*/
+
+#include "floppy.h"
+#include "../upd765a.h"
+
+void FLOPPY::initialize()
+{
+       intr = false;
+}
+
+void FLOPPY::write_io8(uint32_t addr, uint32_t data)
+{
+       if(!supported) {
+               // OA-BASIC without floppy drives
+               return;
+       }
+       
+       switch(addr & 0xff) {
+       case 0xe0:
+               // tc off
+               d_fdc->write_signal(SIG_UPD765A_TC, 0, 1);
+               break;
+       case 0xe2:
+               // tc on
+               d_fdc->write_signal(SIG_UPD765A_TC, 1, 1);
+               break;
+       case 0xe4:
+       case 0xe5:
+               d_fdc->write_io8(addr, data);
+               break;
+       case 0xe6:
+               // fdc reset
+               if(data & 0x80) {
+                       d_fdc->reset();
+               }
+               // motor on/off
+               d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x40);
+               break;
+       }
+}
+
+uint32_t FLOPPY::read_io8(uint32_t addr)
+{
+       if(!supported) {
+               // OA-BASIC without floppy drives
+               return 0xff;
+       }
+       
+       switch(addr & 0xff) {
+       case 0xe4:
+       case 0xe5:
+               return d_fdc->read_io8(addr);
+       case 0xe6:
+               // fdc intr
+               return intr ? 0x80 : 0;
+       }
+       return 0xff;
+}
+
+void FLOPPY::write_signal(int id, uint32_t data, uint32_t mask)
+{
+       if(id == SIG_FLOPPY_INTR) {
+               intr = ((data & mask) != 0);
+       }
+}
+
+#define STATE_VERSION  1
+
+#include "../../statesub.h"
+
+void FLOPPY::decl_state()
+{
+       enter_decl_state(STATE_VERSION);
+
+       DECL_STATE_ENTRY_BOOL(intr);
+       DECL_STATE_ENTRY_BOOL(supported);
+       
+       leave_decl_state();
+}
+
+void FLOPPY::save_state(FILEIO* state_fio)
+{
+       if(state_entry != NULL) {
+               state_entry->save_state(state_fio);
+       }
+//     state_fio->FputUint32(STATE_VERSION);
+//     state_fio->FputInt32(this_device_id);
+       
+//     state_fio->FputBool(intr);
+//     state_fio->FputBool(supported);
+}
+
+bool FLOPPY::load_state(FILEIO* state_fio)
+{
+       bool mb = false;
+       if(state_entry != NULL) {
+               mb = state_entry->load_state(state_fio);
+       }
+       if(!mb) {
+               return false;
+       }
+//     if(state_fio->FgetUint32() != STATE_VERSION) {
+//             return false;
+//     }
+//     if(state_fio->FgetInt32() != this_device_id) {
+//             return false;
+//     }
+//     intr = state_fio->FgetBool();
+//     supported = state_fio->FgetBool();
+       return true;
+}
+
+bool FLOPPY::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->StateBool(intr);
+       state_fio->StateBool(supported);
+       return true;
+}