Initial version
This commit is contained in:
commit
6f405265a5
102 changed files with 14486 additions and 0 deletions
229
code/machine/mipssim.h
Normal file
229
code/machine/mipssim.h
Normal file
|
@ -0,0 +1,229 @@
|
|||
// mipssim.h
|
||||
// Internal data structures for simulating the MIPS instruction set.
|
||||
//
|
||||
// DO NOT CHANGE -- part of the machine emulation
|
||||
//
|
||||
// Copyright (c) 1992-1993 The Regents of the University of California.
|
||||
// All rights reserved. See copyright.h for copyright notice and limitation
|
||||
// of liability and disclaimer of warranty provisions.
|
||||
|
||||
#ifndef MIPSSIM_H
|
||||
#define MIPSSIM_H
|
||||
|
||||
#include "copyright.h"
|
||||
|
||||
/*
|
||||
* OpCode values. The names are straight from the MIPS
|
||||
* manual except for the following special ones:
|
||||
*
|
||||
* OP_UNIMP - means that this instruction is legal, but hasn't
|
||||
* been implemented in the simulator yet.
|
||||
* OP_RES - means that this is a reserved opcode (it isn't
|
||||
* supported by the architecture).
|
||||
*/
|
||||
|
||||
#define OP_ADD 1
|
||||
#define OP_ADDI 2
|
||||
#define OP_ADDIU 3
|
||||
#define OP_ADDU 4
|
||||
#define OP_AND 5
|
||||
#define OP_ANDI 6
|
||||
#define OP_BEQ 7
|
||||
#define OP_BGEZ 8
|
||||
#define OP_BGEZAL 9
|
||||
#define OP_BGTZ 10
|
||||
#define OP_BLEZ 11
|
||||
#define OP_BLTZ 12
|
||||
#define OP_BLTZAL 13
|
||||
#define OP_BNE 14
|
||||
|
||||
#define OP_DIV 16
|
||||
#define OP_DIVU 17
|
||||
#define OP_J 18
|
||||
#define OP_JAL 19
|
||||
#define OP_JALR 20
|
||||
#define OP_JR 21
|
||||
#define OP_LB 22
|
||||
#define OP_LBU 23
|
||||
#define OP_LH 24
|
||||
#define OP_LHU 25
|
||||
#define OP_LUI 26
|
||||
#define OP_LW 27
|
||||
#define OP_LWL 28
|
||||
#define OP_LWR 29
|
||||
|
||||
#define OP_MFHI 31
|
||||
#define OP_MFLO 32
|
||||
|
||||
#define OP_MTHI 34
|
||||
#define OP_MTLO 35
|
||||
#define OP_MULT 36
|
||||
#define OP_MULTU 37
|
||||
#define OP_NOR 38
|
||||
#define OP_OR 39
|
||||
#define OP_ORI 40
|
||||
#define OP_RFE 41
|
||||
#define OP_SB 42
|
||||
#define OP_SH 43
|
||||
#define OP_SLL 44
|
||||
#define OP_SLLV 45
|
||||
#define OP_SLT 46
|
||||
#define OP_SLTI 47
|
||||
#define OP_SLTIU 48
|
||||
#define OP_SLTU 49
|
||||
#define OP_SRA 50
|
||||
#define OP_SRAV 51
|
||||
#define OP_SRL 52
|
||||
#define OP_SRLV 53
|
||||
#define OP_SUB 54
|
||||
#define OP_SUBU 55
|
||||
#define OP_SW 56
|
||||
#define OP_SWL 57
|
||||
#define OP_SWR 58
|
||||
#define OP_XOR 59
|
||||
#define OP_XORI 60
|
||||
#define OP_SYSCALL 61
|
||||
#define OP_UNIMP 62
|
||||
#define OP_RES 63
|
||||
#define MaxOpcode 63
|
||||
|
||||
/*
|
||||
* Miscellaneous definitions:
|
||||
*/
|
||||
|
||||
#define IndexToAddr(x) ((x) << 2)
|
||||
|
||||
#define SIGN_BIT 0x80000000
|
||||
#define R31 31
|
||||
|
||||
/*
|
||||
* The table below is used to translate bits 31:26 of the instruction
|
||||
* into a value suitable for the "opCode" field of a MemWord structure,
|
||||
* or into a special value for further decoding.
|
||||
*/
|
||||
|
||||
#define SPECIAL 100
|
||||
#define BCOND 101
|
||||
|
||||
#define IFMT 1
|
||||
#define JFMT 2
|
||||
#define RFMT 3
|
||||
|
||||
struct OpInfo {
|
||||
int opCode; /* Translated op code. */
|
||||
int format; /* Format type (IFMT or JFMT or RFMT) */
|
||||
};
|
||||
|
||||
static OpInfo opTable[] = {
|
||||
{SPECIAL, RFMT}, {BCOND, IFMT}, {OP_J, JFMT}, {OP_JAL, JFMT},
|
||||
{OP_BEQ, IFMT}, {OP_BNE, IFMT}, {OP_BLEZ, IFMT}, {OP_BGTZ, IFMT},
|
||||
{OP_ADDI, IFMT}, {OP_ADDIU, IFMT}, {OP_SLTI, IFMT}, {OP_SLTIU, IFMT},
|
||||
{OP_ANDI, IFMT}, {OP_ORI, IFMT}, {OP_XORI, IFMT}, {OP_LUI, IFMT},
|
||||
{OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT},
|
||||
{OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT},
|
||||
{OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT},
|
||||
{OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT},
|
||||
{OP_LB, IFMT}, {OP_LH, IFMT}, {OP_LWL, IFMT}, {OP_LW, IFMT},
|
||||
{OP_LBU, IFMT}, {OP_LHU, IFMT}, {OP_LWR, IFMT}, {OP_RES, IFMT},
|
||||
{OP_SB, IFMT}, {OP_SH, IFMT}, {OP_SWL, IFMT}, {OP_SW, IFMT},
|
||||
{OP_RES, IFMT}, {OP_RES, IFMT}, {OP_SWR, IFMT}, {OP_RES, IFMT},
|
||||
{OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT},
|
||||
{OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT},
|
||||
{OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT}, {OP_UNIMP, IFMT},
|
||||
{OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}, {OP_RES, IFMT}
|
||||
};
|
||||
|
||||
/*
|
||||
* The table below is used to convert the "funct" field of SPECIAL
|
||||
* instructions into the "opCode" field of a MemWord.
|
||||
*/
|
||||
|
||||
static int specialTable[] = {
|
||||
OP_SLL, OP_RES, OP_SRL, OP_SRA, OP_SLLV, OP_RES, OP_SRLV, OP_SRAV,
|
||||
OP_JR, OP_JALR, OP_RES, OP_RES, OP_SYSCALL, OP_UNIMP, OP_RES, OP_RES,
|
||||
OP_MFHI, OP_MTHI, OP_MFLO, OP_MTLO, OP_RES, OP_RES, OP_RES, OP_RES,
|
||||
OP_MULT, OP_MULTU, OP_DIV, OP_DIVU, OP_RES, OP_RES, OP_RES, OP_RES,
|
||||
OP_ADD, OP_ADDU, OP_SUB, OP_SUBU, OP_AND, OP_OR, OP_XOR, OP_NOR,
|
||||
OP_RES, OP_RES, OP_SLT, OP_SLTU, OP_RES, OP_RES, OP_RES, OP_RES,
|
||||
OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, OP_RES,
|
||||
OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, OP_RES, OP_RES
|
||||
};
|
||||
|
||||
|
||||
// Stuff to help print out each instruction, for debugging
|
||||
|
||||
enum RegType { NONE, RS, RT, RD, EXTRA };
|
||||
|
||||
struct OpString {
|
||||
const char *string; // Printed version of instruction
|
||||
RegType args[3];
|
||||
};
|
||||
|
||||
static struct OpString opStrings[] = {
|
||||
{"Shouldn't happen", {NONE, NONE, NONE}},
|
||||
{"ADD r%d,r%d,r%d", {RD, RS, RT}},
|
||||
{"ADDI r%d,r%d,%d", {RT, RS, EXTRA}},
|
||||
{"ADDIU r%d,r%d,%d", {RT, RS, EXTRA}},
|
||||
{"ADDU r%d,r%d,r%d", {RD, RS, RT}},
|
||||
{"AND r%d,r%d,r%d", {RD, RS, RT}},
|
||||
{"ANDI r%d,r%d,%d", {RT, RS, EXTRA}},
|
||||
{"BEQ r%d,r%d,%d", {RS, RT, EXTRA}},
|
||||
{"BGEZ r%d,%d", {RS, EXTRA, NONE}},
|
||||
{"BGEZAL r%d,%d", {RS, EXTRA, NONE}},
|
||||
{"BGTZ r%d,%d", {RS, EXTRA, NONE}},
|
||||
{"BLEZ r%d,%d", {RS, EXTRA, NONE}},
|
||||
{"BLTZ r%d,%d", {RS, EXTRA, NONE}},
|
||||
{"BLTZAL r%d,%d", {RS, EXTRA, NONE}},
|
||||
{"BNE r%d,r%d,%d", {RS, RT, EXTRA}},
|
||||
{"Shouldn't happen", {NONE, NONE, NONE}},
|
||||
{"DIV r%d,r%d", {RS, RT, NONE}},
|
||||
{"DIVU r%d,r%d", {RS, RT, NONE}},
|
||||
{"J 4*%d", {EXTRA, NONE, NONE}},
|
||||
{"JAL 4*%d", {EXTRA, NONE, NONE}},
|
||||
{"JALR r%d,r%d", {RD, RS, NONE}},
|
||||
{"JR r%d,r%d", {RD, RS, NONE}},
|
||||
{"LB r%d,%d(r%d)", {RT, EXTRA, RS}},
|
||||
{"LBU r%d,%d(r%d)", {RT, EXTRA, RS}},
|
||||
{"LH r%d,%d(r%d)", {RT, EXTRA, RS}},
|
||||
{"LHU r%d,%d(r%d)", {RT, EXTRA, RS}},
|
||||
{"LUI r%d,%d", {RT, EXTRA, NONE}},
|
||||
{"LW r%d,%d(r%d)", {RT, EXTRA, RS}},
|
||||
{"LWL r%d,%d(r%d)", {RT, EXTRA, RS}},
|
||||
{"LWR r%d,%d(r%d)", {RT, EXTRA, RS}},
|
||||
{"Shouldn't happen", {NONE, NONE, NONE}},
|
||||
{"MFHI r%d", {RD, NONE, NONE}},
|
||||
{"MFLO r%d", {RD, NONE, NONE}},
|
||||
{"Shouldn't happen", {NONE, NONE, NONE}},
|
||||
{"MTHI r%d", {RS, NONE, NONE}},
|
||||
{"MTLO r%d", {RS, NONE, NONE}},
|
||||
{"MULT r%d,r%d", {RS, RT, NONE}},
|
||||
{"MULTU r%d,r%d", {RS, RT, NONE}},
|
||||
{"NOR r%d,r%d,r%d", {RD, RS, RT}},
|
||||
{"OR r%d,r%d,r%d", {RD, RS, RT}},
|
||||
{"ORI r%d,r%d,%d", {RT, RS, EXTRA}},
|
||||
{"RFE", {NONE, NONE, NONE}},
|
||||
{"SB r%d,%d(r%d)", {RT, EXTRA, RS}},
|
||||
{"SH r%d,%d(r%d)", {RT, EXTRA, RS}},
|
||||
{"SLL r%d,r%d,%d", {RD, RT, EXTRA}},
|
||||
{"SLLV r%d,r%d,r%d", {RD, RT, RS}},
|
||||
{"SLT r%d,r%d,r%d", {RD, RS, RT}},
|
||||
{"SLTI r%d,r%d,%d", {RT, RS, EXTRA}},
|
||||
{"SLTIU r%d,r%d,%d", {RT, RS, EXTRA}},
|
||||
{"SLTU r%d,r%d,r%d", {RD, RS, RT}},
|
||||
{"SRA r%d,r%d,%d", {RD, RT, EXTRA}},
|
||||
{"SRAV r%d,r%d,r%d", {RD, RT, RS}},
|
||||
{"SRL r%d,r%d,%d", {RD, RT, EXTRA}},
|
||||
{"SRLV r%d,r%d,r%d", {RD, RT, RS}},
|
||||
{"SUB r%d,r%d,r%d", {RD, RS, RT}},
|
||||
{"SUBU r%d,r%d,r%d", {RD, RS, RT}},
|
||||
{"SW r%d,%d(r%d)", {RT, EXTRA, RS}},
|
||||
{"SWL r%d,%d(r%d)", {RT, EXTRA, RS}},
|
||||
{"SWR r%d,%d(r%d)", {RT, EXTRA, RS}},
|
||||
{"XOR r%d,r%d,r%d", {RD, RS, RT}},
|
||||
{"XORI r%d,r%d,%d", {RT, RS, EXTRA}},
|
||||
{"SYSCALL", {NONE, NONE, NONE}},
|
||||
{"Unimplemented", {NONE, NONE, NONE}},
|
||||
{"Reserved", {NONE, NONE, NONE}}
|
||||
};
|
||||
|
||||
#endif // MIPSSIM_H
|
Loading…
Add table
Add a link
Reference in a new issue