We get UART output! WooHoo! :)

This commit is contained in:
Kevin Hamacher 2018-02-11 12:30:18 +01:00
parent 73499e1b76
commit 7136fab6af
3 changed files with 57 additions and 35 deletions

View File

@ -53,7 +53,7 @@ impl fmt::Display for CPU {
for i in 0..32 {
write!(f, " R{:-2} = 0x{:02X} ", i, self.registers[i])?;
if (i + 1) % 10 == 0{
write!(f, "\n");
write!(f, "\n")?;
}
}
write!(f, "\n")
@ -124,7 +124,8 @@ impl CPU {
} else {
// TODO: Hooks
if addr == chip_definitions::USARTC0_DATA {
panic!("Tring to write {} via USART!", val);
// panic!("Tring to write {} via USART!", val);
print!("UART_OUT:{: <3} ({}) ", val, (val as char).escape_debug());
}
ram[addr as usize] = val;
Ok(())
@ -138,9 +139,12 @@ impl CPU {
} else {
// TODO: Hooks
if addr == chip_definitions::USARTC0_DATA {
panic!("Tring to read from USART!");
print!("Tring to read from USART!");
return Err(CPUError::Exit);
} else if addr == chip_definitions::USARTC0_STATUS {
panic!("Trying to read USART flags!");
print!("Trying to read USART flags!");
// return Err(CPUError::Exit);
return Ok(0x20); // Hack :D
} else if addr == chip_definitions::OSC_STATUS {
// HACK: Osci is set right..
return Ok(2);
@ -509,6 +513,22 @@ impl CPU {
self.pc += 1;
}
},
Instruction::CPSE(ref r, ref d) => {
if self.get_register(r) == self.get_register(d) {
// TODO: assume 2b instruction after this one.
self.pc += 1;
}
},
Instruction::MUL(ref r, ref d) => {
// R1:R0 ← Rd × Rr(unsigned ← unsigned × unsigned)
let r = self.get_register(r) as u16;
let d = self.get_register(d) as u16;
let v = r * d;
self.registers[0] = (v & 0xFF) as u8;
self.registers[1] = ((v >> 8) & 0xFF) as u8;
self.set_clear_flag(StatusFlag::Carry, v & 0x80 == 0x80);
self.set_clear_flag(StatusFlag::Zero, v == 0);
},
Instruction::NOP => {},
_ => return Err(CPUError::UnimplementedInstruction)
}

View File

@ -107,33 +107,33 @@ pub enum Instruction {
impl fmt::Display for Instruction {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Instruction::ADC(ref r, ref d) => write!(f, "ADC {} {}", r, d),
Instruction::ADD(ref r, ref d) => write!(f, "ADD {} {}", r, d),
Instruction::ADIW(ref r, v) => write!(f, "ADIW {} {}", r, v),
Instruction::AND(ref r, ref d) => write!(f, "AND {} {}", r, d),
Instruction::ANDI(ref r, v) => write!(f, "ANDI {} {}", r, v),
Instruction::ADC(ref r, ref d) => write!(f, "ADC {}, {}", r, d),
Instruction::ADD(ref r, ref d) => write!(f, "ADD {}, {}", r, d),
Instruction::ADIW(ref r, v) => write!(f, "ADIW {}, {}", r, v),
Instruction::AND(ref r, ref d) => write!(f, "AND {}, {}", r, d),
Instruction::ANDI(ref r, v) => write!(f, "ANDI {}, {}", r, v),
Instruction::ASR(ref r) => write!(f, "ASR {}", r),
Instruction::BLD(ref r, v) => write!(f, "BLD {} {}", r, v),
Instruction::BLD(ref r, v) => write!(f, "BLD {}, {}", r, v),
Instruction::BREAK => write!(f, "BREAK"),
Instruction::BR_IF(rel, ref flag, tgt) => write!(f, "BR_IF {}, {:?}=={}", rel, flag, tgt),
Instruction::BST(ref r, v) => write!(f, "BST {} {}", r, v),
Instruction::BST(ref r, v) => write!(f, "BST {}, {}", r, v),
Instruction::CALL(pc) => write!(f, "CALL {:06X}", pc),
Instruction::CBI(ref ior, v) => write!(f, "CBI {} {}", ior, v),
Instruction::CBI(ref ior, v) => write!(f, "CBI {}, {}", ior, v),
Instruction::CLR_FLAG(flag) => write!(f, "CLR_FLAG {:?}", flag),
Instruction::CLR(ref r) => write!(f, "CLR {}", r),
Instruction::COM(ref r) => write!(f, "COM {}", r),
Instruction::CP(ref r, ref d) => write!(f, "CP {} {}", r, d),
Instruction::CPC(ref r, ref d) => write!(f, "CPC {} {}", r, d),
Instruction::CP(ref r, ref d) => write!(f, "CP {}, {}", r, d),
Instruction::CPC(ref r, ref d) => write!(f, "CPC {}, {}", r, d),
Instruction::CPI(ref r, v) => write!(f, "CPI {} {}", r, v),
Instruction::CPSE(ref r, ref d) => write!(f, "CPSE {} {}", r, d),
Instruction::DEC(ref r) => write!(f, "DEC {}", r),
Instruction::EICALL => write!(f, "EICALL"),
Instruction::EIJMP => write!(f, "EIJMP"),
Instruction::ELPM(ref r, ref mode) => write!(f, "ELPM[{:?}] {}", mode, r),
Instruction::EOR(ref r, ref d) => write!(f, "EOR {} {}", r, d),
Instruction::FMUL(ref r, ref d) => write!(f, "FMUL {} {}", r, d),
Instruction::FMULS(ref r, ref d) => write!(f, "FMULS {} {}", r, d),
Instruction::FMULSU(ref r, ref d) => write!(f, "FMULSU {} {}", r, d),
Instruction::EOR(ref r, ref d) => write!(f, "EOR {}, {}", r, d),
Instruction::FMUL(ref r, ref d) => write!(f, "FMUL {}, {}", r, d),
Instruction::FMULS(ref r, ref d) => write!(f, "FMULS {}, {}", r, d),
Instruction::FMULSU(ref r, ref d) => write!(f, "FMULSU {}, {}", r, d),
Instruction::ICALL => write!(f, "ICALL"),
Instruction::IJMP => write!(f, "IJMP"),
Instruction::IN(ref r, ref ior) => write!(f, "IN {}, {}", r, ior),
@ -143,17 +143,17 @@ impl fmt::Display for Instruction {
Instruction::LAS(ref r) => write!(f, "LAS {}", r),
Instruction::LAT(ref r) => write!(f, "LAT {}", r),
Instruction::LD(ref r, ref d, ref mode) => write!(f, "LD {}, [{} {:?}]", r, d, mode),
Instruction::LDI(ref r, v) => write!(f, "LDI {} {}", r, v),
Instruction::LDS8(ref r, v) => write!(f, "LDS8 {} {}", r, v),
Instruction::LDS16(ref r, v) => write!(f, "LDS16 {} {}", r, v),
Instruction::LDI(ref r, v) => write!(f, "LDI {}, {}", r, v),
Instruction::LDS8(ref r, v) => write!(f, "LDS8 {}, {}", r, v),
Instruction::LDS16(ref r, v) => write!(f, "LDS16 {}, {}", r, v),
Instruction::LPM(ref r, ref mode) => write!(f, "LPM {} {:?}", r, mode),
Instruction::LSL(ref r) => write!(f, "LSL {}", r),
Instruction::LSR(ref r) => write!(f, "LSR {}", r),
Instruction::MOV(ref r, ref d) => write!(f, "MOV {}, {}", r, d),
Instruction::MOVW(ref r, ref d) => write!(f, "MOVW {}, {}", r, d),
Instruction::MUL(ref r, ref d) => write!(f, "MUL {} {}", r, d),
Instruction::MULS(ref r, ref d) => write!(f, "MULS {} {}", r, d),
Instruction::MULSU(ref r, ref d) => write!(f, "MULSU {} {}", r, d),
Instruction::MUL(ref r, ref d) => write!(f, "MUL {}, {}", r, d),
Instruction::MULS(ref r, ref d) => write!(f, "MULS {}, {}", r, d),
Instruction::MULSU(ref r, ref d) => write!(f, "MULSU {}, {}", r, d),
Instruction::NEG(ref r) => write!(f, "NEG {}", r),
Instruction::NOP => write!(f, "NOP"),
Instruction::OR(ref r, ref d) => write!(f, "OR {} {}", r, d),
@ -167,15 +167,15 @@ impl fmt::Display for Instruction {
Instruction::RJMP(rv) => write!(f, "RJMP {:X}", rv),
Instruction::ROL(ref r) => write!(f, "ROL {}", r),
Instruction::ROR(ref r) => write!(f, "ROR {}", r),
Instruction::SBC(ref r, ref d) => write!(f, "SBC {} {}", r, d),
Instruction::SBCI(ref r, v) => write!(f, "SBCI {} {}", r, v),
Instruction::SBI(ref ior, v) => write!(f, "SBI {} {}", ior, v),
Instruction::SBIC(ref ior, v) => write!(f, "SBIC {} {}", ior, v),
Instruction::SBIS(ref ior, v) => write!(f, "SBIS {} {}", ior, v),
Instruction::SBIW(ref r, v) => write!(f, "SBIW {} {}", r, v),
Instruction::SBR(ref r, v) => write!(f, "SBR {} {}", r, v),
Instruction::SBRC(ref r, v) => write!(f, "SBRC {} {}", r, v),
Instruction::SBRS(ref r, v) => write!(f, "SBRS {} {}", r, v),
Instruction::SBC(ref r, ref d) => write!(f, "SBC {}, {}", r, d),
Instruction::SBCI(ref r, v) => write!(f, "SBCI {}, {}", r, v),
Instruction::SBI(ref ior, v) => write!(f, "SBI {}, {}", ior, v),
Instruction::SBIC(ref ior, v) => write!(f, "SBIC {}, {}", ior, v),
Instruction::SBIS(ref ior, v) => write!(f, "SBIS {}, {}", ior, v),
Instruction::SBIW(ref r, v) => write!(f, "SBIW {}, {}", r, v),
Instruction::SBR(ref r, v) => write!(f, "SBR {}, {}", r, v),
Instruction::SBRC(ref r, v) => write!(f, "SBRC {}, {}", r, v),
Instruction::SBRS(ref r, v) => write!(f, "SBRS {}, {}", r, v),
Instruction::SER(ref r) => write!(f, "SER {}", r),
Instruction::SET_FLAG(flag) => write!(f, "SET_FLAG {:?}", flag),
Instruction::SLEEP => write!(f, "SLEEP"),
@ -183,8 +183,8 @@ impl fmt::Display for Instruction {
Instruction::ST(ref r, ref d, ref mode) => write!(f, "ST [{} {:?}], {}", r, mode, d),
Instruction::STS8(v, ref r) => write!(f, "STS8 {}, {}", v, r),
Instruction::STS16(v, ref r) => write!(f, "STS16 {}, {}", v, r),
Instruction::SUB(ref r, ref d) => write!(f, "SUB {} {}", r, d),
Instruction::SUBI(ref r, v) => write!(f, "SUBI {} {}", r, v),
Instruction::SUB(ref r, ref d) => write!(f, "SUB {}, {}", r, d),
Instruction::SUBI(ref r, v) => write!(f, "SUBI {}, {}", r, v),
Instruction::SWAP(ref r) => write!(f, "SWAP {}", r),
Instruction::TST(ref r) => write!(f, "TST {}", r),
Instruction::WDR => write!(f, "WDR"),

View File

@ -40,9 +40,11 @@ fn main() {
_ => {}
}
/*
if cpu.pc == 0xaea / 2 {
println!("{}", cpu);
}
*/
}
println!("{}", cpu);