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 #if defined(__GIT_REPO_VERSION)
76 strncpy(_git_revision, __GIT_REPO_VERSION, sizeof(_git_revision) - 1);
78 for(DEVICE* device = first_device; device; device = device->next_device) {
87 for(DEVICE* device = first_device; device;) {
88 DEVICE *next_device = device->next_device;
95 DEVICE* VM::get_device(int id)
97 for(DEVICE* device = first_device; device; device = device->next_device) {
98 if(device->this_device_id == id) {
105 // ----------------------------------------------------------------------------
106 // drive virtual machine
107 // ----------------------------------------------------------------------------
112 for(DEVICE* device = first_device; device; device = device->next_device) {
122 // ----------------------------------------------------------------------------
124 // ----------------------------------------------------------------------------
127 DEVICE *VM::get_cpu(int index)
136 // ----------------------------------------------------------------------------
138 // ----------------------------------------------------------------------------
140 void VM::draw_screen()
145 // ----------------------------------------------------------------------------
147 // ----------------------------------------------------------------------------
149 void VM::initialize_sound(int rate, int samples)
151 // init sound manager
152 event->initialize_sound(rate, samples);
155 beep->initialize_sound(rate, 1000, 8000);
158 uint16_t* VM::create_sound(int* extra_frames)
160 return event->create_sound(extra_frames);
163 int VM::get_sound_buffer_ptr()
165 return event->get_sound_buffer_ptr();
168 #ifdef USE_SOUND_VOLUME
169 void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r)
172 beep->set_volume(0, decibel_l, decibel_r);
177 // ----------------------------------------------------------------------------
179 // ----------------------------------------------------------------------------
181 void VM::key_down(int code, bool repeat)
186 void VM::key_up(int code)
191 bool VM::get_caps_locked()
193 return io->get_caps_locked();
196 bool VM::get_kana_locked()
198 return io->get_kana_locked();
201 // ----------------------------------------------------------------------------
203 // ----------------------------------------------------------------------------
205 void VM::play_tape(int drv, const _TCHAR* file_path)
207 io->play_tape(file_path);
210 void VM::rec_tape(int drv, const _TCHAR* file_path)
212 io->rec_tape(file_path);
215 void VM::close_tape(int drv)
220 bool VM::is_tape_inserted(int drv)
222 return io->is_tape_inserted();
225 bool VM::is_frame_skippable()
227 return event->is_frame_skippable();
230 void VM::update_config()
232 for(DEVICE* device = first_device; device; device = device->next_device) {
233 device->update_config();
237 #define STATE_VERSION 2
239 #include "../../statesub.h"
240 #include "../../qt/gui/csp_logger.h"
241 extern CSP_Logger DLL_PREFIX_I *csp_logger;
243 void VM::decl_state(void)
246 state_entry = new csp_state_utils(STATE_VERSION, 0, (_TCHAR *)(_T("CSP::X07_HEAD")), csp_logger);
247 DECL_STATE_ENTRY_1D_ARRAY(ram, sizeof(ram));
248 DECL_STATE_ENTRY_1D_ARRAY(vram, sizeof(vram));
249 for(DEVICE* device = first_device; device; device = device->next_device) {
250 device->decl_state();
254 void VM::save_state(FILEIO* state_fio)
256 //state_fio->FputUint32(STATE_VERSION);
258 if(state_entry != NULL) {
259 state_entry->save_state(state_fio);
261 for(DEVICE* device = first_device; device; device = device->next_device) {
262 device->save_state(state_fio);
264 //state_fio->Fwrite(ram, sizeof(ram), 1);
265 //state_fio->Fwrite(vram, sizeof(vram), 1);
268 bool VM::load_state(FILEIO* state_fio)
270 //if(state_fio->FgetUint32() != STATE_VERSION) {
274 if(state_entry != NULL) {
275 mb = state_entry->load_state(state_fio);
278 emu->out_debug_log("INFO: HEADER DATA ERROR");
281 for(DEVICE* device = first_device; device; device = device->next_device) {
282 if(!device->load_state(state_fio)) {
286 //state_fio->Fread(ram, sizeof(ram), 1);
287 //state_fio->Fread(vram, sizeof(vram), 1);
291 bool VM::process_state(FILEIO* state_fio, bool loading)
293 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
296 for(DEVICE* device = first_device; device; device = device->next_device) {
297 const char *name = typeid(*device).name() + 6; // skip "class "
298 int len = strlen(name);
300 if(!state_fio->StateCheckInt32(len)) {
303 if(!state_fio->StateCheckBuffer(name, len, 1)) {
306 if(!device->process_state(state_fio, loading)) {
310 state_fio->StateBuffer(ram, sizeof(ram), 1);
311 state_fio->StateBuffer(vram, sizeof(vram), 1);