diff --git a/MiSTer.vcxproj b/MiSTer.vcxproj
index 124f50a..99918f3 100644
--- a/MiSTer.vcxproj
+++ b/MiSTer.vcxproj
@@ -94,7 +94,6 @@
-
diff --git a/MiSTer.vcxproj.filters b/MiSTer.vcxproj.filters
index d943fd8..b063fea 100644
--- a/MiSTer.vcxproj.filters
+++ b/MiSTer.vcxproj.filters
@@ -151,9 +151,6 @@
Source Files\support
-
- Source Files\support
-
Source Files\support
diff --git a/gamecontroller_db.cpp b/gamecontroller_db.cpp
index c171bd6..b84a0e9 100644
--- a/gamecontroller_db.cpp
+++ b/gamecontroller_db.cpp
@@ -514,7 +514,6 @@ static void gcdb_cache_controller_map(uint16_t bustype, uint16_t vid, uint16_t p
last_db_idx = (last_db_idx +1) % MAX_GCDB_ENTRIES;
}
-
bool gcdb_map_for_controller(uint16_t bustype, uint16_t vid, uint16_t pid, uint16_t version, int dev_fd, uint32_t *fill_map)
{
PROFILE_FUNCTION();
@@ -546,12 +545,3 @@ bool gcdb_map_for_controller(uint16_t bustype, uint16_t vid, uint16_t pid, uint1
}
return false;
}
-
-
-
-
-
-
-
-
-
diff --git a/menu.cpp b/menu.cpp
index 4acfe3c..ad4aa05 100644
--- a/menu.cpp
+++ b/menu.cpp
@@ -6118,8 +6118,7 @@ void HandleUI(void)
if (ide_is_placeholder(num))
{
- if (ide_check() & 0x8000) ide_open(num, minimig_config.hardfile[num].filename);
- else OpenHardfile(num, minimig_config.hardfile[num].filename);
+ ide_open(num, minimig_config.hardfile[num].filename);
}
menustate = MENU_MINIMIG_DISK1;
diff --git a/support.h b/support.h
index 521799d..a410756 100644
--- a/support.h
+++ b/support.h
@@ -2,7 +2,6 @@
#include "support/minimig/minimig_config.h"
#include "support/minimig/minimig_boot.h"
#include "support/minimig/minimig_fdd.h"
-#include "support/minimig/minimig_hdd.h"
#include "support/minimig/minimig_share.h"
// SharpMz support
diff --git a/support/archie/archie.cpp b/support/archie/archie.cpp
index d77379c..67b273b 100644
--- a/support/archie/archie.cpp
+++ b/support/archie/archie.cpp
@@ -289,7 +289,7 @@ 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);
+ return ide_open(unit, filename);
}
void archie_init()
@@ -474,12 +474,8 @@ void archie_poll(void)
DisableFpga();
uint16_t sd_req = ide_check();
- if (sd_req & 0x8000)
- {
- ide_io(0, sd_req & 7);
- if (sd_req & 0x0100) ide_cdda_send_sector();
- }
- else HandleHDD(status >> 8, 0);
+ ide_io(0, sd_req & 7);
+ if (sd_req & 0x0100) ide_cdda_send_sector();
check_cmos(status);
check_reset();
diff --git a/support/minimig/minimig_config.cpp b/support/minimig/minimig_config.cpp
index c7bd51d..86b83eb 100644
--- a/support/minimig/minimig_config.cpp
+++ b/support/minimig/minimig_config.cpp
@@ -15,7 +15,6 @@
#include "../../ide.h"
#include "minimig_boot.h"
#include "minimig_fdd.h"
-#include "minimig_hdd.h"
#include "minimig_config.h"
#include "minimig_share.h"
@@ -307,9 +306,7 @@ const char* minimig_get_cfg_info(int num, int label)
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);
+ return ide_open(unit, minimig_config.hardfile[unit].filename);
}
static int force_reload_kickstart = 0;
diff --git a/support/minimig/minimig_hdd.cpp b/support/minimig/minimig_hdd.cpp
deleted file mode 100644
index 0e632ea..0000000
--- a/support/minimig/minimig_hdd.cpp
+++ /dev/null
@@ -1,789 +0,0 @@
-/*
-Copyright 2008, 2009 Jakub Bednarski
-Copyright 2017, 2018 Sorgelig
-
-This file is part of Minimig
-
-Minimig is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3 of the License, or
-(at your option) any later version.
-
-Minimig is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see .
-*/
-
-// 2009-11-22 - read/write multiple implemented
-// 2018-05-13 - 4xIDE implemented
-// 2018-05-xx - Use RDB CHS values if valid
-// 2018-05-29 - LBA mode implemented
-
-#include
-#include
-#include "../../hardware.h"
-#include "../../file_io.h"
-#include "../../menu.h"
-#include "../../debug.h"
-#include "../../user_io.h"
-#include "../../ide.h"
-#include "minimig_hdd.h"
-#include "minimig_config.h"
-
-#define CMD_IDECMD 0x04
-#define CMD_IDEDAT 0x08
-
-#define CMD_IDE_REGS_RD 0x80
-#define CMD_IDE_REGS_WR 0x90
-#define CMD_IDE_DATA_WR 0xA0
-#define CMD_IDE_DATA_RD 0xB0
-#define CMD_IDE_STATUS_WR 0xF0
-
-#define IDE_STATUS_END 0x80
-#define IDE_STATUS_IRQ 0x10
-#define IDE_STATUS_RDY 0x08
-#define IDE_STATUS_REQ 0x04
-#define IDE_STATUS_ERR 0x01
-
-#define ACMD_RECALIBRATE 0x10
-#define ACMD_DIAGNOSTIC 0x90
-#define ACMD_IDENTIFY_DEVICE 0xEC
-#define ACMD_INITIALIZE_PARAMETERS 0x91
-#define ACMD_READ_SECTORS 0x20
-#define ACMD_WRITE_SECTORS 0x30
-#define ACMD_READ_MULTIPLE 0xC4
-#define ACMD_WRITE_MULTIPLE 0xC5
-#define ACMD_SET_MULTIPLE_MODE 0xC6
-
-#define SWAP(a) ((((a)&0x000000ff)<<24)|(((a)&0x0000ff00)<<8)|(((a)&0x00ff0000)>>8)|(((a)&0xff000000)>>24))
-#define SWAPW(a) ((((a)<<8)&0xff00)|(((a)>>8)&0x00ff))
-
-// hardfile structure
-typedef struct
-{
- int unit;
- int enabled;
- fileTYPE file;
- uint32_t cylinders;
- uint16_t heads;
- uint16_t sectors;
- uint16_t sectors_per_block;
- int32_t offset; // if a partition, the lba offset of the partition. Can be negative if we've synthesized an RDB.
-
- uint8_t lu;
- int32_t lba, nextlba;
- uint16_t sector;
- uint16_t cylinder;
- uint16_t head;
- uint16_t sector_count;
-} hdfTYPE;
-
-static hdfTYPE HDF[4] = {};
-static uint8_t sector_buffer[512];
-
-static void CalcGeometry(hdfTYPE *hdf)
-{
- uint32_t head = 0, cyl = 0, spt = 0;
- uint32_t sptt[] = { 63, 127, 255, 0 };
- uint32_t total = hdf->file.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;
- }
-
- hdf->cylinders = cyl;
- hdf->heads = (uint16_t)head;
- hdf->sectors = (uint16_t)spt;
-}
-
-static void GetRDBGeometry(hdfTYPE *hdf)
-{
- struct RigidDiskBlock *rdb = (struct RigidDiskBlock *)sector_buffer;
- hdf->heads = SWAP(rdb->rdb_Heads);
- hdf->sectors = SWAP(rdb->rdb_Sectors);
- hdf->cylinders = SWAP(rdb->rdb_Cylinders);
- if (hdf->sectors > 255 || hdf->heads > 16)
- {
- printf("ATTN: Illegal CHS value(s).");
- if (!(hdf->sectors & 1) && (hdf->sectors < 512) && (hdf->heads <= 8))
- {
- printf(" Translate: sectors %d->%d, heads %d->%d.\n", hdf->sectors, hdf->sectors / 2, hdf->heads, hdf->heads * 2);
- hdf->sectors /= 2;
- hdf->heads *= 2;
- return;
- }
-
- printf(" DANGEROUS: Cannot translate to legal CHS values. Re-calculate the CHS.\n");
- CalcGeometry(hdf);
- }
-}
-
-static void SetHardfileGeometry(hdfTYPE *hdf, int isHDF)
-{
- struct RigidDiskBlock *rdb = (struct RigidDiskBlock *)sector_buffer;
- uint8_t flg = 0;
-
- hdf->offset = 0;
-
- for (int i = 0; i<16; ++i)
- {
- if (!FileReadSec(&hdf->file, sector_buffer)) break;
- for (int i = 0; i < 512; i++) flg |= sector_buffer[i];
-
- if (rdb->rdb_ID == RDB_MAGIC)
- {
- printf("Found RDB header -> native Amiga image.\n");
- GetRDBGeometry(hdf);
- return;
- }
- }
-
- if (isHDF && flg)
- {
- hdf->heads = 16;
- hdf->sectors = 128;
-
- for (int i = 32; i <= 2048; i <<= 1)
- {
- int cylinders = hdf->file.size / (512 * i) + 1;
- if (cylinders < 65536)
- {
- hdf->sectors = (i < 128) ? i : 128;
- hdf->heads = i / hdf->sectors;
- break;
- }
- }
-
- int spc = hdf->heads * hdf->sectors;
- hdf->cylinders = hdf->file.size / (512 * spc) + 1;
- if (hdf->cylinders > 65535) hdf->cylinders = 65535;
- hdf->offset = -spc;
-
- printf("No RDB header found in HDF image. Assume it's image of single partition. Use Virtual RDB header.\n");
- }
- else
- {
- CalcGeometry(hdf);
- printf("No RDB header found. Possible non-Amiga or empty image.\n");
- }
-}
-
-static uint8_t GetDiskStatus(void)
-{
- uint8_t status;
-
- EnableFpga();
- status = (uint8_t)(spi_w(0) >> 8);
- spi_w(0);
- spi_w(0);
- DisableFpga();
-
- return status;
-}
-
-static uint32_t RDBChecksum(uint32_t *p, int set)
-{
- uint32_t count = SWAP(p[1]);
- uint32_t result = 0;
- if(set) p[2] = 0;
-
- for (uint32_t i = 0; ilba)
- {
- case 0: {
- // RDB
- struct RigidDiskBlock *rdb = (struct RigidDiskBlock *)sector_buffer;
- rdb->rdb_ID = 'R' << 24 | 'D' << 16 | 'S' << 8 | 'K';
- rdb->rdb_Summedlongs = 0x40;
- rdb->rdb_HostID = 0x07;
- rdb->rdb_BlockBytes = 0x200;
- rdb->rdb_Flags = 0x12; // (Disk ID valid, no LUNs after this one)
- rdb->rdb_BadBlockList = 0xffffffff; // We don't provide a bad block list
- rdb->rdb_PartitionList = 1;
- rdb->rdb_FileSysHeaderList = 0xffffffff;
- rdb->rdb_DriveInit = 0xffffffff;
- rdb->rdb_Reserved1[0] = 0xffffffff;
- rdb->rdb_Reserved1[1] = 0xffffffff;
- rdb->rdb_Reserved1[2] = 0xffffffff;
- rdb->rdb_Reserved1[3] = 0xffffffff;
- rdb->rdb_Reserved1[4] = 0xffffffff;
- rdb->rdb_Reserved1[5] = 0xffffffff;
- rdb->rdb_Cylinders = hdf->cylinders;
- rdb->rdb_Sectors = hdf->sectors;
- rdb->rdb_Heads = hdf->heads;
- rdb->rdb_Interleave = 1;
- rdb->rdb_Park = rdb->rdb_Cylinders;
- rdb->rdb_WritePreComp = rdb->rdb_Cylinders;
- rdb->rdb_ReducedWrite = rdb->rdb_Cylinders;
- rdb->rdb_StepRate = 3;
- rdb->rdb_RDBBlocksLo = 0;
- rdb->rdb_RDBBlocksHi = 1;
- rdb->rdb_LoCylinder = 1;
- rdb->rdb_HiCylinder = rdb->rdb_Cylinders - 1;
- rdb->rdb_CylBlocks = rdb->rdb_Heads * rdb->rdb_Sectors;
- rdb->rdb_AutoParkSeconds = 0;
- rdb->rdb_HighRDSKBlock = 1;
- strcpy(rdb->rdb_DiskVendor, "DON'T REPARTITION! 0.00");
- uint32_t *p = (uint32_t*)(sector_buffer);
- for (int i = 0; i < 40; i++) p[i] = SWAP(p[i]);
- RDBChecksum(p, 1);
- break;
- }
- case 1: {
- // Partition
- struct PartitionBlock *pb = (struct PartitionBlock *)sector_buffer;
- pb->pb_ID = 'P' << 24 | 'A' << 16 | 'R' << 8 | 'T';
- pb->pb_Summedlongs = 0x40;
- pb->pb_HostID = 0x07;
- pb->pb_Next = 0xffffffff;
- pb->pb_Flags = 0x1; // bootable
- pb->pb_DevFlags = 0;
- strcpy(pb->pb_DriveName, "0HD\003"); // "DHx" BCPL string
- pb->pb_DriveName[0] = hdf->unit + '0';
- pb->pb_Environment.de_TableSize = 0x10;
- pb->pb_Environment.de_SizeBlock = 0x80;
- pb->pb_Environment.de_Surfaces = hdf->heads;
- pb->pb_Environment.de_SectorPerBlock = 1;
- pb->pb_Environment.de_BlocksPerTrack = hdf->sectors;
- pb->pb_Environment.de_Reserved = 2;
- pb->pb_Environment.de_LowCyl = 1;
- pb->pb_Environment.de_HighCyl = hdf->cylinders - 1;
- pb->pb_Environment.de_NumBuffers = 30;
- pb->pb_Environment.de_MaxTransfer = 0xffffff;
- pb->pb_Environment.de_Mask = 0x7ffffffe;
- pb->pb_Environment.de_DosType = 0x444f5301;
- uint32_t *p = (uint32_t*)(sector_buffer);
- for (int i = 0; i < 64; i++) p[i] = SWAP(p[i]);
- RDBChecksum(p, 1);
- break;
- }
- }
-}
-
-// builds Identify Device struct
-static void IdentifyDevice(uint16_t *pBuffer, hdfTYPE *hdf)
-{
- char *p, x;
- int i;
- uint32_t total_sectors = hdf->cylinders * hdf->heads * hdf->sectors;
- memset(pBuffer, 0, 512);
-
- if(hdf->enabled)
- {
- pBuffer[0] = 1 << 6; // hard disk
- pBuffer[1] = hdf->cylinders; // cyl count
- pBuffer[3] = hdf->heads; // head count
- pBuffer[6] = hdf->sectors; // sectors per track
- // FIXME - can get serial no from card itself.
- memcpy((char*)&pBuffer[10], "MiniMigHardfile0000 ", 20); // serial number - byte swapped
- p = (char*)&pBuffer[27];
-
- if (hdf->offset < 0)
- {
- memcpy((char*)&pBuffer[23], ".000 ", 8); // firmware version - byte swapped
- memcpy(p, "DON'T REPARTITION! ", 40);
- }
- else
- {
- memcpy((char*)&pBuffer[23], ".100 ", 8); // firmware version - byte swapped
- memcpy(p, "MiSTer ", 40); // model name - byte swapped
- p += 8;
- char *s = strrchr(minimig_config.hardfile[hdf->unit].filename, '/');
- if (s) s++;
- else s = minimig_config.hardfile[hdf->unit].filename;
-
- i = strlen(s);
- if (i > 32) s += i - 32;
- for (i = 0; (x = s[i]) && i < 16; i++) p[i] = x; // copy file name as model name
- }
-
- p = (char*)&pBuffer[27];
- for (i = 0; i < 40; i += 2)
- {
- char c = p[i];
- p[i] = p[i + 1];
- p[i + 1] = c;
- }
- }
-
- pBuffer[47] = 0x8010; // maximum sectors per block in Read/Write Multiple command
- pBuffer[49] = 1<<9; // LBA support
- pBuffer[53] = 1;
- pBuffer[54] = hdf->cylinders;
- pBuffer[55] = hdf->heads;
- pBuffer[56] = hdf->sectors;
- pBuffer[57] = (uint16_t)total_sectors;
- pBuffer[58] = (uint16_t)(total_sectors >> 16);
- pBuffer[60] = (uint16_t)total_sectors;
- pBuffer[61] = (uint16_t)(total_sectors >> 16);
-}
-
-static void WriteTaskFile(uint8_t error, uint8_t sector_count, uint8_t sector_number, uint8_t cylinder_low, uint8_t cylinder_high, uint8_t drive_head)
-{
- EnableFpga();
-
- spi_w(CMD_IDE_REGS_WR<<8); // write task file registers command
- spi_w(0); // dummy
- spi_w(0); // dummy
-
- spi_w(0); // data (dummy)
- spi_w(error); // error
- spi_w(sector_count); // sector count
- spi_w(sector_number); // sector number
- spi_w(cylinder_low); // cylinder low
- spi_w(cylinder_high); // cylinder high
- spi_w(drive_head); // drive/head
-
- DisableFpga();
-}
-
-static void WriteStatus(uint8_t status)
-{
- EnableFpga();
- spi_w((CMD_IDE_STATUS_WR<<8) | status);
- spi_w(0);
- spi_w(0);
- DisableFpga();
-}
-
-static void ATA_Recalibrate(uint8_t* tfr, hdfTYPE *hdf)
-{
- // Recalibrate 0x10-0x1F (class 3 command: no data)
- (void)hdf;
- hdd_debugf("IDE%d: Recalibrate", hdf->unit);
- WriteTaskFile(0, 0, tfr[6] & 0x40 ? 0 : 1, 0, 0, tfr[6] & 0xF0);
- WriteStatus(IDE_STATUS_END | IDE_STATUS_IRQ);
-}
-
-static void ATA_Diagnostic(uint8_t* tfr, hdfTYPE *hdf)
-{
- // Execute Drive Diagnostic (0x90)
- (void)hdf;
- (void)tfr;
- hdd_debugf("IDE: Drive Diagnostic");
- WriteTaskFile(1, 0, 0, 0, 0, 0);
- WriteStatus(IDE_STATUS_END | IDE_STATUS_IRQ);
-}
-
-static void ATA_IdentifyDevice(uint8_t* tfr, hdfTYPE *hdf)
-{
- // Identify Device (0xec)
- hdd_debugf("IDE%d: Identify Device", hdf->unit);
- IdentifyDevice((uint16_t*)sector_buffer, hdf);
- WriteTaskFile(0, tfr[2], tfr[3], tfr[4], tfr[5], tfr[6]);
- WriteStatus(IDE_STATUS_RDY); // pio in (class 1) command type
- EnableFpga();
- fpga_spi_fast(CMD_IDE_DATA_WR<<8); // write data command
- fpga_spi_fast(0);
- fpga_spi_fast(0);
- if(is_minimig()) fpga_spi_fast_block_write_be((uint16_t*)sector_buffer, 256);
- else fpga_spi_fast_block_write((uint16_t*)sector_buffer, 256);
- DisableFpga();
- WriteStatus(IDE_STATUS_END | IDE_STATUS_IRQ);
-}
-
-static void ATA_Initialize(uint8_t* tfr, hdfTYPE *hdf)
-{
- // Initialize Device Parameters (0x91)
- (void)hdf;
- hdd_debugf("Initialize Device Parameters");
- hdd_debugf("IDE%d: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X", hdf->unit, tfr[0], tfr[1], tfr[2], tfr[3], tfr[4], tfr[5], tfr[6], tfr[7]);
- WriteTaskFile(0, tfr[2], tfr[3], tfr[4], tfr[5], tfr[6]);
- WriteStatus(IDE_STATUS_END | IDE_STATUS_IRQ);
-}
-
-static void ATA_SetMultipleMode(uint8_t* tfr, hdfTYPE *hdf)
-{
- // Set Multiple Mode (0xc6)
- hdd_debugf("Set Multiple Mode");
- hdd_debugf("IDE%d: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X", hdf->unit, tfr[0], tfr[1], tfr[2], tfr[3], tfr[4], tfr[5], tfr[6], tfr[7]);
- hdf->sectors_per_block = tfr[2];
- WriteStatus(IDE_STATUS_END | IDE_STATUS_IRQ);
-}
-
-static int Preface(uint8_t* tfr, hdfTYPE *hdf)
-{
- hdf->sector = tfr[3];
- hdf->cylinder = tfr[4] | (tfr[5] << 8);
- hdf->head = tfr[6] & 0x0F;
- hdf->lu = tfr[6] & 0xF0;
- hdf->sector_count = tfr[2];
- if (hdf->sector_count == 0) hdf->sector_count = 256;
-
- uint8_t uselba = hdf->lu & 0x40;
-
- if (uselba)
- {
- hdf->lba = (hdf->head << 24) | (hdf->cylinder << 8) | hdf->sector;
- }
- else
- {
- hdf->lba = hdf->cylinder;
- hdf->lba *= hdf->heads;
- hdf->lba += hdf->head;
- hdf->lba *= hdf->sectors;
- hdf->lba += hdf->sector - 1;
- }
-
- //printf("setCHS: %s: %d,%d,%d -> %d\n", uselba ? "LBA" : "CHS", hdf->cylinder, hdf->head, hdf->sector, hdf->lba);
- hdf->nextlba = hdf->lba;
-
- if (hdf->enabled && hdf->lba >= 0 && hdf->file.size)
- {
- FileSeekLBA(&hdf->file, (hdf->lba + hdf->offset) < 0 ? 0 : hdf->lba + hdf->offset);
- return 1;
- }
-
- return 0;
-}
-
-static void nextCHS(hdfTYPE *hdf)
-{
- // do not increment after last sector
- if (hdf->sector_count)
- {
- hdf->nextlba++;
- if (hdf->lu & 0x40)
- {
- hdf->sector = (uint8_t)hdf->nextlba;
- hdf->cylinder = (uint16_t)(hdf->nextlba >> 8);
- hdf->head = 0xF & (uint8_t)(hdf->nextlba >> 24);
- }
- else
- {
- if (hdf->sector == hdf->sectors)
- {
- hdf->sector = 1;
- hdf->head++;
- if (hdf->head == hdf->heads)
- {
- hdf->head = 0;
- hdf->cylinder++;
- }
- }
- else
- {
- hdf->sector++;
- }
- }
- }
-}
-
-static void updateTaskFile(hdfTYPE *hdf)
-{
- WriteTaskFile(0, hdf->sector_count, hdf->sector, (uint8_t)hdf->cylinder, (uint8_t)(hdf->cylinder >> 8), (uint8_t)(hdf->lu | hdf->head));
-}
-
-static void ReadSector(hdfTYPE *hdf)
-{
- // sector outside limit (fake rdb header)
- if ((hdf->lba + hdf->offset) < 0)
- FakeRDB(hdf);
- else
- FileReadSec(&hdf->file, sector_buffer);
-}
-
-static void SendSector()
-{
- EnableFpga();
- fpga_spi_fast(CMD_IDE_DATA_WR << 8); // write data command
- fpga_spi_fast(0);
- fpga_spi_fast(0);
- if (is_minimig()) fpga_spi_fast_block_write_be((uint16_t*)sector_buffer, 256);
- else fpga_spi_fast_block_write((uint16_t*)sector_buffer, 256);
- DisableFpga();
-}
-
-static void RecvSector()
-{
- EnableFpga();
- fpga_spi_fast(CMD_IDE_DATA_RD << 8); // read data command
- fpga_spi_fast(0);
- fpga_spi_fast(0);
- if (is_minimig()) fpga_spi_fast_block_read_be((uint16_t*)sector_buffer, 256);
- else fpga_spi_fast_block_read((uint16_t*)sector_buffer, 256);
- DisableFpga();
-}
-
-static void WriteSector(hdfTYPE *hdf)
-{
- //Do not write to fake RDB header
- if ((hdf->lba + hdf->offset) < 0) return;
-
- //Write RDB header, grab the CHS!
- if (!hdf->offset && hdf->lba < 16 && (*(uint32_t*)sector_buffer) == RDB_MAGIC)
- {
- printf("Writing RDB header, LBA=%d: ", hdf->lba);
- uint32_t sum = RDBChecksum((uint32_t*)sector_buffer, 0);
- if (sum)
- {
- printf("Checksumm is incorrect(0x%08X)! Ignore the RDB parameters.\n", sum);
- }
- else
- {
- GetRDBGeometry(hdf);
- printf("Using new CHS: %u/%u/%u (%llu MB)\n", hdf->cylinders, hdf->heads, hdf->sectors, ((((uint64_t)hdf->cylinders) * hdf->heads * hdf->sectors) >> 11));
- }
- }
- FileWriteSec(&hdf->file, sector_buffer);
-}
-
-// Read Sectors (0x20)
-static void ATA_ReadSectors(uint8_t* tfr, hdfTYPE *hdf)
-{
- WriteStatus(IDE_STATUS_RDY); // pio in (class 1) command type
-
- if(Preface(tfr, hdf))
- {
- while (hdf->sector_count)
- {
- while (!(GetDiskStatus() & CMD_IDECMD)); // wait for empty sector buffer
- WriteStatus(IDE_STATUS_IRQ);
-
- ReadSector(hdf);
-
- // to be modified sector of first partition
- if (!hdf->unit && !hdf->lba)
- {
- struct RigidDiskBlock *rdb = (struct RigidDiskBlock *)sector_buffer;
- if (rdb->rdb_ID == RDB_MAGIC)
- {
- // adjust checksum by the difference between old and new flag value
- rdb->rdb_ChkSum = SWAP(SWAP(rdb->rdb_ChkSum) + SWAP(rdb->rdb_Flags) - 0x12);
- rdb->rdb_Flags = SWAP(0x12);
- }
- }
- SendSector();
-
- hdf->lba++;
- hdf->sector_count--;
- nextCHS(hdf);
- updateTaskFile(hdf);
- }
- }
- WriteStatus(IDE_STATUS_END);
-}
-
-// multiple sector transfer per IRQ
-static void ATA_ReadMultiple(uint8_t* tfr, hdfTYPE *hdf)
-{
- WriteStatus(IDE_STATUS_RDY); // pio in (class 1) command type
-
- if (Preface(tfr, hdf))
- {
- while (hdf->sector_count)
- {
- while (!(GetDiskStatus() & CMD_IDECMD)); // wait for empty sector buffer
- uint16_t block_count = hdf->sector_count;
- if (block_count > hdf->sectors_per_block) block_count = hdf->sectors_per_block;
- WriteStatus(IDE_STATUS_IRQ);
- while (block_count--)
- {
- ReadSector(hdf);
- SendSector();
-
- hdf->lba++;
- hdf->sector_count--;
- nextCHS(hdf);
- }
- updateTaskFile(hdf);
- }
- }
- WriteStatus(IDE_STATUS_END);
-}
-
-static void ATA_WriteSectors(uint8_t* tfr, hdfTYPE *hdf)
-{
- WriteStatus(IDE_STATUS_REQ); // pio out (class 2) command type
-
- if (Preface(tfr, hdf))
- {
- hdf->lba += hdf->offset;
- while (hdf->sector_count)
- {
- while (!(GetDiskStatus() & CMD_IDEDAT)); // wait for full write buffer
-
- RecvSector();
- hdf->sector_count--;
-
- nextCHS(hdf);
- updateTaskFile(hdf);
- WriteStatus(hdf->sector_count ? IDE_STATUS_IRQ : IDE_STATUS_END | IDE_STATUS_IRQ);
-
- WriteSector(hdf);
- hdf->lba++;
- }
- }
-}
-
-static void ATA_WriteMultiple(uint8_t* tfr, hdfTYPE *hdf)
-{
- WriteStatus(IDE_STATUS_REQ); // pio out (class 2) command type
-
- if (Preface(tfr, hdf))
- {
- hdf->lba += hdf->offset;
- while (hdf->sector_count)
- {
- uint16_t block_count = hdf->sector_count;
- if (block_count > hdf->sectors_per_block) block_count = hdf->sectors_per_block;
- while (block_count)
- {
- while (!(GetDiskStatus() & CMD_IDEDAT)); // wait for full write buffer
-
- RecvSector();
- WriteSector(hdf);
- hdf->lba++;
-
- block_count--;
- hdf->sector_count--;
- nextCHS(hdf);
- }
- updateTaskFile(hdf);
- WriteStatus(hdf->sector_count ? IDE_STATUS_IRQ : IDE_STATUS_END | IDE_STATUS_IRQ);
- }
- }
-}
-
-void HandleHDD(uint8_t c1, uint8_t c2)
-{
- (void)c2;
-
- if (c1 & CMD_IDECMD)
- {
- uint8_t unit = 0;
- uint8_t tfr[8];
- DISKLED_ON;
-
- EnableFpga();
- spi_w(CMD_IDE_REGS_RD<<8); // read task file registers
- spi_w(0);
- spi_w(0);
-
- for (int i = 0; i < 8; i++)
- {
- uint16_t tmp = spi_w(0);
- tfr[i] = (uint8_t)tmp;
- if (i == 6) unit = ((tmp >> 7) & 2) | ((tmp >> 4) & 1);
- }
- DisableFpga();
-
- //printf("IDE%d: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X\n", unit, tfr[0], tfr[1], tfr[2], tfr[3], tfr[4], tfr[5], tfr[6], tfr[7]);
- hdfTYPE *hdf = &HDF[unit];
-
- if (hdf->enabled)
- {
- if ((tfr[7] & 0xF0) == ACMD_RECALIBRATE) ATA_Recalibrate (tfr, hdf);
- else if (tfr[7] == ACMD_DIAGNOSTIC) ATA_Diagnostic (tfr, hdf);
- else if (tfr[7] == ACMD_IDENTIFY_DEVICE) ATA_IdentifyDevice (tfr, hdf);
- else if (tfr[7] == ACMD_INITIALIZE_PARAMETERS) ATA_Initialize (tfr, hdf);
- else if (tfr[7] == ACMD_SET_MULTIPLE_MODE) ATA_SetMultipleMode (tfr, hdf);
- else if (tfr[7] == ACMD_READ_SECTORS) ATA_ReadSectors (tfr, hdf);
- else if (tfr[7] == ACMD_READ_MULTIPLE) ATA_ReadMultiple (tfr, hdf);
- else if (tfr[7] == ACMD_WRITE_SECTORS) ATA_WriteSectors (tfr, hdf);
- else if (tfr[7] == ACMD_WRITE_MULTIPLE) ATA_WriteMultiple (tfr, hdf);
- else
- {
- printf("Unknown ATA command: IDE%d: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X\n", unit, tfr[0], tfr[1], tfr[2], tfr[3], tfr[4], tfr[5], tfr[6], tfr[7]);
- WriteTaskFile(0x04, tfr[2], tfr[3], tfr[4], tfr[5], tfr[6]);
- WriteStatus(IDE_STATUS_END | IDE_STATUS_IRQ | IDE_STATUS_ERR);
- }
- }
- else
- {
- printf("IDE%d not enabled: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X\n", unit, tfr[0], tfr[1], tfr[2], tfr[3], tfr[4], tfr[5], tfr[6], tfr[7]);
- WriteTaskFile(0x04, tfr[2], tfr[3], tfr[4], tfr[5], tfr[6]);
- WriteStatus(IDE_STATUS_END | IDE_STATUS_IRQ | IDE_STATUS_ERR);
- }
- DISKLED_OFF;
- }
-}
-
-uint8_t OpenHardfile(uint8_t unit, const char* filename)
-{
- hdfTYPE *hdf = &HDF[unit];
- hdf->unit = unit;
- hdf->enabled = 0;
-
- if (!is_minimig() || ((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))
- {
- 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.
- FileClose(&hdf->file);
- return 0;
-}
-
-int checkHDF(const char* name, struct RigidDiskBlock **rdb)
-{
- fileTYPE file = {};
-
- *rdb = NULL;
- if (FileOpenEx(&file, name, O_RDONLY))
- {
- *rdb = (struct RigidDiskBlock *)sector_buffer;
- for (int i = 0; i<16; ++i)
- {
- if (!FileReadSec(&file, sector_buffer)) break;
- if ((*rdb)->rdb_ID == RDB_MAGIC)
- {
- FileClose(&file);
- (*rdb)->rdb_Heads = SWAP((*rdb)->rdb_Heads);
- (*rdb)->rdb_Sectors = SWAP((*rdb)->rdb_Sectors);
- (*rdb)->rdb_Cylinders = SWAP((*rdb)->rdb_Cylinders);
- return ((*rdb)->rdb_Heads <= 16 && (*rdb)->rdb_Sectors <= 255 && (*rdb)->rdb_Cylinders <= 65536);
- }
- }
-
- FileClose(&file);
- return 1; // non-HDF file
- }
- return 0;
-}
\ No newline at end of file
diff --git a/support/minimig/minimig_hdd.h b/support/minimig/minimig_hdd.h
index f697d16..a372381 100644
--- a/support/minimig/minimig_hdd.h
+++ b/support/minimig/minimig_hdd.h
@@ -87,9 +87,4 @@ struct PartitionBlock {
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);
-int checkHDF(const char* name, struct RigidDiskBlock **rdb);
-
#endif // __HDD_H__
diff --git a/user_io.cpp b/user_io.cpp
index 3c82977..2192070 100644
--- a/user_io.cpp
+++ b/user_io.cpp
@@ -2887,16 +2887,9 @@ void user_io_poll()
sysled_enable(1);
uint16_t sd_req = ide_check();
- if (sd_req & 0x8000)
- {
- ide_io(0, sd_req & 7);
- ide_io(1, (sd_req >> 3) & 7);
- if (sd_req & 0x0100) ide_cdda_send_sector();
- }
- else
- {
- HandleHDD(c1, c2);
- }
+ ide_io(0, sd_req & 7);
+ ide_io(1, (sd_req >> 3) & 7);
+ if (sd_req & 0x0100) ide_cdda_send_sector();
UpdateDriveStatus();
kbd_fifo_poll();