Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}