Hack64 Wiki
Other Titles
Hack64 Wiki
Other Titles
This is an old revision of the document!
The main processor used by the Nintendo 64.
…
Command | Definition | Pseudo code |
---|---|---|
ADD rd, rs, rt | Add | rd = rs + rt |
ADDU rd, rs, rt | Add Unsigned | rd = rs + rt |
ADDI rt, rs, immediate1) | Add Immediate | rd = rs + immediate |
ADDIU rt, rs, immediate | Add Immediate Unsigned | rd = rs + immediate |
SUB rd, rs, rt | Subtract | rd = rs - rt |
SUBU rd, rs, rt | Subtract Unsigned | rd = rs - rt |
MULT rs, rt | Multiply | lo = rs * rt |
MULTU rs, rt | Multiply Unsigned | lo = rs * rt |
DIV rs, rt | Divide | lo = rs / rt; hi = rs % rt |
DIVU rs, rt | Divide Unsigned | lo = rs / rt; hi = rs % rt |
AND rd, rs, rt | And | rd = rs & rt |
ANDI rt, rs, immediate | And Immediate | rt = rs & immediate |
OR rd, rs, rt | Or | rd = rs | rt |
ORI rt, rs, immediate | Or Immediate | rt = rs | immediate |
XOR rd, rs, rt | Exclusive Or | rd = rs ^ rt |
XORI rt, rs, immediate | Exclusive Or Immediate | rd = rs ^ immediate |
NOR rd, rs, rt | Nor | rd = ~(rs | rt) |
SLL rd, rt, sa2) | Shift Left Logical | rd = rt << sa |
SLLV rd, rt, rs | Shift Left Logical Variable | rd = rt << rs |
SRA rd, rt, sa | Shift Right Arithmetic | rd = (int32)rt >> sa |
SRAV rd, rt, rs | Shift Right Arithmetic Variable | rd = (int32)rt >> rs |
SRL rd, rt, sa | Shift Right Logical | rd = (uint32)rt >> sa |
SRLV rd, rt, rs | Shift Right Logical Variable | rd = (uint32)rt >> rs |
SLT rd, rs, rt | Set On Less Than | rd = (rs < rt) ? 1 : 0 |
SLTU rd, rs, rt | Set On Less Than Unsigned | rd = (rs < rt) ? 1 : 0 |
SLTI rt, rs, immediate | Set On Less Than Immediate | rt = (rs < immediate) ? 1 : 0 |
SLTIU rt, rs, immediate | Set On Less Than Immediate Unsigned | rt = (rs < immediate) ? 1 : 0 |
DADD rd, rs, rt | Doubleword Add | |
DADDU rd, rs, rt | Doubleword Add Unsigned | |
DADDI rt, rs, immediate | Doubleword Add Immediate | |
DADDIU rt, rs, immediate | Doubleword Add Immediate Unsigned | |
DSUB rd, rs, rt | Doubleword Subtract | |
DSUBU rd, rs, rt | Doubleword Subtract Unsigned | |
DMULT rs, rt | Doubleword Multiply | |
DMULTU rs, rt | Doubleword Multiply Unsigned | |
DDIV rs, rt | Doubleword Divide | |
DDIVU rs, rt | Doubleword Divide Unsigned | |
DSLL rd, rt, sa | Doubleword Shift Left Logical | |
DSLL32 rd, rt, sa | Doubleword Shift Left Logical + 32 | |
DSLLV rd, rt, rs | Doubleword Shift Left Logical Variable | |
DSRA rd, rt, sa | Doubleword Shift Right Arithmetic | |
DSRA32 rd, rt, sa | Doubleword Shift Right Arithmetic + 32 | |
DSRAV rd, rt, rs | Doubleword Shift Right Arithmetic Variable | |
DSRL rd, rt, sa | Doubleword Shift Right Logical | |
DSRL32 rd, rt, sa | Doubleword Shift Right Logical + 32 | |
DSRLV rd, rt, rs | Doubleword Shift Right Logical Variable | |
MFHI rd | Move From HI | rd = hi |
MFLO rd | Move From LO | rd = lo |
MTHI rs | Move To HI | hi = rs |
MTLO rs | Move To LO | lo = rs |
LUI rt, immediate | Load Upper Immediate | rt = immediate << 16 |
LB rt, offset(rs) | Load Byte | rt = *(int8*)(rs + offset) |
LBU rt, offset(rs) | Load Byte Unsigned | rt = *(uint8*)(rs + offset) |
LH rt, offset(rs) | Load Halfword | rt = *(int16*)(rs + offset) |
LHU rt, offset(rs) | Load Halfword Unsigned | rt = *(uint16*)(rs + offset) |
LW rt, offset(rs) | Load Word | rt = *(int32*)(rs + offset) |
LWU rt, offset(rs) | Load Word Unsigned | rt = *(uint32*)(rs + offset) |
LWC1 ft, offset(rs) | Load Word To FPU (Coprocessor 1) | ft = *(float*)(rs + offset) |
LWL rt, offset(rs) | Load Word Left | |
LWR rt, offset(rs) | Load Word Right | |
LD rt, offset(rs) | Load Doubleword | rt = *(uint64*)(rs + offset) |
LDC1 ft, offset(rs) | Load Doubleword To FPU (Coprocessor 1) | ft = *(double*)(rs + offset) |
LDL rt, offset(rs) | Load Doubleword Left | |
LDR rt, offset(rs) | Load Doubleword Right | |
LL rt, offset(rs) | Load Linked | |
LLD rt, offset(rs) | Load Linked Doubleword | |
SB rt, offset(rs) | Store Byte | *(int8*)(rs + offset) = rt |
SH rt, offset(rs) | Store Halfword | *(int16*)(rs + offset) = rt |
SW rt, offset(rs) | Store Word | *(int32*)(rs + offset) = rt |
SWC1 ft, offset(rs) | Store Word From FPU (Coprocessor 1) | *(float*)(rs + offset) = ft |
SWL rt, offset(rs) | Store Word Left | |
SWR rt, offset(rs) | Store Word Right | |
SD rt, offset(rs) | Store Doubleword | *(int64*)(rs + offset) = rt |
SDC1 ft, offset(rs) | Store Doubleword From FPU (Coprocessor 1) | |
SDL rt, offset(rs) | Store Doubleword Left | |
SDR rt, offset(rs) | Store Doubleword Right | |
SC rt, offset(rs) | Store Conditional | |
SCD rt, offset(rs) | Store Conditional Doubleword | |
J target | Jump | RA = target |
JR rs | Jump Register | PC = rs |
JAL target | Jump And Link | RA = PC + 8; PC = target |
JALR rs | Jump And Link Register | rd = PC + 8; PC = rs |
JALR rd, rs | Jump And Link Register | rd = PC + 8; PC = rs |
BEQ rs, rt, offset | Branch On Equal | if(rs == rt) PC = offset |
BEQL rs, rt, offset | Branch On Equal Likely | if(rs == rt) PC = offset |
BNE rs, rt, offset | Branch On Not Equal | if(rs != rt) PC = offset |
BNEL rs, rt, offset | Branch On Not Equal Likely | if(rs != rt) PC = offset |
BGTZ rs, offset | Branch On Greater Than Zero | if(rs > 0) PC = offset |
BGTZL rs, offset | Branch On Greater Than Zero Likely | if(rs > 0) PC = offset |
BLEZ rs, offset | Branch On Less Than Or Equal To Zero | if(rs <= 0) PC = offset |
BLEZL rs, offset | Branch On Less Than Or Equal To Zero Likely | if(rs <= 0) PC = offset |
BGEZ rs, offset | Branch On Greater Than Or Equal To Zero | if(rs >= 0) PC = offset |
BGEZL rs, offset | Branch On Greater Than Or Equal To Zero Likely | if(rs >= 0) PC = offset |
BGEZAL rs, offset | Branch On Greater Than Or Equal To Zero And Link | if(rs >= 0) { RA = PC + 8; PC = offset } |
BGEZALL rs, offset | Branch On Greater Than Or Equal To Zero And Link Likely | if(rs >= 0) { RA = PC + 8; PC = offset } |
BLTZ rs, offset | Branch On Less Than Zero | if(rs < 0) PC = offset |
BLTZL rs, offset | Branch On Less Than Zero Likely | if(rs < 0) PC = offset |
BLTZAL rs, offset | Branch On Less Than Zero And Link | if(rs < 0) { RA = PC + 8; PC = offset } |
BLTZALL rs, offset | Branch On Less Than Zero And Link Likely | if(rs < 0) { RA = PC + 8; PC = offset } |
MFC1 rt, fs | Move Word From FPU (Coprocessor 1) | |
DMFC1 rt, fs | Doubleword Move From FPU (Coprocessor 1) | |
MTC1 rt, fs | Move To FPU (Coprocessor 1) | |
DMTC1 rt, fs | Doubleword Move To FPU (Coprocessor 1) | |
CFC1 rt, fs | Move Control Word From FPU (Coprocessor 1) | |
CTC1 rt, fs | Move Control Word To FPU (Coprocessor 1) | |
MOV.fmt fd, fs | Floating-point Move | |
ABS.fmt fd, fs | Floating-point Absolute Value | |
NEG.fmt fd, fs | Floating-point Negate | |
SQRT.fmt fd, fs | Floating-point Square Root | |
ADD.fmt fd, fs, ft | Floating-point Add | |
SUB.fmt fd, fs, ft | Floating-point Subtract | |
MUL.fmt fd, fs, ft | Floating-point Multiply | |
DIV.fmt fd, fs, ft | Floating-point Divide | |
CVT.S.fmt fd, fs | Floating-point Convert To Single Floating-point Format | |
CVT.D.fmt fd, fs | Floating-point Convert To Double Floating-point Format | |
CVT.W.fmt fd, fs | Floating-point Convert To Single Fixed-point Format | |
CVT.L.fmt fd, fs | Floating-point Convert To Long Fixed-point Format | |
FLOOR.L.fmt fd, fs | Floating-point Floor To Long Fixed-point Format | |
FLOOR.W.fmt fd, fs | Floating-point Floor To Single Fixed-point Format | |
ROUND.L.fmt fd, fs | Floating-point Round To Long Fixed-point Format | |
ROUND.W.fmt fd, fs | Floating-point Round To Single Fixed-point Format | |
TRUNC.L.fmt fd, fs | Floating-point Truncate To Long Fixed-point Format | |
TRUNC.W.fmt fd, fs | Floating-point Truncate To Single Fixed-point Format | |
CEIL.L.fmt fd, fs | Floating-point Ceiling To Long Fixed-point Format | |
CEIL.W.fmt fd, fs | Floating-point Ceiling To Single Fixed-point Format | |
C.F.fmt fs, ft | Floating-point Compare False | |
C.UN.fmt fs, ft | Floating-point Compare Unordered | |
C.EQ.fmt fs, ft | Floating-point Compare Equal | |
C.UEQ.fmt fs, ft | Floating-point Compare Unordered or Equal | |
C.OLT.fmt fs, ft | Floating-point Compare Ordered Less Than | |
C.ULT.fmt fs, ft | Floating-point Compare Unordered Less Than | |
C.OLE.fmt fs, ft | Floating-point Compare Unordered or Less Than | |
C.ULE.fmt fs, ft | Floating-point Compare Unordered or Less Than or Equal | |
C.SF.fmt fs, ft | Floating-point Compare Signaling False | |
C.NGLE.fmt fs, ft | Floating-point Compare Not Greater Than or Less Than or Equal | |
C.SEQ.fmt fs, ft | Floating-point Compare Signaling Equal | |
C.NGL.fmt fs, ft | Floating-point Compare Not Greater Than or Less Than | |
C.LT.fmt fs, ft | Floating-point Compare Less Than | |
C.NGE.fmt fs, ft | Floating-point Compare Not Greater Than or Equal | |
C.LE.fmt fs, ft | Floating-point Compare Less Than or Equal | |
C.NGT.fmt fs, ft | Floating-point Compare Not Greater Than | |
BC1F offset | Branch On FPU False (Coprocessor 1) | |
BC1FL offset | Branch On FPU False Likely (Coprocessor 1) | |
BC1T offset | Branch On FPU True (Coprocessor 1) | |
BC1TL offset | Branch On FPU True Likely (Coprocessor 1) | |
MFC0 rt, rd | Move From Coprocessor 0 | |
MTC0 rt, rd | Move To Coprocessor 0 | |
CACHE op, offset(base) | Cache Operation | |
TEQ rs, rt | Trap If Equal | |
TEQI rs, immediate | Trap If Equal Immediate | |
TGE rs, rt | Trap If Greater Than Or Equal | |
TGEI rs, immediate | Trap If Greater Than Or Equal | |
TGEIU rs, immediate | Trap If Greater Than Or Equal | |
TGEU rs, rt | Trap If Greater Than Or Equal Unsigned | |
TLT rs, rt | Trap If Less Than | |
TLTI rs, immediate | Trap If Less Than Immediate | |
TLTIU rs, immediate | Trap If Less Than Immediate Unsigned | |
TLTU rs, rt | Trap If Less Than Unsigned | |
TNE rs, rt | Trap If Not Equal | |
TNEI rs, immediate | Trap If Not Equal Immediate | |
SYNC | Synchronize | (No operation on R4300) |
SYSCALL | System Call | COP0_CAUSE |= (8 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 |
BREAK | Breakpoint | COP0_CAUSE |= (9 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 |
ERET | Return From Exception | PC = COP0_EPC (or COP0_ERROREPC) |
TLBP | Probe TLB For Matching Entry | |
TLBR | Read Indexed TLB Entry | |
TLBWI | Write Indexed TLB Entry | |
TLBWR | Write Random TLB Entry | |
……………………………………… | . | . |
Number | Name | Preserved | Usage |
---|---|---|---|
0 | R0 | n/a | Hardwired zero |
1 | AT | no | Assembler temporary value |
2:3 | V0:V1 | no | Subroutine return value(s) |
4:7 | A0:A3 | no | Subroutine arguments |
8:15 | T0:T7 | no | Temporary values |
16:23 | S0:S7 | yes | Saved values |
24:25 | T8:T9 | no | Temporary values |
26:27 | K0:K1 | n/a | Reserved by the kernel |
28 | GP | yes | Global pointer |
29 | SP | yes | Stack pointer |
30 | S8 or FP | yes | Saved value or frame pointer |
31 | RA | yes | Return address |
Virtual address range | Segment | Description |
---|---|---|
00000000:7FFFFFFF | useg | TLB mapped to physical memory Accessible in all operating modes |
80000000:9FFFFFFF | kseg0 | Cached, translated to physical address by subtracting 80000000 Accessible in kernel mode |
A0000000:BFFFFFFF | kseg1 | Uncached, translated to physical address by subtracting A0000000 Accessible in kernel mode |
C0000000:DFFFFFFF | sseg | TLB mapped to physical memory Accessible in kernel and supervisor mode |
E0000000:FFFFFFFF | kseg3 | TLB mapped to physical memory Accessible in kernel mode |
Note: Commercial Nintendo 64 games operate in kernel mode at all times.
| 31| 30| 29| 28|27|26|25| 24|23| 22|21|20|19|18|17|16| 8| 7| 6| 5| 4| 2| 1| 0| | .| .| .| .| .| .| .| .| 0| .| .| .| .| .| 0| 1|........| .| .| .| ..| .| .| .| |CU3|CU2|CU1|CU0|RP|FR|RE|ITS| -|BEV|TS|SR| -|CH|CE|DE| IM |KX|SX|UX|KSU|ERL|EXL|IE| | 1 | 1 | 1 | 1 |1 |1 |1 |1 | 1|1 |1 |1 | 1|1 |1 |1 | 8 |1 |1 |1 |2 |1 |1 |1 |
Field | Description |
---|---|
CU3 | (Reserved) |
CU2 | (Reserved) |
CU1 | Coprocessor 1 (FPU) Usability (1: Usable, 0: Unusable) |
CU0 | Coprocessor 0 Usability (1: Usable, 0: Unusable) COP0 is always usable while in kernel mode, regardless of setting |
RP | Reduce Power (0: Normal, 1: Low Power Mode) Clock frequency is reduced to one-quarter speed when enabled |
FR | Additional floating point registers (0: 16 registers, 1: 32 registers) |
RE | Reverse Endian in User mode (0: Disabled, 1: Reversed) |
ITS | Enable instruction trace support (0: False, 1: True) |
BEV | Controls exception vector locations (0: Normal, 1: Bootstrap) |
TS | TLB shutdown has occurred (0: False, 1: True) On R4300i, the TLB does not shutdown and the processor will continue execution, but the TS bit is still set. |
SR | Soft reset or NMI has occurred (0: False, 1: True) |
CH | CP0 Condition bit (0: False, 1: True) |
CE | (Unused on R4300i) |
DE | (Unused on R4300i) |
IM | Interrupt Mask (0: Disabled, 1: Enabled) |
KX | Enable 64-bit addressing in Kernel mode (0: Disabled, 1: Enabled) |
SX | Enable 64-bit addressing and operations in Supervisor mode (0: Disabled, 1: Enabled) |
UX | Enable 64-bit addressing and operations in User mode (0: Disabled, 1: Enabled) |
KSU | Mode (10: User, 01: Supervisor, 00: Kernel) |
ERL | Error level (0: Normal, 1: Error) |
EXL | Exception level (0: Normal, 1: Exception) |
IE | Global interrupt enable (0: Disabled, 1: Enabled) |
|31|30|28| 16| 8|7| 2| 0| | .| 0|..|............|........|0|.....|00| |BD| -|CE|------------| IP |-| EXC |--| |1 |1 |2 | 12 | 8 |1| 5 |2 |
Field | Description |
---|---|
BD | Branch delay (1: Last exception occurred in delay slot, 0: Normal) |
CE | Coprocessor number for coprocessor unusable exception |
IP | Interrupt pending (1: Interrupt, 0: No Interrupt) IP7 Timer interrupt IP6:2 External normal interrupts IP1:0 Software interrupt |
EXC | Exception code |
Code | Mnemonic | Description |
---|---|---|
0 | Int | Interrupt |
1 | Mod | TLB Modification exception |
2 | TLBL | TLB Miss exception (load or instruction fetch) |
3 | TLBS | TLB Miss exception (store) |
4 | AdEl | Address Error exception (load or instruction fetch) |
5 | AdES | Address Error exception (store) |
6 | IBE | Bus Error exception (instruction fetch) |
7 | DBE | Bus Error exception (data reference: load or store) |
8 | Sys | Syscall exception |
9 | Bp | Breakpoint exception |
10 | RI | Reserved instruction exception |
11 | CpU | Coprocessor unusable exception |
12 | Ov | Arithmetic overflow exception |
13 | Tr | Trap exception |
14 | - | (Reserved) |
15 | FPE | Floating-point exception |
16:22 | - | (Reserved) |
23 | WATCH | Watch exception |
24:31 | - | (Reserved) |
Exception | Base (BEV=0) | Base (BEV=1) | Offset |
---|---|---|---|
Reset & NMI | n/a | 0xBFC000000 | 0x000 |
TLB Miss | 0x80000000 | 0xBFC000200 | 0x000 |
XTLB Miss | 0x80000000 | 0xBFC000200 | 0x080 |
Other | 0x80000000 | 0xBFC000200 | 0x180 |