1 |
106 |
markom |
#define fetch8(x) fetch8func((cycles++,(x)))
|
2 |
|
|
#define NFAKES 16
|
3 |
|
|
typedef struct
|
4 |
|
|
{
|
5 |
|
|
unsigned a;
|
6 |
|
|
unsigned x;
|
7 |
|
|
unsigned y;
|
8 |
|
|
unsigned pc; /* Keep pbr in there too */
|
9 |
|
|
unsigned dbr;
|
10 |
|
|
unsigned d;
|
11 |
|
|
unsigned s;
|
12 |
|
|
unsigned p;
|
13 |
|
|
unsigned e;
|
14 |
|
|
unsigned char *memory;
|
15 |
|
|
unsigned int exception;
|
16 |
|
|
unsigned int ticks;
|
17 |
|
|
unsigned int cycles;
|
18 |
|
|
unsigned int insts;
|
19 |
|
|
unsigned int r[NFAKES];
|
20 |
|
|
}
|
21 |
|
|
saved_state_type;
|
22 |
|
|
|
23 |
|
|
|
24 |
|
|
|
25 |
|
|
#define GET_P \
|
26 |
|
|
((GET_NBIT << 7) \
|
27 |
|
|
| (GET_VBIT << 6) \
|
28 |
|
|
| (GET_MBIT << 5) \
|
29 |
|
|
| (GET_XBIT << 4) \
|
30 |
|
|
| (GET_DBIT << 3) \
|
31 |
|
|
| (GET_IBIT << 2) \
|
32 |
|
|
| (GET_ZBIT << 1) \
|
33 |
|
|
| (GET_CBIT << 0))
|
34 |
|
|
|
35 |
|
|
#define SET_P(_bits) \
|
36 |
|
|
{ int bits = _bits; \
|
37 |
|
|
SET_NBIT((bits>>7)&1); \
|
38 |
|
|
SET_VBIT((bits>>6)&1); \
|
39 |
|
|
SET_MBIT((bits>>5)&1); \
|
40 |
|
|
SET_XBIT((bits>>4)&1); \
|
41 |
|
|
SET_DBIT((bits>>3)&1); \
|
42 |
|
|
SET_IBIT((bits>>2)&1); \
|
43 |
|
|
SET_ZBIT((bits>>1)&1); \
|
44 |
|
|
SET_CBIT((bits>>0)&1); }
|
45 |
|
|
|
46 |
|
|
#define BFLAG (1<<4)
|
47 |
|
|
#define DFLAG (1<<3)
|
48 |
|
|
|
49 |
|
|
#define GET_A (the_a)
|
50 |
|
|
#define GET_E (the_e)
|
51 |
|
|
#define GET_B (the_b)
|
52 |
|
|
#define GET_CBIT (the_cbit)
|
53 |
|
|
#define GET_D (the_d)
|
54 |
|
|
#define GET_DBIT (the_dbit)
|
55 |
|
|
#define GET_DBR_HIGH (the_dbr)
|
56 |
|
|
#define GET_DBR_LOW (the_dbr >> 16)
|
57 |
|
|
#define GET_DPR (the_dpr)
|
58 |
|
|
#define GET_IBIT (the_ibit)
|
59 |
|
|
#define GET_MBIT (the_mbit)
|
60 |
|
|
#define SET_XBIT(x) { the_xbit = x; }
|
61 |
|
|
#define GET_NBIT (the_nbit)
|
62 |
|
|
#define GET_PBRPC (the_pc)
|
63 |
|
|
#define GET_PBR_HIGH (the_pc & 0xff0000)
|
64 |
|
|
#define GET_PBR_LOW (the_pc >> 16)
|
65 |
|
|
#define GET_PC (the_pc & 0xffff)
|
66 |
|
|
#define GET_S (the_s)
|
67 |
|
|
#define GET_VBIT (the_vbit)
|
68 |
|
|
#define GET_X (the_x)
|
69 |
|
|
#define GET_XBIT (the_xbit)
|
70 |
|
|
#define GET_Y (the_y)
|
71 |
|
|
#define GET_ZBIT (the_zbit)
|
72 |
|
|
#define IFLAG (1<<2)
|
73 |
|
|
#define INC_PC(x) {the_pc += x;}
|
74 |
|
|
#define POP16(x) { int _xx; POP8(x); POP8(_xx); x+= _xx<<8;}
|
75 |
|
|
#define POP24(x) { int _xx; POP8(x); POP8(_xx); x += _xx << 8; POP8(_xx); x += _xx << 16; }
|
76 |
|
|
#define POP8(x) { SET_S(GET_S +1); x = fetch8(GET_S);}
|
77 |
|
|
#define PUSH16(x) { int _xx = x;PUSH8(_xx >> 8); PUSH8(_xx);}
|
78 |
|
|
#define PUSH8(x) { store8(GET_S, x); SET_S(GET_S-1);}
|
79 |
|
|
#define SET_A(x) { the_a = x & AMASK; }
|
80 |
|
|
#define SET_B(x) { the_b = x;}
|
81 |
|
|
#define SET_CBIT(x) { the_cbit = x;}
|
82 |
|
|
#define SET_CBIT_M(x) { the_cbit = (x & (GET_MBIT ? 0x100: 0x10000)) != 0;}
|
83 |
|
|
#define SET_CBIT_X(x) { the_cbit = (x & (GET_XBIT ? 0x100: 0x10000)) != 0;}
|
84 |
|
|
#define SET_D(x) {the_d = x;}
|
85 |
|
|
#define SET_DBIT(x) { the_dbit= x;}
|
86 |
|
|
#define SET_DBR_LOW(x) {the_dbr = (x<<16);}
|
87 |
|
|
#define SET_DPR(x) { the_dpr = x;}
|
88 |
|
|
#define SET_E(x) { the_e = x;}
|
89 |
|
|
#define SET_IBIT(x) { the_ibit = x;}
|
90 |
|
|
#define SET_MBIT(x) { the_mbit = x; }
|
91 |
|
|
#define SET_NBIT(x) { the_nbit = x;}
|
92 |
|
|
#define SET_NBIT_16(x) { the_nbit= ( ((x) & (0x8000)) != 0);}
|
93 |
|
|
#define SET_NBIT_8(x) { the_nbit= ( ((x) & (0x80)) != 0);}
|
94 |
|
|
#define SET_NBIT_M(x) { if (GET_MBIT) { SET_NBIT_8(x); } else { SET_NBIT_16(x);}}
|
95 |
|
|
#define SET_NBIT_X(x) { if (GET_XBIT) { SET_NBIT_8(x); } else { SET_NBIT_16(x);}}
|
96 |
|
|
#define SET_PBR(x) { the_pc = (the_pc & 0xffff) + ((x)<<16);}
|
97 |
|
|
#define SET_PBRPC(x) { the_pc = x;}
|
98 |
|
|
#define SET_ONLY_PC(x) { the_pc = (the_pc & 0xff0000) + ((x ) & 0xffff);}
|
99 |
|
|
#define SET_S(x) {the_s = x; }
|
100 |
|
|
#define SET_VBIT_16(x) {the_vbit = ((((int)x) < -0x8000) || (((int)x) > 0x7fff));}
|
101 |
|
|
#define SET_VBIT_8(x) {the_vbit = ((((int)x) < -0x80) || (((int)x) > 0x7f));}
|
102 |
|
|
/*#define SET_VBIT_M(x) { if(GET_MBIT) {SET_VBIT_8(x);}else {SET_VBIT_16(x);}}*/
|
103 |
|
|
#define SET_ZBIT_16(x) { the_zbit = ((x & 0xffff) == 0);}
|
104 |
|
|
#define SET_ZBIT_8(x) { the_zbit = ((x & 0xff) == 0);}
|
105 |
|
|
#define SET_ZBIT_M(x) { if(GET_MBIT) {SET_ZBIT_8(x);}else {SET_ZBIT_16(x);}}
|
106 |
|
|
#define SET_ZBIT_X(x) { if(GET_XBIT) {SET_ZBIT_8(x);}else {SET_ZBIT_16(x);}}
|
107 |
|
|
#define SET_VBIT(x) { the_vbit = x; }
|
108 |
|
|
#define SET_ZBIT(x) { the_zbit = x; }
|
109 |
|
|
#define SET_X(x) { the_x = (x) & (GET_XBIT ? 0xff : 0xffff);}
|
110 |
|
|
#define SET_Y(x) { the_y = (x) & (GET_XBIT ? 0xff : 0xffff);}
|
111 |
|
|
|
112 |
|
|
#define AMASK ( GET_MBIT ? 0xff : 0xffff)
|
113 |
|
|
#define SMASK ( GET_MBIT ? 0x80 : 0x8000)
|
114 |
|
|
#define SET_VBIT_M(s1,acc,d) ( the_vbit = ((s1 ^ acc) & (acc ^ d) & SMASK )!=0)
|
115 |
|
|
|
116 |
|
|
/*#define fetch8(x) (memory[x&MMASK])*/
|
117 |
|
|
#define fetch16(x) (fetch8(x) + (fetch8((x)+1)<<8))
|
118 |
|
|
#define fetch24(x) (fetch8(x) + (fetch8((x)+1)<<8) + (fetch8((x)+2)<<16))
|
119 |
|
|
#define fetch8sext(x) ((char)fetch8(x))
|
120 |
|
|
#define fetch16sext(x) ((short)fetch16(x))
|
121 |
|
|
#define store8(x,y) {memory[x&MMASK]=y;}
|
122 |
|
|
#define store16(x,y) { store8(x,y); store8(x+1,y>>8);}
|
123 |
|
|
#define SEXTM(x) (GET_MBIT ? ((char)x): ((short)x))
|
124 |
|
|
|
125 |
|
|
|
126 |
|
|
#define STARTFUNC() \
|
127 |
|
|
register unsigned char *memory;\
|
128 |
|
|
int the_s; \
|
129 |
|
|
int the_b; \
|
130 |
|
|
int the_x; \
|
131 |
|
|
int the_d; \
|
132 |
|
|
int the_y; \
|
133 |
|
|
int the_dbr; \
|
134 |
|
|
int the_pc; \
|
135 |
|
|
int the_nbit; \
|
136 |
|
|
int the_vbit; \
|
137 |
|
|
int the_z; \
|
138 |
|
|
int the_mbit; \
|
139 |
|
|
int the_ibit; \
|
140 |
|
|
int the_xbit; \
|
141 |
|
|
int the_zbit; \
|
142 |
|
|
int the_cbit; \
|
143 |
|
|
int the_dbit; \
|
144 |
|
|
int the_dpr; \
|
145 |
|
|
int the_e; \
|
146 |
|
|
int the_a; \
|
147 |
|
|
int tick_start = get_now ();\
|
148 |
|
|
int cycles = 0; \
|
149 |
|
|
int insts = 0; \
|
150 |
|
|
\
|
151 |
|
|
SET_E (saved_state.e); \
|
152 |
|
|
SET_P (saved_state.p); \
|
153 |
|
|
SET_A (saved_state.a); \
|
154 |
|
|
SET_X (saved_state.x); \
|
155 |
|
|
SET_Y (saved_state.y); \
|
156 |
|
|
SET_ONLY_PC (saved_state.pc); \
|
157 |
|
|
SET_PBR (saved_state.pc >> 16); \
|
158 |
|
|
SET_DBR_LOW (saved_state.dbr); \
|
159 |
|
|
SET_D (saved_state.d); \
|
160 |
|
|
SET_S (saved_state.s); \
|
161 |
|
|
memory = saved_state.memory ; \
|
162 |
|
|
{ int k; for (k = 0; k < NFAKES; k++) \
|
163 |
|
|
store16(0x10 + k * 2, saved_state.r[k]); }\
|
164 |
|
|
\
|
165 |
|
|
top: \
|
166 |
|
|
|
167 |
|
|
|
168 |
|
|
|
169 |
|
|
#define ENDFUNC() \
|
170 |
|
|
rethink: \
|
171 |
|
|
saved_state.ticks += get_now () - tick_start;\
|
172 |
|
|
saved_state.cycles += cycles; \
|
173 |
|
|
saved_state.insts += insts; \
|
174 |
|
|
{ int k; for (k = 0; k < NFAKES; k++) \
|
175 |
|
|
saved_state.r[k] = fetch16(0x10 + k * 2); }\
|
176 |
|
|
\
|
177 |
|
|
saved_state.e = GET_E; \
|
178 |
|
|
saved_state.p = GET_P; \
|
179 |
|
|
saved_state.a = GET_A; \
|
180 |
|
|
saved_state.x = GET_X; \
|
181 |
|
|
saved_state.y = GET_Y; \
|
182 |
|
|
saved_state.pc = GET_PBRPC; \
|
183 |
|
|
saved_state.dbr = GET_DBR_LOW; \
|
184 |
|
|
saved_state.d = GET_D; \
|
185 |
|
|
saved_state.s = GET_S; \
|
186 |
|
|
\
|
187 |
|
|
return 0; \
|
188 |
|
|
|
189 |
|
|
|
190 |
|
|
extern saved_state_type saved_state;
|
191 |
|
|
|
192 |
|
|
#define MMASK 0xfffff
|
193 |
|
|
#define NUMSEGS 16
|
194 |
|
|
#define RETHINK goto rethink;
|