LMMS
Loading...
Searching...
No Matches
Kss_Cpu.h
Go to the documentation of this file.
1// Z80 CPU emulator
2
3// Game_Music_Emu https://bitbucket.org/mpyne/game-music-emu/
4#ifndef KSS_CPU_H
5#define KSS_CPU_H
6
7#include "blargg_endian.h"
8
9typedef blargg_long cpu_time_t;
10
11// must be defined by caller
12void kss_cpu_out( class Kss_Cpu*, cpu_time_t, unsigned addr, int data );
13int kss_cpu_in( class Kss_Cpu*, cpu_time_t, unsigned addr );
14void kss_cpu_write( class Kss_Cpu*, unsigned addr, int data );
15
16class Kss_Cpu {
17public:
18 // Clear registers and map all pages to unmapped
19 void reset( void* unmapped_write, void const* unmapped_read );
20
21 // Map memory. Start and size must be multiple of page_size.
22 enum { page_size = 0x2000 };
23 void map_mem( unsigned addr, blargg_ulong size, void* write, void const* read );
24
25 // Map address to page
26 uint8_t* write( unsigned addr );
27 uint8_t const* read( unsigned addr );
28
29 // Run until specified time is reached. Returns true if suspicious/unsupported
30 // instruction was encountered at any point during run.
31 bool run( cpu_time_t end_time );
32
33 // Time of beginning of next instruction
34 cpu_time_t time() const { return state->time + state->base; }
35
36 // Alter current time. Not supported during run() call.
37 void set_time( cpu_time_t t ) { state->time = t - state->base; }
38 void adjust_time( int delta ) { state->time += delta; }
39
40 #if BLARGG_BIG_ENDIAN
41 struct regs_t { uint8_t b, c, d, e, h, l, flags, a; };
42 #else
43 struct regs_t { uint8_t c, b, e, d, l, h, a, flags; };
44 #endif
45 BOOST_STATIC_ASSERT( sizeof (regs_t) == 8 );
46
47 struct pairs_t { uint16_t bc, de, hl, fa; };
48
49 // Registers are not updated until run() returns
50 struct registers_t {
55 union {
56 regs_t b; // b.b, b.c, b.d, b.e, b.h, b.l, b.flags, b.a
57 pairs_t w; // w.bc, w.de, w.hl. w.fa
58 };
59 union {
60 regs_t b;
61 pairs_t w;
62 } alt;
68 };
69 //registers_t r; (below for efficiency)
70
71 enum { idle_addr = 0xFFFF };
72
73 // can read this far past end of a page
74 enum { cpu_padding = 0x100 };
75
76public:
77 Kss_Cpu();
78 enum { page_shift = 13 };
79 enum { page_count = 0x10000 >> page_shift };
80private:
81 uint8_t szpc [0x200];
89 state_t* state; // points to state_ or a local copy within run()
92 void set_page( int i, void* write, void const* read );
93public:
95};
96
97#if BLARGG_NONPORTABLE
98 #define KSS_CPU_PAGE_OFFSET( addr ) (addr)
99#else
100 #define KSS_CPU_PAGE_OFFSET( addr ) ((addr) & (page_size - 1))
101#endif
102
103inline uint8_t* Kss_Cpu::write( unsigned addr )
104{
105 return state->write [addr >> page_shift] + KSS_CPU_PAGE_OFFSET( addr );
106}
107
108inline uint8_t const* Kss_Cpu::read( unsigned addr )
109{
110 return state->read [addr >> page_shift] + KSS_CPU_PAGE_OFFSET( addr );
111}
112
114{
115 cpu_time_t delta = state->base - t;
116 state->base = t;
117 state->time += delta;
118}
119
120#endif
blargg_long cpu_time_t
Definition Ay_Cpu.h:9
void kss_cpu_write(class Kss_Cpu *, unsigned addr, int data)
Definition Kss_Emu.cpp:307
#define KSS_CPU_PAGE_OFFSET(addr)
Definition Kss_Cpu.h:100
void kss_cpu_out(class Kss_Cpu *, cpu_time_t, unsigned addr, int data)
Definition Kss_Emu.cpp:314
int kss_cpu_in(class Kss_Cpu *, cpu_time_t, unsigned addr)
Definition Kss_Emu.cpp:364
uint8_t a
Definition Spc_Cpu.h:141
Definition Kss_Cpu.h:16
void reset(void *unmapped_write, void const *unmapped_read)
Definition Kss_Cpu.cpp:86
@ page_count
Definition Kss_Cpu.h:79
uint8_t * write(unsigned addr)
Definition Kss_Cpu.h:103
void set_page(int i, void *write, void const *read)
Definition Kss_Cpu.cpp:79
bool run(cpu_time_t end_time)
Definition Kss_Cpu.cpp:165
void set_end_time(cpu_time_t t)
Definition Kss_Cpu.h:113
state_t state_
Definition Kss_Cpu.h:90
Kss_Cpu()
Definition Kss_Cpu.cpp:62
BOOST_STATIC_ASSERT(sizeof(regs_t)==8)
void set_time(cpu_time_t t)
Definition Kss_Cpu.h:37
@ page_shift
Definition Kss_Cpu.h:78
@ cpu_padding
Definition Kss_Cpu.h:74
uint8_t const * read(unsigned addr)
Definition Kss_Cpu.h:108
uint8_t szpc[0x200]
Definition Kss_Cpu.h:81
@ page_size
Definition Kss_Cpu.h:22
@ idle_addr
Definition Kss_Cpu.h:71
cpu_time_t time() const
Definition Kss_Cpu.h:34
void map_mem(unsigned addr, blargg_ulong size, void *write, void const *read)
Definition Kss_Cpu.cpp:100
cpu_time_t end_time_
Definition Kss_Cpu.h:82
void adjust_time(int delta)
Definition Kss_Cpu.h:38
state_t * state
Definition Kss_Cpu.h:89
registers_t r
Definition Kss_Cpu.h:94
* e
Definition inflate.c:1404
UINT_D64 w
Definition inflate.c:942
int * l
Definition inflate.c:1579
struct huft * t
Definition inflate.c:943
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
JSAMPIMAGE data
Definition jpeglib.h:945
unsigned short uint16_t
Definition mid.cpp:99
unsigned char uint8_t
Definition mid.cpp:98
Definition Kss_Cpu.h:47
uint16_t hl
Definition Kss_Cpu.h:47
uint16_t bc
Definition Kss_Cpu.h:47
uint16_t fa
Definition Kss_Cpu.h:47
uint16_t de
Definition Kss_Cpu.h:47
Definition Kss_Cpu.h:50
uint8_t im
Definition Kss_Cpu.h:67
uint16_t ix
Definition Kss_Cpu.h:53
pairs_t w
Definition Kss_Cpu.h:57
uint8_t iff2
Definition Kss_Cpu.h:64
uint8_t iff1
Definition Kss_Cpu.h:63
uint8_t i
Definition Kss_Cpu.h:66
uint8_t r
Definition Kss_Cpu.h:65
regs_t b
Definition Kss_Cpu.h:56
uint16_t sp
Definition Kss_Cpu.h:52
uint16_t pc
Definition Kss_Cpu.h:51
union Kss_Cpu::registers_t::@155077333273116117016242023202215324133355246213 alt
uint16_t iy
Definition Kss_Cpu.h:54
Definition Kss_Cpu.h:43
uint8_t d
Definition Kss_Cpu.h:43
uint8_t l
Definition Kss_Cpu.h:43
uint8_t e
Definition Kss_Cpu.h:43
uint8_t c
Definition Kss_Cpu.h:43
uint8_t h
Definition Kss_Cpu.h:43
uint8_t flags
Definition Kss_Cpu.h:43
uint8_t a
Definition Kss_Cpu.h:43
uint8_t b
Definition Kss_Cpu.h:43
Definition Kss_Cpu.h:83
uint8_t const * read[page_count+1]
Definition Kss_Cpu.h:84
cpu_time_t time
Definition Kss_Cpu.h:87
cpu_time_t base
Definition Kss_Cpu.h:86
uint8_t * write[page_count+1]
Definition Kss_Cpu.h:85
return c
Definition crypt.c:175
uch h[RAND_HEAD_LEN]
Definition crypt.c:459
b
Definition crypt.c:628
ulg size
Definition extract.c:2350
read(f, &c, 1)