diff options
| author | Alejandro Sior <aho@sior.be> | 2022-05-19 08:45:26 +0200 |
|---|---|---|
| committer | Alejandro Sior <aho@sior.be> | 2022-05-19 08:45:26 +0200 |
| commit | 776a3710652f78b44718450406d0683974aef72a (patch) | |
| tree | 84f1b70e07b831d13db8c53c0ab0030ec0d85c09 /bios/bios.ha | |
| parent | e50cbe8eb763cf63fb44b047d5164f6fbf07eb39 (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.ha | 41 |
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; |
