int main(int argc, char **argv) { if (argc < 2) { PrintUsage(); return 0; } FILE *File = fopen(argv[1], "rb"); if (!File) { printf("Could not open file: %s\n", argv[1]); return -1; } int Flags = 0; if (argc > 2) { if(strncmp(argv[2], "--me", 4) == 0) { Flags |= Z64_FLAG_MIDDLE_ENDIAN; } } z64 Z64; Z64Open(&Z64, Flags, argv[1]); printf("Image name: %.20s\n", Z64.Hdr.ImageName); printf("Manufacturer: %s (%d)\n", Z64GetManufacturerString(Z64.Hdr.ManufacturerID), Z64.Hdr.ManufacturerID); printf("Region: %s (%d)\n", Z64GetCountryString(Z64.Hdr.Country), Z64.Hdr.Country); printf("Boot code:\n"); MIPS_R3000 Dummy; void *RDRAM = linearAlloc(0x400000); MapMemoryRegion(&Dummy, (mmm) {RDRAM, 0x00000000, 0x400000}); memcpy(RDRAM, &Z64.Hdr.BootCode, 1008 * 4); DisassemblerPrintRange(&Dummy, 0, 32, 0); Z64Close(&Z64); return 0; }
int main(int argc, char **argv) { InitPlatform(argc, argv); HsfOpen(&HSF, "puzzle.hsf"); MIPS_R3000 Cpu; GPU Gpu; Cpu.CP1 = &Gpu; MapRegister(&Cpu, (mmr) {GPU_GP0, &Gpu, GpuGp0, empty_ret}); MapRegister(&Cpu, (mmr) {GPU_GP1, &Gpu, GpuGp1, GpuStat}); MapRegister(&Cpu, (mmr) {0x1F802064, &Cpu, std_out_putchar, empty_ret}); MapRegister(&Cpu, (mmr) {0x1F802068, &Cpu, CTRXFileOpen, CTRXFileOpenReturn}); MapRegister(&Cpu, (mmr) {0x1F802070, &Cpu, CTRXFileRead, CTRXFileReadReturn}); MapRegister(&Cpu, (mmr) {0x1F802074, &Cpu, CTRXFileSeek, CTRXFileSeekReturn}); MapRegister(&Cpu, (mmr) {0x1F802078, &Cpu, CTRXFirstFile, CTRXFirstFileReturn}); MapRegister(&Cpu, (mmr) {0x1F8010A0, &Cpu, DMA2Trigger, empty_ret}); MapRegister(&Cpu, (mmr) {JOY_TX_DATA, nullptr, JoyTxWrite, JoyRxRead}); MapRegister(&Cpu, (mmr) {0x1F801070, nullptr, empty_write, CTRXInterruptRegisterRead}); MapRegister(&Cpu, (mmr) {0x1F801070, nullptr, CTRXInterruptRegisterWrite, empty_ret}); FILE *f = fopen("psx_bios.bin", "rb"); fseek(f, 0, SEEK_END); long fsize = ftell(f); fseek(f, 0, SEEK_SET); u8 *BiosBuffer = (u8 *)linearAlloc(fsize + 1); fread(BiosBuffer, fsize, 1, f); fclose(f); for (int i = 0; i < fsize; ++i) { WriteMemByteRaw(&Cpu, RESET_VECTOR + i, BiosBuffer[i]); } linearFree(BiosBuffer); ResetCpu(&Cpu); bool Step = false; int CyclesToRun = 10000; bool EnableDisassembler = false; bool AutoStep = true; u32 IRQ0Steps = 0; while (MainLoopPlatform()) { #ifdef _3DS u32 KeysDown = hidKeysDown(); if (KeysDown & KEY_START) break; #endif if (Step || AutoStep) { StepCpu(&Cpu, CyclesToRun); IRQ0Steps += CyclesToRun; if (IRQ0Steps >= 50000) { C0GenerateException(&Cpu, C0_CAUSE_INT, Cpu.pc - 4); IRQ0Steps = 0; InterruptMask |= 1; } } if (EnableDisassembler) { printf("\x1b[0;0H"); DisassemblerPrintRange(&Cpu, Cpu.pc - (13 * 4), 29, Cpu.pc); } SwapBuffersPlatform(); } HsfClose(&HSF); ExitPlatform(); return 0; }