BizHawk/quicknes/nes_emu/nes_util.h

91 lines
2.4 KiB
C++

// Experimental utilities for NES emulator
// Nes_Emu 0.7.0
#ifndef NES_UTIL_H
#define NES_UTIL_H
#include "blargg_common.h"
class Nes_Emu;
class Nes_Cart;
class Joypad_Filter {
public:
Joypad_Filter();
// Control filtering of simultaneous directions. Enabled by default.
void enable_filtering( bool = true );
// Prevents simultaneous left+right and up+down to avoid problems in some games.
// Also turns bits 8 and 9 into turbo A and B.
int process( int joypad );
// Set A and B turbo rates, where 1.0 is maximum and 0.0 disables them
void set_a_rate( double r ) { rates [0] = (int) (r * 0x100); }
void set_b_rate( double r ) { rates [1] = (int) (r * 0x100); }
// Call after each emulated frame for which Nes_Emu::frame().joypad_read_count
// is non-zero.
void clock_turbo();
private:
int prev;
int mask;
int times [2];
int rates [2];
};
struct game_genie_patch_t
{
unsigned addr; // always 0x8000 or greater
int change_to;
int compare_with; // if -1, always change byte
// Decode Game Genie code
blargg_err_t decode( const char* in );
// Apply patch to cartridge data. Might not work for some codes, since this really
// requires emulator support. Returns number of bytes changed, where 0
// means patch wasn't for that cartridge.
int apply( Nes_Cart& ) const;
};
class Cheat_Value_Finder {
public:
Cheat_Value_Finder();
// Start scanning emulator's memory for values that are constantly changing.
void start( Nes_Emu* );
// Rescan memory and eliminate any changed bytes from later matching.
// Should be called many times after begin_scan() and before begin_matching().
void rescan();
// Start search for any bytes which changed by difference between original and
// changed values.
void search( int original, int changed );
// Get next match and return its delta from changed value (closer to 0
// is more likely to be a match), or no_match if there are no more matches.
// Optionally returns address of matched byte.
enum { no_match = 0x100 };
int next_match( int* addr = NULL );
// Change current match to new value. Returns previous value.
int change_value( int new_value );
private:
typedef BOOST::uint8_t byte;
Nes_Emu* emu;
int original_value;
int changed_value;
int pos;
enum { low_mem_size = 0x800 };
byte original [low_mem_size];
byte changed [low_mem_size];
};
#endif