Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
716 | lvd | 1 | #ifndef _Z80_DEFS_H_INCLUDED |
2 | #define _Z80_DEFS_H_INCLUDED |
||
3 | |||
4 | #include <stddef.h> |
||
784 | DimkaM | 5 | #include <stdint.h> |
716 | lvd | 6 | #include "../sysdefs.h" |
7 | struct Z80; |
||
8 | |||
9 | #define Z80FAST fastcall |
||
10 | |||
11 | #ifdef _MSC_VER |
||
12 | #define Z80INLINE forceinline // time-critical inlines |
||
13 | #else |
||
14 | #define Z80INLINE inline |
||
15 | #endif |
||
16 | |||
17 | typedef void (Z80FAST *STEPFUNC)(Z80*); |
||
18 | #define Z80OPCODE void Z80FAST |
||
19 | typedef unsigned char (Z80FAST *LOGICFUNC)(Z80*, unsigned char byte); |
||
20 | #define Z80LOGIC unsigned char Z80FAST |
||
21 | |||
22 | struct TZ80State |
||
23 | { |
||
24 | unsigned t; // Текущий такт процессора внутри spectrum кадра [0..conf.frame) |
||
25 | /*------------------------------*/ |
||
26 | union |
||
27 | { |
||
28 | unsigned pc; |
||
29 | struct |
||
30 | { |
||
31 | unsigned char pcl; |
||
32 | unsigned char pch; |
||
33 | }; |
||
34 | }; |
||
35 | union |
||
36 | { |
||
37 | unsigned sp; |
||
38 | struct |
||
39 | { |
||
40 | unsigned char spl; |
||
41 | unsigned char sph; |
||
42 | }; |
||
43 | }; |
||
44 | union |
||
45 | { |
||
46 | unsigned ir_; |
||
47 | struct |
||
48 | { |
||
49 | unsigned char r_low; |
||
50 | unsigned char i; |
||
51 | }; |
||
52 | }; |
||
53 | union |
||
54 | { |
||
55 | unsigned int_flags; |
||
56 | struct |
||
57 | { |
||
58 | unsigned char r_hi; |
||
59 | unsigned char iff1; |
||
60 | unsigned char iff2; |
||
61 | unsigned char halted; |
||
62 | }; |
||
63 | }; |
||
64 | /*------------------------------*/ |
||
65 | union |
||
66 | { |
||
67 | unsigned bc; |
||
68 | unsigned short bc16; |
||
69 | struct |
||
70 | { |
||
71 | unsigned char c; |
||
72 | unsigned char b; |
||
784 | DimkaM | 73 | u8 trash; |
716 | lvd | 74 | }; |
75 | }; |
||
76 | union |
||
77 | { |
||
78 | unsigned de; |
||
79 | struct |
||
80 | { |
||
81 | unsigned char e; |
||
82 | unsigned char d; |
||
83 | }; |
||
84 | }; |
||
85 | union |
||
86 | { |
||
87 | unsigned hl; |
||
88 | struct |
||
89 | { |
||
90 | unsigned char l; |
||
91 | unsigned char h; |
||
92 | }; |
||
93 | }; |
||
94 | union |
||
95 | { |
||
96 | unsigned af; |
||
97 | struct |
||
98 | { |
||
99 | unsigned char f; |
||
100 | unsigned char a; |
||
101 | }; |
||
102 | }; |
||
103 | /*------------------------------*/ |
||
104 | union |
||
105 | { |
||
106 | unsigned ix; |
||
107 | struct |
||
108 | { |
||
109 | unsigned char xl; |
||
110 | unsigned char xh; |
||
111 | }; |
||
112 | }; |
||
113 | union |
||
114 | { |
||
115 | unsigned iy; |
||
116 | struct |
||
117 | { |
||
118 | unsigned char yl; |
||
119 | unsigned char yh; |
||
120 | }; |
||
121 | }; |
||
122 | /*------------------------------*/ |
||
123 | struct |
||
124 | { |
||
125 | union |
||
126 | { |
||
127 | unsigned bc; |
||
128 | struct |
||
129 | { |
||
130 | unsigned char c; |
||
131 | unsigned char b; |
||
132 | }; |
||
133 | }; |
||
134 | union |
||
135 | { |
||
136 | unsigned de; |
||
137 | struct |
||
138 | { |
||
139 | unsigned char e; |
||
140 | unsigned char d; |
||
141 | }; |
||
142 | }; |
||
143 | union |
||
144 | { |
||
145 | unsigned hl; |
||
146 | struct |
||
147 | { |
||
148 | unsigned char l; |
||
149 | unsigned char h; |
||
150 | }; |
||
151 | }; |
||
152 | union |
||
153 | { |
||
154 | unsigned af; |
||
155 | struct |
||
156 | { |
||
157 | unsigned char f; |
||
158 | unsigned char a; |
||
159 | }; |
||
160 | }; |
||
161 | } alt; |
||
162 | union |
||
163 | { |
||
164 | unsigned memptr; // undocumented register |
||
165 | struct |
||
166 | { |
||
167 | unsigned char meml; |
||
168 | unsigned char memh; |
||
169 | }; |
||
170 | }; |
||
171 | unsigned eipos, haltpos; |
||
172 | /*------------------------------*/ |
||
173 | unsigned char im; |
||
759 | dimkam | 174 | unsigned char nmi_in_progress; |
716 | lvd | 175 | }; |
176 | |||
177 | typedef u8 (__fastcall * TXm)(u32 addr); |
||
178 | typedef u8 (__fastcall * TRm)(u32 addr); |
||
179 | typedef void (__fastcall * TWm)(u32 addr, u8 val); |
||
180 | |||
181 | struct TMemIf |
||
182 | { |
||
183 | TXm xm; |
||
184 | TRm rm; |
||
185 | TWm wm; |
||
186 | }; |
||
187 | |||
188 | |||
189 | struct Z80 : public TZ80State |
||
190 | { |
||
191 | unsigned char tmp0, tmp1, tmp3; |
||
192 | unsigned short last_branch; |
||
193 | unsigned trace_curs, trace_top, trace_mode; |
||
194 | unsigned mem_curs, mem_top, mem_second; |
||
195 | unsigned pc_trflags; |
||
196 | unsigned nextpc; |
||
197 | unsigned dbg_stophere; |
||
198 | unsigned dbg_stopsp; |
||
199 | unsigned dbg_loop_r1; |
||
200 | unsigned dbg_loop_r2; |
||
201 | unsigned char dbgchk; // Признак наличия активных брекпоинтов |
||
202 | bool int_pend; // На входе int есть активное прерывание |
||
203 | bool int_gate; // Разрешение внешних прерываний (1-разрешены/0 - запрещены) |
||
204 | |||
205 | #define MAX_CBP 16 |
||
206 | uintptr_t cbp[MAX_CBP][128]; // Условия для условных брекпоинтов |
||
207 | unsigned cbpn; |
||
208 | |||
209 | i64 debug_last_t; // used to find time delta |
||
210 | u32 tpi; // Число тактов между прерываниями |
||
211 | u32 trpc[40]; |
||
212 | // typedef u8 (__fastcall * TRmDbg)(u32 addr); |
||
213 | // typedef u8 *(__fastcall * TMemDbg)(u32 addr); |
||
214 | // typedef void (__fastcall * TWmDbg)(u32 addr, u8 val); |
||
215 | typedef void (__cdecl *TBankNames)(int i, char *Name); |
||
216 | typedef void (Z80FAST * TStep)(); |
||
217 | typedef i64 (__cdecl * TDelta)(); |
||
218 | typedef void (__cdecl * TSetLastT)(); |
||
219 | // TRmDbg DirectRm; // direct read memory in debuger |
||
220 | // TWmDbg DirectWm; // direct write memory in debuger |
||
221 | // TMemDbg DirectMem; // get direct memory pointer in debuger |
||
222 | u32 Idx; // Индекс в массиве процессоров |
||
223 | TBankNames BankNames; |
||
224 | TStep Step; |
||
225 | TDelta Delta; |
||
226 | TSetLastT SetLastT; |
||
227 | u8 *membits; |
||
228 | u8 dbgbreak; |
||
229 | const TMemIf *FastMemIf; // Быстрый интерфес памяти |
||
230 | const TMemIf *DbgMemIf; // Интерфейс памяти для поддержки отладчика (брекпоинты на доступ к памяти) |
||
231 | const TMemIf *MemIf; // Текущий активный интерфейс памяти |
||
232 | |||
233 | void reset() { int_flags = ir_ = pc = 0; im = 0; last_branch = 0; int_pend = false; int_gate = true; } |
||
234 | Z80(u32 Idx, TBankNames BankNames, TStep Step, TDelta Delta, |
||
235 | TSetLastT SetLastT, u8 *membits, const TMemIf *FastMemIf, const TMemIf *DbgMemIf) : |
||
236 | Idx(Idx), |
||
237 | BankNames(BankNames), |
||
238 | Step(Step), Delta(Delta), SetLastT(SetLastT), membits(membits), |
||
239 | FastMemIf(FastMemIf), DbgMemIf(DbgMemIf) |
||
240 | { |
||
241 | MemIf = FastMemIf; |
||
242 | tpi = 0; |
||
243 | dbgbreak = 0; |
||
244 | dbgchk = 0; |
||
245 | debug_last_t = 0; |
||
246 | trace_curs = trace_top = (unsigned)-1; trace_mode = 0; |
||
247 | mem_curs = mem_top = 0; |
||
248 | pc_trflags = nextpc = 0; |
||
249 | dbg_stophere = dbg_stopsp = (unsigned)-1; |
||
250 | dbg_loop_r1 = 0; |
||
251 | dbg_loop_r2 = 0xFFFF; |
||
252 | int_pend = false; |
||
253 | int_gate = true; |
||
254 | nmi_in_progress = false; |
||
255 | } |
||
256 | virtual ~Z80() { } |
||
257 | u32 GetIdx() const { return Idx; } |
||
258 | void SetTpi(u32 Tpi) { tpi = Tpi; } |
||
259 | |||
260 | void SetFastMemIf() { MemIf = FastMemIf; } |
||
261 | void SetDbgMemIf() { MemIf = DbgMemIf; } |
||
262 | |||
263 | u8 DirectRm(unsigned addr) const { return *DirectMem(addr); } // direct read memory in debuger |
||
264 | void DirectWm(unsigned addr, u8 val) { *DirectMem(addr) = val; } // direct write memory in debuger |
||
265 | /* |
||
266 | virtual unsigned char rm(unsigned addr) = 0; |
||
267 | virtual void wm(unsigned addr, unsigned char val) = 0; |
||
268 | */ |
||
269 | virtual u8 *DirectMem(unsigned addr) const = 0; // get direct memory pointer in debuger |
||
270 | |||
271 | virtual unsigned char in(unsigned port) = 0; |
||
272 | virtual void out(unsigned port, unsigned char val) = 0; |
||
273 | virtual unsigned char m1_cycle() = 0; // [vv] Не зависит от процессора (вынести в библиотеку) |
||
274 | virtual u8 IntVec() = 0; // Функция возвращающая значение вектора прерывания для im2 |
||
275 | virtual void CheckNextFrame() = 0; // Проверка и обновления счетчика кадров и тактов внутри прерывания |
||
276 | virtual void retn() = 0; // Вызывается в конце инструкции retn (должна сбрасывать флаг nmi_in_progress и обновлять раскладку памяти) |
||
277 | }; |
||
278 | |||
279 | #define CF 0x01 |
||
280 | #define NF 0x02 |
||
281 | #define PV 0x04 |
||
282 | #define F3 0x08 |
||
283 | #define HF 0x10 |
||
284 | #define F5 0x20 |
||
285 | #define ZF 0x40 |
||
286 | #define SF 0x80 |
||
287 | |||
288 | #endif // _Z80_DEFS_H_INCLUDED |