Skip to content

Commit

Permalink
Implement new ioport
Browse files Browse the repository at this point in the history
  • Loading branch information
Kogepan229 committed Dec 21, 2024
1 parent ba6ddda commit 7856d95
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 34 deletions.
28 changes: 18 additions & 10 deletions src/simulator.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use crate::emulator::{self, Emulator};
use eframe::egui;
use message_window::MessageWindow;
use std::{collections::HashMap, time};
use std::time;
use terminal::Terminal;
use tokio::sync::mpsc::{self, Receiver};
use views::SimulatorUiStates;
Expand All @@ -12,13 +12,15 @@ mod registers;
mod terminal;
mod views;

pub const IO_PORT_SIZE: usize = 11;

pub struct Simulator {
emulator: Option<Emulator>,
emulator_exec_rx: Option<Receiver<Result<Emulator, String>>>,
ui_states: SimulatorUiStates,
message_window: MessageWindow,
terminal: Terminal,
io_ports: HashMap<u32, u8>,
io_port: [u8; IO_PORT_SIZE],
prev_timing: time::Instant,
}

Expand All @@ -30,7 +32,7 @@ impl Simulator {
ui_states: SimulatorUiStates::new(),
message_window: MessageWindow::new(),
terminal: Terminal::new(),
io_ports: HashMap::new(),
io_port: [0; IO_PORT_SIZE],
prev_timing: time::Instant::now(),
}
}
Expand All @@ -57,7 +59,7 @@ impl Simulator {
}

fn execute_emulator(&mut self, ctx: &egui::Context) {
self.init_io_ports();
self.init_io_port();
self.message_window.clear_messages();
self.terminal.clear();

Expand Down Expand Up @@ -91,15 +93,21 @@ impl Simulator {
};
}

fn init_io_ports(&mut self) {
self.io_ports.clear();
fn read_io_port(&self, port: u8) -> u8 {
self.io_port[port as usize - 1]
}

fn write_io_port(&mut self, port: u8, value: u8) {
self.io_port[port as usize - 1] = value;
}

fn init_io_port(&mut self) {
self.io_port = [0; IO_PORT_SIZE];

// Switch
self.io_ports.insert(registers::P5DDR, 0); // P5DDR
self.io_ports.insert(registers::P5DR, 0xff); // P5DR
self.write_io_port(0x5, 0xff);

// LED
self.io_ports.insert(registers::PBDDR, 0); // PBDDR
self.io_ports.insert(registers::PBDR, 0); // PBDR
self.write_io_port(0xb, 0xff);
}
}
20 changes: 12 additions & 8 deletions src/simulator/parse_messages.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ impl Simulator {

let list: Vec<&str> = message.split(':').collect();
match list[0] {
"u8" => self.parse_u8(list),
"ioport" => self.parse_ioport(list),
"ready" => {
if let Some(emulator) = &self.emulator {
for (addr, value) in self.io_ports.iter() {
emulator.send_message(format!("u8:{:x}:{:x}", addr, value));
}
// Switch
emulator.send_message(format!("ioport:{:x}:{:x}", 0x5, self.read_io_port(0x5)));

emulator.send_message("cmd:start");
self.prev_timing = time::Instant::now();
}
Expand All @@ -30,15 +30,19 @@ impl Simulator {
}
}

fn parse_u8(&mut self, list: Vec<&str>) {
fn parse_ioport(&mut self, list: Vec<&str>) {
if list.len() != 3 {
return;
}
let addr_result = u32::from_str_radix(&list[1], 16);
let port_result = u8::from_str_radix(&list[1], 16);
let value_result = u8::from_str_radix(&list[2], 16);
if let Ok(addr) = addr_result {
if let Ok(port) = port_result {
if let Ok(value) = value_result {
self.io_ports.insert(addr, value);
match port {
// 7SegLED | LED
0x4 | 0xb => self.write_io_port(port, value),
_ => (),
}
}
}
}
Expand Down
28 changes: 12 additions & 16 deletions src/simulator/views.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use super::{registers, Simulator};
use super::Simulator;
use eframe::egui::{self, Vec2};
use egui_extras::Column;
use rfd::AsyncFileDialog;
Expand Down Expand Up @@ -105,16 +105,12 @@ impl Simulator {
fn show_modules(&self, ui: &mut egui::Ui) {
ui.add_enabled_ui(self.emulator.is_some(), |ui| {
let mut led = String::new();
if let Some(p5ddr) = self.io_ports.get(&registers::PBDDR) {
if let Some(p5dr) = self.io_ports.get(&registers::PBDR) {
let pattern = p5ddr & (!p5dr);
for i in 0..=7 {
if (pattern >> (7 - i)) & 1 == 0 {
led += "x";
} else {
led += "o";
}
}
let pattern = self.read_io_port(0xb);
for i in 0..=7 {
if (pattern >> (7 - i)) & 1 == 0 {
led += "o";
} else {
led += "x";
}
}
ui.strong("LED");
Expand All @@ -136,13 +132,13 @@ impl Simulator {
});
})
.body(|mut body| {
let mut io_ports: Vec<(&u32, &u8)> = self.io_ports.iter().collect();
io_ports.sort_by(|a, b| a.0.cmp(&b.0));

for (addr, value) in io_ports {
for (i, value) in self.io_port.iter().enumerate() {
if i + 1 != 0x5 && i + 1 != 0xb {
continue;
}
body.row(16.0, |mut row| {
row.col(|ui| {
ui.label(format!("{:x}", addr));
ui.label(format!("Port{:X}", i + 1));
});
row.col(|ui| {
ui.label(format!("{:x}", value));
Expand Down

0 comments on commit 7856d95

Please sign in to comment.