LMMS
Loading...
Searching...
No Matches
Nes_Cpu.h
Go to the documentation of this file.
1// NES 6502 CPU emulator
2
3// Game_Music_Emu https://bitbucket.org/mpyne/game-music-emu/
4#ifndef NES_CPU_H
5#define NES_CPU_H
6
7#include "blargg_common.h"
8
9typedef blargg_long nes_time_t; // clock cycle count
10typedef unsigned nes_addr_t; // 16-bit address
11enum { future_nes_time = INT_MAX / 2 + 1 };
12
13class Nes_Cpu {
14public:
15 // Clear registers, map low memory and its three mirrors to address 0,
16 // and mirror unmapped_page in remaining memory
17 void reset( void const* unmapped_page = 0 );
18
19 // Map code memory (memory accessed via the program counter). Start and size
20 // must be multiple of page_size. If mirror is true, repeats code page
21 // throughout address range.
22 enum { page_size = 0x800 };
23 void map_code( nes_addr_t start, unsigned size, void const* code, bool mirror = false );
24
25 // Access emulated memory as CPU does
26 uint8_t const* get_code( nes_addr_t );
27
28 // 2KB of RAM at address 0
30
31 // NES 6502 registers. Not kept updated during a call to run().
41
42 // Set end_time and run CPU from current time. Returns true if execution
43 // stopped due to encountering bad_opcode.
44 bool run( nes_time_t end_time );
45
46 // Time of beginning of next instruction to be executed
47 nes_time_t time() const { return state->time + state->base; }
48 void set_time( nes_time_t t ) { state->time = t - state->base; }
49 void adjust_time( int delta ) { state->time += delta; }
50
51 nes_time_t irq_time() const { return irq_time_; }
53
54 nes_time_t end_time() const { return end_time_; }
56
57 // Number of undefined instructions encountered and skipped
59 unsigned long error_count() const { return error_count_; }
60
61 // CPU invokes bad opcode handler if it encounters this
62 enum { bad_opcode = 0xF2 };
63
64public:
66 enum { page_bits = 11 };
67 enum { page_count = 0x10000 >> page_bits };
68 enum { irq_inhibit = 0x04 };
69private:
70 struct state_t {
73 int time;
74 };
75 state_t* state; // points to state_ or a local copy within run()
79 unsigned long error_count_;
80
81 void set_code_page( int, void const* );
82 inline int update_end_time( nes_time_t end, nes_time_t irq );
83};
84
86{
87 return state->code_map [addr >> page_bits] + addr
88 #if !BLARGG_NONPORTABLE
89 % (unsigned) page_size
90 #endif
91 ;
92}
93
95{
96 if ( irq < t && !(r.status & irq_inhibit) ) t = irq;
97 int delta = state->base - t;
98 state->base = t;
99 return delta;
100}
101
103{
104 state->time += update_end_time( end_time_, (irq_time_ = t) );
105}
106
108{
109 state->time += update_end_time( (end_time_ = t), irq_time_ );
110}
111
112#endif
blargg_long nes_time_t
Definition Nes_Apu.h:9
unsigned nes_addr_t
Definition Nes_Apu.h:10
@ future_nes_time
Definition Nes_Cpu.h:11
@ page_bits
Definition Nes_Cpu.h:66
void set_time(nes_time_t t)
Definition Nes_Cpu.h:48
@ page_count
Definition Nes_Cpu.h:67
void adjust_time(int delta)
Definition Nes_Cpu.h:49
@ irq_inhibit
Definition Nes_Cpu.h:68
void map_code(nes_addr_t start, unsigned size, void const *code, bool mirror=false)
Definition Nes_Cpu.cpp:89
void set_code_page(int, void const *)
Definition Nes_Cpu.cpp:51
state_t * state
Definition Nes_Cpu.h:75
bool run(nes_time_t end_time)
Definition Nes_Cpu.cpp:117
state_t state_
Definition Nes_Cpu.h:76
nes_time_t time() const
Definition Nes_Cpu.h:47
nes_time_t end_time() const
Definition Nes_Cpu.h:54
nes_time_t end_time_
Definition Nes_Cpu.h:78
@ page_size
Definition Nes_Cpu.h:22
Nes_Cpu()
Definition Nes_Cpu.h:65
@ bad_opcode
Definition Nes_Cpu.h:62
void set_irq_time(nes_time_t)
Definition Nes_Cpu.h:102
unsigned long error_count_
Definition Nes_Cpu.h:79
int update_end_time(nes_time_t end, nes_time_t irq)
Definition Nes_Cpu.h:94
unsigned long error_count() const
Definition Nes_Cpu.h:59
uint8_t const * get_code(nes_addr_t)
Definition Nes_Cpu.h:85
void reset(void const *unmapped_page=0)
Definition Nes_Cpu.cpp:65
void set_end_time(nes_time_t)
Definition Nes_Cpu.h:107
nes_time_t irq_time() const
Definition Nes_Cpu.h:51
registers_t r
Definition Nes_Cpu.h:40
void clear_error_count()
Definition Nes_Cpu.h:58
nes_time_t irq_time_
Definition Nes_Cpu.h:77
uint8_t low_mem[0x800]
Definition Nes_Cpu.h:29
struct huft * t
Definition inflate.c:943
virtual ASIOError start()=0
unsigned short uint16_t
Definition mid.cpp:99
unsigned char uint8_t
Definition mid.cpp:98
Definition Nes_Cpu.h:32
uint8_t y
Definition Nes_Cpu.h:36
uint8_t x
Definition Nes_Cpu.h:35
uint16_t pc
Definition Nes_Cpu.h:33
uint8_t a
Definition Nes_Cpu.h:34
uint8_t sp
Definition Nes_Cpu.h:38
uint8_t status
Definition Nes_Cpu.h:37
Definition Nes_Cpu.h:70
int time
Definition Nes_Cpu.h:73
nes_time_t base
Definition Nes_Cpu.h:72
uint8_t const * code_map[page_count+1]
Definition Nes_Cpu.h:71
Definition inftrees.h:27
ulg size
Definition extract.c:2350