Skip to content

Commit 4aa4701

Browse files
committed
Real mode load_sector to support 1MB ram
1 parent b9976a3 commit 4aa4701

File tree

4 files changed

+43
-26
lines changed

4 files changed

+43
-26
lines changed

src/drivers/disk/disk.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// written for protected mode
12
#include <lib/utils/logging.h>
23
#include <fuzzy/real_mode/client.h>
34

src/drivers/disk/disk.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
int load_sectors(unsigned int address,
3+
int load_sectors(unsigned int full_address,
44
unsigned char drive,
5-
unsigned int sector_index, // 1-based
5+
unsigned int lba, // 0-based
66
unsigned char count);

src/drivers/disk/disk_16.asm

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
11
[BITS 16]
22

3-
global _low_disk_read_sectors
3+
global _low_int_0x13
44

55
[SECTION .text]
6-
_low_disk_read_sectors:
6+
_low_int_0x13:
77
push ebp
88
mov ebp, esp
99
; callee save register
1010
push ebx
1111
push esi
1212
push edi
13+
push es
1314

1415
; check es
15-
mov ah, 0x02 ; (read sectors)
16-
mov al, [ebp + 0x8] ; (sector count)
17-
mov cx, [ebp + 0xc] ; (cylinder 10bit, sector 6bit)
18-
mov dx, [ebp + 0x10] ; (head, drive index)
19-
mov bx, [ebp + 0x14] ; (es:bx as write address)
20-
int 0x13
16+
mov ax, [ebp + 0x18] ; (es)
17+
mov es, ax
2118

22-
mov ah, 0x01 ; (get status of last drive operation)
19+
mov ax, [ebp + 0x08]
20+
mov bx, [ebp + 0x0C]
21+
mov cx, [ebp + 0x10]
22+
mov dx, [ebp + 0x14]
2323
int 0x13
24-
mov al, ah ; (result status code, 0 means no error)
25-
and eax, 0xFF
2624

25+
pop es
2726
pop edi
2827
pop esi
2928
pop ebx

src/drivers/disk/disk_16.c

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,35 @@
1-
extern int _low_disk_read_sectors(
2-
unsigned char count,
3-
unsigned short cylinder_sector, // 10 bit + 6bit
4-
unsigned short head_driveindex, // 8 bit + 8bit
5-
unsigned short memory_address);
1+
// written for real mode
62

7-
int load_sectors(unsigned int address,
3+
extern unsigned short _low_int_0x13(unsigned short ax,
4+
unsigned short bx,
5+
unsigned short cx,
6+
unsigned short dx,
7+
unsigned short es);
8+
9+
int load_sectors(unsigned int full_address,
810
unsigned char drive,
9-
unsigned int sector_index, // 0-based
11+
unsigned int lba, // 0-based
1012
unsigned char count) {
11-
int cylinder_head = (sector_index/63);
12-
sector_index = sector_index%63 + 1;
13-
_low_disk_read_sectors(
14-
count,
13+
int es = (full_address&0xF0000)>>4;
14+
int es_address = full_address&0xFFFF;
15+
int cylinder_head = (lba/63);
16+
int sector_index = lba%63 + 1;
17+
// https://en.wikipedia.org/wiki/INT_13H#INT_13h_AH=02h:_Read_Sectors_From_Drive
18+
_low_int_0x13(
19+
(0x02<<8) | count,
20+
es_address,
1521
((cylinder_head>>2)&0xFFC0) | (sector_index),
1622
((cylinder_head<<8)&0xFF00) | (drive),
17-
address);
18-
}
23+
es
24+
);
25+
// https://en.wikipedia.org/wiki/INT_13H#INT_13h_AH=01h:_Get_Status_of_Last_Drive_Operation
26+
unsigned short ax = _low_int_0x13(
27+
(0x01<<8),
28+
0,
29+
0,
30+
drive,
31+
0
32+
);
33+
int status = ax >> 8;
34+
return status;
35+
}

0 commit comments

Comments
 (0)