1.32 release

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@87 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2007-04-04 18:35:48 +00:00
parent 4696954094
commit 6cadc2da00
42 changed files with 803 additions and 167 deletions

View file

@ -1,7 +1,7 @@
// This is part of Pico Library // This is part of Pico Library
// (c) Copyright 2004 Dave, All rights reserved. // (c) Copyright 2004 Dave, All rights reserved.
// (c) Copyright 2006 notaz, All rights reserved. // (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas
// Free for non-commercial use. // Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained. // For commercial use, separate licencing terms must be obtained.

View file

@ -3,7 +3,7 @@
@ assembly "optimized" version of some funtions from draw.c @ assembly "optimized" version of some funtions from draw.c
@ this is highly specialized, be careful if changing related C code! @ this is highly specialized, be careful if changing related C code!
@ (c) Copyright 2006, notaz @ (c) Copyright 2007, Grazvydas "notaz" Ignotas
@ All Rights Reserved @ All Rights Reserved

View file

@ -1,6 +1,6 @@
// This is part of Pico Library // This is part of Pico Library
// (c) Copyright 2006 notaz, All rights reserved. // (c) Copyright 2007, Grazvydas "notaz" Ignotas
// Free for non-commercial use. // Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained. // For commercial use, separate licencing terms must be obtained.

View file

@ -3,7 +3,7 @@
@ assembly optimized versions of most funtions from draw2.c @ assembly optimized versions of most funtions from draw2.c
@ this is highly specialized, be careful if changing related C code! @ this is highly specialized, be careful if changing related C code!
@ (c) Copyright 2006, notaz @ (c) Copyright 2007, Grazvydas "notaz" Ignotas
@ All Rights Reserved @ All Rights Reserved

View file

