2 Systems Formulate BUBCOM80 Emulator 'eBUBCOM80'
4 Author : Takeda.Toshiya
11 #include "../mc6850.h"
14 void CMT::initialize()
17 play = rec = remote = false;
29 play = rec = remote = false;
32 void CMT::write_signal(int id, uint32_t data, uint32_t mask)
34 if(id == SIG_CMT_REMOTE) {
35 remote = ((data & mask) != 0);
36 } else if(id == SIG_CMT_OUT) {
39 buffer[bufcnt++] = data & mask;
40 if(bufcnt >= BUFFER_SIZE) {
41 fio->Fwrite(buffer, bufcnt, 1);
48 void CMT::play_tape(const _TCHAR* file_path)
52 if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
53 fio->Fseek(0, FILEIO_SEEK_END);
54 int size = (fio->Ftell() + 9) & (BUFFER_SIZE - 1);
55 fio->Fseek(0, FILEIO_SEEK_SET);
56 memset(buffer, 0, sizeof(buffer));
57 fio->Fread(buffer, sizeof(buffer), 1);
61 // this implement does not care the sio buffer size... :-(
62 for(int i = 0; i < size; i++) {
63 d_sio->write_signal(SIG_MC6850_RECV, buffer[i], 0xff);
69 void CMT::rec_tape(const _TCHAR* file_path)
73 if(fio->Fopen(file_path, FILEIO_READ_WRITE_NEW_BINARY)) {
74 my_tcscpy_s(rec_file_path, _MAX_PATH, file_path);
80 void CMT::close_tape()
86 d_sio->write_signal(SIG_MC6850_CLEAR, 0, 0);
89 void CMT::release_tape()
94 fio->Fwrite(buffer, bufcnt, 1);
101 #define STATE_VERSION 3
103 bool CMT::process_state(FILEIO* state_fio, bool loading)
105 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
108 if(!state_fio->StateCheckInt32(this_device_id)) {
111 state_fio->StateBool(play);
112 state_fio->StateBool(rec);
113 state_fio->StateBool(remote);
114 state_fio->StateBuffer(rec_file_path, sizeof(rec_file_path), 1);
116 int length_tmp = state_fio->FgetInt32_LE();
118 fio->Fopen(rec_file_path, FILEIO_READ_WRITE_NEW_BINARY);
119 while(length_tmp != 0) {
120 uint8_t buffer_tmp[1024];
121 int length_rw = min(length_tmp, (int)sizeof(buffer_tmp));
122 state_fio->Fread(buffer_tmp, length_rw, 1);
123 if(fio->IsOpened()) {
124 fio->Fwrite(buffer_tmp, length_rw, 1);
126 length_tmp -= length_rw;
130 if(rec && fio->IsOpened()) {
131 int length_tmp = (int)fio->Ftell();
132 fio->Fseek(0, FILEIO_SEEK_SET);
133 state_fio->FputInt32_LE(length_tmp);
134 while(length_tmp != 0) {
135 uint8_t buffer_tmp[1024];
136 int length_rw = min(length_tmp, (int)sizeof(buffer_tmp));
137 fio->Fread(buffer_tmp, length_rw, 1);
138 state_fio->Fwrite(buffer_tmp, length_rw, 1);
139 length_tmp -= length_rw;
142 state_fio->FputInt32_LE(0);
145 state_fio->StateInt32(bufcnt);
146 state_fio->StateBuffer(buffer, sizeof(buffer), 1);