32x and sms savestates. Core-independent z80 state. SS bugfixing/refactoring.
[picodrive.git] / cpu / DrZ80 / drz80.s
index 5445ffd..edb29df 100644 (file)
@@ -14,7 +14,6 @@
       .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
@@ -144,7 +143,7 @@ z80_xmap_write8_handler: @ data, addr, func
 z80_xmap_read16: @ addr\r
     @ check if we cross bank boundary\r
     add r1,r0,#1\r
-    eor r1,r0,r0\r
+    eor r1,r1,r0\r
     tst r1,#1<<Z80_MEM_SHIFT\r
     bne 0f\r
 \r
@@ -160,22 +159,22 @@ 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
-    eor r2,r1,r1\r
+    eor r2,r2,r1\r
     tst r2,#1<<Z80_MEM_SHIFT\r
     bne 0f\r
 \r
-    ldr r2,[cpucontext,#z80_read8]\r
+    ldr r2,[cpucontext,#z80_write8]\r
     add r2,r2,r1,lsr #Z80_MEM_SHIFT-2\r
     bic r2,r2,#3\r
     ldr r2,[r2]\r
@@ -187,15 +186,49 @@ 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
-.endif\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
+    stmfd sp!,{r3,r12,lr}\r
+    mov lr,pc\r
+    ldr pc,[cpucontext,#z80_rebasePC]\r
+    mov z80pc,r0\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
@@ -335,10 +368,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,15 +383,14 @@ 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
-    ldr r1,[cpucontext,#z80sp_base]\r
-    add r0,r1,r0\r
+.if DRZ80_XMAP\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
@@ -722,22 +752,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 +769,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 +795,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
@@ -4500,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
@@ -5575,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
@@ -6721,7 +6726,8 @@ opcode_DD_2E:
 opcode_DD_34:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        stmfd sp!,{r0}  ;@ save addr\r
        readmem8\r
        opINC8b\r
@@ -6732,7 +6738,8 @@ opcode_DD_34:
 opcode_DD_35:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        stmfd sp!,{r0}  ;@ save addr\r
        readmem8\r
        opDEC8b\r
@@ -6744,7 +6751,8 @@ opcode_DD_36:
        ldrsb r2,[z80pc],#1\r
        ldrb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r1,r2,r1, lsr #16\r
+       add r1,r1,r2, lsl #16\r
+       mov r1,r1,lsr #16\r
        writemem8\r
        fetch 19\r
 ;@ADD IX,SP\r
@@ -6775,7 +6783,8 @@ opcode_DD_45:
 opcode_DD_46:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        and z80bc,z80bc,#0xFF<<16\r
        orr z80bc,z80bc,r0, lsl #24\r
@@ -6796,7 +6805,8 @@ opcode_DD_4D:
 opcode_DD_4E:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        and z80bc,z80bc,#0xFF<<24\r
        orr z80bc,z80bc,r0, lsl #16\r
@@ -6818,7 +6828,8 @@ opcode_DD_55:
 opcode_DD_56:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        and z80de,z80de,#0xFF<<16\r
        orr z80de,z80de,r0, lsl #24\r
@@ -6839,7 +6850,8 @@ opcode_DD_5D:
 opcode_DD_5E:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        and z80de,z80de,#0xFF<<24\r
        orr z80de,z80de,r0, lsl #16\r
@@ -6876,7 +6888,8 @@ opcode_DD_65:
 opcode_DD_66:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        and z80hl,z80hl,#0xFF<<16\r
        orr z80hl,z80hl,r0, lsl #24\r
@@ -6918,7 +6931,8 @@ opcode_DD_6D:
 opcode_DD_6E:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        and z80hl,z80hl,#0xFF<<24\r
        orr z80hl,z80hl,r0, lsl #16\r
@@ -6933,7 +6947,8 @@ opcode_DD_6F:
 opcode_DD_70:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r1,r0,r1, lsr #16\r
+       add r1,r1,r0, lsl #16\r
+       mov r1,r1,lsr #16\r
        mov r0,z80bc, lsr #24\r
        writemem8\r
        fetch 19\r
@@ -6941,7 +6956,8 @@ opcode_DD_70:
 opcode_DD_71:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r1,r0,r1, lsr #16\r
+       add r1,r1,r0, lsl #16\r
+       mov r1,r1,lsr #16\r
        mov r0,z80bc, lsr #16\r
        and r0,r0,#0xFF\r
        writemem8\r
@@ -6950,7 +6966,8 @@ opcode_DD_71:
 opcode_DD_72:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r1,r0,r1, lsr #16\r
+       add r1,r1,r0, lsl #16\r
+       mov r1,r1,lsr #16\r
        mov r0,z80de, lsr #24\r
        writemem8\r
        fetch 19\r
@@ -6958,7 +6975,8 @@ opcode_DD_72:
 opcode_DD_73:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r1,r0,r1, lsr #16\r
+       add r1,r1,r0, lsl #16\r
+       mov r1,r1,lsr #16\r
        mov r0,z80de, lsr #16\r
        and r0,r0,#0xFF\r
        writemem8\r
@@ -6967,7 +6985,8 @@ opcode_DD_73:
 opcode_DD_74:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r1,r0,r1, lsr #16\r
+       add r1,r1,r0, lsl #16\r
+       mov r1,r1,lsr #16\r
        mov r0,z80hl, lsr #24\r
        writemem8\r
        fetch 19\r
@@ -6975,7 +6994,8 @@ opcode_DD_74:
 opcode_DD_75:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r1,r0,r1, lsr #16\r
+       add r1,r1,r0, lsl #16\r
+       mov r1,r1,lsr #16\r
        mov r0,z80hl, lsr #16\r
        and r0,r0,#0xFF\r
        writemem8\r
@@ -6984,7 +7004,8 @@ opcode_DD_75:
 opcode_DD_77:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r1,r0,r1, lsr #16\r
+       add r1,r1,r0, lsl #16\r
+       mov r1,r1,lsr #16\r
        mov r0,z80a, lsr #24\r
        writemem8\r
        fetch 19\r
@@ -7003,7 +7024,8 @@ opcode_DD_7D:
 opcode_DD_7E:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        mov z80a,r0, lsl #24\r
        fetch 19\r
@@ -7022,7 +7044,8 @@ opcode_DD_85:
 opcode_DD_86:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        opADDb\r
        fetch 19\r
@@ -7041,7 +7064,8 @@ opcode_DD_8D:
 opcode_DD_8E:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        opADCb\r
        fetch 19\r
@@ -7060,7 +7084,8 @@ opcode_DD_95:
 opcode_DD_96:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        opSUBb\r
        fetch 19\r
@@ -7079,7 +7104,8 @@ opcode_DD_9D:
 opcode_DD_9E:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        opSBCb\r
        fetch 19\r
@@ -7098,7 +7124,8 @@ opcode_DD_A5:
 opcode_DD_A6:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        opANDb\r
        fetch 19\r
@@ -7117,7 +7144,8 @@ opcode_DD_AD:
 opcode_DD_AE:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        opXORb\r
        fetch 19\r
@@ -7136,7 +7164,8 @@ opcode_DD_B5:
 opcode_DD_B6:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        opORb\r
        fetch 19\r
@@ -7155,7 +7184,8 @@ opcode_DD_BD:
 opcode_DD_BE:\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
        readmem8\r
        opCPb\r
        fetch 19\r
@@ -7167,7 +7197,8 @@ opcode_DD_CB:
 ;@moves the PC to the location of the subroutine\r
        ldrsb r0,[z80pc],#1\r
        ldr r1,[z80xx]\r
-       add r0,r0,r1, lsr #16\r
+       add r0,r1,r0, lsl #16\r
+       mov r0,r0,lsr #16\r
 \r
        ldrb r1,[z80pc],#1\r
        ldr pc,[pc,r1, lsl #2]\r
@@ -7415,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
@@ -7753,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