Use TryFrom() instead of custom solution
This commit is contained in:
parent
0f20b2801b
commit
26f28cdb48
81
src/cpu.rs
81
src/cpu.rs
@ -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);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user