From db276d8e521ae6b8ea9fb40c33d6961d713f31b7 Mon Sep 17 00:00:00 2001 From: FIX94 Date: Fri, 8 Apr 2016 00:19:16 +0200 Subject: first commit, enjoy --- gba/source/main.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 gba/source/main.c (limited to 'gba/source') diff --git a/gba/source/main.c b/gba/source/main.c new file mode 100644 index 0000000..9d05189 --- /dev/null +++ b/gba/source/main.c @@ -0,0 +1,94 @@ + +#include +#include +#include +#include +#include +#include +#include +#include + +u32 getGameSize(void) +{ + if(*(vu32*)(0x08000004) != 0x51AEFF24) + return 0; + u32 i; + for(i = (1<<20); i < (1<<25); i<<=1) + { + vu16 *rompos = (vu16*)(0x08000000+i); + int j; + bool romend = true; + for(j = 0; j < 0x1000; j++) + { + if(rompos[j] != j) + { + romend = false; + break; + } + } + if(romend) break; + } + return i; +} +//--------------------------------------------------------------------------------- +// Program entry point +//--------------------------------------------------------------------------------- +int main(void) { +//--------------------------------------------------------------------------------- + + // the vblank interrupt must be enabled for VBlankIntrWait() to work + // since the default dispatcher handles the bios flags no vblank handler + // is required + irqInit(); + irqEnable(IRQ_VBLANK); + + consoleDemoInit(); + REG_JOYTR = 0; + // ansi escape sequence to set print co-ordinates + // /x1b[line;columnH + u32 i; + iprintf("\x1b[9;10HROM Dumper\n"); + iprintf("\x1b[10;5HPlease look at the TV\n"); + REG_HS_CTRL |= 6; + while (1) { + if((REG_HS_CTRL&4)) + { + REG_HS_CTRL |= 4; + u32 gamesize = getGameSize(); + REG_JOYTR = gamesize; + while((REG_HS_CTRL&4) == 0) ; + REG_HS_CTRL |= 4; + if(gamesize == 0) + { + REG_JOYTR = 0; + continue; //nothing to read + } + //game in, send header + for(i = 0; i < 0xC0; i+=4) + { + REG_JOYTR = *(vu32*)(0x08000000+i); + while((REG_HS_CTRL&4) == 0) ; + REG_HS_CTRL |= 4; + } + //wait for other side to choose + while((REG_HS_CTRL&2) == 0) ; + REG_HS_CTRL |= 2; + if(REG_JOYRE == 0) + { + REG_JOYTR = 0; + continue; //nothing to read + } + //dump the game + for(i = 0; i < gamesize; i+=4) + { + REG_JOYTR = *(vu32*)(0x08000000+i); + while((REG_HS_CTRL&4) == 0) ; + REG_HS_CTRL |= 4; + } + REG_JOYTR = 0; + } + Halt(); + } +} + + -- cgit 1.4.1