Turn a compiled .amx script into readable assembly you can edit — and back into a file the game loads.
973 native game functions, named and documented. Nothing else reads these scripts.
A compiled script is a wall of bytes. pkpawn turns it into something you can read, change, and put back — recomputing every jump offset, table offset and header size from scratch, so inserting or deleting an instruction is safe.
6305 0000 e0f1 0a0a 1c00 0800 2001 0000 c809 0000 080a 0000 081a 0000 2c05 0000 3c00 0000 4400 0000 f400 0000 fc00 0000 1401 0000 1c01 0000 542d f063 0000 0000 89a3 130b 0000 0000
L000000b8:
proc
push.p.s 16
push.p.s 12
sysreq.n screen_fade_in_raw 8
stack.p 4
zero.pri
retn
; edit freely — every
; address is recomputed
out/1b6e129e.amx 2560 bytes code 2216, data 64 1 public, 22 natives 6656 bytes of VM memory → sdmc:/pkpawn/ loads on the console, unchanged.
The engine's own names are internal shorthand — WorkGet, MdlAcmdSet, TalkMdlMsg_Seq. They assume you know that "work" means a saved variable, "Mdl" means an overworld character and "Acmd" means a queued movement. Every one of them has been given a readable name and, for the ones that carry real traffic, a written-up description of what each argument selects.
WorkGet(0x407c) → get_event_var(0x407c) FlagSet(0x21) → set_event_flag(0x21) TalkMdlSetEyeToEye(2) → npc_look_at_player(2) MdlAcmdSetEnd() → npc_movement_commit() FadeRequestOut(0, 0, 6) → screen_fade_out(0, 0, 6)
Both spellings assemble to identical bytes, so older listings keep working.
screen_fade_out(style, screens, frames) Fades the picture away. Note the effect comes first, before the screen. style 0 black, 1 white, then the shaped wipes: circle-shrink, ball, up/down/left/right, diamond screens 0 top, 1 bottom, 2 both frames how long it takes; 2 is the engine default engine name: FadeRequestOut
126 functions written up by hand — they cover 91% of the 36 389 native calls across 789 retail scripts.
native functions, every one with a readable name
symbols resolved across the retail corpus
engine shorthand left in a listing
One binary, four commands. Real output from a real script below — nothing here is mocked up.
No installer. Put the binary anywhere on your PATH, then paste the key you were given.
> pkpawn login pk_live_0000000000000000000000000000dead
signed in as you@example.com (hobby plan)
200 credit(s) available
key stored in C:\Users\you\AppData\Roaming\pkpawn\config.jsonThis is the step that spends a credit. You get the editable listing and, on a paid plan, a pseudo-Pawn reconstruction that turns 395 instructions into something you can read in a minute.
> pkpawn open c02r0101.amx uploading c02r0101.amx (1380 bytes)... wrote c02r0101.pasm wrote c02r0101.p (reading aid, not an input) script 0x1b6e129e — 395 instruction(s), 1 public(s), 22 native(s) build it with `pkpawn build c02r0101.pasm`; installs as 1b6e129e.amx 199 credit(s) left
The .pasm names every branch target instead of printing raw addresses, so you can insert and delete instructions freely. The .p beside it is there to tell you what the script actually does.
// from the .p — what the script is really doing main() { switch (g_mode) { case 0: sub_0000b8(); case 1: sub_0000c4(); default: do_nothing(); } } native show_dialogue(message_id, window_id, npc_id, ...); // Opens a speech bubble and prints a message, optionally // tailed to an NPC. The workhorse of every conversation.
Free, and repeatable for 30 days. A listing that does not assemble costs nothing but the time to fix it — and the error tells you the line.
> pkpawn build c02r0101.pasm wrote out\1b6e129e.amx (2560 bytes) code 2216 bytes, data 64 bytes, 1 public(s), 22 native(s), 6656 bytes of VM memory install as sdmc:/pkpawn/1b6e129e.amx to replace the original script
> pkpawn build c02r0101.pasm error: bad hex '0xZZ': invalid digit found in string (line 76)
> pkpawn edit c02r0101.amx
Opens the script, launches $EDITOR, builds when you save, and reopens your editor at the offending line if it does not assemble. Loops until it builds.
> pkpawn balance
account you@example.com
plan hobby
credits 199
jobs 1 opened so far
limits scripts up to 256 KB, listings up to 8 MB, 200 builds per job, jobs live 30 daysOne credit opens one script. Rebuilding it is free and unlimited for 30 days. A file that fails to parse is never charged, and opening the same file twice is recognised rather than billed again — so a dropped connection, or coming back to a script next week, costs nothing.
Everything except the .p decompilation. Permanent, not a trial.
Decompilation included. For one or two scripts an evening.
For a full hack, or a team. Priority support.
No subscription. Valid for 12 months.
Message me on Discord. Tell me which plan you want; I will send the key back in the same conversation.
Keys are shown once. Lost one? Message me and I will issue a new one and revoke the old.
Nothing is stored. The service reads your script, answers, and forgets it. All that is kept is its size and a hash — enough to recognise a retry, and not enough to reconstruct anything.
Because the knowledge is the product: the disassembler, the assembler, the decompiler and the table of 973 documented functions. The client you download is a few hundred lines that move files around — it carries none of it, and you can verify that.
Compiled Pawn, file format version 10, 32-bit cells (AMX_MAGIC 0xF1E0) — the format used by the 3DS-era Pokémon titles. 16-bit and 64-bit cell variants are not supported.
No. Credits are spent when a script opens successfully, and never again for that script. Building is free, up to 200 attempts per job.