Merge pull request #36 from Oggom/master

Sync with main repo
This commit is contained in:
Twinaphex 2016-01-17 17:43:37 +01:00
commit d12d072ef9
45 changed files with 9348 additions and 546 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
psp2/*.o
psp2/*.elf
psp2/*.velf
psp2/build_vita/*
psp2/*.a

View File

@ -3,7 +3,7 @@
Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
---------------------------------------------------------------------------------------------------------
[Core/General]
[Core/Misc]
---------------
* added optional dynamic allocation of cartridge/CD hardware buffer (for platforms with BSS size limitation)
* improved frame emulation timing, now starts with vertical blanking to reduce input lag by one more frame
@ -40,6 +40,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
* added support for some new unlicensed games with copy protection (Thunderbolt II, Tom Clown, Chaoji Puke / Super Poker)
* added support for Everdrive extended SSF mapper
* improved console region auto-detection for a few PAL-only games (The Smurfs Travel the World & Williams Arcade's Greatest Hits)
* improved I2C EEPROM boards emulation accuracy
* fixed Game Genie / Pro Action Replay lock-on support when Mega CD hardware is enabled
* fixed SRAM support in Triple Play 96 & Triple Play - Gold Edition
* fixed automatic CD loading with .md ROM files
@ -80,6 +81,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
* added support for XE-1AP controller on both ports
* improved XE-1AP controller emulation
* improved HVC latch behavior for gun emulation (fixes "Gunfight - 3 in 1" randomization when using Justifier)
* improved control pad emulation accuracy (verified on real hardware)
* fixed TeamPlayer emulation (fixes multitap detection in Gauntlet 4)
[Core/VDP]
@ -136,6 +138,10 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
---------------
* added GCW Zero port by Shin-NiL & David Knight (based on SDL port)
[PSP2]
---------------
* added PS VITA port by frangarcj
[libretro]
---------------
* added optional bootrom support for Master System, Game Gear & Mega Drive / Genesis

View File

@ -27,7 +27,7 @@ INCLUDES := core core/m68k core/z80 core/sound core/tremor core/ntsc core/input_
# options for code generation
#---------------------------------------------------------------------------------
CFLAGS = -O3 -fomit-frame-pointer --param large-function-growth=800 --param inline-unit-growth=200 -Wall -Winline -Wno-strict-aliasing $(MACHDEP) $(INCLUDE) -DUSE_LIBTREMOR -DDISABLE_MANY_OGG_OPEN_FILES -DUSE_16BPP_RENDERING -DALT_RENDERER
CFLAGS = -O3 -fomit-frame-pointer -Wall -Wno-strict-aliasing $(MACHDEP) $(INCLUDE) -DUSE_LIBTREMOR -DDISABLE_MANY_OGG_OPEN_FILES -DUSE_16BPP_RENDERING -DALT_RENDERER
CXXFLAGS = $(CFLAGS)
LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map

View File

@ -27,7 +27,7 @@ INCLUDES := core core/m68k core/z80 core/sound core/tremor core/ntsc core/input_
# options for code generation
#---------------------------------------------------------------------------------
CFLAGS = -O3 -fomit-frame-pointer --param large-function-growth=800 --param inline-unit-growth=200 -Wall -Winline -Wno-strict-aliasing $(MACHDEP) $(INCLUDE) -DUSE_LIBTREMOR -DUSE_16BPP_RENDERING -DALT_RENDERER -DHW_RVL
CFLAGS = -O3 -fomit-frame-pointer -Wall -Wno-strict-aliasing $(MACHDEP) $(INCLUDE) -DUSE_LIBTREMOR -DUSE_16BPP_RENDERING -DALT_RENDERER -DHW_RVL
CXXFLAGS = $(CFLAGS)
LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map,-wrap,wiiuse_set_ir,-wrap,wiiuse_handshake,-wrap,classic_ctrl_handshake,-wrap,classic_ctrl_event

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 MiB

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 MiB

After

Width:  |  Height:  |  Size: 3.3 MiB

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,8 @@
/****************************************************************************
* Genesis Plus
* I2C Serial EEPROM (24Cxx) support
* I2C Serial EEPROM (24Cxx) boards
*
* Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX)
* Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:

View File

@ -321,6 +321,9 @@ void md_cart_init(void)
/* ROM is mirrored each 2^k bytes */
cart.mask = size - 1;
/* no special external hardware required by default */
cart.special = 0;
/**********************************************
DEFAULT CARTRIDGE MAPPING
***********************************************/
@ -375,7 +378,7 @@ void md_cart_init(void)
/* external SRAM */
if (sram.on && !sram.custom)
{
/* initialize m68k bus handlers */
/* initialize default memory mapping for SRAM */
m68k.memory_map[sram.start >> 16].base = sram.sram;
m68k.memory_map[sram.start >> 16].read8 = sram_read_byte;
m68k.memory_map[sram.start >> 16].read16 = sram_read_word;
@ -405,38 +408,6 @@ void md_cart_init(void)
m68k.memory_map[0x3a].read16 = svp_read_cell_2;
}
/**********************************************
J-CART
***********************************************/
cart.special = 0;
if ((strstr(rominfo.product,"00000000") && (rominfo.checksum == 0x168b)) || /* Super Skidmarks, Micro Machines Military */
(strstr(rominfo.product,"00000000") && (rominfo.checksum == 0x165e)) || /* Pete Sampras Tennis (1991), Micro Machines 96 */
(strstr(rominfo.product,"00000000") && (rominfo.checksum == 0xcee0)) || /* Micro Machines Military (bad) */
(strstr(rominfo.product,"00000000") && (rominfo.checksum == 0x2c41)) || /* Micro Machines 96 (bad) */
(strstr(rominfo.product,"XXXXXXXX") && (rominfo.checksum == 0xdf39)) || /* Sampras Tennis 96 */
(strstr(rominfo.product,"T-123456") && (rominfo.checksum == 0x1eae)) || /* Sampras Tennis 96 */
(strstr(rominfo.product,"T-120066") && (rominfo.checksum == 0x16a4)) || /* Pete Sampras Tennis (1994)*/
strstr(rominfo.product,"T-120096")) /* Micro Machines 2 */
{
if (cart.romsize <= 0x380000) /* just to be sure (checksum might not be enough) */
{
cart.special |= HW_J_CART;
/* force port 1 setting */
if (input.system[1] != SYSTEM_WAYPLAY)
{
old_system[1] = input.system[1];
input.system[1] = SYSTEM_GAMEPAD;
}
/* extra connectors mapped at $38xxxx or $3Fxxxx */
m68k.memory_map[0x38].read16 = jcart_read;
m68k.memory_map[0x38].write16 = jcart_write;
m68k.memory_map[0x3f].read16 = jcart_read;
m68k.memory_map[0x3f].write16 = jcart_write;
}
}
/**********************************************
LOCK-ON
***********************************************/

View File

