;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;boot.asm;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[org 0h]
[bits 16]
;;;;;;;;;;;;;BPB SECTION;;;;;;;;;;;;
jmp 0x7c0:start
db 'MSWIN4.1'
dw 512
db 1
dw 1
db 2
dw 224
dw 2880
db 0xf0
dw 9
dw 18
dw 2
dd 0
dd 2880
db 0,0,0x29
dd 0xffffffff
db 'TAEHYUN-OS '
db 'FAT12 '
;;;;;;;;;; END BPB;;;;;;;;;;;;;;
;;;;;;;;;; Variable Area ;;;;;;;
StrA db 1,'Press ',24,' or ', 25,' Key to Continue...(Select the MENU)',2,19,0
ChrA db 'TaE HyUn', "'", 's OS - Booting',0
ChrB db 'TaE HyUn', "'", 's OS - Command',0
Successs db 10,10,10,13,'A20 Line enable',10,13,0
Fail db 10,10,10,13,' A20 Line disable',10,13,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;; Func Include ;;;;;;;;
%include 'func.inc'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start :
mov ax, cs
mov ds, ax
mov es, ax
mov fs, ax
xor ax, ax
mov ss, ax
call setvidmodetodefault
mov esi, StrA
call prints
mov di, 1
run :
call ret_cur
keyup :
call ret_cur
mov esi, ChrA
call prints
input :
xor ah, ah
int 16h
cmp ah, 72
je keyup
cmp ah, 80
je keydown
cmp ah, 28
je fin
keydown :
call ret_cur
mov esi, 67
mov di, 2
mov esi, ChrB
call prints
jmp input
fin :
call clear
read:
mov ax, 0x1000
mov es, ax
mov bx, 0
mov ah, 2
mov al, 1
mov ch, 0
mov cl, 2
mov dh, 0
mov dl, 0
int 0x13
jc read
enableA20 :
mov ax, 0x2401 ;;disable : mov ax, 0x2400
int 0x15
jc enableA20
getstatus :
mov ax, 0x2402
int 0x15
cmp al, 1
je Success
jne Failed
Success :
mov esi, Successs
call prints
jmp endstatus
Failed :
mov esi, Fail
call prints
jmp endstatus
endstatus :
jmp 0x1000:0000
times 510-($-$$) db 0 ; Fill up the file with zeros
dw 0AA55h ; Boot sector identifyer
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;kernel.asm;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[org 0h]
[bits 16]
jmp 0x1000:start
start :
mov ax, cs
mov ds, ax
mov es, ax
cli
lgdt [gdt_desc]
mov eax, cr0
or eax, 0x00000001
mov cr0, eax
jmp dword 0x08:Startt
[bits 32]
;;;;;;;;;; Variable Area ;;;;;;;
strA db "32BITS!!!!", 13, 10, 'WELCOME',13,10,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Startt:
mov bx, 0x10 ; 데이터 세그먼트 인덱스
mov ds, bx
mov es, bx
mov fs, bx
mov gs, bx
xor eax, eax
mov ax, 0x18 ; 비디오 세그먼트 인덱스
mov es, ax
xor edi, edi
mov esi, strA
call puts
jmp $
nop
nop
nop
gdt_desc: ; The GDT descriptor
dw gdt_end - gdt - 1 ; Limit (size)
dd gdt+0x10000 ; Address of the GDT
gdt: ; Address for the GDT
gdt_null: ; Null Segment
dd 0
dd 0
gdt_code: ; Code segment, read/execute, nonconforming
dw 0FFFFh
dw 0x0000
db 0x01
db 10011010b
db 11001111b
db 0
gdt_data: ; Data segment, read/write, expand down
dw 0FFFFh
dw 0x0000
db 0x01
db 10010010b
db 11001111b
db 0
gdt_video:
dd 0x8000FFFF, 0x0040920B
gdt_end: ; Used to calculate the size of the GDT
linef :
mov ax, di
add di, 160
inc si
jmp print_loop
carr :
xor dx, dx
mov ax, di
mov bx, 160
div bx
mul bx
mov di, ax
inc si
jmp print_loop
puts :
print_loop :
mov dl, [si]
cmp dl, 10 ;linefeed
je linef
cmp dl, 13 ;carriage return
je carr
cmp dl, 0
je endputs
mov byte[es:di], dl
inc di
mov byte[es:di], 0x06
inc di
inc si
jmp print_loop
endputs :
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
인터럽트를 사용하여 A20라인을 Enable 하고 문자열 출력하기.