org 0x100 mov si,msg call print ; kernel loaded at 0x4000, ds = 0x50 now, so take that off mov bx,0x4000-0x500 diskread: mov ah,0x02 ;func 2 mov al,0x10 ;read 16 sectors mov cx,0x3 ;sector 3 mov dx,0x0 ; head/drive int 0x13 jc diskread ; kill fd motor mov dx,0x3f2 in al,dx and al,~0x10 out dx,al mov si,msg2 call print cli ; Code taken from: ; pm6.asm - protected-mode demo code ; Christopher Giese a20_chk: call kbdwait mov al,0xD1 out 0x64,al call kbdwait mov al,0xDF out 0x60,al call kbdwait lgdt [gdtr] mov eax,cr0 or al,1 mov cr0,eax jmp 0x0008:pm_start+0x500 print: lodsb or al,al jz printend mov ah,0x0e xor bx,bx int 0x10 jmp print printend: ret kbdw0: jmp short $+2 in al,0x60 kbdwait: jmp short $+2 in al,0x64 test al,1 jnz kbdw0 test al,2 jnz kbdwait ret [BITS 32] pm_start: mov ax,0x0010 mov ds,ax mov ss,ax mov es,ax mov esp,0x4000 jmp 0x0008:0x4000 ; jump into kernel msg db "Loading Kernel...",13,10,0x0 msg2 db "Entering protected mode...",13,10,0x0 ;pmsg: db "H e l l o W o r l d f r o m P r o t e c t e d M o d e ! ! " ;pmsglen equ $-pmsg gdt: null_gdt: ; 0x00 dw 0x0000 dw 0x0000 db 0x00 db 0x00 db 0x00 db 0x00 code_gdt: ; 0x08 dw 0xffff dw 0x0000 db 0x00 db 0x9a db 0xcf db 0x00 data_gdt: ; 0x10 dw 0xffff dw 0x0000 db 0x00 db 0x92 db 0xcf db 0x00 ;video_gdt: ; 0x18 ; dw 0xffff ; seg limit ; dw 0x8000 ; seg base 3,4 ; db 0x0b ; seg base 2 ; db 0x92 ; db 0x4f ; db 0x00 ; seg base 1 ;full_gdt: ; 0x20 ; dw 0xffff ; seg limit ; dw 0x0000 ; seg base 3,4 ; db 0x00 ; seg base 2 ; db 0x92 ; db 0xcf ; db 0x00 ; seg base 1 gdt_end: gdtr: dw gdt_end - gdt - 1 dd gdt + 0x500