123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- ; asmsyntax=nasm
- [org 0x7c00]
- [bits 16]
- boot:
- cli
- mov ax, 0x8000
- mov ss, ax
- mov sp, 0xffff
- push cs
- pop ds
- xor bx, bx
- mov ah, 0x0e
- mov si, message
- lodsb
- .lewp:
- int 0x10
- lodsb
- cmp al, 0
- jne .lewp
- mov bx, 0x1000
- mov es, bx
- xor bx, bx ; Load kernel @ 0x10000
- mov cx, word [cur_lba]
- .sector_loop:
- call convert_lba_to_chs
- mov ah, 0x02 ; cmd 0x02 - Read Disk Sectors
- mov al, 1 ; 1 sector at a time
- mov dl, 0 ; drive 0 (fd0)
- int 0x13
- jc fug
- mov ah, 0x0e
- mov al, '.'
- int 0x10
- inc word [cur_lba]
- mov cx, word [cur_lba]
- cmp cx, 400
- jz .sector_loop_end
- mov bx, es
- add bx, 0x20
- mov es, bx
- xor bx, bx
- jmp .sector_loop
- .sector_loop_end:
- call durk
- lgdt [cs:test_gdt_ptr]
- mov eax, cr0
- or al, 1
- mov cr0, eax
- jmp 0x08:pmode
- durk:
- push cs
- pop ds
- xor bx, bx
- mov ah, 0x0e
- mov si, msg_sectors_loaded
- lodsb
- .lewp:
- int 0x10
- lodsb
- cmp al, 0
- jne .lewp
- ret
- pmode:
- [bits 32]
- mov ax, 0x10
- mov ds, ax
- mov es, ax
- mov fs, ax
- mov gs, ax
- mov ss, ax
- mov esp, 0x2000
- xor eax, eax
- xor ebx, ebx
- xor ecx, ecx
- xor edx, edx
- xor ebp, ebp
- xor esi, esi
- xor edi, edi
- jmp 0x10000
- hlt
- test_gdt_ptr:
- dw (test_gdt_end-test_gdt)
- dd test_gdt
- test_gdt:
- dd 0
- dd 0
- dd 0x0000ffff
- dd 0x00cf9a00
- dd 0x0000ffff
- dd 0x00cf9200
- dd 0
- dd 0
- dd 0
- dd 0
- test_gdt_end:
- [bits 16]
- fug:
- xor bx, bx
- mov ah, 0x0e
- mov si, fug_message
- lodsb
- .lewp:
- int 0x10
- lodsb
- cmp al, 0
- jne .lewp
- cli
- hlt
- ; Input:
- ;
- ; AX = LBA
- ;
- ; Output:
- ;
- ; CX and DH = C/H/S address formatted for Int13,2
- ; CL = sector (LBA % sectors_per_track) + 1
- ;
- ; 1.44M floppy stats:
- ; (sectors_per_track: 18)
- ; (heads: 2)
- ; (sectors: 2880)
- convert_lba_to_chs:
- mov ax, cx
- ; AX = LBA/spt, DX = LBA%spt
- xor dx, dx
- div word [sectors_per_track]
- ; CL = sector (LBA % sectors_per_track) + 1
- mov cl, dl
- inc cl
- ; CH = track (LBA / sectors_per_track) / heads
- mov ch, al
- shr ch, 1
- ; AX = (LBA/spt)/heads, DX = (LBA/spt)%heads
- xor dx, dx
- div word [heads]
- ; DH = sector (LBA / sectors_per_track) % heads
- mov dh, dl
- ret
-
- cur_lba:
- dw 9
- sectors_per_track:
- dw 18
- heads:
- dw 2
- msg_sectors_loaded:
- db "sectors loaded", 0x0d, 0x0a, 0
- message:
- db "boot!", 0x0d, 0x0a, 0
- fug_message:
- db "FUG!", 0x0d, 0x0a, 0
- times 510-($-$$) db 0
- dw 0xaa55
|