X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2FDrZ80%2Fdrz80.s;h=c2a64df3f9157a50f3187c861ba5331a688884fe;hb=49c8aa78d9e28562f8c5fd0ce90cc7ecde2b2bba;hp=5445ffd08cab973552e071cfdbddd40487006c8e;hpb=ee05564fc7644a035ceeedba61975e46ce84af48;p=picodrive.git diff --git a/cpu/DrZ80/drz80.s b/cpu/DrZ80/drz80.s index 5445ffd..c2a64df 100644 --- a/cpu/DrZ80/drz80.s +++ b/cpu/DrZ80/drz80.s @@ -12,9 +12,8 @@ .global DrZ80Ver .equiv INTERRUPT_MODE, 0 ;@0 = Use internal int handler, 1 = Use Mames int handler - .equiv FAST_Z80SP, 1 ;@0 = Use mem functions for stack pointer, 1 = Use direct mem pointer + .equiv FAST_Z80SP, 0 ;@0 = Use mem functions for stack pointer, 1 = Use direct mem pointer .equiv UPDATE_CONTEXT, 0 - .equiv DRZ80_FOR_PICODRIVE, 1 .equiv DRZ80_XMAP, 1 .equiv DRZ80_XMAP_MORE_INLINE, 1 @@ -98,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 ;@--------------------------------------- @@ -144,7 +144,7 @@ z80_xmap_write8_handler: @ data, addr, func z80_xmap_read16: @ addr @ check if we cross bank boundary add r1,r0,#1 - eor r1,r0,r0 + eor r1,r1,r0 tst r1,#1< r1 .if FAST_Z80SP -.if DRZ80_FOR_PICODRIVE - @ notaz: try to protect against stack overflows, which tend to happen in Picodrive because of poor timing - ldr r0,[cpucontext,#z80sp_base] - cmp z80sp,r0 - addle z80sp,z80sp,#0x2000 - mov r1,\reg, lsr #8 - strb r1,[z80sp,#-1]! - cmp z80sp,r0 - addle z80sp,z80sp,#0x2000 - strb \reg,[z80sp,#-1]! -.else +.if DRZ80_XMAP + stack_check +.endif mov r1,\reg, lsr #8 strb r1,[z80sp,#-1]! strb \reg,[z80sp,#-1]! -.endif .else mov r0,\reg sub z80sp,z80sp,#2 @@ -779,22 +798,13 @@ z80_xmap_write16: @ data, addr .macro opPUSHreg reg .if FAST_Z80SP -.if DRZ80_FOR_PICODRIVE - ldr r0,[cpucontext,#z80sp_base] - cmp z80sp,r0 - addle z80sp,z80sp,#0x2000 - mov r1,\reg, lsr #24 - strb r1,[z80sp,#-1]! - cmp z80sp,r0 - addle z80sp,z80sp,#0x2000 - mov r1,\reg, lsr #16 - strb r1,[z80sp,#-1]! -.else +.if DRZ80_XMAP + stack_check +.endif mov r1,\reg, lsr #24 strb r1,[z80sp,#-1]! mov r1,\reg, lsr #16 strb r1,[z80sp,#-1]! -.endif .else mov r0,\reg,lsr #16 sub z80sp,z80sp,#2 @@ -1352,9 +1362,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 @@ -1508,6 +1520,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 @@ -4254,10 +4296,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: @@ -4500,7 +4544,6 @@ opcode_3_1: .if FAST_Z80SP orr r0,r0,r1, lsl #8 rebasesp - mov z80sp,r0 .else orr z80sp,r0,r1, lsl #8 .endif @@ -5297,12 +5340,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: @@ -5575,7 +5621,6 @@ opcode_F_9: .if FAST_Z80SP mov r0,z80hl, lsr #16 rebasesp - mov z80sp,r0 .else mov z80sp,z80hl, lsr #16 .endif @@ -5610,7 +5655,7 @@ ei_return: ;@ check ints tst r0,#0xff movne r0,r0,lsr #8 - tstne r0,#1 + tstne r0,#Z80_IF1 blne DoInterrupt ;@ continue @@ -6721,7 +6766,8 @@ opcode_DD_2E: opcode_DD_34: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 stmfd sp!,{r0} ;@ save addr readmem8 opINC8b @@ -6732,7 +6778,8 @@ opcode_DD_34: opcode_DD_35: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 stmfd sp!,{r0} ;@ save addr readmem8 opDEC8b @@ -6744,7 +6791,8 @@ opcode_DD_36: ldrsb r2,[z80pc],#1 ldrb r0,[z80pc],#1 ldr r1,[z80xx] - add r1,r2,r1, lsr #16 + add r1,r1,r2, lsl #16 + mov r1,r1,lsr #16 writemem8 fetch 19 ;@ADD IX,SP @@ -6775,7 +6823,8 @@ opcode_DD_45: opcode_DD_46: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 and z80bc,z80bc,#0xFF<<16 orr z80bc,z80bc,r0, lsl #24 @@ -6796,7 +6845,8 @@ opcode_DD_4D: opcode_DD_4E: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 and z80bc,z80bc,#0xFF<<24 orr z80bc,z80bc,r0, lsl #16 @@ -6818,7 +6868,8 @@ opcode_DD_55: opcode_DD_56: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 and z80de,z80de,#0xFF<<16 orr z80de,z80de,r0, lsl #24 @@ -6839,7 +6890,8 @@ opcode_DD_5D: opcode_DD_5E: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 and z80de,z80de,#0xFF<<24 orr z80de,z80de,r0, lsl #16 @@ -6876,7 +6928,8 @@ opcode_DD_65: opcode_DD_66: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 and z80hl,z80hl,#0xFF<<16 orr z80hl,z80hl,r0, lsl #24 @@ -6918,7 +6971,8 @@ opcode_DD_6D: opcode_DD_6E: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 and z80hl,z80hl,#0xFF<<24 orr z80hl,z80hl,r0, lsl #16 @@ -6933,7 +6987,8 @@ opcode_DD_6F: opcode_DD_70: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r1,r0,r1, lsr #16 + add r1,r1,r0, lsl #16 + mov r1,r1,lsr #16 mov r0,z80bc, lsr #24 writemem8 fetch 19 @@ -6941,7 +6996,8 @@ opcode_DD_70: opcode_DD_71: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r1,r0,r1, lsr #16 + add r1,r1,r0, lsl #16 + mov r1,r1,lsr #16 mov r0,z80bc, lsr #16 and r0,r0,#0xFF writemem8 @@ -6950,7 +7006,8 @@ opcode_DD_71: opcode_DD_72: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r1,r0,r1, lsr #16 + add r1,r1,r0, lsl #16 + mov r1,r1,lsr #16 mov r0,z80de, lsr #24 writemem8 fetch 19 @@ -6958,7 +7015,8 @@ opcode_DD_72: opcode_DD_73: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r1,r0,r1, lsr #16 + add r1,r1,r0, lsl #16 + mov r1,r1,lsr #16 mov r0,z80de, lsr #16 and r0,r0,#0xFF writemem8 @@ -6967,7 +7025,8 @@ opcode_DD_73: opcode_DD_74: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r1,r0,r1, lsr #16 + add r1,r1,r0, lsl #16 + mov r1,r1,lsr #16 mov r0,z80hl, lsr #24 writemem8 fetch 19 @@ -6975,7 +7034,8 @@ opcode_DD_74: opcode_DD_75: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r1,r0,r1, lsr #16 + add r1,r1,r0, lsl #16 + mov r1,r1,lsr #16 mov r0,z80hl, lsr #16 and r0,r0,#0xFF writemem8 @@ -6984,7 +7044,8 @@ opcode_DD_75: opcode_DD_77: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r1,r0,r1, lsr #16 + add r1,r1,r0, lsl #16 + mov r1,r1,lsr #16 mov r0,z80a, lsr #24 writemem8 fetch 19 @@ -7003,7 +7064,8 @@ opcode_DD_7D: opcode_DD_7E: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 mov z80a,r0, lsl #24 fetch 19 @@ -7022,7 +7084,8 @@ opcode_DD_85: opcode_DD_86: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 opADDb fetch 19 @@ -7041,7 +7104,8 @@ opcode_DD_8D: opcode_DD_8E: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 opADCb fetch 19 @@ -7060,7 +7124,8 @@ opcode_DD_95: opcode_DD_96: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 opSUBb fetch 19 @@ -7079,7 +7144,8 @@ opcode_DD_9D: opcode_DD_9E: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 opSBCb fetch 19 @@ -7098,7 +7164,8 @@ opcode_DD_A5: opcode_DD_A6: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 opANDb fetch 19 @@ -7117,7 +7184,8 @@ opcode_DD_AD: opcode_DD_AE: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 opXORb fetch 19 @@ -7136,7 +7204,8 @@ opcode_DD_B5: opcode_DD_B6: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 opORb fetch 19 @@ -7155,7 +7224,8 @@ opcode_DD_BD: opcode_DD_BE: ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 readmem8 opCPb fetch 19 @@ -7167,7 +7237,8 @@ opcode_DD_CB: ;@moves the PC to the location of the subroutine ldrsb r0,[z80pc],#1 ldr r1,[z80xx] - add r0,r0,r1, lsr #16 + add r0,r1,r0, lsl #16 + mov r0,r0,lsr #16 ldrb r1,[z80pc],#1 ldr pc,[pc,r1, lsl #2] @@ -7415,7 +7486,6 @@ opcode_DD_F9: .if FAST_Z80SP ldrh r0,[z80xx,#2] rebasesp - mov z80sp,r0 .else ldrh z80sp,[z80xx,#2] .endif @@ -7753,8 +7823,9 @@ opcode_ED_7B: readmem16 .if FAST_Z80SP rebasesp -.endif +.else mov z80sp,r0 +.endif fetch 20 ;@LDI opcode_ED_A0: