357 lines
9.1 KiB
C++
357 lines
9.1 KiB
C++
/**
|
|
* @brief AUTO-GENERATED by pygen.ipynb BUT editable by hand!
|
|
*
|
|
*/
|
|
|
|
#include <spider/runtime/cpu/CPU.hpp>
|
|
|
|
namespace spider {
|
|
|
|
void CPU::NOP() {
|
|
// TODO: Implement NOP
|
|
}
|
|
|
|
void CPU::SPDR() {
|
|
// TODO: Implement SPDR
|
|
}
|
|
|
|
void CPU::MMODE() {
|
|
// TODO: Implement MMODE
|
|
}
|
|
|
|
void CPU::INT() {
|
|
// TODO: Implement INT
|
|
}
|
|
|
|
void CPU::LRV() {
|
|
// TODO: Implement LRV
|
|
}
|
|
|
|
void CPU::FSR() {
|
|
// TODO: Implement FSR
|
|
}
|
|
|
|
void CPU::FIR() {
|
|
// TODO: Implement FIR
|
|
}
|
|
|
|
void CPU::FZR() {
|
|
// TODO: Implement FZR
|
|
}
|
|
|
|
void CPU::LSR() {
|
|
// TODO: Implement LSR
|
|
}
|
|
|
|
void CPU::FVR() {
|
|
// TODO: Implement FVR
|
|
}
|
|
|
|
void CPU::MOV() {
|
|
// TODO: Implement MOV
|
|
}
|
|
|
|
void CPU::MOR() {
|
|
// TODO: Implement MOR
|
|
}
|
|
|
|
void CPU::AMOV() {
|
|
// TODO: Implement AMOV
|
|
}
|
|
|
|
void CPU::SWP() {
|
|
// TODO: Implement SWP
|
|
}
|
|
|
|
void CPU::AHM() {
|
|
// TODO: Implement AHM
|
|
}
|
|
|
|
void CPU::COM() {
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_u8 = ~_dst->_u8;
|
|
break;
|
|
case 0b01: //short
|
|
_dst->_u16 = ~_dst->_u16;
|
|
break;
|
|
case 0b10: //int
|
|
_dst->_u32 = ~_dst->_u32;
|
|
break;
|
|
case 0b11: //long
|
|
_dst->_u64 = ~_dst->_u64;
|
|
break;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::NEG() {
|
|
// TODO: Implement NEG
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_u8 = 1 + ~_dst->_u8;
|
|
break;
|
|
case 0b01: //short
|
|
_dst->_u16 = 1+ ~_dst->_u16;
|
|
break;
|
|
case 0b10: //int
|
|
_dst->_u32 = 1 + ~_dst->_u32;
|
|
break;
|
|
case 0b11: //long
|
|
_dst->_u64 = 1 + ~_dst->_u64;
|
|
break;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::EXS() { // THIS IS INCORRECT!!!
|
|
// TODO: Implement EXS
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_i16 = static_cast<i16>(_dst->_i8);
|
|
break;
|
|
case 0b01: //short
|
|
_dst->_i32 = static_cast<i32>(_dst->_i16);
|
|
break;
|
|
case 0b10: //int
|
|
_dst->_i64 = static_cast<i64>(_dst->_i32);
|
|
break;
|
|
case 0b11: //long
|
|
_dst->_i64 = _dst->_i64;
|
|
break;
|
|
}
|
|
_dst->_u32 = _dst->_u8;
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::INC() {
|
|
// TODO: Implement INC
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_u8 += 1;
|
|
case 0b01: //short
|
|
_dst->_u16 += 1;
|
|
case 0b10: //int
|
|
_dst->_u32 += 1;
|
|
case 0b11: //long
|
|
_dst->_u64 += 1;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::DEC() {
|
|
// TODO: Implement DEC
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_u8 -= 1;
|
|
case 0b01: //short
|
|
_dst->_u16 -= 1;
|
|
case 0b10: //int
|
|
_dst->_u32 -= 1;
|
|
case 0b11: //long
|
|
_dst->_u64 -= 1;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::ADD() {
|
|
// TODO: Implement ADD
|
|
fetchOperSrc();
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_u8 += _src->_u8;
|
|
case 0b01: //short
|
|
_dst->_u16 += _src->_u16;
|
|
case 0b10: //int
|
|
_dst->_u32 += _src->_u32;
|
|
case 0b11: //long
|
|
_dst->_u64 += _src->_u64;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::SUB() {
|
|
// TODO: Implement SUB
|
|
fetchOperSrc();
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_u8 -= _src->_u8;
|
|
case 0b01: //short
|
|
_dst->_u16 -= _src->_u16;
|
|
case 0b10: //int
|
|
_dst->_u32 -= _src->_u32;
|
|
case 0b11: //long
|
|
_dst->_u64 -= _src->_u64;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::MUL() {
|
|
// TODO: Implement MUL
|
|
fetchOperSrc();
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_i8 = _src->_i8 * _dst->_i8;
|
|
case 0b01: //short
|
|
_dst->_i16 = _src->_i16 * _dst->_i16;
|
|
case 0b10: //int
|
|
_dst->_i32 = _src->_i32 * _dst->_i32;
|
|
case 0b11: //long
|
|
_dst->_i64 = _src->_i64 * _dst->_i64;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::UMUL() {
|
|
// TODO: Implement UMUL
|
|
fetchOperSrc();
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_u8 = _src->_u8 * _dst->_u8;
|
|
case 0b01: //short
|
|
_dst->_u16 = _src->_u16 * _dst->_u16;
|
|
case 0b10: //int
|
|
_dst->_u32 = _src->_u32 * _dst->_u32;
|
|
case 0b11: //long
|
|
_dst->_u64 = _src->_u64 * _dst->_u64;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::DIV() {
|
|
// TODO: Implement DIV
|
|
fetchOperSrc();
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_i8 = _dst->_i8 / _src->_i8;
|
|
case 0b01: //short
|
|
_dst->_i16 = _dst->_i16 / _src->_i16;
|
|
case 0b10: //int
|
|
_dst->_i32 = _dst->_i32 / _src->_i32;
|
|
case 0b11: //long
|
|
_dst->_i64 = _dst->_i64 / _src->_i64;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::UDIV() {
|
|
// TODO: Implement UDIV
|
|
fetchOperSrc();
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_u8 = _dst->_u8 / _src->_u8;
|
|
case 0b01: //short
|
|
_dst->_u16 = _dst->_u16 / _src->_u16;
|
|
case 0b10: //int
|
|
_dst->_u32 = _dst->_u32 / _src->_u32;
|
|
case 0b11: //long
|
|
_dst->_u64 = _dst->_u64 / _src->_u64;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::MOD() {
|
|
// TODO: Implement MOD
|
|
fetchOperSrc();
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_i8 = _dst->_i8 % _src->_i8;
|
|
case 0b01: //short
|
|
_dst->_i16 = _dst->_i16 % _src->_i16;
|
|
case 0b10: //int
|
|
_dst->_i32 = _dst->_i32 % _src->_i32;
|
|
case 0b11: //long
|
|
_dst->_i64 = _dst->_i64 % _src->_i64;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::UMOD() {
|
|
// TODO: Implement UMOD
|
|
fetchOperSrc();
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
_dst->_u8 = _dst->_u8 % _src->_u8;
|
|
case 0b01: //short
|
|
_dst->_u16 = _dst->_u16 % _src->_u16;
|
|
case 0b10: //int
|
|
_dst->_u32 = _dst->_u32 % _src->_u32;
|
|
case 0b11: //long
|
|
_dst->_u64 = _dst->_u64 % _src->_u64;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::DMOD() {
|
|
// TODO: Implement DMOD
|
|
fetchOperSrc();
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
RX._i8 = _dst->_i8 / _src->_i8;
|
|
RY._i8 = _dst->_i8 % _src->_i8;
|
|
case 0b01: //short
|
|
RX._i16 = _dst->_i16 / _src->_i16;
|
|
RY._i16 = _dst->_i16 % _src->_i16;
|
|
case 0b10: //int
|
|
RX._i32 = _dst->_i32 / _src->_i32;
|
|
RY._i32 = _dst->_i32 % _src->_i32;
|
|
case 0b11: //long
|
|
RX._i64 = _dst->_i64 / _src->_i64;
|
|
RY._i64 = _dst->_i64 % _src->_i64;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::UDMD() {
|
|
// TODO: Implement UDMD
|
|
fetchOperSrc();
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
RX._u8 = _dst->_u8 / _src->_u8;
|
|
RY._u8 = _dst->_u8 % _src->_u8;
|
|
case 0b01: //short
|
|
RX._u16 = _dst->_u16 / _src->_u16;
|
|
RY._u16 = _dst->_u16 % _src->_u16;
|
|
case 0b10: //int
|
|
RX._u32 = _dst->_u32 / _src->_u32;
|
|
RY._u32 = _dst->_u32 % _src->_u32;
|
|
case 0b11: //long
|
|
RX._u64 = _dst->_u64 / _src->_u64;
|
|
RY._u64 = _dst->_u64 % _src->_u64;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
void CPU::FBT() {
|
|
// TODO: Implement FBT
|
|
fetchOperDst();
|
|
switch(_size){
|
|
case 0b00: //byte
|
|
RF = (RF & ~(0x3 << 9)) | ((_dst->_u8 >> 9) & 0x3) << 9;
|
|
case 0b01: //short
|
|
RF = (RF & ~(0x3 << 9)) | ((_dst->_u16 >> 9) & 0x3) << 9;
|
|
case 0b10: //int
|
|
RF = (RF & ~(0x3 << 9)) | ((_dst->_u32 >> 9) & 0x3) << 9;
|
|
case 0b11: //long
|
|
RF = (RF & ~(0x3 << 9)) | ((_dst->_u64 >> 9) & 0x3) << 9;
|
|
}
|
|
(this->*_post)();
|
|
}
|
|
|
|
}
|