32x and sms savestates. Core-independent z80 state. SS bugfixing/refactoring.
[picodrive.git] / cpu / DrZ80 / drz80.s
index 499c856..edb29df 100644 (file)
@@ -19,7 +19,6 @@
 \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
@@ -206,12 +205,30 @@ z80_xmap_rebase_pc:
     bxcc lr\r
 \r
 z80_bad_jump:\r
-    ldr r0,[cpucontext,#z80_read8]\r
-    ldr r0,[r0]\r
-    str r0,[cpucontext,#z80pc_base]\r
+    stmfd sp!,{r3,r12,lr}\r
+    mov lr,pc\r
+    ldr pc,[cpucontext,#z80_rebasePC]\r
     mov z80pc,r0\r
-    bx lr\r
-.endif\r
+    ldmfd sp!,{r3,r12,pc}\r
+\r
+z80_xmap_rebase_sp:\r
+    ldr r1,[cpucontext,#z80_read8]\r
+    sub r2,r0,#1\r
+    mov r2,r2,lsl #16\r
+    mov r2,r2,lsr #(Z80_MEM_SHIFT+16)\r
+    ldr r1,[r1,r2,lsl #2]\r
+    movs r1,r1,lsl #1\r
+    strcc r1,[cpucontext,#z80sp_base]\r
+    addcc z80sp,r1,r0\r
+    bxcc lr\r
+\r
+    stmfd sp!,{r3,r12,lr}\r
+    mov lr,pc\r
+    ldr pc,[cpucontext,#z80_rebaseSP]\r
+    mov z80sp,r0\r
+    ldmfd sp!,{r3,r12,pc}\r
\r
+.endif @ DRZ80_XMAP\r
 \r
 \r
 .macro fetch cycs\r
@@ -367,15 +384,13 @@ z80_bad_jump:
      str z80pc,[cpucontext,#z80pc_pointer]\r
 .endif\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
+    bl z80_xmap_rebase_sp\r
 .else\r
        stmfd sp!,{r3,r12}\r
        mov lr,pc\r
        ldr pc,[cpucontext,#z80_rebaseSP]               ;@ external function must rebase sp\r
        ldmfd sp!,{r3,r12}\r
+       mov z80sp,r0\r
 .endif\r
 .endm\r
 ;@----------------------------------------------------------------------------\r
@@ -4492,7 +4507,6 @@ opcode_3_1:
 .if FAST_Z80SP\r
        orr r0,r0,r1, lsl #8\r
        rebasesp\r
-       mov z80sp,r0\r
 .else\r
        orr z80sp,r0,r1, lsl #8\r
 .endif\r
@@ -5567,7 +5581,6 @@ opcode_F_9:
 .if FAST_Z80SP\r
        mov r0,z80hl, lsr #16\r
        rebasesp\r
-       mov z80sp,r0\r
 .else\r
        mov z80sp,z80hl, lsr #16\r
 .endif\r
@@ -7433,7 +7446,6 @@ opcode_DD_F9:
 .if FAST_Z80SP\r
        ldrh r0,[z80xx,#2]\r
        rebasesp\r
-       mov z80sp,r0\r
 .else\r
        ldrh z80sp,[z80xx,#2]\r
 .endif\r
@@ -7771,8 +7783,9 @@ opcode_ED_7B:
        readmem16\r
 .if FAST_Z80SP\r
        rebasesp\r
-.endif\r
+.else\r
        mov z80sp,r0\r
+.endif\r
        fetch 20\r
 ;@LDI\r
 opcode_ED_A0:\r