optimizations, fixes, hacks, psp, ...

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@295 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2007-11-15 23:01:20 +00:00
parent 8022f53da6
commit b542be4686
37 changed files with 928 additions and 548 deletions

View file

@ -21,14 +21,10 @@
.endif
.if DRZ80_FOR_PICODRIVE
.include "port_config.s"
.extern YM2612Read_
.if EXTERNAL_YM2612
.extern YM2612Read_940
.endif
.extern PicoRead8
.extern Pico
.extern z80_write
.extern ym2612_st
.endif
DrZ80Ver: .long 0x0001
@ -111,37 +107,18 @@ DrZ80Ver: .long 0x0001
.if DRZ80_FOR_PICODRIVE
.macro YM2612Read_and_ret8
stmfd sp!,{r3,r12,lr}
.if EXTERNAL_YM2612
ldr r1,=PicoOpt
ldr r1,[r1]
tst r1,#0x200
ldrne r2, =YM2612Read_940
ldreq r2, =YM2612Read_
mov lr,pc
bx r2
.else
bl YM2612Read_
.endif
ldmfd sp!,{r3,r12,pc}
ldr r0, =ym2612_st
ldr r0, [r0]
ldrb r0, [r0, #0x11] ;@ ym2612_st->status
bx lr
.endm
.macro YM2612Read_and_ret16
stmfd sp!,{r3,r12,lr}
.if EXTERNAL_YM2612
ldr r0,=PicoOpt
ldr r0,[r0]
tst r0,#0x200
ldrne r2, =YM2612Read_940
ldreq r2, =YM2612Read_
mov lr,pc
bx r2
ldr r0, =ym2612_st
ldr r0, [r0]
ldrb r0, [r0, #0x11] ;@ ym2612_st->status
orr r0,r0,r0,lsl #8
.else
bl YM2612Read_
orr r0,r0,r0,lsl #8
.endif
ldmfd sp!,{r3,r12,pc}
bx lr
.endm
pico_z80_read8: @ addr
@ -214,13 +191,13 @@ pico_z80_read16: @ addr
add r0,r4,#1
bl PicoRead8
orr r0,r5,r0,lsl #8
ldmfd sp!,{r3-r5,r12,pc}
ldmfd sp!,{r3-r5,r12,pc}
1:
mov r1,r0,lsr #13
cmp r1,#2 @ YM2612 (0x4000-0x5fff)
bne 0f
and r0,r0,#3
YM2612Read_and_ret16
YM2612Read_and_ret16
0:
cmp r0,#0x4000
movge r0,#0xff

View file

@ -13,6 +13,10 @@
#include <string.h>
#include "cz80.h"
#if PICODRIVE_HACKS
#include <Pico/PicoInt.h>
#endif
#ifndef ALIGN_DATA
#define ALIGN_DATA __attribute__((aligned(4)))
#endif
@ -203,6 +207,13 @@ void Cz80_Reset(cz80_struc *CPU)
Cz80_Set_Reg(CPU, CZ80_PC, 0);
}
/* */
#if PICODRIVE_HACKS
static inline unsigned char picodrive_read(unsigned short a)
{
return (a < 0x4000) ? Pico.zram[a&0x1fff] : z80_read(a);
}
#endif
/*--------------------------------------------------------
CPUŽÀ<EFBFBD>s

View file

@ -52,6 +52,7 @@ extern "C" {
#define CZ80_FETCH_SFT (16 - CZ80_FETCH_BITS)
#define CZ80_FETCH_BANK (1 << CZ80_FETCH_BITS)
#define PICODRIVE_HACKS 1
#define CZ80_LITTLE_ENDIAN 1
#define CZ80_USE_JUMPTABLE 1
#define CZ80_BIG_FLAGS_ARRAY 1

View file

@ -57,7 +57,11 @@
//#ifndef BUILD_CPS1PSP
//#define READ_MEM8(A) memory_region_cpu2[(A)]
//#else
#if PICODRIVE_HACKS
#define READ_MEM8(A) picodrive_read(A)
#else
#define READ_MEM8(A) CPU->Read_Byte(A)
#endif
//#endif
#if CZ80_LITTLE_ENDIAN
#define READ_MEM16(A) (READ_MEM8(A) | (READ_MEM8((A) + 1) << 8))
@ -65,7 +69,16 @@
#define READ_MEM16(A) ((READ_MEM8(A) << 8) | READ_MEM8((A) + 1))
#endif
#if PICODRIVE_HACKS
#define WRITE_MEM8(A, D) { \
unsigned short a = A; \
unsigned char d = D; \
if (a < 0x4000) Pico.zram[a&0x1fff] = d; \
else z80_write(a, d); \
}
#else
#define WRITE_MEM8(A, D) CPU->Write_Byte(A, D);
#endif
#if CZ80_LITTLE_ENDIAN
#define WRITE_MEM16(A, D) { WRITE_MEM8(A, D); WRITE_MEM8((A) + 1, (D) >> 8); }
#else

View file

@ -16,8 +16,8 @@
// Options //
#define FAMEC_ROLL_INLINE
#define FAMEC_EMULATE_TRACE
#define FAMEC_CHECK_BRANCHES
//#define FAMEC_EMULATE_TRACE
//#define FAMEC_CHECK_BRANCHES
#define FAMEC_EXTRA_INLINE
// #define FAMEC_DEBUG
//#define FAMEC_NO_GOTOS
@ -280,11 +280,18 @@ typedef signed int s32;
((u32)PC - BasePC)
#ifdef FAMEC_CHECK_BRANCHES
#define FORCE_ALIGNMENT(pc)
#else
#define FORCE_ALIGNMENT(pc) pc&=~1;
#endif
#ifndef FAMEC_32BIT_PC
#define SET_PC(A) \
{ \
u32 pc = A; \
FORCE_ALIGNMENT(pc); \
BasePC = m68kcontext.Fetch[(pc >> M68K_FETCHSFT) & M68K_FETCHMASK]; \
PC = (u16*)((pc & M68K_ADR_MASK) + BasePC); \
}
@ -294,6 +301,7 @@ typedef signed int s32;
#define SET_PC(A) \
{ \
u32 pc = A; \
FORCE_ALIGNMENT(pc); \
BasePC = m68kcontext.Fetch[(pc >> M68K_FETCHSFT) & M68K_FETCHMASK]; \
BasePC -= pc & 0xFF000000; \
PC = (u16*)(pc + BasePC); \
@ -734,7 +742,9 @@ static FAMEC_EXTRA_INLINE u32 execute_exception(s32 vect, u32 oldPC, u32 oldSR)
#ifndef FAMEC_32BIT_PC
newPC&=M68K_ADR_MASK
#endif
#ifdef FAMEC_CHECK_BRANCHES
newPC&=~1; // don't crash on games with bad vector tables
#endif
// SET_PC(newPC)
@ -948,6 +958,7 @@ famec_End:
#ifdef PICODRIVE_HACK
dualcore_mode:
while (1)
{
extern int SekCycleAim, SekCycleCnt, SekCycleAimS68k, SekCycleCntS68k;
#define PS_STEP_M68K ((488<<16)/20) // ~24
@ -989,7 +1000,6 @@ dualcore_mode:
}
cycles = m68kcontext.io_cycle_counter = 0;
}
goto dualcore_mode;
}
#endif