\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
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
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
.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
.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
.if FAST_Z80SP\r
ldrh r0,[z80xx,#2]\r
rebasesp\r
- mov z80sp,r0\r
.else\r
ldrh z80sp,[z80xx,#2]\r
.endif\r
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