Files
kernel-study/study/third/myboot.asm
T
2025-12-30 08:19:49 +00:00

123 lines
2.7 KiB
NASM

; mybios_boot.asm
[BITS 16]
[ORG 0x7C00] ; BIOS가 우리를 0x7C00에 로딩해줍니다.
start:
; 1. 세그먼트 초기화
xor ax, ax ; AX = 0
mov ds, ax ; DS = 0
mov es, ax ; ES = 0
mov ss, ax ; SS = 0
mov sp, 0x7C00 ; 스택 설정
; 2. 화면 초기화 (블루 스크린)
; BIOS가 이미 VGA를 텍스트 모드로 켜둔 상태입니다!
; 우리는 메모리에 색칠만 하면 됩니다.
mov ax, 0xB800
mov es, ax ; ES = 비디오 메모리 세그먼트
xor di, di ; DI = 0
mov cx, 2000 ; 80x25 = 2000 글자
mov ax, 0x1F20 ; 파란바탕(1F) + 공백(20)
rep stosw ; 화면 지우기
; 3. 메시지 출력
mov si, msg_title
mov di, 0
call print_vga
mov si, msg_menu
mov di, 160
call print_vga
; 4. 키보드 입력 대기
main_loop:
in al, 0x64
test al, 1
jz main_loop
in al, 0x60 ; 키보드 스캔코드 읽기
cmp al, 0x02 ; 키 '1'
je action_shutdown
cmp al, 0x03 ; 키 '2'
je action_reboot
jmp main_loop
; ===========================================================
; [Actions]
; ===========================================================
action_shutdown:
mov si, msg_bye
mov di, 320
call print_vga
; ACPI Shutdown (PIIX4) - 부트로더 상태에서도 똑같이 동작합니다.
mov dx, 0xCF8
mov eax, 0x80000B04
out dx, eax
mov dx, 0xCFC
mov eax, 0x0001
out dx, eax
mov dx, 0xCF8
mov eax, 0x80000B40
out dx, eax
mov dx, 0xCFC
mov eax, 0x0000B001
out dx, eax
mov dx, 0xCF8
mov eax, 0x80000B80
out dx, eax
mov dx, 0xCFC
mov eax, 0x00000001
out dx, eax
mov dx, 0xB004
mov ax, 0x2000
out dx, ax
hlt
jmp $
action_reboot:
mov si, msg_reboot
mov di, 320
call print_vga
mov dx, 0x64
mov al, 0xFE
out dx, al
hlt
jmp $
; ===========================================================
; [Drivers]
; ===========================================================
print_vga:
mov ah, 0x1F ; 파란색 속성 고정
.loop:
lodsb
cmp al, 0
je .done
stosw
jmp .loop
.done:
ret
; ===========================================================
; [Data]
; ===========================================================
msg_title db "=== SSH Curses Bootloader (Blue Screen) ===", 0
msg_menu db "Press [1] to Shutdown, [2] to Reboot", 0
msg_bye db "System Halted.", 0
msg_reboot db "Rebooting...", 0
; --- 부트 섹터 마법 (512바이트 맞추기) ---
times 510-($-$$) db 0 ; 510바이트까지 0으로 채움
dw 0xAA55 ; 부트 서명 (Boot Signature)