]> Shamusworld >> Repos - rmac/commitdiff
Bug fix in flognp1. Better handling of cpbcc/fbcc/pbcc groups of instructions.
authorggn <ggn.dbug@gmail.com>
Tue, 30 Jan 2018 12:29:52 +0000 (14:29 +0200)
committerShamus Hammons <jlhamm@acm.org>
Wed, 16 May 2018 17:57:53 +0000 (12:57 -0500)
68ktab
expr.c
mach.c

diff --git a/68ktab b/68ktab
index 623a830e8f9d1b9cd4244181f5c38552a5222f94..6034d491dba23d130d4c34e1c22666c1ec7581df 100644 (file)
--- a/68ktab
+++ b/68ktab
@@ -128,41 +128,41 @@ cmpm  NBWL   M_APOSTINC      M_APOSTINC      %1011xxx1ss001yRS   m_reg
 
 cmp2  NBWL   C_ALL030        M_DREG+M_AREG   %00000ss011eeeeee   m_cmp2
 
 
 cmp2  NBWL   C_ALL030        M_DREG+M_AREG   %00000ss011eeeeee   m_cmp2
 
-cpbeq NBW    C_LABEL         M_AM_NONE       %111100101s000001   m_cpbr
+cpbeq NBW    C_LABEL         M_AM_NONE       %111100101s000001   m_cpbcc
 cpbze
 cpbz
 cpbze
 cpbz
-cpbge NBW    C_LABEL         M_AM_NONE       %111100101s010011   m_cpbr
-cpbgt NBW    C_LABEL         M_AM_NONE       %111100101s010010   m_cpbr
-cpbgl NBW    C_LABEL         M_AM_NONE       %111100101s010110   m_cpbr
-cpbgle NBW   C_LABEL         M_AM_NONE       %111100101s010111   m_cpbr
-cpble NBW    C_LABEL         M_AM_NONE       %111100101s010101   m_cpbr
-cpblt NBW    C_LABEL         M_AM_NONE       %111100101s010100   m_cpbr
-cpbne NBW    C_LABEL         M_AM_NONE       %111100101s001110   m_cpbr
-cpbngt NBW   C_LABEL         M_AM_NONE       %111100101s011101   m_cpbr
-cpbnge NBW   C_LABEL         M_AM_NONE       %111100101s011100   m_cpbr
-cpbngl NBW   C_LABEL         M_AM_NONE       %111100101s011001   m_cpbr
-cpbnle NBW   C_LABEL         M_AM_NONE       %111100101s011010   m_cpbr
-cpbngle NBW  C_LABEL         M_AM_NONE       %111100101s011000   m_cpbr
+cpbge NBW    C_LABEL         M_AM_NONE       %111100101s010011   m_cpbcc
+cpbgt NBW    C_LABEL         M_AM_NONE       %111100101s010010   m_cpbcc
+cpbgl NBW    C_LABEL         M_AM_NONE       %111100101s010110   m_cpbcc
+cpbgle NBW   C_LABEL         M_AM_NONE       %111100101s010111   m_cpbcc
+cpble NBW    C_LABEL         M_AM_NONE       %111100101s010101   m_cpbcc
+cpblt NBW    C_LABEL         M_AM_NONE       %111100101s010100   m_cpbcc
+cpbne NBW    C_LABEL         M_AM_NONE       %111100101s001110   m_cpbcc
+cpbngt NBW   C_LABEL         M_AM_NONE       %111100101s011101   m_cpbcc
+cpbnge NBW   C_LABEL         M_AM_NONE       %111100101s011100   m_cpbcc
+cpbngl NBW   C_LABEL         M_AM_NONE       %111100101s011001   m_cpbcc
+cpbnle NBW   C_LABEL         M_AM_NONE       %111100101s011010   m_cpbcc
+cpbngle NBW  C_LABEL         M_AM_NONE       %111100101s011000   m_cpbcc
 cpbnz
 cpbnz
