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 }