\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
.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
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
\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
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
\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
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
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
.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
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
.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
;@ 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
;@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
.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