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