77 lines
1.4 KiB
NASM
77 lines
1.4 KiB
NASM
[ORG 0x7c00]
|
|
[BITS 16]
|
|
|
|
xor ax, ax
|
|
mov ds, ax
|
|
mov es, ax
|
|
mov ah, 0x42
|
|
mov si, addr_packet
|
|
int 0x13
|
|
jnc entry
|
|
push 0xb800
|
|
pop es
|
|
xor di, di
|
|
mov si, string
|
|
mov cx, 10
|
|
mov ah, 0x7
|
|
err_print:
|
|
lodsb
|
|
stosw
|
|
loop err_print
|
|
hlt_loop:
|
|
hlt
|
|
jmp hlt_loop
|
|
entry:
|
|
cli ; no interrupts
|
|
xor ax,ax
|
|
mov ds, ax
|
|
lgdt [gdt_desc] ; load gdt register
|
|
mov eax, cr0 ; set pmode bit
|
|
or al, 1
|
|
mov cr0, eax
|
|
jmp 08h:Pmode
|
|
[BITS 32]
|
|
Pmode:
|
|
mov eax, 0x10
|
|
mov ds, ax
|
|
mov es, ax
|
|
mov fs, ax
|
|
mov gs, ax
|
|
mov ss, ax
|
|
in al, 0x92
|
|
test al, 2
|
|
jnz after
|
|
or al, 2
|
|
and al, 0xFE
|
|
out 0x92, al
|
|
after:
|
|
mov esi, 0x8000
|
|
mov edi, 0x100000
|
|
mov ecx, 0x10000
|
|
rep movsb
|
|
jmp 08h:0x100000
|
|
gdt_desc:
|
|
dw gdt_end - gdt
|
|
dd gdt
|
|
gdt:
|
|
gdt_null: dq 0
|
|
gdt_code: dw 0xFFFF, 0 ; bits 0-15 limit (4GB), bits 0-15 base address
|
|
db 0 ; bits 16-23 base address
|
|
db 10011010b ; access byte
|
|
db 11001111b ; bits 16-19 limit (4GB), 4 bits flags
|
|
db 0 ; bits 24-31 base address
|
|
gdt_data: dw 0xFFFF, 0 ; bits 0-15 limit (4GB), bits 0-15 base address
|
|
db 0 ; bits 16-23 base address
|
|
db 10010010b ; access byte
|
|
db 11001111b ; bits 16-19 limit (4GB), 4 bits flags
|
|
db 0 ; bits 24-31 base address
|
|
gdt_end:
|
|
|
|
string: db 'DISK ERROR'
|
|
|
|
addr_packet:
|
|
db 0x10, 0x00 ; size, reserved
|
|
dw 0x39 ; blocks
|
|
dd 0x8000 ; transfer buffer
|
|
dq 1 ; start block
|