This is my foray into dynamic recompilation using PicoDrive, a Megadrive / Genesis / Sega CD / Mega CD / 32X / SMS emulator. I added support for MIPS (mips32r1) and ARM64 (aarch64) to the recompiler, as well as spent much effort to optimize the code generated by the DRC. I also optimized SH2 memory access inside the emulator, and did some work on M68K/SH2 CPU synchronization to fix some problems and speed up the emulator. It got a bit out of hand. I ended up doing fixes and optimzations all over the place, mainly for 32X and CD, 32X graphics handling, and probably some more, see the commit history. ### compiling I mainly worked with standalone PicoDrive versions as created by configure/make. A list of platforms for which this is possible can be obtained with > configure --help If you want to build an executable for a unixoid platform not listed in the platform list, just use > configure --platform=generic If DRC is available for the platform, it should be enabled automatically. For other platforms using a cross-compiling toolchain I used this, assuming $TC points to the appropriate cross compile toolchain directory: platform|toolchain|configure command --------|---------|----------------- gp2x,wiz,caanoo|open2x|CROSS_COMPILE=arm-open2x-linux- CFLAGS="-I$TC/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux/include -fno-stack-protector -fno-common -finline-limit=42" LDFLAGS="--sysroot $TC/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux -L$TC/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux/lib" ./configure --platform=gp2x gp2x,wiz,caanoo|open2x with ubuntu arm gcc 4.7|CROSS_COMPILE=arm-linux-gnueabi- CFLAGS="-I$TC/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux/include -fno-stack-protector -fno-common -finline-limit=42 -fipa-pta" LDFLAGS="-B$TC/gcc-4.1.1-glibc-2.3.6/lib/gcc/arm-open2x-linux/4.1.1 -B$TC/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux/lib -L$TC/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux/lib" ./configure --platform=gp2x opendingux|opendingux|CROSS_COMPILE=mipsel-linux- CFLAGS="-I$TC/usr/include -I$TC/usr/include/SDL -fno-stack-protector -fno-common -finline-limit=42 -fipa-pta" LDFLAGS="--sysroot $TC -L$TC/lib" ./configure --platform=opendingux opendingux|opendingux with ubuntu mips gcc 5.4|CROSS_COMPILE=mipsel-linux-gnu- CFLAGS="-I$TC/usr/include -I$TC/usr/include/SDL -fno-stack-protector -fno-common -finline-limit=42 -fipa-pta" LDFLAGS="-B$TC/usr/lib -B$TC/lib -Wl,-rpath-link=$TC/usr/lib -Wl,-rpath-link=$TC/lib" ./configure --platform=opendingux gcw0|gcw0|CROSS_COMPILE=mipsel-gcw0-linux-uclibc- CFLAGS="-I$TC/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/include -I$TC/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/include/SDL -fno-stack-protector -fno-common -finline-limit=42 -fipa-pta" LDFLAGS="--sysroot $TC/usr/mipsel-gcw0-linux-uclibc/sysroot" ./configure --platform=gcw0 For gp2x, wiz, and caanoo you may need to compile libpng first, and additionally cyclone_gp2x.patch may need to be applied to the cpu/cyclone submodule: > patch -d cpu/cyclone -p1 make opk # for opendingux and gcw0 > > make # for anything else ### helix MP3 decoder For 32 bit ARM platforms, there is the possibility to compile the helix MP3 decoder into a shared library to be able to use MP3 audio files with CD games. The helix source files aren't supplied because of licensing issues. However, if you have obtained the sources, put them into the platform/common/helix directory, set CROSS to your cross compiler prefix (e.g. arm-linux-gnueabi-) and LIBGCC to your cross compiler's libgcc.a (e.g. /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/libgcc.a), and compile with > make -C platform/common/helix CROSS=$CROSS LIBGCC=$LIBGCC Copy the resulting ${CROSS}helix_mp3.so as libhelix.so to the directory where the PicoDrive binary is. ### installing You need to install the resulting binary onto your device manually. For opendingux and gcw0, copy the opk to your SD card. For gp2x, wiz and caanoo, the easiest way is to unpack [PicoDrive_191.zip](http://notaz.gp2x.de/releases/PicoDrive/PicoDrive_191.zip) on you SD card and replace the PicoDrive binary. Send bug reports, fixes etc to Kai-Uwe Bloem