219 lines
3.8 KiB
C
219 lines
3.8 KiB
C
/*
|
|
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.
|
|
*/
|
|
|
|
#include "copyright.h"
|
|
#include "instr.h"
|
|
#include "encode.h"
|
|
|
|
#define NULL 0
|
|
|
|
int sptr;
|
|
int longdis = 1;
|
|
|
|
extern char *normalops[], *specialops[];
|
|
|
|
|
|
char *regstrings[] =
|
|
{
|
|
"0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9",
|
|
"r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19",
|
|
"r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", "gp", "sp",
|
|
"r30", "r31"
|
|
};
|
|
|
|
#define R(i) regstrings[i]
|
|
|
|
|
|
dump_ascii(instruction, pc)
|
|
int instruction, pc;
|
|
{
|
|
int addr;
|
|
char *s;
|
|
int opcode;
|
|
|
|
if ( longdis ) printf("%08x: %08x ", pc, instruction);
|
|
printf("\t");
|
|
opcode = (unsigned) instruction >> 26;
|
|
if ( instruction == I_NOP) {
|
|
printf("nop");
|
|
}
|
|
else if ( opcode == I_SPECIAL )
|
|
{
|
|
opcode = instruction & 0x3f;
|
|
printf("%s\t", specialops[opcode]);
|
|
|
|
switch( opcode )
|
|
{
|
|
|
|
/* rd,rt,shamt */
|
|
case I_SLL:
|
|
case I_SRL:
|
|
case I_SRA:
|
|
printf("%s,%s,0x%x",
|
|
R(rd(instruction)),
|
|
R(rt(instruction)),
|
|
shamt(instruction));
|
|
break;
|
|
|
|
/* rd,rt,rs */
|
|
case I_SLLV:
|
|
case I_SRLV:
|
|
case I_SRAV:
|
|
printf("%s,%s,%s",
|
|
R(rd(instruction)),
|
|
R(rt(instruction)),
|
|
R(rs(instruction)));
|
|
break;
|
|
|
|
/* rs */
|
|
case I_JR:
|
|
case I_JALR:
|
|
case I_MFLO:
|
|
case I_MTLO:
|
|
printf("%s", R(rs(instruction)));
|
|
break;
|
|
|
|
case I_SYSCALL:
|
|
case I_BREAK:
|
|
break;
|
|
|
|
/* rd */
|
|
case I_MFHI:
|
|
case I_MTHI:
|
|
printf("%s", R(rd(instruction)));
|
|
break;
|
|
|
|
/* rs,rt */
|
|
case I_MULT:
|
|
case I_MULTU:
|
|
case I_DIV:
|
|
case I_DIVU:
|
|
printf("%s,%s",
|
|
R(rs(instruction)),
|
|
R(rt(instruction)));
|
|
break;
|
|
|
|
/* rd,rs,rt */
|
|
case I_ADD:
|
|
case I_ADDU:
|
|
case I_SUB:
|
|
case I_SUBU:
|
|
case I_AND:
|
|
case I_OR:
|
|
case I_XOR:
|
|
case I_NOR:
|
|
case I_SLT:
|
|
case I_SLTU:
|
|
printf("%s,%s,%s",
|
|
R(rd(instruction)),
|
|
R(rs(instruction)),
|
|
R(rt(instruction)));
|
|
break;
|
|
|
|
}
|
|
}
|
|
else if ( opcode == I_BCOND )
|
|
{
|
|
switch ( rt(instruction) ) /* this field encodes the op */
|
|
{
|
|
case I_BLTZ:
|
|
printf("bltz");
|
|
break;
|
|
case I_BGEZ:
|
|
printf("bgez");
|
|
break;
|
|
case I_BLTZAL:
|
|
printf("bltzal");
|
|
break;
|
|
case I_BGEZAL:
|
|
printf("bgezal");
|
|
break;
|
|
default :
|
|
printf("BCOND");
|
|
}
|
|
printf("\t%s,%08x",
|
|
R(rs(instruction)),
|
|
off16(instruction)+pc+4);
|
|
}
|
|
else
|
|
{
|
|
printf("%s\t", normalops[opcode]);
|
|
|
|
switch ( opcode )
|
|
{
|
|
/* 26-bit_target */
|
|
case I_J:
|
|
case I_JAL:
|
|
printf("%08x",
|
|
top4(pc)|off26(instruction));
|
|
break;
|
|
|
|
/* rs,rt,16-bit_offset */
|
|
case I_BEQ:
|
|
case I_BNE:
|
|
printf("%s,%s,%08x",
|
|
R(rt(instruction)),
|
|
R(rs(instruction)),
|
|
off16(instruction)+pc+4);
|
|
break;
|
|
|
|
/* rt,rs,immediate */
|
|
case I_ADDI:
|
|
case I_ADDIU:
|
|
case I_SLTI:
|
|
case I_SLTIU:
|
|
case I_ANDI:
|
|
case I_ORI:
|
|
case I_XORI:
|
|
printf("%s,%s,0x%x",
|
|
R(rt(instruction)),
|
|
R(rs(instruction)),
|
|
immed(instruction));
|
|
break;
|
|
|
|
/* rt, immed */
|
|
case I_LUI:
|
|
printf("%s,0x%x",
|
|
R(rt(instruction)),
|
|
immed(instruction));
|
|
break;
|
|
|
|
/* coprocessor garbage */
|
|
case I_COP0:
|
|
case I_COP1:
|
|
case I_COP2:
|
|
case I_COP3:
|
|
break;
|
|
|
|
/* rt,offset(rs) */
|
|
case I_LB:
|
|
case I_LH:
|
|
case I_LWL:
|
|
case I_LW:
|
|
case I_LBU:
|
|
case I_LHU:
|
|
case I_LWR:
|
|
case I_SB:
|
|
case I_SH:
|
|
case I_SWL:
|
|
case I_SW:
|
|
case I_SWR:
|
|
case I_LWC0:
|
|
case I_LWC1:
|
|
case I_LWC2:
|
|
case I_LWC3 :
|
|
case I_SWC0:
|
|
case I_SWC1:
|
|
case I_SWC2:
|
|
case I_SWC3:
|
|
printf("%s,0x%x(%s)",
|
|
R(rt(instruction)),
|
|
immed(instruction),
|
|
R(rs(instruction)));
|
|
break;
|
|
}
|
|
}
|
|
}
|