; haribote-ipl
; TAB=4
CYLS EQU 10
ORG 0x7c00
; 이하는 표준적인 FAT12 디스크를 위한 기술
JMP entry
DB 0x90
DB "CARDIABS" ; Bootsector name (8바이트)
DW 512 ; 1섹터 크기(512로 해야 함)
DB 1 ; 클러스터 크기(1섹터로 해야 함)
DW 1 ; FAT시작(보통은 1섹터부터)
DB 2 ; FAT 개수(2로 해야 함)
DW 224 ; 루트 디렉토리 영역의 크기(보통은 224엔트리로 한다)
DW 2880 ; 드라이브 크기(2880섹터로 해야 함)
DB 0xf0 ; 미디어 타입(0xf0로 해야 함)
DW 9 ; FAT영역의 길이(9섹터로 해야 함)
DW 18 ; 섹터(18로 해야 함)
DW 2 ; 헤드 수(2로 해야 함)
DD 0 ; 파티션을 사용하지 않기 때문에 여기는 반드시 0
DD 2880
DB 0,0,0x29
DD 0xffffffff
DB "CARDIAOS "
DB "FAT12 "
RESB 18
; 프로그램 본체
entry:
MOV AX, 0 ; 레지스터 초기화
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
; 디스크를 읽는다
MOV AX,0x0820
MOV ES,AX
MOV CH, 0 ; 실린더 0
MOV DH, 0 ; 헤드 0
MOV CL, 2 ; 섹터 2
readloop:
MOV SI, 0
retry:
MOV AH, 0x02 ; AH=0x02 : 디스크 read
MOV AL, 1 ; 1섹터
MOV BX,0
MOV DL, 0x00 ; A드라이브
INT 0x13
JNC next
ADD SI, 1
CMP SI, 5
JAE error
MOV AH,0x00
MOV DL, 0x00 ; A드라이브
INT 0x13
JMP retry
next:
MOV AX, ES
ADD AX,0x0020
MOV ES, AX
ADD CL, 1 ; CL에 1을 더한다
CMP CL, 18 ; CL와 18을 비교
JBE readloop ; CL <= 18 이라면 readloop에
MOV CL,1
ADD DH,1
CMP DH,2
JB readloop ; DH < 2 라면 readloop에
MOV DH,0
ADD CH,1
CMP CH,CYLS
JB readloop ; CH < CYLS 라면 readloop에
; 다 읽었지만 우선 할일이 없기 때문에 sleeve
fin:
HLT
JMP fin ; Endless Loop
error:
MOV AX,0
MOV ES,AX
MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI, 1
CMP AL,0
JE fin
MOV AH, 0x0e
MOV BX, 15
INT 0x10
JMP putloop
msg:
DB 0x0a, 0x0a
DB "load error"
DB 0x0a
DB 0
RESB 0x7dfe-$
DB 0x55, 0xaa