add configure, revive pnd build, unify/refactor things
[picodrive.git] / pico / carthw / svp / compiler.c
index b47484f..758d926 100644 (file)
@@ -1,7 +1,10 @@
-// SSP1601 to ARM recompiler
-
-// (c) Copyright 2008, Grazvydas "notaz" Ignotas
-// Free for non-commercial use.
+/*
+ * SSP1601 to ARM recompiler
+ * (C) notaz, 2008,2009,2010
+ *
+ * This work is licensed under the terms of MAME license.
+ * See COPYING file in the top-level directory.
+ */
 
 #include "../../pico_int.h"
 #include "../../../cpu/drc/cmn.h"
@@ -28,13 +31,14 @@ extern ssp1601_t *ssp;
 #define SSP_FLAG_Z (1<<0xd)
 #define SSP_FLAG_N (1<<0xf)
 
-#ifndef ARM
+#ifndef __arm__
 //#define DUMP_BLOCK 0x0c9a
 void ssp_drc_next(void){}
 void ssp_drc_next_patch(void){}
 void ssp_drc_end(void){}
 #endif
 
+#define COUNT_OP
 #include "../../../cpu/drc/emit_arm.c"
 
 // -----------------------------------------------------
@@ -355,7 +359,7 @@ static void tr_mov16(int r, int val)
 
 static void tr_mov16_cond(int cond, int r, int val)
 {
-       emith_op_imm(cond, A_OP_MOV, r, val);
+       emith_op_imm(cond, 0, A_OP_MOV, r, val);
        hostreg_r[r] = -1;
 }
 
@@ -1196,7 +1200,10 @@ static int tr_detect_set_pm(unsigned int op, int *pc, int imm)
                int reg = is_write ? ((tmpv>>4)&0x7) : (tmpv&0x7);
                if (reg > 4) tr_unhandled();
                if ((tmpv & 0x0f) != 0 && (tmpv & 0xf0) != 0) tr_unhandled();
-               known_regs.pmac_read[is_write ? reg + 5 : reg] = pmcv;
+               if (is_write)
+                       known_regs.pmac_write[reg] = pmcv;
+               else
+                       known_regs.pmac_read[reg] = pmcv;
                known_regb |= is_write ? (1 << (reg+25)) : (1 << (reg+20));
                dirty_regb |= is_write ? (1 << (reg+25)) : (1 << (reg+20));
                known_regs.emu_status &= ~SSP_PMC_SET;
@@ -1787,7 +1794,9 @@ void *ssp_translate_block(int pc)
        exit(0);
 #endif
 
-       handle_caches();
+#ifdef __arm__
+       cache_flush_d_inval_i(tcache, tcache_ptr);
+#endif
 
        return block_start;
 }
@@ -1830,7 +1839,7 @@ int ssp1601_dyn_startup(void)
        PicoLoadStateHook = ssp1601_state_load;
 
        n_in_ops = 0;
-#ifdef ARM
+#ifdef __arm__
        // hle'd blocks
        ssp_block_table[0x800/2] = (void *) ssp_hle_800;
        ssp_block_table[0x902/2] = (void *) ssp_hle_902;
@@ -1870,7 +1879,7 @@ void ssp1601_dyn_run(int cycles)
 #ifdef DUMP_BLOCK
        ssp_translate_block(DUMP_BLOCK >> 1);
 #endif
-#ifdef ARM
+#ifdef __arm__
        ssp_drc_entry(cycles);
 #endif
 }