diff --git a/MiSTer.vcxproj b/MiSTer.vcxproj index fab4356..e906c7b 100644 --- a/MiSTer.vcxproj +++ b/MiSTer.vcxproj @@ -157,7 +157,6 @@ - diff --git a/MiSTer.vcxproj.filters b/MiSTer.vcxproj.filters index 43fcd88..0ca53cb 100644 --- a/MiSTer.vcxproj.filters +++ b/MiSTer.vcxproj.filters @@ -348,9 +348,6 @@ Header Files\support - - Header Files\support - Header Files\support diff --git a/ide.cpp b/ide.cpp index aa2719f..7559c66 100644 --- a/ide.cpp +++ b/ide.cpp @@ -13,7 +13,8 @@ #include #include "support/x86/x86.h" -#include "support/minimig/minimig_hdd_internal.h" +#include "support/minimig/minimig_hdd.h" +#include "support/minimig/minimig_config.h" #include "spi.h" #include "user_io.h" #include "file_io.h" @@ -42,6 +43,8 @@ #define ide_send_data(databuf, size) ide_sendbuf(ide, 255, (size), (uint16_t*)(databuf)) #define ide_recv_data(databuf, size) ide_recvbuf(ide, 255, (size), (uint16_t*)(databuf)) +#define SWAP(a) ((((a)&0x000000ff)<<24)|(((a)&0x0000ff00)<<8)|(((a)&0x00ff0000)>>8)|(((a)&0xff000000)>>24)) + void ide_reg_set(ide_config *ide, uint16_t reg, uint16_t value) { EnableIO(); @@ -179,9 +182,113 @@ void ide_set_regs(ide_config *ide) ide_sendbuf(ide, 0, 6, (uint16_t*)data); } +static void calc_geometry(chs_t *chs, uint64_t size) +{ + uint32_t head = 0, cyl = 0, spt = 0; + uint32_t sptt[] = { 63, 127, 255, 0 }; + uint32_t total = size / 512; + for (int i = 0; sptt[i] != 0; i++) + { + spt = sptt[i]; + for (head = 4; head <= 16; head++) + { + cyl = total / (head * spt); + if (total <= 1024 * 1024) + { + if (cyl <= 1023) break; + } + else + { + if (cyl < 16383) break; + if (cyl < 32767 && head >= 5) break; + if (cyl <= 65536) break; + } + } + if (head <= 16) break; + } + + chs->cylinders = cyl; + chs->heads = (uint16_t)head; + chs->sectors = (uint16_t)spt; +} + +static void get_rdb_geometry(RigidDiskBlock *rdb, chs_t *chs, uint64_t size) +{ + chs->heads = SWAP(rdb->rdb_Heads); + chs->sectors = SWAP(rdb->rdb_Sectors); + chs->cylinders = SWAP(rdb->rdb_Cylinders); + if (chs->sectors > 255 || chs->heads > 16) + { + printf("ATTN: Illegal CHS value(s)."); + if (!(chs->sectors & 1) && (chs->sectors < 512) && (chs->heads <= 8)) + { + printf(" Translate: sectors %d->%d, heads %d->%d.\n", chs->sectors, chs->sectors / 2, chs->heads, chs->heads * 2); + chs->sectors /= 2; + chs->heads *= 2; + return; + } + + printf(" DANGEROUS: Cannot translate to legal CHS values. Re-calculate the CHS.\n"); + calc_geometry(chs, size); + } +} + +static void guess_geometry(fileTYPE *f, chs_t *chs, int allow_vrdb) +{ + uint8_t flg = 0; + chs->offset = 0; + + for (int i = 0; i < 16; ++i) + { + struct RigidDiskBlock *rdb = (struct RigidDiskBlock *)ide_buf; + if (!FileReadSec(f, ide_buf)) break; + for (int i = 0; i < 512; i++) flg |= ide_buf[i]; + + if (rdb->rdb_ID == RDB_MAGIC) + { + printf("Found RDB header -> native Amiga image.\n"); + get_rdb_geometry(rdb, chs, f->size); + return; + } + } + + if (allow_vrdb && flg) + { + chs->heads = 16; + chs->sectors = 128; + + for (int i = 32; i <= 2048; i <<= 1) + { + int cylinders = f->size / (512 * i) + 1; + if (cylinders < 65536) + { + chs->sectors = (i < 128) ? i : 128; + chs->heads = i / chs->sectors; + break; + } + } + + int spc = chs->heads * chs->sectors; + chs->cylinders = f->size / (512 * spc) + 1; + if (chs->cylinders > 65535) chs->cylinders = 65535; + chs->offset = -spc; + printf("No RDB header found in HDF image. Assume it's image of single partition. Use Virtual RDB header.\n"); + } + else + { + calc_geometry(chs, f->size); + if(allow_vrdb) printf("No RDB header found. Possible non-Amiga or empty image.\n"); + } +} + static void ide_set_geometry(drive_t *drive, uint16_t sectors, uint16_t heads) { - printf("SPT=%d, Heads=%d\n", sectors, heads); + int info = 0; + if (drive->heads != heads || drive->spt != sectors) + { + info = 1; + printf("SPT=%d, Heads=%d\n", sectors, heads); + } drive->heads = heads ? heads : 16; drive->spt = sectors ? sectors : 256; @@ -196,11 +303,9 @@ static void ide_set_geometry(drive_t *drive, uint16_t sectors, uint16_t heads) //Maximum 137GB images are supported. drive->cylinders = cylinders; - printf("New SPT=%d, Heads=%d, Cylinders=%d\n", drive->spt, drive->heads, drive->cylinders); + if(info) printf("New SPT=%d, Heads=%d, Cylinders=%d\n", drive->spt, drive->heads, drive->cylinders); } -#define SWAP(a) ((((a)&0x000000ff)<<24)|(((a)&0x0000ff00)<<8)|(((a)&0x00ff0000)>>8)|(((a)&0xff000000)>>24)) - static uint32_t checksum_rdb(uint32_t *p, int set) { uint32_t count = SWAP(p[1]); @@ -958,3 +1063,49 @@ void ide_reset(uint8_t hotswap[4]) ide_inst[1].drive[0].allow_placeholder = hotswap[2]; ide_inst[1].drive[1].allow_placeholder = hotswap[3]; } + +int ide_open(uint8_t unit, const char* filename) +{ + static fileTYPE hdd_file[4] = {}; + chs_t chs = {}; + + if (!is_minimig() || ((minimig_config.ide_cfg & 1) && minimig_config.hardfile[unit].cfg)) + { + printf("\nChecking HDD %d\n", unit); + if (filename[0] && FileOpenEx(&hdd_file[unit], filename, FileCanWrite(filename) ? O_RDWR : O_RDONLY)) + { + printf("file: \"%s\": ", hdd_file[unit].name); + guess_geometry(&hdd_file[unit], &chs, is_minimig() && !strcasecmp(".hdf", filename + strlen(filename) - 4)); + printf("size: %llu (%llu MB)\n", hdd_file[unit].size, hdd_file[unit].size >> 20); + printf("CHS: %u/%u/%u", chs.cylinders, chs.heads, chs.sectors); + printf(" (%llu MB), ", ((((uint64_t)chs.cylinders) * chs.heads * chs.sectors) >> 11)); + printf("Offset: %d\n", chs.offset); + + int present = 0; + int cd = 0; + + int len = strlen(filename); + const char *ext = filename + len - 4; + int vhd = (len > 4 && (!strcasecmp(ext, ".hdf") || (!strcasecmp(ext, ".vhd")))); + + if (!vhd) + { + const char *img_name = cdrom_parse(unit, filename); + if (img_name) present = ide_img_mount(&hdd_file[unit], img_name, 0); + if (present) cd = 1; + else vhd = 1; + } + + if (!present && vhd) present = ide_img_mount(&hdd_file[unit], filename, 1); + ide_img_set(unit, present ? &hdd_file[unit] : 0, cd, chs.sectors, chs.heads, cd ? 0 : -chs.offset); + if (present) return 1; + } + + printf("HDD %d: not present\n", unit); + } + + // close if opened earlier. + ide_img_set(unit, 0, 0); + FileClose(&hdd_file[unit]); + return 0; +} diff --git a/ide.h b/ide.h index 339acd4..8aed6e0 100644 --- a/ide.h +++ b/ide.h @@ -32,7 +32,7 @@ #define IDE_STATE_WAIT_PKT_END 5 #define IDE_STATE_WAIT_PKT_MODE 6 -typedef struct +struct regs_t { uint8_t io_done; uint8_t io_fast; @@ -53,9 +53,9 @@ typedef struct uint8_t io_size; uint8_t error; uint8_t status; -} regs_t; +}; -typedef struct +struct track_t { char filename[1024]; uint32_t start; @@ -66,9 +66,9 @@ typedef struct uint8_t mode2; uint8_t number; int chd_offset; -} track_t; +}; -typedef struct +struct drive_t { fileTYPE *f; @@ -105,9 +105,9 @@ typedef struct uint32_t chd_last_partial_lba; uint16_t id[256]; -} drive_t; +}; -typedef struct +struct ide_config { uint32_t base; uint32_t bitoff; @@ -117,7 +117,15 @@ typedef struct regs_t regs; drive_t drive[2]; -} ide_config; +}; + +struct chs_t +{ + uint32_t sectors; + uint32_t heads; + uint32_t cylinders; + uint32_t offset; +}; #include "ide_cdrom.h" @@ -138,6 +146,7 @@ int ide_img_mount(fileTYPE *f, const char *name, int rw); void ide_img_set(uint32_t drvnum, fileTYPE *f, int cd, int sectors = 0, int heads = 0, int offset = 0, int type = 0); int ide_is_placeholder(int num); void ide_reset(uint8_t hotswap[4]); +int ide_open(uint8_t unit, const char* filename); void ide_io(int num, int req); diff --git a/menu.cpp b/menu.cpp index edc7732..a22b013 100644 --- a/menu.cpp +++ b/menu.cpp @@ -152,8 +152,6 @@ enum MENU MENU_MINIMIG_DISK1, MENU_MINIMIG_DISK2, MENU_MINIMIG_HDFFILE_SELECTED, - MENU_MINIMIG_HDFFILE_SELECTED2, - MENU_MINIMIG_HDFFILE_SELECTED3, MENU_MINIMIG_ADFFILE_SELECTED, MENU_MINIMIG_ROMFILE_SELECTED, MENU_MINIMIG_LOADCONFIG1, @@ -1001,8 +999,6 @@ void HandleUI(void) return; } - static struct RigidDiskBlock *rdb = nullptr; - static char opensave; static char ioctl_index; char *p; @@ -5504,62 +5500,10 @@ void HandleUI(void) if (ide_is_placeholder(num)) { - OpenHardfile(num); - menustate = MENU_MINIMIG_DISK1; + if (ide_check() & 0x8000) ide_open(num, minimig_config.hardfile[num].filename); + else OpenHardfile(num, minimig_config.hardfile[num].filename); } - else - { - menustate = checkHDF(minimig_config.hardfile[num].filename, &rdb) ? MENU_MINIMIG_DISK1 : MENU_MINIMIG_HDFFILE_SELECTED2; - } - } - break; - case MENU_MINIMIG_HDFFILE_SELECTED2: - m = 0; - menumask = 0x1; - if (!rdb) - { - OsdWrite(m++, "", 0, 0); - OsdWrite(m++, "", 0, 0); - OsdWrite(m++, "", 0, 0); - OsdWrite(m++, "", 0, 0); - OsdWrite(m++, "", 0, 0); - OsdWrite(m++, " Cannot open the file", 0, 0); - } - else - { - OsdWrite(m++, "", 0, 0); - OsdWrite(m++, " !! DANGEROUS !!", 0, 0); - OsdWrite(m++, "", 0, 0); - OsdWrite(m++, " RDB has illegal CHS values:", 0, 0); - sprintf(s, " Cylinders: %lu", rdb->rdb_Cylinders); - OsdWrite(m++, s, 0, 0); - sprintf(s, " Heads: %lu", rdb->rdb_Heads); - OsdWrite(m++, s, 0, 0); - sprintf(s, " Sectors: %lu", rdb->rdb_Sectors); - OsdWrite(m++, s, 0, 0); - OsdWrite(m++, "", 0, 0); - OsdWrite(m++, " Max legal values:", 0, 0); - OsdWrite(m++, " C:65536, H:16, S:255", 0, 0); - OsdWrite(m++, "", 0, 0); - OsdWrite(m++, " Something may not correctly", 0, 0); - OsdWrite(m++, " and may corrupt the data!", 0, 0); - OsdWrite(m++); - } - OsdWrite(m++, "", 0, 0); - OsdWrite(m++, " OK", 1, 0); - while (m < OsdGetSize()) OsdWrite(m++, "", 0, 0); - - menusub_last = menusub; - menusub = 0; - menustate = MENU_MINIMIG_HDFFILE_SELECTED3; - break; - - case MENU_MINIMIG_HDFFILE_SELECTED3: - if (select || menu) - { - menusub = menusub_last; - parentstate = menustate; menustate = MENU_MINIMIG_DISK1; } break; diff --git a/support/archie/archie.cpp b/support/archie/archie.cpp index a4edab3..f0c4a2f 100644 --- a/support/archie/archie.cpp +++ b/support/archie/archie.cpp @@ -9,6 +9,7 @@ #include "../../user_io.h" #include "../../input.h" #include "../../support.h" +#include "../../ide.h" #include "archie.h" #define CONFIG_FILENAME "ARCHIE.CFG" @@ -286,6 +287,11 @@ static void check_cmos(uint8_t cnt) } } +inline int hdd_open(int unit, char *filename) +{ + return (ide_check() & 0x8000) ? ide_open(unit, filename) : OpenHardfile(unit, filename); +} + void archie_init() { archie_debugf("init"); @@ -314,12 +320,12 @@ void archie_init() archie_set_60(archie_get_60()); archie_set_afix(archie_get_afix()); - if(!config.hdd_img[0][0] || !OpenHardfile(0, config.hdd_img[0])) + if (!config.hdd_img[0][0] || !hdd_open(0, config.hdd_img[0])) { memset(config.hdd_img[0], 0, sizeof(config.hdd_img[0])); } - if (!config.hdd_img[1][0] || !OpenHardfile(1, config.hdd_img[1])) + if (!config.hdd_img[1][0] || !hdd_open(1, config.hdd_img[1])) { memset(config.hdd_img[1], 0, sizeof(config.hdd_img[1])); } @@ -466,7 +472,11 @@ void archie_poll(void) EnableFpga(); uint16_t status = spi_w(0); DisableFpga(); - HandleHDD(status >> 8, 0); + + uint16_t sd_req = ide_check(); + if (sd_req & 0x8000) ide_io(0, sd_req & 7); + else HandleHDD(status >> 8, 0); + check_cmos(status); check_reset(); @@ -623,8 +633,5 @@ const char *archie_get_hdd_name(int i) void archie_hdd_mount(char *filename, int idx) { memset(config.hdd_img[idx], 0, sizeof(config.hdd_img[idx])); - if (OpenHardfile(idx, filename)) - { - strcpy(config.hdd_img[idx], filename); - } + if (hdd_open(idx, filename)) strcpy(config.hdd_img[idx], filename); } diff --git a/support/minimig/minimig_config.cpp b/support/minimig/minimig_config.cpp index 9e654c9..bdb2f77 100644 --- a/support/minimig/minimig_config.cpp +++ b/support/minimig/minimig_config.cpp @@ -297,6 +297,13 @@ const char* minimig_get_cfg_info(int num, int label) return ""; } +inline int hdd_open(int unit) +{ + return (ide_check() & 0x8000) ? + ide_open(unit, minimig_config.hardfile[unit].filename) : + OpenHardfile(unit, minimig_config.hardfile[unit].filename); +} + static int force_reload_kickstart = 0; static void ApplyConfiguration(char reloadkickstart) { @@ -342,7 +349,11 @@ static void ApplyConfiguration(char reloadkickstart) rstval = SPI_CPU_HLT; spi_uio_cmd8(UIO_MM2_RST, rstval); - spi_uio_cmd8(UIO_MM2_HDD, (minimig_config.ide_cfg & 0x21) | (OpenHardfile(0) ? 2 : 0) | (OpenHardfile(1) ? 4 : 0) | (OpenHardfile(2) ? 8 : 0) | (OpenHardfile(3) ? 16 : 0)); + spi_uio_cmd8(UIO_MM2_HDD, (minimig_config.ide_cfg & 0x21) | + (hdd_open(0) ? 2 : 0) | + (hdd_open(1) ? 4 : 0) | + (hdd_open(2) ? 8 : 0) | + (hdd_open(3) ? 16 : 0)); minimig_ConfigMemory(memcfg); minimig_ConfigCPU(minimig_config.cpu); diff --git a/support/minimig/minimig_hdd.cpp b/support/minimig/minimig_hdd.cpp index 8e7aa8e..0e632ea 100644 --- a/support/minimig/minimig_hdd.cpp +++ b/support/minimig/minimig_hdd.cpp @@ -738,74 +738,25 @@ uint8_t OpenHardfile(uint8_t unit, const char* filename) hdf->unit = unit; hdf->enabled = 0; - if (is_minimig()) + if (!is_minimig() || ((minimig_config.ide_cfg & 1) && minimig_config.hardfile[unit].cfg)) { - if ((minimig_config.ide_cfg & 1) && minimig_config.hardfile[unit].cfg) + printf("\nChecking HDD %d\n", hdf->unit); + if (filename[0] && FileOpenEx(&hdf->file, filename, FileCanWrite(filename) ? O_RDWR : O_RDONLY)) { - printf("\nChecking HDD %d\n", unit); - if (minimig_config.hardfile[unit].filename[0]) - { - if (FileOpenEx(&hdf->file, minimig_config.hardfile[unit].filename, FileCanWrite(minimig_config.hardfile[unit].filename) ? O_RDWR : O_RDONLY)) - { - hdf->enabled = 1; - printf("file: \"%s\": ", hdf->file.name); - SetHardfileGeometry(hdf, !strcasecmp(".hdf", minimig_config.hardfile[unit].filename + strlen(minimig_config.hardfile[unit].filename) - 4)); - printf("size: %llu (%llu MB)\n", hdf->file.size, hdf->file.size >> 20); - printf("CHS: %u/%u/%u", hdf->cylinders, hdf->heads, hdf->sectors); - printf(" (%llu MB), ", ((((uint64_t)hdf->cylinders) * hdf->heads * hdf->sectors) >> 11)); - printf("Offset: %d\n", hdf->offset); - - if (ide_check() & 0x8000) - { - int present = 0; - int cd = 0; - - int len = strlen(minimig_config.hardfile[unit].filename); - char *ext = minimig_config.hardfile[unit].filename + len - 4; - int vhd = (len > 4 && (!strcasecmp(ext, ".hdf") || (!strcasecmp(ext, ".vhd")))); - - if (!vhd) - { - const char *img_name = cdrom_parse(unit, minimig_config.hardfile[unit].filename); - if (img_name) present = ide_img_mount(&hdf->file, img_name, 0); - if (present) cd = 1; - else vhd = 1; - } - - if (!present && vhd) present = ide_img_mount(&hdf->file, minimig_config.hardfile[unit].filename, 1); - ide_img_set(unit, present ? &hdf->file : 0, cd, hdf->sectors, hdf->heads, cd ? 0 : -hdf->offset); - if (present) return 1; - } - else - { - return 1; - } - } - } - printf("HDD %d: not present\n", unit); - } - } - else - { - printf("\nChecking HDD %d\n", unit); - if (filename[0]) - { - if (FileOpenEx(&hdf->file, filename, FileCanWrite(filename) ? O_RDWR : O_RDONLY)) - { - hdf->enabled = 1; - printf("file: \"%s\": ", hdf->file.name); - SetHardfileGeometry(hdf, 0); - printf("size: %llu (%llu MB)\n", hdf->file.size, hdf->file.size >> 20); - printf("CHS: %u/%u/%u", hdf->cylinders, hdf->heads, hdf->sectors); - printf(" (%llu MB), ", ((((uint64_t)hdf->cylinders) * hdf->heads * hdf->sectors) >> 11)); - printf("Offset: %d\n", hdf->offset); - return 1; - } + hdf->enabled = 1; + printf("file: \"%s\": ", hdf->file.name); + SetHardfileGeometry(hdf, is_minimig() && !strcasecmp(".hdf", filename + strlen(filename) - 4)); + printf("size: %llu (%llu MB)\n", hdf->file.size, hdf->file.size >> 20); + printf("CHS: %u/%u/%u", hdf->cylinders, hdf->heads, hdf->sectors); + printf(" (%llu MB), ", ((((uint64_t)hdf->cylinders) * hdf->heads * hdf->sectors) >> 11)); + printf("Offset: %d\n", hdf->offset); + return 1; } + + printf("HDD %d: not present\n", hdf->unit); } // close if opened earlier. - if (is_minimig() && (ide_check() & 0x8000)) ide_img_set(unit, 0, 0); FileClose(&hdf->file); return 0; } diff --git a/support/minimig/minimig_hdd.h b/support/minimig/minimig_hdd.h index 68945ab..f697d16 100644 --- a/support/minimig/minimig_hdd.h +++ b/support/minimig/minimig_hdd.h @@ -3,11 +3,93 @@ #ifndef __MINIMIG_HDD_H__ #define __MINIMIG_HDD_H__ -#include "minimig_hdd_internal.h" +// Structure definitions for RDB emulation. +// For hardfiles that have no RDB information, we'll just create a single-partition RDB and Part block +// on blocks 0 and 1. All other blocks within the first cylinder will be translated into the hardfile + +#define RDB_MAGIC 0x4B534452 // "RDSK" + +struct RigidDiskBlock { + unsigned long rdb_ID; // "RDSK" + unsigned long rdb_Summedlongs; // 0x40 + long rdb_ChkSum; // Sum to zero + unsigned long rdb_HostID; // 0x07 + unsigned long rdb_BlockBytes; // 0x200 + unsigned long rdb_Flags; // 0x12 (Disk ID valid, no LUNs after this one) + unsigned long rdb_BadBlockList; // -1 since we don't provide one + unsigned long rdb_PartitionList; // 1 + unsigned long rdb_FileSysHeaderList; // -1 + unsigned long rdb_DriveInit; // -1 + unsigned long rdb_Reserved1[6]; // 0xffffffff + unsigned long rdb_Cylinders; + unsigned long rdb_Sectors; + unsigned long rdb_Heads; + unsigned long rdb_Interleave; // 1 + unsigned long rdb_Park; // =Cylinder count + unsigned long rdb_Reserved2[3]; + unsigned long rdb_WritePreComp; // High cylinder ? + unsigned long rdb_ReducedWrite; // High cylinder ? + unsigned long rdb_StepRate; // 3 ? + unsigned long rdb_Reserved3[5]; + unsigned long rdb_RDBBlocksLo; // block zero + unsigned long rdb_RDBBlocksHi; // block one + unsigned long rdb_LoCylinder; // 1 + unsigned long rdb_HiCylinder; // From the hardfile: cylinder count -1 + unsigned long rdb_CylBlocks; // From the hardfile: heads * sectors + unsigned long rdb_AutoParkSeconds; // zero + unsigned long rdb_HighRDSKBlock; // 1 + unsigned long rdb_Reserved4; + char rdb_DiskVendor[8]; // "Don't" + char rdb_DiskProduct[16]; // " repartition!" + char rdb_DiskRevision[4]; + char rdb_ControllerVendor[8]; + char rdb_ControllerProduct[16]; + char rdb_ControllerRevision[4]; + unsigned long rdb_Reserved5[10]; +} __attribute__((packed)); + +struct DosEnvec { + unsigned long de_TableSize; // Size of Environment vector - 0x10 + unsigned long de_SizeBlock; // in longwords - 0x80 + unsigned long de_SecOrg; // 0 + unsigned long de_Surfaces; // Heads? + unsigned long de_SectorPerBlock; // 1 + unsigned long de_BlocksPerTrack; + unsigned long de_Reserved; // 2 ? + unsigned long de_PreAlloc; // 0 + unsigned long de_Interleave; // 0 + unsigned long de_LowCyl; + unsigned long de_HighCyl; + unsigned long de_NumBuffers; // 30 + unsigned long de_BufMemType; // 0 - any available + unsigned long de_MaxTransfer; // 0x00ffffff + unsigned long de_Mask; // 0x7ffffffe + long de_BootPri; // 0 + unsigned long de_DosType; // 0x444f5301 or 3 + // Extra fields + unsigned long de_Baud; + unsigned long de_Control; + unsigned long de_BootBlocks; +} __attribute__((packed)); + +struct PartitionBlock { + unsigned long pb_ID; // "PART" + unsigned long pb_Summedlongs; // 0x40 + long pb_ChkSum; // Sum to zero + unsigned long pb_HostID; // 0x07 + unsigned long pb_Next; // -1 + unsigned long pb_Flags; // 1 - Bootable + unsigned long pb_Reserved1[2]; // 0 + unsigned long pb_DevFlags; // 0 + char pb_DriveName[32]; // 0x03"DH0" + unsigned long pb_Reserved2[15]; + DosEnvec pb_Environment; + unsigned long pb_EReserved[12]; // reserved for future environment vector +} __attribute__((packed)); // functions void HandleHDD(uint8_t c1, uint8_t c2); -uint8_t OpenHardfile(uint8_t unit, const char* filename = 0); +uint8_t OpenHardfile(uint8_t unit, const char* filename); int checkHDF(const char* name, struct RigidDiskBlock **rdb); #endif // __HDD_H__ diff --git a/support/minimig/minimig_hdd_internal.h b/support/minimig/minimig_hdd_internal.h deleted file mode 100644 index f8b67ec..0000000 --- a/support/minimig/minimig_hdd_internal.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef __MINIMIG_HDD_INTERNAL_H__ -#define __MINIMIG_HDD_INTERNAL_H__ - -// Structure definitions for RDB emulation. -// For hardfiles that have no RDB information, we'll just create a single-partition RDB and Part block -// on blocks 0 and 1. All other blocks within the first cylinder will be translated into the hardfile - -#define RDB_MAGIC 0x4B534452 // "RDSK" - -struct RigidDiskBlock { - unsigned long rdb_ID; // "RDSK" - unsigned long rdb_Summedlongs; // 0x40 - long rdb_ChkSum; // Sum to zero - unsigned long rdb_HostID; // 0x07 - unsigned long rdb_BlockBytes; // 0x200 - unsigned long rdb_Flags; // 0x12 (Disk ID valid, no LUNs after this one) - unsigned long rdb_BadBlockList; // -1 since we don't provide one - unsigned long rdb_PartitionList; // 1 - unsigned long rdb_FileSysHeaderList; // -1 - unsigned long rdb_DriveInit; // -1 - unsigned long rdb_Reserved1[6]; // 0xffffffff - unsigned long rdb_Cylinders; - unsigned long rdb_Sectors; - unsigned long rdb_Heads; - unsigned long rdb_Interleave; // 1 - unsigned long rdb_Park; // =Cylinder count - unsigned long rdb_Reserved2[3]; - unsigned long rdb_WritePreComp; // High cylinder ? - unsigned long rdb_ReducedWrite; // High cylinder ? - unsigned long rdb_StepRate; // 3 ? - unsigned long rdb_Reserved3[5]; - unsigned long rdb_RDBBlocksLo; // block zero - unsigned long rdb_RDBBlocksHi; // block one - unsigned long rdb_LoCylinder; // 1 - unsigned long rdb_HiCylinder; // From the hardfile: cylinder count -1 - unsigned long rdb_CylBlocks; // From the hardfile: heads * sectors - unsigned long rdb_AutoParkSeconds; // zero - unsigned long rdb_HighRDSKBlock; // 1 - unsigned long rdb_Reserved4; - char rdb_DiskVendor[8]; // "Don't" - char rdb_DiskProduct[16]; // " repartition!" - char rdb_DiskRevision[4]; - char rdb_ControllerVendor[8]; - char rdb_ControllerProduct[16]; - char rdb_ControllerRevision[4]; - unsigned long rdb_Reserved5[10]; -} __attribute__((packed)); - -struct DosEnvec { - unsigned long de_TableSize; // Size of Environment vector - 0x10 - unsigned long de_SizeBlock; // in longwords - 0x80 - unsigned long de_SecOrg; // 0 - unsigned long de_Surfaces; // Heads? - unsigned long de_SectorPerBlock; // 1 - unsigned long de_BlocksPerTrack; - unsigned long de_Reserved; // 2 ? - unsigned long de_PreAlloc; // 0 - unsigned long de_Interleave; // 0 - unsigned long de_LowCyl; - unsigned long de_HighCyl; - unsigned long de_NumBuffers; // 30 - unsigned long de_BufMemType; // 0 - any available - unsigned long de_MaxTransfer; // 0x00ffffff - unsigned long de_Mask; // 0x7ffffffe - long de_BootPri; // 0 - unsigned long de_DosType; // 0x444f5301 or 3 - // Extra fields - unsigned long de_Baud; - unsigned long de_Control; - unsigned long de_BootBlocks; -} __attribute__((packed)); - - -struct PartitionBlock { - unsigned long pb_ID; // "PART" - unsigned long pb_Summedlongs; // 0x40 - long pb_ChkSum; // Sum to zero - unsigned long pb_HostID; // 0x07 - unsigned long pb_Next; // -1 - unsigned long pb_Flags; // 1 - Bootable - unsigned long pb_Reserved1[2]; // 0 - unsigned long pb_DevFlags; // 0 - char pb_DriveName[32]; // 0x03"DH0" - unsigned long pb_Reserved2[15]; - struct DosEnvec pb_Environment; - unsigned long pb_EReserved[12]; /* reserved for future environment vector */ -} __attribute__((packed)); - -#endif /* HDD_INTERNAL_H */ -