wd_fdc: Emulate writes to master reset line; allow read side effects to be disabled (nw)

This commit is contained in:
AJR 2019-06-01 16:08:40 -04:00
parent 9c41b55ac3
commit af61dd9e97
2 changed files with 65 additions and 36 deletions

View File

@ -122,6 +122,7 @@ void wd_fdc_device_base::device_start()
enmf = false;
floppy = nullptr;
status = 0x00;
mr = true;
save_item(NAME(status));
save_item(NAME(command));
@ -136,6 +137,9 @@ void wd_fdc_device_base::device_start()
save_item(NAME(counter));
save_item(NAME(status_type_1));
save_item(NAME(last_dir));
if (!disable_mfm)
save_item(NAME(dden));
save_item(NAME(mr));
}
void wd_fdc_device_base::device_reset()
@ -145,40 +149,52 @@ void wd_fdc_device_base::device_reset()
void wd_fdc_device_base::soft_reset()
{
command = 0x00;
main_state = IDLE;
sub_state = IDLE;
cur_live.state = IDLE;
track = 0x00;
sector = 0x01;
status = 0x00;
data = 0x00;
cmd_buffer = track_buffer = sector_buffer = -1;
counter = 0;
status_type_1 = true;
last_dir = 1;
// gnd == enmf enabled, otherwise disabled (default)
if (!enmf_cb.isnull() && has_enmf)
enmf = enmf_cb() ? false : true;
intrq = false;
if (!intrq_cb.isnull())
{
intrq_cb(intrq);
if(mr) {
mr_w(0);
mr_w(1);
}
drq = false;
if (!drq_cb.isnull())
{
drq_cb(drq);
}
hld = false;
intrq_cond = 0;
live_abort();
}
// trigger a restore after everything else is reset too, in particular the floppy device itself
sub_state = INITIAL_RESTORE;
t_gen->adjust(attotime::zero);
WRITE_LINE_MEMBER(wd_fdc_device_base::mr_w)
{
if(mr && !state) {
command = 0x00;
main_state = IDLE;
sub_state = IDLE;
cur_live.state = IDLE;
track = 0x00;
sector = 0x01;
status = 0x00;
data = 0x00;
cmd_buffer = track_buffer = sector_buffer = -1;
counter = 0;
status_type_1 = true;
last_dir = 1;
mr = false;
// gnd == enmf enabled, otherwise disabled (default)
if (!enmf_cb.isnull() && has_enmf)
enmf = enmf_cb() ? false : true;
intrq = false;
if (!intrq_cb.isnull())
{
intrq_cb(intrq);
}
drq = false;
if (!drq_cb.isnull())
{
drq_cb(drq);
}
hld = false;
intrq_cond = 0;
live_abort();
} else if(state && !mr) {
// trigger a restore after everything else is reset too, in particular the floppy device itself
sub_state = INITIAL_RESTORE;
t_gen->adjust(attotime::zero);
mr = true;
}
}
void wd_fdc_device_base::set_floppy(floppy_image_device *_floppy)
@ -1090,6 +1106,11 @@ void wd_fdc_device_base::do_cmd_w()
void wd_fdc_device_base::cmd_w(uint8_t val)
{
if (inverted_bus) val ^= 0xff;
if (!mr) {
logerror("Not initiating command %02x during master reset\n", val);
return;
}
LOGCOMP("Initiating command %02x\n", val);
if(intrq && !(intrq_cond & I_IMM)) {
@ -1119,7 +1140,7 @@ void wd_fdc_device_base::cmd_w(uint8_t val)
uint8_t wd_fdc_device_base::status_r()
{
if(intrq && !(intrq_cond & I_IMM)) {
if(intrq && !(intrq_cond & I_IMM) && !machine().side_effects_disabled()) {
intrq = false;
if(!intrq_cb.isnull())
intrq_cb(intrq);
@ -1171,7 +1192,7 @@ void wd_fdc_device_base::track_w(uint8_t val)
if (inverted_bus) val ^= 0xff;
// No more than one write in flight
if(track_buffer != -1)
if(track_buffer != -1 || !mr)
return;
track_buffer = val;
@ -1194,6 +1215,8 @@ void wd_fdc_device_base::do_sector_w()
void wd_fdc_device_base::sector_w(uint8_t val)
{
if (!mr) return;
if (inverted_bus) val ^= 0xff;
// No more than one write in flight
@ -1220,6 +1243,8 @@ uint8_t wd_fdc_device_base::sector_r()
void wd_fdc_device_base::data_w(uint8_t val)
{
if (!mr) return;
if (inverted_bus) val ^= 0xff;
data = val;
@ -1228,7 +1253,8 @@ void wd_fdc_device_base::data_w(uint8_t val)
uint8_t wd_fdc_device_base::data_r()
{
drop_drq();
if (!machine().side_effects_disabled())
drop_drq();
uint8_t val = data;
if (inverted_bus) val ^= 0xff;

View File

@ -86,6 +86,8 @@ public:
DECLARE_READ_LINE_MEMBER(enp_r);
DECLARE_WRITE_LINE_MEMBER(mr_w);
void index_callback(floppy_image_device *floppy, int state);
protected:
@ -277,7 +279,8 @@ private:
emu_timer *t_gen, *t_cmd, *t_track, *t_sector;
bool dden, status_type_1, intrq, drq, hld, hlt, enp, force_ready, disable_motor_control;
bool dden, status_type_1, intrq, drq, hld, hlt, enp, mr;
bool force_ready, disable_motor_control;
int main_state, sub_state;
uint8_t command, track, sector, data, status, intrq_cond;
int last_dir;