| 1099 | // --------------------------------------------------------------------------- |
| 1100 | |
| 1101 | void PPCDisasm(PPCD_CB *discb) |
| 1102 | { |
| 1103 | // Save parameters in local variables for static calls |
| 1104 | o = discb; |
| 1105 | if(o == NULL) return; |
| 1106 | |
| 1107 | // Detect endianness order. |
| 1108 | if(bigendian == -1) |
| 1109 | { |
| 1110 | u8 test_value[2] = { 0xAA, 0xBB }; |
| 1111 | u16 *value = (u16 *)test_value; |
| 1112 | if(*value == 0xAABB) bigendian = 1; |
| 1113 | else bigendian = 0; |
| 1114 | } |
| 1115 | |
| 1116 | // Reset output parameters |
| 1117 | o->iclass = PPC_DISA_OTHER; |
| 1118 | o->r[0] = o->r[1] = o->r[2] = o->r[3] = 0; |
| 1119 | o->immed = 0; |
| 1120 | o->target = 0; |
| 1121 | o->mnemonic[0] = o->operands[0] = '\0'; |
| 1122 | |
| 1123 | // Lets go! |
| 1124 | |
| 1125 | /* |
| 1126 | * Main table |
| 1127 | */ |
| 1128 | |
| 1129 | switch(Instr >> 26 /* Main opcode, base 8 */) { |
| 1130 | #ifdef POWERPC_64 |
| 1131 | case 002: trap(1, 1); break; // tdi |
| 1132 | #endif |
| 1133 | case 003: trap(0, 1); break; // twi |
| 1134 | case 007: integer("mulli", 'D', DAB_D|DAB_A); break; // mulli |
| 1135 | case 010: integer("subfic", 'D', DAB_D|DAB_A); break; // subfic |
| 1136 | case 012: cmp("l", "i"); break; // cmpli |
| 1137 | case 013: cmp("", "i"); break; // cmpi |
| 1138 | case 014: addi("c"); break; // addic |
| 1139 | case 015: addi("c."); break; // addic. |
| 1140 | case 016: addi(""); break; // addi |
| 1141 | case 017: addi("s"); break; // addis |
| 1142 | case 020: bcx(1, 0); break; // bcx |
| 1143 | case 021: put("sc", 0x03ffffff, 2); break; // sc |
| 1144 | case 022: bx(); break; // bx |
| 1145 | case 024: rlw("imi", 0, 1); break; // rlwimix |
| 1146 | case 025: rlw("inm", 0); break; // rlwinmx |
| 1147 | case 027: rlw("nm", 1); break; // rlwnmx |
| 1148 | case 030: // ori |
| 1149 | #ifdef SIMPLIFIED |
| 1150 | if(Instr == 0x60000000) put("nop", 0, 0, PPC_DISA_INTEGER | PPC_DISA_SIMPLIFIED); |
| 1151 | else |
| 1152 | #endif |
| 1153 | integer("ori", 'S', ASB_A|ASB_S, 1, 0); break; |
| 1154 | case 031: integer("oris", 'S', ASB_A|ASB_S, 1, 0); break; // oris |
| 1155 | case 032: integer("xori", 'S', ASB_A|ASB_S, 1, 0); break; // xori |
| 1156 | case 033: integer("xoris", 'S', ASB_A|ASB_S, 1, 0); break; // xoris |
| 1157 | case 034: integer("andi.", 'S', ASB_A|ASB_S, 1, 0); break; // andi. |
| 1158 | case 035: integer("andis.", 'S', ASB_A|ASB_S, 1, 0); break; // andis. |