Code: Select all
[BITS 16]
[ORG 0x8000]
jmp 0x0000:start
start:
cli
xor ax, ax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov sp, 0x8000
sti
mov si, msgLoad
call Print
A20:
cli
xor cx, cx
.clrbuffer1
in al, 0x64
test al, 0x2
loopnz .clrbuffer1
mov al, 0xD1
out 0x64, al
.clrbuffer2
in al, 0x64
test al, 0x2
loopnz .clrbuffer2
mov al, 0xDF
out 0x60, al
mov CX, 0xFF
.wkbc
out 0xED, ax
loop .wkbc
.finish
sti
mov si, msgDot
call Print
SectorLoader:
mov ah, 2
mov al, 3
mov ch, 0
mov cl, 3
mov dx, 0
xor bx, bx
mov es, bx
mov bx, 0x8600
jmp .read
.error
mov si, msgX
call Print
.read
int 13h
jc .error
mov si, msgDot
call Print
; 0x1000
; 0x0FFF
; 0x1000
; 0x11FF
VESA:
mov ax, 4f00h
mov bx, 0x1000
mov es, bx
mov di, 0x0FFF
int 10h
cmp ax, 004Fh
jne novesa
mov ax, 4f01h ; set vesa screen mode information
mov bx, 0x1000
mov es, bx
mov di, 0x11FF
mov cx, 0x4118
int 10h
mov ax, 4f02h ; set vesa screen mode
mov bx, 0x4118
int 10h
cmp ax, 004Fh
jne novesa2
jmp PMode
novesa:
mov si, msgNoVesa
call Print
novesa2:
mov si, msgNoVesa2
call Print
PMode:
cli
lgdt [gdtr]
mov eax, cr0
or eax, 1
mov cr0, eax
jmp code_selector:flush_pipe
;;;;;;;;;; Functions
Print:
cld
.checkchar
lodsb
or al, al
jz .end
mov ah, 0x0E
mov bh, 0x00
int 10h
jmp .checkchar
.end
ret
[BITS 32]
flush_pipe:
mov ax, data_selector
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov sp, 0x8000
;mov eax, 0xB8000
;mov byte [eax], "a"
;inc eax
;mov byte [eax], 0x07
mov ebx, 0x111FF+0x28
mov ecx, 1024*768*3
loopas:
mov byte [ebx], 0xFF
inc ebx
loop loopas
;jmp code_selector:0x8600
jmp $
;;;;;;;;;; GDT
gdt:
null_selector EQU $-gdt
dw 0
dw 0
db 0
db 0
db 0
db 0
dw 0
dw 0
db 0
db 0
db 0
db 0
code_selector EQU $-gdt
dw 0xFFFF
dw 0x0
db 0x0
db 0x9A ; 10011010b
db 0xCF ; 11001111b
db 0x0
data_selector EQU $-gdt
dw 0xFFFF
dw 0x0
db 0x0
db 0x92 ; 10010010b
db 0xCF ; 11001111b
db 0x0
gdt_end:
gdtr:
dw gdt_end-gdt
dd gdt
;;;;;;;;;; Variables
msgLoad db 13, 10, "I am on bootloader SECOND STAGE", 0
msgDot db ".", 0
msgX db "x", 0
msgNoVesa db "Your video card does not support VESA", 0
msgNoVesa2 db "Your video card does not support VESA 222222", 0
;;;;;;;;;; Required code
times 512*2-($-$$) db 0