X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=source%2Fsrc%2Fvm%2Ffamilybasic%2Ffamilybasic.cpp;h=ad7e7e8f39868a13067b1ef916aeb7e33501d725;hb=90a1d498c79c26d69c78435600856b152aa07291;hp=16d6bf17323561fee1de1412ede3287e00f9b00d;hpb=6e5fce336fd11988c4ce4b667bd453b08fc2949a;p=csp-qt%2Fcommon_source_project-fm7.git diff --git a/source/src/vm/familybasic/familybasic.cpp b/source/src/vm/familybasic/familybasic.cpp index 16d6bf173..ad7e7e8f3 100644 --- a/source/src/vm/familybasic/familybasic.cpp +++ b/source/src/vm/familybasic/familybasic.cpp @@ -15,6 +15,12 @@ #include "../datarec.h" #include "../m6502.h" +#include "../noise.h" +#include "../ym2413.h" + +#ifdef USE_DEBUGGER +#include "../debugger.h" +#endif #include "memory.h" #include "apu.h" @@ -24,7 +30,7 @@ // initialize // ---------------------------------------------------------------------------- -VM::VM(EMU* parent_emu) : emu(parent_emu) +VM::VM(EMU* parent_emu) : VM_TEMPLATE(parent_emu) { // check configs // boot_mode = config.boot_mode; @@ -36,33 +42,54 @@ VM::VM(EMU* parent_emu) : emu(parent_emu) event = new EVENT(this, emu); // must be 2nd device drec = new DATAREC(this, emu); - cpu = new M6502(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)); +// cpu = new M6502(this, emu); + opll = new YM2413(this, emu); memory = new MEMORY(this, emu); apu = new APU(this, emu); ppu = new PPU(this, emu); + cpu = new N2A03(this, emu); // cpu shoud be reset after other device + + dummy->set_device_name(_T("1st Dummy")); // set contexts event->set_context_cpu(cpu); event->set_context_sound(apu); + event->set_context_sound(drec); + event->set_context_sound(opll); + 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()); memory->set_context_cpu(cpu); memory->set_context_apu(apu); memory->set_context_ppu(ppu); memory->set_context_drec(drec); + memory->set_context_opll(opll); memory->set_spr_ram_ptr(ppu->get_spr_ram()); apu->set_context_cpu(cpu); apu->set_context_memory(memory); ppu->set_context_cpu(cpu); + ppu->set_context_memory(memory); // cpu bus cpu->set_context_mem(memory); cpu->set_context_intr(dummy); +#ifdef USE_DEBUGGER + cpu->set_context_debugger(new DEBUGGER(this, 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(); } + decl_state(); } VM::~VM() @@ -103,9 +130,18 @@ void VM::reset() } else if(config.boot_mode == 1) { memory->load_rom_image(_T("BASIC_V3.NES")); ppu->load_rom_image(_T("BASIC_V3.NES")); - } else { + } else if(config.boot_mode == 2) { memory->load_rom_image(_T("PLAYBOX_BASIC.NES")); ppu->load_rom_image(_T("PLAYBOX_BASIC.NES")); + } else if(config.boot_mode == 3) { + memory->load_rom_image(_T("VRC7_BASIC_V2.NES")); + ppu->load_rom_image(_T("VRC7_BASIC_V2.NES")); + } else if(config.boot_mode == 4) { + memory->load_rom_image(_T("VRC7_BASIC_V3.NES")); + ppu->load_rom_image(_T("VRC7_BASIC_V3.NES")); + } else if(config.boot_mode == 5) { + memory->load_rom_image(_T("MMC5_BASIC_V3.NES")); + ppu->load_rom_image(_T("MMC5_BASIC_V3.NES")); } boot_mode = config.boot_mode; } @@ -122,6 +158,20 @@ void VM::run() } // ---------------------------------------------------------------------------- +// debugger +// ---------------------------------------------------------------------------- + +#ifdef USE_DEBUGGER +DEVICE *VM::get_cpu(int index) +{ + if(index == 0) { + return cpu; + } + return NULL; +} +#endif + +// ---------------------------------------------------------------------------- // draw screen // ---------------------------------------------------------------------------- @@ -141,48 +191,111 @@ void VM::initialize_sound(int rate, int samples) // init sound gen apu->initialize_sound(rate, samples); + opll->initialize_sound(rate, 3579545, samples); } -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->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) +{ + if(ch == 0) { + apu->set_volume(0, decibel_l, decibel_r); + } else if(ch == 1) { + opll->set_volume(0, decibel_l, decibel_r); + } else if(ch == 2) { + drec->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 + // ---------------------------------------------------------------------------- // 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->write_signal(SIG_DATAREC_REMOTE, 1, 1); +// 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->write_signal(SIG_DATAREC_REMOTE, 1, 1); +// drec->set_remote(true); } -void VM::close_tape() +void VM::close_tape(int drv) { + emu->lock_vm(); drec->close_tape(); - drec->write_signal(SIG_DATAREC_REMOTE, 0, 1); + emu->unlock_vm(); +// drec->set_remote(false); +} + +bool VM::is_tape_inserted(int drv) +{ + return drec->is_tape_inserted(); +} + +bool VM::is_tape_playing(int drv) +{ + return drec->is_tape_playing(); +} + +bool VM::is_tape_recording(int drv) +{ + return drec->is_tape_recording(); +} + +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); } -bool VM::tape_inserted() +void VM::push_fast_rewind(int drv) { - return drec->tape_inserted(); + drec->set_ff_rew(-1); + drec->set_remote(true); } -bool VM::now_skip() +bool VM::is_frame_skippable() { - return event->now_skip(); + return event->is_frame_skippable(); } void VM::update_config() @@ -198,3 +311,53 @@ void VM::update_config() } } +#define STATE_VERSION 5 + +#include "../../statesub.h" +#include "../../qt/gui/csp_logger.h" +extern CSP_Logger DLL_PREFIX_I *csp_logger; + +void VM::decl_state(void) +{ + state_entry = new csp_state_utils(STATE_VERSION, 0, (_TCHAR *)(_T("CSP::FAMILY_BASIC_HEAD")), csp_logger); + DECL_STATE_ENTRY_INT32(boot_mode); + + for(DEVICE* device = first_device; device; device = device->next_device) { + device->decl_state(); + } +} +void VM::save_state(FILEIO* state_fio) +{ + //state_fio->FputUint32(STATE_VERSION); + + if(state_entry != NULL) { + state_entry->save_state(state_fio); + } + for(DEVICE* device = first_device; device; device = device->next_device) { + device->save_state(state_fio); + } + //state_fio->FputInt32(boot_mode); // Move to decl_state(). +} + +bool VM::load_state(FILEIO* state_fio) +{ + //if(state_fio->FgetUint32() != STATE_VERSION) { + // return false; + //} + bool mb = false; + if(state_entry != NULL) { + mb = state_entry->load_state(state_fio); + } + if(!mb) { + emu->out_debug_log("INFO: HEADER DATA ERROR"); + return false; + } + for(DEVICE* device = first_device; device; device = device->next_device) { + if(!device->load_state(state_fio)) { + return false; + } + } + //boot_mode = state_fio->FgetInt32(); + return true; +} +