bugfixes related to mmap usage for ROM
[picodrive.git] / pico / pico_int.h
index 0617397..3ee4ea1 100644 (file)
@@ -229,12 +229,6 @@ extern int z80_scanline_cycles;  /* cycles done until z80_scanline */
 \r
 #define cycles_68k_to_z80(x) ((x)*957 >> 11)\r
 \r
-#define Z80_MEM_SHIFT 13\r
-extern unsigned long z80_read_map [0x10000 >> Z80_MEM_SHIFT];\r
-extern unsigned long z80_write_map[0x10000 >> Z80_MEM_SHIFT];\r
-typedef unsigned char (z80_read_f)(unsigned short a);\r
-typedef void (z80_write_f)(unsigned int a, unsigned char data);\r
-\r
 // ----------------------- SH2 CPU -----------------------\r
 \r
 #include "cpu/sh2/sh2.h"\r
@@ -243,14 +237,23 @@ extern SH2 sh2s[2];
 #define msh2 sh2s[0]\r
 #define ssh2 sh2s[1]\r
 \r
-#define ash2_end_run(after) if (sh2->icount > (after)) sh2->icount = after\r
-#define ash2_cycles_done() (sh2->cycles_aim - sh2->icount)\r
+#ifndef DRC_SH2\r
+# define ash2_end_run(after) if (sh2->icount > (after)) sh2->icount = after\r
+# define ash2_cycles_done() (sh2->cycles_aim - sh2->icount)\r
+#else\r
+# define ash2_end_run(after) { \\r
+   if ((sh2->sr >> 12) > (after)) \\r
+     { sh2->sr &= 0xfff; sh2->sr |= (after) << 12; } \\r
+}\r
+# define ash2_cycles_done() (sh2->cycles_aim - (sh2->sr >> 12))\r
+#endif\r
 \r
-#define sh2_pc(c)     (c) ? ssh2.ppc : msh2.ppc\r
+//#define sh2_pc(c)     (c) ? ssh2.ppc : msh2.ppc\r
+#define sh2_pc(c)     (c) ? ssh2.pc : msh2.pc\r
 #define sh2_reg(c, x) (c) ? ssh2.r[x] : msh2.r[x]\r
 #define sh2_gbr(c)    (c) ? ssh2.gbr : msh2.gbr\r
 #define sh2_vbr(c)    (c) ? ssh2.vbr : msh2.vbr\r
-#define sh2_sr(c)     (c) ? ssh2.sr : msh2.sr\r
+#define sh2_sr(c)   (((c) ? ssh2.sr : msh2.sr) & 0xfff)\r
 \r
 #define sh2_set_gbr(c, v) \\r
   { if (c) ssh2.gbr = v; else msh2.gbr = v; }\r
@@ -434,6 +437,8 @@ typedef struct
 #define P32XV_PRI   (1<< 7)\r
 #define P32XV_Mx    (3<< 0) // display mode mask\r
 \r
+#define P32XV_SFT   (1<< 0)\r
+\r
 #define P32XV_VBLK  (1<<15)\r
 #define P32XV_HBLK  (1<<14)\r
 #define P32XV_PEN   (1<<13)\r
@@ -463,11 +468,16 @@ typedef struct
 #define DMAC_FIFO_LEN (4*4)\r
 #define PWM_BUFF_LEN 1024 // in one channel samples\r
 \r
