X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2FDrZ80%2Fdrz80.s;h=08f8a19eae65df792ad12405614b05141de1e882;hb=460603fa8119a41192ebdc7012d120f6263a2bce;hp=846c6362b2640f3056e80b720c8157523dfd6635;hpb=de89bf45d7b961e63abdffa79962e9951e8bf432;p=picodrive.git diff --git a/cpu/DrZ80/drz80.s b/cpu/DrZ80/drz80.s index 846c636..08f8a19 100644 --- a/cpu/DrZ80/drz80.s +++ b/cpu/DrZ80/drz80.s @@ -11,29 +11,28 @@ .global DrZ80Run .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 UPDATE_CONTEXT, 0 - .equiv DRZ80_FOR_PICODRIVE, 1 + .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 UPDATE_CONTEXT, 0 + .equiv DRZ80_XMAP, 1 + .equiv DRZ80_XMAP_MORE_INLINE, 1 + +.if DRZ80_XMAP + .equ Z80_MEM_SHIFT, 13 + ;@ note: stack is locked in single bank that z80sp_base points to +.endif .if INTERRUPT_MODE .extern Interrupt .endif -.if DRZ80_FOR_PICODRIVE - .extern PicoRead8 - .extern Pico - .extern z80_write - .extern ym2612_read_local_z80 -.endif - DrZ80Ver: .long 0x0001 ;@ --------------------------- Defines ---------------------------- ;@ Make sure that regs/pointers for z80pc to z80sp match up! - opcodes .req r3 - z80_icount .req r4 + z80_icount .req r3 + opcodes .req r4 cpucontext .req r5 z80pc .req r6 z80a .req r7 @@ -104,139 +103,117 @@ DrZ80Ver: .long 0x0001 .text -.if DRZ80_FOR_PICODRIVE - -pico_z80_read8: @ addr - cmp r0,#0x2000 @ Z80 RAM - ldrlt r1,[cpucontext,#z80sp_base] - ldrltb r0,[r1,r0] - bxlt lr - - cmp r0,#0x8000 @ 68k bank - blt 1f - ldr r2,=(Pico+0x22212) - ldrh r1,[r2] - bic r0,r0,#0x3f8000 - orr r0,r0,r1,lsl #15 - ldr r1,[r2,#-0xe] @ ROM size - cmp r0,r1 - ldrlt r1,[r2,#-0x12] @ ROM - eorlt r0,r0,#1 @ our ROM is byteswapped - ldrltb r0,[r1,r0] - bxlt lr - stmfd sp!,{r3,r12,lr} - bl PicoRead8 - ldmfd sp!,{r3,r12,pc} -1: - mov r1,r0,lsr #13 - cmp r1,#2 @ YM2612 (0x4000-0x5fff) - bne 0f - and r0,r0,#3 - stmfd sp!,{r3,r12,lr} +.if DRZ80_XMAP + +z80_xmap_read8: @ addr + ldr r1,[cpucontext,#z80_read8] + mov r2,r0,lsr #Z80_MEM_SHIFT + ldr r1,[r1,r2,lsl #2] + movs r1,r1,lsl #1 + ldrccb r0,[r1,r0] + bxcc lr + +z80_xmap_read8_handler: @ addr, func str z80_icount,[cpucontext,#cycles_pointer] - bl ym2612_read_local_z80 - ldmfd sp!,{r3,r12,pc} -0: - cmp r0,#0x4000 - movge r0,#0xff - bxge lr - ldr r1,[cpucontext,#z80sp_base] - bic r0,r0,#0x0fe000 @ Z80 RAM (mirror) - ldrb r0,[r1,r0] - bx lr + stmfd sp!,{r12,lr} + mov lr,pc + bx r1 + ldr z80_icount,[cpucontext,#cycles_pointer] + ldmfd sp!,{r12,pc} + +z80_xmap_write8: @ data, addr + ldr r2,[cpucontext,#z80_write8] + add r2,r2,r1,lsr #Z80_MEM_SHIFT-2 + bic r2,r2,#3 + ldr r2,[r2] + movs r2,r2,lsl #1 + strccb r0,[r2,r1] + bxcc lr + +z80_xmap_write8_handler: @ data, addr, func + str z80_icount,[cpucontext,#cycles_pointer] + mov r3,r0 + mov r0,r1 + mov r1,r3 + stmfd sp!,{r12,lr} + mov lr,pc + bx r2 + ldr z80_icount,[cpucontext,#cycles_pointer] + ldmfd sp!,{r12,pc} + +z80_xmap_read16: @ addr + @ check if we cross bank boundary + add r1,r0,#1 + 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 @@ -803,22 +780,13 @@ pico_z80_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 @@ -829,14 +797,13 @@ pico_z80_write16: @ data, addr ;@--------------------------------------- .macro opRESmemHL bit -.if DRZ80_FOR_PICODRIVE mov r0,z80hl, lsr #16 - bl pico_z80_read8 +.if DRZ80_XMAP + bl z80_xmap_read8 bic r0,r0,#1<<\bit mov r1,z80hl, lsr #16 - bl pico_z80_write8 + bl z80_xmap_write8 .else - mov r0,z80hl, lsr #16 stmfd sp!,{r3,r12} mov lr,pc ldr pc,[cpucontext,#z80_read8] ;@ r0 = addr - data returned in r0 @@ -851,12 +818,12 @@ pico_z80_write16: @ data, addr ;@--------------------------------------- .macro opRESmem bit -.if DRZ80_FOR_PICODRIVE +.if DRZ80_XMAP stmfd sp!,{r0} ;@ save addr as well - bl pico_z80_read8 + bl z80_xmap_read8 bic r0,r0,#1<<\bit ldmfd sp!,{r1} ;@ restore addr into r1 - bl pico_z80_write8 + bl z80_xmap_write8 .else stmfd sp!,{r3,r12} stmfd sp!,{r0} ;@ save addr as well @@ -1111,14 +1078,13 @@ pico_z80_write16: @ data, addr ;@--------------------------------------- .macro opSETmemHL bit -.if DRZ80_FOR_PICODRIVE mov r0,z80hl, lsr #16 - bl pico_z80_read8 +.if DRZ80_XMAP + bl z80_xmap_read8 orr r0,r0,#1<<\bit mov r1,z80hl, lsr #16 - bl pico_z80_write8 + bl z80_xmap_write8 .else - mov r0,z80hl, lsr #16 stmfd sp!,{r3,r12} mov lr,pc ldr pc,[cpucontext,#z80_read8] ;@ r0 = addr - data returned in r0 @@ -1133,12 +1099,12 @@ pico_z80_write16: @ data, addr ;@--------------------------------------- .macro opSETmem bit -.if DRZ80_FOR_PICODRIVE +.if DRZ80_XMAP stmfd sp!,{r0} ;@ save addr as well - bl pico_z80_read8 + bl z80_xmap_read8 orr r0,r0,#1<<\bit ldmfd sp!,{r1} ;@ restore addr into r1 - bl pico_z80_write8 + bl z80_xmap_write8 .else stmfd sp!,{r3,r12} stmfd sp!,{r0} ;@ save addr as well @@ -1502,23 +1468,18 @@ DoInterrupt_mode2: orr r0,r0,r1,lsr#16 ;@ read new pc from vector address -.if DRZ80_FOR_PICODRIVE - bl pico_z80_read16 - bic r0,r0,#0xfe000 - ldr r1,[cpucontext,#z80pc_base] - add z80pc,r1,r0 .if UPDATE_CONTEXT str z80pc,[cpucontext,#z80pc_pointer] .endif +.if DRZ80_XMAP + bl z80_xmap_read16 + rebasepc .else stmfd sp!,{r3,r12} mov lr,pc ldr pc,[cpucontext,#z80_read16] ;@ rebase new pc -.if UPDATE_CONTEXT - str z80pc,[cpucontext,#z80pc_pointer] -.endif 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}