mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
drZ80 separation finished, related bugs fixed
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@755 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
ee05564fc7
commit
d8f51995c4
5 changed files with 55 additions and 61 deletions
|
@ -14,12 +14,12 @@
|
||||||
.equiv INTERRUPT_MODE, 0 ;@0 = Use internal int handler, 1 = Use Mames int handler
|
.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, 1 ;@0 = Use mem functions for stack pointer, 1 = Use direct mem pointer
|
||||||
.equiv UPDATE_CONTEXT, 0
|
.equiv UPDATE_CONTEXT, 0
|
||||||
.equiv DRZ80_FOR_PICODRIVE, 1
|
|
||||||
.equiv DRZ80_XMAP, 1
|
.equiv DRZ80_XMAP, 1
|
||||||
.equiv DRZ80_XMAP_MORE_INLINE, 1
|
.equiv DRZ80_XMAP_MORE_INLINE, 1
|
||||||
|
|
||||||
.if DRZ80_XMAP
|
.if DRZ80_XMAP
|
||||||
.equ Z80_MEM_SHIFT, 13
|
.equ Z80_MEM_SHIFT, 13
|
||||||
|
;@ note: stack is locked in single bank that z80sp_base points to
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
.if INTERRUPT_MODE
|
.if INTERRUPT_MODE
|
||||||
|
@ -160,14 +160,14 @@ z80_xmap_read16: @ addr
|
||||||
|
|
||||||
0:
|
0:
|
||||||
@ z80_xmap_read8 will save r3 and r12 for us
|
@ z80_xmap_read8 will save r3 and r12 for us
|
||||||
stmfd sp!,{r4,r5,lr}
|
stmfd sp!,{r8,r9,lr}
|
||||||
mov r4,r0
|
mov r8,r0
|
||||||
bl z80_xmap_read8
|
bl z80_xmap_read8
|
||||||
mov r5,r0
|
mov r9,r0
|
||||||
add r0,r4,#1
|
add r0,r8,#1
|
||||||
bl z80_xmap_read8
|
bl z80_xmap_read8
|
||||||
orr r0,r5,r0,lsl #8
|
orr r0,r9,r0,lsl #8
|
||||||
ldmfd sp!,{r4,r5,pc}
|
ldmfd sp!,{r8,r9,pc}
|
||||||
|
|
||||||
z80_xmap_write16: @ data, addr
|
z80_xmap_write16: @ data, addr
|
||||||
add r2,r1,#1
|
add r2,r1,#1
|
||||||
|
@ -187,14 +187,30 @@ z80_xmap_write16: @ data, addr
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
0:
|
0:
|
||||||
stmfd sp!,{r4,r5,lr}
|
stmfd sp!,{r8,r9,lr}
|
||||||
mov r4,r0
|
mov r8,r0
|
||||||
mov r5,r1
|
mov r9,r1
|
||||||
bl z80_xmap_write8
|
bl z80_xmap_write8
|
||||||
mov r0,r4,lsr #8
|
mov r0,r8,lsr #8
|
||||||
add r1,r5,#1
|
add r1,r9,#1
|
||||||
bl z80_xmap_write8
|
bl z80_xmap_write8
|
||||||
ldmfd sp!,{r4,r5,pc}
|
ldmfd sp!,{r8,r9,pc}
|
||||||
|
|
||||||
|
z80_xmap_rebase_pc:
|
||||||
|
ldr r1,[cpucontext,#z80_read8]
|
||||||
|
mov r2,r0,lsr #Z80_MEM_SHIFT
|
||||||
|
ldr r1,[r1,r2,lsl #2]
|
||||||
|
movs r1,r1,lsl #1
|
||||||
|
strcc r1,[cpucontext,#z80pc_base]
|
||||||
|
addcc z80pc,r1,r0
|
||||||
|
bxcc lr
|
||||||
|
|
||||||
|
z80_bad_jump:
|
||||||
|
ldr r0,[cpucontext,#z80_read8]
|
||||||
|
ldr r0,[r0]
|
||||||
|
str r0,[cpucontext,#z80pc_base]
|
||||||
|
mov z80pc,r0
|
||||||
|
bx lr
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -335,10 +351,8 @@ z80_xmap_write16: @ data, addr
|
||||||
.if UPDATE_CONTEXT
|
.if UPDATE_CONTEXT
|
||||||
str z80pc,[cpucontext,#z80pc_pointer]
|
str z80pc,[cpucontext,#z80pc_pointer]
|
||||||
.endif
|
.endif
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
ldr r1,[cpucontext,#z80pc_base]
|
bl z80_xmap_rebase_pc
|
||||||
bic r0,r0,#0xfe000
|
|
||||||
add z80pc,r1,r0
|
|
||||||
.else
|
.else
|
||||||
stmfd sp!,{r3,r12}
|
stmfd sp!,{r3,r12}
|
||||||
mov lr,pc
|
mov lr,pc
|
||||||
|
@ -352,9 +366,10 @@ z80_xmap_write16: @ data, addr
|
||||||
.if UPDATE_CONTEXT
|
.if UPDATE_CONTEXT
|
||||||
str z80pc,[cpucontext,#z80pc_pointer]
|
str z80pc,[cpucontext,#z80pc_pointer]
|
||||||
.endif
|
.endif
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
bic r0,r0,#0xfe000
|
;@ XXX: SP is locked to single back z80sp_base points to.
|
||||||
ldr r1,[cpucontext,#z80sp_base]
|
ldr r1,[cpucontext,#z80sp_base]
|
||||||
|
bic r0,r0,#0x7f<<Z80_MEM_SHIFT
|
||||||
add r0,r1,r0
|
add r0,r1,r0
|
||||||
.else
|
.else
|
||||||
stmfd sp!,{r3,r12}
|
stmfd sp!,{r3,r12}
|
||||||
|
@ -722,22 +737,9 @@ z80_xmap_write16: @ data, addr
|
||||||
|
|
||||||
.macro opPOP
|
.macro opPOP
|
||||||
.if FAST_Z80SP
|
.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 r2,[cpucontext,#z80sp_base]
|
|
||||||
ldrb r0,[z80sp],#1
|
|
||||||
add r2,r2,#0x2000
|
|
||||||
cmp z80sp,r2
|
|
||||||
@ subge z80sp,z80sp,#0x2000 @ unstable?
|
|
||||||
ldrb r1,[z80sp],#1
|
|
||||||
cmp z80sp,r2
|
|
||||||
@ subge z80sp,z80sp,#0x2000
|
|
||||||
orr r0,r0,r1, lsl #8
|
|
||||||
.else
|
|
||||||
ldrb r0,[z80sp],#1
|
ldrb r0,[z80sp],#1
|
||||||
ldrb r1,[z80sp],#1
|
ldrb r1,[z80sp],#1
|
||||||
orr r0,r0,r1, lsl #8
|
orr r0,r0,r1, lsl #8
|
||||||
.endif
|
|
||||||
.else
|
.else
|
||||||
mov r0,z80sp
|
mov r0,z80sp
|
||||||
readmem16
|
readmem16
|
||||||
|
@ -752,23 +754,22 @@ z80_xmap_write16: @ data, addr
|
||||||
.endm
|
.endm
|
||||||
;@---------------------------------------
|
;@---------------------------------------
|
||||||
|
|
||||||
|
.macro stack_check
|
||||||
|
@ try to protect against stack overflows, lock into current bank
|
||||||
|
ldr r1,[cpucontext,#z80sp_base]
|
||||||
|
sub r1,z80sp,r1
|
||||||
|
cmp r1,#2
|
||||||
|
addlt z80sp,z80sp,#1<<Z80_MEM_SHIFT
|
||||||
|
.endm
|
||||||
|
|
||||||
.macro opPUSHareg reg @ reg > r1
|
.macro opPUSHareg reg @ reg > r1
|
||||||
.if FAST_Z80SP
|
.if FAST_Z80SP
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
@ notaz: try to protect against stack overflows, which tend to happen in Picodrive because of poor timing
|
stack_check
|
||||||
ldr r0,[cpucontext,#z80sp_base]
|
.endif
|
||||||
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
|
|
||||||
mov r1,\reg, lsr #8
|
mov r1,\reg, lsr #8
|
||||||
strb r1,[z80sp,#-1]!
|
strb r1,[z80sp,#-1]!
|
||||||
strb \reg,[z80sp,#-1]!
|
strb \reg,[z80sp,#-1]!
|
||||||
.endif
|
|
||||||
.else
|
.else
|
||||||
mov r0,\reg
|
mov r0,\reg
|
||||||
sub z80sp,z80sp,#2
|
sub z80sp,z80sp,#2
|
||||||
|
@ -779,22 +780,13 @@ z80_xmap_write16: @ data, addr
|
||||||
|
|
||||||
.macro opPUSHreg reg
|
.macro opPUSHreg reg
|
||||||
.if FAST_Z80SP
|
.if FAST_Z80SP
|
||||||
.if DRZ80_FOR_PICODRIVE
|
.if DRZ80_XMAP
|
||||||
ldr r0,[cpucontext,#z80sp_base]
|
stack_check
|
||||||
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
|
|
||||||
mov r1,\reg, lsr #24
|
|
||||||
strb r1,[z80sp,#-1]!
|
|
||||||
mov r1,\reg, lsr #16
|
|
||||||
strb r1,[z80sp,#-1]!
|
|
||||||
.endif
|
.endif
|
||||||
|
mov r1,\reg, lsr #24
|
||||||
|
strb r1,[z80sp,#-1]!
|
||||||
|
mov r1,\reg, lsr #16
|
||||||
|
strb r1,[z80sp,#-1]!
|
||||||
.else
|
.else
|
||||||
mov r0,\reg,lsr #16
|
mov r0,\reg,lsr #16
|
||||||
sub z80sp,z80sp,#2
|
sub z80sp,z80sp,#2
|
||||||
|
|
|
@ -1711,6 +1711,7 @@ PICO_INTERNAL void PicoMemSetupCD(void)
|
||||||
#ifdef EMU_M68K
|
#ifdef EMU_M68K
|
||||||
m68k_mem_setup_cd();
|
m68k_mem_setup_cd();
|
||||||
#endif
|
#endif
|
||||||
|
z80_mem_setup();
|
||||||
|
|
||||||
// m68k_poll_addr = m68k_poll_cnt = 0;
|
// m68k_poll_addr = m68k_poll_cnt = 0;
|
||||||
s68k_poll_adclk = s68k_poll_cnt = 0;
|
s68k_poll_adclk = s68k_poll_cnt = 0;
|
||||||
|
|
|
@ -514,7 +514,6 @@ PICO_INTERNAL void PicoMemResetHooks(void)
|
||||||
PicoWrite16Hook = OtherWrite16End;
|
PicoWrite16Hook = OtherWrite16End;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void z80_mem_setup(void);
|
|
||||||
#ifdef EMU_M68K
|
#ifdef EMU_M68K
|
||||||
static void m68k_mem_setup(void);
|
static void m68k_mem_setup(void);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1066,7 +1065,7 @@ static void z80_md_out(unsigned short p, unsigned char d)
|
||||||
elprintf(EL_ANOMALY, "Z80 port %04x write %02x", p, d);
|
elprintf(EL_ANOMALY, "Z80 port %04x write %02x", p, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void z80_mem_setup(void)
|
void z80_mem_setup(void)
|
||||||
{
|
{
|
||||||
z80_map_set(z80_read_map, 0x0000, 0x1fff, Pico.zram, 0);
|
z80_map_set(z80_read_map, 0x0000, 0x1fff, Pico.zram, 0);
|
||||||
z80_map_set(z80_read_map, 0x2000, 0x3fff, Pico.zram, 0);
|
z80_map_set(z80_read_map, 0x2000, 0x3fff, Pico.zram, 0);
|
||||||
|
|
|
@ -427,6 +427,7 @@ PICO_INTERNAL_ASM void PicoMemReset(void);
|
||||||
PICO_INTERNAL void PicoMemResetHooks(void);
|
PICO_INTERNAL void PicoMemResetHooks(void);
|
||||||
PICO_INTERNAL int PadRead(int i);
|
PICO_INTERNAL int PadRead(int i);
|
||||||
PICO_INTERNAL int ym2612_write_local(unsigned int a, unsigned int d, int is_from_z80);
|
PICO_INTERNAL int ym2612_write_local(unsigned int a, unsigned int d, int is_from_z80);
|
||||||
|
void z80_mem_setup(void);
|
||||||
extern unsigned int (*PicoRead16Hook)(unsigned int a, int realsize);
|
extern unsigned int (*PicoRead16Hook)(unsigned int a, int realsize);
|
||||||
extern void (*PicoWrite8Hook) (unsigned int a,unsigned int d,int realsize);
|
extern void (*PicoWrite8Hook) (unsigned int a,unsigned int d,int realsize);
|
||||||
extern void (*PicoWrite16Hook)(unsigned int a,unsigned int d,int realsize);
|
extern void (*PicoWrite16Hook)(unsigned int a,unsigned int d,int realsize);
|
||||||
|
|
|
@ -118,6 +118,7 @@ PICO_INTERNAL void z80_reset(void)
|
||||||
drZ80.Z80IM = 0; // 1?
|
drZ80.Z80IM = 0; // 1?
|
||||||
drZ80.z80irqvector = 0xff0000; // RST 38h
|
drZ80.z80irqvector = 0xff0000; // RST 38h
|
||||||
drZ80.Z80PC_BASE = drZ80.Z80PC = z80_read_map[0] << 1;
|
drZ80.Z80PC_BASE = drZ80.Z80PC = z80_read_map[0] << 1;
|
||||||
|
// drZ80 is locked in single bank
|
||||||
drZ80.Z80SP_BASE = z80_read_map[0] << 1;
|
drZ80.Z80SP_BASE = z80_read_map[0] << 1;
|
||||||
// drZ80.Z80SP = drZ80.z80_rebaseSP(0x2000); // 0xf000 ?
|
// drZ80.Z80SP = drZ80.z80_rebaseSP(0x2000); // 0xf000 ?
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue