summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2014-11-05 21:24:17 +0200
committer Curt Coder <curtcoder@mail.com>2014-11-05 21:24:26 +0200
commit13f7f17a372f11825e8b994e37818cef50a7c1ab (patch)
tree21493eb350aa0fca0c421a3fab04c15ac5c483f0
parentfd172ee3fe3e7ee4c9c28758cc2675a372a242f5 (diff)
(MESS) victor9k: Floppy WIP. (nw)
-rw-r--r--src/lib/formats/flopimg.c56
-rw-r--r--src/lib/formats/flopimg.h8
-rw-r--r--src/lib/formats/victor9k_dsk.c76
-rw-r--r--src/lib/formats/victor9k_dsk.h9
-rw-r--r--src/mess/drivers/victor9k.c2
-rw-r--r--src/mess/machine/victor9k_fdc.c102
-rw-r--r--src/mess/machine/victor9k_fdc.h1
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; i<desc[index].p1; i++)
+ raw_w(buffer, offset, 10, 0xffff);
+ break;
+
case TRACK_ID:
mfm_w(buffer, offset, 8, track);
break;
@@ -1427,6 +1465,10 @@ void floppy_image_format_t::generate_track(const desc_e *desc, int track, int he
_8n1_w(buffer, offset, 8, track);
break;
+ case TRACK_ID_VICTOR_GCR5:
+ gcr5_w(buffer, offset, 10, 1 + track + (head * 0x80));
+ break;
+
case HEAD_ID:
mfm_w(buffer, offset, 8, head);
break;
@@ -1536,6 +1578,8 @@ void floppy_image_format_t::generate_track(const desc_e *desc, int track, int he
case CRC_CCITT_FM_START:
case CRC_MACHEAD_START:
case CRC_FCS_START:
+ case CRC_VICTOR_HDR_START:
+ case CRC_VICTOR_DATA_START:
crcs[desc[index].p1].start = offset;
break;
diff --git a/src/lib/formats/flopimg.h b/src/lib/formats/flopimg.h
index 4f2d85d43cc..b53744578df 100644
--- a/src/lib/formats/flopimg.h
+++ b/src/lib/formats/flopimg.h
@@ -307,12 +307,14 @@ protected:
RAW, //!< One 16 bits word in p1 to be written raw, msb first, repeated p2 times
RAWBYTE, //!< One 8 bit byte in p1 to be written raw, msb first, repeated p2 times
RAWBITS, //!< A value of p2 bits in p1 to be copied as-is, msb first
+ SYNC_GCR5, //!< gcr5 sync byte
TRACK_ID, //!< Track id byte, mfm-encoded
TRACK_ID_FM, //!< Track id byte, fm-encoded
TRACK_ID_DOS2_GCR5, //!< Track id byte, gcr5-encoded
TRACK_ID_DOS25_GCR5, //!< Track id byte, gcr5-encoded
TRACK_ID_GCR6, //!< Track id low 6 bits, gcr6-encoded
TRACK_ID_8N1, //!< Track id byte, 8N1-encoded
+ TRACK_ID_VICTOR_GCR5, //!< Track id byte, gcr5-encoded
HEAD_ID, //!< Head id byte, mfm-encoded
HEAD_ID_FM, //!< Head id byte, fm-encoded
HEAD_ID_SWAP, //!< Head id byte swapped (0->1, 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 &current_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 &current_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<victor9k_format>;
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 &current_size, int sector_count, UINT8 id1, UINT8 id2, int gap_2);
+ floppy_image_format_t::desc_e* get_sector_desc(const format &f, int &current_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<via6522_device> m_via6;
required_device<floppy_image_device> m_floppy0;
required_device<floppy_image_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);