Annotation of generator/extra/z80-mz80-c/mz80.h, revision 1.1

1.1     ! root        1: /* Multi-Z80 32 Bit emulator */
        !             2: #undef BIG_ENDIAN
        !             3: 
        !             4: /* Copyright 1996, Neil Bradley, All rights reserved
        !             5:  *
        !             6:  * License agreement:
        !             7:  *
        !             8:  * The mZ80 emulator may be distributed in unmodified form to any medium.
        !             9:  *
        !            10:  * mZ80 May not be sold, or sold as a part of a commercial package without
        !            11:  * the express written permission of Neil Bradley ([email protected]). This
        !            12:  * includes shareware.
        !            13:  *
        !            14:  * Modified versions of mZ80 may not be publicly redistributed without author
        !            15:  * approval ([email protected]). This includes distributing via a publicly
        !            16:  * accessible LAN. You may make your own source modifications and distribute
        !            17:  * mZ80 in object only form.
        !            18:  *
        !            19:  * mZ80 Licensing for commercial applications is available. Please email
        !            20:  * [email protected] for details.
        !            21:  *
        !            22:  * Synthcom Systems, Inc, and Neil Bradley will not be held responsible for
        !            23:  * any damage done by the use of mZ80. It is purely "as-is".
        !            24:  *
        !            25:  * If you use mZ80 in a freeware application, credit in the following text:
        !            26:  *
        !            27:  * "Multi-Z80 CPU emulator by Neil Bradley ([email protected])"
        !            28:  *
        !            29:  * must accompany the freeware application within the application itself or
        !            30:  * in the documentation.
        !            31:  *
        !            32:  * Legal stuff aside:
        !            33:  *
        !            34:  * If you find problems with mZ80, please email the author so they can get
        !            35:  * resolved. If you find a bug and fix it, please also email the author so
        !            36:  * that those bug fixes can be propogated to the installed base of mZ80
        !            37:  * users. If you find performance improvements or problems with mZ80, please
        !            38:  * email the author with your changes/suggestions and they will be rolled in
        !            39:  * with subsequent releases of mZ80.
        !            40:  *
        !            41:  * The whole idea of this emulator is to have the fastest available 32 bit
        !            42:  * Multi-z80 emulator for the PC, giving maximum performance. 
        !            43:  */ 
        !            44: 
        !            45: /* General z80 based defines */
        !            46: 
        !            47: #ifndef        _MZ80_H_
        !            48: #define        _MZ80_H_
        !            49: 
        !            50: #ifndef UINT32
        !            51: #define UINT32  unsigned long int
        !            52: #endif
        !            53: 
        !            54: #ifndef UINT16
        !            55: #define UINT16  unsigned short int
        !            56: #endif
        !            57: 
        !            58: #ifndef UINT8
        !            59: #define UINT8   unsigned char
        !            60: #endif
        !            61: 
        !            62: #ifndef INT32
        !            63: #define INT32  signed long int
        !            64: #endif
        !            65: 
        !            66: #ifndef INT16
        !            67: #define INT16  signed short int
        !            68: #endif
        !            69: 
        !            70: #ifndef INT8
        !            71: #define INT8   signed char
        !            72: #endif
        !            73: 
        !            74: #ifdef __cplusplus
        !            75: extern "C" {
        !            76: #endif
        !            77: 
        !            78: #ifndef _MEMORYREADWRITEBYTE_
        !            79: #define _MEMORYREADWRITEBYTE_
        !            80: 
        !            81: struct MemoryWriteByte
        !            82: {
        !            83:        UINT32 lowAddr;
        !            84:        UINT32 highAddr;
        !            85:        void (*memoryCall)(UINT32, UINT8, struct MemoryWriteByte *);
        !            86:        void *pUserArea;
        !            87: };      
        !            88: 
        !            89: struct MemoryReadByte
        !            90: {
        !            91:        UINT32 lowAddr;
        !            92:        UINT32 highAddr;
        !            93:        UINT8 (*memoryCall)(UINT32, struct MemoryReadByte *);
        !            94:        void *pUserArea;
        !            95: };      
        !            96: 
        !            97: #endif // _MEMORYREADWRITEBYTE_
        !            98: 
        !            99: struct z80PortWrite
        !           100: {
        !           101:        UINT16 lowIoAddr;
        !           102:        UINT16 highIoAddr;
        !           103:        void (*IOCall)(UINT16, UINT8, struct z80PortWrite *);
        !           104:        void *pUserArea;
        !           105: };
        !           106: 
        !           107: struct z80PortRead
        !           108: {
        !           109:        UINT16 lowIoAddr;
        !           110:        UINT16 highIoAddr;
        !           111:        UINT16 (*IOCall)(UINT16, struct z80PortRead *);
        !           112:        void *pUserArea;
        !           113: };     
        !           114: 
        !           115: struct z80TrapRec
        !           116: {
        !           117:        UINT16 trapAddr;
        !           118:        UINT8  skipCnt;
        !           119:        UINT8  origIns;
        !           120: };
        !           121: 
        !           122: typedef union
        !           123: {
        !           124:        UINT32 af;
        !           125: 
        !           126:        struct
        !           127:        {
        !           128: #ifdef BIG_ENDIAN
        !           129:                UINT16 wFiller;
        !           130:                UINT8 a;
        !           131:                UINT8 f;
        !           132: #else
        !           133:                UINT8 f;
        !           134:                UINT8 a;
        !           135:                UINT16 wFiller;
        !           136: #endif
        !           137:        } half;
        !           138: } reg_af;
        !           139: 
        !           140: #define        z80AF   z80af.af
        !           141: #define        z80A    z80af.half.a
        !           142: #define        z80F    z80af.half.f
        !           143: 
        !           144: typedef union
        !           145: {
        !           146:        UINT32 bc;
        !           147: 
        !           148:        struct
        !           149:        {
        !           150: #ifdef BIG_ENDIAN
        !           151:                UINT16 wFiller;
        !           152:                UINT8 b;
        !           153:                UINT8 c;
        !           154: #else
        !           155:                UINT8 c;
        !           156:                UINT8 b;
        !           157:                UINT16 wFiller;
        !           158: #endif
        !           159:        } half;
        !           160: } reg_bc;
        !           161: 
        !           162: #define        z80BC   z80bc.bc
        !           163: #define        z80B    z80bc.half.b
        !           164: #define        z80C    z80bc.half.c
        !           165: 
        !           166: typedef union
        !           167: {
        !           168:        UINT32 de;
        !           169: 
        !           170:        struct
        !           171:        {
        !           172: #ifdef BIG_ENDIAN
        !           173:                UINT16 wFiller;
        !           174:                UINT8 d;
        !           175:                UINT8 e;
        !           176: #else
        !           177:                UINT8 e;
        !           178:                UINT8 d;
        !           179:                UINT16 wFiller;
        !           180: #endif
        !           181:        } half;
        !           182: } reg_de;
        !           183: 
        !           184: #define        z80DE   z80de.de
        !           185: #define        z80D    z80de.half.d
        !           186: #define        z80E    z80de.half.e
        !           187: 
        !           188: typedef union
        !           189: {
        !           190:        UINT32 hl;
        !           191: 
        !           192:        struct
        !           193:        {
        !           194: #ifdef BIG_ENDIAN
        !           195:                UINT16 wFiller;
        !           196:                UINT8 h;
        !           197:                UINT8 l;
        !           198: #else
        !           199:                UINT8 l;
        !           200:                UINT8 h;
        !           201:                UINT16 wFiller;
        !           202: #endif
        !           203:        } half;
        !           204: } reg_hl;
        !           205: 
        !           206: #define        z80HL   z80hl.hl
        !           207: #define        z80H    z80hl.half.h
        !           208: #define        z80L    z80hl.half.l
        !           209: 
        !           210: #define        z80SP   z80sp.sp
        !           211: 
        !           212: typedef union
        !           213: {
        !           214:        UINT32 ix;
        !           215: 
        !           216:        struct
        !           217:        {
        !           218: #ifdef BIG_ENDIAN
        !           219:                UINT16 wFiller;
        !           220:                UINT8 xh;
        !           221:                UINT8 xl;
        !           222: #else
        !           223:                UINT8 xl;
        !           224:                UINT8 xh;
        !           225:                UINT16 wFiller;
        !           226: #endif
        !           227:        } half;
        !           228: } reg_ix;
        !           229: 
        !           230: #define        z80IX   z80ix.ix
        !           231: #define        z80XH   z80ix.half.xh
        !           232: #define        z80XL   z80ix.half.xl
        !           233: 
        !           234: typedef union
        !           235: {
        !           236:        UINT32 iy;
        !           237: 
        !           238:        struct
        !           239:        {
        !           240: #ifdef BIG_ENDIAN
        !           241:                UINT16 wFiller;
        !           242:                UINT8 yh;
        !           243:                UINT8 yl;
        !           244: #else
        !           245:                UINT8 yl;
        !           246:                UINT8 yh;
        !           247:                UINT16 wFiller;
        !           248: #endif
        !           249:        } half;
        !           250: } reg_iy;
        !           251: 
        !           252: #define        z80IY   z80iy.iy
        !           253: #define        z80YH   z80iy.half.yh
        !           254: #define        z80YL   z80iy.half.yl
        !           255: 
        !           256: struct mz80context
        !           257: {
        !           258:        UINT8 *z80Base;
        !           259:        struct MemoryReadByte *z80MemRead;
        !           260:        struct MemoryWriteByte *z80MemWrite;
        !           261:        struct z80PortRead *z80IoRead;
        !           262:        struct z80PortWrite *z80IoWrite;
        !           263:        UINT32 z80clockticks;
        !           264:        UINT32 z80iff;
        !           265:        UINT32 z80interruptMode;
        !           266:        UINT32 z80halted;
        !           267: 
        !           268:        reg_af z80af;
        !           269:        reg_bc z80bc;
        !           270:        reg_de z80de;
        !           271:        reg_hl z80hl;
        !           272:        UINT32 z80afprime;
        !           273:        UINT32 z80bcprime;
        !           274:        UINT32 z80deprime;
        !           275:        UINT32 z80hlprime;
        !           276:        reg_ix z80ix;
        !           277:        reg_iy z80iy;
        !           278:        UINT32 z80sp;
        !           279:        UINT32 z80pc;
        !           280:        UINT32 z80nmiAddr;
        !           281:        UINT32 z80intAddr;
        !           282:        UINT32 z80rCounter;
        !           283:        UINT8 z80i;
        !           284:        UINT8 z80r;
        !           285:        UINT8 z80intPending;
        !           286: } RETRO_PACKED ;
        !           287: 
        !           288: // These are the enumerations used for register access. DO NOT ALTER THEIR
        !           289: // ORDER! It must match the same order as in the mz80.c/mz80.asm files!
        !           290: 
        !           291: enum
        !           292: {
        !           293: #ifndef CPUREG_PC
        !           294:        CPUREG_PC = 0,
        !           295: #endif
        !           296:        CPUREG_Z80_AF = 1,
        !           297:        CPUREG_Z80_BC,
        !           298:        CPUREG_Z80_DE,
        !           299:        CPUREG_Z80_HL,
        !           300:        CPUREG_Z80_AFPRIME,
        !           301:        CPUREG_Z80_BCPRIME,
        !           302:        CPUREG_Z80_DEPRIME,
        !           303:        CPUREG_Z80_HLPRIME,
        !           304:        CPUREG_Z80_IX,
        !           305:        CPUREG_Z80_IY,
        !           306:        CPUREG_Z80_SP,
        !           307:        CPUREG_Z80_I,
        !           308:        CPUREG_Z80_R,
        !           309:        CPUREG_Z80_A,
        !           310:        CPUREG_Z80_B,
        !           311:        CPUREG_Z80_C,
        !           312:        CPUREG_Z80_D,
        !           313:        CPUREG_Z80_E,
        !           314:        CPUREG_Z80_H,
        !           315:        CPUREG_Z80_L,
        !           316:        CPUREG_Z80_F,
        !           317:        CPUREG_Z80_CARRY,
        !           318:        CPUREG_Z80_NEGATIVE,
        !           319:        CPUREG_Z80_PARITY,
        !           320:        CPUREG_Z80_OVERFLOW,
        !           321:        CPUREG_Z80_HALFCARRY,
        !           322:        CPUREG_Z80_ZERO,
        !           323:        CPUREG_Z80_SIGN,
        !           324:        CPUREG_Z80_IFF1,
        !           325:        CPUREG_Z80_IFF2,
        !           326: 
        !           327:        // Leave this here!
        !           328: 
        !           329:        CPUREG_Z80_MAX_INDEX
        !           330: };
        !           331: 
        !           332: extern UINT32 mz80exec(UINT32);
        !           333: extern UINT32 mz80GetContextSize(void);
        !           334: extern UINT32 mz80GetElapsedTicks(UINT32);
        !           335: extern void mz80ReleaseTimeslice(void);
        !           336: extern void mz80GetContext(void *);
        !           337: extern void mz80SetContext(void *);
        !           338: extern void mz80reset(void);
        !           339: extern void mz80ClearPendingInterrupt(void);
        !           340: extern UINT32 mz80int(UINT32);
        !           341: extern UINT32 mz80nmi(void);
        !           342: extern void mz80init(void);
        !           343: extern UINT32 z80intAddr;
        !           344: extern UINT32 z80nmiAddr;
        !           345: 
        !           346: // Debugger useful routines
        !           347: 
        !           348: extern UINT8 mz80SetRegisterValue(void *, UINT32, UINT32);
        !           349: extern UINT32 mz80GetRegisterValue(void *, UINT32);
        !           350: extern UINT32 mz80GetRegisterTextValue(void *, UINT32, UINT8 *);
        !           351: extern UINT8 *mz80GetRegisterName(UINT32);
        !           352: 
        !           353: // Memory/IO read/write commands
        !           354: 
        !           355: #ifndef VALUE_BYTE
        !           356: #define        VALUE_BYTE      0
        !           357: #endif
        !           358: 
        !           359: #ifndef VALUE_WORD
        !           360: #define        VALUE_WORD      1
        !           361: #endif
        !           362: 
        !           363: #ifndef VALUE_DWORD
        !           364: #define        VALUE_DWORD     2
        !           365: #endif
        !           366: 
        !           367: #ifndef VALUE_IO
        !           368: #define        VALUE_IO        3
        !           369: #endif
        !           370: 
        !           371: extern void mz80WriteValue(UINT8 bWhat, UINT32 dwAddr, UINT32 dwData);
        !           372: extern UINT32 mz80ReadValue(UINT8 bWhat, UINT32 dwAddr);
        !           373: 
        !           374: // Flag definitions
        !           375: 
        !           376: #define        Z80_FLAG_CARRY                                  0x01
        !           377: #define        Z80_FLAG_NEGATIVE                               0x02
        !           378: #define        Z80_FLAG_OVERFLOW_PARITY        0x04
        !           379: #define        Z80_FLAG_UNDEFINED1                     0x08
        !           380: #define        Z80_FLAG_HALF_CARRY                     0x10
        !           381: #define        Z80_FLAG_UNDEFINED2                     0x20
        !           382: #define        Z80_FLAG_ZERO                                   0x40
        !           383: #define        Z80_FLAG_SIGN                                   0x80
        !           384: 
        !           385: #define        IFF1                    0x01
        !           386: #define        IFF2                    0x02
        !           387: 
        !           388: typedef struct mz80context CONTEXTMZ80;
        !           389: 
        !           390: #ifdef __cplusplus
        !           391: };
        !           392: #endif
        !           393: 
        !           394: #endif // _MZ80_H_

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.