mirror of
https://github.com/jpd002/Play-.git
synced 2025-04-29 06:07:56 +03:00
86 lines
2.1 KiB
C++
86 lines
2.1 KiB
C++
#include "X86Assembler.h"
|
|
|
|
using namespace std;
|
|
|
|
void CX86Assembler::FldEd(const CAddress& address)
|
|
{
|
|
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
|
|
WriteEvOp(0xD9, 0x00, false, address);
|
|
}
|
|
|
|
void CX86Assembler::FildEd(const CAddress& address)
|
|
{
|
|
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
|
|
WriteEvOp(0xDB, 0x00, false, address);
|
|
}
|
|
|
|
void CX86Assembler::FstpEd(const CAddress& address)
|
|
{
|
|
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
|
|
WriteEvOp(0xD9, 0x03, false, address);
|
|
}
|
|
|
|
void CX86Assembler::FistpEd(const CAddress& address)
|
|
{
|
|
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
|
|
WriteEvOp(0xDB, 0x03, false, address);
|
|
}
|
|
|
|
void CX86Assembler::FisttpEd(const CAddress& address)
|
|
{
|
|
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
|
|
WriteEvOp(0xDB, 0x01, false, address);
|
|
}
|
|
|
|
void CX86Assembler::FaddpSt(uint8 stackId)
|
|
{
|
|
WriteStOp(0xDE, 0x00, stackId);
|
|
}
|
|
|
|
void CX86Assembler::FsubpSt(uint8 stackId)
|
|
{
|
|
WriteStOp(0xDE, 0x05, stackId);
|
|
}
|
|
|
|
void CX86Assembler::FmulpSt(uint8 stackId)
|
|
{
|
|
WriteStOp(0xDE, 0x01, stackId);
|
|
}
|
|
|
|
void CX86Assembler::FdivpSt(uint8 stackId)
|
|
{
|
|
WriteStOp(0xDE, 0x07, stackId);
|
|
}
|
|
|
|
void CX86Assembler::Fwait()
|
|
{
|
|
WriteByte(0x9B);
|
|
}
|
|
|
|
void CX86Assembler::Fsin()
|
|
{
|
|
WriteByte(0xD9);
|
|
WriteByte(0xFE);
|
|
}
|
|
|
|
void CX86Assembler::FnstcwEw(const CAddress& address)
|
|
{
|
|
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
|
|
WriteEvOp(0xD9, 0x07, false, address);
|
|
}
|
|
|
|
void CX86Assembler::FldcwEw(const CAddress& address)
|
|
{
|
|
if(address.ModRm.nMod == 3) throw runtime_error("Invalid address mod.");
|
|
WriteEvOp(0xD9, 0x05, false, address);
|
|
}
|
|
|
|
void CX86Assembler::WriteStOp(uint8 opcode, uint8 subOpcode, uint8 stackId)
|
|
{
|
|
CAddress address;
|
|
address.ModRm.nMod = 3;
|
|
address.ModRm.nFnReg = subOpcode;
|
|
address.ModRm.nRM = stackId;
|
|
WriteByte(opcode);
|
|
WriteByte(address.ModRm.nByte);
|
|
}
|