X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=source%2Fsrc%2Fvm%2Fphc25%2Fphc25.cpp;h=0987d12b6abbdb83c78de273734d9dc608fab8fb;hb=8639d5f3a215d3d68dceb1a6c0e4291d1bfa17cf;hp=205049d66ceb1b2c153ace6835e3b5d8a11aec66;hpb=e0b8b19e7ca699756a64cb25f7006a45100f6628;p=csp-qt%2Fcommon_source_project-fm7.git diff --git a/source/src/vm/phc25/phc25.cpp b/source/src/vm/phc25/phc25.cpp index 205049d66..0987d12b6 100644 --- a/source/src/vm/phc25/phc25.cpp +++ b/source/src/vm/phc25/phc25.cpp @@ -16,8 +16,10 @@ #include "../datarec.h" #include "../io.h" #include "../mc6847.h" +#include "../noise.h" #include "../not.h" -#include "../ym2203.h" +//#include "../ym2203.h" +#include "../ay_3_891x.h" #include "../z80.h" #ifdef USE_DEBUGGER @@ -26,47 +28,53 @@ #include "joystick.h" #include "keyboard.h" -#include "memory.h" -#include "system.h" - -#include "../../fileio.h" +#include "./memory.h" +#include "./system.h" // ---------------------------------------------------------------------------- // 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")); drec = new DATAREC(this, emu); + drec->set_context_noise_play(new NOISE(this, emu)); + drec->set_context_noise_stop(new NOISE(this, emu)); + drec->set_context_noise_fast(new NOISE(this, emu)); io = new IO(this, emu); vdp = new MC6847(this, emu); - not = new NOT(this, emu); - psg = new YM2203(this, emu); + not_vsync = new NOT(this, emu); +// psg = new YM2203(this, emu); + psg = new AY_3_891X(this, emu); cpu = new Z80(this, emu); + not_vsync->set_device_name(_T("NOT GATE(VSYNC)")); joystick = new JOYSTICK(this, emu); keyboard = new KEYBOARD(this, emu); - memory = new MEMORY(this, emu); - system = new SYSTEM(this, emu); - + memory = new PHC25_MEMORY(this, emu); + system = new PHC25_SYSTEM(this, emu); // set contexts event->set_context_cpu(cpu); event->set_context_sound(psg); event->set_context_sound(drec); + event->set_context_sound(drec->get_context_noise_play()); + event->set_context_sound(drec->get_context_noise_stop()); + event->set_context_sound(drec->get_context_noise_fast()); - vdp->load_font_image(emu->bios_path(_T("FONT.ROM"))); + vdp->load_font_image(create_local_path(_T("FONT.ROM"))); vdp->set_vram_ptr(memory->get_vram(), 0x1800); // vdp->set_context_cpu(cpu); - vdp->set_context_vsync(not, SIG_NOT_INPUT, 1); - not->set_context_out(cpu, SIG_CPU_IRQ, 1); + vdp->set_context_vsync(not_vsync, SIG_NOT_INPUT, 1); + not_vsync->set_context_out(cpu, SIG_CPU_IRQ, 1); vdp->set_context_vsync(system, SIG_SYSTEM_PORT, 0x10); - drec->set_context_out(system, SIG_SYSTEM_PORT, 0x20); + drec->set_context_ear(system, SIG_SYSTEM_PORT, 0x20); // bit6: printer busy vdp->set_context_hsync(system, SIG_SYSTEM_PORT, 0x80); @@ -96,6 +104,9 @@ VM::VM(EMU* parent_emu) : emu(parent_emu) io->set_iomap_alias_r(0xc1, psg, 1); // PSG data // 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(); } @@ -172,76 +183,151 @@ void VM::initialize_sound(int rate, int samples) event->initialize_sound(rate, samples); // init sound gen - psg->init(rate, 1996750, samples, 0, 0); + psg->initialize_sound(rate, 1996750, samples, 0, 0); } -uint16* VM::create_sound(int* extra_frames) +uint16_t* VM::create_sound(int* extra_frames) { return event->create_sound(extra_frames); } -int VM::sound_buffer_ptr() +int VM::get_sound_buffer_ptr() +{ + return event->get_sound_buffer_ptr(); +} + +#ifdef USE_SOUND_VOLUME +void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r) { - return event->sound_buffer_ptr(); + if(ch == 0) { + psg->set_volume(1, decibel_l, decibel_r); + } else if(ch == 1) { + drec->set_volume(0, decibel_l, decibel_r); + } else if(ch == 2) { + drec->get_context_noise_play()->set_volume(0, decibel_l, decibel_r); + drec->get_context_noise_stop()->set_volume(0, decibel_l, decibel_r); + drec->get_context_noise_fast()->set_volume(0, decibel_l, decibel_r); + } } +#endif // ---------------------------------------------------------------------------- // user interface // ---------------------------------------------------------------------------- -void VM::play_tape(_TCHAR* file_path) +void VM::play_tape(int drv, const _TCHAR* file_path) { drec->play_tape(file_path); +// drec->set_remote(true); } -void VM::rec_tape(_TCHAR* file_path) +void VM::rec_tape(int drv, const _TCHAR* file_path) { drec->rec_tape(file_path); +// drec->set_remote(true); } -void VM::close_tape() +void VM::close_tape(int drv) { + emu->lock_vm(); drec->close_tape(); + emu->unlock_vm(); +// drec->set_remote(false); } -bool VM::tape_inserted() +bool VM::is_tape_inserted(int drv) { - return drec->tape_inserted(); + return drec->is_tape_inserted(); } -bool VM::now_skip() +bool VM::is_tape_playing(int drv) { - return event->now_skip(); + return drec->is_tape_playing(); } -void VM::update_config() +bool VM::is_tape_recording(int drv) { - for(DEVICE* device = first_device; device; device = device->next_device) { - device->update_config(); - } + return drec->is_tape_recording(); } -#define STATE_VERSION 1 +int VM::get_tape_position(int drv) +{ + return drec->get_tape_position(); +} -void VM::save_state(FILEIO* state_fio) +const _TCHAR* VM::get_tape_message(int drv) +{ + return drec->get_message(); +} + +void VM::push_play(int drv) +{ + drec->set_ff_rew(0); + drec->set_remote(true); +} + +void VM::push_stop(int drv) +{ + drec->set_remote(false); +} + +void VM::push_fast_forward(int drv) +{ + drec->set_ff_rew(1); + drec->set_remote(true); +} + +void VM::push_fast_rewind(int drv) +{ + drec->set_ff_rew(-1); + drec->set_remote(true); +} + +bool VM::is_frame_skippable() +{ + return event->is_frame_skippable(); +} + +void VM::update_config() { - state_fio->FputUint32(STATE_VERSION); - for(DEVICE* device = first_device; device; device = device->next_device) { - device->save_state(state_fio); + device->update_config(); } } -bool VM::load_state(FILEIO* state_fio) +#define STATE_VERSION 4 + +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; + } + } + // Machine specified. return true; } -