LMMS
Loading...
Searching...
No Matches
Hes_Cpu.h
Go to the documentation of this file.
1// PC Engine CPU emulator for use with HES music files
2
3// Game_Music_Emu https://bitbucket.org/mpyne/game-music-emu/
4#ifndef HES_CPU_H
5#define HES_CPU_H
6
7#include "blargg_common.h"
8
9typedef blargg_long hes_time_t; // clock cycle count
10typedef unsigned hes_addr_t; // 16-bit address
11enum { future_hes_time = INT_MAX / 2 + 1 };
12
13class Hes_Cpu {
14public:
15 void reset();
16
17 enum { page_size = 0x2000 };
18 enum { page_shift = 13 };
19 enum { page_count = 8 };
20 void set_mmr( int reg, int bank );
21
22 uint8_t const* get_code( hes_addr_t );
23
25
26 // not kept updated during a call to run()
36
37 // page mapping registers
39
40 // Set end_time and run CPU from current time. Returns true if any illegal
41 // instructions were encountered.
42 bool run( hes_time_t end_time );
43
44 // Time of beginning of next instruction to be executed
45 hes_time_t time() const { return state->time + state->base; }
46 void set_time( hes_time_t t ) { state->time = t - state->base; }
47 void adjust_time( int delta ) { state->time += delta; }
48
49 hes_time_t irq_time() const { return irq_time_; }
51
52 hes_time_t end_time() const { return end_time_; }
54
55 void end_frame( hes_time_t );
56
57 // Attempt to execute instruction here results in CPU advancing time to
58 // lesser of irq_time() and end_time() (or end_time() if IRQs are
59 // disabled)
60 enum { idle_addr = 0x1FFF };
61
62 // Can read this many bytes past end of a page
63 enum { cpu_padding = 8 };
64
65public:
67 enum { irq_inhibit = 0x04 };
68private:
69 // noncopyable
70 Hes_Cpu( const Hes_Cpu& );
72
73 struct state_t {
76 blargg_long time;
77 };
78 state_t* state; // points to state_ or a local copy within run()
82
83 void set_code_page( int, void const* );
84 inline int update_end_time( hes_time_t end, hes_time_t irq );
85};
86
88{
89 return state->code_map [addr >> page_shift] + addr
90 #if !BLARGG_NONPORTABLE
91 % (unsigned) page_size
92 #endif
93 ;
94}
95
97{
98 if ( irq < t && !(r.status & irq_inhibit) ) t = irq;
99 int delta = state->base - t;
100 state->base = t;
101 return delta;
102}
103
105{
106 state->time += update_end_time( end_time_, (irq_time_ = t) );
107}
108
110{
111 state->time += update_end_time( (end_time_ = t), irq_time_ );
112}
113
115{
116 assert( state == &state_ );
117 state_.base -= t;
120}
121
122#endif
@ future_hes_time
Definition Hes_Cpu.h:11
blargg_long hes_time_t
Definition Hes_Cpu.h:9
unsigned hes_addr_t
Definition Hes_Cpu.h:10
assert(0)
bool run(hes_time_t end_time)
Definition Hes_Cpu.cpp:90
registers_t r
Definition Hes_Cpu.h:35
@ page_size
Definition Hes_Cpu.h:17
Hes_Cpu()
Definition Hes_Cpu.h:66
hes_time_t end_time_
Definition Hes_Cpu.h:81
@ irq_inhibit
Definition Hes_Cpu.h:67
uint8_t mmr[page_count+1]
Definition Hes_Cpu.h:38
Hes_Cpu(const Hes_Cpu &)
void set_mmr(int reg, int bank)
Definition Hes_Cpu.cpp:69
@ page_shift
Definition Hes_Cpu.h:18
state_t state_
Definition Hes_Cpu.h:79
void set_irq_time(hes_time_t)
Definition Hes_Cpu.h:104
hes_time_t irq_time_
Definition Hes_Cpu.h:80
void reset()
Definition Hes_Cpu.cpp:49
uint8_t const * get_code(hes_addr_t)
Definition Hes_Cpu.h:87
void set_code_page(int, void const *)
hes_time_t end_time() const
Definition Hes_Cpu.h:52
@ idle_addr
Definition Hes_Cpu.h:60
state_t * state
Definition Hes_Cpu.h:78
@ cpu_padding
Definition Hes_Cpu.h:63
int update_end_time(hes_time_t end, hes_time_t irq)
Definition Hes_Cpu.h:96
uint8_t ram[page_size]
Definition Hes_Cpu.h:24
hes_time_t irq_time() const
Definition Hes_Cpu.h:49
void adjust_time(int delta)
Definition Hes_Cpu.h:47
Hes_Cpu & operator=(const Hes_Cpu &)
void set_end_time(hes_time_t)
Definition Hes_Cpu.h:109
@ page_count
Definition Hes_Cpu.h:19
void end_frame(hes_time_t)
Definition Hes_Cpu.h:114
hes_time_t time() const
Definition Hes_Cpu.h:45
void set_time(hes_time_t t)
Definition Hes_Cpu.h:46
struct huft * t
Definition inflate.c:943
unsigned short uint16_t
Definition mid.cpp:99
unsigned char uint8_t
Definition mid.cpp:98
Definition Hes_Cpu.h:27
uint8_t sp
Definition Hes_Cpu.h:33
uint8_t a
Definition Hes_Cpu.h:29
uint16_t pc
Definition Hes_Cpu.h:28
uint8_t status
Definition Hes_Cpu.h:32
uint8_t x
Definition Hes_Cpu.h:30
uint8_t y
Definition Hes_Cpu.h:31
Definition Hes_Cpu.h:73
blargg_long time
Definition Hes_Cpu.h:76
uint8_t const * code_map[page_count+1]
Definition Hes_Cpu.h:74
hes_time_t base
Definition Hes_Cpu.h:75