From e4abf1dbcc23bb0d2849072df4e86f5109a3b10a Mon Sep 17 00:00:00 2001 From: meepingsnesroms Date: Fri, 3 Feb 2017 11:23:58 -0800 Subject: [PATCH] Bootloader and gba mode work together,fixed string = null bug --- libgambatte/src/bootloader.cpp | 16 ++++++++++++++-- libgambatte/src/bootloader.h | 2 +- libgambatte/src/gambatte.cpp | 12 ++++++------ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/libgambatte/src/bootloader.cpp b/libgambatte/src/bootloader.cpp index 2af98ab..e0349c3 100644 --- a/libgambatte/src/bootloader.cpp +++ b/libgambatte/src/bootloader.cpp @@ -25,10 +25,17 @@ static bool gbc_mode; +static void patch_gbc_to_gba_mode(){ + /*moves one jump over another and puts ld b,0x01 into the original position*/ + uint16_t patchloc = 0xF2; + uint8_t patch[0x7] = {0xCD,0xD0,0x05/*<-call systemsetup*/,0x06,0x01/*<-ld b,0x1*/,0x00/*<-nop*/,0x00/*<-nop*/}; + memcpy(bootromswapspace + patchloc,patch,0x7); +} + //this is the only retroarch specific function,everything else can just be copied over static std::string get_bootloader_path(std::string bootloadername){ std::string path; - if(bootrompath != NULL){ + if(bootrompath[0] != 0){ path = bootrompath; if(path[path.length() - 1] != '/')path += '/'; path += bootloadername; @@ -47,7 +54,7 @@ bool have_bootloader(bool isgbc){ return exist(path); } -bool loadbootloader(bool isgbc){ +bool loadbootloader(bool isgbc,bool isgba){ unsigned int size; std::string path; int n = 0; @@ -71,6 +78,10 @@ bool loadbootloader(bool isgbc){ using_bootloader = true; gbc_mode = isgbc; + if(isgba){//patch bootloader to fake gba mode + patch_gbc_to_gba_mode(); + } + //backup rom segment that is shared with bootloader memcpy(rombackup,(uint8_t*)addrspace_start,size); @@ -88,6 +99,7 @@ void resetbootloader(){ has_called_FF50 = false; addrspace_start = NULL; using_bootloader = false; + gbc_mode = false; } void set_bootrom_directory(char* dir){ diff --git a/libgambatte/src/bootloader.h b/libgambatte/src/bootloader.h index 27a8dc3..77f86e8 100644 --- a/libgambatte/src/bootloader.h +++ b/libgambatte/src/bootloader.h @@ -1,6 +1,6 @@ //load the rom then call the loadbootloader() function before execution starts bool have_bootloader(bool isgbc); -bool loadbootloader(bool isgbc); +bool loadbootloader(bool isgbc,bool isgba); void resetbootloader(); void set_bootrom_directory(char* dir); diff --git a/libgambatte/src/gambatte.cpp b/libgambatte/src/gambatte.cpp index 1499a97..b16a8d8 100644 --- a/libgambatte/src/gambatte.cpp +++ b/libgambatte/src/gambatte.cpp @@ -61,13 +61,13 @@ void GB::reset() { p_->cpu.setStatePtrs(state); setInitState(state, p_->cpu.isCgb(), p_->gbaCgbMode); - if(bootloaderexists && !p_->gbaCgbMode){ + if(bootloaderexists){ resetbootloader(); set_address_space_start((void*)p_->cpu.rombank0_ptr()); - loadbootloader(p_->cpu.isCgb()); + loadbootloader(p_->cpu.isCgb(), p_->gbaCgbMode); state.cpu.pc = 0x0000; //the hw registers must be zeroed out to prevent the logo from being garbled - memset((void*)(state.mem.ioamhram.get() + 0x100),0x00,0x100); + memset((void*)(state.mem.ioamhram.get() + 0x100), 0x00, 0x100); } p_->cpu.loadState(state); @@ -93,13 +93,13 @@ void GB::Priv::on_load_succeeded(unsigned flags) cpu.setStatePtrs(state); setInitState(state, cpu.isCgb(), gbaCgbMode); - if(bootloaderexists && !gbaCgbMode){ + if(bootloaderexists){ resetbootloader(); set_address_space_start((void*)cpu.rombank0_ptr()); - loadbootloader(cpu.isCgb()); + loadbootloader(cpu.isCgb(), gbaCgbMode); state.cpu.pc = 0x0000; //the hw registers must be zeroed out to prevent the logo from being garbled - memset((void*)(state.mem.ioamhram.get() + 0x100),0x00,0x100); + memset((void*)(state.mem.ioamhram.get() + 0x100), 0x00, 0x100); } cpu.loadState(state);