fix DrawSpritesHiAS
[picodrive.git] / cpu / musashi / m68kdasm.c
index f697a09..3630fc0 100644 (file)
@@ -3,10 +3,10 @@
 /* ======================================================================== */\r
 /*\r
  *                                  MUSASHI\r
- *                                Version 3.3\r
+ *                                Version 3.31\r
  *\r
  * A portable Motorola M680x0 processor emulation engine.\r
- * Copyright 1998-2001 Karl Stenerud.  All rights reserved.\r
+ * Copyright 1998-2007 Karl Stenerud.  All rights reserved.\r
  *\r
  * This code may be freely used for non-commercial purposes as long as this\r
  * copyright notice remains unaltered in the source code and any binary files\r
@@ -204,9 +204,8 @@ static uint g_cpu_pc;        /* program counter */
 static uint g_cpu_ir;        /* instruction register */\r
 static uint g_cpu_type;\r
 static uint g_opcode_type;\r
-static unsigned char* g_rawop;\r
+static const unsigned char* g_rawop;\r
 static uint g_rawbasepc;\r
-static uint g_rawlength;\r
 \r
 /* used by ops like asr, ror, addq, etc */\r
 static uint g_3bit_qdata_table[8] = {8, 1, 2, 3, 4, 5, 6, 7};\r
@@ -252,7 +251,7 @@ static uint dasm_read_imm_8(uint advance)
        if (g_rawop)\r
                result = g_rawop[g_cpu_pc + 1 - g_rawbasepc];\r
        else\r
-               result = m68k_read_disassembler_16(g_cpu_pc & g_address_mask) & 0xff;\r
+               result = m68k_read_disassembler_16(g_cpu_pc & g_address_mask) & 0xffff; // 0xff ???\r
        g_cpu_pc += advance;\r
        return result;\r
 }\r
@@ -264,7 +263,7 @@ static uint dasm_read_imm_16(uint advance)
                result = (g_rawop[g_cpu_pc + 0 - g_rawbasepc] << 8) |\r
                          g_rawop[g_cpu_pc + 1 - g_rawbasepc];\r
        else\r
-               result = m68k_read_disassembler_16(g_cpu_pc & g_address_mask) & 0xffff; // & 0xff; ??\r
+               result = m68k_read_disassembler_16(g_cpu_pc & g_address_mask) & 0xffff; // 0xff ???\r
        g_cpu_pc += advance;\r
        return result;\r
 }\r
@@ -278,7 +277,7 @@ static uint dasm_read_imm_32(uint advance)
                         (g_rawop[g_cpu_pc + 2 - g_rawbasepc] << 8) |\r
                          g_rawop[g_cpu_pc + 3 - g_rawbasepc];\r
        else\r
-               result = m68k_read_disassembler_32(g_cpu_pc & g_address_mask); // & 0xff; ??\r
+               result = m68k_read_disassembler_32(g_cpu_pc & g_address_mask) & 0xffff; // 0xff ???\r
        g_cpu_pc += advance;\r
        return result;\r
 }\r
@@ -1688,6 +1687,124 @@ static void d68020_extb_32(void)
        sprintf(g_dasm_str, "extb.l  D%d; (2+)", g_cpu_ir&7);\r
 }\r
 \r