-cpbogt NBW   C_LABEL         M_AM_NONE       %111100101s000010   m_cpbr
-cpbule NBW   C_LABEL         M_AM_NONE       %111100101s001101   m_cpbr
-cpboge NBW   C_LABEL         M_AM_NONE       %111100101s000011   m_cpbr
-cpbult NBW   C_LABEL         M_AM_NONE       %111100101s001100   m_cpbr
-cpbolt NBW   C_LABEL         M_AM_NONE       %111100101s000100   m_cpbr
-cpbuge NBW   C_LABEL         M_AM_NONE       %111100101s001011   m_cpbr
-cpbole NBW   C_LABEL         M_AM_NONE       %111100101s000101   m_cpbr
-cpbugt NBW   C_LABEL         M_AM_NONE       %111100101s001010   m_cpbr
-cpbogl NBW   C_LABEL         M_AM_NONE       %111100101s000110   m_cpbr
-cpbueq NBW   C_LABEL         M_AM_NONE       %111100101s001001   m_cpbr
-cpbor NBW    C_LABEL         M_AM_NONE       %111100101s000111   m_cpbr
-cpbun NBW    C_LABEL         M_AM_NONE       %111100101s001000   m_cpbr
-cpbt  NBW    C_LABEL         M_AM_NONE       %111100101s001111   m_cpbr
+cpbogt NBW   C_LABEL         M_AM_NONE       %111100101s000010   m_cpbcc
+cpbule NBW   C_LABEL         M_AM_NONE       %111100101s001101   m_cpbcc
+cpboge NBW   C_LABEL         M_AM_NONE       %111100101s000011   m_cpbcc
+cpbult NBW   C_LABEL         M_AM_NONE       %111100101s001100   m_cpbcc
+cpbolt NBW   C_LABEL         M_AM_NONE       %111100101s000100   m_cpbcc
+cpbuge NBW   C_LABEL         M_AM_NONE       %111100101s001011   m_cpbcc
+cpbole NBW   C_LABEL         M_AM_NONE       %111100101s000101   m_cpbcc
+cpbugt NBW   C_LABEL         M_AM_NONE       %111100101s001010   m_cpbcc
+cpbogl NBW   C_LABEL         M_AM_NONE       %111100101s000110   m_cpbcc
+cpbueq NBW   C_LABEL         M_AM_NONE       %111100101s001001   m_cpbcc
+cpbor NBW    C_LABEL         M_AM_NONE       %111100101s000111   m_cpbcc
+cpbun NBW    C_LABEL         M_AM_NONE       %111100101s001000   m_cpbcc
+cpbt  NBW    C_LABEL         M_AM_NONE       %111100101s001111   m_cpbcc
 cpbra
 cpbra
-cpbf  NBW    C_LABEL         M_AM_NONE       %111100101s000000   m_cpbr
-cpbsf NBW    C_LABEL         M_AM_NONE       %111100101s010000   m_cpbr
-cpbst NBW    C_LABEL         M_AM_NONE       %111100101s011111   m_cpbr
-cpbseq NBW   C_LABEL         M_AM_NONE       %111100101s010001   m_cpbr
-cpbsne NBW   C_LABEL         M_AM_NONE       %111100101s011110   m_cpbr
+cpbf  NBW    C_LABEL         M_AM_NONE       %111100101s000000   m_cpbcc
+cpbsf NBW    C_LABEL         M_AM_NONE       %111100101s010000   m_cpbcc
+cpbst NBW    C_LABEL         M_AM_NONE       %111100101s011111   m_cpbcc
+cpbseq NBW   C_LABEL         M_AM_NONE       %111100101s010001   m_cpbcc
+cpbsne NBW   C_LABEL         M_AM_NONE       %111100101s011110   m_cpbcc
 
 cpdbeq NBW   M_DREG          C_LABEL         %111100101s000001   m_cpdbr
 cpdbze
 
 cpdbeq NBW   M_DREG          C_LABEL         %111100101s000001   m_cpdbr
 cpdbze
@@ -297,42 +297,42 @@ fatanh NBWLSDXP C_ALL030     M_FREG          %1111001000eeeeee   m_fatanh  +
 -      NX       M_FREG        M_FREG          %1111001000eeeeee   m_fatanh +
 -      NX       M_FREG        M_AM_NONE       %1111001000eeeeee   m_fatanh
 
 -      NX       M_FREG        M_FREG          %1111001000eeeeee   m_fatanh +
 -      NX       M_FREG        M_AM_NONE       %1111001000eeeeee   m_fatanh
 
