X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=source%2Fsrc%2Fvm%2Fmz5500%2Fmz5500.cpp;h=e8548f27646487157e8160e69fe3572348843bc8;hb=1a7386afa4c2ce25de158ba8285bc795446a8584;hp=d82b25e71f150353a0bbeba4571e2773e4c8a089;hpb=59fc5b4623a08b55dbe3d82782d533a3144be0e9;p=csp-qt%2Fcommon_source_project-fm7.git diff --git a/source/src/vm/mz5500/mz5500.cpp b/source/src/vm/mz5500/mz5500.cpp index d82b25e71..e8548f276 100644 --- a/source/src/vm/mz5500/mz5500.cpp +++ b/source/src/vm/mz5500/mz5500.cpp @@ -16,16 +16,22 @@ #include "../i8237.h" #include "../i8255.h" #include "../i8259.h" +//#if defined(HAS_I286) || defined(HAS_I186) #include "../i286.h" +//#else +//#include "../i86.h" +//#endif #include "../io.h" #include "../ls393.h" #include "../mz1p17.h" +#include "../noise.h" #include "../not.h" #include "../prnfile.h" #include "../rp5c01.h" #include "../upd7220.h" #include "../upd765a.h" -#include "../ym2203.h" +//#include "../ym2203.h" +#include "../ay_3_891x.h" #include "../z80ctc.h" #include "../z80sio.h" @@ -35,23 +41,29 @@ #include "display.h" #include "keyboard.h" -#include "memory.h" +#include "./memory.h" #include "sysport.h" +using MZ5500::DISPLAY; +using MZ5500::KEYBOARD; +using MZ5500::MEMORY; +using MZ5500::SYSPORT; + // ---------------------------------------------------------------------------- // initialize // ---------------------------------------------------------------------------- -VM::VM(EMU* parent_emu) : emu(parent_emu) +VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) { // create devices first_device = last_device = NULL; dummy = new DEVICE(this, emu); // must be 1st device event = new EVENT(this, emu); // must be 2nd device + dummy->set_device_name(_T("1st Dummy")); - if(config.printer_device_type == 0) { + if(config.printer_type == 0) { printer = new PRNFILE(this, emu); - } else if(config.printer_device_type == 1) { + } else if(config.printer_type == 1) { printer = new MZ1P17(this, emu); } else { printer = dummy; @@ -59,22 +71,39 @@ VM::VM(EMU* parent_emu) : emu(parent_emu) dma = new I8237(this, emu); pio = new I8255(this, emu); pic = new I8259(this, emu); +//#if defined(HAS_I286) || defined(HAS_I186) cpu = new I286(this, emu); +//#else +// cpu = new I86(this, emu); +//#endif io = new IO(this, emu); div = new LS393(this, emu); - not_data1 = new NOT(this, emu); - not_data2 = new NOT(this, emu); - not_data3 = new NOT(this, emu); - not_data4 = new NOT(this, emu); - not_data5 = new NOT(this, emu); - not_data6 = new NOT(this, emu); - not_data7 = new NOT(this, emu); - not_data8 = new NOT(this, emu); - not_busy = new NOT(this, emu); + not_data0 = new NOT(this, emu); + not_data0->set_device_name(_T("NOT Gate (Printer Bit0)")); + not_data1 = new NOT(this, emu); + not_data1->set_device_name(_T("NOT Gate (Printer Bit1)")); + not_data2 = new NOT(this, emu); + not_data2->set_device_name(_T("NOT Gate (Printer Bit2)")); + not_data3 = new NOT(this, emu); + not_data3->set_device_name(_T("NOT Gate (Printer Bit3)")); + not_data4 = new NOT(this, emu); + not_data4->set_device_name(_T("NOT Gate (Printer Bit4)")); + not_data5 = new NOT(this, emu); + not_data5->set_device_name(_T("NOT Gate (Printer Bit5)")); + not_data6 = new NOT(this, emu); + not_data6->set_device_name(_T("NOT Gate (Printer Bit6)")); + not_data7 = new NOT(this, emu); + not_data7->set_device_name(_T("NOT Gate (Printer Bit7)")); + not_busy = new NOT(this, emu); + not_busy->set_device_name(_T("NOT Gate (Printer Busy)")); rtc = new RP5C01(this, emu); gdc = new UPD7220(this, emu); fdc = new UPD765A(this, emu); - psg = new YM2203(this, emu); // AY-3-8912 + fdc->set_context_noise_seek(new NOISE(this, emu)); + fdc->set_context_noise_head_down(new NOISE(this, emu)); + fdc->set_context_noise_head_up(new NOISE(this, emu)); +// psg = new YM2203(this, emu); + psg = new AY_3_891X(this, emu); // AY-3-8912 ctc0 = new Z80CTC(this, emu); #if defined(_MZ6500) || defined(_MZ6550) ctc1 = new Z80CTC(this, emu); @@ -85,16 +114,19 @@ VM::VM(EMU* parent_emu) : emu(parent_emu) keyboard = new KEYBOARD(this, emu); memory = new MEMORY(this, emu); sysport = new SYSPORT(this, emu); - + // set contexts event->set_context_cpu(cpu); event->set_context_sound(psg); + event->set_context_sound(fdc->get_context_noise_seek()); + event->set_context_sound(fdc->get_context_noise_head_down()); + event->set_context_sound(fdc->get_context_noise_head_up()); - if(config.printer_device_type == 0) { + if(config.printer_type == 0) { PRNFILE *prnfile = (PRNFILE *)printer; prnfile->set_context_busy(not_busy, SIG_NOT_INPUT, 1); prnfile->set_context_ack(pio, SIG_I8255_PORT_C, 0x40); - } else if(config.printer_device_type == 1) { + } else if(config.printer_type == 1) { MZ1P17 *mz1p17 = (MZ1P17 *)printer; mz1p17->mode = MZ1P17_MODE_MZ1; mz1p17->set_context_busy(not_busy, SIG_NOT_INPUT, 1); @@ -102,14 +134,14 @@ VM::VM(EMU* parent_emu) : emu(parent_emu) } dma->set_context_memory(memory); dma->set_context_ch1(fdc); - pio->set_context_port_a(not_data1, SIG_NOT_INPUT, 0x01, 0); - pio->set_context_port_a(not_data2, SIG_NOT_INPUT, 0x02, 0); - pio->set_context_port_a(not_data3, SIG_NOT_INPUT, 0x04, 0); - pio->set_context_port_a(not_data4, SIG_NOT_INPUT, 0x08, 0); - pio->set_context_port_a(not_data5, SIG_NOT_INPUT, 0x10, 0); - pio->set_context_port_a(not_data6, SIG_NOT_INPUT, 0x20, 0); - pio->set_context_port_a(not_data7, SIG_NOT_INPUT, 0x40, 0); - pio->set_context_port_a(not_data8, SIG_NOT_INPUT, 0x80, 0); + pio->set_context_port_a(not_data0, SIG_NOT_INPUT, 0x01, 0); + pio->set_context_port_a(not_data1, SIG_NOT_INPUT, 0x02, 0); + pio->set_context_port_a(not_data2, SIG_NOT_INPUT, 0x04, 0); + pio->set_context_port_a(not_data3, SIG_NOT_INPUT, 0x08, 0); + pio->set_context_port_a(not_data4, SIG_NOT_INPUT, 0x10, 0); + pio->set_context_port_a(not_data5, SIG_NOT_INPUT, 0x20, 0); + pio->set_context_port_a(not_data6, SIG_NOT_INPUT, 0x40, 0); + pio->set_context_port_a(not_data7, SIG_NOT_INPUT, 0x80, 0); pio->set_context_port_c(keyboard, SIG_KEYBOARD_INPUT, 0x03, 0); pio->set_context_port_c(pic, SIG_I8259_IR2 | SIG_I8259_CHIP0, 0x08, 0); pio->set_context_port_c(printer, SIG_PRINTER_STROBE, 0x20, 0); @@ -141,14 +173,14 @@ VM::VM(EMU* parent_emu) : emu(parent_emu) #endif sio->set_context_intr(pic, SIG_I8259_IR1 | SIG_I8259_CHIP0); - not_data1->set_context_out(printer, SIG_PRINTER_DATA, 0x01); - not_data2->set_context_out(printer, SIG_PRINTER_DATA, 0x02); - not_data3->set_context_out(printer, SIG_PRINTER_DATA, 0x04); - not_data4->set_context_out(printer, SIG_PRINTER_DATA, 0x08); - not_data5->set_context_out(printer, SIG_PRINTER_DATA, 0x10); - not_data6->set_context_out(printer, SIG_PRINTER_DATA, 0x20); - not_data7->set_context_out(printer, SIG_PRINTER_DATA, 0x40); - not_data8->set_context_out(printer, SIG_PRINTER_DATA, 0x80); + not_data0->set_context_out(printer, SIG_PRINTER_DATA, 0x01); + not_data1->set_context_out(printer, SIG_PRINTER_DATA, 0x02); + not_data2->set_context_out(printer, SIG_PRINTER_DATA, 0x04); + not_data3->set_context_out(printer, SIG_PRINTER_DATA, 0x08); + not_data4->set_context_out(printer, SIG_PRINTER_DATA, 0x10); + not_data5->set_context_out(printer, SIG_PRINTER_DATA, 0x20); + not_data6->set_context_out(printer, SIG_PRINTER_DATA, 0x40); + not_data7->set_context_out(printer, SIG_PRINTER_DATA, 0x80); not_busy->set_context_out(pio, SIG_I8255_PORT_B, 0x01); display->set_vram_ptr(memory->get_vram()); display->set_sync_ptr(gdc->get_sync()); @@ -204,6 +236,9 @@ VM::VM(EMU* parent_emu) : emu(parent_emu) io->set_iomap_range_r(0x270, 0x27f, sysport); // initialize all devices +#if defined(__GIT_REPO_VERSION) + strncpy(_git_revision, __GIT_REPO_VERSION, sizeof(_git_revision) - 1); +#endif for(DEVICE* device = first_device; device; device = device->next_device) { device->initialize(); } @@ -292,12 +327,6 @@ void VM::draw_screen() display->draw_screen(); } -uint32_t VM::get_access_lamp_status() -{ - uint32_t status = fdc->read_signal(0); - return (status & (1 | 4)) ? 1 : (status & (2 | 8)) ? 2 : 0; -} - // ---------------------------------------------------------------------------- // soud manager // ---------------------------------------------------------------------------- @@ -326,6 +355,10 @@ void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r) { if(ch == 0) { psg->set_volume(1, decibel_l, decibel_r); + } else if(ch == 1) { + fdc->get_context_noise_seek()->set_volume(0, decibel_l, decibel_r); + fdc->get_context_noise_head_down()->set_volume(0, decibel_l, decibel_r); + fdc->get_context_noise_head_up()->set_volume(0, decibel_l, decibel_r); } } #endif @@ -344,6 +377,16 @@ void VM::key_up(int code) // keyboard->key_up(code); } +bool VM::get_caps_locked() +{ + return keyboard->get_caps_locked(); +} + +bool VM::get_kana_locked() +{ + return keyboard->get_kana_locked(); +} + // ---------------------------------------------------------------------------- // user interface // ---------------------------------------------------------------------------- @@ -373,6 +416,11 @@ bool VM::is_floppy_disk_protected(int drv) return fdc->is_disk_protected(drv); } +uint32_t VM::is_floppy_disk_accessed() +{ + return fdc->read_signal(0); +} + bool VM::is_frame_skippable() { return event->is_frame_skippable(); @@ -385,27 +433,38 @@ void VM::update_config() } } -#define STATE_VERSION 2 - -void VM::save_state(FILEIO* state_fio) -{ - state_fio->FputUint32(STATE_VERSION); - - for(DEVICE* device = first_device; device; device = device->next_device) { - device->save_state(state_fio); - } -} +#define STATE_VERSION 5 -bool VM::load_state(FILEIO* state_fio) +bool VM::process_state(FILEIO* state_fio, bool loading) { - if(state_fio->FgetUint32() != STATE_VERSION) { + if(!state_fio->StateCheckUint32(STATE_VERSION)) { return false; } - for(DEVICE* device = first_device; device; device = device->next_device) { - if(!device->load_state(state_fio)) { + for(DEVICE* device = first_device; device; device = device->next_device) { + // Note: typeid(foo).name is fixed by recent ABI.Not dec 6. + // const char *name = typeid(*device).name(); + // But, using get_device_name() instead of typeid(foo).name() 20181008 K.O + const char *name = device->get_device_name(); + int len = strlen(name); + + if(!state_fio->StateCheckInt32(len)) { + if(loading) { + printf("Class name len Error: DEVID=%d EXPECT=%s\n", device->this_device_id, name); + } return false; } - } + if(!state_fio->StateCheckBuffer(name, len, 1)) { + if(loading) { + printf("Class name Error: DEVID=%d EXPECT=%s\n", device->this_device_id, name); + } + return false; + } + if(!device->process_state(state_fio, loading)) { + if(loading) { + printf("Data loading Error: DEVID=%d\n", device->this_device_id); + } + return false; + } + } return true; } -