From 91070cb7388dc5a7f0460ba8043eb056b5883f3b Mon Sep 17 00:00:00 2001 From: sorgelig Date: Fri, 2 Oct 2020 22:36:02 +0800 Subject: [PATCH] ao486: support for mounting HDD and FDD images. --- support/x86/x86_ide.cpp | 51 +++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/support/x86/x86_ide.cpp b/support/x86/x86_ide.cpp index 5c95eb7..b990ba6 100644 --- a/support/x86/x86_ide.cpp +++ b/support/x86/x86_ide.cpp @@ -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)