[BITS 16] ; We need 16-bit intructions for Real mode
|
|
|
|
[ORG 0x7C00] ; The BIOS loads the boot sector into memory location 0x7C00
|
|
|
|
cli ; Disable interrupts, we want to be alone
|
|
|
|
xor ax, ax
|
|
mov ds, ax ; Set DS-register to 0 - used by lgdt
|
|
|
|
lgdt [gdt_desc] ; Load the GDT descriptor
|
|
|
|
mov eax, cr0 ; Copy the contents of CR0 into EAX
|
|
or eax, 1 ; Set bit 0
|
|
mov cr0, eax ; Copy the contents of EAX into CR0
|
|
|
|
jmp 08h:clear_pipe ; Jump to code segment, offset clear_pipe
|
|
|
|
|
|
[BITS 32] ; We now need 32-bit instructions
|
|
clear_pipe:
|
|
mov ax, 10h ; Save data segment identifyer
|
|
mov ds, ax ; Move a valid data segment into the data segment register
|
|
mov ss, ax ; Move a valid data segment into the stack segment register
|
|
mov esp, 090000h ; Move the stack pointer to 090000h
|
|
|
|
mov byte [ds:0B8000h], 'P' ; Move the ASCII-code of 'P' into first video memory
|
|
mov byte [ds:0B8001h], 1Bh ; Assign a color code
|
|
|
|
hang:
|
|
jmp hang ; Loop, self-jump
|
|
|
|
|
|
gdt: ; Address for the GDT
|
|
|
|
gdt_null: ; Null Segment
|
|
dd 0
|
|
dd 0
|
|
|
|
gdt_code: ; Code segment, read/execute, nonconforming
|
|
dw 0FFFFh
|
|
dw 0
|
|
db 0
|
|
db 10011010b
|
|
db 11001111b
|
|
db 0
|
|
|
|
gdt_data: ; Data segment, read/write, expand down
|
|
dw 0FFFFh
|
|
dw 0
|
|
db 0
|
|
db 10010010b
|
|
db 11001111b
|
|
db 0
|
|
|
|
gdt_end: ; Used to calculate the size of the GDT
|
|
|
|
|
|
|
|
gdt_desc: ; The GDT descriptor
|
|
dw gdt_end - gdt - 1 ; Limit (size)
|
|
dd gdt ; Address of the GDT
|
|
|
|
|
|
|
|
|
|
times 510-($-$$) db 0 ; Fill up the file with zeros
|
|
|
|
dw 0AA55h ; Boot sector identifyer
|