+static void d68040_fpu(void)\r
+{\r
+       char float_data_format[8][3] =\r
+       {\r
+               ".l", ".s", ".x", ".p", ".w", ".d", ".b", ".?"\r
+       };\r
+\r
+       char mnemonic[40];\r
+       uint w2, src, dst_reg;\r
+       LIMIT_CPU_TYPES(M68040_PLUS);\r
+       w2 = read_imm_16();\r
+\r
+       src = (w2 >> 10) & 0x7;\r
+       dst_reg = (w2 >> 7) & 0x7;\r
+\r
+       switch ((w2 >> 13) & 0x7)\r
+       {\r
+               case 0x0:\r
+               case 0x2:\r
+               {\r
+                       switch(w2 & 0x7f)\r
+                       {\r
+                               case 0x00:      sprintf(mnemonic, "fmove"); break;\r
+                               case 0x01:      sprintf(mnemonic, "fint"); break;\r
+                               case 0x02:      sprintf(mnemonic, "fsinh"); break;\r
+                               case 0x03:      sprintf(mnemonic, "fintrz"); break;\r
+                               case 0x04:      sprintf(mnemonic, "fsqrt"); break;\r
+                               case 0x06:      sprintf(mnemonic, "flognp1"); break;\r
+                               case 0x08:      sprintf(mnemonic, "fetoxm1"); break;\r
+                               case 0x09:      sprintf(mnemonic, "ftanh1"); break;\r
+                               case 0x0a:      sprintf(mnemonic, "fatan"); break;\r
+                               case 0x0c:      sprintf(mnemonic, "fasin"); break;\r
+                               case 0x0d:      sprintf(mnemonic, "fatanh"); break;\r
+                               case 0x0e:      sprintf(mnemonic, "fsin"); break;\r
+                               case 0x0f:      sprintf(mnemonic, "ftan"); break;\r
+                               case 0x10:      sprintf(mnemonic, "fetox"); break;\r
+                               case 0x11:      sprintf(mnemonic, "ftwotox"); break;\r
+                               case 0x12:      sprintf(mnemonic, "ftentox"); break;\r
+                               case 0x14:      sprintf(mnemonic, "flogn"); break;\r
+                               case 0x15:      sprintf(mnemonic, "flog10"); break;\r
+                               case 0x16:      sprintf(mnemonic, "flog2"); break;\r
+                               case 0x18:      sprintf(mnemonic, "fabs"); break;\r
+                               case 0x19:      sprintf(mnemonic, "fcosh"); break;\r
+                               case 0x1a:      sprintf(mnemonic, "fneg"); break;\r
+                               case 0x1c:      sprintf(mnemonic, "facos"); break;\r
+                               case 0x1d:      sprintf(mnemonic, "fcos"); break;\r
+                               case 0x1e:      sprintf(mnemonic, "fgetexp"); break;\r
+                               case 0x1f:      sprintf(mnemonic, "fgetman"); break;\r
+                               case 0x20:      sprintf(mnemonic, "fdiv"); break;\r
+                               case 0x21:      sprintf(mnemonic, "fmod"); break;\r
+                               case 0x22:      sprintf(mnemonic, "fadd"); break;\r
+                               case 0x23:      sprintf(mnemonic, "fmul"); break;\r
+                               case 0x24:      sprintf(mnemonic, "fsgldiv"); break;\r
+                               case 0x25:      sprintf(mnemonic, "frem"); break;\r
+                               case 0x26:      sprintf(mnemonic, "fscale"); break;\r
+                               case 0x27:      sprintf(mnemonic, "fsglmul"); break;\r
+                               case 0x28:      sprintf(mnemonic, "fsub"); break;\r
+                               case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:\r
+                                                       sprintf(mnemonic, "fsincos"); break;\r
+                               case 0x38:      sprintf(mnemonic, "fcmp"); break;\r
+                               case 0x3a:      sprintf(mnemonic, "ftst"); break;\r
+                               case 0x41:      sprintf(mnemonic, "fssqrt"); break;\r
+                               case 0x45:      sprintf(mnemonic, "fdsqrt"); break;\r
+                               case 0x58:      sprintf(mnemonic, "fsabs"); break;\r
+                               case 0x5a:      sprintf(mnemonic, "fsneg"); break;\r
+                               case 0x5c:      sprintf(mnemonic, "fdabs"); break;\r
+                               case 0x5e:      sprintf(mnemonic, "fdneg"); break;\r
+                               case 0x60:      sprintf(mnemonic, "fsdiv"); break;\r
+                               case 0x62:      sprintf(mnemonic, "fsadd"); break;\r
+                               case 0x63:      sprintf(mnemonic, "fsmul"); break;\r
+                               case 0x64:      sprintf(mnemonic, "fddiv"); break;\r
+                               case 0x66:      sprintf(mnemonic, "fdadd"); break;\r
+                               case 0x67:      sprintf(mnemonic, "fdmul"); break;\r
+                               case 0x68:      sprintf(mnemonic, "fssub"); break;\r
+                               case 0x6c:      sprintf(mnemonic, "fdsub"); break;\r
+\r
+                               default:        sprintf(mnemonic, "FPU (?)"); break;\r
+                       }\r
+\r
+                       if (w2 & 0x4000)\r
+                       {\r
+                               sprintf(g_dasm_str, "%s%s   %s, FP%d", mnemonic, float_data_format[src], get_ea_mode_str_32(g_cpu_ir), dst_reg);\r
+                       }\r
+                       else\r
+                       {\r
+                               sprintf(g_dasm_str, "%s.x   FP%d, FP%d", mnemonic, src, dst_reg);\r
+                       }\r
+                       break;\r
+               }\r
+\r
+               case 0x3:\r
+               {\r
+                       sprintf(g_dasm_str, "fmove /todo");\r
+                       break;\r
+               }\r
+\r
+               case 0x4:\r
+               case 0x5:\r
+               {\r
+                       sprintf(g_dasm_str, "fmove /todo");\r
+                       break;\r
+               }\r
+\r
+               case 0x6:\r
+               case 0x7:\r
+               {\r
+                       sprintf(g_dasm_str, "fmovem /todo");\r
+                       break;\r
+               }\r
+\r
+               default:\r
+               {\r
+                       sprintf(g_dasm_str, "FPU (?) ");\r
+                       break;\r
+               }\r
+       }\r
+}\r
+\r
 static void d68000_jmp(void)\r
 {\r
        sprintf(g_dasm_str, "jmp     %s", get_ea_mode_str_32(g_cpu_ir));\r
@@ -1923,7 +2040,7 @@ static void d68010_movec(void)
                        processor = "?";\r
        }\r
 \r