-fbeq  NBW      C_LABEL       M_AM_NONE       %111100101s000001   m_cpbr
+fbeq  NBW      C_LABEL       M_AM_NONE       %111100101s000001   m_fbcc
 fbze
 fbz
 fbze
 fbz
-fbge  NWL      C_LABEL       M_AM_NONE       %111100101s010011   m_cpbr
-fbgt  NWL      C_LABEL       M_AM_NONE       %111100101s010010   m_cpbr
-fbgl  NWL      C_LABEL       M_AM_NONE       %111100101s010110   m_cpbr
-fbgle NWL      C_LABEL       M_AM_NONE       %111100101s010111   m_cpbr
-fble  NWL      C_LABEL       M_AM_NONE       %111100101s010101   m_cpbr
-fblt  NWL      C_LABEL       M_AM_NONE       %111100101s010100   m_cpbr
-fbne  NWL      C_LABEL       M_AM_NONE       %111100101s001110   m_cpbr
-fbngt NWL      C_LABEL       M_AM_NONE       %111100101s011101   m_cpbr
-fbnge NWL      C_LABEL       M_AM_NONE       %111100101s011100   m_cpbr
-fbngl NWL      C_LABEL       M_AM_NONE       %111100101s011001   m_cpbr
-fbnle NWL      C_LABEL       M_AM_NONE       %111100101s011010   m_cpbr
-fbnlt NWL      C_LABEL       M_AM_NONE       %111100101s011011   m_cpbr
-fbngle NWL     C_LABEL       M_AM_NONE       %111100101s011000   m_cpbr
+fbge  NWL      C_LABEL       M_AM_NONE       %111100101s010011   m_fbcc
+fbgt  NWL      C_LABEL       M_AM_NONE       %111100101s010010   m_fbcc
+fbgl  NWL      C_LABEL       M_AM_NONE       %111100101s010110   m_fbcc
+fbgle NWL      C_LABEL       M_AM_NONE       %111100101s010111   m_fbcc
+fble  NWL      C_LABEL       M_AM_NONE       %111100101s010101   m_fbcc
+fblt  NWL      C_LABEL       M_AM_NONE       %111100101s010100   m_fbcc
+fbne  NWL      C_LABEL       M_AM_NONE       %111100101s001110   m_fbcc
+fbngt NWL      C_LABEL       M_AM_NONE       %111100101s011101   m_fbcc
+fbnge NWL      C_LABEL       M_AM_NONE       %111100101s011100   m_fbcc
+fbngl NWL      C_LABEL       M_AM_NONE       %111100101s011001   m_fbcc
+fbnle NWL      C_LABEL       M_AM_NONE       %111100101s011010   m_fbcc
+fbnlt NWL      C_LABEL       M_AM_NONE       %111100101s011011   m_fbcc
+fbngle NWL     C_LABEL       M_AM_NONE       %111100101s011000   m_fbcc
 fbnz
 fbnz
