#include "spider.h" #include "fs.h" int (*GX_SetTextureCopy)(void *input_buffer, void *output_buffer, unsigned int size, int in_x, int in_y, int out_x, int out_y, int flags) = 0x0011DD48; int (*GSPGPU_FlushDataCache)(void *addr, unsigned int len) = 0x00191504; int uvl_entry() { FILE *fout = (void *)0x08F10000; unsigned int addr; int *buf = 0x18410000; int *written = 0x08F01000; int i; unsigned int EBUS; unsigned int constblock; unsigned int offset; int j; int ADJ; int ORAS = 0; addr = 0x17900000; //Way lower than necessary, but we're going to hunt for the relative offsets of box data. EBUS = 0; constblock = 0; offset = 0; for (j = 0; j < 0x10 && offset == 0; j++) { GSPGPU_FlushDataCache(addr, 0x10000); GX_SetTextureCopy(addr, buf, 0x10000, 0, 0, 0, 0, 8); GSPGPU_FlushDataCache(buf, 0x10000); svcSleepThread(0x400000LL); for (i = 0; i < 0x4000; i++) { if ((buf[i] == 0x53554245 && buf[i - 1] == 0 && buf[i - 2] == 0 && buf[i - 3] == 0) && EBUS == 0) { EBUS = addr + 4 * i; } if ((buf[i] == 0x53554245 && buf[i + 1] == 0 && buf[i + 2] == 0 && buf[i + 3] == 0) && EBUS == 0) { EBUS = addr + 4 * i; } if ((buf[i] == 0x00000126) && (buf[i + 1] == 0x00000000) && (buf[i + 2] == 0x22018230) && (buf[i + 3] == 0x09060D30)) //Static data in save files. { constblock = addr + 4 * i; } } if (constblock != 0 && EBUS != 0) { unsigned int diff = constblock - EBUS; if (diff == 0x38A0 || diff == 0x383C || diff == 0x3750 || diff == 0x3664 || diff == 0x3608) // ORAS { offset = constblock - 0x1F7AC; ADJ = 0; ORAS = 1; } else if (diff == 0x37DC || diff == 0x3778 || diff == 0x368C || diff == 0x35A0) //XY { offset = constblock - 0x1E6EC; ADJ = 1; ORAS = 0; } else //wtf { offset = 0; ADJ = 0; } } addr += 0x10000; } if (offset != 0) { IFile_Open(fout, L"dmc:/ramsav.bin", FILE_W); fout->pos = 0x00; //first 0xFFFC / 0xFFF8 byte GSPGPU_FlushDataCache(offset, 0x10000); GX_SetTextureCopy(offset, buf, 0x10000, 0, 0, 0, 0, 8); GSPGPU_FlushDataCache(buf, 0x10000); svcSleepThread(0x400000LL); IFile_Write(fout, written, buf + ADJ, 0x10000); svcSleepThread(0x400000LL); offset += 0x10000; //0x70000 Bytes for (i = 0; i < 6; i++) { GSPGPU_FlushDataCache(offset, 0x10000); GX_SetTextureCopy(offset, buf, 0x10000, 0, 0, 0, 0, 8); GSPGPU_FlushDataCache(buf, 0x10000); svcSleepThread(0x400000LL); IFile_Write(fout, written, buf, 0x10000); svcSleepThread(0x400000LL); offset += 0x10000; } if (ORAS == 1) { GSPGPU_FlushDataCache(offset, 0x10000); GX_SetTextureCopy(offset, buf, 0x10000, 0, 0, 0, 0, 8); GSPGPU_FlushDataCache(buf, 0x10000); svcSleepThread(0x400000LL); IFile_Write(fout, written, buf, 0x10000); svcSleepThread(0x400000LL); offset += 0x10000; } //Green - Success! for(i = 0; i < 0xE100; i+=3) { buf[i] = 0x0000FF00; buf[i+1] = 0xFF0000FF; buf[i+2] = 0x00FF0000; } } else { //Red - Failure! for (i = 0; i < 0xE100; i+=3) { buf[i] = 0x00FF0000; buf[i+1] = 0x0000FF00; buf[i+2] = 0xFF0000FF; } } GSPGPU_FlushDataCache(buf, 0x00038400); GX_SetTextureCopy(buf, 0x1F48F000, 0x00038400, 0, 0, 0, 0, 8); svcSleepThread(0x400000LL); GSPGPU_FlushDataCache(buf, 0x00038400); GX_SetTextureCopy(buf, 0x1F4C7800, 0x00038400, 0, 0, 0, 0, 8); svcSleepThread(0x400000LL); return 0; }