X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=source%2Fsrc%2Fvm%2Ffp1100%2Ffp1100.cpp;h=e5eba0ccda530a1a86f5094d8ab2a9e6e747bb2f;hb=2fc1443c0f411167f1b61ff87e13fee36cd5876b;hp=fe3e45c7c06d2018d55cc28b3d319fd3b485ca5f;hpb=181d7dd85bf1338f72dc54518ede7deeb68420a1;p=csp-qt%2Fcommon_source_project-fm7.git diff --git a/source/src/vm/fp1100/fp1100.cpp b/source/src/vm/fp1100/fp1100.cpp index fe3e45c7c..e5eba0ccd 100644 --- a/source/src/vm/fp1100/fp1100.cpp +++ b/source/src/vm/fp1100/fp1100.cpp @@ -16,6 +16,7 @@ #include "../datarec.h" #include "../disk.h" #include "../hd46505.h" +#include "../noise.h" #include "../upd765a.h" #include "../upd7801.h" #include "../z80.h" @@ -34,43 +35,68 @@ // initialize // ---------------------------------------------------------------------------- -VM::VM(EMU* parent_emu) : emu(parent_emu) +using FP1100::MAIN; +using FP1100::SUB; +using FP1100::FDCPACK; +using FP1100::RAMPACK; +using FP1100::ROMPACK; + +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")); + beep = new BEEP(this, emu); 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)); crtc = new HD46505(this, emu); fdc = new UPD765A(this, emu); + 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)); subcpu = new UPD7801(this, emu); maincpu = new Z80(this, emu); + subcpu->set_device_name(_T("SUB CPU (uPD7801)")); + maincpu->set_device_name(_T("MAIN CPU (Z80)")); mainbus = new MAIN(this, emu); subbus = new SUB(this, emu); fdcpack = new FDCPACK(this, emu); rampack1 = new RAMPACK(this, emu); rampack1->index = 1; + rampack1->set_device_name(_T("RAM Pack #1")); rampack2 = new RAMPACK(this, emu); rampack2->index = 2; + rampack2->set_device_name(_T("RAM Pack #2")); rampack3 = new RAMPACK(this, emu); rampack3->index = 3; + rampack3->set_device_name(_T("RAM Pack #3")); rampack4 = new RAMPACK(this, emu); rampack4->index = 4; + rampack4->set_device_name(_T("RAM Pack #4")); rampack5 = new RAMPACK(this, emu); rampack5->index = 5; + rampack5->set_device_name(_T("RAM Pack #5")); rampack6 = new RAMPACK(this, emu); rampack6->index = 6; + rampack6->set_device_name(_T("RAM Pack #6")); rompack = new ROMPACK(this, emu); - // set contexts event->set_context_cpu(maincpu); event->set_context_cpu(subcpu, SUB_CPU_CLOCKS); event->set_context_sound(beep); event->set_context_sound(drec); - + 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()); + 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()); drec->set_context_ear(subbus, SIG_SUB_EAR, 1); crtc->set_context_hsync(subbus, SIG_SUB_HSYNC, 1); fdc->set_context_drq(mainbus, SIG_MAIN_INTA, 1); @@ -110,6 +136,9 @@ VM::VM(EMU* parent_emu) : emu(parent_emu) #endif // 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(); } @@ -186,12 +215,6 @@ void VM::draw_screen() subbus->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 // ---------------------------------------------------------------------------- @@ -222,6 +245,14 @@ void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r) beep->set_volume(0, decibel_l, decibel_r); } else if(ch == 1) { drec->set_volume(0, decibel_l, decibel_r); + } else if(ch == 2) { + 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); + } else if(ch == 3) { + 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 @@ -269,41 +300,79 @@ bool VM::is_floppy_disk_protected(int drv) return fdc->is_disk_protected(drv); } -void VM::play_tape(const _TCHAR* file_path) +uint32_t VM::is_floppy_disk_accessed() +{ + return fdc->read_signal(0); +} + +void VM::play_tape(int drv, const _TCHAR* file_path) { drec->play_tape(file_path); +// drec->set_remote(true); } -void VM::rec_tape(const _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::is_tape_inserted() +bool VM::is_tape_inserted(int drv) { return drec->is_tape_inserted(); } -bool VM::is_tape_playing() +bool VM::is_tape_playing(int drv) { return drec->is_tape_playing(); } -bool VM::is_tape_recording() +bool VM::is_tape_recording(int drv) { return drec->is_tape_recording(); } -int VM::get_tape_position() +int VM::get_tape_position(int drv) { return drec->get_tape_position(); } +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(); @@ -316,27 +385,38 @@ void VM::update_config() } } -#define STATE_VERSION 2 +#define STATE_VERSION 4 -void VM::save_state(FILEIO* state_fio) +bool VM::process_state(FILEIO* state_fio, bool loading) { - state_fio->FputUint32(STATE_VERSION); - - for(DEVICE* device = first_device; device; device = device->next_device) { - device->save_state(state_fio); - } -} - -bool VM::load_state(FILEIO* state_fio) -{ - 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; } -