forked from MightyPork/crsn
renames, improve module API (avoid cloning)
This commit is contained in:
+112
-108
@@ -1,10 +1,11 @@
|
||||
use crsn::asm::data::{Rd, Wr};
|
||||
use crsn::asm::error::{AsmError, Error};
|
||||
use crsn::asm::instr::op::{OpParser, OpTrait};
|
||||
use crsn::asm::instr::op::{AsmModule, OpTrait, ParseOpResult};
|
||||
use crsn::asm::parse::parse_data::{parse_rd, parse_wr};
|
||||
use crsn::sexp::Sexp;
|
||||
|
||||
use crate::defs::ArithOp;
|
||||
use crsn::asm::parse::arg_parser::ArgParser;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct ArithOpParser {
|
||||
@@ -12,31 +13,34 @@ pub struct ArithOpParser {
|
||||
}
|
||||
|
||||
impl ArithOpParser {
|
||||
pub fn new() -> Box<dyn OpParser> {
|
||||
pub fn new() -> Box<dyn AsmModule> {
|
||||
Box::new(Self {
|
||||
_internal: ()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl OpParser for ArithOpParser {
|
||||
fn parse_op(&self, keyword: &str, _far: bool, arg_tokens_sl: Vec<Sexp>) -> Result<Box<dyn OpTrait>, Error> {
|
||||
let mut arg_tokens = arg_tokens_sl.into_iter();
|
||||
Ok(Box::new(match keyword {
|
||||
impl AsmModule for ArithOpParser {
|
||||
fn name(&self) -> &'static str {
|
||||
"arith"
|
||||
}
|
||||
|
||||
fn parse_op(&self, keyword: &str, mut args: ArgParser) -> Result<ParseOpResult, Error> {
|
||||
Ok(ParseOpResult::Parsed(Box::new(match keyword {
|
||||
"cmp" => {
|
||||
ArithOp::Compare {
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
a: args.next_rd()?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
|
||||
"tst" => {
|
||||
let arg = parse_rd(arg_tokens.next())?;
|
||||
let arg = args.next_rd()?;
|
||||
ArithOp::Test { a: arg }
|
||||
}
|
||||
|
||||
"inc" => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Add {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
@@ -45,7 +49,7 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"dec" => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Sub {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
@@ -54,20 +58,20 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"add" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::Add {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Add {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
@@ -77,20 +81,20 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"sub" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::Sub {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Sub {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
@@ -100,20 +104,20 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"mul" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::Mul {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Mul {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
@@ -123,11 +127,11 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"divr" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let rem = parse_wr(arg_tokens.next())?;
|
||||
let div = parse_rd(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
let rem = args.next_wr()?;
|
||||
let div = args.next_rd()?;
|
||||
ArithOp::Div {
|
||||
dst,
|
||||
rem,
|
||||
@@ -137,10 +141,10 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
4 => {
|
||||
ArithOp::Div {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
rem: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
div: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
rem: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
div: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
@@ -150,18 +154,18 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"div" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::Div {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
rem: Wr::discard(),
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
div: parse_rd(arg_tokens.next())?,
|
||||
a: args.next_rd()?,
|
||||
div: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let div = parse_rd(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
let div = args.next_rd()?;
|
||||
ArithOp::Div {
|
||||
dst,
|
||||
rem: Wr::discard(),
|
||||
@@ -176,17 +180,17 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"mod" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::Mod {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
div: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
div: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let div = parse_rd(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
let div = args.next_rd()?;
|
||||
ArithOp::Mod {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
@@ -200,20 +204,20 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"and" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::And {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::And {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
@@ -223,20 +227,20 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"or" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::Or {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Or {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
@@ -246,20 +250,20 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"xor" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::Xor {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Xor {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
b: parse_rd(arg_tokens.next())?,
|
||||
b: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
@@ -269,15 +273,15 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"cpl" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
2 => {
|
||||
ArithOp::Cpl {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
1 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Cpl {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
@@ -290,24 +294,24 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"rol" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::Rol {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
n: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
n: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Rol {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
n: parse_rd(arg_tokens.next())?,
|
||||
n: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
1 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Rol {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
@@ -321,24 +325,24 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"ror" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::Ror {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
n: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
n: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Ror {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
n: parse_rd(arg_tokens.next())?,
|
||||
n: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
1 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Ror {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
@@ -352,24 +356,24 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"lsl" | "asl" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::Lsl {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
n: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
n: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Lsl {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
n: parse_rd(arg_tokens.next())?,
|
||||
n: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
1 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Lsl {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
@@ -383,24 +387,24 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"lsr" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::Lsr {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
n: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
n: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Lsr {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
n: parse_rd(arg_tokens.next())?,
|
||||
n: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
1 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Lsr {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
@@ -414,24 +418,24 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
"asr" => {
|
||||
match arg_tokens.len() {
|
||||
match args.len() {
|
||||
3 => {
|
||||
ArithOp::Asr {
|
||||
dst: parse_wr(arg_tokens.next())?,
|
||||
a: parse_rd(arg_tokens.next())?,
|
||||
n: parse_rd(arg_tokens.next())?,
|
||||
dst: args.next_wr()?,
|
||||
a: args.next_rd()?,
|
||||
n: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
2 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Asr {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
n: parse_rd(arg_tokens.next())?,
|
||||
n: args.next_rd()?,
|
||||
}
|
||||
}
|
||||
1 => {
|
||||
let dst = parse_wr(arg_tokens.next())?;
|
||||
let dst = args.next_wr()?;
|
||||
ArithOp::Asr {
|
||||
dst,
|
||||
a: dst.as_rd(),
|
||||
@@ -445,8 +449,8 @@ impl OpParser for ArithOpParser {
|
||||
}
|
||||
|
||||
_other => {
|
||||
return Err(Error::Asm(AsmError::UnknownInstruction));
|
||||
return Ok(ParseOpResult::Unknown(args));
|
||||
}
|
||||
}))
|
||||
})))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user