-
Notifications
You must be signed in to change notification settings - Fork 1
/
read-disk.asm
36 lines (28 loc) · 1.28 KB
/
read-disk.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
%ifndef READ_DISK_ASM_
%define READ_DISK_ASM_
; Load [2, 2 + DH) sectors into ES:BX from the drive DL. The
; first sector is skipped because it contains the boot sector
; that is loaded by BIOS.
load_disk_starting_second_sector:
push dx
mov ah, 0x02 ; Read sectors into memory BIOS function.
mov al, dh ; Read DH many sectors.
mov ch, 0x00 ; Start from the first cyclinder.
mov dh, 0x00 ; Start from the first head.
mov cl, 0x02 ; Start from the second sector. The image we
; are loading has the kernel code past the
; first sector (after the first 512 bytes).
int 0x13 ; Call BIOS's disk interrupt.
jc .error_reading_disk ; Carry-flag is set on error.
pop dx ; Original requested number of sectors.
cmp dh, al ; AL is set to the number of sectors transferred.
jne .error_reading_disk ; It's an error to not read all requested sectors.
ret
; Print an error message.
.error_reading_disk:
mov bx, .ERROR_MSG
call print_string
jmp $
.ERROR_MSG db 'Error reading the disk!', 0
%include 'print-string.asm'
%endif ; READ_DISK_ASM_