drz80: drop fast_sp for compatibility
[picodrive.git] / cpu / DrZ80 / drz80.s
index ee14013..c2a64df 100644 (file)
       .global DrZ80Run\r
       .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 UPDATE_CONTEXT,        0\r
-      .equiv DRZ80_FOR_PICODRIVE,   1\r
+      .equiv INTERRUPT_MODE,         0 ;@0 = Use internal int handler, 1 = Use Mames int handler\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
+.endif\r
 \r
 .if INTERRUPT_MODE\r
       .extern Interrupt\r
 .endif\r
 \r
-.if DRZ80_FOR_PICODRIVE\r
-      .extern PicoRead8\r
-      .extern Pico\r
-      .extern z80_write\r
-      .extern ym2612_st\r
-.endif\r
-\r
 DrZ80Ver: .long 0x0001\r
 \r
 ;@ --------------------------- Defines ----------------------------\r
 ;@ Make sure that regs/pointers for z80pc to z80sp match up!\r
 \r
-       opcodes    .req r3\r
-       z80_icount .req r4\r
+       z80_icount .req r3\r
+       opcodes    .req r4\r
        cpucontext .req r5\r
        z80pc      .req r6\r
        z80a       .req r7\r
@@ -99,149 +97,142 @@ 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
 .text\r
 \r
