about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--subx/019syscalls.cc19
-rw-r--r--subx/020elf.cc1
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)