; 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


이것으로 기본적인 부팅이 가능 - _-)

+ Recent posts