v1.70.4 is out now - crash recovery added - fixed a memory allocator bug that crashed GTA: Liberty City Stories - config self-heal - CWCheat + PSPAR in one plugin - works on CFW only, not OFW - full changelog inside
MIPS Disassembler (disasm.c)

disasm.c (1,022 lines) and disasm.h are vendored, not TempAR-original — both carry the PSPLINK project's 2006 BSD-licensed header (James F <tyranid@gmail.com>). This is the same disassembler PSPLINK used for its debug/Impose menu. disasm_prxtool.h supplies the MIPS opcode table format this decoder walks.

It decodes a raw 32-bit MIPS instruction word into a mnemonic + operand string using a format-string-driven table:

%d - Rd            %i - 16bit signed immediate     %j - 26bit absolute offset
%t - Rt            %I - 16bit unsigned immediate    %J - Register jump
%s - Rs            %o - 16bit signed offset (rt)    %a - SA
%D - Fd            %O - 16bit signed offset (PC)     %C - code (for syscall)
%T - Ft            %V - 16bit signed offset (rs)     %c - code (for break)

(plus VFPU-specific codes for the PSP's vector floating-point unit instructions — see the comment block at the top of disasm.c for the full legend.)

mipsDecode(opcode, PC) is the entry point used by the menu's Decoder screen; if _MIPS_ isn't defined, a stub is compiled in that just prints "???" — the whole disassembler is optional, gated purely by that flag (set in both makefiles currently, so effectively always on).

Handle with care
It's someone else's vendored code with its own conventions. Prefer patching around it (in menu.c's call sites) over modifying the decode tables unless you're fixing an actual decode bug.
Memory Search / "Cheat Finder" (search.c)

search.c (346 lines) implements the classic Gameshark-style "narrow down an unknown address" search: repeated passes over a memory range, each pass filtering the previous pass's candidate addresses by a new criterion.

Why it's file-backed, not memory-backed: every search pass is streamed to a file, searches/search{N}.dat. This is the reason searches survive across menu sessions and even reboots (undocumented anywhere in the end-user docs, but a real feature — search_init() at boot looks for existing search files and resumes rather than starting over). search.ram (search #0) is special: an initial full memory dump used as input to the very first pass.

The performance rewrite: the changelog documents a search rewrite 25x-253x faster than the original MKUltra-derived implementation. The technique: stream through candidate addresses with buffered file I/O in one tight pass, computing the check inline rather than issuing a separate syscall per address/comparison. The loop also periodically yields:

if(!(address & 0xFFFF)) {
    if(!cfg.cheat_pause) {
        sceKernelDelayThread(1500); // delay search so we don't crash
    }
    ...
}

That comment is literal, not decorative — removing the yield to "go faster" risks reintroducing crashes on real hardware.

Search modes (the search_mode parameter):

ModeComparisonTypical use
0value == checkFind this exact number
1value != checkFind anything that changed away from X
2 / 3value >= check / value <= checkRange narrowing
4 / 5previous +/- delta == checkIncreased/decreased by exactly N
6-9Same as 0-3, vs. previous pass's per-address value"Unknown value" search — find what changed without knowing the target

search_add_result() and search_add_loaded_results() convert search hits directly into Cheat/Block entries via cheat_new() — this is the SQUARE-on-result shortcut mentioned in the changelog.

File Browser (filebrowser.c)

A straightforward memory-stick directory lister (154 lines) used anywhere the UI needs the user to pick a file (guide text, memory patch file, alternate cheat database). Caps at MAX_FILES (500) entries of MAX_NAME_LEN (49) chars each — if a directory has more entries than that, the excess simply won't be listed (no pagination/streaming). filebrowser_cache() populates the listing from sceIoDopen/sceIoDread, filtering by an extension allow-list.