Annotation of uae/include/newcpu.h, revision 1.1

1.1     ! root        1:  /* 
        !             2:   * UAE - The Un*x Amiga Emulator
        !             3:   * 
        !             4:   * MC68000 emulation
        !             5:   *
        !             6:   * (c) 1995 Bernd Schmidt
        !             7:   * 
        !             8:   */
        !             9: 
        !            10: /* Kludge! */
        !            11: #define INLINE static __inline__
        !            12: 
        !            13: extern bool broken_in;
        !            14: 
        !            15: typedef void cpuop_func(UWORD) REGPARAM;
        !            16: 
        !            17: extern cpuop_func *cpufunctbl[65536];
        !            18: extern void op_illg(UWORD) REGPARAM;
        !            19: 
        !            20: typedef char flagtype; 
        !            21: 
        !            22: extern struct regstruct 
        !            23: {
        !            24:     ULONG d[8];
        !            25:     CPTR  a[8],usp;
        !            26:     UWORD sr;
        !            27:     flagtype t,s,x,n,z,v,c,stopped;
        !            28:     int intmask;
        !            29:     ULONG pc;
        !            30:     UWORD *pc_p;
        !            31:     UWORD *pc_oldp;
        !            32: } regs;
        !            33: 
        !            34: extern void MC68000_oldstep(UWORD opcode);
        !            35: 
        !            36: INLINE UWORD nextiword(void)
        !            37: {
        !            38:     UWORD r = *regs.pc_p++;
        !            39:     return r;
        !            40: }
        !            41: 
        !            42: INLINE ULONG nextilong(void)
        !            43: {
        !            44:     ULONG r = *regs.pc_p++;
        !            45:     r = (r << 16) + *regs.pc_p++;
        !            46:     return r;
        !            47: }
        !            48: 
        !            49: INLINE void m68k_setpc(CPTR newpc)
        !            50: {
        !            51:     regs.pc = newpc;
        !            52:     regs.pc_p = regs.pc_oldp = get_real_address(newpc);
        !            53: }
        !            54: 
        !            55: INLINE CPTR m68k_getpc(void)
        !            56: {
        !            57:     return regs.pc + ((char *)regs.pc_p - (char *)regs.pc_oldp);
        !            58: }
        !            59: 
        !            60: INLINE void m68k_setstopped(int stop)
        !            61: {
        !            62:     regs.stopped = stop;
        !            63:     if (stop)
        !            64:        specialflags |= SPCFLAG_STOP;
        !            65: }
        !            66: 
        !            67: INLINE void setflags_add(const ULONG src, const ULONG oldv, 
        !            68:                         const ULONG newv, const ULONG mask)
        !            69: {
        !            70:     int n=0, o=0, s=0;
        !            71:     switch(mask) {
        !            72:      case 0xff:
        !            73:        s = (BYTE)src < 0; 
        !            74:        o = (BYTE)oldv < 0;
        !            75:        n = (BYTE)newv < 0;
        !            76:        regs.z = (BYTE)newv == 0;
        !            77:        break;
        !            78:      case 0xffff:
        !            79:        s = (WORD)src < 0; 
        !            80:        o = (WORD)oldv < 0;
        !            81:        n = (WORD)newv < 0;
        !            82:        regs.z = (WORD)newv == 0;
        !            83:        break;
        !            84:      case 0xffffffff:
        !            85:        s = (LONG)src < 0; 
        !            86:        o = (LONG)oldv < 0;
        !            87:        n = (LONG)newv < 0;
        !            88:        regs.z = (LONG)newv == 0;
        !            89:        break;
        !            90:     } 
        !            91:     regs.c = regs.x = (s && o) || (!n && (o || s));
        !            92:     regs.n = n;
        !            93:     regs.v = ((s && o && !n) || (!s && !o && n));
        !            94: }
        !            95: 
        !            96: INLINE void setflags_sub(const ULONG src, const ULONG oldv,
        !            97:                         const ULONG newv, const ULONG mask)
        !            98: {
        !            99:     int n=0, o=0, s=0;
        !           100:     switch(mask) {
        !           101:      case 0xff:
        !           102:        s = (BYTE)src < 0; 
        !           103:        o = (BYTE)oldv < 0;
        !           104:        n = (BYTE)newv < 0;
        !           105:        regs.z = (BYTE)newv == 0;
        !           106:        break;
        !           107:      case 0xffff:
        !           108:        s = (WORD)src < 0; 
        !           109:        o = (WORD)oldv < 0;
        !           110:        n = (WORD)newv < 0;
        !           111:        regs.z = (WORD)newv == 0;
        !           112:        break;
        !           113:      case 0xffffffff:
        !           114:        s = (LONG)src < 0; 
        !           115:        o = (LONG)oldv < 0;
        !           116:        n = (LONG)newv < 0;
        !           117:        regs.z = (LONG)newv == 0;
        !           118:        break;
        !           119:     } 
        !           120: 
        !           121:     regs.z = newv == 0;
        !           122:     regs.c = regs.x = (s && !o) || (n && (!o || s));
        !           123:     regs.n = n;
        !           124:     regs.v = ((!s && o && !n) || (s && !o && n));
        !           125: }
        !           126: 
        !           127: INLINE void setflags_addx(const ULONG src, const ULONG oldv, 
        !           128:                          const ULONG newv, const ULONG mask)
        !           129: {
        !           130:     int n=0, o=0, s=0;
        !           131:     switch(mask) {
        !           132:      case 0xff:
        !           133:        s = (BYTE)src < 0; 
        !           134:        o = (BYTE)oldv < 0;
        !           135:        n = (BYTE)newv < 0;
        !           136:        if ((BYTE)newv != 0) regs.z = 0;
        !           137:        break;
        !           138:      case 0xffff:
        !           139:        s = (WORD)src < 0; 
        !           140:        o = (WORD)oldv < 0;
        !           141:        n = (WORD)newv < 0;
        !           142:        if ((WORD)newv != 0) regs.z = 0;
        !           143:        break;
        !           144:      case 0xffffffff:
        !           145:        s = (LONG)src < 0; 
        !           146:        o = (LONG)oldv < 0;
        !           147:        n = (LONG)newv < 0;
        !           148:        if ((LONG)newv != 0) regs.z = 0;
        !           149:        break;
        !           150:     } 
        !           151:     
        !           152:     regs.c = regs.x = (s && o) || (!n && (o || s));
        !           153:     regs.n = n;
        !           154:     regs.v = ((s && o && !n) || (!s && !o && n));
        !           155: }
        !           156: 
        !           157: INLINE void setflags_subx(const ULONG src, const ULONG oldv,
        !           158:                          const ULONG newv, const ULONG mask)
        !           159: {
        !           160:     int n=0, o=0, s=0;
        !           161:     switch(mask) {
        !           162:      case 0xff:
        !           163:        s = (BYTE)src < 0; 
        !           164:        o = (BYTE)oldv < 0;
        !           165:        n = (BYTE)newv < 0;
        !           166:        if ((BYTE)newv != 0) regs.z = 0;
        !           167:        break;
        !           168:      case 0xffff:
        !           169:        s = (WORD)src < 0; 
        !           170:        o = (WORD)oldv < 0;
        !           171:        n = (WORD)newv < 0;
        !           172:        if ((WORD)newv != 0) regs.z = 0;
        !           173:        break;
        !           174:      case 0xffffffff:
        !           175:        s = (LONG)src < 0; 
        !           176:        o = (LONG)oldv < 0;
        !           177:        n = (LONG)newv < 0;
        !           178:        if ((LONG)newv != 0) regs.z = 0;
        !           179:        break;
        !           180:     } 
        !           181: 
        !           182:     if (newv != 0) regs.z = 0;
        !           183:     regs.c = regs.x = (s && !o) || (n && (!o || s));
        !           184:     regs.n = n;
        !           185:     regs.v = ((!s && o && !n) || (s && !o && n));
        !           186: }
        !           187: 
        !           188: INLINE void setflags_cmp(const ULONG src, const ULONG oldv, 
        !           189:                         const ULONG newv, const ULONG mask)
        !           190: {
        !           191:     int n=0, o=0, s=0;
        !           192:     switch(mask) {
        !           193:      case 0xff:
        !           194:        s = (BYTE)src < 0; 
        !           195:        o = (BYTE)oldv < 0;
        !           196:        n = (BYTE)newv < 0;
        !           197:        regs.z = (BYTE)newv == 0;
        !           198:        break;
        !           199:      case 0xffff:
        !           200:        s = (WORD)src < 0; 
        !           201:        o = (WORD)oldv < 0;
        !           202:        n = (WORD)newv < 0;
        !           203:        regs.z = (WORD)newv == 0;
        !           204:        break;
        !           205:      case 0xffffffff:
        !           206:        s = (LONG)src < 0; 
        !           207:        o = (LONG)oldv < 0;
        !           208:        n = (LONG)newv < 0;
        !           209:        regs.z = (LONG)newv == 0;
        !           210:        break;
        !           211:     } 
        !           212:     
        !           213:     regs.z = newv == 0;
        !           214:     regs.c = (s && !o) || (n && (!o || s));
        !           215:     regs.n = n;
        !           216:     regs.v = ((!s && o && !n) || (s && !o && n));
        !           217: }
        !           218: 
        !           219: INLINE void setflags_logical(ULONG newv, const ULONG mask)
        !           220: {
        !           221:     switch(mask) {
        !           222:      case 0xff: 
        !           223:        regs.z = (BYTE)(newv) == 0;
        !           224:        regs.n = (BYTE)(newv) < 0;
        !           225:        break;
        !           226:      case 0xffff: 
        !           227:        regs.z = (WORD)(newv) == 0;
        !           228:        regs.n = (WORD)(newv) < 0;
        !           229:        break;
        !           230:      case 0xffffffff: 
        !           231:        regs.z = (LONG)(newv) == 0;
        !           232:        regs.n = (LONG)(newv) < 0;
        !           233:        break;
        !           234:     }
        !           235:     regs.v = regs.c = 0;
        !           236: }
        !           237: 
        !           238: 
        !           239: static __inline__ bool cctrue(const int cc)
        !           240: {
        !           241:     switch(cc){
        !           242:      case 0: return true;                                                    /* T */
        !           243:      case 1: return false;                                                   /* F */
        !           244:      case 2: return !regs.c && !regs.z;                                      /* HI */
        !           245:      case 3: return regs.c || regs.z;                                        /* LS */
        !           246:      case 4: return !regs.c;                                                 /* CC */
        !           247:      case 5: return regs.c;                                                  /* CS */
        !           248:      case 6: return !regs.z;                                                 /* NE */
        !           249:      case 7: return regs.z;                                                  /* EQ */
        !           250:      case 8: return !regs.v;                                                 /* VC */
        !           251:      case 9: return regs.v;                                                  /* VS */
        !           252:      case 10:return !regs.n;                                                 /* PL */
        !           253:      case 11:return regs.n;                                                  /* MI */
        !           254: #if 0
        !           255:      case 12:return (regs.n && regs.v) || (!regs.n && !regs.v);              /* GE */
        !           256:      case 13:return (regs.n && !regs.v) || (!regs.n && regs.v);              /* LT */
        !           257:      case 14:return !regs.z && ((regs.n && regs.v) || (!regs.n && !regs.v)); /* GT */
        !           258:      case 15:return regs.z || ((regs.n && !regs.v) || (!regs.n && regs.v));  /* LE */
        !           259: #endif 
        !           260:      case 12:return regs.n == regs.v;             /* GE */
        !           261:      case 13:return regs.n != regs.v;             /* LT */
        !           262:      case 14:return !regs.z && (regs.n == regs.v);/* GT */
        !           263:      case 15:return regs.z || (regs.n != regs.v); /* LE */
        !           264:     }
        !           265:     abort();
        !           266:     return 0;
        !           267: }
        !           268: 
        !           269: extern void MakeSR(void);
        !           270: extern void MakeFromSR(void);
        !           271: extern void Exception(int);
        !           272: 
        !           273: extern void MC68000_init(void);
        !           274: extern void MC68000_step(void);
        !           275: extern void MC68000_run(void);
        !           276: extern void MC68000_skip(CPTR);
        !           277: extern void MC68000_dumpstate(CPTR *);
        !           278: extern void MC68000_disasm(CPTR,CPTR *,int);
        !           279: extern void MC68000_reset(void);

unix.superglobalmegacorp.com

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