fernlader/lboot.S

93 lines
2.3 KiB
ArmAsm

// vim: et:sw=12:ts=12:sts=12
.global _start
.text
.code16
_start: cli
cld
// we keep our text and data close to each other
xor %ax, %ax
mov %ax, %ds
mov $msg_start, %si
call print
mov $msg_a20, %si
call print
call enable_a20
mov $msg_unreal, %si
call print
call unreal
mov $msg_fin, %si
call print
1: hlt
jmp 1b
enable_a20: // TODO more thorough implementation
inb $0x92, %al
or $2, %al
outb %al, $0x92
ret
unreal: push %ds
lgdt gdt_ptr
mov %cr0, %eax
or $0x01, %al
mov %eax, %cr0
ljmp $0x8, $1f
1: mov $0x10, %cx
mov %cx, %ds
and $0xFE, %al
mov %eax, %cr0
ljmp $0x0, $2f
2: pop %ds
ret
print: xor %bx, %bx
1: lodsb
or %al, %al
jz 2f
mov $0x0E, %ah
int $0x10
jmp 1b
2: ret
gdt: // entry 0: null descriptor
.word 0
.word 0
.byte 0
.byte 0
.byte 0
.byte 0
// entry 1: code segment
.word 0xFFFF
.word 0
.byte 0
.byte 0b10011010
.byte 0x8F
.byte 0
// entry 2: data segment
.word 0xFFFF
.word 0
.byte 0
.byte 0b10010010
.byte 0x8F
.byte 0
.set gdt_size, .-gdt
gdt_ptr: .word gdt_size-1
.long gdt
msg_start: .asciz "Netboot via fernlader v1 ...\r\n"
msg_a20: .asciz " * Enabling A20\r\n"
msg_unreal: .asciz " * Unreal Mode\r\n"
msg_fin: .asciz "Finished.\r\n"