Add simple disk library (#2)

* Simple disk library

* Simple disk library

* add rm_seg and rm_off

* Make interrupt call per 128 sectors

* Matching code style + some modifies

* change max count to 127 + slight modifies 

max count of sectors to make a call with is 127 instead of 128

* make setup_dap static

* Matching actual code style + slight modifies
This commit is contained in:
iiSaLMaN 2019-06-02 00:34:24 +03:00 committed by mint
parent 77572b0df4
commit 7506fcb820
3 changed files with 83 additions and 0 deletions

73
lib/disk.c Normal file
View File

@ -0,0 +1,73 @@
#include <stdint.h>
#include <stddef.h>
#include <lib/libc.h>
#include <lib/disk.h>
#include <lib/real.h>
#include <lib/print.h>
#define DAP_SIZE 16
#define SECTOR_SIZE 512
static struct {
unsigned short size;
unsigned short count;
unsigned short offset;
unsigned short segment;
unsigned long long lba;
} dap = { DAP_SIZE, 0, 0, 0, 0 };
static unsigned char sector_buf[512];
static inline void setup_dap(int lba, int count, int off, int seg) {
dap.lba = lba;
dap.count = count;
dap.offset = off;
dap.segment = seg;
}
static int check_results(struct rm_regs *out) {
int ah = (out->eax >> 8) & 0xFF;
if (ah)
print("Disk error %x\n", ah);
return ah;
}
int read_sector(int drive, int lba, int count, unsigned char *buffer) {
while (count--) {
setup_dap(lba++, 1, sector_buf, 0);
struct rm_regs r = {0};
r.eax = 0x4200;
r.edx = drive;
r.esi = (unsigned int)&dap;
rm_int(0x13, &r, &r);
if (check_results(&r))
return (r.eax >> 8) & 0xFF;
memcpy(buffer, sector_buf, SECTOR_SIZE);
buffer += SECTOR_SIZE;
}
return 0;
}
int write_sector(int drive, int lba, int count, const unsigned char *buffer) {
while (count--) {
memcpy(sector_buf, buffer, SECTOR_SIZE);
setup_dap(lba++, 1, sector_buf, 0);
struct rm_regs r = {0};
r.eax = 0x4300;
r.edx = drive;
r.esi = (unsigned int)&dap;
rm_int(0x13, &r, &r);
if (check_results(&r))
return (r.eax >> 8) & 0xFF;
buffer += SECTOR_SIZE;
}
return 0;
}

7
lib/disk.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef __DISK_H__
#define __DISK_H__
int read_sector(int drive, int lba, int count, unsigned char *buffer);
int write_sector(int drive, int lba, int count, unsigned char *buffer);
#endif

View File

@ -3,6 +3,9 @@
#include <stdint.h> #include <stdint.h>
#define rm_seg(x) (unsigned short)(((int)x & 0xFFFF0) >> 4)
#define rm_off(x) (unsigned short)(((int)x & 0x0000F) >> 0)
struct rm_regs { struct rm_regs {
uint32_t ebp; uint32_t ebp;
uint32_t edi; uint32_t edi;