docs updated, gfx_cd works(?)

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@74 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2007-03-22 19:22:55 +00:00
parent a403080104
commit 01bc6b1993
7 changed files with 94 additions and 107 deletions

View file

@ -29,36 +29,6 @@ static const int Table_Rot_Time[] =
}; };
#if 1*0
typedef struct
{
unsigned int Reg_58; // Stamp_Size
unsigned int Reg_5A;
unsigned int Reg_5C;
unsigned int Reg_5E;
unsigned int Reg_60;
unsigned int Reg_62;
unsigned int Reg_64; // V_Dot
unsigned int Reg_66;
unsigned int Stamp_Map_Adr;
unsigned int Buffer_Adr;
unsigned int Vector_Adr;
unsigned int Function; // Jmp_Adr;
unsigned int Float_Part;
unsigned int Draw_Speed;
unsigned int XS;
unsigned int YS;
/*unsigned*/ int DXS;
/*unsigned*/ int DYS;
unsigned int XD;
unsigned int YD;
unsigned int XD_Mul;
unsigned int H_Dot;
} Rot_Comp;
#endif
static void gfx_cd_start(void) static void gfx_cd_start(void)
{ {
int upd_len; int upd_len;
@ -126,8 +96,6 @@ static void gfx_do(void)
rot_comp.DYS = rot_comp.DXS >> 16; rot_comp.DYS = rot_comp.DXS >> 16;
rot_comp.DXS = (rot_comp.DXS << 16) >> 16; // sign extend rot_comp.DXS = (rot_comp.DXS << 16) >> 16; // sign extend
rot_comp.Vector_Adr += 8; rot_comp.Vector_Adr += 8;
//if ((rot_comp.H_Dot & 0x1ff) == 0)
// goto nothing_to_draw;
// MAKE_IMAGE_LINE // MAKE_IMAGE_LINE
while (rot_comp.H_Dot) while (rot_comp.H_Dot)
@ -136,12 +104,12 @@ static void gfx_do(void)
{ {
if (func & 4) // 16x16 screen if (func & 4) // 16x16 screen
{ {
eax = (ecx >> (11+5)) & 0x7f; eax = (ecx >> (11+5)) & 0x007f;
ebx = (edx >> (11-2)) & 0x3f80; ebx = (edx >> (11-2)) & 0x3f80;
} }
else // 1x1 screen else // 1x1 screen
{ {
eax = (ecx >> (11+5)) & 0x0f; eax = (ecx >> (11+5)) & 0x07;
ebx = (edx >> (11+2)) & 0x38; ebx = (edx >> (11+2)) & 0x38;
} }
} }
@ -149,7 +117,7 @@ static void gfx_do(void)
{ {
if (func & 4) // 16x16 screen if (func & 4) // 16x16 screen
{ {
eax = (ecx >> (11+4)) & 0xff; eax = (ecx >> (11+4)) & 0x00ff;
ebx = (edx >> (11-4)) & 0xff00; ebx = (edx >> (11-4)) & 0xff00;
} }
else // 1x1 screen else // 1x1 screen
@ -160,7 +128,7 @@ static void gfx_do(void)
} }
ebx += eax; ebx += eax;
esi = rot_comp.Stamp_Map_Adr; // esi = rot_comp.Stamp_Map_Adr;
ptrs = (unsigned short *) (Pico_mcd->word_ram2M + rot_comp.Stamp_Map_Adr + ebx*2); ptrs = (unsigned short *) (Pico_mcd->word_ram2M + rot_comp.Stamp_Map_Adr + ebx*2);
edi = ptrs[0] | (ptrs[1] << 16); edi = ptrs[0] | (ptrs[1] << 16);
@ -191,131 +159,102 @@ static void gfx_do(void)
ebx += esi; ebx += esi;
edi = (eax & 0x3800) ^ 0x1000; // bswap edi = (eax & 0x3800) ^ 0x1000; // bswap
eax = ((eax >> 8) & 0x40) + ebx; eax = ((eax >> 8) & 0x40) + ebx;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x01: // No_Flip_0, 32x32 dots case 0x01: // No_Flip_0, 32x32 dots
ebx = (ebx >> 9) & 0x7c; ebx = (ebx >> 9) & 0x7c;
ebx += esi; ebx += esi;
edi = (eax & 0x3800) ^ 0x1000; // bswap edi = (eax & 0x3800) ^ 0x1000; // bswap
eax = ((eax >> 7) & 0x180) + ebx; eax = ((eax >> 7) & 0x180) + ebx;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x02: // No_Flip_90, 16x16 dots case 0x02: // No_Flip_90, 16x16 dots
eax = (eax >> 9) & 0x3c; eax = (eax >> 9) & 0x3c;
eax += esi; eax += esi;
edi = (ebx & 0x3800) ^ 0x2800; // bswap edi = (ebx & 0x3800) ^ 0x2800; // bswap
eax += ((ebx >> 8) & 0x40) ^ 0x40; eax += ((ebx >> 8) & 0x40) ^ 0x40;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x03: // No_Flip_90, 32x32 dots case 0x03: // No_Flip_90, 32x32 dots
eax = (eax >> 9) & 0x7c; eax = (eax >> 9) & 0x7c;
eax += esi; eax += esi;
edi = (ebx & 0x3800) ^ 0x2800; // bswap edi = (ebx & 0x3800) ^ 0x2800; // bswap
eax += (ebx >> 7) & 0x180; eax += ((ebx >> 7) & 0x180) ^ 0x180;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x04: // No_Flip_180, 16x16 dots case 0x04: // No_Flip_180, 16x16 dots
ebx = ((ebx >> 9) & 0x3c) ^ 0x3c; ebx = ((ebx >> 9) & 0x3c) ^ 0x3c;
ebx += esi; ebx += esi;
edi = (eax & 0x3800) ^ 0x2800; // bswap and flip edi = (eax & 0x3800) ^ 0x2800; // bswap and flip
eax = (((eax >> 8) & 0x40) ^ 0x40) + ebx; eax = (((eax >> 8) & 0x40) ^ 0x40) + ebx;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x05: // No_Flip_180, 32x32 dots case 0x05: // No_Flip_180, 32x32 dots
ebx = ((ebx >> 9) & 0x7c) ^ 0x7c; ebx = ((ebx >> 9) & 0x7c) ^ 0x7c;
ebx += esi; ebx += esi;
edi = (eax & 0x3800) ^ 0x2800; // bswap and flip edi = (eax & 0x3800) ^ 0x2800; // bswap and flip
eax = (((eax >> 7) & 0x180) ^ 0x180) + ebx; eax = (((eax >> 7) & 0x180) ^ 0x180) + ebx;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x06: // No_Flip_270, 16x16 dots case 0x06: // No_Flip_270, 16x16 dots
eax = ((eax >> 9) & 0x3c) ^ 0x3c; eax = ((eax >> 9) & 0x3c) ^ 0x3c;
eax += esi; eax += esi;
edi = (ebx & 0x3800) ^ 0x1000; // bswap edi = (ebx & 0x3800) ^ 0x1000; // bswap
eax += (ebx >> 8) & 0x40; eax += (ebx >> 8) & 0x40;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x07: // No_Flip_270, 32x32 dots case 0x07: // No_Flip_270, 32x32 dots
eax = ((eax >> 9) & 0x7c) ^ 0x7c; eax = ((eax >> 9) & 0x7c) ^ 0x7c;
eax += esi; eax += esi;
edi = (ebx & 0x3800) ^ 0x1000; // bswap edi = (ebx & 0x3800) ^ 0x1000; // bswap
eax += (ebx >> 7) & 0x180; eax += (ebx >> 7) & 0x180;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x08: // Flip_0, 16x16 dots case 0x08: // Flip_0, 16x16 dots
ebx = ((ebx >> 9) & 0x3c) ^ 0x3c; ebx = (ebx >> 9) & 0x3c;
ebx += esi; ebx += esi;
edi = (eax & 0x3800) ^ 0x2800; // bswap, flip edi = (eax & 0x3800) ^ 0x2800; // bswap, flip
eax = (((eax >> 8) & 0x40) ^ 0x40) + ebx; eax = (((eax >> 8) & 0x40) ^ 0x40) + ebx;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x09: // Flip_0, 32x32 dots case 0x09: // Flip_0, 32x32 dots
ebx = ((ebx >> 9) & 0x7c) ^ 0x7c; ebx = (ebx >> 9) & 0x7c;
ebx += esi; ebx += esi;
edi = (eax & 0x3800) ^ 0x2800; // bswap, flip edi = (eax & 0x3800) ^ 0x2800; // bswap, flip
eax = (((eax >> 7) & 0x180) ^ 0x180) + ebx; eax = (((eax >> 7) & 0x180) ^ 0x180) + ebx;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x0a: // Flip_90, 16x16 dots case 0x0a: // Flip_90, 16x16 dots
eax = ((eax >> 9) & 0x3c) ^ 0x3c; eax = ((eax >> 9) & 0x3c) ^ 0x3c;
eax += esi; eax += esi;
edi = (ebx & 0x3800) ^ 0x2800; // bswap, flip edi = (ebx & 0x3800) ^ 0x2800; // bswap, flip
eax += ((ebx >> 8) & 0x40) ^ 0x40; eax += ((ebx >> 8) & 0x40) ^ 0x40;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x0b: // Flip_90, 32x32 dots case 0x0b: // Flip_90, 32x32 dots
eax = ((eax >> 9) & 0x7c) ^ 0x7c; eax = ((eax >> 9) & 0x7c) ^ 0x7c;
eax += esi; eax += esi;
edi = (ebx & 0x3800) ^ 0x2800; // bswap, flip edi = (ebx & 0x3800) ^ 0x2800; // bswap, flip
eax += ((ebx >> 7) & 0x180) ^ 0x180; eax += ((ebx >> 7) & 0x180) ^ 0x180;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x0c: // Flip_180, 16x16 dots case 0x0c: // Flip_180, 16x16 dots
ebx = ((ebx >> 9) & 0x3c) ^ 0x3c; ebx = ((ebx >> 9) & 0x3c) ^ 0x3c;
ebx += esi; ebx += esi;
edi = (eax & 0x3800) ^ 0x1000; // bswap edi = (eax & 0x3800) ^ 0x1000; // bswap
eax = ((eax >> 8) & 0x40) + ebx; eax = ((eax >> 8) & 0x40) + ebx;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x0d: // Flip_180, 32x32 dots case 0x0d: // Flip_180, 32x32 dots
ebx = ((ebx >> 9) & 0x7c) ^ 0x7c; ebx = ((ebx >> 9) & 0x7c) ^ 0x7c;
ebx += esi; ebx += esi;
edi = (eax & 0x3800) ^ 0x1000; // bswap edi = (eax & 0x3800) ^ 0x1000; // bswap
eax = ((eax >> 7) & 0x180) + ebx; eax = ((eax >> 7) & 0x180) + ebx;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x0e: // Flip_270, 16x16 dots case 0x0e: // Flip_270, 16x16 dots
eax = (eax >> 9) & 0x3c; eax = (eax >> 9) & 0x3c;
eax += esi; eax += esi;
edi = (ebx & 0x3800) ^ 0x1000; // bswap, flip edi = (ebx & 0x3800) ^ 0x1000; // bswap, flip
eax += (ebx >> 8) & 0x40; eax += (ebx >> 8) & 0x40;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
case 0x0f: // Flip_270, 32x32 dots case 0x0f: // Flip_270, 32x32 dots
eax = (eax >> 9) & 0x7c; eax = (eax >> 9) & 0x7c;
eax += esi; eax += esi;
edi = (ebx & 0x3800) ^ 0x1000; // bswap, flip edi = (ebx & 0x3800) ^ 0x1000; // bswap, flip
eax += (ebx >> 7) & 0x180; eax += (ebx >> 7) & 0x180;
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
break; break;
} }
pixel = *(Pico_mcd->word_ram2M + (edi >> 12) + eax);
if (!(edi & 0x800)) pixel >>= 4;
Pixel_Out: Pixel_Out:
// pixel = 0; // pixel = 0;
//Finish: //Finish:

