uxn/src/isa.rs

61 lines
1.8 KiB
Rust

// icodes
pub struct Icode {}
impl Icode {
// Official names
pub const BRK: u8 = 0x00u8;
pub const LIT: u8 = 0x1 << 7; // AKA keep Yes really. Per spec;
pub const INC: u8 = 0x01;
pub const POP: u8 = 0x02;
pub const NIP: u8 = 0x03;
pub const SWP: u8 = 0x04;
pub const ROT: u8 = 0x05;
pub const DUP: u8 = 0x06;
pub const OVR: u8 = 0x07;
pub const EQL: u8 = 0x08;
pub const NEQ: u8 = 0x09;
pub const GTH: u8 = 0x0a;
pub const LTH: u8 = 0x0b;
pub const JMP: u8 = 0x0c;
pub const JCN: u8 = 0x0d;
pub const JSR: u8 = 0x0e;
pub const STH: u8 = 0x0f;
pub const LDZ: u8 = 0x10;
pub const STZ: u8 = 0x11;
pub const LDR: u8 = 0x12;
pub const STR: u8 = 0x13;
pub const LDA: u8 = 0x14;
pub const STA: u8 = 0x15;
pub const DEI: u8 = 0x16;
pub const DEO: u8 = 0x17;
pub const ADD: u8 = 0x18;
pub const SUB: u8 = 0x19;
pub const MUL: u8 = 0x1a;
pub const DIV: u8 = 0x1b;
pub const AND: u8 = 0x1c;
pub const ORA: u8 = 0x1d;
pub const EOR: u8 = 0x1e;
pub const SFT: u8 = 0x1f;
// Opcode flags
pub const SHORT: u8 = 0x1 << 5;
pub const RETURN: u8 = 0x1 << 6;
pub const KEEP: u8 = 0x1 << 7;
// Hacking around the official names for some things
pub const XOR: u8 = Icode::EOR;
pub const EQ: u8 = Icode::EQL;
pub const NE: u8 = Icode::NEQ;
pub const GT: u8 = Icode::GTH;
pub const LT: u8 = Icode::LTH;
pub const OR: u8 = Icode::ORA;
pub const NOP: u8 = Icode::POP | Icode::KEEP;
pub const fn parse(opcode: u8) -> (u8, u8, u8, u8) {
let kflag: u8 = (opcode >> 7) & 0x1;
let rflag: u8 = (opcode >> 6) & 0x1;
let sflag: u8 = (opcode >> 5) & 0x1;
let icode: u8 = opcode & 0x1F;
(kflag, rflag, sflag, icode)
}
}