From bbfc5d36af5329722a6f7dff5355b90a8ea8264e Mon Sep 17 00:00:00 2001 From: mintsuki Date: Sat, 1 Jun 2019 23:48:33 +0200 Subject: [PATCH] Adjustments to disk driver --- drivers/disk.c | 59 +++++++++++++++----------------------------------- drivers/disk.h | 5 +++-- 2 files changed, 20 insertions(+), 44 deletions(-) diff --git a/drivers/disk.c b/drivers/disk.c index 911ea89e..9c8d403e 100644 --- a/drivers/disk.c +++ b/drivers/disk.c @@ -1,70 +1,45 @@ #include #include #include -#include +#include #include #include -#define DAP_SIZE 16 #define SECTOR_SIZE 512 +static uint8_t sector_buf[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; -} + uint16_t size; + uint16_t count; + uint16_t offset; + uint16_t segment; + uint64_t lba; +} dap = { 16, 1, 0, 0, 0 }; static int check_results(struct rm_regs *out) { int ah = (out->eax >> 8) & 0xFF; - - if (ah) + + if (ah) print("Disk error %x\n", ah); return ah; -} +} + +int read_sector(int drive, int lba, int count, uint8_t *buffer) { + dap.offset = (uint16_t)(size_t)sector_buf; -int read_sector(int drive, int lba, int count, unsigned char *buffer) { while (count--) { - setup_dap(lba++, 1, sector_buf, 0); + dap.lba = lba++; 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)) + 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; } diff --git a/drivers/disk.h b/drivers/disk.h index 0fb0844c..90ac6799 100644 --- a/drivers/disk.h +++ b/drivers/disk.h @@ -1,7 +1,8 @@ #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); +#include + +int read_sector(int, int, int, uint8_t *); #endif