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>),
EraseArr(Rc<str>),
IfNot(Address),
Jump(Address),
Next(Rc<str>),
On,
Return,
Clear,
Cls,
Cont,
Def(Rc<str>),
Defdbl,
Defint,
Defsng,
Defstr,
Delete,
End,
Fn(Rc<str>),
Input(Rc<str>),
LetMid,
List,
Load,
LoadRun,
New,
Print,
Read,
Renum,
Restore(Address),
Save,
Stop,
Swap,
Troff,
Tron,
Neg,
Pow,
Mul,
Div,
DivInt,
Mod,
Add,
Sub,
Eq,
NotEq,
Lt,
LtEq,
Gt,
GtEq,
Not,
And,
Or,
Xor,
Imp,
Eqv,
Abs,
Asc,
Atn,
Cdbl,
Chr,
Cint,
Cos,
Csng,
Date,
Exp,
Fix,
Hex,
Inkey,
Instr,
Int,
Left,
Len,
Log,
Mid,
Oct,
Pos,
Right,
Rnd,
Sgn,
Sin,
Spc,
Sqr,
Str,
String,
Tab,
Tan,
Time,
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),
EraseArr(s) => write!(f, "ERASEARR({})", 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"),
Cls => write!(f, "CLS"),
Cont => write!(f, "CONT"),
Def(s) => write!(f, "DEF({})", s),
Defdbl => write!(f, "DEFDBL"),
Defint => write!(f, "DEFINT"),
Defsng => write!(f, "DEFSNG"),
Defstr => write!(f, "DEFSTR"),
Delete => write!(f, "DELETE"),
End => write!(f, "END"),
Fn(s) => write!(f, "FN({})", s),
Input(s) => write!(f, "INPUT({})", s),
LetMid => write!(f, "LETMID"),
List => write!(f, "LIST"),
Load => write!(f, "LOAD"),
LoadRun => write!(f, "LOADRUN"),
New => write!(f, "NEW"),
Print => write!(f, "PRINT"),
Read => write!(f, "READ"),
Renum => write!(f, "RENUM"),
Restore(s) => write!(f, "RESTORE({})", s),
Save => write!(f, "SAVE"),
Stop => write!(f, "STOP"),
Swap => write!(f, "SWAP"),
Troff => write!(f, "TROFF"),
Tron => write!(f, "TRON"),
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"),
Atn => write!(f, "ATN"),
Cdbl => write!(f, "CDBL"),
Chr => write!(f, "CHR$"),
Cint => write!(f, "CINT"),
Cos => write!(f, "COS"),
Csng => write!(f, "CSNG"),
Date => write!(f, "DATE$"),
Exp => write!(f, "EXP"),
Fix => write!(f, "FIX"),
Hex => write!(f, "HEX"),
Inkey => write!(f, "INKEY"),
Instr => write!(f, "INSTR"),
Int => write!(f, "INT"),
Left => write!(f, "LEFT$"),
Len => write!(f, "LEN"),
Log => write!(f, "LOG"),
Mid => write!(f, "MID$"),
Oct => write!(f, "OCT"),
Pos => write!(f, "POS"),
Right => write!(f, "RIGHT$"),
Rnd => write!(f, "RND"),
Sgn => write!(f, "SGN"),
Sin => write!(f, "SIN"),
Spc => write!(f, "SPC"),
Sqr => write!(f, "SQR"),
Str => write!(f, "STR"),
String => write!(f, "STRING"),
Tab => write!(f, "TAB"),
Tan => write!(f, "TAN"),
Time => write!(f, "TIME$"),
Val => write!(f, "VAL"),
}
}
}