diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 44bea7b25..82f5da798 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -659,18 +659,6 @@ fdc_seek(fdc_t *fdc, int drive, int params) } -void -fdc_implied_seek(fdc_t *fdc) -{ - if (fdc->config & 0x40) { - if (fdc->params[1] != fdc->pcn[fdc->params[0] & 3]) { - fdc_seek(fdc, fdc->drive, ((int) fdc->params[1]) - ((int) fdc->pcn[fdc->params[0] & 3])); - fdc->pcn[fdc->params[0] & 3] = fdc->params[1]; - } - } -} - - static void fdc_bad_command(fdc_t *fdc) { @@ -691,8 +679,15 @@ fdc_io_command_phase1(fdc_t *fdc, int out) fdc->eot[fdc->drive] = fdc->params[5]; fdc->gap = fdc->params[6]; fdc->dtl = fdc->params[7]; - fdc_implied_seek(fdc); fdc->rw_track = fdc->params[1]; + + if (fdc->config & 0x40) { + if (fdc->rw_track != fdc->pcn[fdc->params[0] & 3]) { + fdc_seek(fdc, fdc->drive, ((int) fdc->rw_track) - ((int) fdc->pcn[fdc->params[0] & 3])); + fdc->pcn[fdc->params[0] & 3] = fdc->rw_track; + } + } + ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1); fdc->stat = out ? 0x90 : 0x50; if ((fdc->flags & FDC_FLAG_PCJR) || !fdc->dma) @@ -965,7 +960,8 @@ fdc_write(uint16_t addr, uint8_t val, void *priv) if (!(fdc->flags & FDC_FLAG_NSC)) { fdc_bad_command(fdc); break; - } + } + /*FALLTHROUGH*/ case 0x10: /*Get version*/ case 0x14: /*Unlock*/ case 0x94: /*Lock*/ @@ -1714,10 +1710,10 @@ fdc_callback(void *priv) fdc->stat = 0xD0; fdc->st0 = fdc->res[4] = (fdd_get_head(real_drive(fdc, fdc->drive)) ? 4 : 0) | fdc->drive; fdc->res[5] = fdc->res[6] = 0; - fdc->res[7] = fdc->pcn[fdc->params[0] & 3]; - fdc->res[8] = fdd_get_head(real_drive(fdc, fdc->drive)); - fdc->res[9] = fdc->format_dat[fdc->pos - 2] + 1; - fdc->res[10] = fdc->params[4]; + fdc->res[7] = fdc->format_sector_id.id.c; + fdc->res[8] = fdc->format_sector_id.id.h; + fdc->res[9] = fdc->format_sector_id.id.r; + fdc->res[10] = fdc->format_sector_id.id.n; fdc->paramstogo = 7; fdc->format_state = 0; return; diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index ddcc515f0..26463da34 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -192,7 +192,6 @@ typedef struct { uint32_t index_hole_pos[2]; uint32_t track_offset[512]; uint32_t file_size; - sector_id_t format_sector_id; sector_id_t last_sector; sector_id_t req_sector; uint32_t index_count; @@ -1956,7 +1955,7 @@ d86f_format_track(int drive, int side, int do_write) data &= 0xff; if ((data == -1) && (dev->datac < 3)) data = 0; - dev->format_sector_id.byte_array[dev->datac] = data & 0xff; + d86f_fdc->format_sector_id.byte_array[dev->datac] = data & 0xff; if (dev->datac == 3) fdc_stop_id_request(d86f_fdc); } @@ -2001,11 +2000,11 @@ d86f_format_track(int drive, int side, int do_write) case FMT_SECTOR_ID: max_len = 4; if (do_write) { - d86f_write_direct(drive, side, dev->format_sector_id.byte_array[dev->datac], 0); - d86f_calccrc(dev, dev->format_sector_id.byte_array[dev->datac]); + d86f_write_direct(drive, side, d86f_fdc->format_sector_id.byte_array[dev->datac], 0); + d86f_calccrc(dev, d86f_fdc->format_sector_id.byte_array[dev->datac]); } else { if (dev->datac == 3) { - d86f_handler[drive].set_sector(drive, side, dev->format_sector_id.id.c, dev->format_sector_id.id.h, dev->format_sector_id.id.r, dev->format_sector_id.id.n); + d86f_handler[drive].set_sector(drive, side, d86f_fdc->format_sector_id.id.c, d86f_fdc->format_sector_id.id.h, d86f_fdc->format_sector_id.id.r, d86f_fdc->format_sector_id.id.n); } } break; @@ -2250,10 +2249,10 @@ d86f_turbo_format(int drive, int side, int nop) dat &= 0xff; if ((dat == -1) && (dev->datac < 3)) dat = 0; - dev->format_sector_id.byte_array[dev->datac] = dat & 0xff; + d86f_fdc->format_sector_id.byte_array[dev->datac] = dat & 0xff; if (dev->datac == 3) { fdc_stop_id_request(d86f_fdc); - d86f_handler[drive].set_sector(drive, side, dev->format_sector_id.id.c, dev->format_sector_id.id.h, dev->format_sector_id.id.r, dev->format_sector_id.id.n); + d86f_handler[drive].set_sector(drive, side, d86f_fdc->format_sector_id.id.c, d86f_fdc->format_sector_id.id.h, d86f_fdc->format_sector_id.id.r, d86f_fdc->format_sector_id.id.n); } } else if (dev->datac == 4) { if (! nop) { diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index 56249069b..441d28f2e 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -40,15 +40,15 @@ extern int fdc_type; typedef struct { uint8_t dor, stat, command, processed_cmd, dat, st0, swap; uint8_t swwp, disable_write; - uint8_t params[256], res[256]; - uint8_t specify[256], format_dat[256]; + uint8_t params[8], res[11]; + uint8_t specify[2]; uint8_t config, pretrk; uint8_t fifobuf[16]; uint16_t base_address; int head, sector, drive, lastdrive; - int pcn[4], eot[256]; + int pcn[4], eot[4]; int rw_track, pos; int pnum, ptot; int rate, reset_stat; @@ -82,11 +82,11 @@ typedef struct { int bit_rate; /* Should be 250 at start. */ int paramstogo; - sector_id_t read_track_sector; + sector_id_t read_track_sector, format_sector_id; - uint64_t watchdog_count; - - pc_timer_t timer, watchdog_timer; + uint64_t watchdog_count; + + pc_timer_t timer, watchdog_timer; } fdc_t;