mirror of
https://github.com/JanNeuendorf/SVC16.git
synced 2025-06-04 18:45:27 +00:00
Implemented the new buffer in the emulator
This commit is contained in:
parent
d0b9de0e24
commit
3a0a3c4047
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -1813,7 +1813,7 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||
|
||||
[[package]]
|
||||
name = "svc16"
|
||||
version = "0.5.0"
|
||||
version = "0.6.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"clap",
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "svc16"
|
||||
version = "0.5.0"
|
||||
version = "0.6.0"
|
||||
edition = "2021"
|
||||
authors = ["Jan Neuendorf"]
|
||||
description = "An emulator for a simple virtual computer"
|
||||
|
@ -22,11 +22,13 @@ const SYNC: u16 = 15;
|
||||
|
||||
pub struct Engine {
|
||||
memory: [u16; MEMSIZE],
|
||||
screen: [u16; MEMSIZE],
|
||||
screen_buffer: [u16; MEMSIZE],
|
||||
utility_buffer: [u16; MEMSIZE],
|
||||
instruction_pointer: u16,
|
||||
pos_code: u16,
|
||||
key_code: u16,
|
||||
sync_called: bool,
|
||||
expansion_triggered: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
@ -57,11 +59,13 @@ impl Engine {
|
||||
}
|
||||
Self {
|
||||
memory,
|
||||
screen: [0; MEMSIZE],
|
||||
screen_buffer: [0; MEMSIZE],
|
||||
utility_buffer: [0; MEMSIZE],
|
||||
instruction_pointer: 0,
|
||||
pos_code: 0,
|
||||
key_code: 0,
|
||||
sync_called: false,
|
||||
expansion_triggered: false,
|
||||
}
|
||||
}
|
||||
pub fn wants_to_sync(&self) -> bool {
|
||||
@ -79,7 +83,7 @@ impl Engine {
|
||||
) -> () {
|
||||
self.set_input(pos_code, key_code);
|
||||
self.sync_called = false;
|
||||
*buffer = self.screen;
|
||||
*buffer = self.screen_buffer;
|
||||
}
|
||||
}
|
||||
impl Engine {
|
||||
@ -89,11 +93,17 @@ impl Engine {
|
||||
fn set(&mut self, index: u16, value: u16) {
|
||||
self.memory[index as usize] = value;
|
||||
}
|
||||
fn get_screen(&self, index: u16) -> u16 {
|
||||
return self.screen[index as usize];
|
||||
fn get_screen_buffer(&self, index: u16) -> u16 {
|
||||
return self.screen_buffer[index as usize];
|
||||
}
|
||||
fn set_screen(&mut self, index: u16, value: u16) {
|
||||
self.screen[index as usize] = value;
|
||||
fn get_utility_buffer(&self, index: u16) -> u16 {
|
||||
return self.utility_buffer[index as usize];
|
||||
}
|
||||
fn set_screen_buffer(&mut self, index: u16, value: u16) {
|
||||
self.screen_buffer[index as usize] = value;
|
||||
}
|
||||
fn set_utility_buffer(&mut self, index: u16, value: u16) {
|
||||
self.utility_buffer[index as usize] = value;
|
||||
}
|
||||
pub fn read_instruction(&self) -> [u16; 4] {
|
||||
return [0, 1, 2, 3].map(|o| self.get(self.instruction_pointer.wrapping_add(o)));
|
||||
@ -168,11 +178,19 @@ impl Engine {
|
||||
self.advance_inst_ptr();
|
||||
}
|
||||
PRINT => {
|
||||
self.set_screen(self.get(arg2), self.get(arg1));
|
||||
if arg3 == 0 {
|
||||
self.set_screen_buffer(self.get(arg2), self.get(arg1));
|
||||
} else {
|
||||
self.set_utility_buffer(self.get(arg2), self.get(arg1));
|
||||
}
|
||||
self.advance_inst_ptr();
|
||||
}
|
||||
READ => {
|
||||
self.set(arg2, self.get_screen(self.get(arg1)));
|
||||
if arg3 == 0 {
|
||||
self.set(arg2, self.get_screen_buffer(self.get(arg1)));
|
||||
} else {
|
||||
self.set(arg2, self.get_utility_buffer(self.get(arg1)));
|
||||
}
|
||||
self.advance_inst_ptr();
|
||||
}
|
||||
BAND => {
|
||||
@ -189,6 +207,9 @@ impl Engine {
|
||||
self.sync_called = true;
|
||||
self.set(arg1, self.pos_code);
|
||||
self.set(arg2, self.key_code);
|
||||
if arg3 > 0 {
|
||||
self.expansion_triggered = true;
|
||||
}
|
||||
self.advance_inst_ptr();
|
||||
}
|
||||
_ => return Err(EngineError::InvalidInstruction),
|
||||
|
Loading…
x
Reference in New Issue
Block a user