drZ80 separation finished, related bugs fixed
authornotaz <notasas@gmail.com>
Sat, 15 Aug 2009 18:54:59 +0000 (18:54 +0000)
committernotaz <notasas@gmail.com>
Sat, 15 Aug 2009 18:54:59 +0000 (18:54 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@755 be3aeb3a-fb24-0410-a615-afba39da0efa

cpu/DrZ80/drz80.s
pico/cd/memory.c
pico/memory.c
pico/pico_int.h
pico/z80if.c

index 5445ffd..a623451 100644 (file)
       .equiv INTERRUPT_MODE,         0 ;@0 = Use internal int handler, 1 = Use Mames int handler\r
       .equiv FAST_Z80SP,             1 ;@0 = Use mem functions for stack pointer, 1 = Use direct mem pointer\r
       .equiv UPDATE_CONTEXT,         0\r
-      .equiv DRZ80_FOR_PICODRIVE,    1\r
       .equiv DRZ80_XMAP,             1\r
       .equiv DRZ80_XMAP_MORE_INLINE, 1\r
 \r
 .if DRZ80_XMAP\r
       .equ Z80_MEM_SHIFT, 13\r
+      ;@ note: stack is locked in single bank that z80sp_base points to\r
 .endif\r
 \r
 .if INTERRUPT_MODE\r
@@ -160,14 +160,14 @@ z80_xmap_read16: @ addr
 \r
 0:\r
     @ z80_xmap_read8 will save r3 and r12 for us\r
-    stmfd sp!,{r4,r5,lr}\r
-    mov r4,r0\r
+    stmfd sp!,{r8,r9,lr}\r
+    mov r8,r0\r
     bl z80_xmap_read8\r
-    mov r5,r0\r
-    add r0,r4,#1\r
+    mov r9,r0\r
+    add r0,r8,#1\r
     bl z80_xmap_read8\r
-    orr r0,r5,r0,lsl #8\r
-    ldmfd sp!,{r4,r5,pc}\r
+    orr r0,r9,r0,lsl #8\r
+    ldmfd sp!,{r8,r9,pc}\r
 \r
 z80_xmap_write16: @ data, addr\r
     add r2,r1,#1\r
@@ -187,14 +187,30 @@ z80_xmap_write16: @ data, addr
     bx lr\r
 \r
 0:\r
-    stmfd sp!,{r4,r5,lr}\r
-    mov r4,r0\r
-    mov r5,r1\r
+    stmfd sp!,{r8,r9,lr}\r
+    mov r8,r0\r
+    mov r9,r1\r
     bl z80_xmap_write8\r
-    mov r0,r4,lsr #8\r
-    add r1,r5,#1\r
+    mov r0,r8,lsr #8\r
+    add r1,r9,#1\r
     bl z80_xmap_write8\r
-    ldmfd sp!,{r4,r5,pc}\r
+    ldmfd sp!,{r8,r9,pc}\r
+\r
+z80_xmap_rebase_pc:\r
+    ldr r1,[cpucontext,#z80_read8]\r
+    mov r2,r0,lsr #Z80_MEM_SHIFT\r
+    ldr r1,[r1,r2,lsl #2]\r
+    movs r1,r1,lsl #1\r
+    strcc r1,[cpucontext,#z80pc_base]\r
+    addcc z80pc,r1,r0\r
+    bxcc lr\r
+\r
+z80_bad_jump:\r
+    ldr r0,[cpucontext,#z80_read8]\r
+    ldr r0,[r0]\r
+    str r0,[cpucontext,#z80pc_base]\r
+    mov z80pc,r0\r
+    bx lr\r
 .endif\r
 \r
 \r
@@ -335,10 +351,8 @@ z80_xmap_write16: @ data, addr
 .if UPDATE_CONTEXT\r
      str z80pc,[cpucontext,#z80pc_pointer]\r
 .endif\r
-.if DRZ80_FOR_PICODRIVE\r
-    ldr r1,[cpucontext,#z80pc_base]\r
-    bic r0,r0,#0xfe000\r
-    add z80pc,r1,r0\r
+.if DRZ80_XMAP\r
+    bl z80_xmap_rebase_pc\r
 .else\r
     stmfd sp!,{r3,r12}\r
        mov lr,pc\r
@@ -352,9 +366,10 @@ z80_xmap_write16: @ data, addr
 .if UPDATE_CONTEXT\r
      str z80pc,[cpucontext,#z80pc_pointer]\r
 .endif\r
-.if DRZ80_FOR_PICODRIVE\r
-    bic r0,r0,#0xfe000\r
+.if DRZ80_XMAP\r
+    ;@ XXX: SP is locked to single back z80sp_base points to.\r
     ldr r1,[cpucontext,#z80sp_base]\r
+    bic r0,r0,#0x7f<<Z80_MEM_SHIFT\r
     add r0,r1,r0\r
 .else\r
        stmfd sp!,{r3,r12}\r
@@ -722,22 +737,9 @@ z80_xmap_write16: @ data, addr
 \r
 .macro opPOP\r
 .if FAST_Z80SP\r
-.if DRZ80_FOR_PICODRIVE\r
-    @ notaz: try to protect against stack overflows, which tend to happen in Picodrive because of poor timing\r
-    ldr r2,[cpucontext,#z80sp_base]\r
-       ldrb r0,[z80sp],#1\r
-    add r2,r2,#0x2000\r
-    cmp z80sp,r2\r
-@    subge z80sp,z80sp,#0x2000 @ unstable?\r
-       ldrb r1,[z80sp],#1\r
-    cmp z80sp,r2\r
-@    subge z80sp,z80sp,#0x2000\r
-       orr r0,r0,r1, lsl #8\r
-.else\r
        ldrb r0,[z80sp],#1\r
        ldrb r1,[z80sp],#1\r
        orr r0,r0,r1, lsl #8\r
-.endif\r
 .else\r
        mov r0,z80sp\r
        readmem16\r
@@ -752,23 +754,22 @@ z80_xmap_write16: @ data, addr
 .endm\r
 ;@---------------------------------------\r
 \r
+.macro stack_check\r
+    @ try to protect against stack overflows, lock into current bank\r
+    ldr r1,[cpucontext,#z80sp_base]\r
+    sub r1,z80sp,r1\r
+    cmp r1,#2\r
+    addlt z80sp,z80sp,#1<<Z80_MEM_SHIFT\r
+.endm\r
+\r
 .macro opPUSHareg reg @ reg > r1\r
 .if FAST_Z80SP\r
-.if DRZ80_FOR_PICODRIVE\r
-    @ notaz: try to protect against stack overflows, which tend to happen in Picodrive because of poor timing\r
-    ldr r0,[cpucontext,#z80sp_base]\r
-    cmp z80sp,r0\r
-    addle z80sp,z80sp,#0x2000\r
-    mov r1,\reg, lsr #8\r
-       strb r1,[z80sp,#-1]!\r
-    cmp z80sp,r0\r
-    addle z80sp,z80sp,#0x2000\r
-       strb \reg,[z80sp,#-1]!\r
-.else\r
+.if DRZ80_XMAP\r
+       stack_check\r
+.endif\r
        mov r1,\reg, lsr #8\r
        strb r1,[z80sp,#-1]!\r
        strb \reg,[z80sp,#-1]!\r
-.endif\r
 .else\r
     mov r0,\reg\r
        sub z80sp,z80sp,#2\r
@@ -779,22 +780,13 @@ z80_xmap_write16: @ data, addr
 \r
 .macro opPUSHreg reg\r
 .if FAST_Z80SP\r
-.if DRZ80_FOR_PICODRIVE\r
-    ldr r0,[cpucontext,#z80sp_base]\r
-    cmp z80sp,r0\r
-    addle z80sp,z80sp,#0x2000\r
-    mov r1,\reg, lsr #24\r
-       strb r1,[z80sp,#-1]!\r
-    cmp z80sp,r0\r
-    addle z80sp,z80sp,#0x2000\r
-       mov r1,\reg, lsr #16\r
-       strb r1,[z80sp,#-1]!\r
-.else\r
+.if DRZ80_XMAP\r
+       stack_check\r
+.endif\r
     mov r1,\reg, lsr #24\r
        strb r1,[z80sp,#-1]!\r
        mov r1,\reg, lsr #16\r
        strb r1,[z80sp,#-1]!\r
-.endif\r
 .else\r
        mov r0,\reg,lsr #16\r
        sub z80sp,z80sp,#2\r
index 4e56bf7..8110a2e 100644 (file)
@@ -1711,6 +1711,7 @@ PICO_INTERNAL void PicoMemSetupCD(void)
 #ifdef EMU_M68K\r
   m68k_mem_setup_cd();\r
 #endif\r
+  z80_mem_setup();\r
 \r
   // m68k_poll_addr = m68k_poll_cnt = 0;\r
   s68k_poll_adclk = s68k_poll_cnt = 0;\r
index e8b65e4..819ead8 100644 (file)
@@ -514,7 +514,6 @@ PICO_INTERNAL void PicoMemResetHooks(void)
   PicoWrite16Hook = OtherWrite16End;\r
 }\r
 \r
-static void z80_mem_setup(void);\r
 #ifdef EMU_M68K\r
 static void m68k_mem_setup(void);\r
 #endif\r
@@ -1066,7 +1065,7 @@ static void z80_md_out(unsigned short p, unsigned char d)
   elprintf(EL_ANOMALY, "Z80 port %04x write %02x", p, d);\r
 }\r
 \r
-static void z80_mem_setup(void)\r
+void z80_mem_setup(void)\r
 {\r
   z80_map_set(z80_read_map, 0x0000, 0x1fff, Pico.zram, 0);\r
   z80_map_set(z80_read_map, 0x2000, 0x3fff, Pico.zram, 0);\r
index 1339c26..d3b64a8 100644 (file)
@@ -427,6 +427,7 @@ PICO_INTERNAL_ASM void PicoMemReset(void);
 PICO_INTERNAL void PicoMemResetHooks(void);\r
 PICO_INTERNAL int PadRead(int i);\r
 PICO_INTERNAL int ym2612_write_local(unsigned int a, unsigned int d, int is_from_z80);\r
+void z80_mem_setup(void);\r
 extern unsigned int (*PicoRead16Hook)(unsigned int a, int realsize);\r
 extern void (*PicoWrite8Hook) (unsigned int a,unsigned int d,int realsize);\r
 extern void (*PicoWrite16Hook)(unsigned int a,unsigned int d,int realsize);\r
index dd65e1a..815e003 100644 (file)
@@ -118,6 +118,7 @@ PICO_INTERNAL void z80_reset(void)
   drZ80.Z80IM = 0; // 1?
   drZ80.z80irqvector = 0xff0000; // RST 38h
   drZ80.Z80PC_BASE = drZ80.Z80PC = z80_read_map[0] << 1;
+  // drZ80 is locked in single bank
   drZ80.Z80SP_BASE = z80_read_map[0] << 1;
 //  drZ80.Z80SP = drZ80.z80_rebaseSP(0x2000); // 0xf000 ?
 #endif