Minor FDC changes.

This commit is contained in:
OBattler
2020-06-20 22:34:51 +02:00
parent e7b2f29a9a
commit 4563ce7822
3 changed files with 27 additions and 32 deletions

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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;