2 EPSON HC-40 Emulator 'eHC-40'
\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 "../datarec.h"
\r
17 #include "../tf20.h"
\r
21 #include "../debugger.h"
\r
27 // ----------------------------------------------------------------------------
\r
29 // ----------------------------------------------------------------------------
\r
31 VM::VM(EMU* parent_emu) : emu(parent_emu)
\r
34 first_device = last_device = NULL;
\r
35 dummy = new DEVICE(this, emu); // must be 1st device
\r
36 event = new EVENT(this, emu); // must be 2nd device
\r
38 beep = new BEEP(this, emu);
\r
39 drec = new DATAREC(this, emu);
\r
40 tf20 = new TF20(this, emu);
\r
41 cpu = new Z80(this, emu);
\r
43 io = new IO(this, emu);
\r
44 memory = new MEMORY(this, emu);
\r
47 event->set_context_cpu(cpu);
\r
48 event->set_context_sound(beep);
\r
50 drec->set_context_out(io, SIG_IO_DREC, 1);
\r
51 tf20->set_context_sio(io, SIG_IO_ART);
\r
53 io->set_context_cpu(cpu);
\r
54 io->set_context_mem(memory, memory->get_ram());
\r
55 io->set_context_tf20(tf20);
\r
56 io->set_context_beep(beep);
\r
57 io->set_context_drec(drec);
\r
60 cpu->set_context_mem(memory);
\r
61 cpu->set_context_io(io);
\r
62 cpu->set_context_intr(io);
\r
64 cpu->set_context_debugger(new DEBUGGER(this, emu));
\r
67 // initialize all devices
\r
68 for(DEVICE* device = first_device; device; device = device->next_device) {
\r
69 device->initialize();
\r
75 // delete all devices
\r
76 for(DEVICE* device = first_device; device;) {
\r
77 DEVICE *next_device = device->next_device;
\r
80 device = next_device;
\r
84 DEVICE* VM::get_device(int id)
\r
86 for(DEVICE* device = first_device; device; device = device->next_device) {
\r
87 if(device->this_device_id == id) {
\r
94 // ----------------------------------------------------------------------------
\r
95 // drive virtual machine
\r
96 // ----------------------------------------------------------------------------
\r
100 // reset all devices
\r
101 for(DEVICE* device = first_device; device; device = device->next_device) {
\r
106 void VM::special_reset()
\r
109 for(DEVICE* device = first_device; device; device = device->next_device) {
\r
120 // ----------------------------------------------------------------------------
\r
122 // ----------------------------------------------------------------------------
\r
124 #ifdef USE_DEBUGGER
\r
125 DEVICE *VM::get_cpu(int index)
\r
134 // ----------------------------------------------------------------------------
\r
136 // ----------------------------------------------------------------------------
\r
138 void VM::draw_screen()
\r
143 int VM::access_lamp()
\r
145 uint32 status = tf20->read_signal(0);
\r
146 return (status & (1 | 4)) ? 1 : (status & (2 | 8)) ? 2 : 0;
\r
149 // ----------------------------------------------------------------------------
\r
151 // ----------------------------------------------------------------------------
\r
153 void VM::initialize_sound(int rate, int samples)
\r
155 // init sound manager
\r
156 event->initialize_sound(rate, samples);
\r
159 beep->init(rate, 1000, 8000);
\r
162 uint16* VM::create_sound(int* extra_frames)
\r
164 return event->create_sound(extra_frames);
\r
167 int VM::sound_buffer_ptr()
\r
169 return event->sound_buffer_ptr();
\r
172 // ----------------------------------------------------------------------------
\r
174 // ----------------------------------------------------------------------------
\r
176 void VM::key_down(int code, bool repeat)
\r
178 io->key_down(code);
\r
181 void VM::key_up(int code)
\r
186 // ----------------------------------------------------------------------------
\r
188 // ----------------------------------------------------------------------------
\r
190 void VM::open_disk(int drv, _TCHAR* file_path, int offset)
\r
192 tf20->open_disk(drv, file_path, offset);
\r
195 void VM::close_disk(int drv)
\r
197 tf20->close_disk(drv);
\r
200 bool VM::disk_inserted(int drv)
\r
202 return tf20->disk_inserted(drv);
\r
205 void VM::play_tape(_TCHAR* file_path)
\r
207 drec->play_tape(file_path);
\r
210 void VM::rec_tape(_TCHAR* file_path)
\r
212 drec->rec_tape(file_path);
\r
215 void VM::close_tape()
\r
217 drec->close_tape();
\r
220 bool VM::tape_inserted()
\r
222 return drec->tape_inserted();
\r
225 bool VM::now_skip()
\r
227 return event->now_skip();
\r
230 void VM::update_config()
\r
232 for(DEVICE* device = first_device; device; device = device->next_device) {
\r
233 device->update_config();
\r