Use TryFrom() instead of custom solution

This commit is contained in:
Kevin Hamacher 2020-02-20 19:50:07 +01:00
parent 0f20b2801b
commit 26f28cdb48

View File

@ -1,5 +1,6 @@
use super::interconnect;
use crate::interconnect;
use std::convert::TryFrom;
use std::thread::sleep;
use std::time::{Duration, Instant};
@ -44,23 +45,29 @@ pub struct CPU {
trigger_once: bool,
}
fn to_u16(args: Args) -> u16 {
match args {
Args::Double(a, b) => (a as u16) | ((b as u16) << 8),
_ => panic!("to_u16 only works with Args::Double"),
}
}
enum Args {
Single(u8),
Double(u8, u8),
}
impl Args {
fn single_val(&self) -> u8 {
match *self {
Args::Single(x) => x,
_ => panic!("single_val only works with Args::Single"),
impl TryFrom<Args> for u8 {
type Error = ();
fn try_from(val: Args) -> Result<u8, Self::Error> {
match val {
Args::Single(x) => Ok(x),
_ => Err(()),
}
}
}
impl TryFrom<Args> for u16 {
type Error = ();
fn try_from(val: Args) -> Result<u16, Self::Error> {
match val {
Args::Double(a, b) => Ok((a as u16) | ((b as u16) << 8)),
_ => Err(()),
}
}
}
@ -609,7 +616,7 @@ impl CPU {
#[inline]
fn call_condition(&mut self, cond_str: &'static str, cond: bool) -> u8 {
let dst = to_u16(self.load_args(2));
let dst = u16::try_from(self.load_args(2)).unwrap();
if self.debug {
println!("CALL {} {:04X}", cond_str, dst);
}
@ -646,7 +653,7 @@ impl CPU {
#[inline]
fn jmp_r_condition(&mut self, cond_str: &'static str, cond: bool) -> u8 {
let t = self.load_args(1).single_val();
let t = u8::try_from(self.load_args(1)).unwrap();
if self.debug {
println!("JR {} {:02X}", cond_str, t);
}
@ -665,7 +672,7 @@ impl CPU {
#[inline]
fn jmp_p_condition(&mut self, cond_str: &'static str, cond: bool) -> u8 {
let t = to_u16(self.load_args(2));
let t = u16::try_from(self.load_args(2)).unwrap();
if self.debug {
println!("JP {} {:04X}", cond_str, t);
}
@ -758,7 +765,7 @@ impl CPU {
#[inline]
fn ld_r_v(&mut self, r: usize) -> u8 {
let val: u8 = self.load_args(1).single_val();
let val = u8::try_from(self.load_args(1)).unwrap();
if self.debug {
println!("LD {}, {:02X}", REG_NAMES[r], val);
}
@ -772,7 +779,7 @@ impl CPU {
#[inline]
fn ld_rr_vv(&mut self, r1: usize, r2: usize) -> u8 {
let val: u16 = to_u16(self.load_args(2));
let val = u16::try_from(self.load_args(2)).unwrap();
if self.debug {
println!("LD {}{}, {:04X}", REG_NAMES[r1], REG_NAMES[r2], val);
}
@ -1043,7 +1050,7 @@ impl CPU {
4
}
0x08 => {
let a: u16 = to_u16(self.load_args(2));
let a = u16::try_from(self.load_args(2)).unwrap();
if self.debug {
println!("LD ({:04X}), sp", a);
}
@ -1084,7 +1091,7 @@ impl CPU {
0x10 => {
println!(
"STOP 0 {:02X} not implemented.",
self.load_args(1).single_val()
u8::try_from(self.load_args(1)).unwrap()
);
4
}
@ -1112,7 +1119,7 @@ impl CPU {
4
}
0x18 => {
let dst = self.load_args(1).single_val();
let dst = u8::try_from(self.load_args(1)).unwrap();
self.jmp_r(dst);
if self.debug {
println!("JMPR {:02X}", dst);
@ -1241,7 +1248,7 @@ impl CPU {
}
0x31 => {
let args = self.load_args(2);
self.sp = to_u16(args);
self.sp = u16::try_from(args).unwrap();
if self.debug {
println!("LD SP, {:04x}", self.sp);
}
@ -1458,7 +1465,7 @@ impl CPU {
self.jmp_p_condition("NZ", c)
}
0xC3 => {
let dst = to_u16(self.load_args(2));
let dst = u16::try_from(self.load_args(2)).unwrap();
if self.debug {
println!("JMP {:04X}", dst);
}
@ -1471,7 +1478,7 @@ impl CPU {
}
0xC5 => self.push_rr(REG_N_B, REG_N_C),
0xC6 => {
let val = self.load_args(1).single_val();
let val = u8::try_from(self.load_args(1)).unwrap();
if self.debug {
println!("ADD A, {:02X}", val);
}
@ -1506,7 +1513,7 @@ impl CPU {
}
0xCD => self.call_condition("", true),
0xCE => {
let arg = self.load_args(1).single_val();
let arg = u8::try_from(self.load_args(1)).unwrap();
if self.debug {
println!("ADC A, {:02X}", arg);
}
@ -1531,7 +1538,7 @@ impl CPU {
}
0xD5 => self.push_rr(REG_N_D, REG_N_E),
0xD6 => {
let val = self.load_args(1).single_val();
let val = u8::try_from(self.load_args(1)).unwrap();
if self.debug {
println!("SUB {:02X}", val);
}
@ -1561,7 +1568,7 @@ impl CPU {
}
0xDD => panic!("NON-EXISTING OPCODE"),
0xDE => {
let arg = self.load_args(1).single_val();
let arg = u8::try_from(self.load_args(1)).unwrap();
if self.debug {
println!("SBC {:02X}", arg);
}
@ -1571,7 +1578,7 @@ impl CPU {
0xDF => self.rst(0x18),
0xE0 => {
let arg = self.load_args(1).single_val();
let arg = u8::try_from(self.load_args(1)).unwrap();
if self.debug {
println!("LDH {:02X}, A", arg);
}
@ -1591,7 +1598,7 @@ impl CPU {
0xE3 | 0xE4 => panic!("NON-EXISTING OPCODE"),
0xE5 => self.push_rr(REG_N_H, REG_N_L),
0xE6 => {
let val = self.load_args(1).single_val();
let val = u8::try_from(self.load_args(1)).unwrap();
if self.debug {
println!("AND {:02X}", val);
}
@ -1606,7 +1613,7 @@ impl CPU {
}
0xE7 => self.rst(0x20),
0xE8 => {
let arg = self.load_args(1).single_val() as i8;
let arg = u8::try_from(self.load_args(1)).unwrap() as i8;
if self.debug {
println!("ADD SP, {:02X}", arg);
}
@ -1632,7 +1639,7 @@ impl CPU {
4
}
0xEA => {
let addr = to_u16(self.load_args(2));
let addr = u16::try_from(self.load_args(2)).unwrap();
if self.debug {
println!("LD ({:04X}), A", addr);
}
@ -1641,7 +1648,7 @@ impl CPU {
}
0xEB..=0xED => panic!("NON-EXISTING OPCODE"),
0xEE => {
let arg = self.load_args(1).single_val();
let arg = u8::try_from(self.load_args(1)).unwrap();
if self.debug {
println!("XOR {:02X}", arg);
}
@ -1656,7 +1663,7 @@ impl CPU {
0xEF => self.rst(0x28),
0xF0 => {
let arg = self.load_args(1).single_val();
let arg = u8::try_from(self.load_args(1)).unwrap();
if self.debug {
println!("LDH A, {:02X}", arg);
}
@ -1682,7 +1689,7 @@ impl CPU {
0xF4 => panic!("NON-EXISTING OPCODE"),
0xF5 => self.push_rr(REG_N_A, REG_N_F),
0xF6 => {
let val = self.load_args(1).single_val();
let val = u8::try_from(self.load_args(1)).unwrap();
if self.debug {
println!("OR {:02X}", val);
}
@ -1696,7 +1703,7 @@ impl CPU {
}
0xF7 => self.rst(0x30),
0xF8 => {
let arg = self.load_args(1).single_val() as i8;
let arg = u8::try_from(self.load_args(1)).unwrap() as i8;
if self.debug {
println!("LD HL, SP+{:02X}", arg);
}
@ -1726,7 +1733,7 @@ impl CPU {
8
}
0xFA => {
let addr = to_u16(self.load_args(2));
let addr = u16::try_from(self.load_args(2)).unwrap();
if self.debug {
println!("LD A, ({:04X})", addr);
}
@ -1743,7 +1750,7 @@ impl CPU {
0xFC | 0xFD => panic!("NON-EXISTING OPCODE"),
0xFE => {
let arg = self.load_args(1).single_val();
let arg = u8::try_from(self.load_args(1)).unwrap();
if self.debug {
println!("CP {:02X}", arg);
}