1
0

bootloader.asm 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. [BITS 16]
  2. [ORG 0x7C00]
  3. start:
  4. ; Set up segments
  5. xor ax, ax
  6. mov ds, ax
  7. mov es, ax
  8. mov ss, ax
  9. mov sp, 0x7C00
  10. ; Save boot drive passed in dl by the BIOS
  11. mov [boot_drive], dl
  12. ; Clear screen
  13. mov ah, 0x00
  14. mov al, 0x03
  15. int 0x10
  16. ; Print boot drive number in dl
  17. mov al, dl
  18. call print_hex_byte
  19. mov ah, 0x0E
  20. mov al, 13
  21. int 0x10
  22. mov al, 10
  23. int 0x10
  24. ; Print startup messages
  25. mov si, msg_start
  26. call print_string
  27. mov si, msg_key
  28. call print_string
  29. mov si, msg_drm
  30. call print_string
  31. mov si, msg_kernel
  32. call print_string
  33. ; Load Stage 2 from disk using LBA read
  34. mov dl, [boot_drive]
  35. mov ah, 0x42
  36. mov si, dap
  37. int 0x13
  38. jc disk_error
  39. ; Jump to Stage 2
  40. jmp 0x0000:0x7E00
  41. disk_error:
  42. mov al, ah
  43. call print_hex_byte
  44. mov ah, 0x0E
  45. mov al, 13
  46. int 0x10
  47. mov al, 10
  48. int 0x10
  49. mov si, msg_err
  50. call print_string
  51. halt:
  52. hlt
  53. jmp halt
  54. print_hex_byte:
  55. push ax
  56. push cx
  57. mov cl, 4
  58. shr al, cl
  59. call print_nibble
  60. pop ax
  61. push ax
  62. call print_nibble
  63. pop cx
  64. pop ax
  65. ret
  66. print_nibble:
  67. and al, 0x0F
  68. add al, '0'
  69. cmp al, '9'
  70. jbe .print
  71. add al, 7
  72. .print:
  73. mov ah, 0x0E
  74. int 0x10
  75. ret
  76. ; --- Functions ---
  77. print_string:
  78. mov ah, 0x0E ; Teletype output
  79. .loop:
  80. lodsb
  81. or al, al
  82. jz .done
  83. int 0x10
  84. jmp .loop
  85. .done:
  86. ret
  87. ; --- Data ---
  88. msg_start: db "Welcome to ArkOS Bootloader", 13, 10, 0
  89. msg_key: db "Checking Hardware Secure Key... OK", 13, 10, 0
  90. msg_drm: db "Loading DRM Module... OK", 13, 10, 0
  91. msg_kernel: db "Loading Kernel & Launching OS...", 13, 10, 0
  92. msg_err: db "Disk Error loading Stage 2!", 13, 10, 0
  93. boot_drive: db 0
  94. align 4
  95. dap:
  96. db 0x10 ; size of DAP
  97. db 0 ; zero
  98. dw 7 ; number of sectors to read
  99. dw 0x7E00 ; offset
  100. dw 0x0000 ; segment
  101. dq 34 ; LBA 34 (Stage 2 starts at sector 34 in hybrid GPT layout)
  102. times 446-($-$$) db 0
  103. ; Partition table placeholder (4 partitions * 16 bytes = 64 bytes)
  104. times 64 db 0
  105. ; Boot signature
  106. dw 0xAA55