ao486: support for mounting HDD and FDD images.

This commit is contained in:
sorgelig
2020-10-02 22:36:02 +08:00
parent 84487caf9c
commit 91070cb738

View File

@@ -427,10 +427,15 @@ static void prep_write(ide_config *ide)
if (ide->state == IDE_STATE_INIT_RW)
{
uint32_t lba = ide->regs.sector | (ide->regs.cylinder << 8) | (ide->regs.head << 24);
//printf("Write to LBA: %d\n", lba);
ide->null = !FileSeekLBA(ide->drive[ide->regs.drv].f, lba);
ide->regs.status &= ~ATA_STATUS_IRQ;
ide->null = 1;
if (ide->regs.cmd != 0xFA)
{
uint32_t lba = ide->regs.sector | (ide->regs.cylinder << 8) | (ide->regs.head << 24);
//printf("Write to LBA: %d\n", lba);
ide->null = !FileSeekLBA(ide->drive[ide->regs.drv].f, lba);
}
}
ide->state = IDE_STATE_WAIT_WR;
@@ -441,24 +446,29 @@ static void prep_write(ide_config *ide)
static void process_write(ide_config *ide)
{
ide_recv_data(ide_buf, ide->prepcnt * 128);
if (!ide->null) ide->null = (FileWriteAdv(ide->drive[ide->regs.drv].f, ide_buf, ide->prepcnt * 512, -1) <= 0);
uint32_t lba = ide->regs.sector | (ide->regs.cylinder << 8) | (ide->regs.head << 24);
lba += ide->prepcnt;
ide->regs.sector_count -= ide->prepcnt;
ide->regs.sector = lba;
lba >>= 8;
ide->regs.cylinder = lba;
lba >>= 16;
ide->regs.head = lba & 0xF;
if (ide->regs.cmd == 0xFA)
{
ide->regs.sector_count = 0;
char* filename = user_io_make_filepath(HomeDir(), (char*)ide_buf);
printf("Request for new image for drive %d: %s\n", ide->drive[ide->regs.drv].drvnum, filename);
x86_set_image(ide->drive[ide->regs.drv].drvnum + 2, filename);
int drvnum = (ide->regs.head == 1) ? 0 : (ide->regs.head == 2) ? 1 : (ide->drive[ide->regs.drv].drvnum + 2);
static const char* names[6] = { "fdd0", "fdd1", "ide00", "ide01", "ide10", "ide11" };
printf("Request for new image for drive %s: %s\n", names[drvnum], filename);
x86_set_image(drvnum, filename);
}
else
{
if (!ide->null) ide->null = (FileWriteAdv(ide->drive[ide->regs.drv].f, ide_buf, ide->prepcnt * 512, -1) <= 0);
uint32_t lba = ide->regs.sector | (ide->regs.cylinder << 8) | (ide->regs.head << 24);
lba += ide->prepcnt;
ide->regs.sector_count -= ide->prepcnt;
ide->regs.sector = lba;
lba >>= 8;
ide->regs.cylinder = lba;
lba >>= 16;
ide->regs.head = lba & 0xF;
}
}
@@ -511,6 +521,13 @@ static int handle_hdd(ide_config *ide)
}
break;
case 0xFA: // mount image
{
ide->state = IDE_STATE_INIT_RW;
prep_write(ide);
}
break;
case 0xC6: // set multople
{
if (!ide->regs.sector_count || ide->regs.sector_count > ide_io_max_size)