OSDN Git Service

[VM] Add PC-8001/mk2/8801/mk2.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pv2000 / cmt.cpp
index dff900d..6117e09 100644 (file)
-/*\r
-       CASIO PV-2000 Emulator 'EmuGaki'\r
-\r
-       Author : Takeda.Toshiya\r
-       Date   : 2006.08.18 -\r
-\r
-       [ cmt ]\r
-*/\r
-\r
-#include "cmt.h"\r
-#include "../../fileio.h"\r
-\r
-void CMT::initialize()\r
-{\r
-       fio = new FILEIO();\r
-       memset(buffer, 0, sizeof(buffer));\r
-       bufcnt = 0;\r
-       bit = 1;\r
-       start = 0;\r
-       play = rec = false;\r
-}\r
-\r
-void CMT::release()\r
-{\r
-       close_tape();\r
-       delete fio;\r
-}\r
-\r
-void CMT::reset()\r
-{\r
-       close_tape();\r
-}\r
-\r
-void CMT::write_io8(uint32 addr, uint32 data)\r
-{\r
-       switch(addr & 0xff) {\r
-       case 0x00:\r
-               // bit0 = motor, bit1 = rec, bit3 = play\r
-               if(start == 0 && data == 3 && rec) {\r
-                       for(int i = 0; i < 60; i++) {\r
-                               buffer[bufcnt] |= bit;\r
-                               if(!(bit & 0x80)) {\r
-                                       bit <<= 1;\r
-                               } else {\r
-                                       if(++bufcnt == BUFFER_SIZE) {\r
-                                               fio->Fwrite(buffer, sizeof(buffer), 1);\r
-                                               memset(buffer, 0, sizeof(buffer));\r
-                                               bufcnt = 0;\r
-                                       }\r
-                                       bit = 1;\r
-                               }\r
-                       }\r
-               }\r
-               start = data;\r
-               break;\r
-       case 0x60:\r
-               // bit0 = signal\r
-               if((start & 0x3) == 0x3 && rec) {\r
-                       buffer[bufcnt] |= (data & 1) ? bit : 0;\r
-                       if(!(bit & 0x80)) {\r
-                               bit <<= 1;\r
-                       } else {\r
-                               if(++bufcnt == BUFFER_SIZE) {\r
-                                       fio->Fwrite(buffer, sizeof(buffer), 1);\r
-                                       memset(buffer, 0, sizeof(buffer));\r
-                                       bufcnt = 0;\r
-                               }\r
-                               bit = 1;\r
-                       }\r
-               }\r
-               break;\r
-       }\r
-}\r
-\r
-uint32 CMT::read_io8(uint32 addr)\r
-{\r
-       // bit0 = signal\r
-       uint32 val = 2;\r
-       if((start & 0x9) == 0x9 && play) {\r
-               val |= (buffer[bufcnt] & bit ? 1 : 0);\r
-               if(!(bit & 0x80)) {\r
-                       bit <<= 1;\r
-               } else {\r
-                       if(++bufcnt == BUFFER_SIZE) {\r
-                               memset(buffer, 0, sizeof(buffer));\r
-                               fio->Fread(buffer, sizeof(buffer), 1);\r
-                               bufcnt = 0;\r
-                       }\r
-                       bit = 1;\r
-               }\r
-       }\r
-       return val;\r
-}\r
-\r
-void CMT::play_tape(_TCHAR* file_path)\r
-{\r
-       close_tape();\r
-       \r
-       if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {\r
-               // open for play\r
-               fio->Fread(buffer, sizeof(buffer), 1);\r
-               bufcnt = 0;\r
-               bit = 1;\r
-               play = true;\r
-       }\r
-}\r
-\r
-void CMT::rec_tape(_TCHAR* file_path)\r
-{\r
-       close_tape();\r
-       \r
-       if(fio->Fopen(file_path, FILEIO_WRITE_BINARY)) {\r
-               // open for rec\r
-               memset(buffer, 0, sizeof(buffer));\r
-               bufcnt = 0;\r
-               bit = 1;\r
-               rec = true;\r
-       }\r
-}\r
-\r
-void CMT::close_tape()\r
-{\r
-       // close file\r
-       if(rec && bufcnt) {\r
-               fio->Fwrite(buffer, bufcnt, 1);\r
-       }\r
-       if(play || rec) {\r
-               fio->Fclose();\r
-       }\r
-       play = rec = false;\r
-}\r
-\r
-#define STATE_VERSION  1\r
-\r
-void CMT::save_state(FILEIO* state_fio)\r
-{\r
-       state_fio->FputUint32(STATE_VERSION);\r
-       state_fio->FputInt32(this_device_id);\r
-       \r
-       state_fio->FputInt32(bufcnt);\r
-       state_fio->Fwrite(buffer, sizeof(buffer), 1);\r
-       state_fio->FputBool(play);\r
-       state_fio->FputBool(rec);\r
-       state_fio->FputUint8(start);\r
-       state_fio->FputUint8(bit);\r
-}\r
-\r
-bool CMT::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
-       bufcnt = state_fio->FgetInt32();\r
-       state_fio->Fread(buffer, sizeof(buffer), 1);\r
-       play = state_fio->FgetBool();\r
-       rec = state_fio->FgetBool();\r
-       start = state_fio->FgetUint8();\r
-       bit = state_fio->FgetUint8();\r
-       return true;\r
-}\r
-\r
+/*
+       CASIO PV-2000 Emulator 'EmuGaki'
+
+       Author : Takeda.Toshiya
+       Date   : 2006.08.18 -
+
+       [ cmt ]
+*/
+
+#include "cmt.h"
+
+namespace PV2000 {
+
+void CMT::initialize()
+{
+       fio = new FILEIO();
+       memset(buffer, 0, sizeof(buffer));
+       bufcnt = 0;
+       bit = 1;
+       start = 0;
+       play = rec = false;
+}
+
+void CMT::release()
+{
+       close_tape();
+       delete fio;
+}
+
+void CMT::reset()
+{
+       close_tape();
+}
+
+void CMT::write_io8(uint32_t addr, uint32_t data)
+{
+       switch(addr & 0xff) {
+       case 0x00:
+               // bit0 = motor, bit1 = rec, bit3 = play
+               if(start == 0 && data == 3 && rec) {
+                       for(int i = 0; i < 60; i++) {
+                               buffer[bufcnt] |= bit;
+                               if(!(bit & 0x80)) {
+                                       bit <<= 1;
+                               } else {
+                                       if(++bufcnt == BUFFER_SIZE) {
+                                               fio->Fwrite(buffer, sizeof(buffer), 1);
+                                               memset(buffer, 0, sizeof(buffer));
+                                               bufcnt = 0;
+                                       }
+                                       bit = 1;
+                               }
+                       }
+               }
+               start = data;
+               break;
+       case 0x60:
+               // bit0 = signal
+               if((start & 0x3) == 0x3 && rec) {
+                       buffer[bufcnt] |= (data & 1) ? bit : 0;
+                       if(!(bit & 0x80)) {
+                               bit <<= 1;
+                       } else {
+                               if(++bufcnt == BUFFER_SIZE) {
+                                       fio->Fwrite(buffer, sizeof(buffer), 1);
+                                       memset(buffer, 0, sizeof(buffer));
+                                       bufcnt = 0;
+                               }
+                               bit = 1;
+                       }
+               }
+               break;
+       }
+}
+
+uint32_t CMT::read_io8(uint32_t addr)
+{
+       // bit0 = signal
+       uint32_t val = 2;
+       if((start & 0x9) == 0x9 && play) {
+               val |= (buffer[bufcnt] & bit ? 1 : 0);
+               if(!(bit & 0x80)) {
+                       bit <<= 1;
+               } else {
+                       if(++bufcnt == BUFFER_SIZE) {
+                               memset(buffer, 0, sizeof(buffer));
+                               fio->Fread(buffer, sizeof(buffer), 1);
+                               bufcnt = 0;
+                       }
+                       bit = 1;
+               }
+       }
+       return val;
+}
+
+void CMT::play_tape(const _TCHAR* file_path)
+{
+       close_tape();
+       
+       if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
+               // open for play
+               fio->Fread(buffer, sizeof(buffer), 1);
+               bufcnt = 0;
+               bit = 1;
+               play = true;
+       }
+}
+
+void CMT::rec_tape(const _TCHAR* file_path)
+{
+       close_tape();
+       
+       if(fio->Fopen(file_path, FILEIO_WRITE_BINARY)) {
+               // open for rec
+               memset(buffer, 0, sizeof(buffer));
+               bufcnt = 0;
+               bit = 1;
+               rec = true;
+       }
+}
+
+void CMT::close_tape()
+{
+       // close file
+       if(rec && bufcnt) {
+               fio->Fwrite(buffer, bufcnt, 1);
+       }
+       if(play || rec) {
+               fio->Fclose();
+       }
+       play = rec = false;
+}
+
+#define STATE_VERSION  1
+
+bool CMT::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->StateValue(bufcnt);
+       state_fio->StateArray(buffer, sizeof(buffer), 1);
+       state_fio->StateValue(play);
+       state_fio->StateValue(rec);
+       state_fio->StateValue(start);
+       state_fio->StateValue(bit);
+       return true;
+}
+
+}