Commit ea310c1e authored by GnoStiC's avatar GnoStiC

puae 2.3.1

parent 6ef16d06
...@@ -371,7 +371,7 @@ HOST_CPU=generic ...@@ -371,7 +371,7 @@ HOST_CPU=generic
MDFPP_H=fpp-unknown.h MDFPP_H=fpp-unknown.h
case $host_cpu in case $host_cpu in
i[[3-6]]86) i[[3-7]]86)
HOST_CPU=i386 HOST_CPU=i386
MDFPP_H=fpp-ieee.h MDFPP_H=fpp-ieee.h
;; ;;
...@@ -379,11 +379,11 @@ case $host_cpu in ...@@ -379,11 +379,11 @@ case $host_cpu in
HOST_CPU=amd64 HOST_CPU=amd64
MDFPP_H=fpp-ieee.h MDFPP_H=fpp-ieee.h
;; ;;
powerpc) powerpc*)
HOST_CPU=ppc HOST_CPU=ppc
MDFPP_H=fpp-ieee.h MDFPP_H=fpp-ieee.h
;; ;;
m68k) m68k | m680[246]0)
HOST_CPU=68k HOST_CPU=68k
MDFPP_H=fpp-ieee.h MDFPP_H=fpp-ieee.h
;; ;;
......
...@@ -11,40 +11,66 @@ ...@@ -11,40 +11,66 @@
* Machine-dependent structure for holding the 68k CCR flags * Machine-dependent structure for holding the 68k CCR flags
*/ */
struct flag_struct { struct flag_struct {
unsigned int c; unsigned int cznv;
unsigned int z;
unsigned int n;
unsigned int v;
unsigned int x; unsigned int x;
}; };
extern struct flag_struct regflags; extern struct flag_struct regflags;
#define ZFLG (regflags.z) #define FLAGBIT_N 15
#define NFLG (regflags.n) #define FLAGBIT_Z 14
#define CFLG (regflags.c) #define FLAGBIT_C 8
#define VFLG (regflags.v) #define FLAGBIT_V 0
#define XFLG (regflags.x) #define FLAGBIT_X 8
STATIC_INLINE int cctrue(int cc) #define FLAGVAL_N (1 << FLAGBIT_N)
#define FLAGVAL_Z (1 << FLAGBIT_Z)
#define FLAGVAL_C (1 << FLAGBIT_C)
#define FLAGVAL_V (1 << FLAGBIT_V)
#define FLAGVAL_X (1 << FLAGBIT_X)
#define SET_ZFLG(y) (regflags.cznv = (regflags.cznv & ~FLAGVAL_Z) | (((y) ? 1 : 0) << FLAGBIT_Z))
#define SET_CFLG(y) (regflags.cznv = (regflags.cznv & ~FLAGVAL_C) | (((y) ? 1 : 0) << FLAGBIT_C))
#define SET_VFLG(y) (regflags.cznv = (regflags.cznv & ~FLAGVAL_V) | (((y) ? 1 : 0) << FLAGBIT_V))
#define SET_NFLG(y) (regflags.cznv = (regflags.cznv & ~FLAGVAL_N) | (((y) ? 1 : 0) << FLAGBIT_N))
#define SET_XFLG(y) (regflags.x = ((y) ? 1 : 0) << FLAGBIT_X)
#define GET_ZFLG() ((regflags.cznv >> FLAGBIT_Z) & 1)
#define GET_CFLG() ((regflags.cznv >> FLAGBIT_C) & 1)
#define GET_VFLG() ((regflags.cznv >> FLAGBIT_V) & 1)
#define GET_NFLG() ((regflags.cznv >> FLAGBIT_N) & 1)
#define GET_XFLG() ((regflags.x >> FLAGBIT_X) & 1)
#define CLEAR_CZNV() (regflags.cznv = 0)
#define GET_CZNV (regflags.cznv)
#define IOR_CZNV(X) (regflags.cznv |= (X))
#define SET_CZNV(X) (regflags.cznv = (X))
#define COPY_CARRY() (regflags.x = regflags.cznv)
STATIC_INLINE int cctrue (int cc)
{ {
uae_u32 cznv = regflags.cznv;
switch (cc) { switch (cc) {
case 0: return 1; /* T */ case 0: return 1; /* T */
case 1: return 0; /* F */ case 1: return 0; /* F */
case 2: return !CFLG && !ZFLG; /* HI */ case 2: return (cznv & (FLAGVAL_C | FLAGVAL_Z)) == 0; /* !CFLG && !ZFLG HI */
case 3: return CFLG || ZFLG; /* LS */ case 3: return (cznv & (FLAGVAL_C | FLAGVAL_Z)) != 0; /* CFLG || ZFLG LS */
case 4: return !CFLG; /* CC */ case 4: return (cznv & FLAGVAL_C) == 0; /* !CFLG CC */
case 5: return CFLG; /* CS */ case 5: return (cznv & FLAGVAL_C) != 0; /* CFLG CS */
case 6: return !ZFLG; /* NE */ case 6: return (cznv & FLAGVAL_Z) == 0; /* !ZFLG NE */
case 7: return ZFLG; /* EQ */ case 7: return (cznv & FLAGVAL_Z) != 0; /* ZFLG EQ */
case 8: return !VFLG; /* VC */ case 8: return (cznv & FLAGVAL_V) == 0; /* !VFLG VC */
case 9: return VFLG; /* VS */ case 9: return (cznv & FLAGVAL_V) != 0; /* VFLG VS */
case 10:return !NFLG; /* PL */ case 10: return (cznv & FLAGVAL_N) == 0; /* !NFLG PL */
case 11:return NFLG; /* MI */ case 11: return (cznv & FLAGVAL_N) != 0; /* NFLG MI */
case 12:return NFLG == VFLG; /* GE */ case 12: return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & FLAGVAL_N) == 0; /* NFLG == VFLG GE */
case 13:return NFLG != VFLG; /* LT */ case 13: return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & FLAGVAL_N) != 0; /* NFLG != VFLG LT */
case 14:return !ZFLG && (NFLG == VFLG); /* GT */ case 14: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* ZFLG && (NFLG == VFLG) GT */
case 15:return ZFLG || (NFLG != VFLG); /* LE */ return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & (FLAGVAL_N | FLAGVAL_Z)) == 0;
case 15: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* ZFLG && (NFLG != VFLG) LE */
return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & (FLAGVAL_N | FLAGVAL_Z)) != 0;
} }
abort (); abort ();
return 0; return 0;
......
/* /*
* UAE - The Un*x Amiga Emulator * UAE - The Un*x Amiga Emulator
* *
* MC68000 emulation - machine dependent bits * MC68000 emulation - machine dependent bits
* *
* Copyright 1996 Bernd Schmidt * Copyright 1996 Bernd Schmidt
*/ */
struct flag_struct { struct flag_struct {
unsigned int c; unsigned int cznv;
unsigned int z;
unsigned int n;
unsigned int v;
unsigned int x; unsigned int x;
}; };
extern struct flag_struct regflags; extern struct flag_struct regflags;
#define ZFLG (regflags.z) #define FLAGBIT_N 15
#define NFLG (regflags.n) #define FLAGBIT_Z 14
#define CFLG (regflags.c) #define FLAGBIT_C 8
#define VFLG (regflags.v) #define FLAGBIT_V 0
#define XFLG (regflags.x) #define FLAGBIT_X 8
#define FLAGVAL_N (1 << FLAGBIT_N)
#define FLAGVAL_Z (1 << FLAGBIT_Z)
#define FLAGVAL_C (1 << FLAGBIT_C)
#define FLAGVAL_V (1 << FLAGBIT_V)
#define FLAGVAL_X (1 << FLAGBIT_X)
#define SET_ZFLG(y) (regflags.cznv = (regflags.cznv & ~FLAGVAL_Z) | (((y) ? 1 : 0) << FLAGBIT_Z))
#define SET_CFLG(y) (regflags.cznv = (regflags.cznv & ~FLAGVAL_C) | (((y) ? 1 : 0) << FLAGBIT_C))
#define SET_VFLG(y) (regflags.cznv = (regflags.cznv & ~FLAGVAL_V) | (((y) ? 1 : 0) << FLAGBIT_V))
#define SET_NFLG(y) (regflags.cznv = (regflags.cznv & ~FLAGVAL_N) | (((y) ? 1 : 0) << FLAGBIT_N))
#define SET_XFLG(y) (regflags.x = ((y) ? 1 : 0) << FLAGBIT_X)
#define GET_ZFLG() ((regflags.cznv >> FLAGBIT_Z) & 1)
#define GET_CFLG() ((regflags.cznv >> FLAGBIT_C) & 1)
#define GET_VFLG() ((regflags.cznv >> FLAGBIT_V) & 1)
#define GET_NFLG() ((regflags.cznv >> FLAGBIT_N) & 1)
#define GET_XFLG() ((regflags.x >> FLAGBIT_X) & 1)
static __inline__ int cctrue(const int cc) #define CLEAR_CZNV() (regflags.cznv = 0)
#define GET_CZNV (regflags.cznv)
#define IOR_CZNV(X) (regflags.cznv |= (X))
#define SET_CZNV(X) (regflags.cznv = (X))
#define COPY_CARRY() (regflags.x = regflags.cznv)
static __inline__ int cctrue(int cc)
{ {
switch(cc){ uae_u32 cznv = regflags.cznv;
case 0: return 1; /* T */
case 1: return 0; /* F */ switch (cc) {
case 2: return !CFLG && !ZFLG; /* HI */ case 0: return 1; /* T */
case 3: return CFLG || ZFLG; /* LS */ case 1: return 0; /* F */
case 4: return !CFLG; /* CC */ case 2: return (cznv & (FLAGVAL_C | FLAGVAL_Z)) == 0; /* !CFLG && !ZFLG HI */
case 5: return CFLG; /* CS */ case 3: return (cznv & (FLAGVAL_C | FLAGVAL_Z)) != 0; /* CFLG || ZFLG LS */
case 6: return !ZFLG; /* NE */ case 4: return (cznv & FLAGVAL_C) == 0; /* !CFLG CC */
case 7: return ZFLG; /* EQ */ case 5: return (cznv & FLAGVAL_C) != 0; /* CFLG CS */
case 8: return !VFLG; /* VC */ case 6: return (cznv & FLAGVAL_Z) == 0; /* !ZFLG NE */
case 9: return VFLG; /* VS */ case 7: return (cznv & FLAGVAL_Z) != 0; /* ZFLG EQ */
case 10:return !NFLG; /* PL */ case 8: return (cznv & FLAGVAL_V) == 0; /* !VFLG VC */
case 11:return NFLG; /* MI */ case 9: return (cznv & FLAGVAL_V) != 0; /* VFLG VS */
case 12:return NFLG == VFLG; /* GE */ case 10: return (cznv & FLAGVAL_N) == 0; /* !NFLG PL */
case 13:return NFLG != VFLG; /* LT */ case 11: return (cznv & FLAGVAL_N) != 0; /* NFLG MI */
case 14:return !ZFLG && (NFLG == VFLG); /* GT */ case 12: return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & FLAGVAL_N) == 0; /* NFLG == VFLG GE */
case 15:return ZFLG || (NFLG != VFLG); /* LE */ case 13: return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & FLAGVAL_N) != 0; /* NFLG != VFLG LT */
case 14: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* ZFLG && (NFLG == VFLG) GT */
return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & (FLAGVAL_N | FLAGVAL_Z)) == 0;
case 15: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* ZFLG && (NFLG != VFLG) LE */
return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & (FLAGVAL_N | FLAGVAL_Z)) != 0;
} }
abort(); abort ();
return 0; return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment