274 lines
7.5 KiB
C
274 lines
7.5 KiB
C
/*
|
|
* Project 64 - A Nintendo 64 emulator.
|
|
*
|
|
* (c) Copyright 2001 zilmar (zilmar@emulation64.com) and
|
|
* Jabo (jabo@emulation64.com).
|
|
*
|
|
* pj64 homepage: www.pj64.net
|
|
*
|
|
* Permission to use, copy, modify and distribute Project64 in both binary and
|
|
* source form, for non-commercial purposes, is hereby granted without fee,
|
|
* providing that this license information and copyright notice appear with
|
|
* all copies and any derived work.
|
|
*
|
|
* This software is provided 'as-is', without any express or implied
|
|
* warranty. In no event shall the authors be held liable for any damages
|
|
* arising from the use of this software.
|
|
*
|
|
* Project64 is freeware for PERSONAL USE only. Commercial users should
|
|
* seek permission of the copyright holders first. Commercial use includes
|
|
* charging money for Project64 or software derived from Project64.
|
|
*
|
|
* The copyright holders request that bug fixes and improvements to the code
|
|
* should be forwarded to them so if they want them.
|
|
*
|
|
*/
|
|
#ifndef __OpCode
|
|
#define __OpCode
|
|
|
|
#include "types.h"
|
|
|
|
typedef struct {
|
|
union {
|
|
|
|
uint32_t Hex;
|
|
uint8_t Ascii[4];
|
|
|
|
struct {
|
|
unsigned offset : 16;
|
|
unsigned rt : 5;
|
|
unsigned rs : 5;
|
|
unsigned op : 6;
|
|
} b;
|
|
|
|
struct {
|
|
unsigned immediate : 16;
|
|
unsigned : 5;
|
|
unsigned base : 5;
|
|
unsigned : 6;
|
|
} c;
|
|
|
|
struct {
|
|
unsigned target : 26;
|
|
unsigned : 6;
|
|
} d;
|
|
|
|
struct {
|
|
unsigned funct : 6;
|
|
unsigned sa : 5;
|
|
unsigned rd : 5;
|
|
unsigned : 5;
|
|
unsigned : 5;
|
|
unsigned : 6;
|
|
} e;
|
|
|
|
struct {
|
|
unsigned : 6;
|
|
unsigned fd : 5;
|
|
unsigned fs : 5;
|
|
unsigned ft : 5;
|
|
unsigned fmt : 5;
|
|
unsigned : 6;
|
|
} f;
|
|
} u;
|
|
|
|
} OPCODE;
|
|
|
|
//R4300i OpCodes
|
|
#define R4300i_SPECIAL 0
|
|
#define R4300i_REGIMM 1
|
|
#define R4300i_J 2
|
|
#define R4300i_JAL 3
|
|
#define R4300i_BEQ 4
|
|
#define R4300i_BNE 5
|
|
#define R4300i_BLEZ 6
|
|
#define R4300i_BGTZ 7
|
|
#define R4300i_ADDI 8
|
|
#define R4300i_ADDIU 9
|
|
#define R4300i_SLTI 10
|
|
#define R4300i_SLTIU 11
|
|
#define R4300i_ANDI 12
|
|
#define R4300i_ORI 13
|
|
#define R4300i_XORI 14
|
|
#define R4300i_LUI 15
|
|
#define R4300i_CP0 16
|
|
#define R4300i_CP1 17
|
|
#define R4300i_BEQL 20
|
|
#define R4300i_BNEL 21
|
|
#define R4300i_BLEZL 22
|
|
#define R4300i_BGTZL 23
|
|
#define R4300i_DADDI 24
|
|
#define R4300i_DADDIU 25
|
|
#define R4300i_LDL 26
|
|
#define R4300i_LDR 27
|
|
#define R4300i_LB 32
|
|
#define R4300i_LH 33
|
|
#define R4300i_LWL 34
|
|
#define R4300i_LW 35
|
|
#define R4300i_LBU 36
|
|
#define R4300i_LHU 37
|
|
#define R4300i_LWR 38
|
|
#define R4300i_LWU 39
|
|
#define R4300i_SB 40
|
|
#define R4300i_SH 41
|
|
#define R4300i_SWL 42
|
|
#define R4300i_SW 43
|
|
#define R4300i_SDL 44
|
|
#define R4300i_SDR 45
|
|
#define R4300i_SWR 46
|
|
#define R4300i_CACHE 47
|
|
#define R4300i_LL 48
|
|
#define R4300i_LWC1 49
|
|
#define R4300i_LWC2 0x32
|
|
#define R4300i_LLD 0x34
|
|
#define R4300i_LDC1 53
|
|
#define R4300i_LDC2 0x36
|
|
#define R4300i_LD 55
|
|
#define R4300i_SC 0x38
|
|
#define R4300i_SWC1 57
|
|
#define R4300i_SWC2 0x3A
|
|
#define R4300i_SCD 0x3C
|
|
#define R4300i_SDC1 61
|
|
#define R4300i_SDC2 62
|
|
#define R4300i_SD 63
|
|
|
|
/* R4300i Special opcodes */
|
|
#define R4300i_SPECIAL_SLL 0
|
|
#define R4300i_SPECIAL_SRL 2
|
|
#define R4300i_SPECIAL_SRA 3
|
|
#define R4300i_SPECIAL_SLLV 4
|
|
#define R4300i_SPECIAL_SRLV 6
|
|
#define R4300i_SPECIAL_SRAV 7
|
|
#define R4300i_SPECIAL_JR 8
|
|
#define R4300i_SPECIAL_JALR 9
|
|
#define R4300i_SPECIAL_SYSCALL 12
|
|
#define R4300i_SPECIAL_BREAK 13
|
|
#define R4300i_SPECIAL_SYNC 15
|
|
#define R4300i_SPECIAL_MFHI 16
|
|
#define R4300i_SPECIAL_MTHI 17
|
|
#define R4300i_SPECIAL_MFLO 18
|
|
#define R4300i_SPECIAL_MTLO 19
|
|
#define R4300i_SPECIAL_DSLLV 20
|
|
#define R4300i_SPECIAL_DSRLV 22
|
|
#define R4300i_SPECIAL_DSRAV 23
|
|
#define R4300i_SPECIAL_MULT 24
|
|
#define R4300i_SPECIAL_MULTU 25
|
|
#define R4300i_SPECIAL_DIV 26
|
|
#define R4300i_SPECIAL_DIVU 27
|
|
#define R4300i_SPECIAL_DMULT 28
|
|
#define R4300i_SPECIAL_DMULTU 29
|
|
#define R4300i_SPECIAL_DDIV 30
|
|
#define R4300i_SPECIAL_DDIVU 31
|
|
#define R4300i_SPECIAL_ADD 32
|
|
#define R4300i_SPECIAL_ADDU 33
|
|
#define R4300i_SPECIAL_SUB 34
|
|
#define R4300i_SPECIAL_SUBU 35
|
|
#define R4300i_SPECIAL_AND 36
|
|
#define R4300i_SPECIAL_OR 37
|
|
#define R4300i_SPECIAL_XOR 38
|
|
#define R4300i_SPECIAL_NOR 39
|
|
#define R4300i_SPECIAL_SLT 42
|
|
#define R4300i_SPECIAL_SLTU 43
|
|
#define R4300i_SPECIAL_DADD 44
|
|
#define R4300i_SPECIAL_DADDU 45
|
|
#define R4300i_SPECIAL_DSUB 46
|
|
#define R4300i_SPECIAL_DSUBU 47
|
|
#define R4300i_SPECIAL_TGE 48
|
|
#define R4300i_SPECIAL_TGEU 49
|
|
#define R4300i_SPECIAL_TLT 50
|
|
#define R4300i_SPECIAL_TLTU 51
|
|
#define R4300i_SPECIAL_TEQ 52
|
|
#define R4300i_SPECIAL_TNE 54
|
|
#define R4300i_SPECIAL_DSLL 56
|
|
#define R4300i_SPECIAL_DSRL 58
|
|
#define R4300i_SPECIAL_DSRA 59
|
|
#define R4300i_SPECIAL_DSLL32 60
|
|
#define R4300i_SPECIAL_DSRL32 62
|
|
#define R4300i_SPECIAL_DSRA32 63
|
|
|
|
/* R4300i RegImm opcodes */
|
|
#define R4300i_REGIMM_BLTZ 0
|
|
#define R4300i_REGIMM_BGEZ 1
|
|
#define R4300i_REGIMM_BLTZL 2
|
|
#define R4300i_REGIMM_BGEZL 3
|
|
#define R4300i_REGIMM_TGEI 0x08
|
|
#define R4300i_REGIMM_TGEIU 0x09
|
|
#define R4300i_REGIMM_TLTI 0x0A
|
|
#define R4300i_REGIMM_TLTIU 0x0B
|
|
#define R4300i_REGIMM_TEQI 0x0C
|
|
#define R4300i_REGIMM_TNEI 0x0E
|
|
#define R4300i_REGIMM_BLTZAL 0x10
|
|
#define R4300i_REGIMM_BGEZAL 17
|
|
#define R4300i_REGIMM_BLTZALL 0x12
|
|
#define R4300i_REGIMM_BGEZALL 0x13
|
|
|
|
/* R4300i COP0 opcodes */
|
|
#define R4300i_COP0_MF 0
|
|
#define R4300i_COP0_MT 4
|
|
|
|
/* R4300i COP0 CO opcodes */
|
|
#define R4300i_COP0_CO_TLBR 1
|
|
#define R4300i_COP0_CO_TLBWI 2
|
|
#define R4300i_COP0_CO_TLBWR 6
|
|
#define R4300i_COP0_CO_TLBP 8
|
|
#define R4300i_COP0_CO_ERET 24
|
|
|
|
/* R4300i COP1 opcodes */
|
|
#define R4300i_COP1_MF 0
|
|
#define R4300i_COP1_DMF 1
|
|
#define R4300i_COP1_CF 2
|
|
#define R4300i_COP1_MT 4
|
|
#define R4300i_COP1_DMT 5
|
|
#define R4300i_COP1_CT 6
|
|
#define R4300i_COP1_BC 8
|
|
#define R4300i_COP1_S 16
|
|
#define R4300i_COP1_D 17
|
|
#define R4300i_COP1_W 20
|
|
#define R4300i_COP1_L 21
|
|
|
|
/* R4300i COP1 BC opcodes */
|
|
#define R4300i_COP1_BC_BCF 0
|
|
#define R4300i_COP1_BC_BCT 1
|
|
#define R4300i_COP1_BC_BCFL 2
|
|
#define R4300i_COP1_BC_BCTL 3
|
|
|
|
#define R4300i_COP1_FUNCT_ADD 0
|
|
#define R4300i_COP1_FUNCT_SUB 1
|
|
#define R4300i_COP1_FUNCT_MUL 2
|
|
#define R4300i_COP1_FUNCT_DIV 3
|
|
#define R4300i_COP1_FUNCT_SQRT 4
|
|
#define R4300i_COP1_FUNCT_ABS 5
|
|
#define R4300i_COP1_FUNCT_MOV 6
|
|
#define R4300i_COP1_FUNCT_NEG 7
|
|
#define R4300i_COP1_FUNCT_ROUND_L 8
|
|
#define R4300i_COP1_FUNCT_TRUNC_L 9
|
|
#define R4300i_COP1_FUNCT_CEIL_L 10
|
|
#define R4300i_COP1_FUNCT_FLOOR_L 11
|
|
#define R4300i_COP1_FUNCT_ROUND_W 12
|
|
#define R4300i_COP1_FUNCT_TRUNC_W 13
|
|
#define R4300i_COP1_FUNCT_CEIL_W 14
|
|
#define R4300i_COP1_FUNCT_FLOOR_W 15
|
|
#define R4300i_COP1_FUNCT_CVT_S 32
|
|
#define R4300i_COP1_FUNCT_CVT_D 33
|
|
#define R4300i_COP1_FUNCT_CVT_W 36
|
|
#define R4300i_COP1_FUNCT_CVT_L 37
|
|
#define R4300i_COP1_FUNCT_C_F 48
|
|
#define R4300i_COP1_FUNCT_C_UN 49
|
|
#define R4300i_COP1_FUNCT_C_EQ 50
|
|
#define R4300i_COP1_FUNCT_C_UEQ 51
|
|
#define R4300i_COP1_FUNCT_C_OLT 52
|
|
#define R4300i_COP1_FUNCT_C_ULT 53
|
|
#define R4300i_COP1_FUNCT_C_OLE 54
|
|
#define R4300i_COP1_FUNCT_C_ULE 55
|
|
#define R4300i_COP1_FUNCT_C_SF 56
|
|
#define R4300i_COP1_FUNCT_C_NGLE 57
|
|
#define R4300i_COP1_FUNCT_C_SEQ 58
|
|
#define R4300i_COP1_FUNCT_C_NGL 59
|
|
#define R4300i_COP1_FUNCT_C_LT 60
|
|
#define R4300i_COP1_FUNCT_C_NGE 61
|
|
#define R4300i_COP1_FUNCT_C_LE 62
|
|
#define R4300i_COP1_FUNCT_C_NGT 63
|
|
|
|
#endif
|
|
|
|
|