emu: dos exit service.
Just calls process::exit() for now
This commit is contained in:
@@ -1,9 +1,23 @@
|
|||||||
use emu::pc::Bus;
|
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);
|
let svc = read_hi(cpu.a);
|
||||||
match svc {
|
match svc {
|
||||||
|
0x09 => print_string(cpu, bus),
|
||||||
|
0x4C => exit(read_lo(cpu.a)),
|
||||||
_ => unimplemented!("dos service: AH={:02X}h\ncpu: {:#X?}", svc, cpu)
|
_ => 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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user