2 NEC PC-8201 Emulator 'ePC-8201'
\r
4 Author : Takeda.Toshiya
\r
7 [ cmt (record only) ]
\r
11 #include "../../fileio.h"
\r
22 wav_chunk_t riff_chunk;
\r
24 wav_chunk_t fmt_chunk;
\r
34 #define SAMPLE_RATE 48000
\r
36 void CMT::initialize()
\r
39 rec = remote = false;
\r
51 rec = remote = false;
\r
54 void CMT::write_buffer(uint8 value, int samples)
\r
57 for(int i = 0; i < samples; i++) {
\r
58 buffer[bufcnt++] = value;
\r
59 if(bufcnt == sizeof(buffer)) {
\r
60 fio->Fwrite(buffer, sizeof(buffer), 1);
\r
65 value = (value > 128) ? 0x80 : 0;
\r
66 while(samples > 0) {
\r
67 int s = min(samples, 0x7f);
\r
69 buffer[bufcnt++] = value | s;
\r
70 if(bufcnt == sizeof(buffer)) {
\r
71 fio->Fwrite(buffer, sizeof(buffer), 1);
\r
78 void CMT::put_signal()
\r
81 uint32 clock = passed_clock(prev_clock);
\r
82 if(prev_signal == 1) {
\r
84 int count = (int)(1200.0 * (double)clock / (double)CPU_CLOCKS + 0.5) * 2;
\r
85 for(int i = 0; i < count; i++) {
\r
86 write_buffer(0xff, SAMPLE_RATE / 2400 / 2);
\r
87 write_buffer(0x00, SAMPLE_RATE / 2400 / 2);
\r
89 } else if(prev_signal == -1) {
\r
91 int count = (int)(1200.0 * (double)clock / (double)CPU_CLOCKS + 0.5);
\r
92 for(int i = 0; i < count; i++) {
\r
93 write_buffer(0xff, SAMPLE_RATE / 1200 / 2);
\r
94 write_buffer(0x00, SAMPLE_RATE / 1200 / 2);
\r
97 write_buffer(0x80, SAMPLE_RATE * clock / CPU_CLOCKS);
\r
102 void CMT::write_signal(int id, uint32 data, uint32 mask)
\r
104 bool next = ((data & mask) != 0);
\r
106 if(id == SIG_CMT_REMOTE) {
\r
107 if(!remote && next) {
\r
110 prev_clock = current_clock();
\r
111 } else if(remote && !next) {
\r
116 } else if(id == SIG_CMT_SOD) {
\r
118 request_skip_frames();
\r
121 prev_signal = next ? 1 : -1;
\r
122 prev_clock = current_clock();
\r
126 void CMT::rec_tape(_TCHAR* file_path)
\r
130 if(fio->Fopen(file_path, FILEIO_WRITE_BINARY)) {
\r
131 if(check_file_extension(file_path, _T(".wav"))) {
\r
132 uint8 dummy[sizeof(wav_header_t) + sizeof(wav_chunk_t)];
\r
133 memset(dummy, 0, sizeof(dummy));
\r
134 fio->Fwrite(dummy, sizeof(dummy), 1);
\r
142 void CMT::close_tape()
\r
147 fio->Fwrite(buffer, bufcnt, 1);
\r
150 uint32 length = fio->Ftell();
\r
152 wav_header_t wav_header;
\r
153 wav_chunk_t wav_chunk;
\r
155 memcpy(wav_header.riff_chunk.id, "RIFF", 4);
\r
156 wav_header.riff_chunk.size = length - 8;
\r
157 memcpy(wav_header.wave, "WAVE", 4);
\r
158 memcpy(wav_header.fmt_chunk.id, "fmt ", 4);
\r
159 wav_header.fmt_chunk.size = 16;
\r
160 wav_header.format_id = 1;
\r
161 wav_header.channels = 1;
\r
162 wav_header.sample_rate = SAMPLE_RATE;
\r
163 wav_header.data_speed = SAMPLE_RATE;
\r
164 wav_header.block_size = 1;
\r
165 wav_header.sample_bits = 8;
\r
167 memcpy(wav_chunk.id, "data", 4);
\r
168 wav_chunk.size = length - sizeof(wav_header) - sizeof(wav_chunk);
\r
170 fio->Fseek(0, FILEIO_SEEK_SET);
\r
171 fio->Fwrite(&wav_header, sizeof(wav_header), 1);
\r
172 fio->Fwrite(&wav_chunk, sizeof(wav_chunk), 1);
\r
176 is_wav = rec = false;
\r