@ -3,7 +3,7 @@
@ memory handlers with banking support for SSF II - The New Challengers @ memory handlers with banking support for SSF II - The New Challengers
@ mostly based on Gens code @ mostly based on Gens code
@ (c) Copyright 2006, notaz @ (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas
@ All Rights Reserved @ All Rights Reserved

View file

@ -1,4 +1,5 @@
/* common code for Memory.c and cd/Memory.c */ // common code for Memory.c and cd/Memory.c
// (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas
static int PadRead(int i) static int PadRead(int i)
{ {

View file

@ -149,7 +149,6 @@ int PicoReset(int hard)
if (PicoMCD & 1) { if (PicoMCD & 1) {
PicoResetMCD(hard); PicoResetMCD(hard);
SRam.data = 0;
return 0; return 0;
} }

View file

@ -4,7 +4,7 @@
// Pico Library - Header File // Pico Library - Header File
// (c) Copyright 2004 Dave, All rights reserved. // (c) Copyright 2004 Dave, All rights reserved.
// (c) Copyright 2006 notaz, All rights reserved. // (c) Copyright 2006-2007 notaz, All rights reserved.
// Free for non-commercial use. // Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained. // For commercial use, separate licencing terms must be obtained.
@ -30,8 +30,8 @@ void mp3_update(int *buffer, int length, int stereo);
// PicoOpt bits LSb->MSb: // PicoOpt bits LSb->MSb:
// enable_ym2612&dac, enable_sn76496, enable_z80, stereo_sound, // enable_ym2612&dac, enable_sn76496, enable_z80, stereo_sound,
// alt_renderer, 6button_gamepad, accurate_timing, accurate_sprites, // alt_renderer, 6button_gamepad, accurate_timing, accurate_sprites,
// draw_no_32col_border, external_ym2612, enable_pcm, enable cdda // draw_no_32col_border, external_ym2612, enable_cd_pcm, enable_cd_cdda
// enable_cdgfx, cd_perfect_sync, soft_32col_scaling // enable_cd_gfx, cd_perfect_sync, soft_32col_scaling, enable_cd_ramcart
extern int PicoOpt; extern int PicoOpt;
extern int PicoVer; extern int PicoVer;
extern int PicoSkipFrame; // skip rendering frame, but still do sound (if enabled) and emulation stuff extern int PicoSkipFrame; // skip rendering frame, but still do sound (if enabled) and emulation stuff

View file

@ -1,7 +1,7 @@
// Pico Library - Header File // Pico Library - Header File
// (c) Copyright 2004 Dave, All rights reserved. // (c) Copyright 2004 Dave, All rights reserved.
// (c) Copyright 2006 notaz, All rights reserved. // (c) Copyright 2006,2007 Grazvydas "notaz" Ignotas, all rights reserved.
// Free for non-commercial use. // Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained. // For commercial use, separate licencing terms must be obtained.
@ -220,7 +220,10 @@ struct mcd_misc
char pad1; char pad1;
int timer_int3; // 10 int timer_int3; // 10
unsigned int timer_stopwatch; unsigned int timer_stopwatch;
int pad[10]; unsigned char bcram_reg; // 18: battery-backed RAM cart register
unsigned char pad2;
unsigned short pad3;
int pad[9];
}; };
typedef struct typedef struct
@ -333,7 +336,7 @@ unsigned int SRAMReadEEPROM();
void SRAMUpdPending(unsigned int a, unsigned int d); void SRAMUpdPending(unsigned int a, unsigned int d);
void memcpy16(unsigned short *dest, unsigned short *src, int count); void memcpy16(unsigned short *dest, unsigned short *src, int count);
void memcpy16bswap(unsigned short *dest, void *src, int count); void memcpy16bswap(unsigned short *dest, void *src, int count);
void memcpy32(int *dest, int *src, int count); void memcpy32(int *dest, int *src, int count); // 32bit word count
void memset32(int *dest, int c, int count); void memset32(int *dest, int c, int count);
// cd/Misc.c // cd/Misc.c

View file

@ -1,7 +1,7 @@
// This is part of Pico Library // This is part of Pico Library
// (c) Copyright 2004 Dave, All rights reserved. // (c) Copyright 2004 Dave, All rights reserved.
// (c) Copyright 2006 notaz, All rights reserved. // (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas
// Free for non-commercial use. // Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained. // For commercial use, separate licencing terms must be obtained.

View file

@ -1,9 +1,5 @@
// This is part of Pico Library // Savestate handling for emulated Sega/Mega CD machine.
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
// (c) Copyright 2007 notaz, All rights reserved.
// Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained.
#include "../PicoInt.h" #include "../PicoInt.h"

View file

@ -1,9 +1,9 @@
/*********************************************************** /***********************************************************
* * * *
* This source is taken from the Gens project * * This source was taken from the Gens project *
* Written by Stéphane Dallongeville * * Written by Stéphane Dallongeville *
* Copyright (c) 2002 by Stéphane Dallongeville * * Copyright (c) 2002 by Stéphane Dallongeville *
* Modified/adapted for Picodrive by notaz, 2007 * * Modified/adapted for PicoDrive by notaz, 2007 *
* * * *
***********************************************************/ ***********************************************************/

View file

@ -1,3 +1,12 @@
/***********************************************************
* *
* This source was taken from the Gens project *
* Written by Stéphane Dallongeville *
* Copyright (c) 2002 by Stéphane Dallongeville *
* Modified/adapted for PicoDrive by notaz, 2007 *
* *
***********************************************************/
#ifndef _LC89510_H #ifndef _LC89510_H
#define _LC89510_H #define _LC89510_H

View file

@ -1,10 +1,6 @@
// This is part of Pico Library // Memory I/O handlers for Sega/Mega CD.
// Loosely based on Gens code.
// (c) Copyright 2004 Dave, All rights reserved. // (c) Copyright 2007, Grazvydas "notaz" Ignotas
// (c) Copyright 2007 notaz, All rights reserved.
// Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained.
// A68K no longer supported here // A68K no longer supported here
@ -698,7 +694,7 @@ static void PicoWriteM68k16(u32 a,u16 d)
Pico_mcd->s68k_regs[0xe] = d >> 8; Pico_mcd->s68k_regs[0xe] = d >> 8;
#ifdef USE_POLL_DETECT #ifdef USE_POLL_DETECT
if ((s68k_poll_adclk&0xfe) == 0xe && s68k_poll_cnt > POLL_LIMIT) { if ((s68k_poll_adclk&0xfe) == 0xe && s68k_poll_cnt > POLL_LIMIT) {
SekSetStopS68k(0); s68k_poll_adclk = -1; SekSetStopS68k(0); s68k_poll_adclk = 0;
plprintf("s68k poll release, a=%02x\n", a); plprintf("s68k poll release, a=%02x\n", a);
} }
#endif #endif

View file

@ -1,8 +1,7 @@
@ vim:filetype=armasm @ vim:filetype=armasm
@ Memory i/o handlers for Sega/Mega CD emulation @ Memory I/O handlers for Sega/Mega CD emulation
@ (c) Copyright 2007, Grazvydas "notaz" Ignotas @ (c) Copyright 2007, Grazvydas "notaz" Ignotas
@ All Rights Reserved
@ -27,14 +26,17 @@
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x280000 - 0x2fffff .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x280000 - 0x2fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x300000 .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x300000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x3fffff .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x3fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x400000 .long m_m68k_&\on&\sz&_bcram_size @ 0x400000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x420000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x4fffff .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x4fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x500000 .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x500000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x5fffff .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x5fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x600000 .long m_m68k_&\on&\sz&_bcram @ 0x600000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x620000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x6fffff .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x6fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x700000 .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x700000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x7fffff .long m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x7dffff
.long m_m68k_&\on&\sz&_bcram_reg @ 0x7e0000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x800000 .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x800000
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x8fffff .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x8fffff
.long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x900000 .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x900000
@ -364,6 +366,25 @@ PicoWriteS68k32: @ u32 a, u32 d
streq r1, [r2, r0] streq r1, [r2, r0]
.endm .endm
@
.macro bcram_reg_rw is_read addr_check
rsb r0, r0, #0x800000
ldr r2, =(Pico+0x22200)
cmp r0, #(0x800000-\addr_check)
ldreq r2, [r2]
.if \is_read
movne r0, #0
.endif
bxne lr
add r2, r2, #0x110000
add r2, r2, #0x002200
.if \is_read
ldrb r0, [r2, #0x18]
.else
strb r1, [r2, #0x18]
.endif
bx lr
.endm
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ -448,6 +469,35 @@ m_m68k_read8_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged
bx lr bx lr
m_m68k_read8_bcram_size: @ 0x400000
sub r0, r0, #1
cmp r0, #0x400000
ldreq r1, =SRam
mov r0, #0
ldreq r1, [r1]
bxne lr
tst r1, r1
movne r0, #3 @ pretend to be a 64k cart (8<<3)
bx lr
m_m68k_read8_bcram: @ 0x600000 - 0x61ffff
ldr r1, =SRam
bic r0, r0, #0xfe0000
ldr r1, [r1]
mov r0, r0, lsr #1
tst r1, r1
moveq r0, #0
bxeq lr
add r1, r1, #0x2000
ldrb r0, [r1, r0]
bx lr
m_m68k_read8_bcram_reg: @ 0x7fffff
bcram_reg_rw 1, 0x7fffff
m_m68k_read8_system_io: m_m68k_read8_system_io:
bic r2, r0, #0xfe0000 bic r2, r0, #0xfe0000
bic r2, r2, #0x3f bic r2, r2, #0x3f
@ -656,6 +706,25 @@ m_m68k_read16_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged
bx lr bx lr
m_m68k_read16_bcram_size: @ 0x400000
cmp r0, #0x400000
ldreq r1, =SRam
mov r0, #0
ldreq r1, [r1]
bxne lr
tst r1, r1
movne r0, #3 @ pretend to be a 64k cart
bx lr
@ m_m68k_read16_bcram: @ 0x600000 - 0x61ffff
.equiv m_m68k_read16_bcram, m_m68k_read8_bcram
m_m68k_read16_bcram_reg: @ 0x7fffff
bcram_reg_rw 1, 0x7ffffe
m_m68k_read16_system_io: m_m68k_read16_system_io:
bic r1, r0, #0xfe0000 bic r1, r0, #0xfe0000
bic r1, r1, #0x3f bic r1, r1, #0x3f
@ -851,6 +920,33 @@ m_m68k_read32_wordram1_1M_b1_unal:
bx r12 bx r12
m_m68k_read32_bcram_size: @ 0x400000
cmp r0, #0x400000
ldreq r1, =SRam
mov r0, #0
ldreq r1, [r1]
bxne lr
tst r1, r1
movne r0, #0x30000 @ pretend to be a 64k cart
bx lr
m_m68k_read32_bcram: @ 0x600000 - 0x61ffff, not likely to be called
mov r12,lr
add r3, r0, #2
bl m_m68k_read8_bcram
mov r1, r0
mov r0, r3
mov r3, r1
bl m_m68k_read8_bcram
orr r0, r0, r3, lsl #16
bx r12
m_m68k_read32_bcram_reg: @ 0x7fffff
bcram_reg_rw 1, 0x7ffffc
@ it is not very practical to use long access on hw registers, so I assume it is not used too much. @ it is not very practical to use long access on hw registers, so I assume it is not used too much.
m_m68k_read32_system_io: m_m68k_read32_system_io:
bic r1, r0, #0xfe0000 bic r1, r0, #0xfe0000
@ -916,6 +1012,7 @@ m_m68k_read32_ram:
m_write_null: m_write_null:
m_m68k_write8_bios: m_m68k_write8_bios:
m_m68k_write8_bcram_size: @ 0x400000
bx lr bx lr
@ -986,6 +1083,33 @@ m_m68k_write8_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged
bx lr bx lr
m_m68k_write8_bcram: @ 0x600000 - 0x61ffff
@ can't use r3 or r12, because of write32
ldr r2, =SRam
bic r0, r0, #0xfe0000
ldr r2, [r2]
tst r2, r2
bxeq lr
add r0, r2, r0, lsr #1
ldr r2, =(Pico+0x22200)
ldr r2, [r2]
add r0, r0, #0x2000
add r2, r2, #0x110000
add r2, r2, #0x002200
ldr r2, [r2, #0x18]
tst r2, #1 @ check bcram reg
bxeq lr
strb r1, [r0]
ldr r2, =SRam
mov r0, #1
strb r0, [r2, #0x0e] @ SRam.changed = 1
bx lr
m_m68k_write8_bcram_reg: @ 0x7fffff
bcram_reg_rw 0, 0x7fffff
m_m68k_write8_system_io: m_m68k_write8_system_io:
bic r2, r0, #0xfe0000 bic r2, r0, #0xfe0000
bic r2, r2, #0x3f bic r2, r2, #0x3f
@ -1020,6 +1144,7 @@ m_m68k_write8_ram:
m_m68k_write16_bios: m_m68k_write16_bios:
m_m68k_write16_bcram_size: @ 0x400000
bx lr bx lr
@ -1091,6 +1216,14 @@ m_m68k_write16_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged
bx lr bx lr
@ m_m68k_write16_bcram: @ 0x600000 - 0x61ffff
.equiv m_m68k_write16_bcram, m_m68k_write8_bcram
m_m68k_write16_bcram_reg: @ 0x7fffff
bcram_reg_rw 0, 0x7ffffe
m_m68k_write16_system_io: m_m68k_write16_system_io:
bic r0, r0, #1 bic r0, r0, #1
bic r2, r0, #0xfe0000 bic r2, r0, #0xfe0000
@ -1098,7 +1231,7 @@ m_m68k_write16_system_io:
cmp r2, #0x012000 cmp r2, #0x012000
bne OtherWrite16 bne OtherWrite16
m_m68k_write16_m68k_regs: m_m68k_write16_regs:
and r0, r0, #0x3e and r0, r0, #0x3e
cmp r0, #0x0e cmp r0, #0x0e
beq m_m68k_write16_regs_spec beq m_m68k_write16_regs_spec
@ -1153,6 +1286,7 @@ m_m68k_write16_ram:
m_m68k_write32_bios: m_m68k_write32_bios:
m_m68k_write32_bcram_size: @ 0x400000
bx lr bx lr
@ -1248,6 +1382,22 @@ m_m68k_write32_wordram1_1M_b1_unal:
b m_m68k_write16_wordram1_1M_b1 b m_m68k_write16_wordram1_1M_b1
m_m68k_write32_bcram: @ 0x600000 - 0x61ffff, not likely to be called
mov r12,lr
add r3, r0, #2
mov r1, r1, ror #16
bl m_m68k_write8_bcram
mov r0, r3
mov r1, r1, ror #16
bl m_m68k_write8_bcram
bx r12
m_m68k_write32_bcram_reg: @ 0x7fffff
bcram_reg_rw 0, 0x7ffffc
@ it is not very practical to use long access on hw registers, so I assume it is not used too much. @ it is not very practical to use long access on hw registers, so I assume it is not used too much.
m_m68k_write32_system_io: m_m68k_write32_system_io:
bic r2, r0, #0xfe0000 bic r2, r0, #0xfe0000
@ -1255,26 +1405,13 @@ m_m68k_write32_system_io:
cmp r2, #0x012000 cmp r2, #0x012000
bne m_m68k_write32_misc bne m_m68k_write32_misc
and r2, r0, #0x3e and r2, r0, #0x3e
cmp r2, #0x10
blt m_m68k_write32_regs
cmp r2, #0x20 cmp r2, #0x20
bxge lr bxge lr
@ Handle the 0x10-0x1f range cmp r2, #0x10
ldr r0, =(Pico+0x22200) bge m_m68k_write32_regs_comm
mov r3, #0xff cmp r2, #0x0c
ldr r0, [r0] bge m_m68k_write32_regs_spec @ hits the nasty comm reg qiurk
orr r3, r3, r3, lsl #16
add r0, r0, #0x110000
and r12,r3, r1, ror #16 @ data is big-endian to be written as little, have to byteswap
and r1, r3, r1, ror #24
orr r1, r1, r12,lsl #8 @ end of byteswap
strh r1, [r2, r0]!
cmp r2, #0x1e
movne r1, r1, lsr #16
strneh r1, [r2, #2]
bx lr
m_m68k_write32_regs:
bic r0, r0, #1 bic r0, r0, #1
stmfd sp!,{r0,r1,lr} stmfd sp!,{r0,r1,lr}
mov r1, r1, lsr #24 mov r1, r1, lsr #24
@ -1293,6 +1430,29 @@ m_m68k_write32_regs:
add r0, r0, #3 add r0, r0, #3
b m68k_reg_write8 b m68k_reg_write8
m_m68k_write32_regs_comm: @ Handle the 0x10-0x1f range
ldr r0, =(Pico+0x22200)
mov r3, #0xff
ldr r0, [r0]
orr r3, r3, r3, lsl #16
add r0, r0, #0x110000
and r12,r3, r1, ror #16 @ data is big-endian to be written as little, have to byteswap
and r1, r3, r1, ror #24
orr r1, r1, r12,lsl #8 @ end of byteswap
cmp r2, #0x1e
strh r1, [r2, r0]!
ldr r3, =s68k_poll_adclk
ldr r0, [r3]
movne r1, r1, lsr #16
strneh r1, [r2, #2]
cmp r0, #0x10
bxlt lr
ldr r0, =PicoCpuS68k @ remove poll detected state for s68k
mov r1, #0
str r1, [r0, #0x58]
str r1, [r3]
bx lr
m_m68k_write32_misc: m_m68k_write32_misc:
bic r0, r0, #1 bic r0, r0, #1
stmfd sp!,{r0,r1,lr} stmfd sp!,{r0,r1,lr}
@ -1302,6 +1462,15 @@ m_m68k_write32_misc:
add r0, r0, #2 add r0, r0, #2
b OtherWrite16 b OtherWrite16
m_m68k_write32_regs_spec:
bic r0, r0, #1
stmfd sp!,{r0,r1,lr}
mov r1, r1, lsr #16
bl m_m68k_write16_regs
ldmfd sp!,{r0,r1,lr}
add r0, r0, #2
b m_m68k_write16_regs
m_m68k_write32_vdp: m_m68k_write32_vdp:
tst r0, #0x70000 tst r0, #0x70000
@ -2123,12 +2292,11 @@ m_s68k_write32_pcm_ram:
m_s68k_write32_pcm_reg: m_s68k_write32_pcm_reg:
mov r0, r0, lsr #1 mov r0, r0, lsr #1
add r2, r0, #1 stmfd sp!,{r0,r1,lr}
mov r3, r1
stmfd sp!,{r2,r3,lr}
mov r1, r1, lsr #16 mov r1, r1, lsr #16
bl pcm_write bl pcm_write
ldmfd sp!,{r0,r1,lr} ldmfd sp!,{r0,r1,lr}
add r0, r0, #1
b pcm_write b pcm_write
@ -2137,11 +2305,16 @@ m_s68k_write32_regs:
bic r0, r0, #0x008000 bic r0, r0, #0x008000
bic r0, r0, #1 bic r0, r0, #1
tst r0, #0x7e00 tst r0, #0x7e00
movne r0, #0
bxne lr bxne lr
sub r2, r0, #0x58 sub r2, r0, #0x58
cmp r2, #0x10 cmp r2, #0x10
blo m_s68k_write32_regs_gfx blo m_s68k_write32_regs_gfx
and r2, r0, #0x1fc
cmp r2, #0x0c
beq m_s68k_write32_regs_spec @ hits 0x0f
and r2, r0, #0x1f0
cmp r2, #0x20
beq m_s68k_write32_regs_comm
stmfd sp!,{r0,r1,lr} stmfd sp!,{r0,r1,lr}
mov r1, r1, lsr #24 mov r1, r1, lsr #24
@ -2161,11 +2334,34 @@ m_s68k_write32_regs:
b s68k_reg_write8 b s68k_reg_write8
m_s68k_write32_regs_gfx: m_s68k_write32_regs_gfx:
mov r3, r1 stmfd sp!,{r0,r1,lr}
add r2, r0, #2
stmfd sp!,{r2,r3,lr}
mov r1, r1, lsr #16 mov r1, r1, lsr #16
bl gfx_cd_write16 bl gfx_cd_write16
ldmfd sp!,{r0,r1,lr} ldmfd sp!,{r0,r1,lr}
add r0, r0, #2
b gfx_cd_write16 b gfx_cd_write16
m_s68k_write32_regs_comm: @ Handle the 0x20-0x2f range
ldr r2, =(Pico+0x22200)
mov r3, #0xff
ldr r2, [r2]
orr r3, r3, r3, lsl #16
add r2, r2, #0x110000
and r12,r3, r1, ror #16 @ data is big-endian to be written as little, have to byteswap
and r1, r3, r1, ror #24
orr r1, r1, r12,lsl #8 @ end of byteswap
cmp r0, #0x2e
strh r1, [r0, r2]!
movne r1, r1, lsr #16
strneh r1, [r0, #2]
bx lr
m_s68k_write32_regs_spec:
stmfd sp!,{r0,r1,lr}
mov r1, r1, lsr #16
bl m_s68k_write16_regs
ldmfd sp!,{r0,r1,lr}
add r0, r0, #2
b m_s68k_write16_regs

View file

@ -1,3 +1,5 @@
// Some misc stuff
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
unsigned char formatted_bram[4*0x10] = unsigned char formatted_bram[4*0x10] =
@ -21,6 +23,7 @@ unsigned char formatted_bram[4*0x10] =
// 128K | bit ] | bank0 | // 128K | bit ] | bank0 |
// 256K | unused | bank1 | // 256K | unused | bank1 |
#ifndef _ASM_MISC_C
void wram_2M_to_1M(unsigned char *m) void wram_2M_to_1M(unsigned char *m)
{ {
unsigned short *m1M_b0, *m1M_b1; unsigned short *m1M_b0, *m1M_b1;
@ -53,4 +56,5 @@ void wram_1M_to_2M(unsigned char *m)
*m2M++ = tmp; *m2M++ = tmp;
} }
} }
#endif

View file

@ -1,10 +1,4 @@
// This is part of Pico Library
// (c) Copyright 2004 Dave, All rights reserved.
// (c) Copyright 2007 notaz, All rights reserved. // (c) Copyright 2007 notaz, All rights reserved.
// Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained.
#include "../PicoInt.h" #include "../PicoInt.h"
@ -81,6 +75,12 @@ int PicoResetMCD(int hard)
//PicoMemResetCDdecode(1); // don't have to call this in 2M mode //PicoMemResetCDdecode(1); // don't have to call this in 2M mode
#endif #endif
// use SRam.data for RAM cart
if (SRam.data) free(SRam.data);
SRam.data = NULL;
if (PicoOpt&0x8000)
SRam.data = calloc(1, 0x12000);
return 0; return 0;
} }

View file

@ -1,10 +1,4 @@
// This is part of Pico Library
// (c) Copyright 2004 Dave, All rights reserved.
// (c) Copyright 2006 notaz, All rights reserved. // (c) Copyright 2006 notaz, All rights reserved.
// Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained.
#include "../PicoInt.h" #include "../PicoInt.h"

View file

@ -1,3 +1,6 @@
// Buffering handling
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
#include "../PicoInt.h" #include "../PicoInt.h"
//#include <stdlib.h> //#include <stdlib.h>

View file

@ -1,3 +1,12 @@
/***********************************************************
* *
* This source was taken from the Gens project *
* Written by Stéphane Dallongeville *
* Copyright (c) 2002 by Stéphane Dallongeville *
* Modified/adapted for PicoDrive by notaz, 2007 *
* *
***********************************************************/
#include <sys/stat.h> #include <sys/stat.h>
#include "cd_file.h" #include "cd_file.h"

View file

@ -1,3 +1,12 @@
/***********************************************************
* *
* This source was taken from the Gens project *
* Written by Stéphane Dallongeville *
* Copyright (c) 2002 by Stéphane Dallongeville *
* Modified/adapted for PicoDrive by notaz, 2007 *
* *
***********************************************************/
#include <stdio.h> #include <stdio.h>
#include "cd_sys.h" #include "cd_sys.h"
#include "cd_file.h" #include "cd_file.h"
@ -17,19 +26,7 @@
#define PLAYING 0x0100 // PLAYING audio track CDD status #define PLAYING 0x0100 // PLAYING audio track CDD status
/*
int CDDA_Enable;
int CD_Audio_Buffer_L[8192];
int CD_Audio_Buffer_R[8192];
int CD_Audio_Buffer_Read_Pos = 0;
int CD_Audio_Buffer_Write_Pos = 2000;
int CD_Audio_Starting;
*/
static int CD_Present = 0; static int CD_Present = 0;
// int CD_Timer_Counter = 0; // TODO: check refs
#define CHECK_TRAY_OPEN \ #define CHECK_TRAY_OPEN \
@ -65,20 +62,6 @@ if (!CD_Present) \
} }
#if 0
static void MSB2DWORD(unsigned int *d, unsigned char *b)
{
unsigned int retVal;
retVal = (unsigned int )b[0];
retVal = (retVal<<8) + (unsigned int )b[1];
retVal = (retVal<<8) + (unsigned int )b[2];
retVal = (retVal<<8) + (unsigned int )b[3];
*d = retVal;
}
#endif
static int MSF_to_LBA(_msf *MSF) static int MSF_to_LBA(_msf *MSF)
{ {
return (MSF->M * 60 * 75) + (MSF->S * 75) + MSF->F - 150; return (MSF->M * 60 * 75) + (MSF->S * 75) + MSF->F - 150;

View file

@ -1,3 +1,12 @@
/***********************************************************
* *
* This source was taken from the Gens project *
* Written by Stéphane Dallongeville *
* Copyright (c) 2002 by Stéphane Dallongeville *
* Modified/adapted for PicoDrive by notaz, 2007 *
* *
***********************************************************/
#ifndef _CD_SYS_H #ifndef _CD_SYS_H
#define _CD_SYS_H #define _CD_SYS_H

View file

@ -1,3 +1,5 @@
// Convert "cell arrange" address to normal address.
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
// 64 x32 x16 x8 x4 x4 // 64 x32 x16 x8 x4 x4
static unsigned int cell_map(int celln) static unsigned int cell_map(int celln)

View file

@ -1,3 +1,9 @@
// This is a direct rewrite of gfx_cd.asm (x86 asm to C).
// You can even find some x86 register names :)
// Original code (c) 2002 by Stéphane Dallongeville
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
#include "../PicoInt.h" #include "../PicoInt.h"

76
Pico/cd/misc.s Normal file
View file

@ -0,0 +1,76 @@
@ vim:filetype=armasm
@ Memory converters for different modes
@ (c) Copyright 2007, Grazvydas "notaz" Ignotas
@ r10 is tmp, io1 is lsb halfword, io2 is msb
@ | 0 1 | 2 3 | -> | 0 2 | 1 3 | (little endian)
.macro _conv_reg io1 io2
mov r10, \io2, lsl #16
and \io2, \io2, r11, lsl #16
orr \io2, \io2, \io1, lsr #16
and \io1, \io1, r11
orr \io1, \io1, r10
/*
mov \io2, \io2, ror #16
mov r10, \io1, lsl #16
orr r10, r10, \io2, lsr #16
mov \io1, \io1, lsr #16
orr \io1, \io1, \io2, lsl #16
mov \io2, r10, ror #16
*/
.endm
.global wram_2M_to_1M
wram_2M_to_1M:
stmfd sp!,{r4-r11,lr}
add r1, r0, #0x60000 @ m1M_b1
add r0, r0, #0x40000 @ m1M_b0
mov r2, r0 @ m2M
mov r11, #0xff
orr r11, r11, r11, lsl #8
mov r12, #(0x40000/8/4)
_2Mto1M_loop:
ldmdb r2!,{r3-r9,lr}
_conv_reg r3,r4
_conv_reg r5,r6
_conv_reg r7,r8
_conv_reg r9,lr
subs r12, r12, #1
stmdb r0!,{r3,r5,r7,r9}
stmdb r1!,{r4,r6,r8,lr}
bne _2Mto1M_loop
ldmfd sp!,{r4-r11,pc}
.global wram_1M_to_2M
wram_1M_to_2M:
stmfd sp!,{r4-r11,lr}
mov r2, r0 @ m2M
add r1, r0, #0x40000 @ m1M_b1
add r0, r0, #0x20000 @ m1M_b0
mov r11, #0xff
orr r11, r11, r11, lsl #8
mov r12, #(0x40000/8/4)
_1Mto2M_loop:
ldmia r0!,{r3,r5,r7,r9}
ldmia r1!,{r4,r6,r8,lr}
_conv_reg r3,r4
_conv_reg r5,r6
_conv_reg r7,r8
_conv_reg r9,lr
subs r12, r12, #1
stmia r2!,{r3-r9,lr}
bne _1Mto2M_loop
ldmfd sp!,{r4-r11,pc}

View file

@ -1,3 +1,7 @@
// Emulation routines for the RF5C164 PCM chip.
// Based on Gens code by Stéphane Dallongeville
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
#include "../PicoInt.h" #include "../PicoInt.h"
#include "pcm.h" #include "pcm.h"

View file

@ -1,6 +1,8 @@
@ vim:filetype=armasm @ vim:filetype=armasm
@ Generic memory routines.
@ (c) Copyright 2007, Grazvydas "notaz" Ignotas
.global memcpy16 @ unsigned short *dest, unsigned short *src, int count .global memcpy16 @ unsigned short *dest, unsigned short *src, int count

View file

@ -1,5 +1,8 @@
@ vim:filetype=armasm @ vim:filetype=armasm
@ Generic routines for mixing audio samples
@ (c) Copyright 2007, Grazvydas "notaz" Ignotas
@ this assumes src is word aligned @ this assumes src is word aligned
.global mix_16h_to_32 @ int *dest, short *src, int count .global mix_16h_to_32 @ int *dest, short *src, int count

View file

@ -1,3 +1,6 @@
// Code for communication with ARM940 and control of it.
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -285,7 +288,7 @@ static void wait_busy_940(int job)
gp2x_memregs[0x3b46>>1], gp2x_memregl[0x4500>>2], gp2x_memregl[0x4510>>2]); gp2x_memregs[0x3b46>>1], gp2x_memregl[0x4500>>2], gp2x_memregl[0x4510>>2]);
printf("last lr: %08x, lastjob: %i\n", shared_ctl->last_lr, shared_ctl->lastjob); printf("last lr: %08x, lastjob: %i\n", shared_ctl->last_lr, shared_ctl->lastjob);
strcpy(menuErrorMsg, "940 crashed."); strcpy(menuErrorMsg, "940 crashed, too much overclock?");
engineState = PGS_Menu; engineState = PGS_Menu;
crashed_940 = 1; crashed_940 = 1;
} }

View file

@ -62,6 +62,7 @@ endif
ifeq "$(asm_misc)" "1" ifeq "$(asm_misc)" "1"
DEFINC += -D_ASM_MISC_C DEFINC += -D_ASM_MISC_C
OBJS += ../../Pico/misc_asm.o OBJS += ../../Pico/misc_asm.o
OBJS += ../../Pico/cd/misc_asm.o
endif endif
ifeq "$(asm_cdpico)" "1" ifeq "$(asm_cdpico)" "1"
DEFINC += -D_ASM_CD_PICO_C DEFINC += -D_ASM_CD_PICO_C
@ -156,6 +157,9 @@ testrefr.gpe : test.o gp2x.o asmutils.o
../../Pico/cd/memory_asm.o : ../../Pico/cd/Memory.s ../../Pico/cd/memory_asm.o : ../../Pico/cd/Memory.s
@echo $< @echo $<
@$(AS) $(ASOPT) $< -o $@ @$(AS) $(ASOPT) $< -o $@
../../Pico/cd/misc_asm.o : ../../Pico/cd/misc.s
@echo $<
@$(AS) $(ASOPT) $< -o $@
# build Cyclone # build Cyclone
../../cpu/Cyclone/proj/Cyclone.s : ../../cpu/Cyclone/proj/Cyclone.s :

View file

@ -0,0 +1,285 @@
[About]
This is yet another Megadrive / Genesis / Sega CD / Mega CD emulator, which was written having ARM-based handheld devices in mind (such as PDAs, smartphones and handheld consoles like GP2X of course). The critical parts (renderer, 68K and Z80 cpu interpreters) and some other random code is written in ARM asm, other code is C. The base code originates from Dave's (fdave, finalburn) PicoDrive 0.30 for Pocket PC. The Sega/Mega CD code is roughly based on Stephane Dallongeville's Gens.
For help / comments / questions visit GP32X boards at:
http://www.gp32x.com/board/
[How to make it run]
Copy PicoDrive.gpe, code940.bin and mmuhack.o to any place in your filesystem (all 3 files must be in the same directory) and run PicoDrive.gpe. Then load a ROM and enjoy! ROMs can be in .smd or .bin format and can be zipped.
If you have any problems (game does not boot, sound is glitchy, broken graphics), make sure you enable "Accurate timing", "Emulate Z80" and use "16bit accurate renderer". This way you will get the best compatibility this emulator can provide.
[How to run Sega/Mega CD games]
To play any game, you need BIOS files. These files must be copied to the same directory as PicoDrive.gpe. Files can be named as follows:
US: us_scd1_9210.bin us_scd2_9306.bin SegaCDBIOS9303.bin
EU: eu_mcd1_9210.bin eu_mcd2_9303.bin eu_mcd2_9306.bin
JP: jp_mcd1_9112.bin jp_mcd1_9111.bin
these files can also be zipped.
The game must be dumped to ISO format, but BIN can be used too. If you want CD music, you must use ISO+mp3 files. Audio from BIN files won't be read at all due to SD access issues. Also BIN files are usually larger, so it's better to use ISO. ISO+mp3 files can be named similarly as for other emus.
Here are some examples:
SonicCD.iso
SonicCD_02.mp3
SonicCD_03.mp3
...
Sonic the Hedgehog CD (US) - Track 01.iso
Sonic the Hedgehog CD (US) - Track 02.mp3
Sonic the Hedgehog CD (US) - Track 03.mp3
...
ISO files can also be zipped (but not mp3 files, as they are already compressed). Note that this can cause very long loading times, which may take up to several minutes. File naming is similar as with uncompressed ISOs.
Example:
SonicCD.zip
SonicCD_02.mp3
SonicCD_03.mp3
...
Notes:
If the game hangs after Sega logo, you may need to enable "better sync" and/or "Scale/Rot. fx" options, found in "Sega/Mega CD options" submenu, and then reset the game.
If FMV game performance is poor, try adjusting "ReadAhead buffer" to something like 2048K.
[Configuration]
1. "Renderer"
8bit fast:
This enables alternative heavily optimized tile-based renderer, which renders pixels not line-by-line (this is what accurate renderers do), but in 8x8 tiles, which is much faster. But because of the way it works it can't render any mid-frame image changes (raster effects), so it is useful only with some games.
Other two are accurate line-based renderers. The 8bit is faster but does not run well with some games like Street Racer.
2. "Scaling"
"hw" means GP2X hardware scaler, which causes no performance loss, but scaled image looks a bit blocky. "sw" means software scaling, which uses pixel averaging and may look a bit nicer, but blurry. Horizontal scaling is only for games which use so called "32 column mode" (256x224 or 256x240), and scales image width to 320 pixels. Vertical scales height to 240 for games which use height 224 (most of them).
3. "Accurate timing"
This adds some more emulation precision, but slows the emulation down. Without this option some games do not boot (Red Zone for example), others have sound problems. This options has no effect for Sega/Mega CD emulation.
4. "Accurate sprites"
This option improves emulation of sprite priorities, it also enables emulation of sprite collision bit. If you see one sprite being drawn incorrectly above the other (often seen in Sonic 3D Blast), you can enable this to fix the problem. This only works with the accurate renderers (see first option).
5. "Show FPS"
Self-explanatory. Format is XX/YY, where XX is the number of rendered frames and YY is the number of emulated frames per second.
6. "Frameskip"
How many frames to skip rendering before displaying another. "Auto" is recommended.
7. "Enable sound"
Does what it says. You must enable at least YM2612 or SN76496 (in advanced options, see below) for this to make sense.
8. "Sound Quality"
Sound rate and stereo mode. If you want 44100Hz sound, it is recommended to enable the second core (next option).
9. "Use ARM940 core for sound"
This option causes PicoDrive to use ARM940T core (GP2X's second CPU) for sound (i.e. to generate YM2612 samples) to improve performance noticeably.
10. "6 button pad"
If you enable this, games will think that 6 button gamepad is connected. If you go and reconfigure your keys, you will be able to bind X,Y,Z and mode actions.
11. "Region"
This option lets you force the game to think it is running on machine from the specified region, or just to set autodetection order. Also affects Sega/Mega CD.
12. "Use SRAM/BRAM savestates"
This will automatically read/write SRAM (or BRAM for Sega/Mega CD) savestates for games which are using them. SRAM is saved whenever you pause your game or exit the emulator.
13. "Confirm savestate"
Allows to enable confirmation on savestate saving (to prevent savestate overwrites), on loading (to prevent destroying current game progress), and on both or none.
14. "GP2X CPU clocks"
Here you can change clocks of both GP2X's CPUs. Larger values increase performance. There is no separate option for the second CPU because both CPUs use the same clock source. Setting this option to 200 will cause PicoDrive NOT to change GP2X's clocks at all (this is if you use external program to set clock).
15. "[Sega/Mega CD options]"
Enters Sega/Mega CD options menu (see below).
16. "[advanced options]"
Enters advanced options menu (see below).
17. "Save cfg as default"
If you save your config here it will be loaded on next ROM load, but only if there is no game specific config saved (which will be loaded in that case).
18. "Save cfg for current game only"
Whenever you load current ROM again these settings will be loaded (squidgehack and RAM settings will not take effect until emulator is restarted).
Advanced configuration
----------------------
Enter [advanced options] in config menu to see these options.
1. "Gamma correction"
Alters image gamma through GP2X hardware. Larger values make image to look brighter, lower - darker (default is 1.0).
2. "Emulate Z80"
Enables emulation of Z80 chip, which was mostly used to drive the other sound chips. Some games do complex sync with it, so you must enable it even if you don't use sound to be able to play them.
3. "Emulate YM2612 (FM)"
This enables emulation of six-channel FM sound synthesizer chip, which was used to produce sound effects and music.
4. "Emulate SN76496 (PSG)"
This enables emulation of additional sound chip for additional effects.
Note: if you change sound settings AFTER loading a ROM, you may need to reset game to get sound. This is because most games initialize sound chips on startup, and this data is lost when sound chips are being enabled/disabled.
5. "gzip savestates"
This will always apply gzip compression on your savestates, allowing you to save some space and load/save time.
6. "Don't save last used ROM"
This will disable writing last used ROM to config on exit (what might cause SD card corruption according to DaveC).
7. "craigix's RAM timings"
This overclocks the GP2X RAM chips, but may cause instability. Recommended if you use the second core for sound. Needs emulator restart to take effect.
See this thread:
http://www.gp32x.com/board/index.php?showtopic=32319
8. "squidgehack"
Well known way to improve the GP2X performance. You must restart the emulator for the change of this option to take effect.
Sega/Mega CD options
--------------------
1,2,3. "USA/EUR/JAP BIOS"
These options just show if your BIOS files were correctly detected by the emulator (it shows the filename it is using). If so, you can press Start to test your BIOS.
4. "CD LEDs"
The Sega/Mega CD unit had two blinking LEDs (red and green) on it. This option will display them on top-left corner of the screen.
5. "CDDA audio (using mp3s)"
This option enables CD audio playback.
6. "PCM audio"
This enables 8 channel PCM sound source. It is required for some games to run, because they monitor state of this audio chip.
7. "ReadAhead buffer"
This option is for dealing with slow SD card access in GP2X, which makes FMV games unplayable. It will allow emulator not to access SD card for longer periods of time, but it will take more time to fill the buffer.
8. "Save RAM cart"
Here you can enable 64K RAM cart. Format it in BIOS if you do.
9. "Scale/Rot. fx"
The Sega/Mega CD had scaling/rotation chip, which allows effects similar to "Mode 7" effects in SNES. Unfortunately emulating it is slow, and very few games used it, so it's better to disable this option, unless game really needs it.
10. "Better sync"
This option is similar to "Perfect synchro" in Gens. Some games require it to run, for example most (all?) Wolfteam games, and some other ones. Don't use it for games which don't need it, it will just slow them down.
Key configuration
-----------------
When you select "Configure controls" from the menu, you enter a key configuration mode, where you use SELECT to change an action, and then press a key you like to bind to that action. You can press the same key again to unbind. Select "DONE" action and press any key to finish.
[Other important stuff]
When you use both GP2X CPUs, keep in mind that you can't overclock as high as when using ARM920 only. For example my GP2X when run singlecore can reach 280MHz, but with both cores it's about 250MHz. When overclocked too much, it may start hanging and producing random noise, or causing ARM940 crashes ("940 crashed" message displayed).
PicoDrive is not a mp3 player, so all mp3s MUST be encoded at 44.1kHz stereo. Badly encoded mp3s can cause various kind of problems, like noises, incorrect playback speeds, not repeating music or even prevent game from starting. Use lower bitrate for better performance (96 or 128kbps CBRs recommended). Due to internal implementation mp3s must not be larger that ~15MB (15548416 bytes). Larger mp3s will not be fully loaded.
RAM timings option is good for dualcore operation (it is disabled by default because it doesn't work on every GP2X, so enable it in advanced options).
[Cheat support]
To use GG/patch codes, you must type them into your favorite text editor, one per line. Comments may follow code after a whitespace. Only GameGenie and Genecyst patch formats are supported.
Examples:
Genecyst patch (this example is for Sonic):
00334A:0005 Start with five lives
012D24:0001 Keep invincibility until end of stage
009C76:5478 each ring worth 2
009C76:5678 each ring worth 3
...
Game Genie patch (for Sonic 2):
ACLA-ATD4 Hidden palace instead of death egg in level select
...
Both GG and patch codes can be mixed in one file.
When the file is ready, name it just like your ROM file, but with additional .pat extension, making sure that case matches.
Examples:
ROM: Sonic.zip
PATCH FILE: Sonic.zip.pat
ROM: Sonic 2.bin
PATCH FILE: Sonic 2.bin.pat
Put the file into your ROMs directory. Then load the .pat file as you would a ROM. Then Cheat Menu Option should appear in main menu.
[What is emulated?]
Genesis/MegaDrive:
main 68k @ 7.6MHz: yes, Cyclone core
z80 @ 3.6MHz: yes, DrZ80 core
VDP: yes, except some quirks not used by games
YM2612 FM: yes, optimized MAME core
SN76489 PSG: yes, MAME core
Sega/Mega CD:
another 68k @ 12.5MHz: yes, Cyclone too
gfx scaling/rotation chip (custom ASIC): yes
PCM sound source: yes
CD-ROM controller: yes (mostly)
bram (internal backup RAM): yes
RAM cartridge: yes
[Problems / limitations]
* 32x and SVP are not emulated.
* Various VDP quirks (window bug, scroll size 2, etc.) are not emulated, as very few games use this (if any at all).
* Some games don't work or have glitches because of inaccurate timing and sync between the emulated chips.
[Credits]
This emulator uses code from these people/projects:
Dave
Cyclone 68000 core, Pico emulation library
Homepage: http://www.finalburn.com/
notaz
GP2X port, Cyclone 68000 hacks, lots of additional coding (see changelog).
Reesy & FluBBa
DrZ80, the Z80 emulator written in ARM assembly.
Homepage: http://reesy.gp32x.de/
Tatsuyuki Satoh, Jarek Burczynski, MultiArcadeMachineEmulator development software implementation of Yamaha FM sound generator
MultiArcadeMachineEmulator (MAME) development
Texas Instruments SN76489 / SN76496 programmable tone /noise generator
Homepage: http://www.mame.net/
Stephane Dallongeville
Gens, MD/Mega CD/32X emulator. Most Sega CD code is based on this emu.
Helix community
Helix mp3 decoder
[Additional thanks]
* Charles MacDonald (http://cgfm2.emuviews.com/) for old but still very useful info about genesis hardware.
* Steve Snake for all that he has done for Genesis emulation scene.
* Bart Trzynadlowski for his SSFII and 68000 docs.
* Haze for his research (http://haze.mameworld.info).
* Mark and Jean-loup for zlib library.
* rlyeh and all the other people behind the minimal library.
* Squidge for his famous squidgehack(tm).
* Dzz for his ARM940 sample code.
* GnoStiC & Puck2099 for USB joystick support.
* Hermes PS2R, god_at_hell for the CpuCtrl library.
* craigix for supplying the GP2X hardware and making this port possible.
* Alex for the icon.
* Anyone else I forgot. You know who you are.
[Disclaimer]
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.
SEGA/Genesis/MegaDrive/SEGA-CD/Mega-CD/32X are trademarks of Sega Enterprises Ltd.

BIN
platform/gp2x/PicoDrive.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View file

@ -1,3 +1,4 @@
@ vim:filetype=armasm
@ some color conversion and blitting routines @ some color conversion and blitting routines
@ (c) Copyright 2006, notaz @ (c) Copyright 2006, notaz

View file

@ -1,3 +1,6 @@
// The top-level functions for the ARM940
// (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas
#include "940shared.h" #include "940shared.h"
static _940_data_t *shared_data = (_940_data_t *) 0x00100000; static _940_data_t *shared_data = (_940_data_t *) 0x00100000;

View file

@ -1,5 +1,8 @@
@ vim:filetype=armasm: @ vim:filetype=armasm:
@ ARM940 initialization.
@ Based on ogg940 code by Dzz.
@ (c) Copyright 2007, Grazvydas "notaz" Ignotas
.equ mmsp2_regs, (0xc0000000-0x02000000) @ assume we live @ 0x2000000 bank .equ mmsp2_regs, (0xc0000000-0x02000000) @ assume we live @ 0x2000000 bank
.equ shared_ctl, 0x00200000 @ this is where shared_ctl struncture is located .equ shared_ctl, 0x00200000 @ this is where shared_ctl struncture is located

View file

@ -18,67 +18,79 @@ mid-frame image changes (raster effects), so it is useful only with some games.
Other two are accurate line-based renderers. The 8bit is faster but does not Other two are accurate line-based renderers. The 8bit is faster but does not
run well with some games like Street Racer. run well with some games like Street Racer.
2. "Accurate timing" 2. "Scaling"
"hw" means GP2X hardware scaler, which causes no performance loss, but scaled
image looks a bit blocky. "sw" means software scaling, which uses pixel
averaging and may look a bit nicer, but blurry. Horizontal scaling is only for
games which use so called "32 column mode" (256x224 or 256x240), and scales
image width to 320 pixels. Vertical scales height to 240 for games which use
height 224 (most of them).
3. "Accurate timing"
This adds some more emulation precision, but slows the emulation down. Without This adds some more emulation precision, but slows the emulation down. Without
this option some games do not boot (Red Zone for example), others have sound this option some games do not boot (Red Zone for example), others have sound
problems. This options has no effect for Sega/Mega CD emulation. problems. This options has no effect for Sega/Mega CD emulation.
3. "Accurate sprites" 4. "Accurate sprites"
This option improves emulation of sprite priorities, it also enables emulation This option improves emulation of sprite priorities, it also enables emulation
of sprite collision bit. If you see one sprite being drawn incorrectly above of sprite collision bit. If you see one sprite being drawn incorrectly above
the other (often seen in Sonic 3D Blast), you can enable this to fix the problem. the other (often seen in Sonic 3D Blast), you can enable this to fix the problem.
This only works with the default renderer (see first option). This only works with the accurate renderers (see first option).
4. "Show FPS" 5. "Show FPS"
Self-explanatory. Format is XX/YY, where XX is the number of rendered frames and Self-explanatory. Format is XX/YY, where XX is the number of rendered frames and
YY is the number of emulated frames per second. YY is the number of emulated frames per second.
5. "Frameskip" 6. "Frameskip"
How many frames to skip rendering before displaying another. How many frames to skip rendering before displaying another.
"Auto" is recommended. "Auto" is recommended.
6. "Enable sound" 7. "Enable sound"
Does what it says. You must enable at least YM2612 or SN76496 (in advanced options, Does what it says. You must enable at least YM2612 or SN76496 (in advanced options,
see below) for this to make sense. see below) for this to make sense.
7. "Sound Quality" 8. "Sound Quality"
Sound rate and stereo mode. If you want 44100Hz sound, it is recommended to enable Sound rate and stereo mode. If you want 44100Hz sound, it is recommended to enable
the second core (next option). the second core (next option).
8. "Use ARM940 core for sound" 9. "Use ARM940 core for sound"
This option causes PicoDrive to use ARM940T core (GP2X's second CPU) for sound This option causes PicoDrive to use ARM940T core (GP2X's second CPU) for sound
(i.e. to generate YM2612 samples) to improve performance noticeably. (i.e. to generate YM2612 samples) to improve performance noticeably.
9. "6 button pad" 10. "6 button pad"
If you enable this, games will think that 6 button gamepad is connected. If you If you enable this, games will think that 6 button gamepad is connected. If you
go and reconfigure your keys, you will be able to bind X,Y,Z and mode actions. go and reconfigure your keys, you will be able to bind X,Y,Z and mode actions.
10. "Genesis Region" 11. "Region"
This option lets you force the game to think it is running on machine from the This option lets you force the game to think it is running on machine from the
specified region, or just to set autodetection order. Also affects Sega/Mega CD. specified region, or just to set autodetection order. Also affects Sega/Mega CD.
11. "Use SRAM/BRAM savestates" 12. "Use SRAM/BRAM savestates"
This will automatically read/write SRAM (or BRAM for Sega/Mega CD) savestates for This will automatically read/write SRAM (or BRAM for Sega/Mega CD) savestates for
games which are using them. SRAM is saved whenever you pause your game or exit the games which are using them. SRAM is saved whenever you pause your game or exit the
emulator. emulator.
12. "GP2X CPU clocks" 13. "Confirm savestate"
Allows to enable confirmation on savestate saving (to prevent savestate overwrites),
on loading (to prevent destroying current game progress), and on both or none.
14. "GP2X CPU clocks"
Here you can change clocks of both GP2X's CPUs. Larger values increase performance. Here you can change clocks of both GP2X's CPUs. Larger values increase performance.
There is no separate option for the second CPU because both CPUs use the same clock There is no separate option for the second CPU because both CPUs use the same clock
source. Setting this option to 200 will cause PicoDrive NOT to change GP2X's clocks source. Setting this option to 200 will cause PicoDrive NOT to change GP2X's clocks
at all (this is if you use external program to set clock). at all (this is if you use external program to set clock).
13. "[Sega/Mega CD options]" 15. "[Sega/Mega CD options]"
Enters Sega/Mega CD options menu (see below). Enters Sega/Mega CD options menu (see below).
14. "[advanced options]" 16. "[advanced options]"
Enters advanced options menu (see below). Enters advanced options menu (see below).
15. "Save cfg as default" 17. "Save cfg as default"
If you save your config here it will be loaded on next ROM load, but only if there If you save your config here it will be loaded on next ROM load, but only if there
is no game specific config saved (which will be loaded in that case). is no game specific config saved (which will be loaded in that case).
16. "Save cfg for current game only" 18. "Save cfg for current game only"
Whenever you load current ROM again these settings will be loaded (squidgehack and Whenever you load current ROM again these settings will be loaded (squidgehack and
RAM settings will not take effect until emulator is restarted). RAM settings will not take effect until emulator is restarted).
@ -88,45 +100,41 @@ Advanced configuration
Enter [advanced options] in config menu to see these options. Enter [advanced options] in config menu to see these options.
1. "Scale 32 column mode" 1. "Gamma correction"
This enables hardware scaling for lower-res genesis mode (where width is
32 8-pixel tiles, instead of 40 in other mode).
2. "Gamma correction"
Alters image gamma through GP2X hardware. Larger values make image to look brighter, Alters image gamma through GP2X hardware. Larger values make image to look brighter,
lower - darker (default is 1.0). lower - darker (default is 1.0).
3. "Emulate Z80" 2. "Emulate Z80"
Enables emulation of Z80 chip, which was mostly used to drive the other sound chips. Enables emulation of Z80 chip, which was mostly used to drive the other sound chips.
Some games do complex sync with it, so you must enable it even if you don't use Some games do complex sync with it, so you must enable it even if you don't use
sound to be able to play them. sound to be able to play them.
4. "Emulate YM2612 (FM)" 3. "Emulate YM2612 (FM)"
This enables emulation of six-channel FM sound synthesizer chip, which was used to This enables emulation of six-channel FM sound synthesizer chip, which was used to
produce sound effects and music. produce sound effects and music.
5. "Emulate SN76496 (PSG)" 4. "Emulate SN76496 (PSG)"
This enables emulation of additional sound chip for additional effects. This enables emulation of additional sound chip for additional effects.
Note: if you change sound settings AFTER loading a ROM, you may need to reset Note: if you change sound settings AFTER loading a ROM, you may need to reset
game to get sound. This is because most games initialize sound chips on game to get sound. This is because most games initialize sound chips on
startup, and this data is lost when sound chips are being enabled/disabled. startup, and this data is lost when sound chips are being enabled/disabled.
6. "gzip savestates" 5. "gzip savestates"
This will always apply gzip compression on your savestates, allowing you to This will always apply gzip compression on your savestates, allowing you to
save some space and load/save time. save some space and load/save time.
7. "Don't save config on exit" 6. "Don't save last used ROM"
This will disable config autowrite on exit (which might cause SD card corruption This will disable writing last used ROM to config on exit (what might cause SD
according to DaveC). card corruption according to DaveC).
8. "craigix's RAM timings" 7. "craigix's RAM timings"
This overclocks the GP2X RAM chips, but may cause instability. Recommended if you This overclocks the GP2X RAM chips, but may cause instability. Recommended if you
use the second core for sound. Needs emulator restart to take effect. use the second core for sound. Needs emulator restart to take effect.
See this thread: See this thread:
http://www.gp32x.com/board/index.php?showtopic=32319 http://www.gp32x.com/board/index.php?showtopic=32319
9. "squidgehack" 8. "squidgehack"
Well known way to improve the GP2X performance. You must restart the emulator Well known way to improve the GP2X performance. You must restart the emulator
for the change of this option to take effect. for the change of this option to take effect.
@ -135,32 +143,35 @@ Sega/Mega CD options
-------------------- --------------------
1,2,3. "USA/EUR/JAP BIOS" 1,2,3. "USA/EUR/JAP BIOS"
These options just shows if your BIOS files were correctly detected be the These options just show if your BIOS files were correctly detected by the
emulator (it shows the filename it is using). If so, you can press Start to test emulator (it shows the filename it is using). If so, you can press Start to
your BIOS. test your BIOS.
4. "CD LEDs" 4. "CD LEDs"
The Sega/Mega CD unit had two blinking LEDs (red and green) on it. This option The Sega/Mega CD unit had two blinking LEDs (red and green) on it. This option
will display them on left-top corner of the screen. will display them on top-left corner of the screen.
5. "CDDA audio (using mp3s)" 5. "CDDA audio (using mp3s)"
This option enables CD audio playback. This option enables CD audio playback.
6. "PCM audio" 6. "PCM audio"
This enables 8 channel PCM sound source. It is required for some games to run, This enables 8 channel PCM sound source. It is required for some games to run,
because they monitor state of the audio chip. because they monitor state of this audio chip.
7. "ReadAhead buffer" 7. "ReadAhead buffer"
This option is for dealing with slow SD card access in GP2X, which makes FMV This option is for dealing with slow SD card access in GP2X, which makes FMV
games unplayable. It will allow emulator not to access SD card for longer periods games unplayable. It will allow emulator not to access SD card for longer periods
of time, but it will take more time to fill the buffer. of time, but it will take more time to fill the buffer.
8. "Scale/Rot. fx" 8. "Save RAM cart"
Here you can enable 64K RAM cart. Format it in BIOS if you do.
9. "Scale/Rot. fx"
The Sega/Mega CD had scaling/rotation chip, which allows effects similar to The Sega/Mega CD had scaling/rotation chip, which allows effects similar to
"Mode 7" effects in SNES. Unfortunately emulating it is slow, and very few games "Mode 7" effects in SNES. Unfortunately emulating it is slow, and very few games
used it, so it's better to disable this option. used it, so it's better to disable this option, unless game really needs it.
9. "Better sync" 10. "Better sync"
This option is similar to "Perfect synchro" in Gens. Some games require it to run, This option is similar to "Perfect synchro" in Gens. Some games require it to run,
for example most (all?) Wolfteam games, and some other ones. Don't use it for for example most (all?) Wolfteam games, and some other ones. Don't use it for
games which don't need it, it will just slow them down. games which don't need it, it will just slow them down.

View file

@ -1,4 +1,4 @@
// (c) Copyright 2006 notaz, All rights reserved. // (c) Copyright 2006-2007 notaz, All rights reserved.
// Free for non-commercial use. // Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained. // For commercial use, separate licencing terms must be obtained.
@ -310,7 +310,7 @@ int emu_ReloadRom(void)
// detect wrong files (Pico crashes on very small files), also see if ROM EP is good // detect wrong files (Pico crashes on very small files), also see if ROM EP is good
if(rom_size <= 0x200 || strncmp((char *)rom_data, "Pico", 4) == 0 || if(rom_size <= 0x200 || strncmp((char *)rom_data, "Pico", 4) == 0 ||
((*(unsigned short *)(rom_data+4)<<16)|(*(unsigned short *)(rom_data+6))) >= (int)rom_size) { ((*(unsigned char *)(rom_data+4)<<16)|(*(unsigned short *)(rom_data+6))) >= (int)rom_size) {
if (rom_data) free(rom_data); if (rom_data) free(rom_data);
rom_data = 0; rom_data = 0;
sprintf(menuErrorMsg, "Not a ROM selected."); sprintf(menuErrorMsg, "Not a ROM selected.");
@ -482,8 +482,8 @@ int emu_ReadConfig(int game)
// set default config // set default config
memset(&currentConfig, 0, sizeof(currentConfig)); memset(&currentConfig, 0, sizeof(currentConfig));
currentConfig.lastRomFile[0] = 0; currentConfig.lastRomFile[0] = 0;
currentConfig.EmuOpt = 0x1f | 0x400; // | cd_leds currentConfig.EmuOpt = 0x1f | 0x600; // | confirm_save, cd_leds
currentConfig.PicoOpt = 0x0f | 0xe00; // | use_940 | cd_pcm | cd_cdda currentConfig.PicoOpt = 0x0f | 0xe00; // | use_940, cd_pcm, cd_cdda
currentConfig.PsndRate = 22050; // 44100; currentConfig.PsndRate = 22050; // 44100;
currentConfig.PicoRegion = 0; // auto currentConfig.PicoRegion = 0; // auto
currentConfig.PicoAutoRgnOrder = 0x184; // US, EU, JP currentConfig.PicoAutoRgnOrder = 0x184; // US, EU, JP
@ -1328,7 +1328,7 @@ if (Pico.m.frame_count == 31563) {
// save SRAM // save SRAM
if((currentConfig.EmuOpt & 1) && SRam.changed) { if((currentConfig.EmuOpt & 1) && SRam.changed) {
osd_text(4, 232, "Writing SRAM/BRAM.."); emu_state_cb("Writing SRAM/BRAM..");
emu_SaveLoadGame(0, 1); emu_SaveLoadGame(0, 1);
SRam.changed = 0; SRam.changed = 0;
} }
@ -1459,29 +1459,40 @@ int emu_SaveLoadGame(int load, int sram)
FILE *sramFile; FILE *sramFile;
int sram_size; int sram_size;
unsigned char *sram_data; unsigned char *sram_data;
int truncate = 1;
if (PicoMCD&1) { if (PicoMCD&1) {
if (PicoOpt&0x8000) { // MCD RAM cart?
sram_size = 0x12000;
sram_data = SRam.data;
if (sram_data)
memcpy32((int *)sram_data, (int *)Pico_mcd->bram, 0x2000/4);
} else {
sram_size = 0x2000; sram_size = 0x2000;
sram_data = Pico_mcd->bram; sram_data = Pico_mcd->bram;
truncate = 0; // the .brm may contain RAM cart data after normal brm
}
} else { } else {
sram_size = SRam.end-SRam.start+1; sram_size = SRam.end-SRam.start+1;
if(SRam.reg_back & 4) sram_size=0x2000; if(SRam.reg_back & 4) sram_size=0x2000;
sram_data = SRam.data; sram_data = SRam.data;
} }
if(!sram_data) return 0; // SRam forcefully disabled for this game if (!sram_data) return 0; // SRam forcefully disabled for this game
if(load) { if (load) {
sramFile = fopen(saveFname, "rb"); sramFile = fopen(saveFname, "rb");
if(!sramFile) return -1; if(!sramFile) return -1;
fread(sram_data, 1, sram_size, sramFile); fread(sram_data, 1, sram_size, sramFile);
fclose(sramFile); fclose(sramFile);
if ((PicoMCD&1) && (PicoOpt&0x8000))
memcpy32((int *)Pico_mcd->bram, (int *)sram_data, 0x2000/4);
} else { } else {
// sram save needs some special processing // sram save needs some special processing
// see if we have anything to save // see if we have anything to save
for(; sram_size > 0; sram_size--) for (; sram_size > 0; sram_size--)
if(sram_data[sram_size-1]) break; if (sram_data[sram_size-1]) break;
if(sram_size) { if (sram_size) {
sramFile = fopen(saveFname, "wb"); sramFile = fopen(saveFname, truncate ? "wb" : "r+b");
ret = fwrite(sram_data, 1, sram_size, sramFile); ret = fwrite(sram_data, 1, sram_size, sramFile);
ret = (ret != sram_size) ? -1 : 0; ret = (ret != sram_size) ? -1 : 0;
fclose(sramFile); fclose(sramFile);

View file

@ -1,4 +1,4 @@
// (c) Copyright 2006 notaz, All rights reserved. // (c) Copyright 2006-2007 notaz, All rights reserved.
// Free for non-commercial use. // Free for non-commercial use.
// For commercial use, separate licencing terms must be obtained. // For commercial use, separate licencing terms must be obtained.

View file

@ -772,8 +772,9 @@ static void draw_cd_menu_options(int menu_sel, char *b_us, char *b_eu, char *b_j
gp2x_text_out8(tl_x, (y+=10), "CDDA audio (using mp3s) %s", (currentConfig.PicoOpt&0x0800)?"ON":"OFF"); // 4 gp2x_text_out8(tl_x, (y+=10), "CDDA audio (using mp3s) %s", (currentConfig.PicoOpt&0x0800)?"ON":"OFF"); // 4
gp2x_text_out8(tl_x, (y+=10), "PCM audio %s", (currentConfig.PicoOpt&0x0400)?"ON":"OFF"); // 5 gp2x_text_out8(tl_x, (y+=10), "PCM audio %s", (currentConfig.PicoOpt&0x0400)?"ON":"OFF"); // 5
gp2x_text_out8(tl_x, (y+=10), "ReadAhead buffer %s", ra_buff); // 6 gp2x_text_out8(tl_x, (y+=10), "ReadAhead buffer %s", ra_buff); // 6
gp2x_text_out8(tl_x, (y+=10), "Scale/Rot. fx (slow) %s", (currentConfig.PicoOpt&0x1000)?"ON":"OFF"); // 7 gp2x_text_out8(tl_x, (y+=10), "SaveRAM cart %s", (currentConfig.PicoOpt&0x8000)?"ON":"OFF"); // 7
gp2x_text_out8(tl_x, (y+=10), "Better sync (slow) %s", (currentConfig.PicoOpt&0x2000)?"ON":"OFF"); // 8 gp2x_text_out8(tl_x, (y+=10), "Scale/Rot. fx (slow) %s", (currentConfig.PicoOpt&0x1000)?"ON":"OFF"); // 8
gp2x_text_out8(tl_x, (y+=10), "Better sync (slow) %s", (currentConfig.PicoOpt&0x2000)?"ON":"OFF"); // 9
gp2x_text_out8(tl_x, (y+=10), "Done"); gp2x_text_out8(tl_x, (y+=10), "Done");
// draw cursor // draw cursor
@ -789,7 +790,7 @@ static void draw_cd_menu_options(int menu_sel, char *b_us, char *b_eu, char *b_j
static void cd_menu_loop_options(void) static void cd_menu_loop_options(void)
{ {
int menu_sel = 0, menu_sel_max = 9; int menu_sel = 0, menu_sel_max = 10;
unsigned long inp = 0; unsigned long inp = 0;
char bios_us[32], bios_eu[32], bios_jp[32], *bios, *p; char bios_us[32], bios_eu[32], bios_jp[32], *bios, *p;
@ -829,9 +830,10 @@ static void cd_menu_loop_options(void)
if (PicoCDBuffers > 8*1024) PicoCDBuffers = 8*1024; // 16M if (PicoCDBuffers > 8*1024) PicoCDBuffers = 8*1024; // 16M
} }
break; break;
case 7: currentConfig.PicoOpt^=0x1000; break; case 7: currentConfig.PicoOpt^=0x8000; break;
case 8: currentConfig.PicoOpt^=0x2000; break; case 8: currentConfig.PicoOpt^=0x1000; break;
case 9: return; case 9: currentConfig.PicoOpt^=0x2000; break;
case 10: return;
} }
} }
if(inp & (GP2X_X|GP2X_A)) return; if(inp & (GP2X_X|GP2X_A)) return;
@ -996,7 +998,7 @@ static void draw_menu_options(int menu_sel)
gp2x_text_out8(tl_x, (y+=10), "Sound Quality: %5iHz %s", currentConfig.PsndRate, monostereo); gp2x_text_out8(tl_x, (y+=10), "Sound Quality: %5iHz %s", currentConfig.PsndRate, monostereo);
gp2x_text_out8(tl_x, (y+=10), "Use ARM940 core for sound %s", (currentConfig.PicoOpt&0x200)?"ON":"OFF"); // 8 gp2x_text_out8(tl_x, (y+=10), "Use ARM940 core for sound %s", (currentConfig.PicoOpt&0x200)?"ON":"OFF"); // 8
gp2x_text_out8(tl_x, (y+=10), "6 button pad %s", (currentConfig.PicoOpt&0x020)?"ON":"OFF"); // 9 gp2x_text_out8(tl_x, (y+=10), "6 button pad %s", (currentConfig.PicoOpt&0x020)?"ON":"OFF"); // 9
gp2x_text_out8(tl_x, (y+=10), "Genesis Region: %s", region_name(currentConfig.PicoRegion)); gp2x_text_out8(tl_x, (y+=10), "Region: %s", region_name(currentConfig.PicoRegion));
gp2x_text_out8(tl_x, (y+=10), "Use SRAM/BRAM savestates %s", (currentConfig.EmuOpt &0x001)?"ON":"OFF"); // 11 gp2x_text_out8(tl_x, (y+=10), "Use SRAM/BRAM savestates %s", (currentConfig.EmuOpt &0x001)?"ON":"OFF"); // 11
gp2x_text_out8(tl_x, (y+=10), "Confirm savestate %s", strssconfirm); // 12 gp2x_text_out8(tl_x, (y+=10), "Confirm savestate %s", strssconfirm); // 12
gp2x_text_out8(tl_x, (y+=10), "Save slot %i", state_slot); // 13 gp2x_text_out8(tl_x, (y+=10), "Save slot %i", state_slot); // 13

View file

@ -1,3 +1,6 @@
// Some mp3 related code for Sega/Mega CD
// (c) Copyright 2007, Grazvydas "notaz" Ignotas
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>

View file

@ -1,3 +1,5 @@
@ vim:filetype=armasm
@ .equiv START_ROW, 1 @ .equiv START_ROW, 1
@ .equiv END_ROW, 27 @ .equiv END_ROW, 27
@ one row means 8 pixels. If above example was used, (27-1)*8=208 lines would be rendered. @ one row means 8 pixels. If above example was used, (27-1)*8=208 lines would be rendered.

View file

@ -22,8 +22,8 @@ Copy PicoDrive.gpe, code940.bin and mmuhack.o to any place in your filesystem
Then load a ROM and enjoy! ROMs can be in .smd or .bin format and can be zipped. Then load a ROM and enjoy! ROMs can be in .smd or .bin format and can be zipped.
If you have any problems (game does not boot, sound is glitchy, broken graphics), If you have any problems (game does not boot, sound is glitchy, broken graphics),
make sure you enable "Accurate timing", "Emulate Z80" and then disable make sure you enable "Accurate timing", "Emulate Z80" and use "16bit accurate
"Fast renderer". This way you will get the best compatibility this emulator can renderer". This way you will get the best compatibility this emulator can
provide. provide.
@ -63,6 +63,13 @@ SonicCD_02.mp3 audio track 1 (CD track 2)
SonicCD_03.mp3 SonicCD_03.mp3
... ...
Notes:
If the game hangs after Sega logo, you may need to enable "better sync"
and/or "Scale/Rot. fx" options, found in "Sega/Mega CD options" submenu, and
then reset the game.
If FMV game performance is poor, try adjusting "ReadAhead buffer" to something
like 2048K.
Configuration Configuration
------------- -------------
@ -76,12 +83,14 @@ Other important stuff
* When you use both GP2X CPUs, keep in mind that you can't overclock as high as * When you use both GP2X CPUs, keep in mind that you can't overclock as high as
when using ARM920 only. For example my GP2X when run singlecore can reach when using ARM920 only. For example my GP2X when run singlecore can reach
280MHz, but with both cores it's about 250MHz. When overclocked too much, 280MHz, but with both cores it's about 250MHz. When overclocked too much,
it may start hanging and producing random noise. it may start hanging and producing random noise, or causing ARM940 crashes
("940 crashed" message displayed).
* PicoDrive is not a mp3 player, so all mp3s MUST be encoded at 44.1kHz stereo. * PicoDrive is not a mp3 player, so all mp3s MUST be encoded at 44.1kHz stereo.
Otherwise mp3s will play too fast or too slow. Badly encoded mp3s can cause various kind of problems, like noises, incorrect
playback speeds, not repeating music or even prevent game from starting.
* Use lower bitrate for better performance (96 or 128kbps CBRs recommended).
* Due to internal implementation mp3s must not be larger that ~15MB * Due to internal implementation mp3s must not be larger that ~15MB
(15548416 bytes). Larger mp3s will not be fully loaded. (15548416 bytes). Larger mp3s will not be fully loaded.
* Use lower bitrate for better performance (96 or 128kbps CBRs recommended).
* RAM timings option is good for dualcore operation (it is disabled by * RAM timings option is good for dualcore operation (it is disabled by
default because it doesn't work on every GP2X, so enable it in advanced default because it doesn't work on every GP2X, so enable it in advanced
options). options).
@ -137,7 +146,7 @@ SN76489 PSG: yes, MAME core
Sega/Mega CD: Sega/Mega CD:
another 68k @ 12.5MHz: yes, Cyclone too another 68k @ 12.5MHz: yes, Cyclone too
gfx scaling/rotation chip (custom ASIC): not yet (faked only) gfx scaling/rotation chip (custom ASIC): yes
PCM sound source: yes PCM sound source: yes
CD-ROM controller: yes (mostly) CD-ROM controller: yes (mostly)
bram (internal backup RAM): yes bram (internal backup RAM): yes
@ -201,6 +210,7 @@ GP2X:
* GnoStiC & Puck2099 for USB joystick support. * GnoStiC & Puck2099 for USB joystick support.
* Hermes PS2R, god_at_hell for the CpuCtrl library. * Hermes PS2R, god_at_hell for the CpuCtrl library.
* craigix for supplying the GP2X hardware and making this port possible. * craigix for supplying the GP2X hardware and making this port possible.
* Alex for the icon.
Symbian: Symbian:
* Peter van Sebille for his various open-source Symbian projects to learn from. * Peter van Sebille for his various open-source Symbian projects to learn from.
@ -216,8 +226,9 @@ Changelog
--------- ---------
1.32 1.32
+ Added some new scaling options. + Added some new scaling options.
+ Added ability to reaload CD images while game is running (needed for games + Added ability to reload CD images while game is running (needed for games
with multiple CDs, like Night Trap). with multiple CDs, like Night Trap).
+ Added RAM cart emulation.
* Fixed DMA timing emulation (caused lock-ups for some genesis games). * Fixed DMA timing emulation (caused lock-ups for some genesis games).
* Idle loop detection was picking up wrong code and causing glitches, fixed. * Idle loop detection was picking up wrong code and causing glitches, fixed.
* The ym2612 code on 940 now can handle multiple updates per frame * The ym2612 code on 940 now can handle multiple updates per frame
@ -226,10 +237,12 @@ Changelog
Popful Mail, Silpheed). Popful Mail, Silpheed).
* Improved z80 timing, should fix some sound problems. * Improved z80 timing, should fix some sound problems.
* Fixed a bug with sram register (fixes Phantasy Star 4). * Fixed a bug with sram register (fixes Phantasy Star 4).
* ROM loader was incorrectly identifying some ROMs as invalid. Fixed.
* Added code for PRG ram write protection register (Dungeon Explorer). * Added code for PRG ram write protection register (Dungeon Explorer).
* The memory mode register change in 1.31 was unsafe and caused some glitches in * The memory mode register change in 1.31 was unsafe and caused some glitches in
AH-3 Thunderstrike. Fixed. AH-3 Thunderstrike. Fixed.
* Fixed a file descriptor leak. * Fixed a file descriptor leak.
* Updated documentation, added Gmenu2x manual.
1.31 1.31
* Changed the way memory mode register is read (fixes Lunar 2, broken in 1.30). * Changed the way memory mode register is read (fixes Lunar 2, broken in 1.30).