1 /*-----------------------------------------------------------------------*\
2  |  defs.h  --  main definitions for z80 emulator                        |
3  |                                                                       |
4  |  Copyright 1986-1988 by Parag Patel.  All Rights Reserved.            |
5  |  Copyright 1994-1995 by CodeGen, Inc.  All Rights Reserved.           |
6 \*-----------------------------------------------------------------------*/
7 
8 #ifndef __DEFS_H_
9 #define __DEFS_H_
10 
11 #include <stdio.h>
12 
13 /* the current version of the z80 emulator */
14 #define VERSION "3.1"
15 
16 
17 /* system definitions */
18 #if defined THINK_C || defined applec || defined macintosh
19 #	ifndef macintosh
20 #		define macintosh
21 #	endif
22 #elif defined __MWERKS__
23 #   define BeBox
24 #elif defined MSDOS && defined GO32
25 #	define DJGPP
26 #	ifndef LITTLE_ENDIAN
27 #		define LITTLE_ENDIAN
28 #	endif
29 #else
30 #	define UNIX	/* cannot use "unix" since DJGPP defines it as well */
31 #endif
32 
33 
34 /* some headers define macros this way */
35 #ifdef BYTE_ORDER
36 #   if BYTE_ORDER == LITTLE_ENDIAN
37 #      undef BIG_ENDIAN
38 #   else
39 #      undef LITTLE_ENDIAN
40 #   endif
41 #endif
42 
43 
44 /* misc. handy defs */
45 
46 #ifndef TRUE
47 #define TRUE	1
48 #endif
49 
50 #ifndef FALSE
51 #define FALSE	0
52 #endif
53 
54 typedef int boolean;
55 
56 
57 #define CNTL(c) ((c) & 037)	/* convert a char to its control equivalent */
58 
59 
60 /* handy typedefs for an 8-bit byte, 16-bit word, & 32-bit longword */
61 
62 typedef unsigned char byte;
63 typedef unsigned short word;
64 typedef unsigned long longword;
65 
66 
67 /* handy bit definitions - bit fields are not used as they are generally
68    much slower than the equivalent logical masking operations */
69 
70 #define BIT16  0x10000L
71 #define BIT15   0x8000
72 #define BIT14   0x4000
73 #define BIT13   0x2000
74 #define BIT12   0x1000
75 #define BIT11   0x0800
76 #define BIT10   0x0400
77 #define BIT9    0x0200
78 #define BIT8    0x0100
79 #define BIT7    0x0080
80 #define BIT6    0x0040
81 #define BIT5    0x0020
82 #define BIT4    0x0010
83 #define BIT3    0x0008
84 #define BIT2    0x0004
85 #define BIT1    0x0002
86 #define BIT0    0x0001
87 
88 /* handy masks to get a particular number of bits out */
89 
90 #define MASK1   0x01
91 #define MASK2   0x03
92 #define MASK3   0x07
93 #define MASK4   0x0F
94 #define MASK5   0x1F
95 #define MASK6   0x3F
96 #define MASK7   0x7F
97 #define MASK8   0xFF
98 #define MASK12  0xFFF
99 
100 #define MASKU4  0xF0
101 #define MASK16  0xFFFF
102 
103 
104 /* z80 flag register definitions */
105 
106 #define SIGN      0x80
107 #define ZERO      0x40
108 #define HALF      0x10
109 #define PARITY    0x04
110 #define OVERFLOW  PARITY
111 #define NEGATIVE  0x02
112 #define CARRY     0x01
113 
114 
115 /* z80 interrupt types - used to set the intr struct var */
116 
117 #define INTRMASK	0xF00
118 #define INT_FLAG	0x100
119 #define NM_FLAG		0x200
120 #define RESET_FLAG	0x400
121 
122 
123 /* max number of the BIOS drive tables */
124 #define MAXDISCS	16
125 
126 
127 typedef struct z80info
128 {
129     boolean event;
130 //    byte regaf[2], regbc[2], regde[2], reghl[2];
131     word regaf, regbc, regde, reghl;
132     word regaf2, regbc2, regde2, reghl2;
133     word regsp, regpc, regix, regiy;
134     byte regi, regr;
135     byte iff, iff2, imode;
136     byte reset, nmi, intr, halt;
137 
138     /* these point to the addresses of the above registers */
139     byte *reg[8];
140     word *regpairaf[4];
141     word *regpairsp[4];
142     word *regpairxy[4];
143     word *regixy[2];
144     byte *regir[2];
145 
146     /* these are for the I/O, CP/M, and outside needs */
147     boolean trace;		/* trace mode off/on */
148     boolean step;		/* step-trace mode off/on */
149     int sig;		/* caught a signal */
150     int syscall;	/* CP/M syscall to be done */
151     int biosfn;		/* BIOS function be done */
152 
153     /* these are for the CP/M BIOS */
154     int	drive;
155     word dma;
156     word track;
157     word sector;
158     FILE *drives[MAXDISCS];
159     long drivelen[MAXDISCS];
160 
161     /* 64k bytes - may be allocated separately if desired */
162     byte mem[0x10000L];
163 
164 #ifdef MEM_BREAK
165     /* one for each byte of memory for breaks, memory-mapped I/O, etc */
166     byte membrk[0x10000L];
167     long numbrks;
168 #endif
169 } z80info;
170 
171 
172 /* All the following macros assume that a variable named "z80" is
173    available to access the above info.  This is to allow multiple
174    z80s to run without stepping on each other.
175 */
176 
177 
178 /* These macros allow memory-mapped I/O if MEM_BREAK is defined.
179    Because of this, these macros must be very carefully used, and
180    there must not be ANY side-effects, such as increment/decerement
181    in any of the macro args.  Customizations go into read_mem() and
182    write_mem().
183 */
184 
185 #ifdef MEM_BREAK
186 #    define MEM(addr)	\
187 		(z80->membrk[(word)(addr)] ?	\
188 		read_mem(z80, addr) :	\
189 		z80->mem[(word)(addr)])
190 #    define SETMEM(addr, val)	\
191 		(z80->membrk[(word)(addr)] ?	\
192 		write_mem(z80, addr, val) :	\
193 		(z80->mem[(word)(addr)] = (byte)(val)))
194 
195 	/* various flags for "membrk" - others may be added */
196 #	define M_BREAKPOINT	0x01		/* breakpoint */
197 #	define M_READ_PROTECT	0x02		/* read-protected memory */
198 #	define M_WRITE_PROTECT	0x04		/* write-protected memory */
199 #	define M_MEM_MAPPED_IO	0x08		/* memory-mapped I/O addr */
200 
201 #else
202 #    define MEM(addr) z80->mem[(word)(addr)]
203 #    define SETMEM(addr, val) (z80->mem[(word)(addr)] = (byte)(val))
204 #endif
205 
206 
207 /* how to access the z80 registers & register pairs */
208 
209 #ifdef LITTLE_ENDIAN
210 #  define A	((unsigned char *)&z80->regaf)[1]
211 #  define F	((unsigned char *)&z80->regaf)[0]
212 #  define B	((unsigned char *)&z80->regbc)[1]
213 #  define C	((unsigned char *)&z80->regbc)[0]
214 #  define D	((unsigned char *)&z80->regde)[1]
215 #  define E	((unsigned char *)&z80->regde)[0]
216 #  define H	((unsigned char *)&z80->reghl)[1]
217 #  define L	((unsigned char *)&z80->reghl)[0]
218 #else
219 #  define A	((unsigned char *)&z80->regaf)[0]
220 #  define F	((unsigned char *)&z80->regaf)[1]
221 #  define B	((unsigned char *)&z80->regbc)[0]
222 #  define C	((unsigned char *)&z80->regbc)[1]
223 #  define D	((unsigned char *)&z80->regde)[0]
224 #  define E	((unsigned char *)&z80->regde)[1]
225 #  define H	((unsigned char *)&z80->reghl)[0]
226 #  define L	((unsigned char *)&z80->reghl)[1]
227 #endif
228 
229 #define I	z80->regi
230 #define R	z80->regr
231 #define AF	z80->regaf
232 #define BC	z80->regbc
233 #define DE	z80->regde
234 #define HL	z80->reghl
235 #define AF2	z80->regaf2
236 #define BC2	z80->regbc2
237 #define DE2	z80->regde2
238 #define HL2	z80->reghl2
239 #define SP	z80->regsp
240 #define PC	z80->regpc
241 #define IX	z80->regix
242 #define IY	z80->regiy
243 #define IFF	z80->iff
244 #define IFF2	z80->iff2
245 #define IMODE	z80->imode
246 #define RESET	z80->reset
247 #define NMI	z80->nmi
248 #define INTR	z80->intr
249 #define HALT	z80->halt
250 
251 #define EVENT	z80->event
252 
253 
254 /* function externs: */
255 
256 /* z80.c */
257 extern z80info *new_z80info(void);
258 extern z80info *init_z80info(z80info *z80);
259 extern z80info *destroy_z80info(z80info *z80);
260 extern void delete_z80info(z80info *z80);
261 
262 extern boolean z80_emulator(z80info *z80, int count);
263 
264 extern int nobdos;
265 
266 /* main.c */
267 extern void resetterm(void);
268 extern void setterm(void);
269 extern boolean input(z80info *z80, byte haddr, byte laddr, byte *val);
270 extern void output(z80info *z80, byte haddr, byte laddr, byte data);
271 extern void haltcpu(z80info *z80);
272 extern word read_mem(z80info *z80, word addr);
273 extern word write_mem(z80info *z80, word addr, byte val);
274 extern void undefinstr(z80info *z80, byte instr);
275 extern boolean loadfile(z80info *z80, const char *fname);
276 
277 /* bios.c */
278 extern void bios(z80info *z80, int fn);
279 extern void sysreset(z80info *z80);
280 extern void warmboot(z80info *z80);
281 extern void finish(z80info *z80);
282 
283 /* disassem.c */
284 extern int disassemlen(z80info *z80);
285 extern int disassem(z80info *z80, word start, FILE *fp);
286 
287 /* bdos */
288 #define BDOS_HOOK 0xDC06
289 void check_BDOS_hook(z80info *z80);
290 extern int silent_exit;
291 extern char *stuff_cmd;
292 extern int trace_bdos;
293 extern int strace;
294 char *bdos_decode(int n);
295 int bdos_fcb(int n);
296 void bdos_fcb_dump(z80info *z80);
297 
298 #endif /* __DEFS_H_ */
299