From 13f7f17a372f11825e8b994e37818cef50a7c1ab Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Wed, 5 Nov 2014 21:24:17 +0200 Subject: (MESS) victor9k: Floppy WIP. (nw) --- src/lib/formats/flopimg.c | 56 +++++++++++++++++++--- src/lib/formats/flopimg.h | 8 +++- src/lib/formats/victor9k_dsk.c | 76 ++++++++++++++++-------------- src/lib/formats/victor9k_dsk.h | 9 ++-- src/mess/drivers/victor9k.c | 2 +- src/mess/machine/victor9k_fdc.c | 102 ++++++++++++++++++++++++---------------- src/mess/machine/victor9k_fdc.h | 1 - 7 files changed, 166 insertions(+), 88 deletions(-) diff --git a/src/lib/formats/flopimg.c b/src/lib/formats/flopimg.c index 00c393939bf..1e0f42a5b35 100644 --- a/src/lib/formats/flopimg.c +++ b/src/lib/formats/flopimg.c @@ -1071,6 +1071,8 @@ bool floppy_image_format_t::type_no_data(int type) const type == CRC_CBM_START || type == CRC_MACHEAD_START || type == CRC_FCS_START || + type == CRC_VICTOR_HDR_START || + type == CRC_VICTOR_DATA_START || type == CRC_END || type == SECTOR_LOOP_START || type == SECTOR_LOOP_END || @@ -1112,6 +1114,12 @@ void floppy_image_format_t::collect_crcs(const desc_e *desc, gen_crc_info *crcs) case CRC_FCS_START: crcs[desc[i].p1].type = CRC_FCS; break; + case CRC_VICTOR_HDR_START: + crcs[desc[i].p1].type = CRC_VICTOR_HDR; + break; + case CRC_VICTOR_DATA_START: + crcs[desc[i].p1].type = CRC_VICTOR_DATA; + break; } for(int i=0; desc[i].type != END; i++) @@ -1131,6 +1139,8 @@ int floppy_image_format_t::crc_cells_size(int type) const case CRC_CBM: return 10; case CRC_MACHEAD: return 8; case CRC_FCS: return 20; + case CRC_VICTOR_HDR: return 10; + case CRC_VICTOR_DATA: return 20; default: return 0; } } @@ -1271,17 +1281,40 @@ void floppy_image_format_t::fixup_crc_fcs(UINT32 *buffer, const gen_crc_info *cr // TODO } +void floppy_image_format_t::fixup_crc_victor_header(UINT32 *buffer, const gen_crc_info *crc) +{ + UINT8 v = 0; + for(int o = crc->start; o < crc->end; o+=10) { + v += ((gcr5bw_tb[bitn_r(buffer, o, 5)] << 4) | gcr5bw_tb[bitn_r(buffer, o+5, 5)]); + } + int offset = crc->write; + gcr5_w(buffer, offset, 10, v); +} + +void floppy_image_format_t::fixup_crc_victor_data(UINT32 *buffer, const gen_crc_info *crc) +{ + UINT16 v = 0; + for(int o = crc->start; o < crc->end; o+=10) { + v += ((gcr5bw_tb[bitn_r(buffer, o, 5)] << 4) | gcr5bw_tb[bitn_r(buffer, o+5, 5)]); + } + int offset = crc->write; + gcr5_w(buffer, offset, 10, v & 0xff); + gcr5_w(buffer, offset, 10, v >> 8); +} + void floppy_image_format_t::fixup_crcs(UINT32 *buffer, gen_crc_info *crcs) { for(int i=0; i != MAX_CRC_COUNT; i++) if(crcs[i].write != -1) { switch(crcs[i].type) { - case CRC_AMIGA: fixup_crc_amiga(buffer, crcs+i); break; - case CRC_CBM: fixup_crc_cbm(buffer, crcs+i); break; - case CRC_CCITT: fixup_crc_ccitt(buffer, crcs+i); break; - case CRC_CCITT_FM:fixup_crc_ccitt_fm(buffer, crcs+i); break; - case CRC_MACHEAD: fixup_crc_machead(buffer, crcs+i); break; - case CRC_FCS: fixup_crc_fcs(buffer, crcs+i); break; + case CRC_AMIGA: fixup_crc_amiga(buffer, crcs+i); break; + case CRC_CBM: fixup_crc_cbm(buffer, crcs+i); break; + case CRC_CCITT: fixup_crc_ccitt(buffer, crcs+i); break; + case CRC_CCITT_FM: fixup_crc_ccitt_fm(buffer, crcs+i); break; + case CRC_MACHEAD: fixup_crc_machead(buffer, crcs+i); break; + case CRC_FCS: fixup_crc_fcs(buffer, crcs+i); break; + case CRC_VICTOR_HDR: fixup_crc_victor_header(buffer, crcs+i); break; + case CRC_VICTOR_DATA: fixup_crc_victor_data(buffer, crcs+i); break; } if(crcs[i].fixup_mfm_clock) { int offset = crcs[i].write + crc_cells_size(crcs[i].type); @@ -1403,6 +1436,11 @@ void floppy_image_format_t::generate_track(const desc_e *desc, int track, int he raw_w(buffer, offset, desc[index].p2, desc[index].p1); break; + case SYNC_GCR5: + for(int i=0; i1, 1->0), mfm-encoded @@ -346,6 +348,8 @@ protected: CRC_CBM_START, //!< Start a CBM checksum calculation (xor of original data values, gcr5-encoded), p1 = crc id CRC_MACHEAD_START, //!< Start of the mac gcr6 sector header checksum calculation (xor of pre-encode 6-bits values, gcr6-encoded) CRC_FCS_START, //!< Start a Compucolor File Control System checksum calculation, p1 = crc id + CRC_VICTOR_HDR_START, //!< Start a Victor 9000 checksum calculation, p1 = crc id + CRC_VICTOR_DATA_START, //!< Start a Victor 9000 checksum calculation, p1 = crc id CRC_END, //!< End the checksum, p1 = crc id CRC, //!< Write a checksum in the apporpriate format, p1 = crc id @@ -565,7 +569,7 @@ protected: UINT8 sbyte_mfm_r(const UINT8 *bitstream, int &pos, int track_size); private: - enum { CRC_NONE, CRC_AMIGA, CRC_CBM, CRC_CCITT, CRC_CCITT_FM, CRC_MACHEAD, CRC_FCS }; + enum { CRC_NONE, CRC_AMIGA, CRC_CBM, CRC_CCITT, CRC_CCITT_FM, CRC_MACHEAD, CRC_FCS, CRC_VICTOR_HDR, CRC_VICTOR_DATA }; enum { MAX_CRC_COUNT = 64 }; //! Holds data used internally for generating CRCs. @@ -587,6 +591,8 @@ private: void fixup_crc_ccitt_fm(UINT32 *buffer, const gen_crc_info *crc); void fixup_crc_machead(UINT32 *buffer, const gen_crc_info *crc); void fixup_crc_fcs(UINT32 *buffer, const gen_crc_info *crc); + void fixup_crc_victor_header(UINT32 *buffer, const gen_crc_info *crc); + void fixup_crc_victor_data(UINT32 *buffer, const gen_crc_info *crc); void fixup_crcs(UINT32 *buffer, gen_crc_info *crcs); void collect_crcs(const desc_e *desc, gen_crc_info *crcs); diff --git a/src/lib/formats/victor9k_dsk.c b/src/lib/formats/victor9k_dsk.c index afda79c95cd..db2a75b21e7 100644 --- a/src/lib/formats/victor9k_dsk.c +++ b/src/lib/formats/victor9k_dsk.c @@ -37,6 +37,7 @@ 8 unused 75-79 11 144.0 417 Interleave factor 3 + cell 2.13 usec */ @@ -83,36 +84,33 @@ int victor9k_format::identify(io_generic *io, UINT32 form_factor) return 0; } -floppy_image_format_t::desc_e* victor9k_format::get_sector_desc(const format &f, int ¤t_size, int sector_count, UINT8 id1, UINT8 id2, int gap_2) +floppy_image_format_t::desc_e* victor9k_format::get_sector_desc(const format &f, int ¤t_size, int sector_count) { static floppy_image_format_t::desc_e desc[] = { - /* 00 */ { SECTOR_LOOP_START, 0, -1 }, - /* 01 */ { RAWBYTE, 0xff, 5 }, - /* 02 */ { GCR5, 0x08, 1 }, - /* 03 */ { CRC, 1 }, - /* 04 */ { CRC_CBM_START, 1 }, - /* 05 */ { SECTOR_ID_GCR5 }, - /* 06 */ { TRACK_ID_DOS2_GCR5 }, - /* 07 */ { GCR5, id2, 1 }, - /* 08 */ { GCR5, id1, 1 }, - /* 09 */ { CRC_END, 1 }, - /* 10 */ { GCR5, 0x0f, 2 }, - /* 11 */ { RAWBYTE, 0x55, f.gap_1 }, - /* 12 */ { RAWBYTE, 0xff, 5 }, - /* 13 */ { GCR5, 0x07, 1 }, - /* 14 */ { CRC_CBM_START, 2 }, - /* 15 */ { SECTOR_DATA_GCR5, -1 }, - /* 16 */ { CRC_END, 2 }, - /* 17 */ { CRC, 2 }, - /* 18 */ { GCR5, 0x00, 2 }, - /* 19 */ { RAWBYTE, 0x55, gap_2 }, - /* 20 */ { SECTOR_LOOP_END }, - /* 21 */ { RAWBYTE, 0x55, 0 }, - /* 22 */ { RAWBITS, 0x5555, 0 }, - /* 23 */ { END } + /* 00 */ { SECTOR_INTERLEAVE_SKEW, 0, 0}, + /* 01 */ { SECTOR_LOOP_START, 0, -1 }, + /* 02 */ { SYNC_GCR5, 6 }, + /* 03 */ { GCR5, 0x07, 1 }, + /* 04 */ { CRC_VICTOR_HDR_START, 1 }, + /* 05 */ { TRACK_ID_VICTOR_GCR5 }, + /* 06 */ { SECTOR_ID_GCR5 }, + /* 07 */ { CRC_END, 1 }, + /* 08 */ { CRC, 1 }, + /* 09 */ { RAWBYTE, 0x55, 8 }, + /* 10 */ { SYNC_GCR5, 5 }, + /* 11 */ { GCR5, 0x08, 1 }, + /* 12 */ { CRC_VICTOR_DATA_START, 2 }, + /* 13 */ { SECTOR_DATA_GCR5, -1 }, + /* 14 */ { CRC_END, 2 }, + /* 15 */ { CRC, 2 }, + /* 16 */ { RAWBYTE, 0x55, 8 }, + /* 17 */ { SECTOR_LOOP_END }, + /* 18 */ { RAWBYTE, 0x55, 0 }, + /* 19 */ { RAWBITS, 0x5555, 0 }, + /* 20 */ { END } }; - current_size = 40 + (1+1+4+2)*10 + (f.gap_1)*8 + 40 + (1+f.sector_base_size+1+2)*10 + gap_2*8; + current_size = 60 + (1+1+1+1)*10 + 8*8 + 50 + (1+f.sector_base_size+2)*10 + 8*8; current_size *= sector_count; return desc; @@ -145,8 +143,6 @@ bool victor9k_format::load(io_generic *io, UINT32 form_factor, floppy_image *ima int track_offset = 0; - UINT8 id1 = 0xde, id2 = 0xad; // TODO - for (int head = 0; head < f.head_count; head++) { for (int track = 0; track < f.track_count; track++) { int current_size = 0; @@ -154,16 +150,16 @@ bool victor9k_format::load(io_generic *io, UINT32 form_factor, floppy_image *ima int sector_count = sectors_per_track[head][track]; int track_size = sector_count*f.sector_base_size; - floppy_image_format_t::desc_e *desc = get_sector_desc(f, current_size, sector_count, id1, id2, f.gap_2); + floppy_image_format_t::desc_e *desc = get_sector_desc(f, current_size, sector_count); int remaining_size = total_size - current_size; if(remaining_size < 0) throw emu_fatalerror("victor9k_format: Incorrect track layout, max_size=%d, current_size=%d", total_size, current_size); // Fixup the end gap - desc[21].p2 = remaining_size / 8; - desc[22].p2 = remaining_size & 7; - desc[22].p1 >>= remaining_size & 0x01; + desc[18].p2 = remaining_size / 8; + desc[19].p2 = remaining_size & 7; + desc[19].p1 >>= remaining_size & 0x01; desc_s sectors[40]; @@ -184,17 +180,22 @@ bool victor9k_format::supports_save() const return false; } +int victor9k_format::get_rpm(int head, int track) +{ + return rpm[speed_zone[head][track]]; +} + const victor9k_format::format victor9k_format::formats[] = { { // - floppy_image::FF_525, floppy_image::SSDD, 1224, 80, 1, 512, 9, 8 + floppy_image::FF_525, floppy_image::SSDD, 1224, 80, 1, 512 }, { // - floppy_image::FF_525, floppy_image::DSDD, 2448, 80, 2, 512, 9, 8 + floppy_image::FF_525, floppy_image::DSDD, 2448, 80, 2, 512 }, {} }; -const UINT32 victor9k_format::cell_size[] = +const UINT32 victor9k_format::cell_size[9] = { 1789, 1896, 2009, 2130, 2272, 2428, 2613, 2847, 2961 }; @@ -247,4 +248,9 @@ const int victor9k_format::speed_zone[2][80] = } }; +const int victor9k_format::rpm[9] = +{ + 252, 267, 283, 300, 320, 342, 368, 401, 417 +}; + const floppy_format_type FLOPPY_VICTOR_9000_FORMAT = &floppy_image_format_creator; diff --git a/src/lib/formats/victor9k_dsk.h b/src/lib/formats/victor9k_dsk.h index dec2d88cd2f..2fb24a6534a 100644 --- a/src/lib/formats/victor9k_dsk.h +++ b/src/lib/formats/victor9k_dsk.h @@ -23,8 +23,6 @@ public: UINT8 track_count; UINT8 head_count; UINT16 sector_base_size; - UINT8 gap_1; - UINT8 gap_2; }; victor9k_format(); @@ -35,17 +33,20 @@ public: int find_size(io_generic *io, UINT32 form_factor); virtual int identify(io_generic *io, UINT32 form_factor); - floppy_image_format_t::desc_e* get_sector_desc(const format &f, int ¤t_size, int sector_count, UINT8 id1, UINT8 id2, int gap_2); + floppy_image_format_t::desc_e* get_sector_desc(const format &f, int ¤t_size, int sector_count); void build_sector_description(const format &f, UINT8 *sectdata, offs_t sect_offs, desc_s *sectors, int sector_count) const; virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); virtual bool supports_save() const; + static int get_rpm(int head, int track); + protected: static const format formats[]; - static const UINT32 cell_size[]; + static const UINT32 cell_size[9]; static const int sectors_per_track[2][80]; static const int speed_zone[2][80]; + static const int rpm[9]; }; extern const floppy_format_type FLOPPY_VICTOR_9000_FORMAT; diff --git a/src/mess/drivers/victor9k.c b/src/mess/drivers/victor9k.c index 50c8a08b059..8ae394f7ff3 100644 --- a/src/mess/drivers/victor9k.c +++ b/src/mess/drivers/victor9k.c @@ -510,7 +510,7 @@ static MACHINE_CONFIG_START( victor9k, victor9k_state ) MCFG_DEVICE_ADD(FDC_TAG, VICTOR_9000_FDC, 0) MCFG_VICTOR_9000_FDC_IRQ_CB(WRITELINE(victor9k_state, fdc_irq_w)) - MCFG_VICTOR_9000_FDC_SYN_CB(DEVWRITELINE(I8259A_TAG, pic8259_device, ir0_w)) + MCFG_VICTOR_9000_FDC_SYN_CB(DEVWRITELINE(I8259A_TAG, pic8259_device, ir0_w)) MCFG_DEVCB_XOR(1) MCFG_VICTOR_9000_FDC_LBRDY_CB(INPUTLINE(I8088_TAG, INPUT_LINE_TEST)) // internal ram diff --git a/src/mess/machine/victor9k_fdc.c b/src/mess/machine/victor9k_fdc.c index ebb4f21c47f..f90cee271d6 100644 --- a/src/mess/machine/victor9k_fdc.c +++ b/src/mess/machine/victor9k_fdc.c @@ -13,8 +13,8 @@ TODO: - - floppy format - - spindle speed + - disk error 8 (sync missing?) + - 8048 spindle speed control - read PLL - write logic @@ -29,6 +29,8 @@ //************************************************************************** #define LOG 1 +#define LOG_VIA 1 +#define LOG_SCP 0 #define I8048_TAG "5d" #define M6522_4_TAG "1f" @@ -182,7 +184,6 @@ victor_9000_fdc_t::victor_9000_fdc_t(const machine_config &mconfig, const char * m_via6(*this, M6522_6_TAG), m_floppy0(*this, I8048_TAG":0:525qd"), m_floppy1(*this, I8048_TAG":1:525qd"), - m_rom(*this, I8048_TAG), m_gcr_rom(*this, "gcr"), m_da(0), m_da0(0), @@ -209,7 +210,8 @@ victor_9000_fdc_t::victor_9000_fdc_t(const machine_config &mconfig, const char * m_via5_irq(CLEAR_LINE), m_via6_irq(CLEAR_LINE), m_syn(0), - m_lbrdy(1) + m_lbrdy(1), + m_period(attotime::from_nsec(21300)) { cur_live.tm = attotime::never; cur_live.state = IDLE; @@ -303,11 +305,11 @@ void victor_9000_fdc_t::device_timer(emu_timer &timer, device_timer_id id, int p break; case TM_TACH0: - m_tach0 = 1; + // TODO break; case TM_TACH1: - m_tach1 = 1; + // TODO break; } } @@ -391,10 +393,13 @@ WRITE8_MEMBER( victor_9000_fdc_t::floppy_p2_w ) int sel1 = BIT(data, 4); if (m_sel1 != sel1) sync = true; - m_rdy0 = BIT(data, 6); - m_rdy1 = BIT(data, 7); + //m_rdy0 = BIT(data, 6); + //m_via5->write_ca2(m_rdy0); - if (LOG) logerror("%s %s START0/STOP0/SEL0/RDY0 %u/%u/%u/%u START1/STOP1/SEL1/RDY1 %u/%u/%u/%u\n", machine().time().as_string(), machine().describe_context(), start0, stop0, sel0, m_rdy0, start1, stop1, sel1, m_rdy1); + //m_rdy1 = BIT(data, 7); + //m_via5->write_cb2(m_rdy1); + + if (LOG_SCP) logerror("%s %s START0/STOP0/SEL0/RDY0 %u/%u/%u/%u START1/STOP1/SEL1/RDY1 %u/%u/%u/%u\n", machine().time().as_string(), machine().describe_context(), start0, stop0, sel0, m_rdy0, start1, stop1, sel1, m_rdy1); if (sync) { @@ -403,12 +408,12 @@ WRITE8_MEMBER( victor_9000_fdc_t::floppy_p2_w ) m_start0 = start0; m_stop0 = stop0; m_sel0 = sel0; - update_spindle_motor(m_floppy0, t_tach0, m_start0, m_stop0, m_sel0, m_da0); + //update_spindle_motor(m_floppy0, t_tach0, m_start0, m_stop0, m_sel0, m_da0); m_start1 = start1; m_stop1 = stop1; m_sel1 = sel1; - update_spindle_motor(m_floppy1, t_tach1, m_start1, m_stop1, m_sel1, m_da1); + //update_spindle_motor(m_floppy1, t_tach1, m_start1, m_stop1, m_sel1, m_da1); checkpoint(); @@ -431,11 +436,7 @@ WRITE8_MEMBER( victor_9000_fdc_t::floppy_p2_w ) READ8_MEMBER( victor_9000_fdc_t::tach0_r ) { - int tach0 = m_tach0; - - m_tach0 = 0; - - return tach0; + return m_tach0; } @@ -445,11 +446,7 @@ READ8_MEMBER( victor_9000_fdc_t::tach0_r ) READ8_MEMBER( victor_9000_fdc_t::tach1_r ) { - int tach1 = m_tach1; - - m_tach1 = 0; - - return tach1; + return m_tach1; } @@ -483,20 +480,17 @@ void victor_9000_fdc_t::update_stepper_motor(floppy_image_device *floppy, int st void victor_9000_fdc_t::update_spindle_motor(floppy_image_device *floppy, emu_timer *t_tach, bool start, bool stop, bool sel, UINT8 &da) { - if (!start && !stop && floppy->mon_r()) { - if (LOG) logerror("%s: motor start\n", floppy->tag()); + if (start && !stop && floppy->mon_r()) { + if (LOG_SCP) logerror("%s: motor start\n", floppy->tag()); floppy->mon_w(0); } else if (stop && !floppy->mon_r()) { - if (LOG) logerror("%s: motor stop\n", floppy->tag()); + if (LOG_SCP) logerror("%s: motor stop\n", floppy->tag()); floppy->mon_w(1); } if (sel) { da = m_da; } - - floppy->set_rpm(300); // TODO - t_tach->adjust(attotime::from_hz(5)); // TODO } @@ -506,11 +500,12 @@ void victor_9000_fdc_t::update_spindle_motor(floppy_image_device *floppy, emu_ti WRITE8_MEMBER( victor_9000_fdc_t::da_w ) { + if (LOG_SCP) logerror("%s %s DA %02x\n", machine().time().as_string(), machine().describe_context(), data); + if (m_da != data) { live_sync(); m_da = data; - if (LOG) logerror("%s %s DA %02x\n", machine().time().as_string(), machine().describe_context(), data); update_spindle_motor(m_floppy0, t_tach0, m_start0, m_stop0, m_sel0, m_da0); update_spindle_motor(m_floppy1, t_tach1, m_start1, m_stop1, m_sel1, m_da1); checkpoint(); @@ -537,14 +532,22 @@ WRITE8_MEMBER( victor_9000_fdc_t::via4_pa_w ) m_l0ms = data & 0x0f; + { // HACK to bypass SCP + m_floppy0->mon_w((m_l0ms == 0xf) ? 1 : 0); + m_floppy0->set_rpm(victor9k_format::get_rpm(m_side, m_floppy0->get_cyl())); + m_rdy0 = (m_l0ms == 0xf) ? 0 : 1; + m_via5->write_ca2(m_rdy0); + } + UINT8 st0 = data >> 4; + if (LOG_VIA) logerror("%s %s L0MS %01x ST0 %01x\n", machine().time().as_string(), machine().describe_context(), m_l0ms, st0); + if (m_st0 != st0) { live_sync(); update_stepper_motor(m_floppy0, m_stp0, st0, m_st0); m_st0 = st0; - if (LOG) logerror("%s %s L0MS %01x ST0 %01x\n", machine().time().as_string(), machine().describe_context(), m_l0ms, st0); checkpoint(); live_run(); } @@ -569,14 +572,22 @@ WRITE8_MEMBER( victor_9000_fdc_t::via4_pb_w ) m_l1ms = data & 0x0f; + { // HACK to bypass SCP + m_floppy1->mon_w((m_l1ms == 0xf) ? 1 : 0); + m_floppy1->set_rpm(victor9k_format::get_rpm(m_side, m_floppy1->get_cyl())); + m_rdy1 = (m_l1ms == 0xf) ? 0 : 1; + m_via5->write_cb2(m_rdy1); + } + UINT8 st1 = data >> 4; + if (LOG_VIA) logerror("%s %s L1MS %01x ST1 %01x\n", machine().time().as_string(), machine().describe_context(), m_l1ms, st1); + if (m_st1 != st1) { live_sync(); update_stepper_motor(m_floppy1, m_stp1, st1, m_st1); m_st1 = st1; - if (LOG) logerror("%s %s L1MS %01x ST1 %01x\n", machine().time().as_string(), machine().describe_context(), m_l1ms, st1); checkpoint(); live_run(); } @@ -590,6 +601,7 @@ WRITE_LINE_MEMBER( victor_9000_fdc_t::wrsync_w ) m_wrsync = state; cur_live.wrsync = state; checkpoint(); + if (LOG_VIA) logerror("%s %s ERASE %u\n", machine().time().as_string(), machine().describe_context(), state); live_run(); } } @@ -645,7 +657,7 @@ WRITE8_MEMBER( victor_9000_fdc_t::via5_pb_w ) { live_sync(); m_wd = cur_live.wd = data; - if (LOG) logerror("%s %s WD %02x\n", machine().time().as_string(), machine().describe_context(), data); + if (LOG_VIA) logerror("%s %s WD %02x\n", machine().time().as_string(), machine().describe_context(), data); checkpoint(); live_run(); } @@ -676,7 +688,7 @@ READ8_MEMBER( victor_9000_fdc_t::via6_pa_r ) */ - if (LOG) logerror("%s %s TRK0D0 %u TRK0D1 %u\n", machine().time().as_string(), machine().describe_context(), m_floppy0->trk00_r(),m_floppy1->trk00_r()); + if (LOG_VIA) logerror("%s %s TRK0D0 %u TRK0D1 %u SYNC %u\n", machine().time().as_string(), machine().describe_context(), m_floppy0->trk00_r(), m_floppy1->trk00_r(), checkpoint_live.sync); UINT8 data = 0; @@ -740,7 +752,7 @@ WRITE8_MEMBER( victor_9000_fdc_t::via6_pa_w ) m_drive = drive; cur_live.drive = drive; - if (LOG) logerror("%s %s SIDE %u DRIVE %u\n", machine().time().as_string(), machine().describe_context(), side, drive); + if (LOG_VIA) logerror("%s %s SIDE %u DRIVE %u\n", machine().time().as_string(), machine().describe_context(), side, drive); checkpoint(); live_run(); @@ -825,7 +837,7 @@ WRITE8_MEMBER( victor_9000_fdc_t::via6_pb_w ) m_stp1 = stp1; update_stepper_motor(m_floppy1, m_stp1, m_st1, m_st1); - if (LOG) logerror("%s %s STP0 %u STP1 %u\n", machine().time().as_string(), machine().describe_context(), stp0, stp1); + if (LOG_VIA) logerror("%s %s STP0 %u STP1 %u\n", machine().time().as_string(), machine().describe_context(), stp0, stp1); checkpoint(); live_run(); @@ -839,7 +851,7 @@ WRITE_LINE_MEMBER( victor_9000_fdc_t::drw_w ) live_sync(); m_drw = cur_live.drw = state; checkpoint(); - if (LOG) logerror("%s %s DRW %u\n", machine().time().as_string(), machine().describe_context(), state); + if (LOG_VIA) logerror("%s %s DRW %u\n", machine().time().as_string(), machine().describe_context(), state); if (state) { stop_writing(machine().time()); } else { @@ -856,7 +868,7 @@ WRITE_LINE_MEMBER( victor_9000_fdc_t::erase_w ) live_sync(); m_erase = cur_live.erase = state; checkpoint(); - if (LOG) logerror("%s %s ERASE %u\n", machine().time().as_string(), machine().describe_context(), state); + if (LOG_VIA) logerror("%s %s ERASE %u\n", machine().time().as_string(), machine().describe_context(), state); live_run(); } } @@ -874,7 +886,7 @@ READ8_MEMBER( victor_9000_fdc_t::cs7_r ) { live_sync(); cur_live.lbrdy = 1; - if (LOG) logerror("%s %s LBRDY 1\n", machine().time().as_string(), machine().describe_context()); + if (LOG_VIA) logerror("%s %s LBRDY 1\n", machine().time().as_string(), machine().describe_context()); m_lbrdy_cb(1); checkpoint(); live_run(); @@ -889,7 +901,7 @@ WRITE8_MEMBER( victor_9000_fdc_t::cs7_w ) { live_sync(); cur_live.lbrdy = 1; - if (LOG) logerror("%s %s LBRDY 1\n", machine().time().as_string(), machine().describe_context()); + if (LOG_VIA) logerror("%s %s LBRDY 1\n", machine().time().as_string(), machine().describe_context()); m_lbrdy_cb(1); checkpoint(); live_run(); @@ -1157,10 +1169,20 @@ void victor_9000_fdc_t::live_run(const attotime &limit) void victor_9000_fdc_t::get_next_edge(const attotime &when) { - // TODO + floppy_image_device *floppy = get_floppy(); + + cur_live.edge = floppy ? floppy->get_next_transition(when) : attotime::never; } int victor_9000_fdc_t::get_next_bit(attotime &tm, const attotime &limit) { - return -1; // TODO + attotime next = tm + m_period; + + int bit = (cur_live.edge.is_never() || cur_live.edge >= next) ? 0 : 1; + + if (bit) { + get_next_edge(next); + } + + return bit; } diff --git a/src/mess/machine/victor9k_fdc.h b/src/mess/machine/victor9k_fdc.h index e47b1116e17..721aa4aac82 100644 --- a/src/mess/machine/victor9k_fdc.h +++ b/src/mess/machine/victor9k_fdc.h @@ -161,7 +161,6 @@ private: required_device m_via6; required_device m_floppy0; required_device m_floppy1; - required_memory_region m_rom; required_memory_region m_gcr_rom; void update_stepper_motor(floppy_image_device *floppy, int stp, int old_st, int st); -- cgit v1.2.3