Files
ppsspp/Core/MIPS/Interpreter.h
T
Henrik RydgårdandClaude Opus 5.5 ed25f9c436 ME: Let mcidclan's MIST restart Sony's ME firmware and run tasks
MIST (and psp-media-engine-safe-task, and NJEMU through it) restart the
ME through me_wrapper's bootstrap at 0xBFC00040, after patching it to
point a0 at main RAM, which makes the firmware take its resume-from-
sleep path: restore eDRAM from a0 and go back to the main loop. They
then put a task's address in the firmware's command table with
DMACplus and send a command with the soft interrupt.

- The boot now leaves a bootstrap with 6.61's layout at 0xBFC00040,
  and a stand-in for me_wrapper's ME stub (which isn't loaded under
  HLE) that runs the image.
- The firmware never sets Status.IE: it gates interrupts with mtic
  alone, so either one enables them now. Its main loop enables them for
  only a few instructions, so mtic takes a pending one right away.
- Opcode 0x2C, which the resume path runs, is a no-op on the ME.
- Sysreg 0x00 reads 0 (the bootstrap's debug handler check), 0x70 is
  kept, and the DDR flush register (0xBD000004) is always done.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-21 12:06:12 +02:00

60 lines
2.4 KiB
C++

// Copyright (c) 2012- PPSSPP Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0 or later versions.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
#pragma once
#include "Common/CommonTypes.h"
#include "Core/MIPS/MIPS.h"
int MIPS_InterpretSingleStep(MIPSState *mips);
namespace MIPSInt
{
void Int_Syscall(MIPSState *mips, MIPSOpcode op);
void Int_mxc1(MIPSState *mips, MIPSOpcode op);
void Int_Cop0(MIPSState *mips, MIPSOpcode op);
void Int_Eret(MIPSState *mips, MIPSOpcode op);
void Int_RelBranch(MIPSState *mips, MIPSOpcode op);
void Int_RelBranchRI(MIPSState *mips, MIPSOpcode op);
void Int_IType(MIPSState *mips, MIPSOpcode op);
void Int_ITypeMem(MIPSState *mips, MIPSOpcode op);
void Int_RType2(MIPSState *mips, MIPSOpcode op);
void Int_RType3(MIPSState *mips, MIPSOpcode op);
void Int_ShiftType(MIPSState *mips, MIPSOpcode op);
void Int_MulDivType(MIPSState *mips, MIPSOpcode op);
void Int_JumpType(MIPSState *mips, MIPSOpcode op);
void Int_JumpRegType(MIPSState *mips, MIPSOpcode op);
void Int_Allegrex2(MIPSState *mips, MIPSOpcode op);
void Int_FPULS(MIPSState *mips, MIPSOpcode op);
void Int_FPU3op(MIPSState *mips, MIPSOpcode op);
void Int_FPU2op(MIPSState *mips, MIPSOpcode op);
void Int_Allegrex(MIPSState *mips, MIPSOpcode op);
void Int_FPUComp(MIPSState *mips, MIPSOpcode op);
void Int_FPUBranch(MIPSState *mips, MIPSOpcode op);
void Int_CallReplacement(MIPSState *mips, MIPSOpcode op);
void Int_Special2(MIPSState *mips, MIPSOpcode op);
void Int_Halt(MIPSState *mips, MIPSOpcode op);
void Int_Me2C(MIPSState *mips, MIPSOpcode op);
void Int_Special3(MIPSState *mips, MIPSOpcode op);
void Int_Interrupt(MIPSState *mips, MIPSOpcode op);
void Int_Cache(MIPSState *mips, MIPSOpcode op);
void Int_Sync(MIPSState *mips, MIPSOpcode op);
void Int_Break(MIPSState *mips, MIPSOpcode op);
void Int_StoreSync(MIPSState *mips, MIPSOpcode op);
}