mirror of
https://github.com/TomHarte/CLK.git
synced 2024-10-01 13:58:20 +00:00
175 lines
2.6 KiB
C++
175 lines
2.6 KiB
C++
|
//
|
||
|
// PowerPC.cpp
|
||
|
// Clock Signal
|
||
|
//
|
||
|
// Created by Thomas Harte on 12/30/20.
|
||
|
// Copyright © 2020 Thomas Harte. All rights reserved.
|
||
|
//
|
||
|
|
||
|
#include "PowerPC.hpp"
|
||
|
|
||
|
using namespace CPU::Decoder::PowerPC;
|
||
|
|
||
|
Decoder::Decoder(Model model) : model_(model) {}
|
||
|
|
||
|
Instruction Decoder::decode(uint32_t opcode) {
|
||
|
switch(opcode >> 26) {
|
||
|
case 31:
|
||
|
const uint8_t dest = (opcode >> 21) & 0x1f;
|
||
|
const uint8_t a = (opcode >> 16) & 0x1f;
|
||
|
const uint8_t b = (opcode >> 11) & 0x1f;
|
||
|
|
||
|
#define OECase(x) case x: case 0x200 + x
|
||
|
switch((opcode >> 1) & 0x3ff) {
|
||
|
case 0:
|
||
|
// cmp; 601 10-26
|
||
|
break;
|
||
|
case 4:
|
||
|
// tw; 601 10-214
|
||
|
break;
|
||
|
OECase(8):
|
||
|
// subfcx; 601 10-207
|
||
|
break;
|
||
|
// case 9:
|
||
|
// // mulhdux
|
||
|
// break;
|
||
|
OECase(10):
|
||
|
// addcx; 601 10-9
|
||
|
break;
|
||
|
case 11:
|
||
|
// mulhwux; 601 10-142
|
||
|
break;
|
||
|
case 19:
|
||
|
// mfcr; 601 10-122
|
||
|
break;
|
||
|
case 20:
|
||
|
// lwarx
|
||
|
break;
|
||
|
case 21:
|
||
|
// ldx
|
||
|
break;
|
||
|
// lwzx
|
||
|
// slwx
|
||
|
// cntlzwx
|
||
|
// sldx
|
||
|
// andx
|
||
|
// ampl
|
||
|
// subfx
|
||
|
// ldux
|
||
|
// dcbst
|
||
|
// lwzux
|
||
|
// cntlzdx
|
||
|
// andcx
|
||
|
// td
|
||
|
// mulhx
|
||
|
// mulhwx
|
||
|
// mfmsr
|
||
|
// ldarx
|
||
|
// dcbf
|
||
|
// lbzx
|
||
|
// negx
|
||
|
// norx
|
||
|
// subfex
|
||
|
// adex
|
||
|
// mtcrf
|
||
|
// mtmsr
|
||
|
// stfx
|
||
|
// stwcx.
|
||
|
// stwx
|
||
|
// stdux
|
||
|
// stwux
|
||
|
// subfzex
|
||
|
// addzex
|
||
|
// mtsr
|
||
|
// stdcx.
|
||
|
// stbx
|
||
|
// subfmex
|
||
|
// mulld
|
||
|
// addmex
|
||
|
// mullwx
|
||
|
// mtsrin
|
||
|
// scbtst
|
||
|
// stbux
|
||
|
// addx
|
||
|
// dcbt
|
||
|
// lhzx
|
||
|
// eqvx
|
||
|
// tlbie
|
||
|
// eciwx
|
||
|
// lhzux
|
||
|
// xorx
|
||
|
// mfspr
|
||
|
// lwax
|
||
|
// lhax
|
||
|
// lbia
|
||
|
// mftb
|
||
|
// lwaux
|
||
|
// lhaux
|
||
|
// sthx
|
||
|
// orcx
|
||
|
// sradix
|
||
|
// slbie
|
||
|
// ecowx
|
||
|
// sthux
|
||
|
// orx
|
||
|
// divdux
|
||
|
// divwux
|
||
|
// mtspr
|
||
|
// dcbi
|
||
|
// nandx
|
||
|
// divdx
|
||
|
// divwx
|
||
|
// slbia
|
||
|
// mcrxr
|
||
|
// lswx
|
||
|
// lwbrx
|
||
|
// lfsx
|
||
|
// srwx
|
||
|
// srdx
|
||
|
// tlbsync
|
||
|
// lfsux
|
||
|
// mfsr
|
||
|
// lswi
|
||
|
// sync
|
||
|
// lfdx
|
||
|
// lfdux
|
||
|
// mfsrin
|
||
|
// stswx
|
||
|
// stwbrx
|
||
|
// stfsx
|
||
|
// stfsux
|
||
|
// stswi
|
||
|
// stfdx
|
||
|
// stfdux
|
||
|
// lhbrx
|
||
|
// srawx
|
||
|
// sradx
|
||
|
// srawix
|
||
|
// eieio
|
||
|
// ethbrx
|
||
|
// extshx
|
||
|
// extsbx
|
||
|
// lcbi
|
||
|
// stfiwx
|
||
|
// extsw
|
||
|
// dcbz
|
||
|
OECase(138):
|
||
|
// addex
|
||
|
break;
|
||
|
OECase(266):
|
||
|
// addx
|
||
|
break;
|
||
|
case 28:
|
||
|
// andx
|
||
|
break;
|
||
|
case 60:
|
||
|
// andcx
|
||
|
break;
|
||
|
}
|
||
|
#undef OECase
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return Instruction();
|
||
|
}
|