|
|
- [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
|