From 40b5608160aef97ca0fb3a118a113d9558ada43c Mon Sep 17 00:00:00 2001 From: AJR Date: Sun, 19 Mar 2023 17:06:55 -0400 Subject: Encode certain tracks as single density in .d88 floppy format * bml3mp1802, x1: Hook up DDEN control for FDC --- src/devices/bus/bml3/bml3mp1802.cpp | 2 +- src/lib/formats/d88_dsk.cpp | 8 +++++++- src/mame/sharp/x1.cpp | 22 +++++++++++++++++----- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/devices/bus/bml3/bml3mp1802.cpp b/src/devices/bus/bml3/bml3mp1802.cpp index 3a2d9d2bd9d..d407d460576 100644 --- a/src/devices/bus/bml3/bml3mp1802.cpp +++ b/src/devices/bus/bml3/bml3mp1802.cpp @@ -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) { diff --git a/src/lib/formats/d88_dsk.cpp b/src/lib/formats/d88_dsk.cpp index a64129cc3a4..9495f5a863d 100644 --- a/src/lib/formats/d88_dsk.cpp +++ b/src/lib/formats/d88_dsk.cpp @@ -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 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; diff --git a/src/mame/sharp/x1.cpp b/src/mame/sharp/x1.cpp index 034fd3e4fb6..2e6e85b7aea 100644 --- a/src/mame/sharp/x1.cpp +++ b/src/mame/sharp/x1.cpp @@ -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)); -- cgit v1.2.3