-fbogt NWL      C_LABEL       M_AM_NONE       %111100101s000010   m_cpbr
-fbule NWL      C_LABEL       M_AM_NONE       %111100101s001101   m_cpbr
-fboge NWL      C_LABEL       M_AM_NONE       %111100101s000011   m_cpbr
-fbult NWL      C_LABEL       M_AM_NONE       %111100101s001100   m_cpbr
-fbolt NWL      C_LABEL       M_AM_NONE       %111100101s000100   m_cpbr
-fbuge NWL      C_LABEL       M_AM_NONE       %111100101s001011   m_cpbr
-fbole NWL      C_LABEL       M_AM_NONE       %111100101s000101   m_cpbr
-fbugt NWL      C_LABEL       M_AM_NONE       %111100101s001010   m_cpbr
-fbogl NWL      C_LABEL       M_AM_NONE       %111100101s000110   m_cpbr
-fbueq NWL      C_LABEL       M_AM_NONE       %111100101s001001   m_cpbr
-fbor  NWL      C_LABEL       M_AM_NONE       %111100101s000111   m_cpbr
-fbun  NWL      C_LABEL       M_AM_NONE       %111100101s001000   m_cpbr
-fbt   NWL      C_LABEL       M_AM_NONE       %111100101s001111   m_cpbr
+fbogt NWL      C_LABEL       M_AM_NONE       %111100101s000010   m_fbcc
+fbule NWL      C_LABEL       M_AM_NONE       %111100101s001101   m_fbcc
+fboge NWL      C_LABEL       M_AM_NONE       %111100101s000011   m_fbcc
+fbult NWL      C_LABEL       M_AM_NONE       %111100101s001100   m_fbcc
+fbolt NWL      C_LABEL       M_AM_NONE       %111100101s000100   m_fbcc
+fbuge NWL      C_LABEL       M_AM_NONE       %111100101s001011   m_fbcc
+fbole NWL      C_LABEL       M_AM_NONE       %111100101s000101   m_fbcc
+fbugt NWL      C_LABEL       M_AM_NONE       %111100101s001010   m_fbcc
+fbogl NWL      C_LABEL       M_AM_NONE       %111100101s000110   m_fbcc
+fbueq NWL      C_LABEL       M_AM_NONE       %111100101s001001   m_fbcc
+fbor  NWL      C_LABEL       M_AM_NONE       %111100101s000111   m_fbcc
+fbun  NWL      C_LABEL       M_AM_NONE       %111100101s001000   m_fbcc
+fbt   NWL      C_LABEL       M_AM_NONE       %111100101s001111   m_fbcc
 fbra
 fbra
-fbf   NWL      C_LABEL       M_AM_NONE       %111100101s000000   m_cpbr
-fbsf  NWL      C_LABEL       M_AM_NONE       %111100101s010000   m_cpbr
-fbst  NWL      C_LABEL       M_AM_NONE       %111100101s011111   m_cpbr
-fbseq NWL      C_LABEL       M_AM_NONE       %111100101s010001   m_cpbr
-fbsne NWL      C_LABEL       M_AM_NONE       %111100101s011110   m_cpbr
+fbf   NWL      C_LABEL       M_AM_NONE       %111100101s000000   m_fbcc
+fbsf  NWL      C_LABEL       M_AM_NONE       %111100101s010000   m_fbcc
+fbst  NWL      C_LABEL       M_AM_NONE       %111100101s011111   m_fbcc
+fbseq NWL      C_LABEL       M_AM_NONE       %111100101s010001   m_fbcc
+fbsne NWL      C_LABEL       M_AM_NONE       %111100101s011110   m_fbcc
 
 fcmp  NBWLSDXP C_ALL030      M_FREG          %1111001000eeeeee   m_fcmp   +
 -     NX       M_FREG        M_FREG          %1111001000eeeeee   m_fcmp
 
 fcmp  NBWLSDXP C_ALL030      M_FREG          %1111001000eeeeee   m_fcmp   +
 -     NX       M_FREG        M_FREG          %1111001000eeeeee   m_fcmp
@@ -641,22 +641,22 @@ ori   NBWL   M_IMMED         C_ALTDATA       %00000000sseeeS11   m_ea      +
 
 pack  !      M_AM_NONE       M_AM_NONE       %1000rrr10100mrrr   m_pack
 
 
 pack  !      M_AM_NONE       M_AM_NONE       %1000rrr10100mrrr   m_pack
 
