Clean up code
This commit is contained in:
parent
7ed3f92738
commit
448850bce1
34
src/cpu.rs
34
src/cpu.rs
@ -352,7 +352,7 @@ impl I8080 {
|
|||||||
self.regs[dst] = self.regs[src];
|
self.regs[dst] = self.regs[src];
|
||||||
}
|
}
|
||||||
Opcode::Sphl => {
|
Opcode::Sphl => {
|
||||||
self.sp = ((self.regs.h as u16) << 8) | (self.regs.l as u16);
|
self.sp = (u16::from(self.regs.h) << 8) | u16::from(self.regs.l);
|
||||||
}
|
}
|
||||||
Opcode::MviM => (),
|
Opcode::MviM => (),
|
||||||
Opcode::Mvi(_) => (),
|
Opcode::Mvi(_) => (),
|
||||||
@ -410,8 +410,8 @@ impl I8080 {
|
|||||||
Opcode::Inx(dst) => self.set_pair(dst, self.get_pair(dst) + 1),
|
Opcode::Inx(dst) => self.set_pair(dst, self.get_pair(dst) + 1),
|
||||||
Opcode::Dcx(dst) => self.set_pair(dst, self.get_pair(dst) + 2),
|
Opcode::Dcx(dst) => self.set_pair(dst, self.get_pair(dst) + 2),
|
||||||
Opcode::Dad(src) => {
|
Opcode::Dad(src) => {
|
||||||
let a = self.get_pair(RegisterPair::HL) as u32;
|
let a = u32::from(self.get_pair(RegisterPair::HL));
|
||||||
let b = self.get_pair(src) as u32;
|
let b = u32::from(self.get_pair(src));
|
||||||
let res = a + b;
|
let res = a + b;
|
||||||
self.carry = res > 0xffff;
|
self.carry = res > 0xffff;
|
||||||
self.set_pair(RegisterPair::HL, res as u16);
|
self.set_pair(RegisterPair::HL, res as u16);
|
||||||
@ -462,14 +462,14 @@ impl I8080 {
|
|||||||
},
|
},
|
||||||
Opcode::Ral => {
|
Opcode::Ral => {
|
||||||
let high_bit = (self.regs.a & 0x80) > 0;
|
let high_bit = (self.regs.a & 0x80) > 0;
|
||||||
self.regs.a = self.regs.a << 1;
|
self.regs.a <<= 1;
|
||||||
self.regs.a |= self.carry as u8;
|
self.regs.a |= u8::from(self.carry);
|
||||||
self.carry = high_bit;
|
self.carry = high_bit;
|
||||||
},
|
},
|
||||||
Opcode::Rar => {
|
Opcode::Rar => {
|
||||||
let low_bit = (self.regs.a & 0x1) > 0;
|
let low_bit = (self.regs.a & 0x1) > 0;
|
||||||
self.regs.a = self.regs.a >> 1;
|
self.regs.a >>= 1;
|
||||||
self.regs.a |= (self.carry as u8) << 7;
|
self.regs.a |= u8::from(self.carry) << 7;
|
||||||
self.carry = low_bit;
|
self.carry = low_bit;
|
||||||
},
|
},
|
||||||
Opcode::Cma => {
|
Opcode::Cma => {
|
||||||
@ -812,7 +812,7 @@ impl I8080 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn add_4bit(a: u4, b: u4, cy: bool) -> (bool, u4) {
|
fn add_4bit(a: u4, b: u4, cy: bool) -> (bool, u4) {
|
||||||
let res: u5 = u5::from(a) + u5::from(b) + u5::new(cy as u8);
|
let res: u5 = u5::from(a) + u5::from(b) + u5::new(u8::from(cy));
|
||||||
(
|
(
|
||||||
(res >> 4) > u5::new(0),
|
(res >> 4) > u5::new(0),
|
||||||
(res & u5::new(0xF)).try_into().unwrap(),
|
(res & u5::new(0xF)).try_into().unwrap(),
|
||||||
@ -872,15 +872,15 @@ impl I8080 {
|
|||||||
|
|
||||||
fn get_pair(&self, pair: RegisterPair) -> u16 {
|
fn get_pair(&self, pair: RegisterPair) -> u16 {
|
||||||
match pair {
|
match pair {
|
||||||
RegisterPair::BC => ((self.regs.b as u16) << 8) | (self.regs.c as u16),
|
RegisterPair::BC => (u16::from(self.regs.b) << 8) | u16::from(self.regs.c),
|
||||||
RegisterPair::DE => ((self.regs.d as u16) << 8) | (self.regs.e as u16),
|
RegisterPair::DE => (u16::from(self.regs.d) << 8) | u16::from(self.regs.e),
|
||||||
RegisterPair::HL => ((self.regs.h as u16) << 8) | (self.regs.l as u16),
|
RegisterPair::HL => (u16::from(self.regs.h) << 8) | u16::from(self.regs.l),
|
||||||
RegisterPair::SP => self.sp,
|
RegisterPair::SP => self.sp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_wz(&self) -> u16 {
|
fn get_wz(&self) -> u16 {
|
||||||
((self.w as u16) << 8) | (self.z as u16)
|
(u16::from(self.w) << 8) | u16::from(self.z)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_pair(&mut self, pair: RegisterPair, val: u16) {
|
fn set_pair(&mut self, pair: RegisterPair, val: u16) {
|
||||||
@ -907,11 +907,11 @@ impl I8080 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn get_flags(&self) -> u8 {
|
fn get_flags(&self) -> u8 {
|
||||||
0b10 | self.carry as u8
|
0b10 | u8::from(self.carry)
|
||||||
| (self.parity as u8) << 2
|
| u8::from(self.parity) << 2
|
||||||
| (self.aux_carry as u8) << 4
|
| u8::from(self.aux_carry) << 4
|
||||||
| (self.zero as u8) << 6
|
| u8::from(self.zero) << 6
|
||||||
| (self.sign as u8) << 7
|
| u8::from(self.sign) << 7
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_flags(&mut self, flags: u8) {
|
fn set_flags(&mut self, flags: u8) {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use super::opcode::{
|
use super::opcode::{
|
||||||
Condition,
|
Condition,
|
||||||
Opcode::{self, *},
|
Opcode::{self, Aci, Adc, AdcM, Add, AddM, Adi, Ana, AnaM, Ani, Call, Ccc, Cma, Cmc, Cmp, CmpM, Cpi, Daa, Dad, Dcr, DcrM, Dcx, Di, Ei, Hlt, In, Inr, InrM, Inx, Jcc, Jmp, Lda, Ldax, Lhld, Lxi, Mov, MovMR, MovRM, Mvi, MviM, Nop, Ora, OraM, Ori, Out, Pchl, Pop, PopPsw, Push, PushPsw, Ral, Rar, Rcc, Ret, Rlc, Rrc, Rst, Sbb, SbbM, Sbi, Shld, Sphl, Sta, Stax, Stc, Sub, SubM, Sui, Xchg, Xra, XraM, Xri, Xthl},
|
||||||
Register, RegisterPair,
|
Register, RegisterPair,
|
||||||
};
|
};
|
||||||
pub(super) static OPCODE_TABLE: [Opcode; 256] = [
|
pub(super) static OPCODE_TABLE: [Opcode; 256] = [
|
||||||
|
27
src/main.rs
27
src/main.rs
@ -11,7 +11,7 @@ use std::{
|
|||||||
|
|
||||||
use cpu::{MemCycle, Status, I8080};
|
use cpu::{MemCycle, Status, I8080};
|
||||||
use device_query::{DeviceState, Keycode};
|
use device_query::{DeviceState, Keycode};
|
||||||
use eframe::egui::{self, menu, Button, Pos2, Rect, TextureHandle, TextureOptions, Ui};
|
use eframe::{egui::{self, menu, Button, Pos2, Rect, TextureHandle, TextureOptions, Ui}, NativeOptions};
|
||||||
use egui_modal::Modal;
|
use egui_modal::Modal;
|
||||||
use log::{debug, trace, warn};
|
use log::{debug, trace, warn};
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
@ -57,10 +57,10 @@ fn main() -> Result<(), eframe::Error> {
|
|||||||
};
|
};
|
||||||
debug!(target: "altair_emu::fan_thread", "Fan startup length: {}s. Fan shutdown length: {}s", fan_startup.length(), fan_shutdown.length());
|
debug!(target: "altair_emu::fan_thread", "Fan startup length: {}s. Fan shutdown length: {}s", fan_startup.length(), fan_shutdown.length());
|
||||||
if fan_startup.length() != fan_shutdown.length() {
|
if fan_startup.length() != fan_shutdown.length() {
|
||||||
warn!(target: "altair_emu::fan_thread", "Fan startup sound and shutdown sounds do not have the same length! ({}s and {}s, respectively.) This may cause audio glitches.", fan_startup.length(), fan_shutdown.length())
|
warn!(target: "altair_emu::fan_thread", "Fan startup sound and shutdown sounds do not have the same length! ({}s and {}s, respectively.) This may cause audio glitches.", fan_startup.length(), fan_shutdown.length());
|
||||||
}
|
}
|
||||||
let mut fan_shutdown_start: Option<(Instant, Duration)> = None;
|
let mut fan_shutdown_start: Option<(Instant, Duration)> = None;
|
||||||
for msg in rx.iter() {
|
for msg in &rx {
|
||||||
if msg {
|
if msg {
|
||||||
trace!(target: "altair_emu::fan_thread", "Start fan");
|
trace!(target: "altair_emu::fan_thread", "Start fan");
|
||||||
let fan_startup_start = if let Some(fan_shutdown_start) = fan_shutdown_start.take()
|
let fan_startup_start = if let Some(fan_shutdown_start) = fan_shutdown_start.take()
|
||||||
@ -87,6 +87,7 @@ fn main() -> Result<(), eframe::Error> {
|
|||||||
fan_shutdown.length() - fan_shutdown_elapsed,
|
fan_shutdown.length() - fan_shutdown_elapsed,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
drop(sl);
|
||||||
trace!(target: "altair_emu::fan_thread", "Fan startup playing at offset {}s", fan_shutdown.length() - fan_shutdown_elapsed);
|
trace!(target: "altair_emu::fan_thread", "Fan startup playing at offset {}s", fan_shutdown.length() - fan_shutdown_elapsed);
|
||||||
fan_startup_start
|
fan_startup_start
|
||||||
}
|
}
|
||||||
@ -125,6 +126,7 @@ fn main() -> Result<(), eframe::Error> {
|
|||||||
fan_startup.length() - fan_startup_elapsed,
|
fan_startup.length() - fan_startup_elapsed,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
drop(sl);
|
||||||
trace!(target: "altair_emu::fan_thread", "Fan shutdown playing at offset {}s", fan_startup.length() - fan_startup_elapsed);
|
trace!(target: "altair_emu::fan_thread", "Fan shutdown playing at offset {}s", fan_startup.length() - fan_startup_elapsed);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
@ -132,6 +134,7 @@ fn main() -> Result<(), eframe::Error> {
|
|||||||
let mut sl = sl.lock();
|
let mut sl = sl.lock();
|
||||||
let handle = sl.play(&fan_loop);
|
let handle = sl.play(&fan_loop);
|
||||||
sl.set_looping(handle, true);
|
sl.set_looping(handle, true);
|
||||||
|
drop(sl);
|
||||||
trace!(target: "altair_emu::fan_thread", "Fan loop started, start done");
|
trace!(target: "altair_emu::fan_thread", "Fan loop started, start done");
|
||||||
} else {
|
} else {
|
||||||
trace!(target: "altair_emu::fan_thread", "Stop fan");
|
trace!(target: "altair_emu::fan_thread", "Stop fan");
|
||||||
@ -152,7 +155,7 @@ fn main() -> Result<(), eframe::Error> {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
head_step
|
head_step
|
||||||
};
|
};
|
||||||
for msg in rx.iter() {
|
for msg in &rx {
|
||||||
match msg {
|
match msg {
|
||||||
AudioMessage::PlaySwitchClick => {
|
AudioMessage::PlaySwitchClick => {
|
||||||
sl.lock().play(&head_step);
|
sl.lock().play(&head_step);
|
||||||
@ -162,7 +165,7 @@ fn main() -> Result<(), eframe::Error> {
|
|||||||
});
|
});
|
||||||
eframe::run_native(
|
eframe::run_native(
|
||||||
"Altair 8800 Emulator",
|
"Altair 8800 Emulator",
|
||||||
Default::default(),
|
NativeOptions::default(),
|
||||||
Box::new(|cc| Box::new(AltairEmulator::new(cc, main_audio_tx, fan_audio_tx))),
|
Box::new(|cc| Box::new(AltairEmulator::new(cc, main_audio_tx, fan_audio_tx))),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -330,8 +333,8 @@ impl eframe::App for AltairEmulator {
|
|||||||
.add_enabled(self.option_window.is_none(), Button::new("Options"))
|
.add_enabled(self.option_window.is_none(), Button::new("Options"))
|
||||||
.clicked()
|
.clicked()
|
||||||
{
|
{
|
||||||
self.option_window = Some(OptionWindow::new(&ctx, self.options.clone()));
|
self.option_window = Some(OptionWindow::new(ctx, self.options));
|
||||||
ui.close_menu()
|
ui.close_menu();
|
||||||
}
|
}
|
||||||
if ui.button("Load binary file").clicked() {
|
if ui.button("Load binary file").clicked() {
|
||||||
let ihex_exts = ["hex", "mcs", "int", "ihex", "ihe", "ihx"];
|
let ihex_exts = ["hex", "mcs", "int", "ihex", "ihe", "ihx"];
|
||||||
@ -371,8 +374,8 @@ impl eframe::App for AltairEmulator {
|
|||||||
LedSource::Protect => 0x0,
|
LedSource::Protect => 0x0,
|
||||||
LedSource::Iff => 0x0,
|
LedSource::Iff => 0x0,
|
||||||
LedSource::Run => 0x0,
|
LedSource::Run => 0x0,
|
||||||
LedSource::CpuStatus => self.fp_status.bits() as u16,
|
LedSource::CpuStatus => u16::from(self.fp_status.bits()),
|
||||||
LedSource::Data => self.fp_data as u16,
|
LedSource::Data => u16::from(self.fp_data),
|
||||||
LedSource::Address => self.fp_address,
|
LedSource::Address => self.fp_address,
|
||||||
};
|
};
|
||||||
let led_on = (led_data & led.mask) > 0;
|
let led_on = (led_data & led.mask) > 0;
|
||||||
@ -717,7 +720,7 @@ impl eframe::App for AltairEmulator {
|
|||||||
});
|
});
|
||||||
let old_fan_enabled = self.options.fan_enabled;
|
let old_fan_enabled = self.options.fan_enabled;
|
||||||
if let Some(option_window) = self.option_window.as_mut() {
|
if let Some(option_window) = self.option_window.as_mut() {
|
||||||
if option_window.draw(&ctx, &mut self.options) {
|
if option_window.draw(ctx, &mut self.options) {
|
||||||
self.option_window = None;
|
self.option_window = None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -767,10 +770,10 @@ impl OptionWindow {
|
|||||||
}
|
}
|
||||||
modal.buttons(ui, |ui| {
|
modal.buttons(ui, |ui| {
|
||||||
if ui.button("Apply").clicked() {
|
if ui.button("Apply").clicked() {
|
||||||
*options = self.options.clone();
|
*options = self.options;
|
||||||
}
|
}
|
||||||
if modal.button(ui, "OK").clicked() {
|
if modal.button(ui, "OK").clicked() {
|
||||||
*options = self.options.clone();
|
*options = self.options;
|
||||||
}
|
}
|
||||||
modal.caution_button(ui, "Cancel");
|
modal.caution_button(ui, "Cancel");
|
||||||
});
|
});
|
||||||
|
@ -15,8 +15,7 @@ pub struct RamCard {
|
|||||||
impl Card for RamCard {
|
impl Card for RamCard {
|
||||||
fn new(settings: ron::Value) -> CardEnum {
|
fn new(settings: ron::Value) -> CardEnum {
|
||||||
let settings: RamCardSettings = settings.into_rust().unwrap();
|
let settings: RamCardSettings = settings.into_rust().unwrap();
|
||||||
let mut ram = Vec::with_capacity(settings.size as usize);
|
let ram = vec![0; settings.size as usize];
|
||||||
ram.resize(settings.size as usize, 0);
|
|
||||||
CardEnum::RamCard(Self {
|
CardEnum::RamCard(Self {
|
||||||
ram,
|
ram,
|
||||||
start_addr: settings.start_addr,
|
start_addr: settings.start_addr,
|
||||||
|
Loading…
Reference in New Issue
Block a user