diff --git a/src/emu/dos.rs b/src/emu/dos.rs index 3de8547..3cbcdfb 100644 --- a/src/emu/dos.rs +++ b/src/emu/dos.rs @@ -1,9 +1,23 @@ use emu::pc::Bus; -use emu::i8088::{i8088, read_hi}; +use emu::i8088::{i8088, read_hi, read_lo, segoff_to_addr}; -pub fn interrupt(cpu: &mut i8088, _bus: &mut Bus) { +pub fn interrupt(cpu: &mut i8088, bus: &mut Bus) { let svc = read_hi(cpu.a); match svc { + 0x09 => print_string(cpu, bus), + 0x4C => exit(read_lo(cpu.a)), _ => unimplemented!("dos service: AH={:02X}h\ncpu: {:#X?}", svc, cpu) } } + +fn print_string(cpu: &i8088, bus: &Bus) { + let addr = segoff_to_addr(cpu.ds, cpu.d); + for byte in bus.ram[addr..].iter().take_while(|byte| **byte as char != '$') { + print!("{}", *byte as char); + } +} + +fn exit(code: u8) { + println!(""); + std::process::exit(code as i32); +}