View file

@ -22,8 +22,8 @@ typedef struct
unsigned int XS; unsigned int XS;
unsigned int YS; unsigned int YS;
unsigned int DXS; /*unsigned*/ int DXS;
unsigned int DYS; /*unsigned*/ int DYS;
unsigned int XD; unsigned int XD;
unsigned int YD; unsigned int YD;
unsigned int XD_Mul; unsigned int XD_Mul;

View file

@ -1,6 +1,9 @@
As PicoDrive is multiplatform emulator, this is GP2X specific part of readme As PicoDrive is multiplatform emulator, this is GP2X specific part of readme
about configuration. about configuration.
If you have questions, you can use GP32X to ask for help.
http://www.gp32x.com/board/index.php?showforum=48
Configuration Configuration
------------- -------------
@ -16,9 +19,9 @@ 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. "Accurate timing"
This adds some more emulation precision, but slows the emulation down. Whithout 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. problems. This options has no effect for Sega/Mega CD emulation.
3. "Accurate sprites" 3. "Accurate sprites"
This option improves emulation of sprite priorities, it also enables emulation This option improves emulation of sprite priorities, it also enables emulation
@ -52,29 +55,34 @@ go and reconfigure your keys, you will be able to bind X,Y,Z and mode actions.
10. "Genesis Region" 10. "Genesis 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. specified region, or just to set autodetection order. Also affects Sega/Mega CD.
11. "Use SRAM savestates" 11. "Use SRAM/BRAM savestates"
This will automatically read/write SRAM savestates for games which are using them. This will automatically read/write SRAM (or BRAM for Sega/Mega CD) savestates for
SRAM is saved whenever you pause your game or exit the emulator. games which are using them. SRAM is saved whenever you pause your game or exit the
emulator.
12. "GP2X CPU clocks" 12. "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. at all (this is if you use external program to set clock).
13. "[advanced options]" 13. "[Sega/Mega CD options]"
Enters Sega/Mega CD options menu (see below).
14. "[advanced options]"
Enters advanced options menu (see below). Enters advanced options menu (see below).
14. "Save cfg as default" 15. "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).
15. "Save cfg for current game only" 16. "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).
Advanced configuration Advanced configuration
---------------------- ----------------------
@ -108,25 +116,56 @@ startup, and this data is lost when sound chips are being enabled/disabled.
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. "USB joy controls player X" 7. "Don't save config on exit"
If you are able to use USB joysticks with your GP2X, this options selects which
player the joystick controls.
8. "Don't save config on exit"
This will disable config autowrite on exit (which might cause SD card corruption This will disable config autowrite on exit (which might cause SD card corruption
according to DaveC). according to DaveC).
9. "craigix's RAM timings" 8. "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
10. "squidgehack" 9. "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.
Sega/Mega CD options
--------------------
1,2,3. "USA/EUR/JAP BIOS"
These options just shows if your BIOS files were correctly detected be 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 left-top 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 the 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. "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.
9. "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 Key configuration
----------------- -----------------