-pbbs  NWL    C_LABEL         M_AM_NONE       %111100001s000000   m_cpbr
-pbbc  NWL    C_LABEL         M_AM_NONE       %111100001s000001   m_cpbr
-pbls  NWL    C_LABEL         M_AM_NONE       %111100001s000010   m_cpbr
-pblc  NWL    C_LABEL         M_AM_NONE       %111100001s000011   m_cpbr
-pbss  NWL    C_LABEL         M_AM_NONE       %111100001s000100   m_cpbr
-pbsc  NWL    C_LABEL         M_AM_NONE       %111100001s000101   m_cpbr
-pbas  NWL    C_LABEL         M_AM_NONE       %111100001s000110   m_cpbr
-pbac  NWL    C_LABEL         M_AM_NONE       %111100001s000111   m_cpbr
-pbws  NWL    C_LABEL         M_AM_NONE       %111100001s001000   m_cpbr
-pbwc  NWL    C_LABEL         M_AM_NONE       %111100001s001001   m_cpbr
-pbis  NWL    C_LABEL         M_AM_NONE       %111100001s001010   m_cpbr
-pbic  NWL    C_LABEL         M_AM_NONE       %111100001s001011   m_cpbr
-pbgs  NWL    C_LABEL         M_AM_NONE       %111100001s001100   m_cpbr
-pbgc  NWL    C_LABEL         M_AM_NONE       %111100001s001101   m_cpbr
-pbcs  NWL    C_LABEL         M_AM_NONE       %111100001s001110   m_cpbr
-pbcc  NWL    C_LABEL         M_AM_NONE       %111100001s001111   m_cpbr
+pbbs  NWL    C_LABEL         M_AM_NONE       %111100001s000000   m_pbcc
+pbbc  NWL    C_LABEL         M_AM_NONE       %111100001s000001   m_pbcc
+pbls  NWL    C_LABEL         M_AM_NONE       %111100001s000010   m_pbcc
+pblc  NWL    C_LABEL         M_AM_NONE       %111100001s000011   m_pbcc
+pbss  NWL    C_LABEL         M_AM_NONE       %111100001s000100   m_pbcc
+pbsc  NWL    C_LABEL         M_AM_NONE       %111100001s000101   m_pbcc
+pbas  NWL    C_LABEL         M_AM_NONE       %111100001s000110   m_pbcc
+pbac  NWL    C_LABEL         M_AM_NONE       %111100001s000111   m_pbcc
+pbws  NWL    C_LABEL         M_AM_NONE       %111100001s001000   m_pbcc
+pbwc  NWL    C_LABEL         M_AM_NONE       %111100001s001001   m_pbcc
+pbis  NWL    C_LABEL         M_AM_NONE       %111100001s001010   m_pbcc
+pbic  NWL    C_LABEL         M_AM_NONE       %111100001s001011   m_pbcc
+pbgs  NWL    C_LABEL         M_AM_NONE       %111100001s001100   m_pbcc
+pbgc  NWL    C_LABEL         M_AM_NONE       %111100001s001101   m_pbcc
+pbcs  NWL    C_LABEL         M_AM_NONE       %111100001s001110   m_pbcc
+pbcc  NWL    C_LABEL         M_AM_NONE       %111100001s001111   m_pbcc
 
 pdbbs NWL    M_DREG          C_LABEL         %1111000001001ccc   m_cpdbr
 pdbls NWL    M_DREG          C_LABEL         %1111000001001ccc   m_cpdbr
 
 pdbbs NWL    M_DREG          C_LABEL         %1111000001001ccc   m_cpdbr
 pdbls NWL    M_DREG          C_LABEL         %1111000001001ccc   m_cpdbr
