OSDN Git Service

[INITIAL] Import 20141226 version of http://homepage3.nifty.com/takeda-toshiya/common...
[csp-qt/common_source_project-fm7.git] / source / src / vm / fp1100 / fp1100.cpp
1 /*\r
2         CASIO FP-1100 Emulator 'eFP-1100'\r
3 \r
4         Author : Takeda.Toshiya\r
5         Date   : 2010.06.18-\r
6 \r
7         [ virtual machine ]\r
8 */\r
9 \r
10 #include "fp1100.h"\r
11 #include "../../emu.h"\r
12 #include "../device.h"\r
13 #include "../event.h"\r
14 \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
20 #include "../z80.h"\r
21 \r
22 #ifdef USE_DEBUGGER\r
23 #include "../debugger.h"\r
24 #endif\r
25 \r
26 #include "main.h"\r
27 #include "sub.h"\r
28 #include "fdcpack.h"\r
29 #include "rampack.h"\r
30 #include "rompack.h"\r
31 \r
32 // ----------------------------------------------------------------------------\r
33 // initialize\r
34 // ----------------------------------------------------------------------------\r
35 \r
36 VM::VM(EMU* parent_emu) : emu(parent_emu)\r
37 {\r
38         // create devices\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
42         \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
48         \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
65         \r
66         // set contexts\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
70         \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
74         \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
85         \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
90         \r
91         fdcpack->set_context_fdc(fdc);\r
92         \r
93         // cpu bus\r
94         cpu->set_context_mem(main);\r
95         cpu->set_context_io(main);\r
96         cpu->set_context_intr(main);\r
97 #ifdef USE_DEBUGGER\r
98         cpu->set_context_debugger(new DEBUGGER(this, emu));\r
99 #endif\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
104 #endif\r
105         \r
106         // initialize all devices\r
107         for(DEVICE* device = first_device; device; device = device->next_device) {\r
108                 device->initialize();\r
109         }\r
110         for(int i = 0; i < 4; i++) {\r
111                 fdc->set_drive_type(i, DRIVE_TYPE_2D);\r
112         }\r
113 }\r
114 \r
115 VM::~VM()\r
116 {\r
117         // delete all devices\r
118         for(DEVICE* device = first_device; device;) {\r
119                 DEVICE *next_device = device->next_device;\r
120                 device->release();\r
121                 delete device;\r
122                 device = next_device;\r
123         }\r
124 }\r
125 \r
126 DEVICE* VM::get_device(int id)\r
127 {\r
128         for(DEVICE* device = first_device; device; device = device->next_device) {\r
129                 if(device->this_device_id == id) {\r
130                         return device;\r
131                 }\r
132         }\r
133         return NULL;\r
134 }\r
135 \r
136 // ----------------------------------------------------------------------------\r
137 // drive virtual machine\r
138 // ----------------------------------------------------------------------------\r
139 \r
140 void VM::reset()\r
141 {\r
142         // reset all devices\r
143         for(DEVICE* device = first_device; device; device = device->next_device) {\r
144                 device->reset();\r
145         }\r
146 }\r
147 \r
148 void VM::run()\r
149 {\r
150         event->drive();\r
151 }\r
152 \r
153 double VM::frame_rate()\r
154 {\r
155         return event->frame_rate();\r
156 }\r
157 \r
158 // ----------------------------------------------------------------------------\r
159 // debugger\r
160 // ----------------------------------------------------------------------------\r
161 \r
162 #ifdef USE_DEBUGGER\r
163 DEVICE *VM::get_cpu(int index)\r
164 {\r
165         if(index == 0) {\r
166                 return cpu;\r
167         } else if(index == 1) {\r
168                 return subcpu;\r
169         }\r
170         return NULL;\r
171 }\r
172 #endif\r
173 \r
174 // ----------------------------------------------------------------------------\r
175 // draw screen\r
176 // ----------------------------------------------------------------------------\r
177 \r
178 void VM::draw_screen()\r
179 {\r
180         sub->draw_screen();\r
181 }\r
182 \r
183 int VM::access_lamp()\r
184 {\r
185         uint32 status = fdc->read_signal(0);\r
186         return (status & (1 | 4)) ? 1 : (status & (2 | 8)) ? 2 : 0;\r
187 }\r
188 \r
189 // ----------------------------------------------------------------------------\r
190 // soud manager\r
191 // ----------------------------------------------------------------------------\r
192 \r
193 void VM::initialize_sound(int rate, int samples)\r
194 {\r
195         // init sound manager\r
196         event->initialize_sound(rate, samples);\r
197         \r
198         // init sound gen\r
199         beep->init(rate, 2400, 8000);\r
200 }\r
201 \r
202 uint16* VM::create_sound(int* extra_frames)\r
203 {\r
204         return event->create_sound(extra_frames);\r
205 }\r
206 \r
207 int VM::sound_buffer_ptr()\r
208 {\r
209         return event->sound_buffer_ptr();\r
210 }\r
211 \r
212 // ----------------------------------------------------------------------------\r
213 // notify key\r
214 // ----------------------------------------------------------------------------\r
215 \r
216 void VM::key_down(int code, bool repeat)\r
217 {\r
218         sub->key_down(code);\r
219 }\r
220 \r
221 void VM::key_up(int code)\r
222 {\r
223         sub->key_up(code);\r
224 }\r
225 \r
226 // ----------------------------------------------------------------------------\r
227 // user interface\r
228 // ----------------------------------------------------------------------------\r
229 \r
230 void VM::open_disk(int drv, _TCHAR* file_path, int offset)\r
231 {\r
232         fdc->open_disk(drv, file_path, offset);\r
233 }\r
234 \r
235 void VM::close_disk(int drv)\r
236 {\r
237         fdc->close_disk(drv);\r
238 }\r
239 \r
240 bool VM::disk_inserted(int drv)\r
241 {\r
242         return fdc->disk_inserted(drv);\r
243 }\r
244 \r
245 void VM::play_tape(_TCHAR* file_path)\r
246 {\r
247         sub->play_tape(file_path);\r
248 }\r
249 \r
250 void VM::rec_tape(_TCHAR* file_path)\r
251 {\r
252         sub->rec_tape(file_path);\r
253 }\r
254 \r
255 void VM::close_tape()\r
256 {\r
257         sub->close_tape();\r
258 }\r
259 \r
260 bool VM::tape_inserted()\r
261 {\r
262         return sub->tape_inserted();\r
263 }\r
264 \r
265 bool VM::now_skip()\r
266 {\r
267         return event->now_skip();\r
268 }\r
269 \r
270 void VM::update_config()\r
271 {\r
272         for(DEVICE* device = first_device; device; device = device->next_device) {\r
273                 device->update_config();\r
274         }\r
275 }\r
276 \r