80 lines
1.8 KiB
ArmAsm
80 lines
1.8 KiB
ArmAsm
|
|
// 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
|
||
|
|
mov 8+4(%ebp), %ecx
|
||
|
|
|
||
|
|
PROT16
|
||
|
|
REAL
|
||
|
|
|
||
|
|
.bwloop: test %ecx, %ecx
|
||
|
|
jz .bwreturn
|
||
|
|
|
||
|
|
xor %bx, %bx
|
||
|
|
mov $0x0E, %ah
|
||
|
|
mov (%edx), %al
|
||
|
|
|
||
|
|
push %ecx
|
||
|
|
push %edx
|
||
|
|
int $0x10
|
||
|
|
pop %edx
|
||
|
|
pop %ecx
|
||
|
|
|
||
|
|
add $1, %edx
|
||
|
|
sub $1, %ecx
|
||
|
|
|
||
|
|
jmp .bwloop
|
||
|
|
|
||
|
|
.bwreturn: PROT
|
||
|
|
PROT32
|
||
|
|
|
||
|
|
pop %ebx
|
||
|
|
mov %ebp, %esp
|
||
|
|
pop %ebp
|
||
|
|
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
|
||
|
|
mov %ebp, %esp
|
||
|
|
pop %ebp
|
||
|
|
ret
|
||
|
|
|