boot.asm 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. ; asmsyntax=nasm
  2. [org 0x7c00]
  3. [bits 16]
  4. boot:
  5. cli
  6. mov ax, 0x8000
  7. mov ss, ax
  8. mov sp, 0xffff
  9. push cs
  10. pop ds
  11. xor bx, bx
  12. mov ah, 0x0e
  13. mov si, message
  14. lodsb
  15. .lewp:
  16. int 0x10
  17. lodsb
  18. cmp al, 0
  19. jne .lewp
  20. mov bx, 0x1000
  21. mov es, bx
  22. xor bx, bx ; Load kernel @ 0x10000
  23. mov cx, word [cur_lba]
  24. .sector_loop:
  25. call convert_lba_to_chs
  26. mov ah, 0x02 ; cmd 0x02 - Read Disk Sectors
  27. mov al, 1 ; 1 sector at a time
  28. mov dl, 0 ; drive 0 (fd0)
  29. int 0x13
  30. jc fug
  31. mov ah, 0x0e
  32. mov al, '.'
  33. int 0x10
  34. inc word [cur_lba]
  35. mov cx, word [cur_lba]
  36. cmp cx, 400
  37. jz .sector_loop_end
  38. mov bx, es
  39. add bx, 0x20
  40. mov es, bx
  41. xor bx, bx
  42. jmp .sector_loop
  43. .sector_loop_end:
  44. call durk
  45. lgdt [cs:test_gdt_ptr]
  46. mov eax, cr0
  47. or al, 1
  48. mov cr0, eax
  49. jmp 0x08:pmode
  50. durk:
  51. push cs
  52. pop ds
  53. xor bx, bx
  54. mov ah, 0x0e
  55. mov si, msg_sectors_loaded
  56. lodsb
  57. .lewp:
  58. int 0x10
  59. lodsb
  60. cmp al, 0
  61. jne .lewp
  62. ret
  63. pmode:
  64. [bits 32]
  65. mov ax, 0x10
  66. mov ds, ax
  67. mov es, ax
  68. mov fs, ax
  69. mov gs, ax
  70. mov ss, ax
  71. mov esp, 0x2000
  72. xor eax, eax
  73. xor ebx, ebx
  74. xor ecx, ecx
  75. xor edx, edx
  76. xor ebp, ebp
  77. xor esi, esi
  78. xor edi, edi
  79. jmp 0x10000
  80. hlt
  81. test_gdt_ptr:
  82. dw (test_gdt_end-test_gdt)
  83. dd test_gdt
  84. test_gdt:
  85. dd 0
  86. dd 0
  87. dd 0x0000ffff
  88. dd 0x00cf9a00
  89. dd 0x0000ffff
  90. dd 0x00cf9200
  91. dd 0
  92. dd 0
  93. dd 0
  94. dd 0
  95. test_gdt_end:
  96. [bits 16]
  97. fug:
  98. xor bx, bx
  99. mov ah, 0x0e
  100. mov si, fug_message
  101. lodsb
  102. .lewp:
  103. int 0x10
  104. lodsb
  105. cmp al, 0
  106. jne .lewp
  107. cli
  108. hlt
  109. ; Input:
  110. ;
  111. ; AX = LBA
  112. ;
  113. ; Output:
  114. ;
  115. ; CX and DH = C/H/S address formatted for Int13,2
  116. ; CL = sector (LBA % sectors_per_track) + 1
  117. ;
  118. ; 1.44M floppy stats:
  119. ; (sectors_per_track: 18)
  120. ; (heads: 2)
  121. ; (sectors: 2880)
  122. convert_lba_to_chs:
  123. mov ax, cx
  124. ; AX = LBA/spt, DX = LBA%spt
  125. xor dx, dx
  126. div word [sectors_per_track]
  127. ; CL = sector (LBA % sectors_per_track) + 1
  128. mov cl, dl
  129. inc cl
  130. ; CH = track (LBA / sectors_per_track) / heads
  131. mov ch, al
  132. shr ch, 1
  133. ; AX = (LBA/spt)/heads, DX = (LBA/spt)%heads
  134. xor dx, dx
  135. div word [heads]
  136. ; DH = sector (LBA / sectors_per_track) % heads
  137. mov dh, dl
  138. ret
  139. cur_lba:
  140. dw 9
  141. sectors_per_track:
  142. dw 18
  143. heads:
  144. dw 2
  145. msg_sectors_loaded:
  146. db "sectors loaded", 0x0d, 0x0a, 0
  147. message:
  148. db "boot!", 0x0d, 0x0a, 0
  149. fug_message:
  150. db "FUG!", 0x0d, 0x0a, 0
  151. times 510-($-$$) db 0
  152. dw 0xaa55