Annotation of tme/ic/m68k/m68k-impl.h, revision 1.1

1.1     ! root        1: /* $Id: m68k-impl.h,v 1.10 2003/05/16 21:48:10 fredette Exp $ */
        !             2: 
        !             3: /* ic/m68k/m68k-impl.h - implementation header file for Motorola 68k emulation: */
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 2002, 2003 Matt Fredette
        !             7:  * All rights reserved.
        !             8:  *
        !             9:  * Redistribution and use in source and binary forms, with or without
        !            10:  * modification, are permitted provided that the following conditions
        !            11:  * are met:
        !            12:  * 1. Redistributions of source code must retain the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer.
        !            14:  * 2. Redistributions in binary form must reproduce the above copyright
        !            15:  *    notice, this list of conditions and the following disclaimer in the
        !            16:  *    documentation and/or other materials provided with the distribution.
        !            17:  * 3. All advertising materials mentioning features or use of this software
        !            18:  *    must display the following acknowledgement:
        !            19:  *      This product includes software developed by Matt Fredette.
        !            20:  * 4. The name of the author may not be used to endorse or promote products
        !            21:  *    derived from this software without specific prior written permission.
        !            22:  *
        !            23:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        !            25:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
        !            26:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
        !            27:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        !            28:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
        !            29:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            30:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            31:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
        !            32:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            33:  * POSSIBILITY OF SUCH DAMAGE.
        !            34:  */
        !            35: 
        !            36: #ifndef _IC_M68K_IMPL_H
        !            37: #define _IC_M68K_IMPL_H
        !            38: 
        !            39: #include <tme/common.h>
        !            40: _TME_RCSID("$Id: m68k-impl.h,v 1.10 2003/05/16 21:48:10 fredette Exp $");
        !            41: 
        !            42: /* includes: */
        !            43: #include <tme/ic/m68k.h>
        !            44: #include <tme/generic/ic.h>
        !            45: #include <setjmp.h>
        !            46: 
        !            47: /* macros: */
        !            48: 
        !            49: /* CPUs: */
        !            50: #define TME_M68K_M68000                (0)
        !            51: #define TME_M68K_M68010                (1)
        !            52: #define TME_M68K_M68020                (2)
        !            53: #define TME_M68K_M68030                (3)
        !            54: 
        !            55: /* generic registers: */
        !            56: #define tme_m68k_ireg_uint32(x)        tme_m68k_ic.tme_ic_ireg_uint32(x)
        !            57: #define tme_m68k_ireg_int32(x) tme_m68k_ic.tme_ic_ireg_int32(x)
        !            58: #define tme_m68k_ireg_uint16(x)        tme_m68k_ic.tme_ic_ireg_uint16(x)
        !            59: #define tme_m68k_ireg_int16(x) tme_m68k_ic.tme_ic_ireg_int16(x)
        !            60: #define tme_m68k_ireg_uint8(x) tme_m68k_ic.tme_ic_ireg_uint8(x)
        !            61: #define tme_m68k_ireg_int8(x)  tme_m68k_ic.tme_ic_ireg_int8(x)
        !            62: 
        !            63: /* flags: */
        !            64: #define TME_M68K_FLAG_C        TME_BIT(0)
        !            65: #define TME_M68K_FLAG_V        TME_BIT(1)
        !            66: #define TME_M68K_FLAG_Z        TME_BIT(2)
        !            67: #define TME_M68K_FLAG_N        TME_BIT(3)
        !            68: #define TME_M68K_FLAG_X        TME_BIT(4)
        !            69: #define TME_M68K_FLAG_IPM(x)   TME_FIELD_EXTRACTU(x, 8, 3)
        !            70: #define TME_M68K_FLAG_M                TME_BIT(12)
        !            71: #define TME_M68K_FLAG_S                TME_BIT(13)
        !            72: #define TME_M68K_FLAG_T(x)     TME_FIELD_EXTRACTU(x, 14, 2)
        !            73: #define TME_M68K_FLAG_CCR      (TME_M68K_FLAG_C | TME_M68K_FLAG_V | \
        !            74:                                 TME_M68K_FLAG_Z | TME_M68K_FLAG_N | \
        !            75:                                 TME_M68K_FLAG_X)
        !            76: #define TME_M68K_FLAG_SR       (TME_M68K_FLAG_CCR | (0x7 << 8) | \
        !            77:                                 TME_M68K_FLAG_M | TME_M68K_FLAG_S | \
        !            78:                                 (0x3 << 14))
        !            79: 
        !            80: /* conditions: */
        !            81: #define TME_M68K_C_T   (0)
        !            82: #define TME_M68K_C_F   (1)
        !            83: #define TME_M68K_C_HI  (2)
        !            84: #define TME_M68K_C_LS  (3)
        !            85: #define TME_M68K_C_CC  (4)
        !            86: #define TME_M68K_C_CS  (5)
        !            87: #define TME_M68K_C_NE  (6)
        !            88: #define TME_M68K_C_EQ  (7)
        !            89: #define TME_M68K_C_VC  (8)
        !            90: #define TME_M68K_C_VS  (9)
        !            91: #define TME_M68K_C_PL  (10)
        !            92: #define TME_M68K_C_MI  (11)
        !            93: #define TME_M68K_C_GE  (12)
        !            94: #define TME_M68K_C_LT  (13)
        !            95: #define TME_M68K_C_GT  (14)
        !            96: #define TME_M68K_C_LE  (15)
        !            97: #define TME_M68K_COND_TRUE(ic, c) (_tme_m68k_conditions[(ic)->tme_m68k_ireg_ccr] & TME_BIT(c))
        !            98: 
        !            99: /* bus cycles: */
        !           100: #define TME_M68K_BUS_CYCLE_NORMAL              (0)
        !           101: #define TME_M68K_BUS_CYCLE_READ                        TME_BIT(0)
        !           102: #define TME_M68K_BUS_CYCLE_FETCH               TME_BIT(1)
        !           103: #define TME_M68K_BUS_CYCLE_RMW                 TME_BIT(2)
        !           104: #define TME_M68K_BUS_CYCLE_RAW                 TME_BIT(3)
        !           105: 
        !           106: /* exceptions: */
        !           107: #define TME_M68K_EXCEPTION_NONE                        (0)
        !           108: #define TME_M68K_EXCEPTION_GROUP0_RESET                TME_BIT(0)
        !           109: #define TME_M68K_EXCEPTION_GROUP0_AERR         TME_BIT(1)
        !           110: #define TME_M68K_EXCEPTION_GROUP0_BERR         TME_BIT(2)
        !           111: #define TME_M68K_EXCEPTION_GROUP1_TRACE                TME_BIT(3)
        !           112: #define TME_M68K_EXCEPTION_GROUP1_INT(ipl, vec)        (((ipl) << 4) | ((vec) << 7))
        !           113: #define TME_M68K_EXCEPTION_IS_GROUP1_INT(x)    (((x) >> 4) & 0x7)
        !           114: #define TME_M68K_EXCEPTION_GROUP1_INT_VEC(x)   (((x) >> 7) & 0xff)
        !           115: #define TME_M68K_EXCEPTION_GROUP1_ILL          TME_BIT(15)
        !           116: #define TME_M68K_EXCEPTION_GROUP1_PRIV         TME_BIT(16)
        !           117: #define TME_M68K_EXCEPTION_GROUP2(x)           ((x) << 17)
        !           118: #define TME_M68K_EXCEPTION_IS_GROUP2(x)                ((x) >> 17)
        !           119: 
        !           120: /* exception frame formats: */
        !           121: #define TME_M68K_FORMAT_0      (0)
        !           122: #define TME_M68K_FORMAT_8      (8)
        !           123: 
        !           124: /* sizes: */
        !           125: #define TME_M68K_SIZE_SUBMAP_X (-2)
        !           126: #define TME_M68K_SIZE_UNDEF    (-1)
        !           127: #define TME_M68K_SIZE_UNSIZED  (0)
        !           128: #define TME_M68K_SIZE_8                (1)
        !           129: #define TME_M68K_SIZE_16       (2)
        !           130: #define TME_M68K_SIZE_16U8     (3)
        !           131: #define TME_M68K_SIZE_32       (4)
        !           132: #define TME_M68K_SIZE_16S32    (5)
        !           133: 
        !           134: /* special opcodes: */
        !           135: #define TME_M68K_SPECOP_UNDEF          (-1)
        !           136: #define TME_M68K_SPECOP_BCC            (0)
        !           137: #define TME_M68K_SPECOP_SPECOP16       (1)
        !           138: #define TME_M68K_SPECOP_MOVES          (2)
        !           139: #define TME_M68K_SPECOP_MOVEMEMTOMEM   (3)
        !           140: #define TME_M68K_SPECOP_ILLEGAL                (4)
        !           141: #define TME_M68K_SPECOP_MULUL          (5)
        !           142: #define TME_M68K_SPECOP_DIVUL          (6)
        !           143: #define TME_M68K_SPECOP_CAS2           (7)
        !           144: #define TME_M68K_SPECOP_MOVENONMEMTOMEM        (8)
        !           145: 
        !           146: /* major modes of the emulator: */
        !           147: #define TME_M68K_MODE_EXECUTION        (0)
        !           148: #define TME_M68K_MODE_EXCEPTION        (1)
        !           149: #define TME_M68K_MODE_RTE      (2)
        !           150: #define TME_M68K_MODE_STOP     (3)
        !           151: #define TME_M68K_MODE_HALT     (4)
        !           152: 
        !           153: /* mode-specific flags: */
        !           154: #define TME_M68K_EXECUTION_INST_CANFAULT       TME_BIT(0)
        !           155: 
        !           156: /* given a linear address, this hashes it into a TLB entry: */
        !           157: #define _TME_M68K_TLB_HASH_SIZE (1024)
        !           158: #define TME_M68K_TLB_ENTRY(ic, function_code, linear_address) \
        !           159:   (TME_ATOMIC_READ(struct tme_m68k_tlb *, (ic)->_tme_m68k_tlb_array) \
        !           160:     + ((linear_address >> 10) & (_TME_M68K_TLB_HASH_SIZE - 1)))
        !           161: 
        !           162: /* macros for sequence control: */
        !           163: #define TME_M68K_SEQUENCE_START                                                \
        !           164: do {                                                                   \
        !           165:   ic->_tme_m68k_sequence._tme_m68k_sequence_mode_flags = 0;            \
        !           166:   ic->_tme_m68k_sequence._tme_m68k_sequence_transfer_faulted = 0;      \
        !           167:   ic->_tme_m68k_sequence._tme_m68k_sequence_transfer_next = 1;         \
        !           168: } while (/* CONSTCOND */ 0)
        !           169: #define TME_M68K_SEQUENCE_RESTARTING                                   \
        !           170:   (ic->_tme_m68k_sequence._tme_m68k_sequence_transfer_faulted          \
        !           171:    >= ic->_tme_m68k_sequence._tme_m68k_sequence_transfer_next)
        !           172: #define TME_M68K_SEQUENCE_RESTART                                      \
        !           173: do {                                                                   \
        !           174:   if (!TME_M68K_SEQUENCE_RESTARTING)                                   \
        !           175:     ic->_tme_m68k_sequence._tme_m68k_sequence_transfer_faulted =       \
        !           176:       ic->_tme_m68k_sequence._tme_m68k_sequence_transfer_next;         \
        !           177:   ic->_tme_m68k_sequence._tme_m68k_sequence_transfer_next = 1;         \
        !           178: } while (/* CONSTCOND */ 0)
        !           179: #define TME_M68K_SEQUENCE_TRANSFER_STEP                                        \
        !           180: do {                                                                   \
        !           181:   ic->_tme_m68k_sequence._tme_m68k_sequence_transfer_next++;           \
        !           182: } while (/* CONSTCOND */ 0)
        !           183: 
        !           184: /* instruction handler macros: */
        !           185: #define TME_M68K_INSN_DECL(name) void name _TME_P((struct tme_m68k *, void *, void *))
        !           186: #ifdef __STDC__
        !           187: #define TME_M68K_INSN(name) void name(struct tme_m68k *ic, void *_op0, void *_op1)
        !           188: #else  /* !__STDC__ */
        !           189: #define TME_M68K_INSN(name) void name(ic, _op0, _op1) struct tme_m68k *ic; void *_op0, *_op1;
        !           190: #endif /* !__STDC__ */
        !           191: #define TME_M68K_INSN_OP0(t)           (*((t *) _op0))
        !           192: #define TME_M68K_INSN_OP1(t)           (*((t *) _op1))
        !           193: #define TME_M68K_INSN_OPCODE           ic->_tme_m68k_insn_opcode
        !           194: #define TME_M68K_INSN_SPECOP           ic->_tme_m68k_insn_specop
        !           195: #define TME_M68K_INSN_OK               return
        !           196: #define TME_M68K_INSN_EXCEPTION(e)     tme_m68k_exception(ic, e)
        !           197: #define TME_M68K_INSN_PRIV                     \
        !           198:   if (!TME_M68K_PRIV(ic))      \
        !           199:     TME_M68K_INSN_EXCEPTION(TME_M68K_EXCEPTION_GROUP1_PRIV)
        !           200: #define TME_M68K_INSN_ILL                      \
        !           201:   TME_M68K_INSN_EXCEPTION(TME_M68K_EXCEPTION_GROUP1_ILL)
        !           202: #define TME_M68K_INSN_CANFAULT                 \
        !           203: do {                                           \
        !           204:   ic->_tme_m68k_mode_flags                     \
        !           205:     |= TME_M68K_EXECUTION_INST_CANFAULT;       \
        !           206: } while (/* CONSTCOND */ 0)
        !           207: #define TME_M68K_INSN_BRANCH(pc)                               \
        !           208: do {                                                           \
        !           209:   tme_m68k_verify_end_branch(ic, pc);                          \
        !           210:   ic->tme_m68k_ireg_pc = ic->tme_m68k_ireg_pc_next = (pc);     \
        !           211:   if (tme_m68k_go_slow(ic)) {                                  \
        !           212:     TME_M68K_SEQUENCE_START;                                   \
        !           213:     tme_m68k_redispatch(ic);                                   \
        !           214:   }                                                            \
        !           215: } while (/* CONSTCOND */ 0)
        !           216: #define TME_M68K_INSN_CHANGE_SR(reg)                           \
        !           217: do {                                                           \
        !           218:   TME_M68K_INSN_PRIV;                                          \
        !           219:   tme_m68k_change_sr(ic, reg);                                 \
        !           220: } while (/* CONSTCOND */ 0)
        !           221: 
        !           222: /* logging: */
        !           223: #define TME_M68K_LOG_HANDLE(ic)                                        \
        !           224:   (&(ic)->tme_m68k_element->tme_element_log_handle)
        !           225: #define tme_m68k_log_start(ic, level, rc)                      \
        !           226: do {                                                           \
        !           227:   tme_log_start(TME_M68K_LOG_HANDLE(ic), level, rc) {          \
        !           228:     if ((ic)->_tme_m68k_mode != TME_M68K_MODE_EXECUTION) {     \
        !           229:       tme_log_part(TME_M68K_LOG_HANDLE(ic),                    \
        !           230:                    "mode=%d ",                                 \
        !           231:                    (ic)->_tme_m68k_mode);                      \
        !           232:     }                                                          \
        !           233:     else {                                                     \
        !           234:       tme_log_part(TME_M68K_LOG_HANDLE(ic),                    \
        !           235:                   "pc=%c/0x%08x ",                             \
        !           236:                   (((ic)->tme_m68k_ireg_sr                     \
        !           237:                     & (TME_M68K_FLAG_M                         \
        !           238:                        | TME_M68K_FLAG_S))                     \
        !           239:                    ? 'S'                                       \
        !           240:                    : 'U'),                                     \
        !           241:                   ic->tme_m68k_ireg_pc);                       \
        !           242:     }                                                          \
        !           243:     do
        !           244: #define tme_m68k_log_finish(ic)                                        \
        !           245:     while (/* CONSTCOND */ 0);                                 \
        !           246:   } tme_log_finish(TME_M68K_LOG_HANDLE(ic));                   \
        !           247: } while (/* CONSTCOND */ 0)
        !           248: #define tme_m68k_log(ic, level, rc, x)         \
        !           249: do {                                           \
        !           250:   tme_m68k_log_start(ic, level, rc) {          \
        !           251:     tme_log_part x;                            \
        !           252:   } tme_m68k_log_finish(ic);                   \
        !           253: } while (/* CONSTCOND */ 0)
        !           254: 
        !           255: /* miscellaneous: */
        !           256: #define TME_M68K_OPNUM_SUBMAP_X        (-2)
        !           257: #define TME_M68K_OPNUM_UNDEF   (-1)
        !           258: #define TME_M68K_PRIV(ic)      ((ic)->tme_m68k_ireg_sr & TME_M68K_FLAG_S)
        !           259: #define TME_M68K_FUNCTION_CODE_DATA(ic)        \
        !           260:   (TME_M68K_PRIV(ic) ? TME_M68K_FC_SD : TME_M68K_FC_UD)
        !           261: #define TME_M68K_FUNCTION_CODE_PROGRAM(ic)     \
        !           262:   (TME_M68K_PRIV(ic) ? TME_M68K_FC_SP : TME_M68K_FC_UP)
        !           263: #define TME_M68K_INSN_WORDS_MAX        (11)
        !           264: 
        !           265: /* structures: */
        !           266: struct tme_m68k;
        !           267: 
        !           268: /* an memory read or write function: */
        !           269: typedef void (*_tme_m68k_xfer_memx) _TME_P((struct tme_m68k *));
        !           270: typedef void (*_tme_m68k_xfer_mem) _TME_P((struct tme_m68k *, int));
        !           271: 
        !           272: /* an m68k opcode map entry: */
        !           273: struct _tme_m68k_opcode {
        !           274: 
        !           275:   /* the instruction: */
        !           276:   void (*_tme_m68k_opcode_func) _TME_P((struct tme_m68k *, void *, void *));
        !           277:   
        !           278:   /* iff this opcode requires some special operand processing, this is
        !           279:      its type, else this is TME_M68K_SPECOP_TYPE_UNDEF: */
        !           280:   int _tme_m68k_opcode_specop_type;
        !           281: 
        !           282:   /* if this opcode has an EA, this is the mask of bus cycles: */
        !           283:   int _tme_m68k_opcode_eax_cycles;
        !           284: };
        !           285: 
        !           286: /* an m68k decoder generic map entry: */
        !           287: struct _tme_m68k_decoder_gen {
        !           288: 
        !           289:   /* any known operands, else NULL: */
        !           290:   void *_tme_m68k_decoder_gen_operand0;
        !           291:   void *_tme_m68k_decoder_gen_operand1;
        !           292:     
        !           293:   /* any known EA size, else TME_M68K_SIZE_UNDEF: */
        !           294:   int _tme_m68k_decoder_gen_eax_size;
        !           295: 
        !           296:   /* any known immediate operand number, else TME_M68K_OPNUM_UNDEF: */
        !           297:   int _tme_m68k_decoder_gen_imm_operand;
        !           298: 
        !           299:   /* any known immediate operand size: */
        !           300:   int _tme_m68k_decoder_gen_imm_size;  
        !           301: };
        !           302: 
        !           303: /* an m68k decoder submap entry: */
        !           304: struct _tme_m68k_decoder_submap {
        !           305: 
        !           306:   /* the generic map entry: */
        !           307:   struct _tme_m68k_decoder_gen _tme_m68k_decoder_submap_gen;
        !           308: 
        !           309:   /* the index for the opcode map: */
        !           310:   unsigned int _tme_m68k_decoder_submap_opcode_map_index;
        !           311: };
        !           312: 
        !           313: /* an m68k decoder root map entry: */
        !           314: struct _tme_m68k_decoder_root {
        !           315:   
        !           316:   /* the generic map entry: */
        !           317:   struct _tme_m68k_decoder_gen _tme_m68k_decoder_root_gen;
        !           318: 
        !           319:   /* the opcode map: */
        !           320:   const struct _tme_m68k_opcode *_tme_m68k_decoder_root_opcode_map;
        !           321: 
        !           322:   /* the submap: */
        !           323:   const struct _tme_m68k_decoder_submap *_tme_m68k_decoder_root_submap;
        !           324: };
        !           325: 
        !           326: /* an m68k sequence: */
        !           327: struct _tme_m68k_sequence {
        !           328:   
        !           329:   /* the mode of the emulator: */
        !           330:   int _tme_m68k_sequence_mode;
        !           331: 
        !           332:   /* any mode-specific flags for the sequence: */
        !           333:   int _tme_m68k_sequence_mode_flags;
        !           334:   
        !           335:   /* the ordinal of the next memory transfer.  always starts from one: */
        !           336:   unsigned short _tme_m68k_sequence_transfer_next;
        !           337: 
        !           338:   /* the ordinal of the memory transfer that faulted.  if this is
        !           339:      greater than or equal to _tme_m68k_sequence_transfer_next, we are
        !           340:      restarting, and bus cycles and changes to the m68k state are
        !           341:      forbidden: */
        !           342:   unsigned short _tme_m68k_sequence_transfer_faulted;
        !           343: 
        !           344:   /* the fault happened after this number of bytes were successfully
        !           345:      transferred: */
        !           346:   unsigned short _tme_m68k_sequence_transfer_faulted_after;
        !           347: 
        !           348: #ifdef _TME_M68K_VERIFY
        !           349:   /* the sequence unique identifier: */
        !           350:   unsigned long _tme_m68k_sequence_uid;
        !           351: #endif /* _TME_M68K_VERIFY */
        !           352: };
        !           353: 
        !           354: /* the m68k state: */
        !           355: struct tme_m68k {
        !           356: 
        !           357:   /* the IC data structure.  it is beneficial to have this structure
        !           358:      first, since register numbers can often simply be scaled and 
        !           359:      added without an offset to the struct tme_m68k pointer to get
        !           360:      to their contents: */
        !           361:   struct tme_ic tme_m68k_ic;
        !           362: 
        !           363:   /* the m68k type: */
        !           364:   int tme_m68k_type;
        !           365: 
        !           366:   /* the backpointer to our element: */
        !           367:   struct tme_element *tme_m68k_element;
        !           368: 
        !           369:   /* our bus connection.  if both are defined, the m68k bus connection
        !           370:      is an adaptation layer for the generic bus connection: */
        !           371:   struct tme_m68k_bus_connection *_tme_m68k_bus_connection;
        !           372:   struct tme_bus_connection *_tme_m68k_bus_generic;
        !           373: 
        !           374:   /* a jmp_buf back to the dispatcher: */
        !           375:   jmp_buf _tme_m68k_dispatcher;
        !           376: 
        !           377:   /* the current sequence: */
        !           378:   struct _tme_m68k_sequence _tme_m68k_sequence;
        !           379: #define _tme_m68k_mode _tme_m68k_sequence._tme_m68k_sequence_mode
        !           380: #define _tme_m68k_mode_flags _tme_m68k_sequence._tme_m68k_sequence_mode_flags
        !           381: #define _tme_m68k_insn_uid _tme_m68k_sequence._tme_m68k_sequence_uid
        !           382: 
        !           383:   /* the CPU-dependent functions for the different modes: */
        !           384:   void (*_tme_m68k_mode_execute) _TME_P((struct tme_m68k *));
        !           385:   void (*_tme_m68k_mode_exception) _TME_P((struct tme_m68k *));
        !           386:   void (*_tme_m68k_mode_rte) _TME_P((struct tme_m68k *));
        !           387: 
        !           388:   /* the instruction decoder root map, and the instruction burst count: */
        !           389:   const struct _tme_m68k_decoder_root *_tme_m68k_decoder_root;
        !           390:   unsigned int _tme_m68k_instruction_burst;
        !           391: 
        !           392:   /* the effective address: */
        !           393:   tme_uint32_t _tme_m68k_ea_address;
        !           394:   unsigned int _tme_m68k_ea_function_code;
        !           395: 
        !           396:   /* instruction fetch information: */
        !           397:   tme_uint16_t _tme_m68k_insn_opcode;
        !           398:   tme_uint16_t _tme_m68k_insn_specop;
        !           399:   tme_uint16_t _tme_m68k_insn_specop2;
        !           400:   
        !           401:   /* the instruction buffer: */
        !           402:   tme_uint8_t _tme_m68k_insn_buffer[TME_M68K_INSN_WORDS_MAX * sizeof(tme_uint32_t)];
        !           403:   unsigned int _tme_m68k_insn_buffer_off;
        !           404:   tme_uint16_t _tme_m68k_insn_buffer_fetch_total;
        !           405:   tme_uint16_t _tme_m68k_insn_buffer_fetch_sizes;
        !           406: 
        !           407:   /* the TLB entry set, and a separate instruction TLB entry set
        !           408:      reserved for the executors: */
        !           409:   TME_ATOMIC(struct tme_m68k_tlb *, _tme_m68k_tlb_array);
        !           410:   TME_ATOMIC(struct tme_m68k_tlb *, _tme_m68k_itlb);
        !           411: 
        !           412:   /* exception handling information: */
        !           413:   tme_uint32_t _tme_m68k_exceptions;
        !           414: 
        !           415:   /* nonzero iff this CPU has a 16-bit bus: */
        !           416:   int _tme_m68k_bus_16bit;
        !           417: 
        !           418:   /* group 0 exception information: */
        !           419:   void (*_tme_m68k_group0_hook) _TME_P((struct tme_m68k *));
        !           420:   unsigned int _tme_m68k_group0_flags;
        !           421:   unsigned int _tme_m68k_group0_function_code;
        !           422:   tme_uint32_t _tme_m68k_group0_address;
        !           423:   struct _tme_m68k_sequence _tme_m68k_group0_sequence;
        !           424:   tme_uint8_t _tme_m68k_group0_buffer_read[sizeof(tme_uint32_t)];
        !           425:   unsigned int _tme_m68k_group0_buffer_read_size;
        !           426:   unsigned int _tme_m68k_group0_buffer_read_softrr;
        !           427:   tme_uint8_t _tme_m68k_group0_buffer_write[sizeof(tme_uint32_t)];
        !           428:   unsigned int _tme_m68k_group0_buffer_write_size;
        !           429:   unsigned int _tme_m68k_group0_buffer_write_softrr;
        !           430: 
        !           431:   /* the external request lines: */
        !           432:   tme_mutex_t tme_m68k_external_mutex;
        !           433:   tme_cond_t tme_m68k_external_cond;
        !           434:   unsigned int tme_m68k_external_reset;
        !           435:   unsigned int tme_m68k_external_halt;
        !           436:   unsigned int tme_m68k_external_ipl;
        !           437:   unsigned int tme_m68k_external_vector;
        !           438: };
        !           439: 
        !           440: /* globals: */
        !           441: extern const tme_uint16_t _tme_m68k_conditions[32];
        !           442: extern const tme_uint32_t _tme_m68k_imm32[9];
        !           443: extern const tme_uint16_t _tme_m68k_imm16[9];
        !           444: extern const tme_uint8_t _tme_m68k_imm8[9];
        !           445: extern const _tme_m68k_xfer_memx _tme_m68k_read_memx[5];
        !           446: extern const _tme_m68k_xfer_memx _tme_m68k_write_memx[5];
        !           447: extern const _tme_m68k_xfer_mem _tme_m68k_read_mem[5];
        !           448: extern const _tme_m68k_xfer_mem _tme_m68k_write_mem[5];
        !           449: 
        !           450: /* prototypes: */
        !           451: int tme_m68k_new _TME_P((struct tme_m68k *, const char * const *, const void *, char **));
        !           452: void tme_m68k_redispatch _TME_P((struct tme_m68k *));
        !           453: int tme_m68k_go_slow _TME_P((const struct tme_m68k *));
        !           454: void tme_m68k_change_sr _TME_P((struct tme_m68k *, tme_uint16_t));
        !           455: void tme_m68k_external_check _TME_P((struct tme_m68k *, tme_uint32_t));
        !           456: void tme_m68k_tlb_fill _TME_P((struct tme_m68k *, struct tme_m68k_tlb *, unsigned int, tme_uint32_t, unsigned int));
        !           457: void tme_m68k_do_reset _TME_P((struct tme_m68k *));
        !           458: 
        !           459: /* exception support: */
        !           460: void tme_m68k_exception _TME_P((struct tme_m68k *, tme_uint32_t));
        !           461: void tme_m68k_exception_process_start _TME_P((struct tme_m68k *, unsigned int));
        !           462: void tme_m68k_exception_process_finish _TME_P((struct tme_m68k *, tme_uint8_t, tme_uint8_t));
        !           463: void tme_m68k_exception_process _TME_P((struct tme_m68k *));
        !           464: 
        !           465: /* rte support: */
        !           466: tme_uint16_t tme_m68k_rte_start _TME_P((struct tme_m68k *));
        !           467: void tme_m68k_rte_finish _TME_P((struct tme_m68k *, tme_uint32_t));
        !           468: 
        !           469: /* decoder map support: */
        !           470: void _tme_m68000_decoder_map_init _TME_P((struct tme_m68k *));
        !           471: void _tme_m68010_decoder_map_init _TME_P((struct tme_m68k *));
        !           472: void _tme_m68020_decoder_map_init _TME_P((struct tme_m68k *));
        !           473: 
        !           474: /* read/modify/write cycle support: */
        !           475: struct tme_m68k_tlb *tme_m68k_rmw_start _TME_P((struct tme_m68k *));
        !           476: void tme_m68k_rmw_finish _TME_P((struct tme_m68k *, struct tme_m68k_tlb *));
        !           477: 
        !           478: /* group 0 fault support: */
        !           479: int tme_m68k_insn_buffer_xfer _TME_P((struct tme_m68k *, tme_uint8_t *, unsigned int, int));
        !           480: void tme_m68k_group0_hook_fast _TME_P((struct tme_m68k *));
        !           481: #define tme_m68k_insn_buffer_empty(ic, r, ra) \
        !           482:   tme_m68k_insn_buffer_xfer(ic, r, ra, 1)
        !           483: #define tme_m68k_insn_buffer_fill(ic, r, ra) \
        !           484:   tme_m68k_insn_buffer_xfer(ic, r, ra, 2)
        !           485: int tme_m68k_sequence_empty _TME_P((const struct tme_m68k *, tme_uint8_t *, unsigned int));
        !           486: int tme_m68k_sequence_fill _TME_P((struct tme_m68k *, const tme_uint8_t *, unsigned int));
        !           487: 
        !           488: /* bitfield support: */
        !           489: unsigned int tme_m68k_bitfield_width _TME_P((struct tme_m68k *));
        !           490: tme_uint32_t _tme_m68k_bitfield_read _TME_P((struct tme_m68k *, int));
        !           491: #define tme_m68k_bitfield_read_signed(ic) ((tme_int32_t) _tme_m68k_bitfield_read(ic, TRUE))
        !           492: #define tme_m68k_bitfield_read_unsigned(ic) _tme_m68k_bitfield_read(ic, FALSE)
        !           493: void tme_m68k_bitfield_write_unsigned _TME_P((struct tme_m68k *, tme_uint32_t, int));
        !           494: #define tme_m68k_bitfield_write_signed(ic, v, sf) tme_m68k_bitfield_write_unsigned(ic, (tme_uint32_t) (v), sf)
        !           495: 
        !           496: /* verification: */
        !           497: #ifdef _TME_M68K_VERIFY
        !           498: void tme_m68k_verify_init _TME_P((void));
        !           499: void tme_m68k_verify_begin _TME_P((const struct tme_m68k *, const tme_uint8_t *));
        !           500: void tme_m68k_verify_mem_any _TME_P((const struct tme_m68k *,
        !           501:                                     unsigned int, tme_uint32_t,
        !           502:                                     tme_uint8_t *, int, int));
        !           503: void tme_m68k_verify_end_branch _TME_P((const struct tme_m68k *, tme_uint32_t));
        !           504: void tme_m68k_verify_end _TME_P((const struct tme_m68k *,
        !           505:                                 void (*)(struct tme_m68k *, void *, void *)));
        !           506: void tme_m68k_verify_hook _TME_P((void));
        !           507: #else  /* _TME_M68K_VERIFY */
        !           508: #define tme_m68k_verify_init() do { } while (/* CONSTCOND */ 0)
        !           509: #define tme_m68k_verify_begin(ic, s) do { } while (/* CONSTCOND */ 0)
        !           510: #define tme_m68k_verify_mem_any(ic, fc, a, v, c, rw) do { } while (/* CONSTCOND */ 0)
        !           511: #define tme_m68k_verify_end_branch(ic, pc) do { } while (/* CONSTCOND */ 0)
        !           512: #define tme_m68k_verify_end(ic, f) do { } while (/* CONSTCOND */ 0)
        !           513: #define tme_m68k_verify_hook() do { } while (/* CONSTCOND */ 0)
        !           514: #endif /* _TME_M68K_VERIFY */
        !           515: #define tme_m68k_verify_mem8(ic, fc, a, v, rw) tme_m68k_verify_mem_any(ic, fc, a, (tme_uint8_t *) &(v), -sizeof(tme_uint8_t), rw)
        !           516: #define tme_m68k_verify_mem16(ic, fc, a, v, rw) tme_m68k_verify_mem_any(ic, fc, a, (tme_uint8_t *) &(v), -sizeof(tme_uint16_t), rw)
        !           517: #define tme_m68k_verify_mem32(ic, fc, a, v, rw) tme_m68k_verify_mem_any(ic, fc, a, (tme_uint8_t *) &(v), -sizeof(tme_uint32_t), rw)
        !           518: 
        !           519: /* instruction functions: */
        !           520: TME_M68K_INSN_DECL(tme_m68k_illegal);
        !           521: TME_M68K_INSN_DECL(tme_m68k_exg);
        !           522: TME_M68K_INSN_DECL(tme_m68k_extw);
        !           523: TME_M68K_INSN_DECL(tme_m68k_extl);
        !           524: TME_M68K_INSN_DECL(tme_m68k_extbl);
        !           525: TME_M68K_INSN_DECL(tme_m68k_lea);
        !           526: TME_M68K_INSN_DECL(tme_m68k_move_from_ccr);
        !           527: TME_M68K_INSN_DECL(tme_m68k_move_from_sr);
        !           528: TME_M68K_INSN_DECL(tme_m68k_move_from_sr0);
        !           529: TME_M68K_INSN_DECL(tme_m68k_swap);
        !           530: TME_M68K_INSN_DECL(tme_m68k_nop);
        !           531: TME_M68K_INSN_DECL(tme_m68k_scc);
        !           532: TME_M68K_INSN_DECL(tme_m68k_dbcc);
        !           533: TME_M68K_INSN_DECL(tme_m68k_bcc);
        !           534: TME_M68K_INSN_DECL(tme_m68k_bsr);
        !           535: TME_M68K_INSN_DECL(tme_m68k_pea);
        !           536: TME_M68K_INSN_DECL(tme_m68k_bkpt);
        !           537: TME_M68K_INSN_DECL(tme_m68k_tas);
        !           538: TME_M68K_INSN_DECL(tme_m68k_tas_r);
        !           539: TME_M68K_INSN_DECL(tme_m68k_move_usp);
        !           540: TME_M68K_INSN_DECL(tme_m68k_trap);
        !           541: TME_M68K_INSN_DECL(tme_m68k_trapv);
        !           542: TME_M68K_INSN_DECL(tme_m68k_link);
        !           543: TME_M68K_INSN_DECL(tme_m68k_unlk);
        !           544: TME_M68K_INSN_DECL(tme_m68k_movec);
        !           545: TME_M68K_INSN_DECL(tme_m68k_reset);
        !           546: TME_M68K_INSN_DECL(tme_m68k_rtd);
        !           547: TME_M68K_INSN_DECL(tme_m68k_rtr);
        !           548: TME_M68K_INSN_DECL(tme_m68k_rts);
        !           549: TME_M68K_INSN_DECL(tme_m68k_jsr);
        !           550: TME_M68K_INSN_DECL(tme_m68k_jmp);
        !           551: TME_M68K_INSN_DECL(tme_m68k_rte);
        !           552: TME_M68K_INSN_DECL(tme_m68k_stop);
        !           553: TME_M68K_INSN_DECL(tme_m68k_priv);
        !           554: TME_M68K_INSN_DECL(tme_m68k_cmp2_chk2);
        !           555: TME_M68K_INSN_DECL(tme_m68k_callm);
        !           556: TME_M68K_INSN_DECL(tme_m68k_rtm);
        !           557: TME_M68K_INSN_DECL(tme_m68k_trapcc);
        !           558: TME_M68K_INSN_DECL(tme_m68k_bfchg);
        !           559: TME_M68K_INSN_DECL(tme_m68k_bfclr);
        !           560: TME_M68K_INSN_DECL(tme_m68k_bfexts);
        !           561: TME_M68K_INSN_DECL(tme_m68k_bfextu);
        !           562: TME_M68K_INSN_DECL(tme_m68k_bfffo);
        !           563: TME_M68K_INSN_DECL(tme_m68k_bfins);
        !           564: TME_M68K_INSN_DECL(tme_m68k_bfset);
        !           565: TME_M68K_INSN_DECL(tme_m68k_bftst);
        !           566: TME_M68K_INSN_DECL(tme_m68k_pack);
        !           567: TME_M68K_INSN_DECL(tme_m68k_unpk);
        !           568: 
        !           569: #endif /* !_IC_M68K_IMPL_H */
        !           570: 
        !           571: /* the automatically-generated header information: */
        !           572: #include <m68k-auto.h>

unix.superglobalmegacorp.com

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