2 EPSON HC-40 Emulator 'eHC-40'
4 Author : Takeda.Toshiya
11 #include "../../emu.h"
12 #include "../device.h"
16 #include "../datarec.h"
21 #include "../debugger.h"
27 #include "../../fileio.h"
29 // ----------------------------------------------------------------------------
31 // ----------------------------------------------------------------------------
33 VM::VM(EMU* parent_emu) : emu(parent_emu)
36 first_device = last_device = NULL;
37 dummy = new DEVICE(this, emu); // must be 1st device
38 event = new EVENT(this, emu); // must be 2nd device
40 beep = new BEEP(this, emu);
41 drec = new DATAREC(this, emu);
42 tf20 = new PTF20(this, emu);
43 cpu = new Z80(this, emu);
45 io = new IO(this, emu);
46 memory = new MEMORY(this, emu);
49 event->set_context_cpu(cpu);
50 event->set_context_sound(beep);
51 event->set_context_sound(drec);
53 drec->set_context_out(io, SIG_IO_DREC, 1);
54 tf20->set_context_sio(io, SIG_IO_ART);
56 io->set_context_cpu(cpu);
57 io->set_context_mem(memory, memory->get_ram());
58 io->set_context_tf20(tf20);
59 io->set_context_beep(beep);
60 io->set_context_drec(drec);
63 cpu->set_context_mem(memory);
64 cpu->set_context_io(io);
65 cpu->set_context_intr(io);
67 cpu->set_context_debugger(new DEBUGGER(this, emu));
70 // initialize all devices
71 for(DEVICE* device = first_device; device; device = device->next_device) {
79 for(DEVICE* device = first_device; device;) {
80 DEVICE *next_device = device->next_device;
87 DEVICE* VM::get_device(int id)
89 for(DEVICE* device = first_device; device; device = device->next_device) {
90 if(device->this_device_id == id) {
97 // ----------------------------------------------------------------------------
98 // drive virtual machine
99 // ----------------------------------------------------------------------------
104 for(DEVICE* device = first_device; device; device = device->next_device) {
109 void VM::special_reset()
112 for(DEVICE* device = first_device; device; device = device->next_device) {
123 // ----------------------------------------------------------------------------
125 // ----------------------------------------------------------------------------
128 DEVICE *VM::get_cpu(int index)
137 // ----------------------------------------------------------------------------
139 // ----------------------------------------------------------------------------
141 void VM::draw_screen()
146 int VM::access_lamp()
148 uint32 status = tf20->read_signal(0);
149 return (status & (1 | 4)) ? 1 : (status & (2 | 8)) ? 2 : 0;
152 // ----------------------------------------------------------------------------
154 // ----------------------------------------------------------------------------
156 void VM::initialize_sound(int rate, int samples)
158 // init sound manager
159 event->initialize_sound(rate, samples);
162 beep->init(rate, 1000, 8000);
165 uint16* VM::create_sound(int* extra_frames)
167 return event->create_sound(extra_frames);
170 int VM::sound_buffer_ptr()
172 return event->sound_buffer_ptr();
175 // ----------------------------------------------------------------------------
177 // ----------------------------------------------------------------------------
179 void VM::key_down(int code, bool repeat)
184 void VM::key_up(int code)
189 // ----------------------------------------------------------------------------
191 // ----------------------------------------------------------------------------
193 void VM::open_disk(int drv, _TCHAR* file_path, int bank)
195 tf20->open_disk(drv, file_path, bank);
198 void VM::close_disk(int drv)
200 tf20->close_disk(drv);
203 bool VM::disk_inserted(int drv)
205 return tf20->disk_inserted(drv);
208 void VM::play_tape(_TCHAR* file_path)
210 drec->play_tape(file_path);
213 void VM::rec_tape(_TCHAR* file_path)
215 drec->rec_tape(file_path);
218 void VM::close_tape()
223 bool VM::tape_inserted()
225 return drec->tape_inserted();
230 return event->now_skip();
233 void VM::update_config()
235 for(DEVICE* device = first_device; device; device = device->next_device) {
236 device->update_config();
240 #define STATE_VERSION 1
242 void VM::save_state(FILEIO* state_fio)
244 state_fio->FputUint32(STATE_VERSION);
246 for(DEVICE* device = first_device; device; device = device->next_device) {
247 device->save_state(state_fio);
251 bool VM::load_state(FILEIO* state_fio)
253 if(state_fio->FgetUint32() != STATE_VERSION) {
256 for(DEVICE* device = first_device; device; device = device->next_device) {
257 if(!device->load_state(state_fio)) {