[NO TESTS] WIP
This commit is contained in:
parent
15cc949472
commit
670b656410
1 changed files with 105 additions and 0 deletions
105
src/lib.rs
105
src/lib.rs
|
@ -6,6 +6,7 @@ use std::rc::Rc;
|
||||||
use std::*;
|
use std::*;
|
||||||
|
|
||||||
use memory::MemoryError;
|
use memory::MemoryError;
|
||||||
|
use stack::StackError;
|
||||||
|
|
||||||
use crate::memory::{Memory, TrivialMemory};
|
use crate::memory::{Memory, TrivialMemory};
|
||||||
use crate::stack::Stack;
|
use crate::stack::Stack;
|
||||||
|
@ -98,6 +99,15 @@ impl Device for SystemDevice {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub enum UxnError {
|
||||||
|
StackError(StackError),
|
||||||
|
MemoryError(MemoryError),
|
||||||
|
ExecutionLimit(u16),
|
||||||
|
ArithmeticOverflow,
|
||||||
|
ArithmeticUnderflow,
|
||||||
|
DivisionByZero,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Uxn {
|
pub struct Uxn {
|
||||||
memory: Rc<RefCell<TrivialMemory>>,
|
memory: Rc<RefCell<TrivialMemory>>,
|
||||||
|
@ -169,4 +179,99 @@ impl Uxn {
|
||||||
self.memory.borrow_mut().set2(address, val)?;
|
self.memory.borrow_mut().set2(address, val)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn lda1(&mut self, address: u16) -> Result<u8, MemoryError> {
|
||||||
|
self.memory.borrow().get1(address)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run one clock cycle (instruction)
|
||||||
|
pub fn step(&mut self) -> Result<(), UxnError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run(&mut self, limit: u16) -> Result<(), UxnError> {
|
||||||
|
let mut executed = 0;
|
||||||
|
loop {
|
||||||
|
if executed == limit {
|
||||||
|
return Err(UxnError::ExecutionLimit(executed));
|
||||||
|
}
|
||||||
|
if self.is_halted() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
match self.lda1(self.pc) {
|
||||||
|
Err(e) => return Err(UxnError::MemoryError(e)),
|
||||||
|
Ok(0) => break,
|
||||||
|
Ok(opcode) => {
|
||||||
|
// Extract flags
|
||||||
|
let sflag: bool = opcode & 0x20 != 0;
|
||||||
|
let rflag: bool = opcode & 0x40 != 0;
|
||||||
|
let kflag: bool = opcode & 0x80 != 0;
|
||||||
|
|
||||||
|
match opcode & 0x1F {
|
||||||
|
0x00 => {
|
||||||
|
// LIT1
|
||||||
|
()
|
||||||
|
}
|
||||||
|
0x01 => {
|
||||||
|
// INC1
|
||||||
|
()
|
||||||
|
}
|
||||||
|
0x02 => {
|
||||||
|
// POP1
|
||||||
|
()
|
||||||
|
}
|
||||||
|
0x03 => {
|
||||||
|
// NIP1
|
||||||
|
()
|
||||||
|
}
|
||||||
|
0x04 => {
|
||||||
|
// SWP1
|
||||||
|
()
|
||||||
|
}
|
||||||
|
0x05 => {
|
||||||
|
// ROT1
|
||||||
|
()
|
||||||
|
}
|
||||||
|
0x06 => {
|
||||||
|
// DUP1
|
||||||
|
()
|
||||||
|
}
|
||||||
|
0x07 => {
|
||||||
|
// OVR1
|
||||||
|
}
|
||||||
|
0x08 => {
|
||||||
|
// EQ1
|
||||||
|
()
|
||||||
|
}
|
||||||
|
0x09 => {
|
||||||
|
// NEQ1
|
||||||
|
()
|
||||||
|
}
|
||||||
|
0x0a => {
|
||||||
|
// GTH1
|
||||||
|
()
|
||||||
|
}
|
||||||
|
0x0b => {
|
||||||
|
// LTH1
|
||||||
|
()
|
||||||
|
}
|
||||||
|
0x0c => {
|
||||||
|
// JMP1
|
||||||
|
}
|
||||||
|
0x0d => {
|
||||||
|
// JCN1
|
||||||
|
}
|
||||||
|
0x0e => {
|
||||||
|
// JSR1
|
||||||
|
}
|
||||||
|
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
executed += 1;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue