116 lines
2.3 KiB
C++
116 lines
2.3 KiB
C++
#ifndef OPCODE_H
|
|
#define OPCODE_H
|
|
|
|
#include "utils.h"
|
|
|
|
// ==============================
|
|
// Opcode definitions (SIC/XE)
|
|
// ==============================
|
|
#define ADD 0x18
|
|
#define ADDF 0x58
|
|
#define ADDR 0x90
|
|
#define AND 0x40
|
|
#define CLEAR 0xB4
|
|
#define COMP 0x28
|
|
#define COMPF 0x88
|
|
#define COMPR 0xA0
|
|
#define DIV 0x24
|
|
#define DIVF 0x64
|
|
#define DIVR 0x9C
|
|
#define FIX 0xC4
|
|
#define FLOAT 0xC0
|
|
#define HIO 0xF4
|
|
#define J 0x3C
|
|
#define JEQ 0x30
|
|
#define JGT 0x34
|
|
#define JLT 0x38
|
|
#define JSUB 0x48
|
|
#define LDA 0x00
|
|
#define LDB 0x68
|
|
#define LDCH 0x50
|
|
#define LDF 0x70
|
|
#define LDL 0x08
|
|
#define LDS 0x6C
|
|
#define LDT 0x74
|
|
#define LDX 0x04
|
|
#define LPS 0xD0
|
|
#define MUL 0x20
|
|
#define MULF 0x60
|
|
#define MULR 0x98
|
|
#define NORM 0xC8
|
|
#define OR 0x44
|
|
#define RD 0xD8
|
|
#define RMO 0xAC
|
|
#define RSUB 0x4C
|
|
#define SHIFTL 0xA4
|
|
#define SHIFTR 0xA8
|
|
#define SIO 0xF0
|
|
#define SSK 0xEC
|
|
#define STA 0x0C
|
|
#define STB 0x78
|
|
#define STCH 0x54
|
|
#define STF 0x80
|
|
#define STI 0xD4
|
|
#define STL 0x14
|
|
#define STS 0x7C
|
|
#define STSW 0xE8
|
|
#define STT 0x84
|
|
#define STX 0x10
|
|
#define SUB 0x1C
|
|
#define SUBF 0x5C
|
|
#define SUBR 0x94
|
|
#define SVC 0xB0
|
|
#define TD 0xE0
|
|
#define TIO 0xF8
|
|
#define TIX 0x2C
|
|
#define TIXR 0xB8
|
|
#define WD 0xDC
|
|
|
|
// ==============================
|
|
// Extended opcodes (SIC/XE/XE)
|
|
// ==============================
|
|
#define NOP 0xF1
|
|
#define HALT 0xF2
|
|
#define XEXE 0xEE // Enable extended mode
|
|
#define VADD 0x18
|
|
#define VADDR 0x90
|
|
#define VSUB 0x1C
|
|
#define VSUBR 0x94
|
|
#define VMUL 0x20
|
|
#define VMULR 0x98
|
|
#define VDIV 0x24
|
|
#define VDIVR 0x9C
|
|
#define STVA 0x0C
|
|
#define STVS 0x7C
|
|
#define STVT 0x84
|
|
#define LDVA 0x00
|
|
#define LDVS 0x68
|
|
#define LDVT 0x04
|
|
|
|
|
|
|
|
enum class InstructionType {
|
|
TYPE1,
|
|
TYPE2,
|
|
TYPE3_4,
|
|
INVALID
|
|
};
|
|
|
|
class Machine; // forward
|
|
|
|
// Store raw function pointer (void*) to allow different handler signatures
|
|
using RawHandler = void*;
|
|
|
|
struct InstructionInfo {
|
|
const char* name;
|
|
InstructionType type;
|
|
RawHandler handler;
|
|
};
|
|
|
|
extern InstructionInfo instructions[];
|
|
extern InstructionInfo instructionsEXEX[];
|
|
|
|
// Initialize the instruction table
|
|
void loadInstructionSet();
|
|
|
|
#endif // OPCODE_H
|