add html status table generation
This commit is contained in:
23
README.md
23
README.md
@@ -3,10 +3,29 @@ A small assembler I wrote for use with the microprocessor from the Book "Grundla
|
|||||||
W. Hoffmann.
|
W. Hoffmann.
|
||||||
|
|
||||||
## How does it work?
|
## How does it work?
|
||||||
You run the binary with a path to an assembler file like this `cargo run path/to/file.asm`.
|
You can generate the data and program memory for a program like this:
|
||||||
|
```
|
||||||
|
$ cargo run -- generate examples/add_endless.asm
|
||||||
|
Data Memory:
|
||||||
|
0 1 1 0
|
||||||
|
0 0 0 0
|
||||||
|
0 0 0 0
|
||||||
|
0 0 0 0
|
||||||
|
Program Memory:
|
||||||
|
1 4 8 0
|
||||||
|
0 0 0 0
|
||||||
|
0 0 0 0
|
||||||
|
0 0 0 0
|
||||||
|
And that's your program!
|
||||||
|
|
||||||
|
```
|
||||||
|
Alternatively you can simulate an asm program for n clock cycles like this:
|
||||||
|
```
|
||||||
|
$ cargo run -- simulate examples/add_endless.asm 4
|
||||||
|
```
|
||||||
|
|
||||||
## Syntax?
|
## Syntax?
|
||||||
You can find some syntax examples in `examples/`
|
You can find some syntax examples for the assembler in `examples/`
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
Note that since this microprocessor is only a 4 bit microporcessor we cannot possibly have programs with more than 16
|
Note that since this microprocessor is only a 4 bit microporcessor we cannot possibly have programs with more than 16
|
||||||
|
|||||||
31
src/html.rs
Normal file
31
src/html.rs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
use crate::simulate::State;
|
||||||
|
use std::fmt::Write;
|
||||||
|
|
||||||
|
static TABLE_HEADER: &str = "
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">Schritt</th>
|
||||||
|
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">clk</th>
|
||||||
|
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">PC<br></th>
|
||||||
|
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">Addressbus</th>
|
||||||
|
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">Datenbus</th>
|
||||||
|
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">IR</th>
|
||||||
|
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">DR</th>
|
||||||
|
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">A</th>
|
||||||
|
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">SR</th>
|
||||||
|
<th style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">Bei Befehlen, die aus dem Speicher laden<br>bzw. in Speicher schreiben (LDA n, ADD n, STA n)</th>
|
||||||
|
</tr>
|
||||||
|
</thead>\n";
|
||||||
|
|
||||||
|
pub fn html_state_table(states: Vec<State>) -> String {
|
||||||
|
let mut result = String::from(TABLE_HEADER);
|
||||||
|
result.push_str("<tbody>\n");
|
||||||
|
for state in states.iter() {
|
||||||
|
write!(result, "{}", state).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
result.push_str("</tbody>\n</table>");
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
@@ -10,9 +10,12 @@ mod asm;
|
|||||||
mod generate;
|
mod generate;
|
||||||
mod parse;
|
mod parse;
|
||||||
mod simulate;
|
mod simulate;
|
||||||
|
mod html;
|
||||||
|
|
||||||
use generate::generate_binary;
|
use generate::generate_binary;
|
||||||
use parse::{parse_asm, AsmParser};
|
use parse::{parse_asm, AsmParser};
|
||||||
|
use html::html_state_table;
|
||||||
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let sub_cmd = env::args().nth(1);
|
let sub_cmd = env::args().nth(1);
|
||||||
@@ -41,7 +44,8 @@ fn main() {
|
|||||||
else if sub_cmd == "simulate" {
|
else if sub_cmd == "simulate" {
|
||||||
if let Some(steps) = steps {
|
if let Some(steps) = steps {
|
||||||
let states = simulate::simulate(instructions, steps.parse::<usize>().unwrap());
|
let states = simulate::simulate(instructions, steps.parse::<usize>().unwrap());
|
||||||
println!("{:#?}", states);
|
//println!("{:#?}", states);
|
||||||
|
println!("{}", html_state_table(states));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ use crate::asm::*;
|
|||||||
use crate::generate::generate_binary;
|
use crate::generate::generate_binary;
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||||
pub struct StateRegister {
|
pub struct StateRegister {
|
||||||
@@ -31,6 +32,29 @@ pub struct State {
|
|||||||
opcode_info: Option<OpcodeInfo>
|
opcode_info: Option<OpcodeInfo>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl fmt::Display for State {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
writeln!(f, "<tr>")?;
|
||||||
|
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.step)?;
|
||||||
|
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.clk as u8)?;
|
||||||
|
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.pc)?;
|
||||||
|
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.addr_bus)?;
|
||||||
|
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.data_bus)?;
|
||||||
|
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.ir)?;
|
||||||
|
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.dr)?;
|
||||||
|
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">{}</td>", self.akku)?;
|
||||||
|
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">C: {}, Z: {}, N: {}</td>", self.sr.carry as u8, self.sr.zero as u8, self.sr.negative as u8)?;
|
||||||
|
if let Some(opcode_info) = self.opcode_info {
|
||||||
|
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\">addr: {}, val: {}</td>", opcode_info.addr, opcode_info.content)?;
|
||||||
|
} else {
|
||||||
|
writeln!(f, "<td style=\"border: 1px solid #000000; padding: 0mm 1.91mm;\"></td>")?;
|
||||||
|
}
|
||||||
|
writeln!(f, "</tr>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
pub fn simulate<'a>(instructions: Vec<Instruction<'a>>, max_steps: usize) -> Vec<State> {
|
pub fn simulate<'a>(instructions: Vec<Instruction<'a>>, max_steps: usize) -> Vec<State> {
|
||||||
let mut data_memory = generate_binary(instructions.clone()).data_memory;
|
let mut data_memory = generate_binary(instructions.clone()).data_memory;
|
||||||
|
|
||||||
@@ -38,13 +62,13 @@ pub fn simulate<'a>(instructions: Vec<Instruction<'a>>, max_steps: usize) -> Vec
|
|||||||
|
|
||||||
let mut states: Vec<State> = Vec::new();
|
let mut states: Vec<State> = Vec::new();
|
||||||
let mut step: usize = 0;
|
let mut step: usize = 0;
|
||||||
let mut clk: bool = false;
|
let mut clk: bool;
|
||||||
let mut pc: u8 = 0;
|
let mut pc: u8;
|
||||||
let mut addr_bus: u8 = 0;
|
let mut addr_bus: u8;
|
||||||
let mut data_bus: u8 = 0;
|
let mut data_bus: u8;
|
||||||
let mut ir : u8 = 0;
|
let mut ir : u8 = 0;
|
||||||
let mut dr : u8 = 0;
|
let mut dr : u8 = 0;
|
||||||
let mut akku : u8 = 0;
|
let mut akku : u8;
|
||||||
let mut sr: StateRegister = StateRegister {
|
let mut sr: StateRegister = StateRegister {
|
||||||
carry: false,
|
carry: false,
|
||||||
zero: false,
|
zero: false,
|
||||||
|
|||||||
115
state.html
Normal file
115
state.html
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th style="border: 1px solid #000000; padding: 0mm 1.91mm;">Schritt</th>
|
||||||
|
<th style="border: 1px solid #000000; padding: 0mm 1.91mm;">clk</th>
|
||||||
|
<th style="border: 1px solid #000000; padding: 0mm 1.91mm;">PC<br></th>
|
||||||
|
<th style="border: 1px solid #000000; padding: 0mm 1.91mm;">Addressbus</th>
|
||||||
|
<th style="border: 1px solid #000000; padding: 0mm 1.91mm;">Datenbus</th>
|
||||||
|
<th style="border: 1px solid #000000; padding: 0mm 1.91mm;">IR</th>
|
||||||
|
<th style="border: 1px solid #000000; padding: 0mm 1.91mm;">DR</th>
|
||||||
|
<th style="border: 1px solid #000000; padding: 0mm 1.91mm;">A</th>
|
||||||
|
<th style="border: 1px solid #000000; padding: 0mm 1.91mm;">SR</th>
|
||||||
|
<th style="border: 1px solid #000000; padding: 0mm 1.91mm;">Bei Befehlen, die aus dem Speicher laden<br>bzw. in Speicher schreiben (LDA n, ADD n, STA n)</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">C: 0, Z: 0, N: 0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">C: 0, Z: 0, N: 0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">C: 0, Z: 1, N: 0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">4</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">C: 0, Z: 1, N: 0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">2</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">2</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">2</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">4</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">C: 0, Z: 1, N: 0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">2</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">2</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">8</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">C: 0, Z: 1, N: 0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">3</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">8</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">C: 0, Z: 0, N: 0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">3</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">4</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">1</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;">C: 0, Z: 0, N: 0</td>
|
||||||
|
<td style="border: 1px solid #000000; padding: 0mm 1.91mm;"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
Reference in New Issue
Block a user