-/*\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;
+}
+
+}