+#define SH2_DRCBLK_RAM_SHIFT 1\r
+#define SH2_DRCBLK_DA_SHIFT  1\r
+\r
+#define SH2_WRITE_SHIFT 25\r
+\r
 struct Pico32x\r
 {\r
   unsigned short regs[0x20];\r
-  unsigned short vdp_regs[0x10];\r
-  unsigned short sh2_regs[3];\r
+  unsigned short vdp_regs[0x10]; // 0x40\r
+  unsigned short sh2_regs[3];    // 0x60\r
   unsigned char pending_fb;\r
   unsigned char dirty_pal;\r
   unsigned int emu_flags;\r
@@ -482,9 +492,15 @@ struct Pico32x
 struct Pico32xMem\r
 {\r
   unsigned char  sdram[0x40000];\r
+#ifdef DRC_SH2\r
+  unsigned short drcblk_ram[1 << (18 - SH2_DRCBLK_RAM_SHIFT)];\r
+#endif\r
   unsigned short dram[2][0x20000/2];    // AKA fb\r
   unsigned char  m68k_rom[0x10000];     // 0x100; using M68K_BANK_SIZE\r
   unsigned char  data_array[2][0x1000]; // cache in SH2s (can be used as RAM)\r
+#ifdef DRC_SH2\r
+  unsigned short drcblk_da[2][1 << (12 - SH2_DRCBLK_DA_SHIFT)];\r
+#endif\r
   unsigned char  sh2_rom_m[0x800];\r
   unsigned char  sh2_rom_s[0x400];\r
   unsigned short pal[0x100];\r
@@ -533,10 +549,12 @@ int CM_compareRun(int cyc, int is_sub);
 PICO_INTERNAL void PicoFrameStart(void);\r
 void PicoDrawSync(int to, int blank_last_line);\r
 void BackFill(int reg7, int sh);\r
-void FinalizeLineRGB555(int sh, int line);\r
+void FinalizeLine555(int sh, int line);\r
 extern int DrawScanline;\r
 #define MAX_LINE_SPRITES 29\r
 extern unsigned char HighLnSpr[240][3 + MAX_LINE_SPRITES];\r
+extern void *DrawLineDestBase;\r
+extern int DrawLineDestIncrement;\r
 \r
 // draw2.c\r
 PICO_INTERNAL void PicoFrameFull();\r
@@ -545,7 +563,7 @@ PICO_INTERNAL void PicoFrameFull();
 void PicoFrameStartMode4(void);\r
 void PicoLineMode4(int line);\r
 void PicoDoHighPal555M4(void);\r
-void PicoDrawSetColorFormatMode4(int which);\r
+void PicoDrawSetOutputMode4(pdso_t which);\r
 \r
 // memory.c\r
 PICO_INTERNAL void PicoMemSetup(void);\r
@@ -688,7 +706,7 @@ void PicoReset32x(void);
 void Pico32xStartup(void);\r
 void PicoUnload32x(void);\r
 void PicoFrame32x(void);\r
-void p32x_update_irls(void);\r
+void p32x_update_irls(int nested_call);\r
 void p32x_reset_sh2s(void);\r
 \r
 // 32x/memory.c\r
@@ -703,12 +721,20 @@ void p32x_poll_event(int cpu_mask, int is_vdp);
 \r
 // 32x/draw.c\r
 void FinalizeLine32xRGB555(int sh, int line);\r
+void PicoDraw32xLayer(int offs, int lines, int mdbg);\r
+void PicoDraw32xLayerMdOnly(int offs, int lines);\r
+enum {\r
+  PDM32X_OFF,\r
+  PDM32X_32X_ONLY,\r
+  PDM32X_BOTH,\r
+};\r
+extern int Pico32xDrawMode;\r
 \r
 // 32x/pwm.c\r
 unsigned int p32x_pwm_read16(unsigned int a);\r
 void p32x_pwm_write16(unsigned int a, unsigned int d);\r
 void p32x_pwm_update(int *buf32, int length, int stereo);\r
-void p32x_timers_do(int new_line);\r
+void p32x_timers_do(int line_call);\r
 void p32x_timers_recalc(void);\r
 extern int pwm_frame_smp_cnt;\r
 \r
@@ -718,6 +744,10 @@ static __inline int isspace_(int c)
        return (0x09 <= c && c <= 0x0d) || c == ' ';\r
 }\r
 \r
+#ifndef ARRAY_SIZE\r
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))\r
+#endif\r
+\r
 // emulation event logging\r
 #ifndef EL_LOGMASK\r
 #define EL_LOGMASK 0\r
@@ -761,16 +791,28 @@ extern void lprintf(const char *fmt, ...);
 #define elprintf(w,f,...)\r
 #endif\r
 \r
+// profiling\r
+#ifdef PPROF\r
+#include <platform/linux/pprof.h>\r
+#else\r
+#define pprof_init()\r
+#define pprof_finish()\r
+#define pprof_start(x)\r
+#define pprof_end(...)\r
+#define pprof_end_sub(...)\r
+#endif\r
+\r
+// misc\r
 #ifdef _MSC_VER\r
 #define cdprintf\r
 #else\r
 #define cdprintf(x...)\r
 #endif\r
 \r
-#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 3\r
-#define MEMH_FUNC __attribute__((aligned(4)))\r
+#ifdef __i386__\r
+#define REGPARM(x) __attribute__((regparm(x)))\r
 #else\r
-#define MEMH_FUNC\r
+#define REGPARM(x)\r
 #endif\r
 \r
 #ifdef __GNUC__\r