diff --git a/cdl/InputLogger.cpp b/cdl/InputLogger.cpp index e0a9be4..3927f06 100644 --- a/cdl/InputLogger.cpp +++ b/cdl/InputLogger.cpp @@ -85,18 +85,20 @@ unsigned long long libRR_playback_next_input_state() { // // # libRR_log_input_state_bitmask - this is the prefered solution to use in a core if possible // -void libRR_log_input_state_bitmask(retro_input_state_t input_cb) { - int16_t ret = input_cb( 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_MASK ); - button_history.push(ret); - // printf("Logging input state frame:%d result:%d \n", RRCurrentFrame, ret); +retro_input_state_t base_input_cb; +int16_t libRR_log_input_state_bitmask(unsigned int port, unsigned int device, unsigned int index, unsigned int id) { + int16_t baseResult = base_input_cb(port, device, index, id); + button_history.push(baseResult); + return baseResult; } retro_input_state_t libRR_handle_input(retro_input_state_t input_cb) { - if (libRR_should_playback_input) { - return libRR_playback(); - } - libRR_log_input_state_bitmask(input_cb); - return input_cb; + // if (libRR_should_playback_input) { + // return libRR_playback(); + // } + + base_input_cb = input_cb; + return libRR_log_input_state_bitmask; } diff --git a/cdl/Setup.cpp b/cdl/Setup.cpp index 25c1c22..28e8768 100644 --- a/cdl/Setup.cpp +++ b/cdl/Setup.cpp @@ -28,14 +28,13 @@ int libRR_should_Load_EPROM = 0; int libRR_message_duration_in_frames = 180; json libRR_settings = json::parse("{ \"paused\": true, \"fullLogging\": false }"); extern bool libRR_full_trace_log; +extern retro_environment_t environ_cb; std::map playthroughs = {}; // current_emulator_state holds all the game core information such as Game Name, CD Tracks, Memory regions etc // This is never changed from Web requests, and is not often changed at all // /*libRR_emulator_state*/ json current_emulator_state = {}; -retro_environment_t environ_cb = {}; - std::vector libRR_save_states = {}; // @@ -119,11 +118,11 @@ json libRR_get_list_of_memory_regions() return memory_descriptors; } -void libRR_setup_retro_base_directory() { +void libRR_setup_retro_base_directory(retro_environment_t _environ_cb) { // Setup path const char *dir = NULL; - if (environ_cb(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &dir) && dir) { + if (_environ_cb(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &dir) && dir) { snprintf(libRR_save_directory, sizeof(libRR_save_directory), "%s", dir); } else { @@ -131,7 +130,7 @@ void libRR_setup_retro_base_directory() { } dir = NULL; - if (environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir) && dir) + if (_environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &dir) && dir) { snprintf(retro_base_directory, sizeof(retro_base_directory), "%s", dir); } @@ -141,9 +140,9 @@ void libRR_setup_retro_base_directory() { // end setup path } -void libRR_setup_directories() { +void libRR_setup_directories(retro_environment_t _environ_cb) { printf("libRR_setup_directories"); - libRR_setup_retro_base_directory(); + libRR_setup_retro_base_directory(_environ_cb); #ifdef EMSCRIPTEN libRR_project_directory = ""; @@ -201,9 +200,8 @@ extern string libRR_game_name; extern string libRR_rom_name; void libRR_handle_load_game(const struct retro_game_info *info, retro_environment_t _environ_cb) { - environ_cb = _environ_cb; printf("Loading a new ROM \n"); - libRR_setup_console_details(environ_cb); + libRR_setup_console_details(_environ_cb); libRR_rom_name = extract_basename(info->path); @@ -216,7 +214,7 @@ void libRR_handle_load_game(const struct retro_game_info *info, retro_environmen // // Setup reversing files // - libRR_setup_directories(); + libRR_setup_directories(_environ_cb); read_json_config(); init_playthrough(libRR_current_playthrough_name); // todo get name from front end setup_web_server(); @@ -589,7 +587,9 @@ void libRR_display_message(const char *format, ...) msg.frames = libRR_message_duration_in_frames; msg.msg = strc; - environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, &msg); + if (environ_cb != NULL) + environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, &msg); + free(str); } diff --git a/consoles/N64.cpp b/consoles/N64.cpp index a7647cf..6358870 100644 --- a/consoles/N64.cpp +++ b/consoles/N64.cpp @@ -40,7 +40,47 @@ void console_log_jump_return(int take_jump, uint32_t jump_target, uint32_t pc, u extern "C" { - // +string get_slot_for_address(int32_t offset) { + return "0"; +} + +string write_console_asm_header() { + string contents = ""; + return contents; +} + +// The following are only needed for consoles with CDs +string retro_cd_base_directory = "libRR_RememberToSetCDBase"; +string retro_cd_path = "libRR_RememberToSetCDPATH"; +string retro_cd_base_name = "libRR_RememberToBaseName"; + +const char* libRR_console = "N64"; + +struct retro_memory_map libRR_retromap = { 0 }; + +// Delay slot variables +uint32_t libRR_delay_slot_pc = 0; +bool libRR_isDelaySlot = false; + +// Bank switching +uint32_t libRR_bank_size = 0; +uint16_t libRR_current_bank_slot_0 = 1; +uint16_t libRR_current_bank_slot_1 = 2; +uint16_t libRR_current_bank_slot_2 = 3; +uint32_t libRR_slot_0_max_addr = 0x4000; +uint32_t libRR_slot_1_max_addr = 0x7fff; +uint32_t libRR_slot_2_max_addr = 0x7fff; +bool libRR_bank_switching_available = false; + +void libRR_setup_console_details(retro_environment_t environ_cb) { + printf("TODO: Setup setting such as libRR_define_console_memory_region for this console\n"); + // libRR_set_retro_memmap(environ_cb); +} + +// Mupen doesn't have this defined so: +char retro_base_directory[4096]; + +// // # Toggles // bool support_n64_prints = false; @@ -234,6 +274,7 @@ void readJsonFromFile() { void cdl_log_pif_ram(uint32_t address, uint32_t* value) { #ifndef USE_CDL + function_stack.push_back(0); return; #endif printf("Game was reset? \n"); @@ -474,7 +515,7 @@ void cdl_log_rsp(uint32_t log_type, uint32_t address, const char * extra_data) { if (audio_address.find(address) != audio_address.end() ) return; audio_address[address] = n2hexstr(address)+extra_data; - // cout << "Alist address:" << std::hex << address << " " << extra_data << "\n"; + cout << "Alist address:" << std::hex << address << " " << extra_data << "\n"; return; } if (log_type == CDL_UCODE_CRC) { @@ -602,11 +643,13 @@ bool isAddressCartROM(uint32_t address) { void cdl_log_audio_sample(uint32_t saved_ai_dram, uint32_t saved_ai_length) { if (audio_samples.find(saved_ai_dram) != audio_samples.end() ) return; + + printf("audio_plugin_push_samples AI_DRAM_ADDR_REG:%#08x length:%#08x\n", saved_ai_dram, saved_ai_length); + auto t = cdl_dram_cart_map(); t.dram_offset = n2hexstr(saved_ai_dram); t.rom_offset = n2hexstr(saved_ai_length); audio_samples[saved_ai_dram] = t; - // printf("audio_plugin_push_samples AI_DRAM_ADDR_REG:%#08x length:%#08x\n", saved_ai_dram, saved_ai_length); } void cdl_log_cart_rom_dma_write(uint32_t dram_addr, uint32_t cart_addr, uint32_t length) { @@ -907,7 +950,7 @@ void log_dma_write(uint8_t* mem, uint32_t proper_cart_address, uint32_t cart_add return; auto t = cdl_dma(); - t.dram_start=dram_addr; + t.dram_start = dram_addr; t.dram_end = dram_addr+length; t.rom_start = proper_cart_address; t.rom_end = proper_cart_address+length; @@ -916,13 +959,19 @@ void log_dma_write(uint8_t* mem, uint32_t proper_cart_address, uint32_t cart_add t.header = mem[proper_cart_address+3]; t.frame = l_CurrentFrame; - // if (function_stack.size() > 0 && labels.find(current_function) != labels.end()) { - t.func_addr = print_function_stack_trace(); // labels[current_function].func_name; - // } + if (function_stack.size() > 0 && labels.find(current_function) != labels.end()) { + t.func_addr = print_function_stack_trace(); // labels[current_function].func_name; + } dmas[proper_cart_address] = t; - // std::cout << "DMA: Dram:0x" << std::hex << t.dram_start << "->0x" << t.dram_end << " Length:0x" << t.length << " " << t.ascii_header << " Stack:" << function_stack.size() << " " << t.func_addr << " last:"<< function_stack.back() << "\n"; + uint32_t last = 0; + if (function_stack.size() > 0) { + last = function_stack.back(); + } else { + std::cout << "Warning: function stack empty" << std::endl; + } + std::cout << "DMA: Dram:0x" << std::hex << t.dram_start << "->0x" << t.dram_end << " Length:0x" << t.length << " " << t.ascii_header << " Stack:" << function_stack.size() << " " << t.func_addr << " last:" << last << "\n"; } @@ -1204,4 +1253,15 @@ uint32_t cdl_get_alternative_jump(uint32_t current_jump) { void libRR_export_all_files() { printf("N64: Export All files to Reversing Project, depends on which core we are using"); } + + uint32_t libRR_pc_lookahead = 0; + + int get_current_bank_number_for_address(uint32_t addr) { + return 0; + } + + void add_console_specific_game_json() { + // TODO: Add special value to game_json e.g: + // game_json["VDP2"]["TVMD"]["DisplayOn"] = VDP2::DisplayOn; + } } \ No newline at end of file