diff options
Diffstat (limited to 'plugins/gme/game-music-emu-0.6.0/gme/Nes_Cpu.h')
-rw-r--r-- | plugins/gme/game-music-emu-0.6.0/gme/Nes_Cpu.h | 114 |
1 files changed, 0 insertions, 114 deletions
diff --git a/plugins/gme/game-music-emu-0.6.0/gme/Nes_Cpu.h b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Cpu.h deleted file mode 100644 index 694296f7..00000000 --- a/plugins/gme/game-music-emu-0.6.0/gme/Nes_Cpu.h +++ /dev/null @@ -1,114 +0,0 @@ -// NES 6502 CPU emulator - -// Game_Music_Emu 0.5.5 -#ifndef NES_CPU_H -#define NES_CPU_H - -#include "blargg_common.h" - -typedef blargg_long nes_time_t; // clock cycle count -typedef unsigned nes_addr_t; // 16-bit address -enum { future_nes_time = INT_MAX / 2 + 1 }; - -class Nes_Cpu { -public: - typedef BOOST::uint8_t uint8_t; - - // Clear registers, map low memory and its three mirrors to address 0, - // and mirror unmapped_page in remaining memory - void reset( void const* unmapped_page = 0 ); - - // Map code memory (memory accessed via the program counter). Start and size - // must be multiple of page_size. If mirror is true, repeats code page - // throughout address range. - enum { page_size = 0x800 }; - void map_code( nes_addr_t start, unsigned size, void const* code, bool mirror = false ); - - // Access emulated memory as CPU does - uint8_t const* get_code( nes_addr_t ); - - // 2KB of RAM at address 0 - uint8_t low_mem [0x800]; - - // NES 6502 registers. Not kept updated during a call to run(). - struct registers_t { - BOOST::uint16_t pc; - BOOST::uint8_t a; - BOOST::uint8_t x; - BOOST::uint8_t y; - BOOST::uint8_t status; - BOOST::uint8_t sp; - }; - registers_t r; - - // Set end_time and run CPU from current time. Returns true if execution - // stopped due to encountering bad_opcode. - bool run( nes_time_t end_time ); - - // Time of beginning of next instruction to be executed - nes_time_t time() const { return state->time + state->base; } - void set_time( nes_time_t t ) { state->time = t - state->base; } - void adjust_time( int delta ) { state->time += delta; } - - nes_time_t irq_time() const { return irq_time_; } - void set_irq_time( nes_time_t ); - - nes_time_t end_time() const { return end_time_; } - void set_end_time( nes_time_t ); - - // Number of undefined instructions encountered and skipped - void clear_error_count() { error_count_ = 0; } - unsigned long error_count() const { return error_count_; } - - // CPU invokes bad opcode handler if it encounters this - enum { bad_opcode = 0xF2 }; - -public: - Nes_Cpu() { state = &state_; } - enum { page_bits = 11 }; - enum { page_count = 0x10000 >> page_bits }; - enum { irq_inhibit = 0x04 }; -private: - struct state_t { - uint8_t const* code_map [page_count + 1]; - nes_time_t base; - int time; - }; - state_t* state; // points to state_ or a local copy within run() - state_t state_; - nes_time_t irq_time_; - nes_time_t end_time_; - unsigned long error_count_; - - void set_code_page( int, void const* ); - inline int update_end_time( nes_time_t end, nes_time_t irq ); -}; - -inline BOOST::uint8_t const* Nes_Cpu::get_code( nes_addr_t addr ) -{ - return state->code_map [addr >> page_bits] + addr - #if !BLARGG_NONPORTABLE - % (unsigned) page_size - #endif - ; -} - -inline int Nes_Cpu::update_end_time( nes_time_t t, nes_time_t irq ) -{ - if ( irq < t && !(r.status & irq_inhibit) ) t = irq; - int delta = state->base - t; - state->base = t; - return delta; -} - -inline void Nes_Cpu::set_irq_time( nes_time_t t ) -{ - state->time += update_end_time( end_time_, (irq_time_ = t) ); -} - -inline void Nes_Cpu::set_end_time( nes_time_t t ) -{ - state->time += update_end_time( (end_time_ = t), irq_time_ ); -} - -#endif |