X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2FDrZ80%2Fdrz80.s;h=b92b2c2dff79a3fa50c7053f899c3c2aa7436924;hb=0270424fac34be5b63fb37caaaca60e378365d81;hp=edb29dfd06e3f5208632915b471d2753e6323cbc;hpb=b4db550e41b2aa277f570d7bff890c8e8ee1831f;p=picodrive.git diff --git a/cpu/DrZ80/drz80.s b/cpu/DrZ80/drz80.s index edb29df..b92b2c2 100644 --- a/cpu/DrZ80/drz80.s +++ b/cpu/DrZ80/drz80.s @@ -97,6 +97,7 @@ DrZ80Ver: .long 0x0001 .equ Z80_IF1, 1<<0 .equ Z80_IF2, 1<<1 .equ Z80_HALT, 1<<2 + .equ Z80_NMI, 1<<3 ;@--------------------------------------- @@ -1359,9 +1360,11 @@ DrZ80Run: .if INTERRUPT_MODE == 0 ;@ check ints + tst r0,#(Z80_NMI<<8) + blne DoNMI tst r0,#0xff movne r0,r0,lsr #8 - tstne r0,#1 + tstne r0,#Z80_IF1 blne DoInterrupt .endif @@ -1515,6 +1518,36 @@ DoInterrupt_end: ldmfd sp!,{pc} ;@ return .endif +DoNMI: + stmfd sp!,{lr} + + bic r0,r0,#((Z80_NMI|Z80_HALT|Z80_IF1)<<8) + strh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits + + ;@ push pc on stack + ldr r0,[cpucontext,#z80pc_base] + sub r2,z80pc,r0 + opPUSHareg r2 + + ;@ read new pc from vector address +.if UPDATE_CONTEXT + str z80pc,[cpucontext,#z80pc_pointer] +.endif + mov r0,#0x66 +.if DRZ80_XMAP + rebasepc +.else + stmfd sp!,{r3,r12} + mov lr,pc + ldr pc,[cpucontext,#z80_rebasePC] ;@ r0=new pc - external function sets z80pc_base and returns new z80pc in r0 + ldmfd sp!,{r3,r12} + mov z80pc,r0 +.endif + ldrh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits + eatcycles 11 + ldmfd sp!,{pc} + + .data .align 4 @@ -4261,10 +4294,12 @@ opcode_0_7: fetch 4 ;@EX AF,AF' opcode_0_8: - add r1,cpucontext,#z80a2 - swp z80a,z80a,[r1] - add r1,cpucontext,#z80f2 - swp z80f,z80f,[r1] + ldr r0,[cpucontext,#z80a2] + ldr r1,[cpucontext,#z80f2] + str z80a,[cpucontext,#z80a2] + str z80f,[cpucontext,#z80f2] + mov z80a,r0 + mov z80f,r1 fetch 4 ;@ADD HL,BC opcode_0_9: @@ -5303,12 +5338,15 @@ opcode_D_8: fetch 5 ;@EXX opcode_D_9: - add r1,cpucontext,#z80bc2 - swp z80bc,z80bc,[r1] - add r1,cpucontext,#z80de2 - swp z80de,z80de,[r1] - add r1,cpucontext,#z80hl2 - swp z80hl,z80hl,[r1] + ldr r0,[cpucontext,#z80bc2] + ldr r1,[cpucontext,#z80de2] + ldr r2,[cpucontext,#z80hl2] + str z80bc,[cpucontext,#z80bc2] + str z80de,[cpucontext,#z80de2] + str z80hl,[cpucontext,#z80hl2] + mov z80bc,r0 + mov z80de,r1 + mov z80hl,r2 fetch 4 ;@JP C,$+3 opcode_D_A: @@ -5615,7 +5653,7 @@ ei_return: ;@ check ints tst r0,#0xff movne r0,r0,lsr #8 - tstne r0,#1 + tstne r0,#Z80_IF1 blne DoInterrupt ;@ continue