@ -1,9 +1,9 @@
/***************************************************************************************
* Genesis Plus
* 2-Buttons, 3-Buttons & 6-Buttons controller support
* Additional support for J-Cart, 4-Way Play & Master Tap adapters
* with support for J-Cart, 4-Way Play & Master Tap adapters
*
* Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX)
* Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:
@ -45,6 +45,7 @@ static struct
uint8 State;
uint8 Counter;
uint8 Timeout;
uint32 Latency;
} gamepad[MAX_DEVICES];
static struct
@ -62,6 +63,7 @@ void gamepad_reset(int port)
gamepad[port].State = 0x40;
gamepad[port].Counter = 0;
gamepad[port].Timeout = 0;
gamepad[port].Latency = 0;
/* reset 4-WayPlay latch */
latch = 0;
@ -81,17 +83,43 @@ void gamepad_refresh(int port)
}
}
void gamepad_end_frame(int port, unsigned int cycles)
{
if (gamepad[port].Latency > cycles)
{
/* adjust TH direction switching latency for next frame */
gamepad[port].Latency -= cycles;
}
else
{
/* reset TH direction switching latency */
gamepad[port].Latency = 0;
}
}
INLINE unsigned char gamepad_read(int port)
{
/* bit 7 is latched, returns current TH state */
unsigned int data = (gamepad[port].State & 0x40) | 0x3F;
/* D7 is not connected, D6 returns TH input state */
unsigned int data = gamepad[port].State | 0x3F;
/* pad value */
unsigned int val = input.pad[port];
/* pad state */
unsigned int pad = input.pad[port];
/* get current step (TH state) */
unsigned int step = gamepad[port].Counter | ((data >> 6) & 1);
/* get current TH input pulse counter */
unsigned int step = gamepad[port].Counter | (data >> 6);
/* get current timestamp */
unsigned int cycles = ((system_hw & SYSTEM_PBC) == SYSTEM_MD) ? m68k.cycles : Z80.cycles;
/* TH direction switching latency */
if (cycles < gamepad[port].Latency)
{
/* TH internal state switching has not occured yet (Decap Attack) */
step &= ~1;
}
/* C/B or START/A buttons status is returned on D5-D4 (active low) */
/* D-PAD or extra buttons status is returned on D3-D0 (active low) */
switch (step)
{
case 1: /*** First High ***/
@ -99,54 +127,58 @@ INLINE unsigned char gamepad_read(int port)
case 5: /*** Third High ***/
{
/* TH = 1 : ?1CBRLDU */
data &= ~(val & 0x3F);
data &= ~(pad & 0x3F);
break;
}
case 0: /*** First low ***/
case 2: /*** Second low ***/
case 0: /*** 3-button only ***/
case 2: /*** First Low ***/
case 4: /*** Second Low ***/
{
/* TH = 0 : ?0SA00DU */
data &= ~(val & 0x03);
data &= ~((val >> 2) & 0x30);
data &= ~0x0C;
data &= ~((pad & 0x03) | ((pad >> 2) & 0x30) | 0x0C);
break;
}
/* 6buttons specific (taken from gen-hw.txt) */
/* A 6-button gamepad allows the extra buttons to be read based on how */
/* many times TH is switched from 1 to 0 (and not 0 to 1). Observe the */
/* following sequence */
/* many times TH is switched from 1 to 0. Observe the following sequence */
/*
TH = 1 : ?1CBRLDU 3-button pad return value
TH = 0 : ?0SA00DU 3-button pad return value
TH = 1 : ?1CBRLDU 3-button pad return value
TH = 0 : ?0SA0000 D3-0 are forced to '0'
TH = 0 : ?0SA00DU 3-button pad return value
TH = 1 : ?1CBRLDU 3-button pad return value
TH = 0 : ?0SA0000 D3-D0 are forced to '0'
TH = 1 : ?1CBMXYZ Extra buttons returned in D3-0
TH = 0 : ?0SA1111 D3-0 are forced to '1'
TH = 0 : ?0SA1111 D3-D0 are forced to '1'
*/
case 4: /*** Third Low ***/
case 6: /*** Third Low ***/
{
/* TH = 0 : ?0SA0000 D3-0 are forced to '0'*/
data &= ~((val >> 2) & 0x30);
data &= ~0x0F;
break;
}
case 6: /*** Fourth Low ***/
{
/* TH = 0 : ?0SA1111 D3-0 are forced to '1'*/
data &= ~((val >> 2) & 0x30);
/* TH = 0 : ?0SA0000 D3-D0 forced to '0' */
data &= ~(((pad >> 2) & 0x30) | 0x0F);
break;
}
case 7: /*** Fourth High ***/
{
/* TH = 1 : ?1CBMXYZ Extra buttons returned in D3-0*/
data &= ~(val & 0x30);
data &= ~((val >> 8) & 0x0F);
/* TH = 1 : ?1CBMXYZ Extra buttons returned in D3-D0 */
data &= ~((pad & 0x30) | ((pad >> 8) & 0x0F));
break;
}
default: /*** D3-D0 forced to '1' ***/
{
if (data & 0x40)
{
/* TH = 1 : ?0CB1111 */
data &= ~(pad & 0x30);
}
else
{
/* TH = 0 : ?0SA1111 */
data &= ~((pad >> 2) & 0x30);
}
}
}
return data;
@ -154,24 +186,45 @@ INLINE unsigned char gamepad_read(int port)
INLINE void gamepad_write(int port, unsigned char data, unsigned char mask)
{
/* update bits set as output only */
data = (gamepad[port].State & ~mask) | (data & mask);
if (input.dev[port] == DEVICE_PAD6B)
/* Check TH pin direction */
if (mask & 0x40)
{
/* TH=0 to TH=1 transition */
if (!(gamepad[port].State & 0x40) && (data & 0x40))
/* get TH output state */
data &= 0x40;
/* reset TH direction switching latency */
gamepad[port].Latency = 0;
/* 6-Buttons controller specific */
if (input.dev[port] == DEVICE_PAD6B)
{
gamepad[port].Counter = (gamepad[port].Counter + 2) & 6;
gamepad[port].Timeout = 0;
/* TH 1->0 transition */
if (!data && gamepad[port].State)
{
gamepad[port].Counter += 2;
gamepad[port].Timeout = 0;
}
}
}
else
{
/* retrieve current timestamp */
unsigned int cycles = ((system_hw & SYSTEM_PBC) == SYSTEM_MD) ? m68k.cycles : Z80.cycles;
/* TH is pulled high when not configured as output by I/O controller output */
data = 0x40;
/* TH 0->1 internal switching does not occur immediately (verified on MK-1650 model) */
if (!gamepad[port].State)
{
gamepad[port].Latency = cycles + 172;
}
}
/* update internal state */
/* update TH input state */
gamepad[port].State = data;
}
/*--------------------------------------------------------------------------*/
/* Default ports handlers */
/*--------------------------------------------------------------------------*/
@ -206,7 +259,7 @@ unsigned char wayplay_1_read(void)
if (latch & 0x04)
{
/* 4-WayPlay detection : xxxxx00 */
return 0x7c;
return 0x7C;
}
/* TR & TL on port B select controller # (0-3) */
@ -237,15 +290,15 @@ void wayplay_2_write(unsigned char data, unsigned char mask)
unsigned int jcart_read(unsigned int address)
{
/* TH2 output read is fixed to zero (fixes Micro Machines 2) */
return ((gamepad_read(5) & 0x7F) | ((gamepad_read(6) & 0x3F) << 8));
/* D6 returns TH state, D14 is fixed low (fixes Micro Machines 2) */
return (gamepad_read(5) | ((gamepad_read(6) & 0x3F) << 8));
}
void jcart_write(unsigned int address, unsigned int data)
{
gamepad_write(5, (data & 1) << 6, 0x40);
gamepad_write(6, (data & 1) << 6, 0x40);
return;
data = (data & 0x01) << 6;
gamepad_write(5, data, 0x40);
gamepad_write(6, data, 0x40);
}
@ -283,7 +336,7 @@ void mastertap_2_write(unsigned char data, unsigned char mask)
/* update bits set as output only */
data = (flipflop[1].Latch & ~mask) | (data & mask);
/* check TH=1 to TH=0 transition */
/* check TH 1->0 transition */
if ((flipflop[1].Latch & 0x40) && !(data & 0x40))
{
flipflop[1].Counter = (flipflop[1].Counter + 1) & 0x03;

View File

@ -1,9 +1,9 @@
/***************************************************************************************
* Genesis Plus
* 2-Buttons, 3-Buttons & 6-Buttons controller support
* Additional support for J-Cart, 4-Way Play & Master Tap adapters
* with support for J-Cart, 4-Way Play & Master Tap adapters
*
* Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX)
* Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:
@ -43,6 +43,7 @@
/* Function prototypes */
extern void gamepad_reset(int port);
extern void gamepad_refresh(int port);
extern void gamepad_end_frame(int port, unsigned int cycles);
extern unsigned char gamepad_1_read(void);
extern unsigned char gamepad_2_read(void);
extern void gamepad_1_write(unsigned char data, unsigned char mask);

View File

@ -3,7 +3,7 @@
* Input peripherals support
*
* Copyright (C) 1998-2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX)
* Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:
@ -464,3 +464,20 @@ void input_refresh(void)
}
}
}
void input_end_frame(unsigned int cycles)
{
int i;
for (i=0; i<MAX_DEVICES; i++)
{
switch (input.dev[i])
{
case DEVICE_PAD3B:
case DEVICE_PAD6B:
{
gamepad_end_frame(i, cycles);
break;
}
}
}
}

View File

@ -3,7 +3,7 @@
* Input peripherals support
*
* Copyright (C) 1998-2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX)
* Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:
@ -154,5 +154,6 @@ extern int old_system[2];
extern void input_init(void);
extern void input_reset(void);
extern void input_refresh(void);
extern void input_end_frame(unsigned int cycles);
#endif

View File

@ -725,8 +725,8 @@ int load_rom(char *filename)
system_bios = (system_bios & 0xf0) | (region_code >> 4);
}
/* ROM cartridge with CD loaded */
else if (cdd.loaded)
/* ROM cartridge (max. 8MB) with CD loaded */
else if ((cart.romsize <= 0x800000) && cdd.loaded)
{
/* try to load CD BOOTROM */
if (load_bios(SYSTEM_MCD))

View File

@ -40,7 +40,9 @@
#ifndef _LOADROM_H_
#define _LOADROM_H_
#ifndef MAXROMSIZE
#define MAXROMSIZE 10485760
#endif
typedef struct
{

View File

@ -293,7 +293,7 @@ void m68k_run(unsigned int cycles)
REG_IR = m68ki_read_imm_16();
/* Execute instruction */
m68ki_instruction_jump_table[REG_IR]();
m68ki_instruction_jump_table[REG_IR]();
USE_CYCLES(CYC_INSTRUCTION[REG_IR]);
/* Trace m68k_exception, if necessary */

View File

@ -2,10 +2,10 @@
* Genesis Plus
* Virtual System emulation
*
* Support for "Genesis", "Genesis + CD" & "Master System" modes
* Support for 16-bit & 8-bit hardware modes
*
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX)
* Copyright (C) 1998-2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:
@ -353,9 +353,6 @@ void system_frame_gen(int do_skip)
/* line counters */
int start, end, line;
/* Z80 interrupt flag */
int zirq = 1;
/* reset frame cycle counter */
mcycles_vdp = 0;
@ -551,9 +548,9 @@ void system_frame_gen(int do_skip)
/* update 6-Buttons & Lightguns */
input_refresh();
if (zirq)
if (Z80.irq_state)
{
/* Z80 interrupt is asserted exactly for one line */
/* Z80 interrupt is asserted for exactly one line */
m68k_run(mcycles_vdp + 788);
if (zstate == 1)
{
@ -566,7 +563,6 @@ void system_frame_gen(int do_skip)
/* clear Z80 interrupt */
Z80.irq_state = CLEAR_LINE;
zirq = 0;
}
/* run 68k & Z80 until end of line */
@ -714,7 +710,8 @@ void system_frame_gen(int do_skip)
bitmap.viewport.changed |= 1;
}
/* adjust CPU cycle counters for next frame */
/* adjust timings for next frame */
input_end_frame(mcycles_vdp);
m68k.cycles -= mcycles_vdp;
Z80.cycles -= mcycles_vdp;
}
@ -724,9 +721,6 @@ void system_frame_scd(int do_skip)
/* line counters */
int start, end, line;
/* Z80 interrupt flag */
int zirq = 1;
/* reset frame cycle counter */
mcycles_vdp = 0;
scd.cycles = 0;
@ -881,7 +875,7 @@ void system_frame_scd(int do_skip)
/* assert Z80 interrupt */
Z80.irq_state = ASSERT_LINE;
/* run both 68k & CD hardware */
/* run both 68k & CD hardware until end of line */
scd_update(MCYCLES_PER_LINE);
/* run Z80 until end of line */
@ -919,9 +913,9 @@ void system_frame_scd(int do_skip)
/* update 6-Buttons & Lightguns */
input_refresh();
if (zirq)
if (Z80.irq_state)
{
/* Z80 interrupt is asserted exactly for one line */
/* Z80 interrupt is asserted for exactly one line */
m68k_run(mcycles_vdp + 788);
if (zstate == 1)
{
@ -934,10 +928,9 @@ void system_frame_scd(int do_skip)
/* clear Z80 interrupt */
Z80.irq_state = CLEAR_LINE;
zirq = 0;
}
/* run both 68k & CD hardware */
/* run both 68k & CD hardware until end of line */
scd_update(mcycles_vdp + MCYCLES_PER_LINE);
/* run Z80 until end of line */
@ -985,7 +978,7 @@ void system_frame_scd(int do_skip)
/* update 6-Buttons & Lightguns */
input_refresh();
/* run both 68k & CD hardware */
/* run both 68k & CD hardware until end of line */
scd_update(mcycles_vdp + MCYCLES_PER_LINE);
/* run Z80 until end of line */
@ -1045,7 +1038,7 @@ void system_frame_scd(int do_skip)
h_counter--;
}
/* run both 68k & CD hardware */
/* run both 68k & CD hardware until end of line */
scd_update(mcycles_vdp + MCYCLES_PER_LINE);
/* run Z80 until end of line */
@ -1070,10 +1063,9 @@ void system_frame_scd(int do_skip)
bitmap.viewport.changed |= 1;
}
/* prepare for next SCD frame */
/* adjust timings for next frame */
scd_end_frame(scd.cycles);
/* adjust CPU cycle counters for next frame */
input_end_frame(mcycles_vdp);
m68k.cycles -= mcycles_vdp;
Z80.cycles -= mcycles_vdp;
}
@ -1465,6 +1457,7 @@ void system_frame_sms(int do_skip)
bitmap.viewport.changed |= 1;
}
/* adjust Z80 cycle count for next frame */
/* adjust timings for next frame */
input_end_frame(mcycles_vdp);
Z80.cycles -= mcycles_vdp;
}

