OSDN Git Service

[General] Merge upstream, 2015-01-30 Writetrk.test.
[csp-qt/common_source_project-fm7.git] / source / src / vm / hc40 / hc40.cpp
1 /*
2         EPSON HC-40 Emulator 'eHC-40'
3
4         Author : Takeda.Toshiya
5         Date   : 2008.02.23 -
6
7         [ virtual machine ]
8 */
9
10 #include "hc40.h"
11 #include "../../emu.h"
12 #include "../device.h"
13 #include "../event.h"
14
15 #include "../beep.h"
16 #include "../datarec.h"
17 #include "../tf20.h"
18 #include "../z80.h"
19
20 #ifdef USE_DEBUGGER
21 #include "../debugger.h"
22 #endif
23
24 #include "io.h"
25 #include "memory.h"
26
27 // ----------------------------------------------------------------------------
28 // initialize
29 // ----------------------------------------------------------------------------
30
31 VM::VM(EMU* parent_emu) : emu(parent_emu)
32 {
33         // create devices
34         first_device = last_device = NULL;
35         dummy = new DEVICE(this, emu);  // must be 1st device
36         event = new EVENT(this, emu);   // must be 2nd device
37         
38         beep = new BEEP(this, emu);
39         drec = new DATAREC(this, emu);
40         tf20 = new TF20(this, emu);
41         cpu = new Z80(this, emu);
42         
43         io = new IO(this, emu);
44         memory = new MEMORY(this, emu);
45         
46         // set contexts
47         event->set_context_cpu(cpu);
48         event->set_context_sound(beep);
49         
50         drec->set_context_out(io, SIG_IO_DREC, 1);
51         tf20->set_context_sio(io, SIG_IO_ART);
52         
53         io->set_context_cpu(cpu);
54         io->set_context_mem(memory, memory->get_ram());
55         io->set_context_tf20(tf20);
56         io->set_context_beep(beep);
57         io->set_context_drec(drec);
58         
59         // cpu bus
60         cpu->set_context_mem(memory);
61         cpu->set_context_io(io);
62         cpu->set_context_intr(io);
63 #ifdef USE_DEBUGGER
64         cpu->set_context_debugger(new DEBUGGER(this, emu));
65 #endif
66         
67         // initialize all devices
68         for(DEVICE* device = first_device; device; device = device->next_device) {
69                 device->initialize();
70         }
71 }
72
73 VM::~VM()
74 {
75         // delete all devices
76         for(DEVICE* device = first_device; device;) {
77                 DEVICE *next_device = device->next_device;
78                 device->release();
79                 delete device;
80                 device = next_device;
81         }
82 }
83
84 DEVICE* VM::get_device(int id)
85 {
86         for(DEVICE* device = first_device; device; device = device->next_device) {
87                 if(device->this_device_id == id) {
88                         return device;
89                 }
90         }
91         return NULL;
92 }
93
94 // ----------------------------------------------------------------------------
95 // drive virtual machine
96 // ----------------------------------------------------------------------------
97
98 void VM::reset()
99 {
100         // reset all devices
101         for(DEVICE* device = first_device; device; device = device->next_device) {
102                 device->reset();
103         }
104 }
105
106 void VM::special_reset()
107 {
108         // system reset
109         for(DEVICE* device = first_device; device; device = device->next_device) {
110                 device->reset();
111         }
112         io->sysreset();
113 }
114
115 void VM::run()
116 {
117         event->drive();
118 }
119
120 // ----------------------------------------------------------------------------
121 // debugger
122 // ----------------------------------------------------------------------------
123
124 #ifdef USE_DEBUGGER
125 DEVICE *VM::get_cpu(int index)
126 {
127         if(index == 0) {
128                 return cpu;
129         }
130         return NULL;
131 }
132 #endif
133
134 // ----------------------------------------------------------------------------
135 // draw screen
136 // ----------------------------------------------------------------------------
137
138 void VM::draw_screen()
139 {
140         io->draw_screen();
141 }
142
143 int VM::access_lamp()
144 {
145         uint32 status = tf20->read_signal(0);
146         return (status & (1 | 4)) ? 1 : (status & (2 | 8)) ? 2 : 0;
147 }
148
149 // ----------------------------------------------------------------------------
150 // soud manager
151 // ----------------------------------------------------------------------------
152
153 void VM::initialize_sound(int rate, int samples)
154 {
155         // init sound manager
156         event->initialize_sound(rate, samples);
157         
158         // init sound gen
159         beep->init(rate, 1000, 8000);
160 }
161
162 uint16* VM::create_sound(int* extra_frames)
163 {
164         return event->create_sound(extra_frames);
165 }
166
167 int VM::sound_buffer_ptr()
168 {
169         return event->sound_buffer_ptr();
170 }
171
172 // ----------------------------------------------------------------------------
173 // notify key
174 // ----------------------------------------------------------------------------
175
176 void VM::key_down(int code, bool repeat)
177 {
178         io->key_down(code);
179 }
180
181 void VM::key_up(int code)
182 {
183         io->key_up(code);
184 }
185
186 // ----------------------------------------------------------------------------
187 // user interface
188 // ----------------------------------------------------------------------------
189
190 void VM::open_disk(int drv, _TCHAR* file_path, int bank)
191 {
192         tf20->open_disk(drv, file_path, bank);
193 }
194
195 void VM::close_disk(int drv)
196 {
197         tf20->close_disk(drv);
198 }
199
200 bool VM::disk_inserted(int drv)
201 {
202         return tf20->disk_inserted(drv);
203 }
204
205 void VM::play_tape(_TCHAR* file_path)
206 {
207         drec->play_tape(file_path);
208 }
209
210 void VM::rec_tape(_TCHAR* file_path)
211 {
212         drec->rec_tape(file_path);
213 }
214
215 void VM::close_tape()
216 {
217         drec->close_tape();
218 }
219
220 bool VM::tape_inserted()
221 {
222         return drec->tape_inserted();
223 }
224
225 bool VM::now_skip()
226 {
227         return event->now_skip();
228 }
229
230 void VM::update_config()
231 {
232         for(DEVICE* device = first_device; device; device = device->next_device) {
233                 device->update_config();
234         }
235 }
236