Skip to content

Commit

Permalink
Code cleanup.
Browse files Browse the repository at this point in the history
  • Loading branch information
Kazik24 committed Jul 14, 2021
1 parent fda9db8 commit e9cf6c2
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 91 deletions.
22 changes: 10 additions & 12 deletions src/assembler.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
use crate::emulator::{Opcode, SubCommand};
use std::convert::TryFrom;
use std::num::ParseIntError;
use std::fmt::Write;
use std::collections::HashMap;
use std::array::IntoIter;

const MAX_ADDRESS: u32 = 2u32.pow(15) - 1;
#[derive(Clone,Eq,PartialEq,Debug)]
Expand Down Expand Up @@ -130,7 +128,7 @@ struct Precompiled<'a>(Opcode,Option<Opcode>,Option<&'a str>);
fn precompile_command<'a>(mnem: &'a str,args: Vec<AsmArgument<'a>>)->Result<Precompiled<'a>,(String,Vec<AsmArgument<'a>>)>{
use AsmArgument::*;
use RegByte::*;
use crate::emulator::{Command::*,Arg::*};
use crate::emulator::{Command::*};
fn byte_copy_replace(dst: u16,src: u16,bd: bool,bs: bool)->Opcode{
match (bd,bs) {
(false,false) => Opcode::ex(dst, src, SubCommand::MLL),
Expand Down Expand Up @@ -287,7 +285,7 @@ fn precompile_command<'a>(mnem: &'a str,args: Vec<AsmArgument<'a>>)->Result<Prec
((dst, All), (src, All)) => Ok(Precompiled(Opcode::par(Movw, dst, src, 0), None, None)),
_ => Err(("Only full registers are allowed when indexing memory".to_string(), args))
},
[Name(_, Ok(dst)), Index(_, Ok(src))] => Err(("Allowed register are r0..r15".to_string(), args)),
[Name(_, Ok(_)), Index(_, Ok(_))] => Err(("Allowed register are r0..r15".to_string(), args)),
[Index(_, Ok(dst)), Name(_, Ok(src))] if dst.0 < 16 && src.0 < 16 => match (*dst, *src) {
((dst, All), (src, All)) => Ok(Precompiled(Opcode::par(Movw, 0, dst, src), None, None)),
_ => Err(("Only full registers are allowed when indexing memory".to_string(), args))
Expand Down Expand Up @@ -357,11 +355,11 @@ fn precompile_command<'a>(mnem: &'a str,args: Vec<AsmArgument<'a>>)->Result<Prec

fn format_error(err: (&str,usize,usize))->String{
let mut errors = format!(" at: {}:{}",err.1,err.2);
writeln!(errors);
writeln!(errors).unwrap();
let num = format!("{}:",err.1);
let count = num.chars().count() + err.0.chars().take(err.2).count();
writeln!(errors,"{}{}",num,err.0);
write!(errors,"{}^"," ".repeat(count));
writeln!(errors,"{}{}",num,err.0).unwrap();
write!(errors,"{}^"," ".repeat(count)).unwrap();
errors
}

Expand All @@ -380,11 +378,11 @@ pub fn compile_assembly(source: &str) ->Result<Vec<Opcode>,String>{
Ok(prec) => Some(prec),
Err((text,args)) => {
let err = args.first().map(|a|get_pos(source,match a { Unknown(s) | Number(s,_) | Name(s,_) | Label(s) | Index(s,_) => s }));
write!(errors,"Syntax Error: {}",text);
write!(errors,"Syntax Error: {}",text).unwrap();
if let Some(pos) = err {
writeln!(errors,"{}",format_error(pos));
writeln!(errors,"{}",format_error(pos)).unwrap();
}else{
writeln!(errors);
writeln!(errors).unwrap();
}
None
}
Expand Down Expand Up @@ -429,10 +427,10 @@ pub fn compile_assembly(source: &str) ->Result<Vec<Opcode>,String>{
if let (None,Some(label)) = (op.1,op.2) {
let address = labels.get(label).copied();
return if address.is_none() {
writeln!(errors, "Link Error: Unknown label \"{}\"{}", label, format_error(get_pos(source, label)));
writeln!(errors, "Link Error: Unknown label \"{}\"{}", label, format_error(get_pos(source, label))).unwrap();
vec![]
} else if address.unwrap() > MAX_ADDRESS {
writeln!(errors, "Link Error: Label out of max program bounds \"{}\"{}", label, format_error(get_pos(source, label)));
writeln!(errors, "Link Error: Label out of max program bounds \"{}\"{}", label, format_error(get_pos(source, label))).unwrap();
vec![]
} else {
vec![op.0, Opcode::from(address.unwrap() as u16)]
Expand Down
3 changes: 2 additions & 1 deletion src/emulator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ pub enum Arg{
impl Arg{
pub fn signext(self)->u16 {
let a = self.as_u16();
if a & 0x8 != 0 { (a | 0xfff0) } else { a }
if a & 0x8 != 0 { a | 0xfff0 } else { a }
}
pub fn name(self)->String { format!("{:?}",self).to_lowercase()}
pub fn as_u16(self)->u16 { self as _ }
Expand Down Expand Up @@ -141,6 +141,7 @@ impl CpuModel{
fn r_write(&mut self,value: u16){
self.reg[self.decoded_opcode.r().as_usize()] = value;
}
#[allow(unreachable_patterns)]
pub fn tick(&mut self){
use Command::*;
use SubCommand::*;
Expand Down
81 changes: 10 additions & 71 deletions src/gui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,49 +2,14 @@
use druid::widget::*;
use druid::*;
use crate::vm::VirtualMachine;
use std::fmt::Write;
use druid::lens::{Field, Map};
use druid::piet::*;
use std::sync::Arc;
use std::thread::spawn;
use druid::lens::Map;
use num_traits::Pow;
use crate::emulator::Opcode;


fn build_gui() -> impl Widget<GuiData> {
// The label text will be computed dynamically based on the current locale and count


// let w = ViewSwitcher::new(|d,v|{
// println!("sdasdasd");
// ()
// },|_,_,_|{
// println!("ASDASD");
// Box::new(Flex::row())
// });
let w = RamView::new().controller(RamControl);


// let t1 = spawn(||Device::new().and_then(|mut device|{
// let mut bmp = device.bitmap_target(100,100,1.0)?;
// let mut ctx = bmp.render_context();
// ctx.fill(Rect::new(0.0,0.0,100.0,100.0),&Color::PURPLE);
// ctx.fill(Rect::new(10.0,10.0,90.0,90.0),&Color::GREEN);
// ctx.finish();
// drop(ctx);
// bmp.to_image_buf(ImageFormat::RgbaPremul)
// }).unwrap());
// let t2 = spawn(||Device::new().and_then(|mut device|{
// let mut bmp = device.bitmap_target(100,100,1.0)?;
// let mut ctx = bmp.render_context();
// ctx.fill(Rect::new(0.0,0.0,100.0,100.0),&Color::BLUE);
// ctx.fill(Rect::new(10.0,10.0,90.0,90.0),&Color::OLIVE);
// ctx.finish();
// drop(ctx);
// bmp.to_image_buf(ImageFormat::RgbaPremul)
// }).unwrap());

let btn = Button::new("Tick").on_click(|ctx,data: &mut GuiData,_|{
let btn = Button::new("Tick").on_click(|_,data: &mut GuiData,_|{
data.vm.tick(false);
});

Expand All @@ -58,32 +23,13 @@ fn build_gui() -> impl Widget<GuiData> {
}).padding(5.0)));
let right = Flex::column().main_axis_alignment(MainAxisAlignment::Start).cross_axis_alignment(CrossAxisAlignment::Start)
.with_child(build_cpu_state_view().border(Color::BLUE,1.0))
.with_flex_child(btn.fix_width(150.0),1.0);//fix width wplywa na szerokosc calej kolumny
.with_flex_child(btn.fix_width(150.0),1.0);
Flex::row().with_flex_child(left,1.0).with_child(right)
//Split::columns(left,right).draggable(true).min_size(W_CELL*5.0,200.0).solid_bar(true)
//Flex::row().with_flex_child(left,1.0).with_child(right)


// let text =
// LocalizedString::new("hello-counter").with_arg("count", |data: &GuiData, _env| data.vm.ram().len().into());
// let label = Label::new(text).padding(5.0);
// let button = Button::new("increment")
// .on_click(|_ctx, data, _env|{
// let mut s = String::new();
// for (key,val) in _env.get_all() {
// writeln!(s,"Key: {:?} Val: {:?}",key,val);
// }
// print!("{}",s);
// })
// .padding(5.0);
// Flex::row().with_child(Flex::column().with_child(label).with_child(button))
// .with_child(build_cpu_state_view().align_left())

}

struct RamControl;
impl Controller<GuiData, RamView> for RamControl {
fn event(&mut self, child: &mut RamView, ctx: &mut EventCtx, event: &Event, data: &mut GuiData, env: &Env) {
fn event(&mut self, child: &mut RamView, _ctx: &mut EventCtx, event: &Event, data: &mut GuiData, _env: &Env) {
match event {
Event::Wheel(mouse) => {
if mouse.wheel_delta.y > 0.0 {
Expand Down Expand Up @@ -131,10 +77,10 @@ impl RamView{
}

fn label_for(index: usize,color: Color)->impl Widget<GuiData>{
let label = Label::dynamic(move |data: &GuiData,env|{
let label = Label::dynamic(move |data: &GuiData,_env|{
data.vm.ram().get(index).map(|v|format!("{:04X}",v)).unwrap_or_else(||"--".to_string())
});
Container::new(Align::centered(label).fix_size(W_CELL,H_CELL).background(Painter::new(move |ctx, data: &GuiData, env| {
Container::new(Align::centered(label).fix_size(W_CELL,H_CELL).background(Painter::new(move |ctx, data: &GuiData, _env| {
if data.vm.cpu().reg[15] as usize == index {
let rect = ctx.size().to_rect();
ctx.fill(rect,&Color::grey(0.7));
Expand All @@ -158,7 +104,7 @@ impl RamView{
let mut row = Flex::row();
row.add_child(Align::centered(Label::new(format!("{:04X}",ram_index)))
.fix_size(W_CELL,H_CELL).background(if y % 2 == 0 { COL_ADR_EVEN } else { COL_ADR_ODD }));
for x in 0..width {
for _ in 0..width {
row.add_child(Self::label_for(ram_index,Color::grey(0.1)));
ram_index += 1;
}
Expand Down Expand Up @@ -211,7 +157,6 @@ impl Widget<GuiData> for RamView{
let width = ((ctx.size().width / W_CELL).floor() as i32 - 1).max(1);
let height = ((ctx.size().height / H_CELL).floor() as i32 - 1).max(1);
let width = 2.0.pow((width as f64).log2().floor()) as i32;
let new_size = (width,height);
if old_data.ram_scroll != data.ram_scroll {
let w = Self::create_layout(width as _,height as _,data.ram_scroll);
self.view = WidgetPod::new(w).boxed();
Expand Down Expand Up @@ -260,16 +205,10 @@ pub fn launch_emulator_gui(vm: VirtualMachine){
AppLauncher::with_window(main_window).launch(data).unwrap();
}

fn align_label<T>(mut lab: Label<T>)->Label<T>{
//lab.set_text_alignment(TextAlignment::Start);
lab
}
fn bits_view()->impl Widget<u16> {
let lab = Label::new(|value: &u16, _env: &_| format!("{:04X}",value)).center().fix_width(W_CELL);
let rect_size = 11.0;
let bits = Painter::new(move|ctx,data:&u16,_|{
let size = ctx.size();
let width = size.width / 16.0;
for i in 0..=15 {
let bit = *data & (1<<(15-i)) != 0;
let r = Rect::new(i as f64 *rect_size,0.0,(i+1) as f64 *rect_size,rect_size);
Expand All @@ -287,12 +226,12 @@ fn build_cpu_state_view() ->impl Widget<GuiData>{
let mut labels = Flex::column();
labels.add_child(Label::new("iv"));
for i in 1..=14 {
labels.add_child(align_label(Label::new(format!("r{}", i))).align_left())
labels.add_child(Label::new(format!("r{}", i)).align_left())
}
labels.add_child(align_label(Label::new("r15/pc ")).align_left());
labels.add_child(Label::new("r15/pc ").align_left());
labels.set_cross_axis_alignment(CrossAxisAlignment::Start);
let mut regs = Flex::column().with_child(bits_view().lens(
Map::new(|g: &GuiData|0,|g: &mut GuiData,v|{})));
Map::new(|_: &GuiData|0,|_: &mut GuiData,_|{})));
for i in 1..=15 {
let lens = Map::new(move |g: &GuiData|g.vm.cpu().reg[i],move |g: &mut GuiData,v|{g.vm.cpu_mut().reg[i] = v;});
regs.add_child(bits_view().lens(lens));
Expand Down
10 changes: 3 additions & 7 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
#![allow(unused)]
#![allow(dead_code)]
#![deny(unsafe_code)]
use crate::emulator::Opcode;
use crate::vm::VirtualMachine;
use crate::assembler::{compile_assembly, get_pos};
use crate::assembler::compile_assembly;
use clap::*;
use std::io::{Read, BufWriter, Write};
use std::fs::{OpenOptions, File, read_to_string};
use std::fs::{OpenOptions, read_to_string};
use std::path::Path;
use std::array::IntoIter;
use crate::gui::launch_emulator_gui;
Expand All @@ -22,10 +22,6 @@ static OUTPUT: &str = "output";
static EMU: &str = "emulate";

fn main() {
// let mut vm = VirtualMachine::new(128);
// vm.load_start_data(&[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]);
// vm.tick_times(10,false,false);
// launch_emulator_gui(vm);

let args = App::new("Assembly compiler/emulator").version("0.1.0").author("Kazik24")
.arg(Arg::with_name(INPUT).short("i").value_name("FILE")
Expand Down

0 comments on commit e9cf6c2

Please sign in to comment.