View file

@ -969,13 +969,15 @@ static void updateSound(int len)
{ {
if (PicoOpt&8) len<<=1; if (PicoOpt&8) len<<=1;
gp2x_sound_write(PsndOut, len<<1); /* avoid writing audio when lagging behind to prevent audio lag */
if (PicoSkipFrame != 2)
gp2x_sound_write(PsndOut, len<<1);
} }
static void SkipFrame(void) static void SkipFrame(int do_audio)
{ {
PicoSkipFrame=1; PicoSkipFrame=do_audio ? 1 : 2;
PicoFrame(); PicoFrame();
PicoSkipFrame=0; PicoSkipFrame=0;
} }
@ -1157,7 +1159,7 @@ void emu_Loop(void)
// when second changes, but we don't want buffer to starve. // when second changes, but we don't want buffer to starve.
if(PsndOut && frames_done < target_fps && frames_done > target_fps-5) { if(PsndOut && frames_done < target_fps && frames_done > target_fps-5) {
updateKeys(); updateKeys();
SkipFrame(); frames_done++; SkipFrame(1); frames_done++;
} }
frames_done -= target_fps; if (frames_done < 0) frames_done = 0; frames_done -= target_fps; if (frames_done < 0) frames_done = 0;
@ -1170,7 +1172,7 @@ void emu_Loop(void)
if(currentConfig.Frameskip >= 0) { // frameskip enabled if(currentConfig.Frameskip >= 0) { // frameskip enabled
for(i = 0; i < currentConfig.Frameskip; i++) { for(i = 0; i < currentConfig.Frameskip; i++) {
updateKeys(); updateKeys();
SkipFrame(); frames_done++; SkipFrame(1); frames_done++;
if (PsndOut) { // do framelimitting if sound is enabled if (PsndOut) { // do framelimitting if sound is enabled
gettimeofday(&tval, 0); gettimeofday(&tval, 0);
if(thissec != tval.tv_sec) tval.tv_usec+=1000000; if(thissec != tval.tv_sec) tval.tv_usec+=1000000;
@ -1189,7 +1191,7 @@ void emu_Loop(void)
continue; continue;
} }
updateKeys(); updateKeys();
SkipFrame(/*tval.tv_usec < lim_time+target_frametime*/); frames_done++; SkipFrame(tval.tv_usec < lim_time+target_frametime); frames_done++;
continue; continue;
} }

