|
|
1.1 ! root 1: (* Copyright 1989 by AT&T Bell Laboratories *) ! 2: structure MipsDecode = struct ! 3: val andb = Bits.andb ! 4: fun rshift(op1,amt) = ! 5: if amt<0 then Bits.lshift(op1,0-amt) ! 6: else Bits.rshift(op1,amt) ! 7: fun THEop'(A1,A2) = 0 + rshift(andb(A1,65535),10) ! 8: fun THErs(A1,A2) = 0 + rshift(andb(A1,1023),5) ! 9: fun THErt(A1,A2) = 0 + rshift(andb(A1,31),0) ! 10: fun THEimmed(A1,A2) = let val n = andb(rshift(A2,0),65535) + 0 ! 11: in if n < 32768 then n else n - 65536 ! 12: end ! 13: fun THEoffset(A1,A2) = let val n = andb(rshift(A2,0),65535) + 0 ! 14: in if n < 32768 then n else n - 65536 ! 15: end ! 16: fun THEbase(A1,A2) = 0 + rshift(andb(A1,1023),5) ! 17: fun THEtarget(A1,A2) = andb(rshift(A2,0),65535) + rshift(andb(A1,1023),~16) ! 18: fun THErd(A1,A2) = andb(rshift(A2,11),31) + 0 ! 19: fun THEshamt(A1,A2) = andb(rshift(A2,6),31) + 0 ! 20: fun THEfunct(A1,A2) = andb(rshift(A2,0),63) + 0 ! 21: fun THEcond(A1,A2) = 0 + rshift(andb(A1,31),0) ! 22: fun THEft(A1,A2) = 0 + rshift(andb(A1,31),0) ! 23: fun THEfmt(A1,A2) = 0 + rshift(andb(A1,1023),5) ! 24: fun THEfs(A1,A2) = andb(rshift(A2,11),31) + 0 ! 25: fun THEfd(A1,A2) = andb(rshift(A2,6),31) + 0 ! 26: fun decode(A1,A2) = let ! 27: val rt = THErt(A1,A2) ! 28: val Srt = Integer.makestring rt ! 29: val base = THEbase(A1,A2) ! 30: val Sbase = Integer.makestring base ! 31: val immed = THEimmed(A1,A2) ! 32: val Simmed = Integer.makestring immed ! 33: val target = THEtarget(A1,A2) ! 34: val Starget = Integer.makestring target ! 35: val fd = THEfd(A1,A2) ! 36: val Sfd = Integer.makestring fd ! 37: val fmt = THEfmt(A1,A2) ! 38: val Sfmt = Integer.makestring fmt ! 39: val fs = THEfs(A1,A2) ! 40: val Sfs = Integer.makestring fs ! 41: val ft = THEft(A1,A2) ! 42: val Sft = Integer.makestring ft ! 43: val op' = THEop'(A1,A2) ! 44: val Sop' = Integer.makestring op' ! 45: val funct = THEfunct(A1,A2) ! 46: val Sfunct = Integer.makestring funct ! 47: val rd = THErd(A1,A2) ! 48: val Srd = Integer.makestring rd ! 49: val cond = THEcond(A1,A2) ! 50: val Scond = Integer.makestring cond ! 51: val shamt = THEshamt(A1,A2) ! 52: val Sshamt = Integer.makestring shamt ! 53: val offset = THEoffset(A1,A2) ! 54: val Soffset = Integer.makestring offset ! 55: val rs = THErs(A1,A2) ! 56: val Srs = Integer.makestring rs ! 57: val do_special = ! 58: (case funct of ! 59: 0 => "sll " ^ "rd = " ^ Srd ^ "," ^ "rt = " ^ Srt ^ "," ^ "shamt = " ^ Sshamt ^ "\n" ! 60: | 2 => "srl " ^ "rd = " ^ Srd ^ "," ^ "rt = " ^ Srt ^ "," ^ "shamt = " ^ Sshamt ^ "\n" ! 61: | 3 => "sra " ^ "rd = " ^ Srd ^ "," ^ "rt = " ^ Srt ^ "," ^ "shamt = " ^ Sshamt ^ "\n" ! 62: | 4 => "sllv " ^ "rd = " ^ Srd ^ "," ^ "rt = " ^ Srt ^ "," ^ "rs = " ^ Srs ^ "\n" ! 63: | 6 => "srlv " ^ "rd = " ^ Srd ^ "," ^ "rt = " ^ Srt ^ "," ^ "rs = " ^ Srs ^ "\n" ! 64: | 7 => "srav " ^ "rd = " ^ Srd ^ "," ^ "rt = " ^ Srt ^ "," ^ "rs = " ^ Srs ^ "\n" ! 65: | 8 => "jr " ^ "rs = " ^ Srs ^ "\n" ! 66: | 9 => "jalr " ^ "rs = " ^ Srs ^ "," ^ "rd = " ^ Srd ^ "\n" ! 67: | 12 => "syscall " ^ "\n" ! 68: | 13 => "break " ^ "\n" ! 69: | 16 => "mfhi " ^ "rd = " ^ Srd ^ "\n" ! 70: | 17 => "mthi " ^ "rs = " ^ Srs ^ "\n" ! 71: | 18 => "mflo " ^ "rd = " ^ Srd ^ "\n" ! 72: | 19 => "mtlo " ^ "rs = " ^ Srs ^ "\n" ! 73: | 24 => "mult " ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 74: | 25 => "multu " ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 75: | 26 => "div " ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 76: | 27 => "divu " ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 77: | 32 => "add " ^ "rd = " ^ Srd ^ "," ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 78: | 33 => "addu " ^ "rd = " ^ Srd ^ "," ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 79: | 34 => "sub " ^ "rd = " ^ Srd ^ "," ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 80: | 35 => "subu " ^ "rd = " ^ Srd ^ "," ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 81: | 36 => "and' " ^ "rd = " ^ Srd ^ "," ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 82: | 37 => "or " ^ "rd = " ^ Srd ^ "," ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 83: | 38 => "xor " ^ "rd = " ^ Srd ^ "," ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 84: | 39 => "nor " ^ "rd = " ^ Srd ^ "," ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 85: | 42 => "slt " ^ "rd = " ^ Srd ^ "," ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 86: | 43 => "sltu " ^ "rd = " ^ Srd ^ "," ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "\n" ! 87: | _ => "unknown special\n" ! 88: ) ! 89: val do_bcond = ! 90: (case cond of ! 91: 0 => "bltz " ^ "rs = " ^ Srs ^ "," ^ "offset = " ^ Soffset ^ "\n" ! 92: | 1 => "bgez " ^ "rs = " ^ Srs ^ "," ^ "offset = " ^ Soffset ^ "\n" ! 93: | 16 => "bltzal " ^ "rs = " ^ Srs ^ "," ^ "offset = " ^ Soffset ^ "\n" ! 94: | 17 => "bgezal " ^ "rs = " ^ Srs ^ "," ^ "offset = " ^ Soffset ^ "\n" ! 95: | _ => "unknown bcond\n" ! 96: ) ! 97: val do_cop1 = ! 98: (case funct of ! 99: 0 => "add_fmt " ^ "fmt = " ^ Sfmt ^ "," ^ "fd = " ^ Sfd ^ "," ^ "fs = " ^ Sfs ^ "," ^ "ft = " ^ Sft ^ "\n" ! 100: | 1 => "sub_fmt " ^ "fmt = " ^ Sfmt ^ "," ^ "fd = " ^ Sfd ^ "," ^ "fs = " ^ Sfs ^ "," ^ "ft = " ^ Sft ^ "\n" ! 101: | 2 => "mul_fmt " ^ "fmt = " ^ Sfmt ^ "," ^ "fd = " ^ Sfd ^ "," ^ "fs = " ^ Sfs ^ "," ^ "ft = " ^ Sft ^ "\n" ! 102: | 3 => "div_fmt " ^ "fmt = " ^ Sfmt ^ "," ^ "fd = " ^ Sfd ^ "," ^ "fs = " ^ Sfs ^ "," ^ "ft = " ^ Sft ^ "\n" ! 103: | 5 => "abs_fmt(??? unknown format???)\n" ! 104: | 6 => "mov_fmt(??? unknown format???)\n" ! 105: | 7 => "neg_fmt " ^ "fmt = " ^ Sfmt ^ "," ^ "fd = " ^ Sfd ^ "," ^ "fs = " ^ Sfs ^ "\n" ! 106: | 32 => "cvt_s(??? unknown format???)\n" ! 107: | 33 => "cvt_d(??? unknown format???)\n" ! 108: | 36 => "cvt_w(??? unknown format???)\n" ! 109: | 48 => "c_f(??? unknown format???)\n" ! 110: | 49 => "c_un(??? unknown format???)\n" ! 111: | 50 => "c_eq(??? unknown format???)\n" ! 112: | 51 => "c_ueq(??? unknown format???)\n" ! 113: | 52 => "c_olt(??? unknown format???)\n" ! 114: | 53 => "c_ult(??? unknown format???)\n" ! 115: | 54 => "c_ole(??? unknown format???)\n" ! 116: | 55 => "c_ule(??? unknown format???)\n" ! 117: | 56 => "c_sf(??? unknown format???)\n" ! 118: | 57 => "c_ngle(??? unknown format???)\n" ! 119: | 58 => "c_seq " ^ "fmt = " ^ Sfmt ^ "," ^ "fs = " ^ Sfs ^ "," ^ "ft = " ^ Sft ^ "\n" ! 120: | 59 => "c_ngl(??? unknown format???)\n" ! 121: | 60 => "c_lt " ^ "fmt = " ^ Sfmt ^ "," ^ "fs = " ^ Sfs ^ "," ^ "ft = " ^ Sft ^ "\n" ! 122: | 61 => "c_nge(??? unknown format???)\n" ! 123: | 62 => "c_le(??? unknown format???)\n" ! 124: | 63 => "c_ngt(??? unknown format???)\n" ! 125: | _ => "unknown cop1\n" ! 126: ) ! 127: in ! 128: (case op' of ! 129: 0 => do_special ! 130: | 1 => do_bcond ! 131: | 2 => "j " ^ "target = " ^ Starget ^ "\n" ! 132: | 3 => "jal " ^ "target = " ^ Starget ^ "\n" ! 133: | 4 => "beq " ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "\n" ! 134: | 5 => "bne " ^ "rs = " ^ Srs ^ "," ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "\n" ! 135: | 6 => "blez " ^ "rs = " ^ Srs ^ "," ^ "offset = " ^ Soffset ^ "\n" ! 136: | 7 => "bgtz " ^ "rs = " ^ Srs ^ "," ^ "offset = " ^ Soffset ^ "\n" ! 137: | 8 => "addi " ^ "rt = " ^ Srt ^ "," ^ "rs = " ^ Srs ^ "," ^ "immed = " ^ Simmed ^ "\n" ! 138: | 9 => "addiu " ^ "rt = " ^ Srt ^ "," ^ "rs = " ^ Srs ^ "," ^ "immed = " ^ Simmed ^ "\n" ! 139: | 10 => "slti " ^ "rt = " ^ Srt ^ "," ^ "rs = " ^ Srs ^ "," ^ "immed = " ^ Simmed ^ "\n" ! 140: | 11 => "sltiu " ^ "rt = " ^ Srt ^ "," ^ "rs = " ^ Srs ^ "," ^ "immed = " ^ Simmed ^ "\n" ! 141: | 12 => "andi " ^ "rt = " ^ Srt ^ "," ^ "rs = " ^ Srs ^ "," ^ "immed = " ^ Simmed ^ "\n" ! 142: | 13 => "ori " ^ "rt = " ^ Srt ^ "," ^ "rs = " ^ Srs ^ "," ^ "immed = " ^ Simmed ^ "\n" ! 143: | 14 => "xori " ^ "rt = " ^ Srt ^ "," ^ "rs = " ^ Srs ^ "," ^ "immed = " ^ Simmed ^ "\n" ! 144: | 15 => "lui " ^ "rt = " ^ Srt ^ "," ^ "immed = " ^ Simmed ^ "\n" ! 145: | 16 => "cop0(??? unknown format???)\n" ! 146: | 17 => do_cop1 ! 147: | 18 => "cop2(??? unknown format???)\n" ! 148: | 19 => "cop3(??? unknown format???)\n" ! 149: | 32 => "lb " ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 150: | 33 => "lh " ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 151: | 34 => "lwl " ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 152: | 35 => "lw " ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 153: | 36 => "lbu " ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 154: | 37 => "lhu " ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 155: | 38 => "lwr " ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 156: | 40 => "sb " ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 157: | 41 => "sh " ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 158: | 42 => "swl " ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 159: | 43 => "sw " ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 160: | 46 => "swr " ^ "rt = " ^ Srt ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 161: | 48 => "lwc0(??? unknown format???)\n" ! 162: | 49 => "lwc1 " ^ "ft = " ^ Sft ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 163: | 50 => "lwc2(??? unknown format???)\n" ! 164: | 51 => "lwc3(??? unknown format???)\n" ! 165: | 56 => "swc0(??? unknown format???)\n" ! 166: | 57 => "swc1 " ^ "ft = " ^ Sft ^ "," ^ "offset = " ^ Soffset ^ "," ^ "base = " ^ Sbase ^ "\n" ! 167: | 58 => "swc2(??? unknown format???)\n" ! 168: | 59 => "swc3(??? unknown format???)\n" ! 169: | _ => "unknown opcode\n" ! 170: ) ! 171: end ! 172: end (* Decode *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.