2 SHARP MZ-80B Emulator 'EmuZ-80B'
3 SHARP MZ-2200 Emulator 'EmuZ-2200'
4 SHARP MZ-2500 Emulator 'EmuZ-2500'
6 Author : Takeda.Toshiya
13 #include "../datarec.h"
24 #define PERIOD_IPL_SIGNAL 100
25 //#define PERIOD_CMT_SIGNAL 300000
26 #define PERIOD_CMT_SIGNAL 1000
30 void CMT::initialize()
34 now_play = now_rewind = false;
39 register_id_frew = -1;
40 register_id_ffwd = -1;
42 register_id_stop = -1;
43 register_id_eject = -1;
45 register_id_apss = -1;
52 void CMT::fast_forward()
55 d_drec->set_ff_rew(1);
56 d_drec->set_remote(true);
58 now_play = now_rewind = false;
61 void CMT::fast_rewind()
64 d_drec->set_ff_rew(-1);
65 d_drec->set_remote(true);
74 d_drec->set_ff_rew(0);
75 d_drec->set_remote(true);
77 now_play = (play || rec);
84 d_drec->set_remote(false);
86 now_play = now_rewind = false;
87 d_pio->write_signal(SIG_I8255_PORT_B, 0, 0x40);
90 void CMT::write_signal(int id, uint32_t data, uint32_t mask)
92 if(id == SIG_CMT_PIO_PA) {
94 if((pa & 1) && !(data & 1)) {
96 now_apss = ((pa & 0x80) == 0);
97 // register_event(this, EVENT_FREW, PERIOD_CMT_SIGNAL, false, ®ister_id_frew);
98 // now_apss_tmp = ((pa & 0x80) == 0);
99 // } else if(!(pa & 1) && (data & 1)) {
100 // if(register_id_frew != -1) {
101 // cancel_event(this, register_id_frew);
102 // register_id_frew = -1;
105 if((pa & 2) && !(data & 2)) {
107 now_apss = ((pa & 0x80) == 0);
108 // register_event(this, EVENT_FFWD, PERIOD_CMT_SIGNAL, false, ®ister_id_ffwd);
109 // now_apss_tmp = ((pa & 0x80) == 0);
110 // } else if(!(pa & 2) && (data & 2)) {
111 // if(register_id_ffwd != -1) {
112 // cancel_event(this, register_id_ffwd);
113 // register_id_ffwd = -1;
116 if((pa & 4) && !(data & 4)) {
119 // register_event(this, EVENT_FWD, PERIOD_CMT_SIGNAL, false, ®ister_id_fwd);
120 // } else if(!(pa & 4) && (data & 4)) {
121 // if(register_id_fwd != -1) {
122 // cancel_event(this, register_id_fwd);
123 // register_id_fwd = -1;
126 if((pa & 8) && !(data & 8)) {
129 if(register_id_apss != -1) {
130 cancel_event(this, register_id_apss);
131 register_id_apss = -1;
134 // register_event(this, EVENT_STOP, PERIOD_CMT_SIGNAL, false, ®ister_id_stop);
135 // } else if(!(pa & 8) && (data & 8)) {
136 // if(register_id_stop != -1) {
137 // cancel_event(this, register_id_stop);
138 // register_id_stop = -1;
142 if(!(pa & 1) && (data & 1)) {
145 // register_event(this, EVENT_FFWD, PERIOD_CMT_SIGNAL, false, ®ister_id_ffwd);
148 // register_event(this, EVENT_FREW, PERIOD_CMT_SIGNAL, false, ®ister_id_frew);
150 // } else if((pa & 1) && !(data & 1)) {
151 // if(register_id_ffwd != -1) {
152 // cancel_event(this, register_id_ffwd);
153 // register_id_ffwd = -1;
155 // if(register_id_frew != -1) {
156 // cancel_event(this, register_id_frew);
157 // register_id_frew = -1;
160 if(!(pa & 4) && (data & 4)) {
162 // register_event(this, EVENT_FWD, PERIOD_CMT_SIGNAL, false, ®ister_id_fwd);
163 // } else if((pa & 4) && !(data & 4)) {
164 // if(register_id_fwd != -1) {
165 // cancel_event(this, register_id_fwd);
166 // register_id_fwd = -1;
169 if(!(pa & 8) && (data & 8)) {
171 // register_event(this, EVENT_STOP, PERIOD_CMT_SIGNAL, false, ®ister_id_stop);
172 // } else if((pa & 8) && !(data & 8)) {
173 // if(register_id_stop != -1) {
174 // cancel_event(this, register_id_stop);
175 // register_id_stop = -1;
180 } else if(id == SIG_CMT_PIO_PC) {
181 if(!(pc & 2) && (data & 2)) {
185 if(!(pc & 8) && (data & 8)) {
189 if((pc & 8) && !(data & 8)) {
190 register_event(this, EVENT_IPL, PERIOD_IPL_SIGNAL, false, ®ister_id_ipl);
191 } else if(!(pc & 8) && (data & 8)) {
192 if(register_id_ipl != -1) {
193 cancel_event(this, register_id_ipl);
194 register_id_ipl = -1;
198 if((pc & 0x10) && !(data & 0x10)) {
199 register_event(this, EVENT_EJECT, PERIOD_CMT_SIGNAL, false, ®ister_id_eject);
200 } else if(!(pc & 0x10) && (data & 0x10)) {
201 if(register_id_eject != -1) {
202 cancel_event(this, register_id_eject);
203 register_id_eject = -1;
206 d_drec->write_signal(SIG_DATAREC_MIC, data, 0x80);
208 } else if(id == SIG_CMT_OUT) {
211 if((data & mask) && register_id_apss == -1) {
212 register_event(this, EVENT_APSS, 350000, false, ®ister_id_apss);
213 d_pio->write_signal(SIG_I8255_PORT_B, 0x40, 0x40);
218 d_pio->write_signal(SIG_I8255_PORT_B, (data & mask) ? 0x40 : 0, 0x40);
220 } else if(id == SIG_CMT_REMOTE) {
221 d_pio->write_signal(SIG_I8255_PORT_B, (data & mask) ? 0 : 8, 8);
222 } else if(id == SIG_CMT_END) {
223 if((data & mask) && now_play) {
231 } else if(id == SIG_CMT_TOP) {
232 if((data & mask) && now_rewind) {
243 void CMT::event_callback(int event_id, int err)
245 if(event_id == EVENT_FREW) {
248 now_apss = now_apss_tmp;
250 register_id_frew = -1;
251 } else if(event_id == EVENT_FFWD) {
254 now_apss = now_apss_tmp;
256 register_id_ffwd = -1;
257 } else if(event_id == EVENT_FWD) {
260 // if(register_id_apss != -1) {
261 // cancel_event(this, register_id_apss);
262 // register_id_apss = -1;
266 register_id_fwd = -1;
267 } else if(event_id == EVENT_STOP) {
270 if(register_id_apss != -1) {
271 cancel_event(this, register_id_apss);
272 register_id_apss = -1;
276 register_id_stop = -1;
277 } else if(event_id == EVENT_EJECT) {
279 register_id_eject = -1;
281 } else if(event_id == EVENT_APSS) {
282 d_pio->write_signal(SIG_I8255_PORT_B, 0, 0x40);
283 register_id_apss = -1;
285 } else if(event_id == EVENT_IPL) {
287 register_id_ipl = -1;
291 void CMT::play_tape(bool value)
295 d_pio->write_signal(SIG_I8255_PORT_B, play ? 0x10 : 0x30, 0x30);
298 void CMT::rec_tape(bool value)
302 d_pio->write_signal(SIG_I8255_PORT_B, rec ? 0 : 0x30, 0x30);
305 void CMT::close_tape()
308 now_play = now_rewind = false;
309 d_pio->write_signal(SIG_I8255_PORT_B, 0x30, 0x30);
310 d_pio->write_signal(SIG_I8255_PORT_B, 0, 0x40);
313 if(register_id_apss != -1) {
314 cancel_event(this, register_id_apss);
315 register_id_apss = -1;
320 #define STATE_VERSION 1
322 bool CMT::process_state(FILEIO* state_fio, bool loading)
324 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
327 if(!state_fio->StateCheckInt32(this_device_id)) {
330 state_fio->StateUint8(pa);
331 state_fio->StateUint8(pc);
332 state_fio->StateBool(play);
333 state_fio->StateBool(rec);
334 state_fio->StateBool(now_play);
335 state_fio->StateBool(now_rewind);
336 state_fio->StateInt32(register_id_frew);
337 state_fio->StateInt32(register_id_ffwd);
338 state_fio->StateInt32(register_id_fwd);
339 state_fio->StateInt32(register_id_stop);
340 state_fio->StateInt32(register_id_eject);
342 state_fio->StateInt32(register_id_apss);
343 state_fio->StateBool(now_apss);
344 state_fio->StateBool(now_apss_tmp);
346 state_fio->StateInt32(register_id_ipl);