fernlader2/src/bios.S

126 lines
3.1 KiB
ArmAsm
Raw Normal View History

2026-02-18 10:40:02 +01:00
// vim: ft=gas:et:sw=12:ts=12:sts=12
.include "src/mode.S"
.global bios_write
.code32
bios_write: push %ebp
mov %esp, %ebp
push %ebx
mov 8+0(%ebp), %edx
PROT16
REAL
2026-02-18 13:40:19 +01:00
.bwloop: cmpb $0, (%edx)
2026-02-18 10:40:02 +01:00
jz .bwreturn
xor %bx, %bx
mov $0x0E, %ah
mov (%edx), %al
push %edx
int $0x10
pop %edx
add $1, %edx
jmp .bwloop
.bwreturn: PROT
PROT32
pop %ebx
2026-02-21 14:36:05 +01:00
leave
2026-02-18 10:40:02 +01:00
ret
.global bios_getmap
.code32
bios_getmap:push %ebp
mov %esp, %ebp
push %ebx
push %edi
mov 8+0(%ebp), %edi
PROT16
REAL
xor %ebx, %ebx
_gmnext: movl $0, 20(%di)
mov $0x534D4150, %edx // e820 magic number
mov $24, %ecx
mov $0xE820, %eax
int $0x15
jc _gmdone
test %ebx, %ebx
jz _gmdone
add $24, %di
jmp _gmnext
_gmdone: add $24, %di
PROT
PROT32
mov %edi, %eax
pop %edi
pop %ebx
2026-02-21 14:36:05 +01:00
leave
2026-02-18 10:40:02 +01:00
ret
2026-02-18 13:40:19 +01:00
.global bios_func
bios_func: push %ebp
mov %esp, %ebp
push %ebx
push %ebp
push %edi
push %esi
// The interrupt number is given as an immediate value to INT.
// To support any interrupt number, we use self-modifying code.
2026-02-21 14:36:05 +01:00
mov 8+0(%ebp), %eax
2026-02-18 13:40:19 +01:00
mov %al, _bf_int+1
2026-02-21 14:13:24 +01:00
PROT16
REAL
2026-02-21 16:45:39 +01:00
mov %ds:8+4(%ebp), %edi
mov 0(%edi), %eax
mov 4(%edi), %ecx
mov 8(%edi), %edx
mov 12(%edi), %ebx
mov 16(%edi), %ebp
mov 20(%edi), %esi
mov 24(%edi), %edi
2026-02-18 13:40:19 +01:00
// This instruction will get written at runtime
_bf_int: .byte 0xCD, 0 // INT imm8
push $0
pushf
2026-02-21 16:45:39 +01:00
// FIXME broken BP
push %edi
2026-02-18 13:40:19 +01:00
mov 8+4(%ebp), %edi
2026-02-21 16:45:39 +01:00
mov %eax, 0(%edi)
mov %ecx, 4(%edi)
mov %edx, 8(%edi)
mov %ebx, 12(%edi)
mov %ebp, 16(%edi)
mov %esi, 20(%edi)
pop %eax
mov %eax, 24(%edi)
2026-02-18 13:40:19 +01:00
2026-02-21 14:13:24 +01:00
PROT
PROT32
2026-02-18 13:40:19 +01:00
pop %eax
pop %esi
pop %edi
pop %ebp
pop %ebx
2026-02-21 14:36:05 +01:00
leave
2026-02-18 13:40:19 +01:00
ret