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) : emu(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
36 beep = new BEEP(this, emu);
37 memory = new MEMORY(this, emu);
38 cpu = new Z80(this, emu);
40 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) {
83 for(DEVICE* device = first_device; device;) {
84 DEVICE *next_device = device->next_device;
91 DEVICE* VM::get_device(int id)
93 for(DEVICE* device = first_device; device; device = device->next_device) {
94 if(device->this_device_id == id) {
101 // ----------------------------------------------------------------------------
102 // drive virtual machine
103 // ----------------------------------------------------------------------------
108 for(DEVICE* device = first_device; device; device = device->next_device) {
118 // ----------------------------------------------------------------------------
120 // ----------------------------------------------------------------------------
123 DEVICE *VM::get_cpu(int index)
132 // ----------------------------------------------------------------------------
134 // ----------------------------------------------------------------------------
136 void VM::draw_screen()
141 // ----------------------------------------------------------------------------
143 // ----------------------------------------------------------------------------
145 void VM::initialize_sound(int rate, int samples)
147 // init sound manager
148 event->initialize_sound(rate, samples);
151 beep->init(rate, 1000, 8000);
154 uint16* VM::create_sound(int* extra_frames)
156 return event->create_sound(extra_frames);
159 int VM::sound_buffer_ptr()
161 return event->sound_buffer_ptr();
164 #ifdef USE_SOUND_VOLUME
165 void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r)
168 beep->set_volume(0, decibel_l, decibel_r);
173 // ----------------------------------------------------------------------------
175 // ----------------------------------------------------------------------------
177 void VM::key_down(int code, bool repeat)
182 void VM::key_up(int code)
187 // ----------------------------------------------------------------------------
189 // ----------------------------------------------------------------------------
191 void VM::play_tape(const _TCHAR* file_path)
193 io->play_tape(file_path);
196 void VM::rec_tape(const _TCHAR* file_path)
198 io->rec_tape(file_path);
201 void VM::close_tape()
206 bool VM::tape_inserted()
208 return io->tape_inserted();
213 return event->now_skip();
216 void VM::update_config()
218 for(DEVICE* device = first_device; device; device = device->next_device) {
219 device->update_config();
223 #define STATE_VERSION 1
225 void VM::save_state(FILEIO* state_fio)
227 state_fio->FputUint32(STATE_VERSION);
229 for(DEVICE* device = first_device; device; device = device->next_device) {
230 device->save_state(state_fio);
232 state_fio->Fwrite(ram, sizeof(ram), 1);
233 state_fio->Fwrite(vram, sizeof(vram), 1);
236 bool VM::load_state(FILEIO* state_fio)
238 if(state_fio->FgetUint32() != STATE_VERSION) {
241 for(DEVICE* device = first_device; device; device = device->next_device) {
242 if(!device->load_state(state_fio)) {
246 state_fio->Fread(ram, sizeof(ram), 1);
247 state_fio->Fread(vram, sizeof(vram), 1);