summaryrefslogtreecommitdiff
path: root/bios/bios.ha
diff options
context:
space:
mode:
authorAlejandro Sior <aho@sior.be>2022-05-19 08:45:26 +0200
committerAlejandro Sior <aho@sior.be>2022-05-19 08:45:26 +0200
commit776a3710652f78b44718450406d0683974aef72a (patch)
tree84f1b70e07b831d13db8c53c0ab0030ec0d85c09 /bios/bios.ha
parente50cbe8eb763cf63fb44b047d5164f6fbf07eb39 (diff)
bios: stub calls interrupt number; simplified bios.ha main interface
Instead of having the bios.call stub calling a function, make it directly call an interrupt that is changed dynamically by modifying the code at runtime. Simplify the bios.ha interface and document it. Next up: implementing a high level drive interface for the BIOS using BIOS interrupts
Diffstat (limited to 'bios/bios.ha')
-rw-r--r--bios/bios.ha41
1 files changed, 41 insertions, 0 deletions
diff --git a/bios/bios.ha b/bios/bios.ha
new file mode 100644
index 0000000..afae0f6
--- /dev/null
+++ b/bios/bios.ha
@@ -0,0 +1,41 @@
+// Struct defining the contents of the register state used
+// for bios calls
+export type state = struct {
+ @offset(0) eax: u32,
+ @offset(4) ebx: u32,
+ @offset(8) ecx: u32,
+ @offset(12) edx: u32,
+ @offset(16) edi: u32,
+ @offset(20) esi: u32,
+ @offset(24) ds: u16,
+ @offset(26) es: u16,
+ @offset(28) ss: u16,
+ @offset(30) gs: u16,
+ @offset(32) fs: u16
+};
+
+// The set real mode registers
+export let regs: state;
+
+// The address of a 512 bytes workspace that is located below 0xFFFFF and can be used to store the results
+// of various bios calls
+export const @symbol("_ws") ws: u16;
+
+// The boot drive number as given by the BIOS at boot time
+export const @symbol("drive_no") drive_number: u8;
+
+// The amount of sectors per track that the boot drive has
+export const @symbol("drive_spt") drive_sectors_per_track: u8;
+
+// The amount of heads that the boot drive has
+export const @symbol("drive_heads") drive_heads: u8;
+
+// Clears the BIOS mode registers
+export fn clearregs() void = {
+ regs = state {
+ ...
+ };
+};
+
+// Call a BIOS interrupt
+export fn call(intno: u8) void;