17 #define SUSPICIOUS_OPCODE( name ) ((void) 0)
19 #define SUSPICIOUS_OPCODE( name ) debug_printf( "SPC: suspicious opcode: " name "\n" )
22#define CPU_READ( time, offset, addr )\
23 cpu_read( addr, time + offset )
25#define CPU_WRITE( time, offset, addr, data )\
26 cpu_write( data, addr, time + offset )
29 #define CPU_READ_TIMER( time, offset, addr, out )\
30 { out = CPU_READ( time, offset, addr ); }
34 #define CPU_READ_TIMER( time, offset, addr_, out )\
36 rel_time_t adj_time = time + offset;\
38 int ti = dp_addr - (r_t0out + 0xF0);\
39 if ( (unsigned) ti < timer_count )\
41 Timer* t = &m.timers [ti];\
42 if ( adj_time >= t->next_time )\
43 t = run_timer_( t, adj_time );\
50 int i = dp_addr - 0xF0;\
51 if ( (unsigned) i < 0x10 )\
52 out = cpu_read_smp_reg( i, adj_time );\
57#define TIME_ADJ( n ) (n)
59#define READ_TIMER( time, addr, out ) CPU_READ_TIMER( rel_time, TIME_ADJ(time), (addr), out )
60#define READ( time, addr ) CPU_READ ( rel_time, TIME_ADJ(time), (addr) )
61#define WRITE( time, addr, data ) CPU_WRITE( rel_time, TIME_ADJ(time), (addr), (data) )
63#define DP_ADDR( addr ) (dp + (addr))
65#define READ_DP_TIMER( time, addr, out ) CPU_READ_TIMER( rel_time, TIME_ADJ(time), DP_ADDR( addr ), out )
66#define READ_DP( time, addr ) READ ( time, DP_ADDR( addr ) )
67#define WRITE_DP( time, addr, data ) WRITE( time, DP_ADDR( addr ), data )
69#define READ_PROG16( addr ) (RAM [(addr) & 0xffff] | (RAM [((addr) + 1) & 0xffff] << 8))
71#define SET_PC( n ) (pc = n)
73#define READ_PC( pc ) (ram [pc])
74#define READ_PC16( pc ) READ_PROG16( pc )
76#define SET_SP( v ) (sp = v)
77#define GET_SP() ((uint8_t) (sp))
79#define PUSH16( data )\
81 PUSH( (data & 0xff00) >> 8 );\
87 ram [0x100 + sp] = (uint8_t) (data);\
94 out = ram [0x100 + sp];\
97#define MEM_BIT( rel ) CPU_mem_bit( pc, rel_time + rel )
102 unsigned t =
READ( 0, addr & 0x1FFF ) >> (addr >> 13);
103 return t << 8 & 0x100;
121#define GET_PSW( out )\
123 out = psw & ~(n80 | p20 | z02 | c01);\
124 out |= c >> 8 & c01;\
125 out |= dp >> 3 & p20;\
126 out |= ((nz >> 4) | nz) & n80;\
127 if ( !(uint8_t) nz ) out |= z02;\
130#define SET_PSW( in )\
134 dp = in << 3 & 0x100;\
135 nz = (in << 4 & 0x800) | (~in & z02);\
170 check( (
unsigned)
x < 0x100 );
171 check( (
unsigned)
y < 0x100 );
174 if ( (rel_time +=
m.cycle_table [
opcode]) > 0 )
177 #ifdef SPC_CPU_OPCODE_HOOK
203#define BRANCH( cond )\
206 pc += (int8_t) data;\
209 pc -= (int8_t) data;\
221 int old_addr =
GET_PC() + 2;
252 #if !SPC_MORE_ACCURACY
257 if ( (
unsigned)
i < 0x10 )
263 cpu_write_smp_reg(
data, rel_time,
i );
274 #if !SPC_MORE_ACCURACY
279 if ( (
unsigned)
i < 0x10 )
281 unsigned sel =
i - 2;
285 dsp_write(
a, rel_time );
287 cpu_write_smp_reg_(
a, rel_time,
i );
295#define CASE( n ) case n:
299#define ADDR_MODES_( op )\
305 data = READ_PROG16( data + dp ) + y;\
308 data = READ_PROG16( ((uint8_t) (data + x)) + dp );\
317 data += 0x100 * READ_PC( ++pc );\
320 data = (uint8_t) (data + x);
322#define ADDR_MODES_NO_DP( op )\
327#define ADDR_MODES( op )\
457#define LOGICAL_OP( op, func )\
459 data = READ( 0, data );\
461 nz = a func##= data;\
465 data = READ_DP( -2, y );\
469 data = READ_DP( -3, data );\
471 uint16_t addr2 = pc + 1;\
473 addr = READ_PC( addr2 ) + dp;\
476 nz = data func READ( -1, addr );\
477 WRITE( 0, addr, nz );\
560#define CASE( n ) case n: case (n) + 0x20:
578 ((flags + 0x80) >> 2 &
v40);
593#define INC_DEC_REG( reg, op )\
628 nz = (
c >> 1 & 0x80) | (
a >> 1);
637 int temp =
c >> 8 & 1;
684 nz = (
c >> 1 & 0x80) | (temp >> 1);
698 nz = (
a & 0x7F) | (
a >> 1);
716 temp += (
opcode >> 4 & 2) - 1;
717 nz = ((temp >> 1) | temp) & 0x7F;
738 lo = (lo ^ 0xFF) + 1;
748 ((flags + 0x80) >> 2 &
v40);
753 nz = (((lo >> 1) | lo) & 0x7F) |
result;
760 nz = ((temp >> 1) | temp) & 0x7F;
761 temp =
y + (temp >> 8);
772 unsigned temp =
y *
a;
774 nz = ((temp >> 1) | temp) & 0x7F;
782 unsigned ya =
y * 0x100 +
a;
789 if ( (
y & 15) >= (
x & 15) )
799 a = 255 - (ya -
x * 0x200) / (256 -
x);
800 y =
x + (ya -
x * 0x200) % (256 -
x);
814 if (
a > 0x99 ||
c & 0x100 )
820 if ( (
a & 0x0F) > 9 ||
psw &
h08 )
829 if (
a > 0x99 || !(
c & 0x100) )
835 if ( (
a & 0x0F) > 9 || !(
psw &
h08) )
866 #define CBRANCH( cond )\
870 goto cbranch_taken_loop;\
937 int ret_addr =
GET_PC() + 1;
1032 int bit = 1 << (
opcode >> 5);
1084 unsigned temp =
READ( -1,
data & 0x1FFF );
1085 temp ^= 1 << (
data >> 13);
1094 unsigned temp =
READ( -2,
data & 0x1FFF );
1095 unsigned bit =
data >> 13;
1096 temp = (temp & ~(1 << bit)) | ((
c >> 8 & 1) << bit);
1160 m.cpu_error =
"SPC emulation error";
1167 rel_time -=
m.cycle_table [ ram [
pc] ];
#define READ(addr)
Definition Ay_Cpu.cpp:92
#define RAM
Definition Snes_Spc.cpp:22
#define REGS
Definition Snes_Spc.cpp:23
int const no_read_before_write
Definition Spc_Cpu.cpp:285
#define SPC_CPU_RUN_FUNC_END
Definition Spc_Cpu.cpp:506
#define SPC_CPU_RUN_FUNC
Definition Spc_Cpu.cpp:495
int const b10
Definition Spc_Cpu.h:113
#define READ_PC(pc)
Definition Spc_Cpu.h:73
#define POP(out)
Definition Spc_Cpu.h:91
#define SET_SP(v)
Definition Spc_Cpu.h:76
int const nz_neg_mask
Definition Spc_Cpu.h:119
int const z02
Definition Spc_Cpu.h:116
opcode
Definition Spc_Cpu.h:173
#define READ_DP_TIMER( time, addr, out)
Definition Spc_Cpu.h:65
#define ADDR_MODES_NO_DP(op)
#define WRITE_DP(time, addr, data)
Definition Spc_Cpu.h:67
uint8_t a
Definition Spc_Cpu.h:141
int psw
Definition Spc_Cpu.h:146
#define READ_TIMER(time, addr, out)
Definition Spc_Cpu.h:59
#define GET_PC()
Definition Spc_Cpu.h:72
int dp
Definition Spc_Cpu.h:149
#define MEM_BIT(rel)
Definition Spc_Cpu.h:97
int const v40
Definition Spc_Cpu.h:111
#define GET_SP()
Definition Spc_Cpu.h:77
int const p20
Definition Spc_Cpu.h:112
#define SET_PSW(in)
Definition Spc_Cpu.h:130
#define INC_DEC_REG(reg, op)
#define READ_DP( time, addr)
Definition Spc_Cpu.h:66
#define PUSH(data)
Definition Spc_Cpu.h:85
uint8_t sp
Definition Spc_Cpu.h:145
int const c01
Definition Spc_Cpu.h:117
#define READ_PC16(pc)
Definition Spc_Cpu.h:74
#define GET_PSW(out)
Definition Spc_Cpu.h:121
#define LOGICAL_OP(op, func)
#define SET_PC(n)
Definition Spc_Cpu.h:71
#define SUSPICIOUS_OPCODE(name)
Definition Spc_Cpu.h:19
#define READ( time, addr)
Definition Spc_Cpu.h:60
int nz
Definition Spc_Cpu.h:148
check((unsigned) a< 0x100)
uint16_t pc
Definition Spc_Cpu.h:144
#define READ_PROG16(addr)
Definition Spc_Cpu.h:69
#define WRITE(time, addr, data)
Definition Spc_Cpu.h:61
int const n80
Definition Spc_Cpu.h:110
int const i04
Definition Spc_Cpu.h:115
#define PUSH16(data)
Definition Spc_Cpu.h:79
int const h08
Definition Spc_Cpu.h:114
goto loop
Definition Spc_Cpu.h:155
static const unsigned long mask[]
Definition bitwise.c:31
#define debug_printf
Definition blargg_source.h:26
int * l
Definition inflate.c:1579
unsigned * m
Definition inflate.c:1559
struct huft * t
Definition inflate.c:943
int y
Definition inflate.c:1588
register unsigned i
Definition inflate.c:1575
unsigned x[BMAX+1]
Definition inflate.c:1586
virtual ASIOError stop()=0
JSAMPIMAGE data
Definition jpeglib.h:945
unsigned short uint16_t
Definition mid.cpp:99
unsigned char uint8_t
Definition mid.cpp:98
signed char int8_t
Definition mid.cpp:95
BLARGG_DISABLE_NOTHROW typedef int rel_time_t
Definition Snes_Spc.h:129
unsigned CPU_mem_bit(uint16_t pc, rel_time_t)
Definition Spc_Cpu.h:99
return c
Definition crypt.c:175
uch h[RAND_HEAD_LEN]
Definition crypt.c:459
int result
Definition process.c:1455