; 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)