View File

@ -2,10 +2,10 @@
* Genesis Plus
* Virtual System emulation
*
* Support for "Genesis", "Genesis + CD" & "Master System" modes
* Support for 16-bit & 8-bit hardware modes
*
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX)
* Copyright (C) 1998-2003 Charles Mac Donald (original code)
* Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:

View File

@ -34,7 +34,7 @@ int _ilog(unsigned int v){
}
/* 32 bit float (not IEEE; nonnormalized mantissa +
biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm
biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm
Why not IEEE? It's just not that important here. */
#define VQ_FEXP 10
@ -77,12 +77,12 @@ ogg_uint32_t *_make_words(long *l,long n,long sparsecount){
long length=l[i];
if(length>0){
ogg_uint32_t entry=marker[length];
/* when we claim a node for an entry, we also claim the nodes
below it (pruning off the imagined tree that may have dangled
from it) as well as blocking the use of any nodes directly
above for leaves */
/* update ourself */
if(length<32 && (entry>>length)){
/* error condition; the lengths must specify an overpopulated tree */
@ -90,12 +90,12 @@ ogg_uint32_t *_make_words(long *l,long n,long sparsecount){
return(NULL);
}
r[count++]=entry;
/* Look to see if the next shorter marker points to the node
above. if so, update it and repeat. */
{
for(j=length;j>0;j--){
if(marker[j]&1){
/* have to jump branches */
if(j==1)
@ -108,7 +108,7 @@ ogg_uint32_t *_make_words(long *l,long n,long sparsecount){
marker[j]++;
}
}
/* prune the tree; the implicit invariant says all the longer
markers were dangling from our just-taken node. Dangle them
from our *new* node. */
@ -121,7 +121,7 @@ ogg_uint32_t *_make_words(long *l,long n,long sparsecount){
}else
if(sparsecount==0)count++;
}
/* bitreverse the words because our bitwise packer/unpacker is LSb
endian */
for(i=0,count=0;i<n;i++){
@ -210,18 +210,18 @@ ogg_int32_t *_book_unquantize(const static_codebook *b,int n,int *sparsemap,
int indexdiv=1;
for(k=0;k<b->dim;k++){
int index= (j/indexdiv)%quantvals;
int point=0;
ogg_int32_t point=0;
int val=VFLOAT_MULTI(delta,delpoint,
abs(b->quantlist[index]),&point);
val=VFLOAT_ADD(mindel,minpoint,val,point,&point);
val=VFLOAT_ADD(last,lastpoint,val,point,&point);
if(b->q_sequencep){
last=val;
last=val;
lastpoint=point;
}
if(sparsemap){
r[sparsemap[count]*b->dim+k]=val;
rp[sparsemap[count]*b->dim+k]=point;
@ -244,15 +244,15 @@ ogg_int32_t *_book_unquantize(const static_codebook *b,int n,int *sparsemap,
int lastpoint=0;
for(k=0;k<b->dim;k++){
int point=0;
ogg_int32_t point=0;
int val=VFLOAT_MULTI(delta,delpoint,
abs(b->quantlist[j*b->dim+k]),&point);
val=VFLOAT_ADD(mindel,minpoint,val,point,&point);
val=VFLOAT_ADD(last,lastpoint,val,point,&point);
if(b->q_sequencep){
last=val;
last=val;
lastpoint=point;
}
@ -274,7 +274,7 @@ ogg_int32_t *_book_unquantize(const static_codebook *b,int n,int *sparsemap,
for(j=0;j<n*b->dim;j++)
if(rp[j]<*maxpoint)
r[j]>>=*maxpoint-rp[j];
_ogg_free(rp);
return(r);
}
@ -324,7 +324,7 @@ int vorbis_book_init_decode(codebook *c,const static_codebook *s){
int i,j,n=0,tabn;
int *sortindex;
memset(c,0,sizeof(*c));
/* count actually used entries */
for(i=0;i<s->entries;i++)
if(s->lengthlist[i]>0)
@ -335,20 +335,20 @@ int vorbis_book_init_decode(codebook *c,const static_codebook *s){
c->dim=s->dim;
if(n>0){
/* two different remappings go on here.
/* two different remappings go on here.
First, we collapse the likely sparse codebook down only to
actually represented values/words. This collapsing needs to be
indexed as map-valueless books are used to encode original entry
positions as integers.
Second, we reorder all vectors, including the entry index above,
by sorted bitreversed codeword to allow treeless decode. */
/* perform sort */
ogg_uint32_t *codes=_make_words(s->lengthlist,s->entries,c->used_entries);
ogg_uint32_t **codep=(ogg_uint32_t **)alloca(sizeof(*codep)*n);
if(codes==NULL)goto err_out;
for(i=0;i<n;i++){
@ -369,29 +369,29 @@ int vorbis_book_init_decode(codebook *c,const static_codebook *s){
for(i=0;i<n;i++)
c->codelist[sortindex[i]]=codes[i];
_ogg_free(codes);
c->valuelist=_book_unquantize(s,n,sortindex,&c->binarypoint);
c->dec_index=(int *)_ogg_malloc(n*sizeof(*c->dec_index));
for(n=0,i=0;i<s->entries;i++)
if(s->lengthlist[i]>0)
c->dec_index[sortindex[n++]]=i;
c->dec_codelengths=(char *)_ogg_malloc(n*sizeof(*c->dec_codelengths));
for(n=0,i=0;i<s->entries;i++)
if(s->lengthlist[i]>0)
c->dec_codelengths[sortindex[n++]]=s->lengthlist[i];
c->dec_firsttablen=_ilog(c->used_entries)-4; /* this is magic */
if(c->dec_firsttablen<5)c->dec_firsttablen=5;
if(c->dec_firsttablen>8)c->dec_firsttablen=8;
tabn=1<<c->dec_firsttablen;
c->dec_firsttable=(ogg_uint32_t *)_ogg_calloc(tabn,sizeof(*c->dec_firsttable));
c->dec_maxlength=0;
for(i=0;i<n;i++){
if(c->dec_maxlength<c->dec_codelengths[i])
c->dec_maxlength=c->dec_codelengths[i];
@ -401,26 +401,26 @@ int vorbis_book_init_decode(codebook *c,const static_codebook *s){
c->dec_firsttable[orig|(j<<c->dec_codelengths[i])]=i+1;
}
}
/* now fill in 'unused' entries in the firsttable with hi/lo search
hints for the non-direct-hits */
{
ogg_uint32_t mask=0xfffffffeUL<<(31-c->dec_firsttablen);
long lo=0,hi=0;
for(i=0;i<tabn;i++){
ogg_uint32_t word=i<<(32-c->dec_firsttablen);
if(c->dec_firsttable[bitreverse(word)]==0){
while((lo+1)<n && c->codelist[lo+1]<=word)lo++;
while( hi<n && word>=(c->codelist[hi]&mask))hi++;
/* we only actually have 15 bits per hint to play with here.
In order to overflow gracefully (nothing breaks, efficiency
just drops), encode as the difference from the extremes. */
{
unsigned long loval=lo;
unsigned long hival=n-hi;
if(loval>0x7fff)loval=0x7fff;
if(hival>0x7fff)hival=0x7fff;
c->dec_firsttable[bitreverse(word)]=
@ -436,4 +436,3 @@ int vorbis_book_init_decode(codebook *c,const static_codebook *s){
vorbis_book_clear(c);
return(-1);
}

View File

@ -143,7 +143,7 @@ INLINE void WRITE_LONG(void *address, uint32 data)
atex = atex_table[(ATTR >> 29) & 7]; \
src = (uint32 *)&bg_pattern_cache[((ATTR & 0x03FF0000) >> 9 | (ATTR & 0x18000000) >> 10 | (LINE)) ^ ((ATTR & 0x10000000) >> 22)];
/*
/*
One column = 2 tiles
Two pattern attributes are written in VRAM as two consecutives 16-bit words:
@ -264,7 +264,7 @@ INLINE void WRITE_LONG(void *address, uint32 data)
/* This might be faster or slower than original method, depending on */
/* architecture (x86, PowerPC), cache size, memory access speed, etc... */
#ifdef LSB_FIRST
#ifdef LSB_FIRST
#define DRAW_BG_TILE(SRC_A, SRC_B) \
*lb++ = table[((SRC_B << 8) & 0xff00) | (SRC_A & 0xff)]; \
*lb++ = table[(SRC_B & 0xff00) | ((SRC_A >> 8) & 0xff)]; \
@ -279,7 +279,7 @@ INLINE void WRITE_LONG(void *address, uint32 data)
#endif
#ifdef ALIGN_LONG
#ifdef LSB_FIRST
#ifdef LSB_FIRST
#define DRAW_BG_COLUMN(ATTR, LINE, SRC_A, SRC_B) \
GET_LSB_TILE(ATTR, LINE) \
SRC_A = READ_LONG((uint32 *)lb); \
@ -325,7 +325,7 @@ INLINE void WRITE_LONG(void *address, uint32 data)
DRAW_BG_TILE(SRC_A, SRC_B) \
SRC_A = READ_LONG((uint32 *)lb); \
SRC_B = (src[1] | atex); \
DRAW_BG_TILE(SRC_A, SRC_B)
DRAW_BG_TILE(SRC_A, SRC_B)
#define DRAW_BG_COLUMN_IM2(ATTR, LINE, SRC_A, SRC_B) \
GET_MSB_TILE_IM2(ATTR, LINE) \
SRC_A = READ_LONG((uint32 *)lb); \
@ -343,7 +343,7 @@ INLINE void WRITE_LONG(void *address, uint32 data)
DRAW_BG_TILE(SRC_A, SRC_B)
#endif
#else /* NOT ALIGNED */
#ifdef LSB_FIRST
#ifdef LSB_FIRST
#define DRAW_BG_COLUMN(ATTR, LINE, SRC_A, SRC_B) \
GET_LSB_TILE(ATTR, LINE) \
SRC_A = *(uint32 *)(lb); \
@ -470,8 +470,11 @@ INLINE void WRITE_LONG(void *address, uint32 data)
/* 5:5:5 RGB */
#elif defined(USE_15BPP_RENDERING)
#if defined(USE_ABGR)
#define MAKE_PIXEL(r,g,b) ((1 << 15) | (b) << 11 | ((b) >> 3) << 10 | (g) << 6 | ((g) >> 3) << 5 | (r) << 1 | (r) >> 3)
#else
#define MAKE_PIXEL(r,g,b) ((1 << 15) | (r) << 11 | ((r) >> 3) << 10 | (g) << 6 | ((g) >> 3) << 5 | (b) << 1 | (b) >> 3)
#endif
/* 5:6:5 RGB */
#elif defined(USE_16BPP_RENDERING)
#define MAKE_PIXEL(r,g,b) ((r) << 12 | ((r) >> 3) << 11 | (g) << 7 | ((g) >> 2) << 5 | (b) << 1 | (b) >> 3)
@ -573,7 +576,7 @@ static uint8 linebuf[2][0x200];
static uint8 spr_ovr;
/* Sprite parsing lists */
typedef struct
typedef struct
{
uint16 ypos;
uint16 xpos;
@ -620,7 +623,7 @@ static void make_name_lut(void)
if ((vrow > height) || vcol > width)
{
/* Invalid settings (unused) */
name_lut[i] = -1;
name_lut[i] = -1;
}
else
{
@ -691,8 +694,8 @@ static uint32 make_lut_bg(uint32 bx, uint32 ax)
int bf = (bx & 0x7F);
int bp = (bx & 0x40);
int b = (bx & 0x0F);
int af = (ax & 0x7F);
int af = (ax & 0x7F);
int ap = (ax & 0x40);
int a = (ax & 0x0F);
@ -712,8 +715,8 @@ static uint32 make_lut_bg_ste(uint32 bx, uint32 ax)
int bf = (bx & 0x7F);
int bp = (bx & 0x40);
int b = (bx & 0x0F);
int af = (ax & 0x7F);
int af = (ax & 0x7F);
int ap = (ax & 0x40);
int a = (ax & 0x0F);
@ -761,7 +764,7 @@ static uint32 make_lut_bgobj(uint32 bx, uint32 sx)
int bs = (bx & 0x80);
int bp = (bx & 0x40);
int b = (bx & 0x0F);
int sf = (sx & 0x3F);
int sp = (sx & 0x40);
int s = (sx & 0x0F);
@ -897,7 +900,7 @@ static uint32 make_lut_bgobj_ste(uint32 bx, uint32 sx)
}
}
else
{
{
c = (bf | bi);
}
}
@ -914,7 +917,7 @@ static uint32 make_lut_bgobj_ste(uint32 bx, uint32 sx)
static uint32 make_lut_bgobj_m4(uint32 bx, uint32 sx)
{
int c;
int bf = (bx & 0x3F);
int bs = (bx & 0x80);
int bp = (bx & 0x20);
@ -971,7 +974,7 @@ static void palette_init(void)
/* GG mode : xxxx (0-15) */
/* */
/* with x = original CRAM value (2, 3 or 4-bit) */
/* (*) 2-bit CRAM value is expanded to 4-bit */
/* (*) 2-bit CRAM value is expanded to 4-bit */
/************************************************/
/* Initialize Mode 5 pixel color look-up tables */
@ -1308,7 +1311,7 @@ void render_bg_m3(int line)
do
{
color = pg[*nt++ << 3];
*lb++ = 0x10 | ((color >> 4) & 0x0F);
*lb++ = 0x10 | ((color >> 4) & 0x0F);
*lb++ = 0x10 | ((color >> 4) & 0x0F);
@ -1346,7 +1349,7 @@ void render_bg_m3x(int line)
do
{
color = pg[*nt++ << 3];
*lb++ = 0x10 | ((color >> 4) & 0x0F);
*lb++ = 0x10 | ((color >> 4) & 0x0F);
*lb++ = 0x10 | ((color >> 4) & 0x0F);
@ -1394,10 +1397,10 @@ void render_bg_m4(int line)
int column;
uint16 *nt;
uint32 attr, atex, *src;
/* 32 x 8 pixels */
int width = 32;
/* Horizontal scrolling */
int index = ((reg[0] & 0x40) && (line < 0x10)) ? 0x100 : reg[0x08];
int shift = index & 7;
@ -1422,7 +1425,7 @@ void render_bg_m4(int line)
{
/* Vertical scroll mask */
v_line = v_line % 256;
/* Pattern name Table */
nt = (uint16 *)&vram[(0x3700 & nt_mask) + ((v_line >> 3) << 6)];
}
@ -1727,7 +1730,7 @@ void render_bg_m5_vs(int line)
atbuf = nt[index & pf_col_mask];
DRAW_COLUMN(atbuf, v_line)
}
if (w == (line >= a))
{
/* Window takes up entire line */
@ -1755,7 +1758,7 @@ void render_bg_m5_vs(int line)
#else
shift = (xscroll >> 16) & 0x0F;
index = pf_col_mask + start + 1 - ((xscroll >> 20) & pf_col_mask);
#endif
#endif
if(shift)
{
@ -2315,7 +2318,7 @@ void render_bg_m5(int line)
/* Plane B name table */
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
/* Pattern row index */
v_line = (v_line & 7) << 3;
@ -2330,7 +2333,7 @@ void render_bg_m5(int line)
atbuf = nt[(index-1) & pf_col_mask];
DRAW_BG_COLUMN(atbuf, v_line, xscroll, yscroll)
}
for(column = 0; column < width; column++, index++)
{
atbuf = nt[index & pf_col_mask];
@ -2555,7 +2558,7 @@ void render_bg_m5_im2(int line)
/* Window vertical range (cell 0-31) */
int a = (reg[18] & 0x1F) << 3;
/* Window position (0=top, 1=bottom) */
int w = (reg[18] >> 7) & 1;
@ -2714,7 +2717,7 @@ void render_bg_m5_im2_vs(int line)
/* Window vertical range (cell 0-31) */
uint32 a = (reg[18] & 0x1F) << 3;
/* Window position (0=top, 1=bottom) */
uint32 w = (reg[18] >> 7) & 1;
@ -3037,7 +3040,7 @@ void render_obj_m4(int line)
/* Default sprite width */
int width = 8;
/* Sprite Generator address mask (LSB is masked for 8x16 sprites) */
uint16 sg_mask = (~0x1C0 ^ (reg[6] << 6)) & (~((reg[1] & 0x02) >> 1));
@ -3099,7 +3102,7 @@ void render_obj_m4(int line)
{
/* Draw sprite pattern (zoomed sprites are rendered at half speed) */
DRAW_SPRITE_TILE_ACCURATE_2X(end,0,lut[5])
/* 315-5124 VDP specific */
if (system_hw < SYSTEM_SMS2)
{
@ -3697,7 +3700,7 @@ void parse_satb_m4(int line)
/* Y position */
int ypos;
/* Sprite list for next line */
object_info_t *object_info = obj_info[(line + 1) & 1];
@ -3837,11 +3840,11 @@ void parse_satb_m5(int line)
break;
}
/* Update sprite list (only name, attribute & xpos are parsed from VRAM) */
/* Update sprite list (only name, attribute & xpos are parsed from VRAM) */
object_info->attr = p[link + 2];
object_info->xpos = p[link + 3] & 0x1ff;
object_info->ypos = ypos;
object_info->size = size & 0x0f;
object_info->size = size & 0x0f;
/* Increment Sprite count */
++count;
@ -3851,7 +3854,7 @@ void parse_satb_m5(int line)
}
}
/* Read link data from internal SAT cache */
/* Read link data from internal SAT cache */
link = (q[link + 1] & 0x7F) << 2;
/* Stop parsing if link data points to first entry (#0) or after the last entry (#64 in H32 mode, #80 in H40 mode) */

View File

@ -51,10 +51,17 @@
/* 5:5:5 RGB */
#elif defined(USE_15BPP_RENDERING)
#if defined(USE_ABGR)
#define PIXEL(r,g,b) ((1 << 15) | ((b) << 10) | ((g) << 5) | (r))
#define GET_B(pixel) (((pixel) & 0x7c00) >> 10)
#define GET_G(pixel) (((pixel) & 0x03e0) >> 5)
#define GET_R(pixel) (((pixel) & 0x001f) >> 0)
#else
#define PIXEL(r,g,b) ((1 << 15) | ((r) << 10) | ((g) << 5) | (b))
#define GET_R(pixel) (((pixel) & 0x7c00) >> 10)
#define GET_G(pixel) (((pixel) & 0x03e0) >> 5)
#define GET_B(pixel) (((pixel) & 0x001f) >> 0)
#endif
/* 5:6:5 RGB */
#elif defined(USE_16BPP_RENDERING)
@ -134,4 +141,3 @@ extern void (*parse_satb)(int line);
extern void (*update_bg_pattern_cache)(int index);
#endif /* _RENDER_H_ */

View File

@ -3,7 +3,7 @@
*
* IPL font engine (using GX rendering)
*
* Copyright Eke-Eke (2009-2013)
* Copyright Eke-Eke (2009-2015)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:
@ -213,7 +213,7 @@ static void DrawChar(unsigned char c, int xpos, int ypos, int size, GXColor colo
/* reinitialize font texture data */
memset(fontTexture,0,fontHeader->cell_width * fontHeader->cell_height / 2);
GetFontTexel(c,fontTexture,0,fontHeader->cell_width/2);
DCFlushRange(fontTexture, fontHeader->cell_width * fontHeader->cell_height / 2);
DCStoreRange(fontTexture, fontHeader->cell_width * fontHeader->cell_height / 2);
GX_InvalidateTexAll();
/* adjust texture width */

View File

@ -3,7 +3,7 @@
*
* IPL font engine (using GX rendering)
*
* Copyright Eke-Eke (2009-2013)
* Copyright Eke-Eke (2009-2015)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:

View File

@ -3,7 +3,7 @@
*
* Genesis Plus GX audio support
*
* Copyright Eke-Eke (2007-2014), based on original work from Softdev (2006)
* Copyright Eke-Eke (2007-2015), based on original work from Softdev (2006)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:
@ -143,7 +143,7 @@ int gx_audio_Update(int status)
{
/* Retrieve audio samples (size must be multiple of 32 bytes) */
bufferSize = audio_update(sb) * 4;
DCFlushRange((void *)sb, bufferSize);
DCStoreRange((void *)sb, bufferSize);
/* Mark current audio frame as being updated */
status &= ~AUDIO_UPDATE;

View File

@ -3,7 +3,7 @@
*
* Genesis Plus GX audio support
*
* Copyright Eke-Eke (2007-2014), based on original work from Softdev (2006)
* Copyright Eke-Eke (2007-2015), based on original work from Softdev (2006)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:

View File

@ -3,7 +3,7 @@
*
* Genesis Plus GX video & rendering support
*
* Copyright Eke-Eke (2007-2014), based on original work from Softdev (2006)
* Copyright Eke-Eke (2007-2015), based on original work from Softdev (2006)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:
@ -682,7 +682,7 @@ static void gxResetScaler(u32 width)
square[2] = square[4] = xshift + xscale;
square[1] = square[3] = yshift + yscale;
square[5] = square[7] = yshift - yscale;
DCFlushRange(square, 32);
DCStoreRange(square, 32);
GX_InvVtxCache();
}
@ -1057,7 +1057,7 @@ void gxCopyScreenshot(gx_texture *texture)
GX_LoadTexObj(&texobj, GX_TEXMAP0);
GX_InvalidateTexAll();
GX_Flush();
DCFlushRange(texture->data, texture->width * texture->height * 4);
DCStoreRange(texture->data, texture->width * texture->height * 4);
}
/* Take Screenshot */
@ -1310,8 +1310,8 @@ gx_texture *gxTextureOpenPNG(const u8 *png_data, FILE *png_file)
/* release memory */
free(img_data);
/* flush texture data from cache */
DCFlushRange(texture->data, height * stride);
/* force texture data update in memory */
DCStoreRange(texture->data, height * stride);
return texture;
}
@ -1768,7 +1768,7 @@ int gx_video_Update(int status)
/* texture is now directly mapped by the line renderer */
/* force texture cache update */
DCFlushRange(bitmap.data, vwidth*vheight*2);
DCStoreRange(bitmap.data, vwidth*vheight*2);
GX_InvalidateTexAll();
/* disable EFB copy until rendering is done */

View File

@ -3,7 +3,7 @@
*
* Genesis Plus GX video support
*
* Copyright Eke-Eke (2007-2014), based on original work from Softdev (2006)
* Copyright Eke-Eke (2007-2015), based on original work from Softdev (2006)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:

180
psp2/Makefile Normal file
View File

@ -0,0 +1,180 @@
# Makefile for genplus SDL
#
# (c) 1999, 2000, 2001, 2002, 2003 Charles MacDonald
# modified by Eke-Eke <eke_eke31@yahoo.fr>
#
# Defines :
# -DLSB_FIRST : for little endian systems.
# -DLOGERROR : enable message logging
# -DLOGVDP : enable VDP debug messages
# -DLOGSOUND : enable AUDIO debug messages
# -DLOG_SCD : enable SCD debug messages
# -DLOG_CDD : enable CDD debug messages
# -DLOG_CDC : enable CDC debug messages
# -DLOG_PCM : enable PCM debug messages
# -DLOGSOUND : enable AUDIO debug messages
# -D8BPP_RENDERING - configure for 8-bit pixels (RGB332)
# -D15BPP_RENDERING - configure for 15-bit pixels (RGB555)
# -D16BPP_RENDERING - configure for 16-bit pixels (RGB565)
# -D32BPP_RENDERING - configure for 32-bit pixels (RGB888)
NAME = gen_vita
PSP_APP_NAME=GENPLUSGXVITA
PSP_APP_VER=1.7.5
CC = arm-vita-eabi-gcc
CFLAGS = -O3 -fomit-frame-pointer -Wall -Wno-strict-aliasing -ansi -std=c11 \
-pedantic-errors -fno-unwind-tables -fno-asynchronous-unwind-tables -ftree-vectorize \
-mfloat-abi=hard -ffast-math -fsingle-precision-constant -ftree-vectorizer-verbose=2 -fopt-info-vec-optimized -funroll-loops
#-g -ggdb -pg
#-fomit-frame-pointer
LDFLAGS = -Wl,-q
DEFINES = -DPSP_APP_NAME=\"$(PSP_APP_NAME)\" -DPSP_APP_VER=\"$(PSP_APP_VER)\" \
-DLSB_FIRST -DUSE_15BPP_RENDERING -DUSE_LIBTREMOR -DALT_RENDERER -DALIGN_LONG -DHAVE_ALLOCA_H -DUSE_ABGR
SRCDIR = ../core
INCLUDES = -I$(SRCDIR) -I$(SRCDIR)/z80 -I$(SRCDIR)/m68k -I$(SRCDIR)/sound -I$(SRCDIR)/input_hw -I$(SRCDIR)/cart_hw -I$(SRCDIR)/cart_hw/svp -I$(SRCDIR)/cd_hw -I$(SRCDIR)/ntsc -I$(SRCDIR)/tremor -I$(SRCDIR)/../psp2
LIBS = -lpsplib -lvita2d -lfreetype -lpng -lz -lm -lSceDisplay_stub -lSceGxm_stub \
-lSceCtrl_stub -lSceAudio_stub -lSceRtc_stub -lScePower_stub -lSceAppUtil_stub
#-ldebugnet -lSceNet_stub -lSceNetCtl_stub
OBJDIR = ./build_vita
OBJECTS = $(OBJDIR)/z80.o
OBJECTS += $(OBJDIR)/m68kcpu.o \
$(OBJDIR)/s68kcpu.o
OBJECTS += $(OBJDIR)/genesis.o \
$(OBJDIR)/vdp_ctrl.o \
$(OBJDIR)/vdp_render.o \
$(OBJDIR)/system.o \
$(OBJDIR)/io_ctrl.o \
$(OBJDIR)/mem68k.o \
$(OBJDIR)/memz80.o \
$(OBJDIR)/membnk.o \
$(OBJDIR)/state.o \
$(OBJDIR)/loadrom.o
OBJECTS += $(OBJDIR)/input.o \
$(OBJDIR)/gamepad.o \
$(OBJDIR)/lightgun.o \
$(OBJDIR)/mouse.o \
$(OBJDIR)/activator.o \
$(OBJDIR)/xe_1ap.o \
$(OBJDIR)/teamplayer.o \
$(OBJDIR)/paddle.o \
$(OBJDIR)/sportspad.o \
$(OBJDIR)/terebi_oekaki.o \
$(OBJDIR)/graphic_board.o
OBJECTS += $(OBJDIR)/sound.o \
$(OBJDIR)/sn76489.o \
$(OBJDIR)/ym2413.o \
$(OBJDIR)/ym2612.o
OBJECTS += $(OBJDIR)/blip_buf.o
OBJECTS += $(OBJDIR)/eq.o
OBJECTS += $(OBJDIR)/sram.o \
$(OBJDIR)/svp.o \
$(OBJDIR)/ssp16.o \
$(OBJDIR)/ggenie.o \
$(OBJDIR)/areplay.o \
$(OBJDIR)/eeprom_93c.o \
$(OBJDIR)/eeprom_i2c.o \
$(OBJDIR)/eeprom_spi.o \
$(OBJDIR)/md_cart.o \
$(OBJDIR)/sms_cart.o
OBJECTS += $(OBJDIR)/scd.o \
$(OBJDIR)/cdd.o \
$(OBJDIR)/cdc.o \
$(OBJDIR)/gfx.o \
$(OBJDIR)/pcm.o \
$(OBJDIR)/cd_cart.o
OBJECTS += $(OBJDIR)/sms_ntsc.o \
$(OBJDIR)/md_ntsc.o
OBJECTS += $(OBJDIR)/main.o \
$(OBJDIR)/emumain.o \
$(OBJDIR)/menu.o \
$(OBJDIR)/config.o \
$(OBJDIR)/error.o \
$(OBJDIR)/unzip.o \
$(OBJDIR)/fileio.o
OBJECTS += $(OBJDIR)/bitwise.o \
$(OBJDIR)/block.o \
$(OBJDIR)/codebook.o \
$(OBJDIR)/floor0.o \
$(OBJDIR)/floor1.o \
$(OBJDIR)/framing.o \
$(OBJDIR)/info.o \
$(OBJDIR)/mapping0.o \
$(OBJDIR)/mdct.o \
$(OBJDIR)/registry.o \
$(OBJDIR)/res012.o \
$(OBJDIR)/sharedbook.o \
$(OBJDIR)/synthesis.o \
$(OBJDIR)/vorbisfile.o \
$(OBJDIR)/window.o
all: $(NAME).velf
$(NAME).velf: $(NAME).elf
#advice from xyzz strip before create elf
arm-vita-eabi-strip -g $<
#i put db.json there use your location
vita-elf-create $< $@ db.json
$(NAME).elf: $(OBJDIR) $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $@
$(OBJDIR) :
@[ -d $@ ] || mkdir -p $@
$(OBJDIR)/%.o : $(SRCDIR)/%.c $(SRCDIR)/%.h
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/sound/%.c $(SRCDIR)/sound/%.h
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/input_hw/%.c $(SRCDIR)/input_hw/%.h
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/cart_hw/%.c $(SRCDIR)/cart_hw/%.h
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/cart_hw/svp/%.c
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/cart_hw/svp/%.c $(SRCDIR)/cart_hw/svp/%.h
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/cd_hw/%.c $(SRCDIR)/cd_hw/%.h
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/z80/%.c $(SRCDIR)/z80/%.h
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/m68k/%.c
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/ntsc/%.c $(SRCDIR)/ntsc/%.h
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/tremor/%.c $(SRCDIR)/tremor/%.h
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/tremor/%.c
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
$(OBJDIR)/%.o : $(SRCDIR)/../psp2/%.c $(SRCDIR)/../psp2/%.h
$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@
clean:
rm -f $(OBJECTS) $(NAME).velf $(NAME).elf

54
psp2/config.c Normal file
View File

@ -0,0 +1,54 @@
#include "osd.h"
t_config config;
void set_config_defaults(void)
{
int i;
/* sound options */
config.psg_preamp = 150;
config.fm_preamp = 100;
config.hq_fm = 0;
config.psgBoostNoise = 1;
config.filter = 1;
config.low_freq = 200;
config.high_freq = 8000;
config.lg = 1.0;
config.mg = 1.0;
config.hg = 1.0;
config.lp_range = 0x9999; /* 0.6 in 16.16 fixed point */
config.dac_bits = 14;
config.ym2413 = 2; /* = AUTO (0 = always OFF, 1 = always ON) */
config.mono = 0;
/* system options */
config.system = 0; /* = AUTO (or SYSTEM_SG, SYSTEM_MARKIII, SYSTEM_SMS, SYSTEM_SMS2, SYSTEM_GG, SYSTEM_MD) */
config.region_detect = 0; /* = AUTO (1 = USA, 2 = EUROPE, 3 = JAPAN/NTSC, 4 = JAPAN/PAL) */
config.vdp_mode = 0; /* = AUTO (1 = NTSC, 2 = PAL) */
config.master_clock = 0; /* = AUTO (1 = NTSC, 2 = PAL) */
config.force_dtack = 0;
config.addr_error = 1;
config.bios = 0;
config.lock_on = 0; /* = OFF (can be TYPE_SK, TYPE_GG & TYPE_AR) */
config.ntsc = 0;
config.lcd = 0; /* 0.8 fixed point */
/* display options */
config.overscan = 0; /* 3 = all borders (0 = no borders , 1 = vertical borders only, 2 = horizontal borders only) */
config.gg_extra = 0; /* 1 = show extended Game Gear screen (256x192) */
config.render = 0; /* 1 = double resolution output (only when interlaced mode 2 is enabled) */
/* controllers options */
input.system[0] = SYSTEM_GAMEPAD;
input.system[1] = SYSTEM_GAMEPAD;
config.gun_cursor[0] = 1;
config.gun_cursor[1] = 1;
config.invert_mouse = 0;
for (i=0;i<MAX_INPUTS;i++)
{
/* autodetected control pad type */
config.input[i].padtype = DEVICE_PAD2B | DEVICE_PAD3B | DEVICE_PAD6B;
}
}

57
psp2/config.h Normal file
View File

@ -0,0 +1,57 @@
#ifndef _CONFIG_H_
#define _CONFIG_H_
#define MAX_INPUTS 8
#define MAX_KEYS 8
#define MAXPATHLEN 1024
/****************************************************************************
* Config Option
*
****************************************************************************/
typedef struct
{
uint8 padtype;
} t_input_config;
typedef struct
{
uint8 hq_fm;
uint8 filter;
uint8 psgBoostNoise;
uint8 dac_bits;
uint8 ym2413;
int16 psg_preamp;
int16 fm_preamp;
uint32 lp_range;
int16 low_freq;
int16 high_freq;
int16 lg;
int16 mg;
int16 hg;
uint8 mono;
uint8 system;
uint8 region_detect;
uint8 vdp_mode;
uint8 master_clock;
uint8 force_dtack;
uint8 addr_error;
uint8 bios;
uint8 lock_on;
uint8 hot_swap;
uint8 invert_mouse;
uint8 gun_cursor[2];
uint8 overscan;
uint8 gg_extra;
uint8 ntsc;
uint8 lcd;
uint8 render;
t_input_config input[MAX_INPUTS];
} t_config;
/* Global variables */
extern t_config config;
extern void set_config_defaults(void);
#endif /* _CONFIG_H_ */

4466
psp2/db.json Normal file

File diff suppressed because it is too large Load Diff

442
psp2/emumain.c Normal file
View File

@ -0,0 +1,442 @@
#include "emumain.h"
#include <psp2/types.h>
#include <psp2/kernel/threadmgr.h>
#include "time.h"
#include <psp2/rtc.h>
#define SCE_KERNEL_OK 0
#include "psplib/pl_rewind.h"
#include "psplib/pl_file.h"
#include "psplib/pl_snd.h"
#include "psplib/pl_perf.h"
#include "psplib/pl_util.h"
#include "psplib/pl_psp.h"
#include "psplib/video.h"
#include "psplib/ctrl.h"
#include "shared.h"
#include "sound.h"
#include "system.h"
#include "md_ntsc.h"
#include "sms_ntsc.h"
//#include <debugnet.h>
#define ip_server "192.168.1.130"
#define port_server 18194
PspImage *Screen;
pl_rewind Rewinder;
static pl_perf_counter FpsCounter;
static int ClearScreen;
static int ScreenX, ScreenY, ScreenW, ScreenH;
static int TicksPerUpdate;
static u32 TicksPerSecond;
static u64 LastTick;
static u64 CurrentTick;
static int Frame;
static int Rewinding;
extern pl_file_path CurrentGame;
extern EmulatorOptions Options;
extern const u64 ButtonMask[];
extern const int ButtonMapId[];
extern struct ButtonConfig ActiveConfig;
extern char *ScreenshotPath;
static short soundbuffer[SOUND_SAMPLES*2*10];
static int soundPosWrite = 0;
static int soundPosRead = 0;
static SceUID console_mtx;
static inline void RenderVideo();
static void AudioCallback(pl_snd_sample* buf,
unsigned int samples,
void *userdata);
void MixerCallback(int16 **stream, int16 **output, int length);
md_ntsc_t *md_ntsc;
sms_ntsc_t *sms_ntsc;
int bEmulate;
void osd_input_update()
{
/* Reset input */
input.pad[0] = 0;
input.analog[0][0] = 0x7F;
static SceCtrlData pad;
static int autofire_status = 0;
/* Check the input */
if (pspCtrlPollControls(&pad))
{
if (--autofire_status < 0)
autofire_status = Options.AutoFire;
/* Parse input */
int i, on, code;
for (i = 0; ButtonMapId[i] >= 0; i++)
{
code = ActiveConfig.ButtonMap[ButtonMapId[i]];
on = (pad.buttons & ButtonMask[i]) == ButtonMask[i];
/* Check to see if a button set is pressed. If so, unset it, so it */
/* doesn't trigger any other combination presses. */
if (on) pad.buttons &= ~ButtonMask[i];
if (code & AFI)
{
if (on && (autofire_status == 0))
input.pad[0] |= CODE_MASK(code);
continue;
}
else if (code & JOY)
{
if (on) {
input.pad[0] |= CODE_MASK(code);
}
continue;
}
else if (code & SYS)
{
if (on)
{
if (CODE_MASK(code) == (INPUT_START))
input.system[0] |= INPUT_START;
}
continue;
}
if (code & SPC)
{
switch (CODE_MASK(code))
{
case SPC_MENU:
if (on) bEmulate=0;
break;
case SPC_REWIND:
Rewinding = on;
break;
}
}
}
}
return;
}
void InitEmulator()
{
//debugNetInit(ip_server,port_server,DEBUG);
set_config_defaults();
ClearScreen = 0;
/* Initialize screen buffer */
Screen = pspImageCreateVram(720, 576, PSP_IMAGE_16BPP);
// pspImageClear(Screen, 0x8000);
console_mtx = sceKernelCreateSema("sound_sema", 0, 0, 1, 0);
/*if (console_mtx > 0) {
debugNetPrintf(DEBUG,"Sound Mutex UID: 0x%08X\n", console_mtx);
}*/
/* Set up bitmap structure */
memset(&bitmap, 0, sizeof(t_bitmap));
bitmap.width = Screen->Width;
bitmap.height = Screen->Height;
bitmap.pitch = (bitmap.width * 2);
bitmap.data = (unsigned char *)Screen->Pixels;
bitmap.viewport.changed = 3;
pl_snd_set_callback(0, AudioCallback, NULL);
}
void RunEmulator()
{
float ratio;
//debugNetPrintf(DEBUG,"RunEmulator\n");
pspImageClear(Screen, 0);
//debugNetPrintf(DEBUG,"ImageClear\n");
if(bitmap.viewport.changed & 1)
{
bitmap.viewport.changed &= ~1;
/* source bitmap */
Screen->Viewport.Width = bitmap.viewport.w+2*bitmap.viewport.x;
Screen->Viewport.Height = bitmap.viewport.h+2*bitmap.viewport.y;
}
/* Recompute screen size/position */
switch (Options.DisplayMode)
{
default:
case DISPLAY_MODE_UNSCALED:
ScreenW = Screen->Viewport.Width;
ScreenH = Screen->Viewport.Height;
break;
case DISPLAY_MODE_FIT_HEIGHT:
ratio = (float)SCR_HEIGHT / (float)Screen->Viewport.Height;
ScreenW = (float)bitmap.viewport.w * ratio - 2;
ScreenH = SCR_HEIGHT;
break;
case DISPLAY_MODE_FILL_SCREEN:
ScreenW = SCR_WIDTH;
ScreenH = SCR_HEIGHT;
break;
case DISPLAY_MODE_2X:
ScreenW = Screen->Viewport.Width*2;
ScreenH = Screen->Viewport.Height*2;
break;
case DISPLAY_MODE_3X:
ScreenW = Screen->Viewport.Width*3;
ScreenH = Screen->Viewport.Height*3;
break;
}
//debugNetPrintf(DEBUG,"screensize %d %d\n" ,Screen->Viewport.Width ,Screen->Viewport.Height);
ScreenX = (SCR_WIDTH / 2) - (ScreenW / 2);
ScreenY = (SCR_HEIGHT / 2) - (ScreenH / 2);
/* Init performance counter */
pl_perf_init_counter(&FpsCounter);
/* Recompute update frequency */
TicksPerSecond = sceRtcGetTickResolution();
if (Options.UpdateFreq)
{
TicksPerUpdate = TicksPerSecond
/ (Options.UpdateFreq / (Options.Frameskip + 1));
sceRtcGetCurrentTick(&LastTick);
}
Frame = 0;
ClearScreen = 2;
Rewinding = 0;
//pl_rewind_realloc(&Rewinder);
int frames_until_save = 0;
/* Resume sound */
pl_snd_resume(0);
/* Wait for V. refresh */
pspVideoWaitVSync();
bEmulate = 1;
/* Main emulation loop */
while (!ExitPSP&&bEmulate)
{
/* Rewind/save state */
/*if (!Rewinding)
{
if (--frames_until_save <= 0)
{
frames_until_save = Options.RewindSaveRate;
pl_rewind_save(&Rewinder);
}
}
else
{
frames_until_save = Options.RewindSaveRate;
if (!pl_rewind_restore(&Rewinder))
continue;
}*/
/* Run the system emulation for a frame */
if (++Frame <= Options.Frameskip)
{
/* Skip frame */
if (system_hw == SYSTEM_MCD)
{
system_frame_scd(1);
}
else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
{
system_frame_gen(1);
}
else
{
system_frame_sms(1);
}
}
else
{
if (system_hw == SYSTEM_MCD)
{
system_frame_scd(0);
}
else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
{
system_frame_gen(0);
}
else
{
system_frame_sms(0);
}
Frame = 0;
/* Display */
if(bitmap.viewport.changed & 1)
{
bitmap.viewport.changed &= ~1;
/* source bitmap */
Screen->Viewport.Width = bitmap.viewport.w+2*bitmap.viewport.x;
Screen->Viewport.Height = bitmap.viewport.h+2*bitmap.viewport.y;
/* Recompute screen size/position */
switch (Options.DisplayMode)
{
default:
case DISPLAY_MODE_UNSCALED:
ScreenW = Screen->Viewport.Width;
ScreenH = Screen->Viewport.Height;
break;
case DISPLAY_MODE_FIT_HEIGHT:
ratio = (float)SCR_HEIGHT / (float)Screen->Viewport.Height;
ScreenW = (float)bitmap.viewport.w * ratio - 2;
ScreenH = SCR_HEIGHT;
break;
case DISPLAY_MODE_FILL_SCREEN:
ScreenW = SCR_WIDTH;
ScreenH = SCR_HEIGHT;
break;
case DISPLAY_MODE_2X:
ScreenW = Screen->Viewport.Width*2;
ScreenH = Screen->Viewport.Height*2;
break;
case DISPLAY_MODE_3X:
ScreenW = Screen->Viewport.Width*3;
ScreenH = Screen->Viewport.Height*3;
break;
}
ScreenX = (SCR_WIDTH / 2) - (ScreenW / 2);
ScreenY = (SCR_HEIGHT / 2) - (ScreenH / 2);
}
//debugNetPrintf(DEBUG,"main %d %d \n",soundPosRead,soundPosWrite);
int size = audio_update(&soundbuffer[soundPosRead])*2;
//debugNetPrintf(DEBUG,"filling %d \n",size);
soundPosRead +=size;
if(soundPosRead+size>=(SOUND_SAMPLES*2*10)){
soundPosRead = 0;
}
if((soundPosRead-soundPosWrite)>=(SOUND_SAMPLES*2)||(soundPosRead-soundPosWrite)<0){
sceKernelSignalSema(console_mtx, 1); //lock
}
RenderVideo();
}
}
/* Stop sound */
pl_snd_pause(0);
}
void TrashEmulator()
{
pl_rewind_destroy(&Rewinder);
/* Trash screen */
if (Screen) pspImageDestroy(Screen);
if (CurrentGame[0] != '\0')
{
/* Release emulation resources */
audio_shutdown();
error_shutdown();
}
//debugNetFinish();
}
void RenderVideo()
{
/* Update the display */
pspVideoBegin();
/* Clear the buffer first, if necessary */
if (ClearScreen >= 0)
{
ClearScreen--;
pspVideoClearScreen();
}
pspVideoPutImage(Screen, ScreenX, ScreenY, ScreenW, ScreenH);
/* Show FPS counter */
if (Options.ShowFps)
{
static char fps_display[32];
sprintf(fps_display, " %3.02f", pl_perf_update_counter(&FpsCounter));
int width = pspFontGetTextWidth(&PspStockFont, fps_display);
int height = pspFontGetLineHeight(&PspStockFont);
pspVideoFillRect(SCR_WIDTH - width, 0, SCR_WIDTH, height, PSP_COLOR_BLACK);
pspVideoPrint(&PspStockFont, SCR_WIDTH - width, 0, fps_display, PSP_COLOR_WHITE);
}
pspVideoEnd();
/* Wait if needed */
if (Options.UpdateFreq)
{
do { sceRtcGetCurrentTick(&CurrentTick); }
while (CurrentTick - LastTick < TicksPerUpdate);
LastTick = CurrentTick;
}
/* Wait for VSync signal */
if (Options.VSync)
pspVideoWaitVSync();
/* Swap buffers */
pspVideoSwapBuffers();
}
static void AudioCallback(pl_snd_sample *buf,
unsigned int samples,
void *userdata)
{
int i;
//debugNetPrintf(DEBUG,"wait %d %d \n",totalSamples,samples);
if (!Rewinding)
{
short* ptr_s = (short*)buf;
//debugNetPrintf(DEBUG,"wait %d %d \n",soundPosRead,soundPosWrite);
if((soundPosRead-soundPosWrite)<SOUND_SAMPLES*2){
sceKernelWaitSema(console_mtx, 1, 0); //lock
//debugNetPrintf(DEBUG,"start %d %d \n",soundPosRead,soundPosWrite);
}
memcpy(ptr_s,&soundbuffer[soundPosWrite],sizeof(short)*samples*2);
soundPosWrite +=samples*2;
if(soundPosWrite+(samples*2)>=(SOUND_SAMPLES*2*10)){
soundPosWrite = 0;
}
}
else /* Render silence */
for (i = 0; i < samples; i++)
buf[i].stereo.l = buf[i].stereo.r = 0;
}

77
psp2/emumain.h Normal file
View File

@ -0,0 +1,77 @@
#ifndef _EMUMAIN_H
#define _EMUMAIN_H
#define int32 int32_t
#define int16 int16_t
#define u32 uint32_t
#define u64 uint64_t
#define ScePspDateTime SceDateTime
#define SOUND_FREQUENCY 48000
#define SOUND_SAMPLES 832
void InitEmulator();
void RunEmulator();
void TrashEmulator();
#define DISPLAY_MODE_UNSCALED 0
#define DISPLAY_MODE_FIT_HEIGHT 1
#define DISPLAY_MODE_FILL_SCREEN 2
#define DISPLAY_MODE_2X 3
#define DISPLAY_MODE_3X 4
#define JOY 0x10000
#define SYS 0x20000
#define SPC 0x40000
#define AFI 0x80000
#define CODE_MASK(x) (x & 0xffff)
#define SPC_MENU 1
#define SPC_REWIND 2
#define MAP_BUTTONS 18
#define MAP_ANALOG_UP 0
#define MAP_ANALOG_DOWN 1
#define MAP_ANALOG_LEFT 2
#define MAP_ANALOG_RIGHT 3
#define MAP_BUTTON_UP 4
#define MAP_BUTTON_DOWN 5
#define MAP_BUTTON_LEFT 6
#define MAP_BUTTON_RIGHT 7
#define MAP_BUTTON_SQUARE 8
#define MAP_BUTTON_CROSS 9
#define MAP_BUTTON_CIRCLE 10
#define MAP_BUTTON_TRIANGLE 11
#define MAP_BUTTON_LTRIGGER 12
#define MAP_BUTTON_RTRIGGER 13
#define MAP_BUTTON_SELECT 14
#define MAP_BUTTON_START 15
#define MAP_BUTTON_LRTRIGGERS 16
#define MAP_BUTTON_STARTSELECT 17
typedef struct
{
int ShowFps;
int ControlMode;
int ClockFreq;
int DisplayMode;
int VSync;
int UpdateFreq;
int Frameskip;
int VertStrip;
int SoundEngine;
int SoundBoost;
int AutoFire;
int RewindSaveRate;
int RewindReplayDelay;
} EmulatorOptions;
struct ButtonConfig
{
unsigned int ButtonMap[MAP_BUTTONS];
};
#endif // _EMUMAIN_H

35
psp2/error.c Normal file
View File

@ -0,0 +1,35 @@
/*
error.c --
Error logging
*/
#include "osd.h"
static FILE *error_log;
void error_init(void)
{
#ifdef LOGERROR
error_log = fopen("error.log","w");
#endif
}
void error_shutdown(void)
{
#ifdef LOGERROR
if(error_log) fclose(error_log);
#endif
}
void error(char *format, ...)
{
#ifdef LOGERROR
if (log_error)
{
va_list ap;
va_start(ap, format);
if(error_log) vfprintf(error_log, format, ap);
va_end(ap);
}
#endif
}

10
psp2/error.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef _ERROR_H_
#define _ERROR_H_
/* Function prototypes */
void error_init(void);
void error_shutdown(void);
void error(char *format, ...);
#endif /* _ERROR_H_ */

154
psp2/fileio.c Normal file
View File

@ -0,0 +1,154 @@
/*
* fileio.c
*
* Load a normal file, or ZIP/GZ archive into ROM buffer.
* Returns loaded ROM size (zero if an error occured)
*
*
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald
* modified by Eke-Eke (Genesis Plus GX)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:
*
* - Redistributions may not be sold, nor may they be used in a commercial
* product or activity.
*
* - Redistributions that are modified from the original source must include the
* complete source code, including the source code for all components used by a
* binary built from the modified sources. However, as a special exception, the
* source code distributed need not include anything that is normally distributed
* (in either source or binary form) with the major components (compiler, kernel,
* and so on) of the operating system on which the executable runs, unless that
* component itself accompanies the executable.
*
* - Redistributions must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************************/
#include "shared.h"
#include <zlib.h>
static int check_zip(char *filename);
int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension)
{
int size = 0;
if(check_zip(filename))
{
unz_file_info info;
int ret = 0;
char fname[256];
/* Attempt to open the archive */
unzFile *fd = unzOpen(filename);
if (!fd) return 0;
/* Go to first file in archive */
ret = unzGoToFirstFile(fd);
if(ret != UNZ_OK)
{
unzClose(fd);
return 0;
}
/* Get file informations and update filename */
ret = unzGetCurrentFileInfo(fd, &info, fname, 256, NULL, 0, NULL, 0);
if(ret != UNZ_OK)
{
unzClose(fd);
return 0;
}
/* Compressed filename extension */
if (extension)
{
strncpy(extension, &fname[strlen(fname) - 3], 3);
extension[3] = 0;
}
/* Open the file for reading */
ret = unzOpenCurrentFile(fd);
if(ret != UNZ_OK)
{
unzClose(fd);
return 0;
}
/* Retrieve uncompressed file size */
size = info.uncompressed_size;
if(size > maxsize)
{
size = maxsize;
}
/* Read (decompress) the file */
ret = unzReadCurrentFile(fd, buffer, size);
if(ret != size)
{
unzCloseCurrentFile(fd);
unzClose(fd);
return 0;
}
/* Close the current file */
ret = unzCloseCurrentFile(fd);
if(ret != UNZ_OK)
{
unzClose(fd);
return 0;
}
/* Close the archive */
ret = unzClose(fd);
if(ret != UNZ_OK) return 0;
}
/*else
{
gzFile *gd = gzopen(filename, "rb");
if (!gd) return 0;
size = gzread(gd, buffer, maxsize);
if (extension)
{
strncpy(extension, &filename[strlen(filename) - 3], 3);
extension[3] = 0;
}
gzclose(gd);
}*/
/* Return loaded ROM size */
return size;
}
/*
Verifies if a file is a ZIP archive or not.
Returns: 1= ZIP archive, 0= not a ZIP archive
*/
static int check_zip(char *filename)
{
uint8 buf[2];
FILE *fd = fopen(filename, "rb");
if(!fd) return (0);
fread(buf, 2, 1, fd);
fclose(fd);
if(memcmp(buf, "PK", 2) == 0) return (1);
return (0);
}

48
psp2/fileio.h Normal file
View File

@ -0,0 +1,48 @@
/*
* fileio.c
*
* Load a normal file, or ZIP/GZ archive.
* Returns loaded ROM size (zero if an error occured)
*
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald
* modified by Eke-Eke (Genesis Plus GX)
*
* Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met:
*
* - Redistributions may not be sold, nor may they be used in a commercial
* product or activity.
*
* - Redistributions that are modified from the original source must include the
* complete source code, including the source code for all components used by a
* binary built from the modified sources. However, as a special exception, the
* source code distributed need not include anything that is normally distributed
* (in either source or binary form) with the major components (compiler, kernel,
* and so on) of the operating system on which the executable runs, unless that
* component itself accompanies the executable.
*
* - Redistributions must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************************/
#ifndef _FILEIO_H_
#define _FILEIO_H_
/* Function prototypes */
extern int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension);
#endif /* _FILEIO_H_ */

50
psp2/main.c Normal file
View File

@ -0,0 +1,50 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <psp2/moduleinfo.h>
#include <psp2/kernel/threadmgr.h>
#include "psplib/pl_snd.h"
#include "psplib/video.h"
#include "psplib/pl_psp.h"
#include "psplib/ctrl.h"
#include <vita2d.h>
#include "menu.h"
#include "emumain.h"
PSP2_MODULE_INFO(0,1,PSP_APP_NAME)
//PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER)
static void ExitCallback(void* arg)
{
ExitPSP = 1;
}
int main(int argc,char *argv[])
{
/* Initialize PSP */
pl_psp_init("cache0:/GENPlusVITA/");
pl_snd_init(SOUND_SAMPLES, 1);
pspCtrlInit();
pspVideoInit();
/* Initialize callbacks */
pl_psp_register_callback(PSP_EXIT_CALLBACK,
ExitCallback,
NULL);
pl_psp_start_callback_thread();
/* Start emulation */
InitMenu();
DisplayMenu();
TrashMenu();
/* Release PSP resources */
pl_snd_shutdown();
pspVideoShutdown();
pl_psp_shutdown();
return(0);
}

11
psp2/main.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef _MAIN_H_
#define _MAIN_H_
#define MAX_INPUTS 8
extern int debug_on;
extern int log_error;
extern int sdl_input_update(void);
#endif /* _MAIN_H_ */

1289
psp2/menu.c Normal file

File diff suppressed because it is too large Load Diff

8
psp2/menu.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef _MENU_H
#define _MENU_H
void InitMenu();
void DisplayMenu();
void TrashMenu();
#endif

34
psp2/osd.h Normal file
View File

@ -0,0 +1,34 @@
#ifndef _OSD_H_
#define _OSD_H_
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <time.h>
#include <stdlib.h>
#include "shared.h"
#include "config.h"
#include "error.h"
#include "unzip.h"
#include "fileio.h"
extern void osd_input_update(void);
#define GG_ROM "./ggenie.bin"
#define AR_ROM "./areplay.bin"
#define SK_ROM "./sk.bin"
#define SK_UPMEM "./sk2chip.bin"
#define CD_BIOS_US "./bios_CD_U.bin"
#define CD_BIOS_EU "./bios_CD_E.bin"
#define CD_BIOS_JP "./bios_CD_J.bin"
#define MD_BIOS "./bios_MD.bin"
#define MS_BIOS_US "./bios_U.sms"
#define MS_BIOS_EU "./bios_E.sms"
#define MS_BIOS_JP "./bios_J.sms"
#define GG_BIOS "./bios.gg"
#endif /* _OSD_H_ */

1294
psp2/unzip.c Normal file

File diff suppressed because it is too large Load Diff

273
psp2/unzip.h Normal file
View File

@ -0,0 +1,273 @@
/* unzip.h -- IO for uncompress .zip files using zlib
Version 0.15 beta, Mar 19th, 1998,
Copyright (C) 1998 Gilles Vollant
This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
WinZip, InfoZip tools and compatible.
Encryption and multi volume ZipFile (span) are not supported.
Old compressions used by old PKZip 1.x are not supported
THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE
CAN CHANGE IN FUTURE VERSION !!
I WAIT FEEDBACK at mail info@winimage.com
Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
Condition of use and distribution are the same than zlib :
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
/* for more info about .ZIP format, see
ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip
PkWare has also a specification at :
ftp://ftp.pkware.com/probdesc.zip */
#ifndef _unz_H
#define _unz_H
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _ZLIB_H
#include "zlib.h"
#endif
#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
/* like the STRICT of WIN32, we define a pointer that cannot be converted
from (void*) without cast */
typedef struct TagunzFile__ { int unused; } unzFile__;
typedef unzFile__ *unzFile;
#else
typedef voidp unzFile;
#endif
#define UNZ_OK (0)
#define UNZ_END_OF_LIST_OF_FILE (-100)
#define UNZ_ERRNO (Z_ERRNO)
#define UNZ_EOF (0)
#define UNZ_PARAMERROR (-102)
#define UNZ_BADZIPFILE (-103)
#define UNZ_INTERNALERROR (-104)
#define UNZ_CRCERROR (-105)
/* tm_unz contain date/time info */
typedef struct tm_unz_s
{
uInt tm_sec; /* seconds after the minute - [0,59] */
uInt tm_min; /* minutes after the hour - [0,59] */
uInt tm_hour; /* hours since midnight - [0,23] */
uInt tm_mday; /* day of the month - [1,31] */
uInt tm_mon; /* months since January - [0,11] */
uInt tm_year; /* years - [1980..2044] */
} tm_unz;
/* unz_global_info structure contain global data about the ZIPfile
These data comes from the end of central dir */
typedef struct unz_global_info_s
{
uLong number_entry; /* total number of entries in
the central dir on this disk */
uLong size_comment; /* size of the global comment of the zipfile */
} unz_global_info;
/* unz_file_info contain information about a file in the zipfile */
typedef struct unz_file_info_s
{
uLong version; /* version made by 2 bytes */
uLong version_needed; /* version needed to extract 2 bytes */
uLong flag; /* general purpose bit flag 2 bytes */
uLong compression_method; /* compression method 2 bytes */
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
uLong crc; /* crc-32 4 bytes */
uLong compressed_size; /* compressed size 4 bytes */
uLong uncompressed_size; /* uncompressed size 4 bytes */
uLong size_filename; /* filename length 2 bytes */
uLong size_file_extra; /* extra field length 2 bytes */
uLong size_file_comment; /* file comment length 2 bytes */
uLong disk_num_start; /* disk number start 2 bytes */
uLong internal_fa; /* internal file attributes 2 bytes */
uLong external_fa; /* external file attributes 4 bytes */
tm_unz tmu_date;
} unz_file_info;
extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
const char* fileName2,
int iCaseSensitivity));
/*
Compare two filename (fileName1,fileName2).
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
or strcasecmp)
If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
(like 1 on Unix, 2 on Windows)
*/
extern unzFile ZEXPORT unzOpen OF((const char *path));
/*
Open a Zip file. path contain the full pathname (by example,
on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer
"zlib/zlib111.zip".
If the zipfile cannot be opened (file don't exist or in not valid), the
return value is NULL.
Else, the return value is a unzFile Handle, usable with other function
of this unzip package.
*/
extern int ZEXPORT unzClose OF((unzFile file));
/*
Close a ZipFile opened with unzipOpen.
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
return UNZ_OK if there is no problem. */
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
unz_global_info *pglobal_info));
/*
Write info about the ZipFile in the *pglobal_info structure.
No preparation of the structure is needed
return UNZ_OK if there is no problem. */
extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
char *szComment,
uLong uSizeBuf));
/*
Get the global comment string of the ZipFile, in the szComment buffer.
uSizeBuf is the size of the szComment buffer.
return the number of byte copied or an error code <0
*/
/***************************************************************************/
/* Unzip package allow you browse the directory of the zipfile */
extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
/*
Set the current file of the zipfile to the first file.
return UNZ_OK if there is no problem
*/
extern int ZEXPORT unzGoToNextFile OF((unzFile file));
/*
Set the current file of the zipfile to the next file.
return UNZ_OK if there is no problem
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
*/
extern int ZEXPORT unzLocateFile OF((unzFile file,
const char *szFileName,
int iCaseSensitivity));
/*
Try locate the file szFileName in the zipfile.
For the iCaseSensitivity signification, see unzStringFileNameCompare
return value :
UNZ_OK if the file is found. It becomes the current file.
UNZ_END_OF_LIST_OF_FILE if the file is not found
*/
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
unz_file_info *pfile_info,
char *szFileName,
uLong fileNameBufferSize,
void *extraField,
uLong extraFieldBufferSize,
char *szComment,
uLong commentBufferSize));
/*
Get Info about the current file
if pfile_info!=NULL, the *pfile_info structure will contain somes info about
the current file
if szFileName!=NULL, the filemane string will be copied in szFileName
(fileNameBufferSize is the size of the buffer)
if extraField!=NULL, the extra field information will be copied in extraField
(extraFieldBufferSize is the size of the buffer).
This is the Central-header version of the extra field
if szComment!=NULL, the comment string of the file will be copied in szComment
(commentBufferSize is the size of the buffer)
*/
/***************************************************************************/
/* for reading the content of the current zipfile, you can open it, read data
from it, and close it (you can close it before reading all the file)
*/
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
/*
Open for reading data the current file in the zipfile.
If there is no error, the return value is UNZ_OK.
*/
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
/*
Close the file in zip opened with unzOpenCurrentFile
Return UNZ_CRCERROR if all the file was read but the CRC is not good
*/
extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
voidp buf,
unsigned len));
/*
Read bytes from the current file (opened by unzOpenCurrentFile)
buf contain buffer where data must be copied
len the size of buf.
return the number of byte copied if somes bytes are copied
return 0 if the end of file was reached
return <0 with error code if there is an error
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
*/
extern z_off_t ZEXPORT unztell OF((unzFile file));
/*
Give the current position in uncompressed data
*/
extern int ZEXPORT unzeof OF((unzFile file));
/*
return 1 if the end of file was reached, 0 elsewhere
*/
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
voidp buf,
unsigned len));
/*
Read extra field from the current file (opened by unzOpenCurrentFile)
This is the local-header version of the extra field (sometimes, there is
more info in the local-header version than in the central-header)
if buf==NULL, it return the size of the local extra field
if buf!=NULL, len is the size of the buffer, the extra header is copied in
buf.
the return value is the number of bytes copied in buf, or (if <0)
the error code
*/
#ifdef __cplusplus
}
#endif
#endif /* _unz_H */