93 lines
2.9 KiB
Rust
93 lines
2.9 KiB
Rust
use core::periph::backplane::Backplane;
|
|
use core::computers::rom_only::backplane::RomOnlyComputer;
|
|
use egui_macroquad::egui::TextBuffer;
|
|
use macroquad::prelude::*;
|
|
|
|
struct UIState {
|
|
address: u16,
|
|
data: u8,
|
|
new_address_input: String,
|
|
new_data_input: String,
|
|
}
|
|
|
|
#[macroquad::main("Tick Interface")]
|
|
async fn main() {
|
|
let mut ui = UIState {
|
|
address: 0x1234,
|
|
data: 0xAB,
|
|
new_address_input: String::new(),
|
|
new_data_input: String::new(),
|
|
};
|
|
|
|
let rom_program = vec![0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07];
|
|
|
|
let mut rom_only_pc = RomOnlyComputer::program(rom_program);
|
|
|
|
loop {
|
|
clear_background(BLACK);
|
|
|
|
// Labels
|
|
draw_text("Address:", 20.0, 40.0, 30.0, WHITE);
|
|
draw_text(&format!("0x{:04X}", ui.address), 150.0, 40.0, 30.0, YELLOW);
|
|
|
|
draw_text("Data:", 20.0, 80.0, 30.0, WHITE);
|
|
draw_text(&format!("0x{:02X}", ui.data), 150.0, 80.0, 30.0, YELLOW);
|
|
|
|
// Input: New Address
|
|
draw_text("New Address:", 20.0, 140.0, 25.0, WHITE);
|
|
ui.new_address_input = draw_textbox(&ui.new_address_input, 200.0, 120.0, 150.0);
|
|
|
|
// Input: New Data
|
|
draw_text("New Data:", 20.0, 190.0, 25.0, WHITE);
|
|
ui.new_data_input = draw_textbox(&ui.new_data_input, 200.0, 170.0, 150.0);
|
|
|
|
// Tick Button
|
|
if is_mouse_button_pressed(MouseButton::Left) {
|
|
let (mx, my) = mouse_position();
|
|
if mx >= 20.0 && mx <= 120.0 && my >= 220.0 && my <= 260.0 {
|
|
if let Ok(addr) = u16::from_str_radix(&ui.new_address_input.trim_start_matches("0x"), 16) {
|
|
rom_only_pc.set_address_bus(addr);
|
|
}
|
|
if let Ok(dat) = u8::from_str_radix(&ui.new_data_input.trim_start_matches("0x"), 16) {
|
|
rom_only_pc.set_data_bus(dat);
|
|
}
|
|
println!("Tick: addr=0x{:04X} data=0x{:02X}", ui.address, ui.data);
|
|
rom_only_pc.tick();
|
|
}
|
|
}
|
|
|
|
// Draw button
|
|
draw_rectangle(20.0, 220.0, 100.0, 40.0, DARKGRAY);
|
|
draw_text("Tick", 40.0, 250.0, 30.0, WHITE);
|
|
|
|
ui.address = rom_only_pc.address_bus();
|
|
ui.data = rom_only_pc.data_bus();
|
|
|
|
next_frame().await;
|
|
}
|
|
}
|
|
|
|
fn draw_textbox(input: &str, x: f32, y: f32, width: f32) -> String {
|
|
let mut new_input = input.to_string();
|
|
|
|
draw_rectangle_lines(x - 5.0, y - 5.0, width + 10.0, 40.0, 2.0, WHITE);
|
|
draw_text(input, x, y + 25.0, 30.0, WHITE);
|
|
|
|
if is_mouse_button_pressed(MouseButton::Left) {
|
|
let (mx, my) = mouse_position();
|
|
if mx >= x && mx <= x + width && my >= y && my <= y + 40.0 {
|
|
new_input = String::new(); // reset input on click
|
|
}
|
|
}
|
|
|
|
for c in get_char_pressed() {
|
|
if c == '\u{8}' {
|
|
new_input.pop(); // backspace
|
|
} else if c.is_ascii_hexdigit() {
|
|
new_input.push(c.to_ascii_uppercase());
|
|
}
|
|
}
|
|
|
|
new_input
|
|
}
|