-       if(BIT_1(g_cpu_ir))\r
+       if(BIT_0(g_cpu_ir))\r
                sprintf(g_dasm_str, "movec %c%d, %s; (%s)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, reg_name, processor);\r
        else\r
                sprintf(g_dasm_str, "movec %s, %c%d; (%s)", reg_name, BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, processor);\r
@@ -3073,6 +3190,7 @@ static opcode_struct g_opcode_info[] =
        {d68020_extb_32      , 0xfff8, 0x49c0, 0x000},\r
        {d68000_ext_16       , 0xfff8, 0x4880, 0x000},\r
        {d68000_ext_32       , 0xfff8, 0x48c0, 0x000},\r
+       {d68040_fpu          , 0xffc0, 0xf200, 0x000},\r
        {d68000_illegal      , 0xffff, 0x4afc, 0x000},\r
        {d68000_jmp          , 0xffc0, 0x4ec0, 0x27b},\r
        {d68000_jsr          , 0xffc0, 0x4e80, 0x27b},\r
@@ -3405,13 +3523,12 @@ char* m68ki_disassemble_quick(unsigned int pc, unsigned int cpu_type)
        return buff;\r
 }\r
 \r
-unsigned int m68k_disassemble_raw(char* str_buff, unsigned int pc, unsigned char* opdata, unsigned char* argdata, int length, unsigned int cpu_type)\r
+unsigned int m68k_disassemble_raw(char* str_buff, unsigned int pc, const unsigned char* opdata, const unsigned char* argdata, unsigned int cpu_type)\r
 {\r
        unsigned int result;\r
 \r
        g_rawop = opdata;\r
        g_rawbasepc = pc;\r
-       g_rawlength = length;\r
        result = m68k_disassemble(str_buff, pc, cpu_type);\r
        g_rawop = NULL;\r
        return result;\r
@@ -3588,6 +3705,27 @@ unsigned int m68k_is_valid_instruction(unsigned int instruction, unsigned int cp
                                return 0;\r
                        if(g_instruction_table[instruction] == d68040_pflush)\r
                                return 0;\r
+               case M68K_CPU_TYPE_68040:\r
+                       if(g_instruction_table[instruction] == d68020_cpbcc_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cpbcc_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cpdbcc)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cpgen)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cprestore)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cpsave)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cpscc)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cptrapcc_0)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cptrapcc_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cptrapcc_32)\r
+                               return 0;\r
        }\r
        if(cpu_type != M68K_CPU_TYPE_68020 && cpu_type != M68K_CPU_TYPE_68EC020 &&\r
          (g_instruction_table[instruction] == d68020_callm ||\r