OSDN Git Service

[VM][STATE] Apply New framework to some VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pv2000 / cmt.cpp
1 /*
2         CASIO PV-2000 Emulator 'EmuGaki'
3
4         Author : Takeda.Toshiya
5         Date   : 2006.08.18 -
6
7         [ cmt ]
8 */
9
10 #include "cmt.h"
11
12 void CMT::initialize()
13 {
14         fio = new FILEIO();
15         memset(buffer, 0, sizeof(buffer));
16         bufcnt = 0;
17         bit = 1;
18         start = 0;
19         play = rec = false;
20 }
21
22 void CMT::release()
23 {
24         close_tape();
25         delete fio;
26 }
27
28 void CMT::reset()
29 {
30         close_tape();
31 }
32
33 void CMT::write_io8(uint32_t addr, uint32_t data)
34 {
35         switch(addr & 0xff) {
36         case 0x00:
37                 // bit0 = motor, bit1 = rec, bit3 = play
38                 if(start == 0 && data == 3 && rec) {
39                         for(int i = 0; i < 60; i++) {
40                                 buffer[bufcnt] |= bit;
41                                 if(!(bit & 0x80)) {
42                                         bit <<= 1;
43                                 } else {
44                                         if(++bufcnt == BUFFER_SIZE) {
45                                                 fio->Fwrite(buffer, sizeof(buffer), 1);
46                                                 memset(buffer, 0, sizeof(buffer));
47                                                 bufcnt = 0;
48                                         }
49                                         bit = 1;
50                                 }
51                         }
52                 }
53                 start = data;
54                 break;
55         case 0x60:
56                 // bit0 = signal
57                 if((start & 0x3) == 0x3 && rec) {
58                         buffer[bufcnt] |= (data & 1) ? bit : 0;
59                         if(!(bit & 0x80)) {
60                                 bit <<= 1;
61                         } else {
62                                 if(++bufcnt == BUFFER_SIZE) {
63                                         fio->Fwrite(buffer, sizeof(buffer), 1);
64                                         memset(buffer, 0, sizeof(buffer));
65                                         bufcnt = 0;
66                                 }
67                                 bit = 1;
68                         }
69                 }
70                 break;
71         }
72 }
73
74 uint32_t CMT::read_io8(uint32_t addr)
75 {
76         // bit0 = signal
77         uint32_t val = 2;
78         if((start & 0x9) == 0x9 && play) {
79                 val |= (buffer[bufcnt] & bit ? 1 : 0);
80                 if(!(bit & 0x80)) {
81                         bit <<= 1;
82                 } else {
83                         if(++bufcnt == BUFFER_SIZE) {
84                                 memset(buffer, 0, sizeof(buffer));
85                                 fio->Fread(buffer, sizeof(buffer), 1);
86                                 bufcnt = 0;
87                         }
88                         bit = 1;
89                 }
90         }
91         return val;
92 }
93
94 void CMT::play_tape(const _TCHAR* file_path)
95 {
96         close_tape();
97         
98         if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
99                 // open for play
100                 fio->Fread(buffer, sizeof(buffer), 1);
101                 bufcnt = 0;
102                 bit = 1;
103                 play = true;
104         }
105 }
106
107 void CMT::rec_tape(const _TCHAR* file_path)
108 {
109         close_tape();
110         
111         if(fio->Fopen(file_path, FILEIO_WRITE_BINARY)) {
112                 // open for rec
113                 memset(buffer, 0, sizeof(buffer));
114                 bufcnt = 0;
115                 bit = 1;
116                 rec = true;
117         }
118 }
119
120 void CMT::close_tape()
121 {
122         // close file
123         if(rec && bufcnt) {
124                 fio->Fwrite(buffer, bufcnt, 1);
125         }
126         if(play || rec) {
127                 fio->Fclose();
128         }
129         play = rec = false;
130 }
131
132 #define STATE_VERSION   1
133
134 bool CMT::process_state(FILEIO* state_fio, bool loading)
135 {
136         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
137                 return false;
138         }
139         if(!state_fio->StateCheckInt32(this_device_id)) {
140                 return false;
141         }
142         state_fio->StateInt32(bufcnt);
143         state_fio->StateBuffer(buffer, sizeof(buffer), 1);
144         state_fio->StateBool(play);
145         state_fio->StateBool(rec);
146         state_fio->StateUint8(start);
147         state_fio->StateUint8(bit);
148         return true;
149 }