Вы таки будете смеятся, но то, что я принял за баги трансляции команд addis andis. оказалось вовсе не багами, а просто дурной привычкой MAME'овского дизассемблера упрощать некоторые команды.
else if ((op & ~(M_RT|M_RA|M_SIMM)) == D_OP(15))
{
if (G_RA(op) == 0)
{
mnem += "li"; // addis rT,0,value -> li rT,(value<<16)
oprs = util::string_format("r%d,0x%08X", G_RT(op), value << 16);
}
else
{
mnem += "addi"; // addis rT,rA,SIMM -> addi rT,rA,SIMM<<16
oprs = util::string_format("r%d,r%d,0x%08X", G_RT(op), G_RA(op), value << 16);
}
}
else if ((op & ~(M_RT|M_RA|M_UIMM)) == D_OP(29))
{
mnem += "andi."; // andis. rA,rT,UIMM -> andi. rA,rT,UIMM<<16
oprs = util::string_format("r%d,r%d,0x%08X", G_RA(op), G_RT(op), G_UIMM(op) << 16);
}