On Sun, Dec 08, 2013 at 06:13:52PM +0100, Gelip wrote:
08.142: Booting from Floppy...
Can you try pulling down the latest code from my github testing banch and apply the patch below? (I think real hardware may require an explicit seek command when reading different cylinders.)
-Kevin
diff --git a/src/hw/floppy.c b/src/hw/floppy.c index 48958e6..84e59b6 100644 --- a/src/hw/floppy.c +++ b/src/hw/floppy.c @@ -320,6 +320,32 @@ floppy_select_drive(u8 floppyid) return DISK_RET_SUCCESS; }
+static int +floppy_seek(u8 floppyid, u8 cyl) +{ + dprintf(1, "Floppy seek %d to cyl %d\n", floppyid, cyl); + struct floppy_pio_s pio; + pio.cmdlen = 3; + pio.resplen = 0; + pio.waitirq = 1; + pio.data[0] = 0x0f; // 0f: Seek + pio.data[1] = floppyid; + pio.data[2] = cyl; + int ret = floppy_pio(&pio); + if (ret) + return ret; + + pio.cmdlen = 1; + pio.resplen = 2; + pio.waitirq = 0; + pio.data[0] = 0x08; // 08: Check Interrupt Status + ret = floppy_pio(&pio); + if (ret) + return ret; + + return DISK_RET_SUCCESS; +} +
/**************************************************************** * Floppy media sense @@ -464,6 +490,19 @@ floppy_cmd(struct disk_op_s *op, int blocksize, struct floppy_pio_s *pio) if (ret) return ret;
+ // XXX - seek + u8 floppyid = pio->data[1] & 1; + if (pio->data[0] == 0xe6 || pio->data[0] == 0xc5) { + u8 curcyl = GET_BDA(floppy_track[floppyid]); + u8 reqcyl = pio->data[2]; + if (curcyl != reqcyl) { + ret = floppy_seek(floppyid, reqcyl); + if (ret) + return ret; + set_diskette_current_cyl(floppyid, reqcyl); + } + } + // Setup DMA controller int isWrite = pio->data[0] != 0xe6; ret = dma_floppy((u32)op->buf_fl, op->count * blocksize, isWrite); @@ -471,7 +510,7 @@ floppy_cmd(struct disk_op_s *op, int blocksize, struct floppy_pio_s *pio) return DISK_RET_EBOUNDARY;
// Invoke floppy controller - ret = floppy_select_drive(pio->data[1] & 1); + ret = floppy_select_drive(floppyid); if (ret) return ret; pio->resplen = 7; @@ -495,7 +534,7 @@ floppy_cmd(struct disk_op_s *op, int blocksize, struct floppy_pio_s *pio) }
u8 track = (pio->cmdlen == 9 ? pio->data[3] : 0); - set_diskette_current_cyl(pio->data[0] & 1, track); + set_diskette_current_cyl(floppyid, track);
return DISK_RET_SUCCESS; }