1 /* Multi-Z80 32 Bit emulator */
\r
3 /* Copyright 1996, Neil Bradley, All rights reserved
\r
7 * The mZ80 emulator may be distributed in unmodified form to any medium.
\r
9 * mZ80 May not be sold, or sold as a part of a commercial package without
\r
10 * the express written permission of Neil Bradley (neil@synthcom.com). This
\r
11 * includes shareware.
\r
13 * Modified versions of mZ80 may not be publicly redistributed without author
\r
14 * approval (neil@synthcom.com). This includes distributing via a publicly
\r
15 * accessible LAN. You may make your own source modifications and distribute
\r
16 * mZ80 in object only form.
\r
18 * mZ80 Licensing for commercial applications is available. Please email
\r
19 * neil@synthcom.com for details.
\r
21 * Synthcom Systems, Inc, and Neil Bradley will not be held responsible for
\r
22 * any damage done by the use of mZ80. It is purely "as-is".
\r
24 * If you use mZ80 in a freeware application, credit in the following text:
\r
26 * "Multi-Z80 CPU emulator by Neil Bradley (neil@synthcom.com)"
\r
28 * must accompany the freeware application within the application itself or
\r
29 * in the documentation.
\r
31 * Legal stuff aside:
\r
33 * If you find problems with mZ80, please email the author so they can get
\r
34 * resolved. If you find a bug and fix it, please also email the author so
\r
35 * that those bug fixes can be propogated to the installed base of mZ80
\r
36 * users. If you find performance improvements or problems with mZ80, please
\r
37 * email the author with your changes/suggestions and they will be rolled in
\r
38 * with subsequent releases of mZ80.
\r
40 * The whole idea of this emulator is to have the fastest available 32 bit
\r
41 * Multi-z80 emulator for the PC, giving maximum performance.
\r
44 /* General z80 based defines */
\r
50 #define UINT32 unsigned long int
\r
54 #define UINT16 unsigned short int
\r
58 #define UINT8 unsigned char
\r
62 #define INT32 signed long int
\r
66 #define INT16 signed short int
\r
70 #define INT8 signed char
\r
77 #ifndef _MEMORYREADWRITEBYTE_
\r
78 #define _MEMORYREADWRITEBYTE_
\r
80 struct MemoryWriteByte
\r
84 void (*memoryCall)(UINT32, UINT8, struct MemoryWriteByte *);
\r
88 struct MemoryReadByte
\r
92 UINT8 (*memoryCall)(UINT32, struct MemoryReadByte *);
\r
96 #endif // _MEMORYREADWRITEBYTE_
\r
102 void (*IOCall)(UINT16, UINT8, struct z80PortWrite *);
\r
110 UINT16 (*IOCall)(UINT16, struct z80PortRead *);
\r
127 #ifdef WORDS_BIGENDIAN
\r
139 #define z80AF z80af.af
\r
140 #define z80A z80af.half.a
\r
141 #define z80F z80af.half.f
\r
149 #ifdef WORDS_BIGENDIAN
\r
161 #define z80BC z80bc.bc
\r
162 #define z80B z80bc.half.b
\r
163 #define z80C z80bc.half.c
\r
171 #ifdef WORDS_BIGENDIAN
\r
183 #define z80DE z80de.de
\r
184 #define z80D z80de.half.d
\r
185 #define z80E z80de.half.e
\r
193 #ifdef WORDS_BIGENDIAN
\r
205 #define z80HL z80hl.hl
\r
206 #define z80H z80hl.half.h
\r
207 #define z80L z80hl.half.l
\r
209 #define z80SP z80sp.sp
\r
217 #ifdef WORDS_BIGENDIAN
\r
229 #define z80IX z80ix.ix
\r
230 #define z80XH z80ix.half.xh
\r
231 #define z80XL z80ix.half.xl
\r
239 #ifdef WORDS_BIGENDIAN
\r
251 #define z80IY z80iy.iy
\r
252 #define z80YH z80iy.half.yh
\r
253 #define z80YL z80iy.half.yl
\r
258 struct MemoryReadByte *z80MemRead;
\r
259 struct MemoryWriteByte *z80MemWrite;
\r
260 struct z80PortRead *z80IoRead;
\r
261 struct z80PortWrite *z80IoWrite;
\r
262 UINT32 z80clockticks;
\r
264 UINT32 z80interruptMode;
\r
281 UINT32 z80rCounter;
\r
284 UINT8 z80intPending;
\r
287 // These are the enumerations used for register access. DO NOT ALTER THEIR
\r
288 // ORDER! It must match the same order as in the mz80.c/mz80.asm files!
\r
299 CPUREG_Z80_AFPRIME,
\r
300 CPUREG_Z80_BCPRIME,
\r
301 CPUREG_Z80_DEPRIME,
\r
302 CPUREG_Z80_HLPRIME,
\r
317 CPUREG_Z80_NEGATIVE,
\r
319 CPUREG_Z80_OVERFLOW,
\r
320 CPUREG_Z80_HALFCARRY,
\r
326 // Leave this here!
\r
328 CPUREG_Z80_MAX_INDEX
\r
331 extern UINT32 mz80exec(UINT32);
\r
332 extern UINT32 mz80GetContextSize(void);
\r
333 extern UINT32 mz80GetElapsedTicks(UINT32);
\r
334 extern void mz80ReleaseTimeslice(void);
\r
335 extern void mz80GetContext(void *);
\r
336 extern void mz80SetContext(void *);
\r
337 extern void mz80reset(void);
\r
338 extern void mz80ClearPendingInterrupt(void);
\r
339 extern UINT32 mz80int(UINT32);
\r
340 extern UINT32 mz80nmi(void);
\r
341 extern void mz80init(void);
\r
342 extern void mz80shutdown(void);
\r
343 extern UINT32 z80intAddr;
\r
344 extern UINT32 z80nmiAddr;
\r
346 // Debugger useful routines
\r
348 extern UINT8 mz80SetRegisterValue(void *, UINT32, UINT32);
\r
349 extern UINT32 mz80GetRegisterValue(void *, UINT32);
\r
350 extern UINT32 mz80GetRegisterTextValue(void *, UINT32, UINT8 *);
\r
351 extern UINT8 *mz80GetRegisterName(UINT32);
\r
353 // Memory/IO read/write commands
\r
356 #define VALUE_BYTE 0
\r
360 #define VALUE_WORD 1
\r
363 #ifndef VALUE_DWORD
\r
364 #define VALUE_DWORD 2
\r
371 extern void mz80WriteValue(UINT8 bWhat, UINT32 dwAddr, UINT32 dwData);
\r
372 extern UINT32 mz80ReadValue(UINT8 bWhat, UINT32 dwAddr);
\r
374 // Flag definitions
\r
376 #define Z80_FLAG_CARRY 0x01
\r
377 #define Z80_FLAG_NEGATIVE 0x02
\r
378 #define Z80_FLAG_OVERFLOW_PARITY 0x04
\r
379 #define Z80_FLAG_UNDEFINED1 0x08
\r
380 #define Z80_FLAG_HALF_CARRY 0x10
\r
381 #define Z80_FLAG_UNDEFINED2 0x20
\r
382 #define Z80_FLAG_ZERO 0x40
\r
383 #define Z80_FLAG_SIGN 0x80
\r
388 typedef struct mz80context CONTEXTMZ80;
\r