forked from MightyPork/crsn
crazy hypno + added sleep cmd
This commit is contained in:
@@ -6,6 +6,7 @@ use crate::asm::data::{DataDisp, Rd, RdData, reg, Wr, WrData};
|
|||||||
use crate::asm::data::literal::Label;
|
use crate::asm::data::literal::Label;
|
||||||
use crate::asm::error::CrsnError;
|
use crate::asm::error::CrsnError;
|
||||||
use crate::asm::parse::sexp_expect::expect_string_atom;
|
use crate::asm::parse::sexp_expect::expect_string_atom;
|
||||||
|
use std::borrow::Cow;
|
||||||
|
|
||||||
/// Parse a label
|
/// Parse a label
|
||||||
pub fn parse_label(name: Option<Sexp>) -> Result<Label, CrsnError> {
|
pub fn parse_label(name: Option<Sexp>) -> Result<Label, CrsnError> {
|
||||||
@@ -47,12 +48,17 @@ pub fn parse_data_disp(tok: Option<Sexp>) -> Result<DataDisp, CrsnError> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_u64(literal: &str) -> anyhow::Result<u64> {
|
pub fn parse_u64(literal: &str) -> anyhow::Result<u64> {
|
||||||
if let Some(hex) = literal.strip_prefix("0x") {
|
let mut without_underscores = Cow::Borrowed(literal);
|
||||||
|
if without_underscores.contains('_') {
|
||||||
|
without_underscores = without_underscores.replace('_', "").into();
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(hex) = without_underscores.strip_prefix("0x") {
|
||||||
Ok(u64::from_str_radix(hex, 16)?)
|
Ok(u64::from_str_radix(hex, 16)?)
|
||||||
} else if let Some(hex) = literal.strip_prefix("0b") {
|
} else if let Some(hex) = without_underscores.strip_prefix("0b") {
|
||||||
Ok(u64::from_str_radix(hex, 2)?)
|
Ok(u64::from_str_radix(hex, 2)?)
|
||||||
} else {
|
} else {
|
||||||
Ok(u64::from_str_radix(literal, 10)?)
|
Ok(u64::from_str_radix(&without_underscores, 10)?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ pub enum BuiltinOp {
|
|||||||
Nop,
|
Nop,
|
||||||
/// Stop execution
|
/// Stop execution
|
||||||
Halt,
|
Halt,
|
||||||
|
/// Sleep
|
||||||
|
Sleep {
|
||||||
|
micros: Rd,
|
||||||
|
},
|
||||||
/// Mark a jump target.
|
/// Mark a jump target.
|
||||||
Label(Label),
|
Label(Label),
|
||||||
/// Jump to a label
|
/// Jump to a label
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ use crate::module::{EvalRes, OpTrait};
|
|||||||
use crate::runtime::fault::Fault;
|
use crate::runtime::fault::Fault;
|
||||||
use crate::runtime::frame::StackFrame;
|
use crate::runtime::frame::StackFrame;
|
||||||
use crate::runtime::run_thread::{state::RunState, ThreadInfo};
|
use crate::runtime::run_thread::{state::RunState, ThreadInfo};
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
impl OpTrait for BuiltinOp {
|
impl OpTrait for BuiltinOp {
|
||||||
fn execute(&self, info: &ThreadInfo, state: &mut RunState) -> Result<EvalRes, Fault> {
|
fn execute(&self, info: &ThreadInfo, state: &mut RunState) -> Result<EvalRes, Fault> {
|
||||||
@@ -137,6 +138,9 @@ impl OpTrait for BuiltinOp {
|
|||||||
let x = state.read(*src)?;
|
let x = state.read(*src)?;
|
||||||
state.frame.status.load(x);
|
state.frame.status.load(x);
|
||||||
}
|
}
|
||||||
|
BuiltinOp::Sleep { micros } => {
|
||||||
|
std::thread::sleep(Duration::from_micros(state.read(*micros)?))
|
||||||
|
}
|
||||||
BuiltinOp::Drop(obj) => {
|
BuiltinOp::Drop(obj) => {
|
||||||
let x = state.read(Rd::new(RdData::Register(obj.reg())))?;
|
let x = state.read(Rd::new(RdData::Register(obj.reg())))?;
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,12 @@ impl CrsnExtension for BuiltinOps {
|
|||||||
BuiltinOp::Halt
|
BuiltinOp::Halt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"sleep" => {
|
||||||
|
BuiltinOp::Sleep {
|
||||||
|
micros: args.next_rd()?,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
"j" => {
|
"j" => {
|
||||||
let dest = parse_label(args.next())?;
|
let dest = parse_label(args.next())?;
|
||||||
BuiltinOp::Jump(dest)
|
BuiltinOp::Jump(dest)
|
||||||
|
|||||||
@@ -77,29 +77,29 @@ fn main() {
|
|||||||
let program = "
|
let program = "
|
||||||
(
|
(
|
||||||
(main
|
(main
|
||||||
(sc-init 640 480)
|
(sc-init 800 600)
|
||||||
(sc-opt 1 0) ; auto blit
|
(sc-opt 1 0) ; auto blit
|
||||||
(sc-opt 2 60) ; frame rate
|
(sc-opt 2 60) ; frame rate
|
||||||
|
|
||||||
(ld r0 39) ; x
|
(ld r0 5) ; x
|
||||||
(ld r1 0) ; y
|
(ld r1 0) ; y
|
||||||
|
|
||||||
(ld r2 1) ; dx
|
(ld r2 1) ; dx
|
||||||
(ld r3 1) ; dy
|
(ld r3 1) ; dy
|
||||||
|
|
||||||
(ld r5 0xffffff)
|
(ld r5 0x3300ff)
|
||||||
|
|
||||||
(:loop)
|
(:loop)
|
||||||
(add r5 0x010001)
|
(add r5 0x000001)
|
||||||
(and r5 0xffffff)
|
(and r5 0xffffff)
|
||||||
(sc-px r0 r1 r5)
|
(sc-px r0 r1 r5)
|
||||||
(sc-blit 0)
|
|
||||||
(add r0 r2)
|
(add r0 r2)
|
||||||
(add r1 r3)
|
(add r1 r3)
|
||||||
(cmp r0 639 (eq? (ld r2 -1)))
|
(cmp r0 799 (eq? (ld r2 -1)))
|
||||||
(cmp r0 0 (eq? (ld r2 1)))
|
(cmp r0 0 (eq? (ld r2 1)))
|
||||||
(cmp r1 479 (eq? (ld r3 -1)))
|
(cmp r1 599 (eq? (ld r3 -1)))
|
||||||
(cmp r1 0 (eq? (ld r3 1)))
|
(cmp r1 0 (eq? (ld r3 1)))
|
||||||
|
(sc-blit 0)
|
||||||
(j :loop)
|
(j :loop)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user