summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/flopimg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/flopimg.c')
-rw-r--r--src/lib/formats/flopimg.c56
1 files changed, 50 insertions, 6 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;