-.if DRZ80_FOR_PICODRIVE\r
-\r
-.macro YM2612Read_and_ret8\r
-    ldr r0, =ym2612_st\r
-    ldr r0, [r0]\r
-    ldrb r0, [r0, #0x11]   ;@ ym2612_st->status\r
-    bx lr\r
-.endm\r
-\r
-.macro YM2612Read_and_ret16\r
-    ldr r0, =ym2612_st\r
-    ldr r0, [r0]\r
-    ldrb r0, [r0, #0x11]   ;@ ym2612_st->status\r
-    orr r0,r0,r0,lsl #8\r
-    bx lr\r
-.endm\r
-\r
-pico_z80_read8: @ addr\r
-    cmp r0,#0x2000         @ Z80 RAM\r
-    ldrlt r1,[cpucontext,#z80sp_base]\r
-    ldrltb r0,[r1,r0]\r
-    bxlt lr\r
-\r
-    cmp r0,#0x8000         @ 68k bank\r
-    blt 1f\r
-    ldr r2,=(Pico+0x22212)\r
-    ldrh r1,[r2]\r
-    bic r0,r0,#0x3f8000\r
-    orr r0,r0,r1,lsl #15\r
-    ldr r1,[r2,#-0xe]      @ ROM size\r
-    cmp r0,r1\r
-    ldrlt r1,[r2,#-0x12]   @ ROM\r
-    eorlt r0,r0,#1         @ our ROM is byteswapped\r
-    ldrltb r0,[r1,r0]\r
-    bxlt lr\r
-       stmfd sp!,{r3,r12,lr}\r
-    bl PicoRead8\r
-       ldmfd sp!,{r3,r12,pc}\r
-1:\r
-    mov r1,r0,lsr #13\r
-    cmp r1,#2              @ YM2612 (0x4000-0x5fff)\r
+.if DRZ80_XMAP\r
+\r
+z80_xmap_read8: @ addr\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
+    ldrccb r0,[r1,r0]\r
+    bxcc lr\r
+\r
+z80_xmap_read8_handler: @ addr, func\r
+    str z80_icount,[cpucontext,#cycles_pointer]\r
+    stmfd sp!,{r12,lr}\r
+    mov lr,pc\r
+    bx r1\r
+    ldr z80_icount,[cpucontext,#cycles_pointer]\r
+    ldmfd sp!,{r12,pc}\r
+\r
+z80_xmap_write8: @ data, addr\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
+    movs r2,r2,lsl #1\r
+    strccb r0,[r2,r1]\r
+    bxcc lr\r
+\r
+z80_xmap_write8_handler: @ data, addr, func\r
+    str z80_icount,[cpucontext,#cycles_pointer]\r
+    mov r3,r0\r
+    mov r0,r1\r
+    mov r1,r3\r
+    stmfd sp!,{r12,lr}\r
+    mov lr,pc\r
+    bx r2\r
+    ldr z80_icount,[cpucontext,#cycles_pointer]\r
+    ldmfd sp!,{r12,pc}\r
+\r
+z80_xmap_read16: @ addr\r
+    @ check if we cross bank boundary\r
+    add r1,r0,#1\r
+    eor r1,r1,r0\r
+    tst r1,#1<<Z80_MEM_SHIFT\r
     bne 0f\r
-    and r0,r0,#3\r
-    YM2612Read_and_ret8\r
-0:\r
-    cmp r0,#0x4000\r
-    movge r0,#0xff\r
-    bxge lr\r
-    ldr r1,[cpucontext,#z80sp_base]\r
-    bic r0,r0,#0x0fe000    @ Z80 RAM (mirror)\r
-    ldrb r0,[r1,r0]\r
-    bx lr\r
 \r
-pico_z80_read16: @ addr\r
-    cmp r0,#0x2000         @ Z80 RAM\r
-    bge 2f\r
-    ldr r1,[cpucontext,#z80sp_base]\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
+    bcs 0f\r
     ldrb r0,[r1,r0]!\r
     ldrb r1,[r1,#1]\r
     orr r0,r0,r1,lsl #8\r
     bx lr\r
 \r
-2:\r
-    cmp r0,#0x8000         @ 68k bank\r
-    blt 1f\r
-    ldr r2,=(Pico+0x22212)\r
-    ldrh r1,[r2]\r
-    bic r0,r0,#0x1f8000\r
-    orr r0,r0,r1,lsl #15\r
-    ldr r1,[r2,#-0xe]      @ ROM size\r
-    cmp r0,r1\r
-    ldr r1,[r2,#-0x12]     @ ROM\r
-    tst r0,#1\r
-    eor r0,r0,#1\r
-    ldrb r0,[r1,r0]!\r
-    ldreqb r1,[r1,#-1]\r
-    ldrneb r1,[r1,#3]      @ this is due to byteswapped ROM\r
-    orr r0,r0,r1,lsl #8\r
-    bx lr\r
-3:\r
-    stmfd sp!,{r3-r5,r12,lr}\r
-    mov r4,r0\r
-    bl PicoRead8\r
-    mov r5,r0\r
-    add r0,r4,#1\r
-    bl PicoRead8\r
-    orr r0,r5,r0,lsl #8\r
-    ldmfd sp!,{r3-r5,r12,pc}\r
-1:\r
-    mov r1,r0,lsr #13\r
-    cmp r1,#2              @ YM2612 (0x4000-0x5fff)\r
-    bne 0f\r
-    and r0,r0,#3\r
-    YM2612Read_and_ret16\r
 0:\r
-    cmp r0,#0x4000\r
-    movge r0,#0xff\r
-    bxge lr\r
-    ldr r1,[cpucontext,#z80sp_base]\r
-    bic r0,r0,#0x0fe000    @ Z80 RAM (mirror)\r
-    ldrb r0,[r1,r0]!\r
-    ldrb r1,[r1,#1]\r
-    orr r0,r0,r1,lsl #8\r
-    bx lr\r
-\r
-pico_z80_write8: @ data, addr\r
-    cmp r1,#0x4000\r
-    bge 1f\r
-    ldr r2,[cpucontext,#z80sp_base]\r
-    bic r1,r1,#0x0fe000    @ Z80 RAM\r
-    strb r0,[r2,r1]\r
-    bx lr\r
-1:\r
-    stmfd sp!,{r3,r12,lr}\r
-    bl z80_write\r
-    ldmfd sp!,{r3,r12,pc}\r
+    @ z80_xmap_read8 will save r3 and r12 for us\r
+    stmfd sp!,{r8,r9,lr}\r
+    mov r8,r0\r
+    bl z80_xmap_read8\r
+    mov r9,r0\r
+    add r0,r8,#1\r
+    bl z80_xmap_read8\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,r2,r1\r
+    tst r2,#1<<Z80_MEM_SHIFT\r
+    bne 0f\r
 \r
-pico_z80_write16: @ data, addr\r
-    cmp r1,#0x4000\r
-    bge 1f\r
-    ldr r2,[cpucontext,#z80sp_base]\r
-    bic r1,r1,#0x0fe000    @ Z80 RAM\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
+    movs r2,r2,lsl #1\r
+    bcs 0f\r
     strb r0,[r2,r1]!\r
     mov r0,r0,lsr #8\r
     strb r0,[r2,#1]\r
     bx lr\r
-1:\r
-       stmfd sp!,{r3-r5,r12,lr}\r
-    mov r4,r0\r
-    mov r5,r1\r
-       bl z80_write\r
-    mov r0,r4,lsr #8\r
-    add r1,r5,#1\r
-       bl z80_write\r
-       ldmfd sp!,{r3-r5,r12,pc}\r
-\r
-    .pool\r
-.endif\r
+\r
+0:\r
+    stmfd sp!,{r8,r9,lr}\r
+    mov r8,r0\r
+    mov r9,r1\r
+    bl z80_xmap_write8\r
+    mov r0,r8,lsr #8\r
+    add r1,r9,#1\r
+    bl z80_xmap_write8\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
+.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
        subs z80_icount,z80_icount,#\cycs\r
@@ -268,9 +259,18 @@ pico_z80_write16: @ data, addr
 .if UPDATE_CONTEXT\r
     str z80pc,[cpucontext,#z80pc_pointer]\r
 .endif\r
-.if DRZ80_FOR_PICODRIVE\r
-    bl pico_z80_read8\r
+.if DRZ80_XMAP\r
+.if !DRZ80_XMAP_MORE_INLINE\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
+    ldrccb r0,[r1,r0]\r
+    blcs z80_xmap_read8_handler\r
 .else\r
+    bl z80_xmap_read8\r
+.endif\r
+.else ;@ if !DRZ80_XMAP\r
     stmfd sp!,{r3,r12}\r
        mov lr,pc\r
        ldr pc,[cpucontext,#z80_read8]                  ;@ r0 = addr - data returned in r0\r
@@ -287,8 +287,8 @@ pico_z80_write16: @ data, addr
 .if UPDATE_CONTEXT\r
      str z80pc,[cpucontext,#z80pc_pointer]\r
 .endif\r
-.if DRZ80_FOR_PICODRIVE\r
-    bl pico_z80_read16\r
+.if DRZ80_XMAP\r
+    bl z80_xmap_read16\r
 .else\r
        stmfd sp!,{r3,r12}\r
        mov lr,pc\r
@@ -301,9 +301,18 @@ pico_z80_write16: @ data, addr
 .if UPDATE_CONTEXT\r
      str z80pc,[cpucontext,#z80pc_pointer]\r
 .endif\r
-.if DRZ80_FOR_PICODRIVE\r
-    bl pico_z80_write8\r
+.if DRZ80_XMAP\r
+.if DRZ80_XMAP_MORE_INLINE\r
+    ldr r2,[cpucontext,#z80_write8]\r
+    mov lr,r1,lsr #Z80_MEM_SHIFT\r
+    ldr r2,[r2,lr,lsl #2]\r
+    movs r2,r2,lsl #1\r
+    strccb r0,[r2,r1]\r
+    blcs z80_xmap_write8_handler\r
 .else\r
+    bl z80_xmap_write8\r
+.endif\r
+.else ;@ if !DRZ80_XMAP\r
        stmfd sp!,{r3,r12}\r
        mov lr,pc\r
        ldr pc,[cpucontext,#z80_write8]                 ;@ r0=data r1=addr\r
@@ -325,8 +334,8 @@ pico_z80_write16: @ data, addr
 .if UPDATE_CONTEXT\r
      str z80pc,[cpucontext,#z80pc_pointer]\r
 .endif\r
-.if DRZ80_FOR_PICODRIVE\r
-    bl pico_z80_write16\r
+.if DRZ80_XMAP\r
+    bl z80_xmap_write16\r
 .else\r
        stmfd sp!,{r3,r12}\r
        mov lr,pc\r
@@ -340,19 +349,16 @@ pico_z80_write16: @ data, addr
      str z80pc,[cpucontext,#z80pc_pointer]\r
 .endif\r
        mov r0,z80hl, lsr #16\r
-.if DRZ80_FOR_PICODRIVE\r
-    bl pico_z80_read8\r
+.if DRZ80_XMAP\r
+    bl z80_xmap_read8\r
 .else\r
     stmfd sp!,{r3,r12}\r
        mov lr,pc\r
        ldr pc,[cpucontext,#z80_read8]                  ;@ r0 = addr - data returned in r0\r
-.endif\r
-.if UPDATE_CONTEXT\r
-     str z80pc,[cpucontext,#z80pc_pointer]\r
 .endif\r
        mov r1,z80de, lsr #16\r
-.if DRZ80_FOR_PICODRIVE\r
-    bl pico_z80_write8\r
+.if DRZ80_XMAP\r
+    bl z80_xmap_write8\r
 .else\r
        mov lr,pc\r
        ldr pc,[cpucontext,#z80_write8]                 ;@ r0=data r1=addr\r
@@ -365,10 +371,8 @@ pico_z80_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,#z80pc_base]\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
@@ -382,15 +386,14 @@ pico_z80_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
@@ -752,22 +755,9 @@ pico_z80_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
@@ -782,23 +772,22 @@ pico_z80_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
@@ -809,22 +798,13 @@ pico_z80_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
@@ -835,14 +815,13 @@ pico_z80_write16: @ data, addr
 ;@---------------------------------------\r
 \r
 .macro opRESmemHL bit\r
-.if DRZ80_FOR_PICODRIVE\r
        mov r0,z80hl, lsr #16\r
-    bl pico_z80_read8\r
+.if DRZ80_XMAP\r
+       bl z80_xmap_read8\r
        bic r0,r0,#1<<\bit\r
        mov r1,z80hl, lsr #16\r
-    bl pico_z80_write8\r
+       bl z80_xmap_write8\r
 .else\r
-       mov r0,z80hl, lsr #16\r
        stmfd sp!,{r3,r12}\r
        mov lr,pc\r
        ldr pc,[cpucontext,#z80_read8]                  ;@ r0 = addr - data returned in r0\r
@@ -857,12 +836,12 @@ pico_z80_write16: @ data, addr
 ;@---------------------------------------\r
 \r
 .macro opRESmem bit\r
-.if DRZ80_FOR_PICODRIVE\r
+.if DRZ80_XMAP\r
        stmfd sp!,{r0}                                                  ;@ save addr as well\r
-    bl pico_z80_read8\r
+       bl z80_xmap_read8\r
        bic r0,r0,#1<<\bit\r
        ldmfd sp!,{r1}                                                  ;@ restore addr into r1\r
-    bl pico_z80_write8\r
+       bl z80_xmap_write8\r
 .else\r
        stmfd sp!,{r3,r12}\r
        stmfd sp!,{r0}                                                  ;@ save addr as well\r
@@ -1117,14 +1096,13 @@ pico_z80_write16: @ data, addr
 ;@---------------------------------------\r
 \r
 .macro opSETmemHL bit\r
-.if DRZ80_FOR_PICODRIVE\r
        mov r0,z80hl, lsr #16\r
-    bl pico_z80_read8\r
+.if DRZ80_XMAP\r
+       bl z80_xmap_read8\r
        orr r0,r0,#1<<\bit\r
        mov r1,z80hl, lsr #16\r
-    bl pico_z80_write8\r
+       bl z80_xmap_write8\r
 .else\r
-       mov r0,z80hl, lsr #16\r
        stmfd sp!,{r3,r12}\r
        mov lr,pc\r
        ldr pc,[cpucontext,#z80_read8]                  ;@ r0 = addr - data returned in r0\r
@@ -1139,12 +1117,12 @@ pico_z80_write16: @ data, addr
 ;@---------------------------------------\r
 \r
 .macro opSETmem bit\r
-.if DRZ80_FOR_PICODRIVE\r
+.if DRZ80_XMAP\r
        stmfd sp!,{r0}  ;@ save addr as well\r
-    bl pico_z80_read8\r
+       bl z80_xmap_read8\r
        orr r0,r0,#1<<\bit\r
        ldmfd sp!,{r1}  ;@ restore addr into r1\r
-    bl pico_z80_write8\r
+       bl z80_xmap_write8\r
 .else\r
        stmfd sp!,{r3,r12}\r
        stmfd sp!,{r0}  ;@ save addr as well\r
@@ -1378,30 +1356,34 @@ DrZ80Run:
        mov z80_icount,r1                                               ;@ setup number of Tstates to execute\r
 \r
 .if INTERRUPT_MODE == 0\r
-       ldrh r0,[cpucontext,#z80irq] @ 0x4C\r
+       ldrh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits\r
 .endif\r
        ldmia cpucontext,{z80pc-z80sp}                  ;@ load Z80 registers\r
 \r
 .if INTERRUPT_MODE == 0\r
        ;@ check ints\r
-       tst r0,#1\r
-       movnes r0,r0,lsr #8\r
-    blne DoInterrupt\r
+       tst r0,#(Z80_NMI<<8)\r
+       blne DoNMI\r
+       tst r0,#0xff\r
+       movne r0,r0,lsr #8\r
+       tstne r0,#Z80_IF1\r
+       blne DoInterrupt\r
 .endif\r
 \r
-       ldrb r0,[z80pc],#1    ;@ get first op code\r
        ldr opcodes,MAIN_opcodes_POINTER2\r
-       ldr pc,[opcodes,r0, lsl #2]  ;@ execute op code\r
 \r
-MAIN_opcodes_POINTER2: .word MAIN_opcodes\r
+       cmp z80_icount,#0     ;@ irq might have used all cycles\r
+       ldrplb r0,[z80pc],#1\r
+       ldrpl pc,[opcodes,r0, lsl #2]\r
 \r
 \r
 z80_execute_end:\r
        ;@ save registers in CPU context\r
        stmia cpucontext,{z80pc-z80sp}                  ;@ save Z80 registers\r
-    mov r0,z80_icount\r
+       mov r0,z80_icount\r
        ldmia sp!,{r4-r12,pc}                                   ;@ restore registers from stack and return to C code\r
 \r
+MAIN_opcodes_POINTER2: .word MAIN_opcodes\r
 .if INTERRUPT_MODE\r
 Interrupt_local: .word Interrupt\r
 .endif\r
@@ -1420,6 +1402,8 @@ DoInterrupt:
        ldmia cpucontext,{z80pc-z80sp}                  ;@ load Z80 registers\r
        mov pc,lr ;@ return\r
 .else\r
+\r
+       ;@ r0 == z80if\r
        stmfd sp!,{lr}\r
 \r
        tst r0,#4 ;@ check halt\r
@@ -1432,10 +1416,9 @@ DoInterrupt:
        strb r0,[cpucontext,#z80if]\r
 \r
        ;@ now check int mode\r
-    tst r1,#1\r
-    bne DoInterrupt_mode1\r
-    tst r1,#2\r
-    bne DoInterrupt_mode2\r
+       cmp r1,#1\r
+       beq DoInterrupt_mode1\r
+       bgt DoInterrupt_mode2\r
 \r
 DoInterrupt_mode0:\r
        ;@ get 3 byte vector\r
@@ -1465,6 +1448,7 @@ DoInterrupt_mode0:
        ;@ rebase new pc\r
        rebasepc\r
 \r
+       eatcycles 13\r
        b DoInterrupt_end\r
 \r
 1:\r
@@ -1479,6 +1463,7 @@ DoInterrupt_mode0:
        ;@ rebase new pc\r
        rebasepc\r
 \r
+       eatcycles 13\r
        b DoInterrupt_end\r
 \r
 DoInterrupt_mode1:\r
@@ -1488,6 +1473,7 @@ DoInterrupt_mode1:
        mov r0,#0x38\r
        rebasepc\r
 \r
+       eatcycles 13\r
        b DoInterrupt_end\r
 \r
 DoInterrupt_mode2:\r
@@ -1502,41 +1488,67 @@ DoInterrupt_mode2:
        orr r0,r0,r1,lsr#16\r
 \r
        ;@ read new pc from vector address\r
-.if DRZ80_FOR_PICODRIVE\r
-    bl pico_z80_read16\r
-    bic r0,r0,#0xfe000\r
-    ldr r1,[cpucontext,#z80pc_base]\r
-    add z80pc,r1,r0\r
 .if UPDATE_CONTEXT\r
      str z80pc,[cpucontext,#z80pc_pointer]\r
 .endif\r
+.if DRZ80_XMAP\r
+    bl z80_xmap_read16\r
+    rebasepc\r
 .else\r
        stmfd sp!,{r3,r12}\r
        mov lr,pc\r
        ldr pc,[cpucontext,#z80_read16]\r
 \r
        ;@ rebase new pc\r
-.if UPDATE_CONTEXT\r
-     str z80pc,[cpucontext,#z80pc_pointer]\r
-.endif\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
+       eatcycles 17\r
 \r
 DoInterrupt_end:\r
        ;@ interupt accepted so callback irq interface\r
        ldr r0,[cpucontext, #z80irqcallback]\r
        tst r0,r0\r
+       streqb r0,[cpucontext,#z80irq]       ;@ default handling\r
        ldmeqfd sp!,{pc}\r
        stmfd sp!,{r3,r12}\r
        mov lr,pc\r
        mov pc,r0    ;@ call callback function\r
        ldmfd sp!,{r3,r12}\r
        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
@@ -4284,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
@@ -4530,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
@@ -4574,7 +4587,7 @@ opcode_3_8:
        tst z80f,#1<<CFlag\r
        bne opcode_1_8\r
        add z80pc,z80pc,#1\r
-       fetch 8\r
+       fetch 7\r
 ;@ADD HL,SP\r
 opcode_3_9:\r
 .if FAST_Z80SP\r
@@ -4592,7 +4605,7 @@ opcode_3_A:
        orr r0,r0,r1, lsl #8\r
        readmem8\r
        mov z80a,r0, lsl #24\r
-       fetch 11\r
+       fetch 13\r
 ;@DEC SP\r
 opcode_3_B:\r
        sub z80sp,z80sp,#1\r
@@ -4896,6 +4909,7 @@ opcode_7_6:
        ldrb r0,[cpucontext,#z80if]\r
        orr r0,r0,#Z80_HALT\r
        strb r0,[cpucontext,#z80if]\r
+       mov z80_icount,#0\r
        b z80_execute_end\r
 ;@LD (HL),A\r
 opcode_7_7:\r
@@ -5152,7 +5166,7 @@ opcode_B_F:
 ;@RET NZ\r
 opcode_C_0:\r
        tst z80f,#1<<ZFlag\r
-       beq opcode_C_9          ;@unconditional RET\r
+       beq opcode_C_9_cond             ;@unconditional RET\r
        fetch 5\r
 \r
 ;@POP BC\r
@@ -5195,8 +5209,11 @@ opcode_C_7:
 ;@RET Z\r
 opcode_C_8:\r
        tst z80f,#1<<ZFlag\r
-       bne opcode_C_9          ;@unconditional RET\r
+       bne opcode_C_9_cond             ;@unconditional RET\r
        fetch 5\r
+\r
+opcode_C_9_cond:\r
+       eatcycles 1\r
 ;@RET\r
 opcode_C_9:\r
     opPOP\r
@@ -5277,7 +5294,7 @@ opcode_C_F:
 ;@RET NC\r
 opcode_D_0:\r
        tst z80f,#1<<CFlag\r
-       beq opcode_C_9          ;@unconditional RET\r
+       beq opcode_C_9_cond             ;@unconditional RET\r
        fetch 5\r
 ;@POP DE\r
 opcode_D_1:\r
@@ -5319,16 +5336,19 @@ opcode_D_7:
 ;@RET C\r
 opcode_D_8:\r
        tst z80f,#1<<CFlag\r
-       bne opcode_C_9          ;@unconditional RET\r
+       bne opcode_C_9_cond             ;@unconditional RET\r
        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
@@ -5405,7 +5425,7 @@ opcode_D_F:
 ;@RET PO\r
 opcode_E_0:\r
        tst z80f,#1<<VFlag\r
-       beq opcode_C_9          ;@unconditional RET\r
+       beq opcode_C_9_cond             ;@unconditional RET\r
        fetch 5\r
 ;@POP HL\r
 opcode_E_1:\r
@@ -5460,7 +5480,7 @@ opcode_E_7:
 ;@RET PE\r
 opcode_E_8:\r
        tst z80f,#1<<VFlag\r
-       bne opcode_C_9          ;@unconditional RET\r
+       bne opcode_C_9_cond             ;@unconditional RET\r
        fetch 5\r
 ;@JP (HL)\r
 opcode_E_9:\r
@@ -5536,7 +5556,7 @@ opcode_E_F:
 ;@RET P\r
 opcode_F_0:\r
        tst z80f,#1<<SFlag\r
-       beq opcode_C_9          ;@unconditional RET\r
+       beq opcode_C_9_cond             ;@unconditional RET\r
        fetch 5\r
 ;@POP AF\r
 opcode_F_1:\r
@@ -5594,18 +5614,17 @@ opcode_F_7:
 ;@RET M\r
 opcode_F_8:\r
        tst z80f,#1<<SFlag\r
-       bne opcode_C_9          ;@unconditional RET\r
+       bne opcode_C_9_cond             ;@unconditional RET\r
        fetch 5\r
 ;@LD SP,HL\r
 opcode_F_9:\r
 .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
-       fetch 4\r
+       fetch 6\r
 ;@JP M,$+3\r
 opcode_F_A:\r
        tst z80f,#1<<SFlag\r
@@ -5617,13 +5636,12 @@ EI_DUMMY_opcodes_POINTER: .word EI_DUMMY_opcodes
 ;@EI\r
 opcode_F_B:\r
        ldrb r1,[cpucontext,#z80if]\r
-       tst r1,#Z80_IF1\r
-       bne ei_return_exit\r
-\r
+       mov r2,opcodes\r
        orr r1,r1,#(Z80_IF1)|(Z80_IF2)\r
        strb r1,[cpucontext,#z80if]\r
 \r
-       mov r2,opcodes\r
+       ldrb r0,[z80pc],#1\r
+       eatcycles 4\r
        ldr opcodes,EI_DUMMY_opcodes_POINTER\r
        ldr pc,[r2,r0, lsl #2]\r
 \r
@@ -5631,16 +5649,17 @@ ei_return:
        ;@point that program returns from EI to check interupts\r
        ;@an interupt can not be taken directly after a EI opcode\r
        ;@ reset z80pc and opcode pointer\r
-       ldrh r0,[cpucontext,#z80irq] @ 0x4C\r
+       ldrh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits\r
        sub z80pc,z80pc,#1\r
        ldr opcodes,MAIN_opcodes_POINTER\r
        ;@ check ints\r
-       tst r0,#1\r
-       movnes r0,r0,lsr #8\r
-    blne DoInterrupt\r
+       tst r0,#0xff\r
+       movne r0,r0,lsr #8\r
+       tstne r0,#Z80_IF1\r
+       blne DoInterrupt\r
+\r
        ;@ continue\r
-ei_return_exit:\r
-       fetch 4\r
+       fetch 0\r
 \r
 ;@CALL M,NN\r
 opcode_F_C:\r
@@ -6647,7 +6666,7 @@ opcode_DD_NF:
 ;@     b end_loop\r
 \r
 opcode_DD_NF2:\r
-       fetch 15\r
+       fetch 23\r
 ;@ notaz: we don't want to deadlock here\r
 ;@     mov r0,#0xDD0000\r
 ;@     orr r0,r0,#0xCB00\r
@@ -6747,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
@@ -6758,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
@@ -6770,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
@@ -6801,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
@@ -6822,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
@@ -6844,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
@@ -6865,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
@@ -6902,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
@@ -6944,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
@@ -6959,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
@@ -6967,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
@@ -6976,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
@@ -6984,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
@@ -6993,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
@@ -7001,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
@@ -7010,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
@@ -7029,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
@@ -7048,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
@@ -7067,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
@@ -7086,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
@@ -7105,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
@@ -7124,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
@@ -7143,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
@@ -7162,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
@@ -7181,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
@@ -7193,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
@@ -7441,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
@@ -7779,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
@@ -8050,5 +8095,5 @@ opcode_ED_BB:
 ;@end_loop:\r
 ;@     b end_loop\r
 \r
-\r
+;@ vim:filetype=armasm\r
 \r