diff options
-rw-r--r-- | subx/019syscalls.cc | 19 | ||||
-rw-r--r-- | subx/020elf.cc | 1 |
2 files changed, 20 insertions, 0 deletions
diff --git a/subx/019syscalls.cc b/subx/019syscalls.cc new file mode 100644 index 00000000..96c11ee0 --- /dev/null +++ b/subx/019syscalls.cc @@ -0,0 +1,19 @@ +:(before "End Single-Byte Opcodes") +case 0xcd: { // int imm8 (software interrupt) + uint8_t code = next(); + if (code != 0x80) { + raise << "Unimplemented interrupt code " << HEXBYTE << code << '\n' << end(); + raise << " Only `int 80h` supported for now.\n" << end(); + break; + } + process_int80(); + break; +} + +:(code) +void process_int80() { + switch (Reg[EAX].u) { + case 1: + exit(Reg[EBX].u); + } +} diff --git a/subx/020elf.cc b/subx/020elf.cc index e217755f..3c9d6262 100644 --- a/subx/020elf.cc +++ b/subx/020elf.cc @@ -8,6 +8,7 @@ if (is_equal(argv[1], "run")) { load_elf(argv[2]); while (EIP < End_of_program) // weak final-gasp termination check run_one_instruction(); + raise << "executed past end of the world: " << EIP << " vs " << End_of_program << '\n' << end(); } :(code) |