2 CANON X-07 Emulator 'eX-07'
4 Author : Takeda.Toshiya
11 #include "../../emu.h"
12 #include "../device.h"
16 #include "../memory.h"
20 #include "../debugger.h"
25 // ----------------------------------------------------------------------------
27 // ----------------------------------------------------------------------------
29 VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu)
32 first_device = last_device = NULL;
33 dummy = new DEVICE(this, emu); // must be 1st device
34 event = new EVENT(this, emu); // must be 2nd device
35 dummy->set_device_name(_T("1st Dummy"));
37 beep = new BEEP(this, emu);
38 memory = new MEMORY(this, emu);
39 cpu = new Z80(this, emu);
41 io = new IO(this, emu);
43 event->set_context_cpu(cpu);
44 event->set_context_sound(beep);
46 io->set_context_beep(beep);
47 io->set_context_cpu(cpu);
48 io->set_context_mem(memory, ram);
51 memset(ram, 0, sizeof(ram));
52 memset(app, 0xff, sizeof(app));
53 memset(tv, 0xff, sizeof(tv));
54 memset(bas, 0xff, sizeof(bas));
56 memory->read_bios(_T("APP.ROM"), app, sizeof(app));
57 memory->read_bios(_T("TV.ROM"), tv, sizeof(tv));
58 memory->read_bios(_T("BASIC.ROM"), bas, sizeof(bas));
60 memory->set_memory_rw(0x0000, 0x5fff, ram);
61 memory->set_memory_r(0x6000, 0x7fff, app);
62 memory->set_memory_rw(0x8000, 0x97ff, vram);
63 memory->set_memory_r(0xa000, 0xafff, tv);
64 memory->set_memory_r(0xb000, 0xffff, bas);
67 cpu->set_context_mem(memory);
68 cpu->set_context_io(io);
69 cpu->set_context_intr(io);
71 cpu->set_context_debugger(new DEBUGGER(this, emu));
74 // initialize all devices
75 for(DEVICE* device = first_device; device; device = device->next_device) {
84 for(DEVICE* device = first_device; device;) {
85 DEVICE *next_device = device->next_device;
92 DEVICE* VM::get_device(int id)
94 for(DEVICE* device = first_device; device; device = device->next_device) {
95 if(device->this_device_id == id) {
102 // ----------------------------------------------------------------------------
103 // drive virtual machine
104 // ----------------------------------------------------------------------------
109 for(DEVICE* device = first_device; device; device = device->next_device) {
119 // ----------------------------------------------------------------------------
121 // ----------------------------------------------------------------------------
124 DEVICE *VM::get_cpu(int index)
133 // ----------------------------------------------------------------------------
135 // ----------------------------------------------------------------------------
137 void VM::draw_screen()
142 // ----------------------------------------------------------------------------
144 // ----------------------------------------------------------------------------
146 void VM::initialize_sound(int rate, int samples)
148 // init sound manager
149 event->initialize_sound(rate, samples);
152 beep->initialize_sound(rate, 1000, 8000);
155 uint16_t* VM::create_sound(int* extra_frames)
157 return event->create_sound(extra_frames);
160 int VM::get_sound_buffer_ptr()
162 return event->get_sound_buffer_ptr();
165 #ifdef USE_SOUND_VOLUME
166 void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r)
169 beep->set_volume(0, decibel_l, decibel_r);
174 // ----------------------------------------------------------------------------
176 // ----------------------------------------------------------------------------
178 void VM::key_down(int code, bool repeat)
183 void VM::key_up(int code)
188 bool VM::get_caps_locked()
190 return io->get_caps_locked();
193 bool VM::get_kana_locked()
195 return io->get_kana_locked();
198 // ----------------------------------------------------------------------------
200 // ----------------------------------------------------------------------------
202 void VM::play_tape(int drv, const _TCHAR* file_path)
204 io->play_tape(file_path);
207 void VM::rec_tape(int drv, const _TCHAR* file_path)
209 io->rec_tape(file_path);
212 void VM::close_tape(int drv)
217 bool VM::is_tape_inserted(int drv)
219 return io->is_tape_inserted();
222 bool VM::is_frame_skippable()
224 return event->is_frame_skippable();
227 void VM::update_config()
229 for(DEVICE* device = first_device; device; device = device->next_device) {
230 device->update_config();
234 #define STATE_VERSION 2
236 #include "../../statesub.h"
237 #include "../../qt/gui/csp_logger.h"
238 extern CSP_Logger DLL_PREFIX_I *csp_logger;
240 void VM::decl_state(void)
243 state_entry = new csp_state_utils(STATE_VERSION, 0, (_TCHAR *)(_T("CSP::X07_HEAD")), csp_logger);
244 DECL_STATE_ENTRY_1D_ARRAY(ram, sizeof(ram));
245 DECL_STATE_ENTRY_1D_ARRAY(vram, sizeof(vram));
246 for(DEVICE* device = first_device; device; device = device->next_device) {
247 device->decl_state();
251 void VM::save_state(FILEIO* state_fio)
253 //state_fio->FputUint32(STATE_VERSION);
255 if(state_entry != NULL) {
256 state_entry->save_state(state_fio);
258 for(DEVICE* device = first_device; device; device = device->next_device) {
259 device->save_state(state_fio);
261 //state_fio->Fwrite(ram, sizeof(ram), 1);
262 //state_fio->Fwrite(vram, sizeof(vram), 1);
265 bool VM::load_state(FILEIO* state_fio)
267 //if(state_fio->FgetUint32() != STATE_VERSION) {
271 if(state_entry != NULL) {
272 mb = state_entry->load_state(state_fio);
275 emu->out_debug_log("INFO: HEADER DATA ERROR");
278 for(DEVICE* device = first_device; device; device = device->next_device) {
279 if(!device->load_state(state_fio)) {
283 //state_fio->Fread(ram, sizeof(ram), 1);
284 //state_fio->Fread(vram, sizeof(vram), 1);