crazy hypno + added sleep cmd

floats
Ondřej Hruška 4 years ago
parent 532df6eb04
commit 01068ea001
Signed by untrusted user: MightyPork
GPG Key ID: 2C5FD5035250423D
  1. 12
      crsn/src/asm/parse/parse_data.rs
  2. 4
      crsn/src/builtin/defs.rs
  3. 4
      crsn/src/builtin/exec.rs
  4. 6
      crsn/src/builtin/parse.rs
  5. 14
      launcher/src/main.rs

@ -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)
) )
) )

Loading…
Cancel
Save