2 CASIO FP-1100 Emulator 'eFP-1100'
\r
4 Author : Takeda.Toshiya
\r
11 #include "../../emu.h"
\r
12 #include "../device.h"
\r
13 #include "../event.h"
\r
15 #include "../beep.h"
\r
16 #include "../disk.h"
\r
17 #include "../hd46505.h"
\r
18 #include "../upd765a.h"
\r
19 #include "../upd7801.h"
\r
23 #include "../debugger.h"
\r
28 #include "fdcpack.h"
\r
29 #include "rampack.h"
\r
30 #include "rompack.h"
\r
32 // ----------------------------------------------------------------------------
\r
34 // ----------------------------------------------------------------------------
\r
36 VM::VM(EMU* parent_emu) : emu(parent_emu)
\r
39 first_device = last_device = NULL;
\r
40 dummy = new DEVICE(this, emu); // must be 1st device
\r
41 event = new EVENT(this, emu); // must be 2nd device
\r
43 beep = new BEEP(this, emu);
\r
44 crtc = new HD46505(this, emu);
\r
45 fdc = new UPD765A(this, emu);
\r
46 subcpu = new UPD7801(this, emu);
\r
47 cpu = new Z80(this, emu);
\r
49 main = new MAIN(this, emu);
\r
50 sub = new SUB(this, emu);
\r
51 fdcpack = new FDCPACK(this, emu);
\r
52 rampack1 = new RAMPACK(this, emu);
\r
53 rampack1->index = 1;
\r
54 rampack2 = new RAMPACK(this, emu);
\r
55 rampack2->index = 2;
\r
56 rampack3 = new RAMPACK(this, emu);
\r
57 rampack3->index = 3;
\r
58 rampack4 = new RAMPACK(this, emu);
\r
59 rampack4->index = 4;
\r
60 rampack5 = new RAMPACK(this, emu);
\r
61 rampack5->index = 5;
\r
62 rampack6 = new RAMPACK(this, emu);
\r
63 rampack6->index = 6;
\r
64 rompack = new ROMPACK(this, emu);
\r
67 event->set_context_cpu(cpu);
\r
68 event->set_context_cpu(subcpu, SUB_CPU_CLOCKS);
\r
69 event->set_context_sound(beep);
\r
71 crtc->set_context_hsync(sub, SIG_SUB_HSYNC, 1);
\r
72 fdc->set_context_drq(main, SIG_MAIN_INTA, 1);
\r
73 fdc->set_context_irq(main, SIG_MAIN_INTB, 1);
\r
75 main->set_context_cpu(cpu);
\r
76 main->set_context_sub(sub);
\r
77 main->set_context_slot(0, rampack1);
\r
78 main->set_context_slot(1, rampack2);
\r
79 main->set_context_slot(2, rampack3);
\r
80 main->set_context_slot(3, rampack4);
\r
81 main->set_context_slot(4, rampack5);
\r
82 main->set_context_slot(5, rampack6);
\r
83 main->set_context_slot(6, rompack);
\r
84 main->set_context_slot(7, fdcpack);
\r
86 sub->set_context_cpu(subcpu);
\r
87 sub->set_context_main(main);
\r
88 sub->set_context_beep(beep);
\r
89 sub->set_context_crtc(crtc, crtc->get_regs());
\r
91 fdcpack->set_context_fdc(fdc);
\r
94 cpu->set_context_mem(main);
\r
95 cpu->set_context_io(main);
\r
96 cpu->set_context_intr(main);
\r
98 cpu->set_context_debugger(new DEBUGGER(this, emu));
\r
100 subcpu->set_context_mem(sub);
\r
101 subcpu->set_context_io(sub);
\r
102 #ifdef USE_DEBUGGER
\r
103 subcpu->set_context_debugger(new DEBUGGER(this, emu));
\r
106 // initialize all devices
\r
107 for(DEVICE* device = first_device; device; device = device->next_device) {
\r
108 device->initialize();
\r
110 for(int i = 0; i < 4; i++) {
\r
111 fdc->set_drive_type(i, DRIVE_TYPE_2D);
\r
117 // delete all devices
\r
118 for(DEVICE* device = first_device; device;) {
\r
119 DEVICE *next_device = device->next_device;
\r
122 device = next_device;
\r
126 DEVICE* VM::get_device(int id)
\r
128 for(DEVICE* device = first_device; device; device = device->next_device) {
\r
129 if(device->this_device_id == id) {
\r
136 // ----------------------------------------------------------------------------
\r
137 // drive virtual machine
\r
138 // ----------------------------------------------------------------------------
\r
142 // reset all devices
\r
143 for(DEVICE* device = first_device; device; device = device->next_device) {
\r
153 double VM::frame_rate()
\r
155 return event->frame_rate();
\r
158 // ----------------------------------------------------------------------------
\r
160 // ----------------------------------------------------------------------------
\r
162 #ifdef USE_DEBUGGER
\r
163 DEVICE *VM::get_cpu(int index)
\r
167 } else if(index == 1) {
\r
174 // ----------------------------------------------------------------------------
\r
176 // ----------------------------------------------------------------------------
\r
178 void VM::draw_screen()
\r
180 sub->draw_screen();
\r
183 int VM::access_lamp()
\r
185 uint32 status = fdc->read_signal(0);
\r
186 return (status & (1 | 4)) ? 1 : (status & (2 | 8)) ? 2 : 0;
\r
189 // ----------------------------------------------------------------------------
\r
191 // ----------------------------------------------------------------------------
\r
193 void VM::initialize_sound(int rate, int samples)
\r
195 // init sound manager
\r
196 event->initialize_sound(rate, samples);
\r
199 beep->init(rate, 2400, 8000);
\r
202 uint16* VM::create_sound(int* extra_frames)
\r
204 return event->create_sound(extra_frames);
\r
207 int VM::sound_buffer_ptr()
\r
209 return event->sound_buffer_ptr();
\r
212 // ----------------------------------------------------------------------------
\r
214 // ----------------------------------------------------------------------------
\r
216 void VM::key_down(int code, bool repeat)
\r
218 sub->key_down(code);
\r
221 void VM::key_up(int code)
\r
226 // ----------------------------------------------------------------------------
\r
228 // ----------------------------------------------------------------------------
\r
230 void VM::open_disk(int drv, _TCHAR* file_path, int offset)
\r
232 fdc->open_disk(drv, file_path, offset);
\r
235 void VM::close_disk(int drv)
\r
237 fdc->close_disk(drv);
\r
240 bool VM::disk_inserted(int drv)
\r
242 return fdc->disk_inserted(drv);
\r
245 void VM::play_tape(_TCHAR* file_path)
\r
247 sub->play_tape(file_path);
\r
250 void VM::rec_tape(_TCHAR* file_path)
\r
252 sub->rec_tape(file_path);
\r
255 void VM::close_tape()
\r
260 bool VM::tape_inserted()
\r
262 return sub->tape_inserted();
\r
265 bool VM::now_skip()
\r
267 return event->now_skip();
\r
270 void VM::update_config()
\r
272 for(DEVICE* device = first_device; device; device = device->next_device) {
\r
273 device->update_config();
\r