2 NEC PC-8201 Emulator 'ePC-8201'
4 Author : Takeda.Toshiya
12 #define SAMPLE_RATE 48000
16 void CMT::initialize()
34 void CMT::write_buffer(uint8_t value, int samples)
37 for(int i = 0; i < samples; i++) {
38 buffer[bufcnt++] = value;
39 if(bufcnt == sizeof(buffer)) {
40 fio->Fwrite(buffer, sizeof(buffer), 1);
45 value = (value > 128) ? 0x80 : 0;
47 int s = min(samples, 0x7f);
49 buffer[bufcnt++] = value | s;
50 if(bufcnt == sizeof(buffer)) {
51 fio->Fwrite(buffer, sizeof(buffer), 1);
58 void CMT::put_signal()
61 uint32_t clock = get_passed_clock(prev_clock);
62 if(prev_signal == 1) {
64 int count = (int)(1200.0 * (double)clock / (double)CPU_CLOCKS + 0.5) * 2;
65 for(int i = 0; i < count; i++) {
66 write_buffer(0xff, SAMPLE_RATE / 2400 / 2);
67 write_buffer(0x00, SAMPLE_RATE / 2400 / 2);
69 } else if(prev_signal == -1) {
71 int count = (int)(1200.0 * (double)clock / (double)CPU_CLOCKS + 0.5);
72 for(int i = 0; i < count; i++) {
73 write_buffer(0xff, SAMPLE_RATE / 1200 / 2);
74 write_buffer(0x00, SAMPLE_RATE / 1200 / 2);
77 write_buffer(0x80, SAMPLE_RATE * clock / CPU_CLOCKS);
82 void CMT::write_signal(int id, uint32_t data, uint32_t mask)
84 bool next = ((data & mask) != 0);
86 if(id == SIG_CMT_REMOTE) {
90 prev_clock = get_current_clock();
91 } else if(remote && !next) {
96 } else if(id == SIG_CMT_SOD) {
98 request_skip_frames();
101 prev_signal = next ? 1 : -1;
102 prev_clock = get_current_clock();
106 void CMT::rec_tape(const _TCHAR* file_path)
110 if(fio->Fopen(file_path, FILEIO_WRITE_BINARY)) {
111 my_tcscpy_s(rec_file_path, _MAX_PATH, file_path);
112 if(check_file_extension(file_path, _T(".wav"))) {
113 write_dummy_wav_header((void *)fio);
121 void CMT::close_tape()
126 fio->Fwrite(buffer, bufcnt, 1);
129 uint32_t length = fio->Ftell();
130 wav_header_t wav_header;
131 wav_chunk_t wav_chunk;
132 if(set_wav_header(&wav_header, &wav_chunk, 1, SAMPLE_RATE, 8, length)) {
133 fio->Fseek(0, FILEIO_SEEK_SET);
134 fio->Fwrite(&wav_header, sizeof(wav_header), 1);
135 fio->Fwrite(&wav_chunk, sizeof(wav_chunk), 1);
140 is_wav = rec = false;
143 #define STATE_VERSION 1
145 bool CMT::process_state(FILEIO* state_fio, bool loading)
147 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
150 if(!state_fio->StateCheckInt32(this_device_id)) {
153 state_fio->StateBool(is_wav);
154 state_fio->StateBool(rec);
155 state_fio->StateBool(remote);
156 state_fio->StateBuffer(rec_file_path, sizeof(rec_file_path), 1);
158 int length_tmp = state_fio->FgetInt32_LE();
160 fio->Fopen(rec_file_path, FILEIO_READ_WRITE_NEW_BINARY);
161 while(length_tmp != 0) {
162 uint8_t buffer_tmp[1024];
163 int length_rw = min(length_tmp, (int)sizeof(buffer_tmp));
164 state_fio->Fread(buffer_tmp, length_rw, 1);
165 if(fio->IsOpened()) {
166 fio->Fwrite(buffer_tmp, length_rw, 1);
168 length_tmp -= length_rw;
172 if(rec && fio->IsOpened()) {
173 int length_tmp = (int)fio->Ftell();
174 fio->Fseek(0, FILEIO_SEEK_SET);
175 state_fio->FputInt32_LE(length_tmp);
176 while(length_tmp != 0) {
177 uint8_t buffer_tmp[1024];
178 int length_rw = min(length_tmp, (int)sizeof(buffer_tmp));
179 fio->Fread(buffer_tmp, length_rw, 1);
180 state_fio->Fwrite(buffer_tmp, length_rw, 1);
181 length_tmp -= length_rw;
184 state_fio->FputInt32_LE(0);
187 state_fio->StateInt32(bufcnt);
188 state_fio->StateBuffer(buffer, sizeof(buffer), 1);
189 state_fio->StateInt32(prev_signal);
190 state_fio->StateUint32(prev_clock);