OSDN Git Service

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