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 / babbage2nd / babbage2nd.cpp
1 /*\r
2         Gijutsu-Hyoron-Sha Babbage-2nd Emulator 'eBabbage-2nd'\r
3 \r
4         Author : Takeda.Toshiya\r
5         Date   : 2009.12.26 -\r
6 \r
7         [ virtual machine ]\r
8 */\r
9 \r
10 #include "babbage2nd.h"\r
11 #include "../../emu.h"\r
12 #include "../device.h"\r
13 #include "../event.h"\r
14 \r
15 #include "../io.h"\r
16 #include "../memory.h"\r
17 #include "../z80.h"\r
18 #include "../z80ctc.h"\r
19 #include "../z80pio.h"\r
20 \r
21 #include "display.h"\r
22 #include "keyboard.h"\r
23 \r
24 // ----------------------------------------------------------------------------\r
25 // initialize\r
26 // ----------------------------------------------------------------------------\r
27 \r
28 VM::VM(EMU* parent_emu) : emu(parent_emu)\r
29 {\r
30         // create devices\r
31         first_device = last_device = NULL;\r
32         dummy = new DEVICE(this, emu);  // must be 1st device\r
33         event = new EVENT(this, emu);   // must be 2nd device\r
34         \r
35         io = new IO(this, emu);\r
36         memory = new MEMORY(this, emu);\r
37         cpu = new Z80(this, emu);\r
38         ctc = new Z80CTC(this, emu);\r
39         pio1 = new Z80PIO(this, emu);\r
40         pio2 = new Z80PIO(this, emu);\r
41         \r
42         display = new DISPLAY(this, emu);\r
43         keyboard = new KEYBOARD(this, emu);\r
44         \r
45         // set contexts\r
46         event->set_context_cpu(cpu);\r
47         \r
48         pio2->set_context_port_b(display, SIG_DISPLAY_7SEG_LED, 0xff, 0);\r
49         keyboard->set_context_pio(pio2);\r
50         // p.145, fig.3-4\r
51         ctc->set_context_zc2(ctc, SIG_Z80CTC_TRIG_1, 1);\r
52         ctc->set_context_zc1(ctc, SIG_Z80CTC_TRIG_0, 1);\r
53         // p.114, fig.2-52\r
54         pio1->set_context_port_b(display, SIG_DISPLAY_8BIT_LED, 0xff, 0);\r
55         //pio1->set_context_port_b(pio1, SIG_Z80PIO_PORT_A, 0xff, 0);\r
56         \r
57         // cpu bus\r
58         cpu->set_context_mem(memory);\r
59         cpu->set_context_io(io);\r
60         cpu->set_context_intr(ctc);\r
61         \r
62         // z80 family daisy chain\r
63         ctc->set_context_intr(cpu, 0);\r
64         ctc->set_context_child(pio1);\r
65         pio1->set_context_intr(cpu, 1);\r
66         pio1->set_context_child(pio2);\r
67         pio2->set_context_intr(cpu, 2);\r
68         \r
69         // memory bus\r
70         memset(ram, 0, sizeof(ram));\r
71         memset(rom, 0xff, sizeof(rom));\r
72         \r
73         memory->read_bios(_T("MON.ROM"), rom, sizeof(rom));\r
74         \r
75         memory->set_memory_r(0x0000, 0x07ff, rom);\r
76         memory->set_memory_rw(0x1000, 0x17ff, ram);\r
77         \r
78         // i/o bus\r
79         io->set_iomap_range_rw(0x00, 0x03, ctc);\r
80         io->set_iomap_range_rw(0x10, 0x13, pio1);\r
81         io->set_iomap_range_rw(0x20, 0x23, pio2);\r
82         \r
83         // initialize all devices\r
84         for(DEVICE* device = first_device; device; device = device->next_device) {\r
85                 device->initialize();\r
86         }\r
87 }\r
88 \r
89 VM::~VM()\r
90 {\r
91         // delete all devices\r
92         for(DEVICE* device = first_device; device;) {\r
93                 DEVICE *next_device = device->next_device;\r
94                 device->release();\r
95                 delete device;\r
96                 device = next_device;\r
97         }\r
98 }\r
99 \r
100 DEVICE* VM::get_device(int id)\r
101 {\r
102         for(DEVICE* device = first_device; device; device = device->next_device) {\r
103                 if(device->this_device_id == id) {\r
104                         return device;\r
105                 }\r
106         }\r
107         return NULL;\r
108 }\r
109 \r
110 // ----------------------------------------------------------------------------\r
111 // drive virtual machine\r
112 // ----------------------------------------------------------------------------\r
113 \r
114 void VM::reset()\r
115 {\r
116         // reset all devices\r
117         for(DEVICE* device = first_device; device; device = device->next_device) {\r
118                 device->reset();\r
119         }\r
120 }\r
121 \r
122 void VM::run()\r
123 {\r
124         event->drive();\r
125 }\r
126 \r
127 // ----------------------------------------------------------------------------\r
128 // draw screen\r
129 // ----------------------------------------------------------------------------\r
130 \r
131 void VM::draw_screen()\r
132 {\r
133         display->draw_screen();\r
134 }\r
135 \r
136 // ----------------------------------------------------------------------------\r
137 // soud manager\r
138 // ----------------------------------------------------------------------------\r
139 \r
140 void VM::initialize_sound(int rate, int samples)\r
141 {\r
142         // init sound manager\r
143         event->initialize_sound(rate, samples);\r
144 }\r
145 \r
146 uint16* VM::create_sound(int* extra_frames)\r
147 {\r
148         return event->create_sound(extra_frames);\r
149 }\r
150 \r
151 int VM::sound_buffer_ptr()\r
152 {\r
153         return event->sound_buffer_ptr();\r
154 }\r
155 \r
156 // ----------------------------------------------------------------------------\r
157 // notify key\r
158 // ----------------------------------------------------------------------------\r
159 \r
160 void VM::key_down(int code, bool repeat)\r
161 {\r
162         keyboard->key_down(code);\r
163 }\r
164 \r
165 void VM::key_up(int code)\r
166 {\r
167         //keyboard->key_up(code);\r
168 }\r
169 \r
170 // ----------------------------------------------------------------------------\r
171 // user interface\r
172 // ----------------------------------------------------------------------------\r
173 \r
174 void VM::load_binary(int drv, _TCHAR* file_path)\r
175 {\r
176         if(drv == 0) {\r
177                 memory->read_image(file_path, ram, sizeof(ram));\r
178         }\r
179 }\r
180 \r
181 void VM::save_binary(int drv, _TCHAR* file_path)\r
182 {\r
183         if(drv == 0) {\r
184                 memory->write_image(file_path, ram, sizeof(ram));\r
185         }\r
186 }\r
187 \r
188 bool VM::now_skip()\r
189 {\r
190         return event->now_skip();\r
191 }\r
192 \r
193 void VM::update_config()\r
194 {\r
195         for(DEVICE* device = first_device; device; device = device->next_device) {\r
196                 device->update_config();\r
197         }\r
198 }\r
199 \r