View file

@ -63,10 +63,11 @@ clean: tidy
tidy: tidy:
@$(RM) $(OBJS) @$(RM) $(OBJS)
@make -C ../../cpu/mz80/ clean @make -C ../../cpu/mz80/ clean
@make -C ../gp2x/helix/ X86=1 clean
PicoDrive : $(OBJS) PicoDrive : $(OBJS) ../gp2x/helix/helix_mp3_x86.a
@echo $@ @echo $@
@$(GCC) $(COPT) $(OBJS) ../gp2x/helix/helix_mp3_x86.a $(LDFLAGS) -lm -Wl,-Map=PicoDrive.map -o $@ @$(GCC) $(COPT) $^ $(LDFLAGS) -lm -Wl,-Map=PicoDrive.map -o $@
../../cpu/mz80/mz80.o : ../../cpu/mz80/mz80.asm ../../cpu/mz80/mz80.o : ../../cpu/mz80/mz80.asm
@ -76,6 +77,9 @@ PicoDrive : $(OBJS)
../../cpu/mz80/mz80.asm : ../../cpu/mz80/mz80.asm :
@make -C ../../cpu/mz80/ @make -C ../../cpu/mz80/
../gp2x/helix/helix_mp3_x86.a:
@make -C ../gp2x/helix/ X86=1 clean all
.c.o: .c.o:
@echo $< @echo $<
@$(GCC) $(COPT) $(DEFINC) -c $< -o $@ @$(GCC) $(COPT) $(DEFINC) -c $< -o $@