diff --git a/expr.c b/expr.c
index 74b68c9c3ffe0bb9bfc7368bb48ef0ecd3a8fc25..4318aa7d6b98f871e9a93ea5e72d2bfebf7c7d52 100644 (file)
--- a/expr.c
+++ b/expr.c
@@ -523,7 +523,7 @@ thrown away right here. What the hell is it for?
 //
 int evexpr(TOKEN * _tk, uint64_t * a_value, WORD * a_attr, SYM ** a_esym)
 {
 //
 int evexpr(TOKEN * _tk, uint64_t * a_value, WORD * a_attr, SYM ** a_esym)
 {
-       WORD attr, attr2;
+       WORD attr;
        SYM * sy;
        uint64_t * sval = evstk;                                // (Empty) initial stack
        WORD * sattr = evattr;
        SYM * sy;
        uint64_t * sval = evstk;                                // (Empty) initial stack
        WORD * sattr = evattr;
diff --git a/mach.c b/mach.c
index 08a9bab8f14e78e62ceb76c4813783a108582a88..9e124a9d79eb9f9af58ae70f0e3ca12bcbe04097 100644 (file)
--- a/mach.c
+++ b/mach.c
@@ -60,7 +60,7 @@ int m_cas2(WORD inst, WORD siz);
 int m_chk2(WORD inst, WORD siz);
 int m_cmp2(WORD inst, WORD siz);
 int m_bkpt(WORD inst, WORD siz);
 int m_chk2(WORD inst, WORD siz);
 int m_cmp2(WORD inst, WORD siz);
 int m_bkpt(WORD inst, WORD siz);
-int m_cpbr(WORD inst, WORD siz);
+int m_cpbcc(WORD inst, WORD siz);
 int m_cpdbr(WORD inst, WORD siz);
 int m_muls(WORD inst, WORD siz);
 int m_move16a(WORD inst, WORD siz);
 int m_cpdbr(WORD inst, WORD siz);
 int m_muls(WORD inst, WORD siz);
 int m_move16a(WORD inst, WORD siz);
@@ -92,6 +92,7 @@ int m_ploadw(WORD inst, WORD siz);
 
 // FPU
 int m_fabs(WORD inst, WORD siz);
 
 // FPU
 int m_fabs(WORD inst, WORD siz);
+int m_fbcc(WORD inst, WORD siz);
 int m_facos(WORD inst, WORD siz);
 int m_fadd(WORD inst, WORD siz);
 int m_fasin(WORD inst, WORD siz);
 int m_facos(WORD inst, WORD siz);
 int m_fadd(WORD inst, WORD siz);
 int m_fasin(WORD inst, WORD siz);
@@ -1542,13 +1543,10 @@ int m_chk2(WORD inst, WORD siz)
 
 
 //
 
 
 //
-// cpbcc(68020, 68030, 68040 (FBcc), 68060 (FBcc))
-// TODO: Better checks for different instructions?
+// cpbcc(68020, 68030, 68040 (FBcc), 68060 (FBcc)), pbcc (68851)
 //
 //
-int m_cpbr(WORD inst, WORD siz)
+int m_fpbr(WORD inst, WORD siz)
 {
 {
-       if ((activecpu & (CPU_68020 | CPU_68030)) && (!activefpu == 0))
-               return error(unsupport);
 
        if (a0exattr & DEFINED)
        {
 
        if (a0exattr & DEFINED)
        {
@@ -1602,6 +1600,38 @@ int m_cpbr(WORD inst, WORD siz)
 }
 
 
 }
 
 
+//
+// cpbcc(68020, 68030, 68040 (FBcc), 68060 (FBcc))
+//
+int m_cpbcc(WORD inst, WORD siz)
+{
+       if (!(activecpu & (CPU_68020 | CPU_68030)))
+               return error(unsupport);
+
+       return m_fpbr(inst, siz);
+}
+
+
+//
+// fbcc(6808X, 68040, 68060)
+//
+int m_fbcc(WORD inst, WORD siz)
+{
+       CHECKNOFPU;
+       return m_fpbr(inst, siz);
+}
+
+
+//
+// pbcc(68851 but let's assume 68020 only)
+//
+int m_pbcc(WORD inst, WORD siz)
+{
+       CHECKNO20;
+       return m_fpbr(inst, siz);
+}
+
+
 //
 // cpdbcc(68020, 68030)
 //
 //
 // cpdbcc(68020, 68030)
 //
@@ -2109,16 +2139,6 @@ int m_moves(WORD inst, WORD siz)
 }
 
 
 }
 
 
-//
-// PBcc (MC68851)
-//
-int m_pbcc(WORD inst, WORD siz)
-{
-       CHECKNO20;
-       return error("Not implemented yet.");
-}
-
-
 //
 // pflusha (68030, 68040)
 //
 //
 // pflusha (68030, 68040)
 //
@@ -2948,14 +2968,12 @@ int m_flogn(WORD inst, WORD siz)
 
 
 //
 
 
 //
-// flognp1 (68040FPSP, 68060FPSP)
+// flognp1 (6888X, 68040FPSP, 68060FPSP)
 //
 int m_flognp1(WORD inst, WORD siz)
 {
 //
 int m_flognp1(WORD inst, WORD siz)
 {
-       if (activefpu & (FPU_68040 | FPU_68060))
-               return gen_fpu(inst, siz, B8(00000110), FPU_FPSP);
-
-       return error("Unsupported in current FPU");
+       CHECKNOFPU;
+       return gen_fpu(inst, siz, B8(00000110), FPU_FPSP);
 }
 
 
 }