mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 23:37:46 -04:00
optimizations, fixes, hacks, psp, ...
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@295 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
8022f53da6
commit
b542be4686
37 changed files with 928 additions and 548 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue