pine_read64
Read a 64-bit unsigned little-endian value from PlayStation emulator memory at an aligned address. Returns decimal string for full precision beyond JavaScript's 2^53 limit.
Instructions
PURPOSE: Read an unsigned 64-bit little-endian value from the emulator's EE main address space at the given absolute address. USAGE: Use for true 64-bit fields — full pointers, large IDs, packed double-word state. The PS2 EE is a 128-bit MIPS where 64-bit slots are common; PS1 and PS3 use 64-bit less heavily but the opcode still works. Reach for this rather than chaining two pine_read32 calls when you want atomicity. For 8/16/32-bit values use the corresponding sibling; for byte spans use pine_read_range. BEHAVIOR: No side effects — pure read. Reads eight consecutive bytes starting at address and combines them as little-endian. Address MUST be 8-byte aligned. PINE on PCSX2 does NOT enforce alignment — unaligned access typically returns whatever bytes are at the aligned address below, silently corrupting the value. If you need an unaligned multi-byte read, use pine_read_range and assemble the bytes yourself. The result is returned as a decimal STRING (not a JSON number) to preserve precision past 2^53 (JavaScript number limit) — parse with BigInt if you need to do arithmetic. Returns a PINE FAIL response on unmapped addresses; times out after ~10s if the reply is dropped.
PlayStation 2 main address space landmarks (PCSX2): 0x00100000-0x01FFFFFF EE main RAM (32 MiB) — game code & data; the most common target 0x10000000 Hardware registers (DMA, GIF, VIF, etc.) 0x11000000 VU0 / VU1 memory 0x12000000 GS privileged registers 0x1C000000-0x1C1FFFFF IOP RAM (2 MiB) 0x1F800000 IOP scratchpad 0x70000000 EE scratchpad (16 KiB) PINE memory operations target the EE address space.
RETURNS: Single line 'ADDR_HEX: VAL_DEC (0xVAL_HEX)' — VAL_DEC is a decimal string that may exceed 2^53.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Absolute byte address in the EE main address space (NOT a per-domain offset). Pass as a number; hex literals like 0x00200000 are fine. Reads 8 consecutive bytes starting here. MUST be 8-byte aligned (address % 8 === 0). PINE on PCSX2 does NOT enforce alignment — unaligned access typically returns whatever bytes are at the aligned address below, silently corrupting the value. If you need an unaligned multi-byte read, use pine_read_range and assemble the bytes yourself. Useful range: 0x00100000-0x01FFFFFF for EE main RAM (where 99% of game state lives). An unmapped or invalid address returns a PINE FAIL response. |
Implementation Reference
- src/tools.ts:143-158 (registration)Tool 'pine_read64' is registered in the tools array with name, description, and inputSchema.
{ name: "pine_read64", description: `PURPOSE: Read an unsigned 64-bit little-endian value from the emulator's ${ADDR_SPACE} at the given absolute address. ` + "USAGE: Use for true 64-bit fields — full pointers, large IDs, packed double-word state. The PS2 EE is a 128-bit MIPS where 64-bit slots are common; PS1 and PS3 use 64-bit less heavily but the opcode still works. Reach for this rather than chaining two pine_read32 calls when you want atomicity. For 8/16/32-bit values use the corresponding sibling; for byte spans use pine_read_range. " + "BEHAVIOR: No side effects — pure read. Reads eight consecutive bytes starting at `address` and combines them as little-endian. Address MUST be 8-byte aligned. " + target.alignmentNote + " The result is returned as a decimal STRING (not a JSON number) to preserve precision past 2^53 (JavaScript number limit) — parse with BigInt if you need to do arithmetic. Returns a PINE FAIL response on unmapped addresses; times out after ~10s if the reply is dropped.\n\n" + MEM + "\n\n" + "RETURNS: Single line 'ADDR_HEX: VAL_DEC (0xVAL_HEX)' — VAL_DEC is a decimal string that may exceed 2^53.", inputSchema: { type: "object", required: ["address"], properties: { address: { type: "integer", minimum: 0, description: addressParamDesc(target, 8) }, }, additionalProperties: false, }, - src/tools.ts:151-158 (schema)Input schema for pine_read64: requires 'address' (integer, minimum 0, 8-byte aligned).
inputSchema: { type: "object", required: ["address"], properties: { address: { type: "integer", minimum: 0, description: addressParamDesc(target, 8) }, }, additionalProperties: false, }, - src/tools.ts:384-384 (handler)Handler for pine_read64: calls pine.read64(addr()), formats output as 'ADDR_HEX: VAL_DEC (0xVAL_HEX)'.
case "pine_read64": return ok(`${addrHex(addr())}: ${fmtHex(await pine.read64(addr()))}`); - src/pine.ts:230-234 (helper)PineClient.read64(): sends Read64 opcode (0x03) with 4-byte address arg, reads 8-byte little-endian bigint from reply.
async read64(addr: number): Promise<bigint> { const args = Buffer.alloc(4); args.writeUInt32LE(addr, 0); const r = await this.call(Op.Read64, args); return r.readBigUInt64LE(0); } - src/pine.ts:29-29 (helper)Read64 opcode constant (0x03) used in the PINE protocol.
Read64: 0x03,