drz80: drop fast_sp for compatibility
[picodrive.git] / cpu / DrZ80 / drz80.s
index edb29df..c2a64df 100644 (file)
@@ -12,7 +12,7 @@
       .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
@@ -97,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
@@ -211,6 +212,7 @@ z80_bad_jump:
     mov z80pc,r0\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
@@ -227,6 +229,7 @@ z80_xmap_rebase_sp:
     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
@@ -1359,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
@@ -1515,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
@@ -4261,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
@@ -5303,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
@@ -5615,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