View file

@ -12,8 +12,8 @@
// pico.c // pico.c
#define CAN_HANDLE_240_LINES 1 #define CAN_HANDLE_240_LINES 1
//#define dprintf(f,...) printf("%05i:%03i: " f "\n",Pico.m.frame_count,Pico.m.scanline,##__VA_ARGS__) #define dprintf(f,...) printf("%05i:%03i: " f "\n",Pico.m.frame_count,Pico.m.scanline,##__VA_ARGS__)
#define dprintf(x...) //#define dprintf(x...)
#endif //PORT_CONFIG_H #endif //PORT_CONFIG_H

View file

@ -1,14 +1,17 @@
For help / comments / questions visit GP32X boards at:
http://www.gp32x.com/board/
About About
----- -----
This version of PicoDrive is another enhanced version of Dave's This is yet another Megadrive / Genesis / Sega CD / Mega CD emulator, which
Megadrive / Genesis emulator for Pocket PC, which now can also emulate was written having ARM-based handheld devices in mind (such as PDAs,
Sega/Mega CD. The original Dave's code was heavily modified (including smartphones and handheld consoles like GP2X of course). The critical parts
Cyclone core), parts of it were rewritten in asm, many features added, (renderer, 68K and Z80 cpu interpreters) and some other random code is
accuracy increased. Sega/Mega CD emulation is mostly based on Gens code. written in ARM asm, other code is C. The base code originates from Dave's
This version is aimed at ARM-based handheld devices, so ports exist for (fdave, finalburn) PicoDrive 0.30 for Pocket PC. The Sega/Mega CD code is
GP2X handheld console, Symbian smartphones and other devices. roughly based on Stephane Dallongeville's Gens.
How to make it run How to make it run