Encode certain tracks as single density in .d88 floppy format

* bml3mp1802, x1: Hook up DDEN control for FDC
This commit is contained in:
AJR 2023-03-19 17:06:55 -04:00
parent ea47c29c49
commit 40b5608160
3 changed files with 25 additions and 7 deletions

View File

@ -91,7 +91,7 @@ void bml3bus_mp1802_device::bml3_mp1802_w(uint8_t data)
floppy_image_device *floppy = m_floppy[data & 0x03]->get_device();
m_fdc->set_floppy(floppy);
//m_fdc->dden_w(!BIT(data, 5)); // TODO: support FM tracks in d88_format
m_fdc->dden_w(!BIT(data, 5));
if (floppy)
{

View File

@ -500,6 +500,7 @@ bool d88_format::load(util::random_read &io, uint32_t form_factor, const std::ve
uint8_t sect_data[65536];
int sdatapos = 0;
int sector_count = 1;
uint8_t density = 0;
for(int i=0; i<sector_count; i++) {
if (pos + 16 > file_size)
@ -519,6 +520,8 @@ bool d88_format::load(util::random_read &io, uint32_t form_factor, const std::ve
// Support broken vfman converter
if(sector_count == 0x1000)
sector_count = 0x10;
density = hs[6];
}
sects[i].track = hs[0];
@ -539,7 +542,10 @@ bool d88_format::load(util::random_read &io, uint32_t form_factor, const std::ve
sects[i].data = nullptr;
}
build_pc_track_mfm(track, head, image, cell_count, sector_count, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size));
if(density == 0x40)
build_pc_track_fm(track, head, image, cell_count / 2, sector_count, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size));
else
build_pc_track_mfm(track, head, image, cell_count, sector_count, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size));
}
return true;

View File

@ -730,16 +730,26 @@ uint8_t x1_state::x1_fdc_r(offs_t offset)
case 0x0ffb:
return m_fdc->data_r();
case 0x0ffc:
logerror("FDC: read FM type\n");
if (!machine().side_effects_disabled())
{
logerror("FDC: read FM type\n");
m_fdc->dden_w(1);
}
return 0xff;
case 0x0ffd:
logerror("FDC: read MFM type\n");
if (!machine().side_effects_disabled())
{
logerror("FDC: read MFM type\n");
m_fdc->dden_w(0);
}
return 0xff;
case 0x0ffe:
logerror("FDC: read 1.6M type\n");
if (!machine().side_effects_disabled())
logerror("FDC: read 1.6M type\n");
return 0xff;
case 0x0fff:
logerror("FDC: switching between 500k/1M\n");
if (!machine().side_effects_disabled())
logerror("FDC: switching between 500k/1M\n");
return 0xff;
}
@ -2096,6 +2106,8 @@ MACHINE_RESET_MEMBER(x1_state,x1)
m_ram_bank = 0;
// m_old_vpos = -1;
m_fdc->dden_w(0);
}
MACHINE_RESET_MEMBER(x1_state,x1turbo)
@ -2203,7 +2215,7 @@ void x1_state::x1(machine_config &config)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_x1);
MB8877(config, m_fdc, MAIN_CLOCK / 16);
MB8877(config, m_fdc, 16_MHz_XTAL / 16); // clocked by SED9421C0B
// TODO: guesswork, try to implicitly start the motor
m_fdc->hld_wr_callback().set(FUNC(x1_state::hdl_w));