Subversion Repositories pentevo

Rev

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