use super::{Address, Val};
use std::rc::Rc;
#[derive(Clone)]
pub enum Opcode {
Literal(Val),
Push(Rc<str>),
Pop(Rc<str>),
PushArr(Rc<str>),
PopArr(Rc<str>),
DimArr(Rc<str>),
IfNot(Address),
Jump(Address),
Next(Rc<str>),
On,
Return,
Clear,
Cont,
Def(Rc<str>),
End,
Fn(Rc<str>),
Input(Rc<str>),
List,
Load,
New,
Print,
Read,
Restore(Address),
Save,
Stop,
Neg,
Pow,
Mul,
Div,
DivInt,
Mod,
Add,
Sub,
Eq,
NotEq,
Lt,
LtEq,
Gt,
GtEq,
Not,
And,
Or,
Xor,
Imp,
Eqv,
Abs,
Asc,
Chr,
Cos,
Exp,
Int,
Left,
Len,
Mid,
Right,
Rnd,
Sgn,
Sin,
Sqr,
Str,
Tab,
Val,
}
impl std::fmt::Debug for Opcode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.to_string())
}
}
impl std::fmt::Display for Opcode {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
use Opcode::*;
match self {
Literal(v) => write!(f, "PUSH({})", format!("{:?}", v).to_ascii_uppercase()),
Push(s) => write!(f, "PUSH({})", s),
Pop(s) => write!(f, "POP({})", s),
PushArr(s) => write!(f, "PUSHARR({})", s),
PopArr(s) => write!(f, "POPARR({})", s),
DimArr(s) => write!(f, "DIMARR({})", s),
IfNot(a) => write!(f, "IFNOT({})", a),
Jump(a) => write!(f, "JUMP({})", a),
Next(a) => write!(f, "NEXT({})", a),
On => write!(f, "ON"),
Return => write!(f, "RETURN"),
Clear => write!(f, "CLEAR"),
Cont => write!(f, "CONT"),
Def(s) => write!(f, "DEF({})", s),
End => write!(f, "END"),
Fn(s) => write!(f, "FN({})", s),
Input(s) => write!(f, "INPUT({})", s),
List => write!(f, "LIST"),
New => write!(f, "NEW"),
Load => write!(f, "LOAD"),
Print => write!(f, "PRINT"),
Read => write!(f, "READ"),
Restore(s) => write!(f, "RESTORE({})", s),
Save => write!(f, "SAVE"),
Stop => write!(f, "STOP"),
Neg => write!(f, "NEG"),
Pow => write!(f, "POW"),
Mul => write!(f, "MUL"),
Div => write!(f, "DIV"),
DivInt => write!(f, "DIVINT"),
Mod => write!(f, "MOD"),
Add => write!(f, "ADD"),
Sub => write!(f, "SUB"),
Eq => write!(f, "EQ"),
NotEq => write!(f, "NOTEQ"),
Lt => write!(f, "LT"),
LtEq => write!(f, "LTEQ"),
Gt => write!(f, "GT"),
GtEq => write!(f, "GTEQ"),
Not => write!(f, "NOT"),
And => write!(f, "AND"),
Or => write!(f, "OR"),
Xor => write!(f, "XOR"),
Imp => write!(f, "IMP"),
Eqv => write!(f, "EQV"),
Abs => write!(f, "ABS"),
Asc => write!(f, "ASC"),
Chr => write!(f, "CHR$"),
Cos => write!(f, "COS"),
Exp => write!(f, "EXP"),
Int => write!(f, "INT"),
Left => write!(f, "LEFT$"),
Len => write!(f, "LEN"),
Mid => write!(f, "MID$"),
Right => write!(f, "RIGHT$"),
Rnd => write!(f, "RND"),
Sgn => write!(f, "SGN"),
Sin => write!(f, "SIN"),
Sqr => write!(f, "SQR"),
Str => write!(f, "STR"),
Tab => write!(f, "TAB"),
Val => write!(f, "VAL"),
}
}
}