Minor FDC changes.
This commit is contained in:
@@ -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;
|
||||
|
@@ -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) {
|
||||
|
@@ -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;
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user