NachOS/code/bin/d.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;
}
}
}