// 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"