From 26f28cdb48c1afdeb734403fc4aacb1b08ea6a63 Mon Sep 17 00:00:00 2001 From: Kevin Hamacher Date: Thu, 20 Feb 2020 19:50:07 +0100 Subject: [PATCH] Use TryFrom() instead of custom solution --- src/cpu.rs | 81 +++++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 37 deletions(-) diff --git a/src/cpu.rs b/src/cpu.rs index bc82d7d..21fc86d 100644 --- a/src/cpu.rs +++ b/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 for u8 { + type Error = (); + + fn try_from(val: Args) -> Result { + match val { + Args::Single(x) => Ok(x), + _ => Err(()), + } + } +} + +impl TryFrom for u16 { + type Error = (); + + fn try_from(val: Args) -> Result { + 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); }