add html status table generation

This commit is contained in:
Henrik Böving
2020-11-29 14:19:41 +01:00
parent d6ab41683c
commit 057d70b57d
5 changed files with 201 additions and 8 deletions

View File

@@ -3,10 +3,29 @@ A small assembler I wrote for use with the microprocessor from the Book "Grundla
W. Hoffmann.
## 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?
You can find some syntax examples in `examples/`
You can find some syntax examples for the assembler in `examples/`
## Limitations
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
View 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
}

View File

@@ -10,9 +10,12 @@ mod asm;
mod generate;
mod parse;
mod simulate;
mod html;
use generate::generate_binary;
use parse::{parse_asm, AsmParser};
use html::html_state_table;
fn main() {
let sub_cmd = env::args().nth(1);
@@ -41,7 +44,8 @@ fn main() {
else if sub_cmd == "simulate" {
if let Some(steps) = steps {
let states = simulate::simulate(instructions, steps.parse::<usize>().unwrap());
println!("{:#?}", states);
//println!("{:#?}", states);
println!("{}", html_state_table(states));
}
}
}

View File

@@ -3,6 +3,7 @@ use crate::asm::*;
use crate::generate::generate_binary;
use std::collections::HashMap;
use std::fmt;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct StateRegister {
@@ -31,6 +32,29 @@ pub struct State {
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> {
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 step: usize = 0;
let mut clk: bool = false;
let mut pc: u8 = 0;
let mut addr_bus: u8 = 0;
let mut data_bus: u8 = 0;
let mut clk: bool;
let mut pc: u8;
let mut addr_bus: u8;
let mut data_bus: u8;
let mut ir : u8 = 0;
let mut dr : u8 = 0;
let mut akku : u8 = 0;
let mut akku : u8;
let mut sr: StateRegister = StateRegister {
carry: false,
zero: false,

115
state.html Normal file
View 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>