2 CASIO FP-1100 Emulator 'eFP-1100'
4 Author : Takeda.Toshiya
11 #include "../../emu.h"
12 #include "../device.h"
17 #include "../hd46505.h"
18 #include "../upd765a.h"
19 #include "../upd7801.h"
23 #include "../debugger.h"
32 #include "../../fileio.h"
34 // ----------------------------------------------------------------------------
36 // ----------------------------------------------------------------------------
38 VM::VM(EMU* parent_emu) : emu(parent_emu)
41 first_device = last_device = NULL;
42 dummy = new DEVICE(this, emu); // must be 1st device
43 event = new EVENT(this, emu); // must be 2nd device
45 beep = new BEEP(this, emu);
46 crtc = new HD46505(this, emu);
47 fdc = new UPD765A(this, emu);
48 subcpu = new UPD7801(this, emu);
49 cpu = new Z80(this, emu);
51 main = new MAIN(this, emu);
52 sub = new SUB(this, emu);
53 fdcpack = new FDCPACK(this, emu);
54 rampack1 = new RAMPACK(this, emu);
56 rampack2 = new RAMPACK(this, emu);
58 rampack3 = new RAMPACK(this, emu);
60 rampack4 = new RAMPACK(this, emu);
62 rampack5 = new RAMPACK(this, emu);
64 rampack6 = new RAMPACK(this, emu);
66 rompack = new ROMPACK(this, emu);
69 event->set_context_cpu(cpu);
70 event->set_context_cpu(subcpu, SUB_CPU_CLOCKS);
71 event->set_context_sound(beep);
73 crtc->set_context_hsync(sub, SIG_SUB_HSYNC, 1);
74 fdc->set_context_drq(main, SIG_MAIN_INTA, 1);
75 fdc->set_context_irq(main, SIG_MAIN_INTB, 1);
77 main->set_context_cpu(cpu);
78 main->set_context_sub(sub);
79 main->set_context_slot(0, rampack1);
80 main->set_context_slot(1, rampack2);
81 main->set_context_slot(2, rampack3);
82 main->set_context_slot(3, rampack4);
83 main->set_context_slot(4, rampack5);
84 main->set_context_slot(5, rampack6);
85 main->set_context_slot(6, rompack);
86 main->set_context_slot(7, fdcpack);
88 sub->set_context_cpu(subcpu);
89 sub->set_context_main(main);
90 sub->set_context_beep(beep);
91 sub->set_context_crtc(crtc, crtc->get_regs());
93 fdcpack->set_context_fdc(fdc);
96 cpu->set_context_mem(main);
97 cpu->set_context_io(main);
98 cpu->set_context_intr(main);
100 cpu->set_context_debugger(new DEBUGGER(this, emu));
102 subcpu->set_context_mem(sub);
103 subcpu->set_context_io(sub);
105 subcpu->set_context_debugger(new DEBUGGER(this, emu));
108 // initialize all devices
109 for(DEVICE* device = first_device; device; device = device->next_device) {
110 device->initialize();
112 for(int i = 0; i < 4; i++) {
113 fdc->set_drive_type(i, DRIVE_TYPE_2D);
119 // delete all devices
120 for(DEVICE* device = first_device; device;) {
121 DEVICE *next_device = device->next_device;
124 device = next_device;
128 DEVICE* VM::get_device(int id)
130 for(DEVICE* device = first_device; device; device = device->next_device) {
131 if(device->this_device_id == id) {
138 // ----------------------------------------------------------------------------
139 // drive virtual machine
140 // ----------------------------------------------------------------------------
145 for(DEVICE* device = first_device; device; device = device->next_device) {
155 double VM::frame_rate()
157 return event->frame_rate();
160 // ----------------------------------------------------------------------------
162 // ----------------------------------------------------------------------------
165 DEVICE *VM::get_cpu(int index)
169 } else if(index == 1) {
176 // ----------------------------------------------------------------------------
178 // ----------------------------------------------------------------------------
180 void VM::draw_screen()
185 int VM::access_lamp()
187 uint32 status = fdc->read_signal(0);
188 return (status & (1 | 4)) ? 1 : (status & (2 | 8)) ? 2 : 0;
191 // ----------------------------------------------------------------------------
193 // ----------------------------------------------------------------------------
195 void VM::initialize_sound(int rate, int samples)
197 // init sound manager
198 event->initialize_sound(rate, samples);
201 beep->init(rate, 2400, 8000);
204 uint16* VM::create_sound(int* extra_frames)
206 return event->create_sound(extra_frames);
209 int VM::sound_buffer_ptr()
211 return event->sound_buffer_ptr();
214 // ----------------------------------------------------------------------------
216 // ----------------------------------------------------------------------------
218 void VM::key_down(int code, bool repeat)
223 void VM::key_up(int code)
228 // ----------------------------------------------------------------------------
230 // ----------------------------------------------------------------------------
232 void VM::open_disk(int drv, _TCHAR* file_path, int offset)
234 fdc->open_disk(drv, file_path, offset);
237 void VM::close_disk(int drv)
239 fdc->close_disk(drv);
242 bool VM::disk_inserted(int drv)
244 return fdc->disk_inserted(drv);
247 void VM::play_tape(_TCHAR* file_path)
249 sub->play_tape(file_path);
252 void VM::rec_tape(_TCHAR* file_path)
254 sub->rec_tape(file_path);
257 void VM::close_tape()
262 bool VM::tape_inserted()
264 return sub->tape_inserted();
269 return event->now_skip();
272 void VM::update_config()
274 for(DEVICE* device = first_device; device; device = device->next_device) {
275 device->update_config();
279 #define STATE_VERSION 1
281 void VM::save_state(FILEIO* state_fio)
283 state_fio->FputUint32(STATE_VERSION);
285 for(DEVICE* device = first_device; device; device = device->next_device) {
286 device->save_state(state_fio);
290 bool VM::load_state(FILEIO* state_fio)
292 if(state_fio->FgetUint32() != STATE_VERSION) {
295 for(DEVICE* device = first_device; device; device = device->next_device) {
296 if(!device->load_state(state_fio)) {