drz80: drop fast_sp for compatibility
[picodrive.git] / cpu / DrZ80 / drz80.s
index 08f8a19..c2a64df 100644 (file)
       .global DrZ80Ver\r
 \r
       .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 FAST_Z80SP,             0 ;@0 = Use mem functions for stack pointer, 1 = Use direct mem pointer\r
       .equiv UPDATE_CONTEXT,         0\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
@@ -98,6 +97,7 @@ DrZ80Ver: .long 0x0001
        .equ Z80_IF1, 1<<0\r
        .equ Z80_IF2, 1<<1\r
        .equ Z80_HALT, 1<<2\r
+       .equ Z80_NMI, 1<<3\r
 \r
 ;@---------------------------------------\r
 \r
@@ -206,12 +206,32 @@ 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
+.if FAST_Z80SP\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
+.endif @ FAST_Z80SP\r
\r
+.endif @ DRZ80_XMAP\r
 \r
 \r
 .macro fetch cycs\r
@@ -367,15 +387,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
@@ -1344,9 +1362,11 @@ DrZ80Run:
 \r
 .if INTERRUPT_MODE == 0\r
        ;@ check ints\r
+       tst r0,#(Z80_NMI<<8)\r
+       blne DoNMI\r
        tst r0,#0xff\r
        movne r0,r0,lsr #8\r
-       tstne r0,#1\r
+       tstne r0,#Z80_IF1\r
        blne DoInterrupt\r
 .endif\r
 \r
@@ -1500,6 +1520,36 @@ DoInterrupt_end:
        ldmfd sp!,{pc} ;@ return\r
 .endif\r
 \r
+DoNMI:\r
+       stmfd sp!,{lr}\r
+\r
+       bic r0,r0,#((Z80_NMI|Z80_HALT|Z80_IF1)<<8)\r
+       strh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits\r
+\r
+       ;@ push pc on stack\r
+       ldr r0,[cpucontext,#z80pc_base]\r
+       sub r2,z80pc,r0\r
+       opPUSHareg r2\r
+\r
+       ;@ read new pc from vector address\r
+.if UPDATE_CONTEXT\r
+       str z80pc,[cpucontext,#z80pc_pointer]\r
+.endif\r
+       mov r0,#0x66\r
+.if DRZ80_XMAP\r
+       rebasepc\r
+.else\r
+       stmfd sp!,{r3,r12}\r
+       mov lr,pc\r
+       ldr pc,[cpucontext,#z80_rebasePC] ;@ r0=new pc - external function sets z80pc_base and returns new z80pc in r0\r
+       ldmfd sp!,{r3,r12}\r
+       mov z80pc,r0    \r
+.endif\r
+       ldrh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits\r
+       eatcycles 11\r
+       ldmfd sp!,{pc}\r
+\r
+\r
 .data\r
 .align 4\r
 \r
@@ -4246,10 +4296,12 @@ opcode_0_7:
        fetch 4\r
 ;@EX AF,AF'\r
 opcode_0_8:\r
-       add r1,cpucontext,#z80a2\r
-       swp z80a,z80a,[r1]\r
-       add r1,cpucontext,#z80f2\r
-       swp z80f,z80f,[r1]\r
+       ldr r0,[cpucontext,#z80a2]\r
+       ldr r1,[cpucontext,#z80f2]\r
+       str z80a,[cpucontext,#z80a2]\r
+       str z80f,[cpucontext,#z80f2]\r
+       mov z80a,r0\r
+       mov z80f,r1\r
        fetch 4\r
 ;@ADD HL,BC\r
 opcode_0_9:\r
@@ -4492,7 +4544,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
@@ -5289,12 +5340,15 @@ opcode_D_8:
        fetch 5\r
 ;@EXX\r
 opcode_D_9:\r
-       add r1,cpucontext,#z80bc2\r
-       swp z80bc,z80bc,[r1]\r
-       add r1,cpucontext,#z80de2\r
-       swp z80de,z80de,[r1]\r
-       add r1,cpucontext,#z80hl2\r
-       swp z80hl,z80hl,[r1]\r
+       ldr r0,[cpucontext,#z80bc2]\r
+       ldr r1,[cpucontext,#z80de2]\r
+       ldr r2,[cpucontext,#z80hl2]\r
+       str z80bc,[cpucontext,#z80bc2]\r
+       str z80de,[cpucontext,#z80de2]\r
+       str z80hl,[cpucontext,#z80hl2]\r
+       mov z80bc,r0\r
+       mov z80de,r1\r
+       mov z80hl,r2\r
        fetch 4\r
 ;@JP C,$+3\r
 opcode_D_A:\r
@@ -5567,7 +5621,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
@@ -5602,7 +5655,7 @@ ei_return:
        ;@ check ints\r
        tst r0,#0xff\r
        movne r0,r0,lsr #8\r
-       tstne r0,#1\r
+       tstne r0,#Z80_IF1\r
        blne DoInterrupt\r
 \r
        ;@ continue\r
@@ -6713,7 +6766,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
@@ -6724,7 +6778,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
@@ -6736,7 +6791,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
@@ -6767,7 +6823,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
@@ -6788,7 +6845,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
@@ -6810,7 +6868,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
@@ -6831,7 +6890,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
@@ -6868,7 +6928,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
@@ -6910,7 +6971,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
@@ -6925,7 +6987,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
@@ -6933,7 +6996,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
@@ -6942,7 +7006,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
@@ -6950,7 +7015,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
@@ -6959,7 +7025,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
@@ -6967,7 +7034,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
@@ -6976,7 +7044,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
@@ -6995,7 +7064,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
@@ -7014,7 +7084,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
@@ -7033,7 +7104,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
@@ -7052,7 +7124,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
@@ -7071,7 +7144,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
@@ -7090,7 +7164,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
@@ -7109,7 +7184,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
@@ -7128,7 +7204,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
@@ -7147,7 +7224,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
@@ -7159,7 +7237,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
@@ -7407,7 +7486,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
@@ -7745,8 +7823,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