summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/td0_dsk.c
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2014-04-09 13:46:04 +0000
committer cracyc <cracyc@users.noreply.github.com>2014-04-09 13:46:04 +0000
commit2130b87ae0227e008942ef1636cba5562741cd71 (patch)
treedecfef264bf3a59c023760e15e081b959a464b87 /src/lib/formats/td0_dsk.c
parentaf7aba4e1907fdb1e4f38e9f0d60be891e0de116 (diff)
td0_dsk: cleanup (nw)
Diffstat (limited to 'src/lib/formats/td0_dsk.c')
-rw-r--r--src/lib/formats/td0_dsk.c304
1 files changed, 148 insertions, 156 deletions
diff --git a/src/lib/formats/td0_dsk.c b/src/lib/formats/td0_dsk.c
index d72cef70996..cc5a72993a5 100644
--- a/src/lib/formats/td0_dsk.c
+++ b/src/lib/formats/td0_dsk.c
@@ -823,191 +823,183 @@ bool td0_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
dynamic_buffer imagebuf(max_size);
UINT8 header[12];
- try
- {
- io_generic_read(io, header, 0, 12);
- head_count = header[9];
+ io_generic_read(io, header, 0, 12);
+ head_count = header[9];
- if(header[0] == 't')
- {
- td0dsk_t disk_decode;
+ if(header[0] == 't')
+ {
+ td0dsk_t disk_decode;
- disk_decode.floppy_file = io;
- disk_decode.init_Decode();
- disk_decode.floppy_file_offset = 12;
- disk_decode.Decode(imagebuf, max_size);
- }
- else
- io_generic_read(io, imagebuf, 12, io_generic_size(io));
+ disk_decode.floppy_file = io;
+ disk_decode.init_Decode();
+ disk_decode.floppy_file_offset = 12;
+ disk_decode.Decode(imagebuf, max_size);
+ }
+ else
+ io_generic_read(io, imagebuf, 12, io_generic_size(io));
- if(header[7] & 0x80)
- offset = 10 + imagebuf[2] + (imagebuf[3] << 8);
+ if(header[7] & 0x80)
+ offset = 10 + imagebuf[2] + (imagebuf[3] << 8);
- track_spt = imagebuf[offset];
- if(track_spt == 255) // Empty file?
- throw false;
+ track_spt = imagebuf[offset];
+ if(track_spt == 255) // Empty file?
+ return false;
- switch(header[6])
- {
- case 2:
- if((imagebuf[offset + 2] & 0x7f) == 2) // ?
- {
- if(head_count == 2)
- image->set_variant(floppy_image::DSHD);
- else
- throw false; // single side hd?
- break;
- }
- /* no break; could be qd, won't know until tracks are counted */
- case 1:
+ switch(header[6])
+ {
+ case 2:
+ if((imagebuf[offset + 2] & 0x7f) == 2) // ?
+ {
if(head_count == 2)
- image->set_variant(floppy_image::DSDD);
+ image->set_variant(floppy_image::DSHD);
else
- image->set_variant(floppy_image::SSDD);
+ return false; // single side hd?
break;
- case 4:
- if((imagebuf[offset + 2] & 0x7f) == 2) // ?
- {
- if(head_count == 2)
- image->set_variant(floppy_image::DSHD);
- else
- throw false; // single side 3.5?
- break;
- }
- /* no break */
- case 3:
+ }
+ /* no break; could be qd, won't know until tracks are counted */
+ case 1:
+ if(head_count == 2)
+ image->set_variant(floppy_image::DSDD);
+ else
+ image->set_variant(floppy_image::SSDD);
+ break;
+ case 4:
+ if((imagebuf[offset + 2] & 0x7f) == 2) // ?
+ {
if(head_count == 2)
- {
- if(form_factor == floppy_image::FF_525)
- image->set_variant(floppy_image::DSQD);
- else
- image->set_variant(floppy_image::DSDD);
- }
+ image->set_variant(floppy_image::DSHD);
else
- {
- if(form_factor == floppy_image::FF_525)
- image->set_variant(floppy_image::SSQD);
- else
- throw false; // single side 3.5?
- }
+ return false; // single side 3.5?
break;
- }
+ }
+ /* no break */
+ case 3:
+ if(head_count == 2)
+ {
+ if(form_factor == floppy_image::FF_525)
+ image->set_variant(floppy_image::DSQD);
+ else
+ image->set_variant(floppy_image::DSDD);
+ }
+ else
+ {
+ if(form_factor == floppy_image::FF_525)
+ image->set_variant(floppy_image::SSQD);
+ else
+ return false; // single side 3.5?
+ }
+ break;
+ }
- static const int rates[3] = { 250000, 300000, 500000 };
- int rate = (header[5] & 0x7f) >= 3 ? 500000 : rates[header[5] & 0x7f];
- int rpm = form_factor == floppy_image::FF_8 || (form_factor == floppy_image::FF_525 && rate >= 300000) ? 360 : 300;
- int base_cell_count = rate*60/rpm;
+ static const int rates[3] = { 250000, 300000, 500000 };
+ int rate = (header[5] & 0x7f) >= 3 ? 500000 : rates[header[5] & 0x7f];
+ int rpm = form_factor == floppy_image::FF_8 || (form_factor == floppy_image::FF_525 && rate >= 300000) ? 360 : 300;
+ int base_cell_count = rate*60/rpm;
- while(track_spt != 255)
+ while(track_spt != 255)
+ {
+ desc_pc_sector sects[256];
+ UINT8 sect_data[65536];
+ int sdatapos = 0;
+ int track = imagebuf[offset + 1];
+ int head = imagebuf[offset + 2] & 1;
+ bool fm = (header[5] & 0x80) || (imagebuf[offset + 2] & 0x80); // ?
+ offset += 4;
+ for(int i = 0; i < track_spt; i++)
{
- desc_pc_sector sects[256];
- UINT8 sect_data[65536];
- int sdatapos = 0;
- int track = imagebuf[offset + 1];
- int head = imagebuf[offset + 2] & 1;
- bool fm = (header[5] & 0x80) || (imagebuf[offset + 2] & 0x80); // ?
- offset += 4;
- for(int i = 0; i < track_spt; i++)
+ UINT8 *hs = &imagebuf[offset];
+ UINT16 size;
+ offset += 6;
+
+ sects[i].track = hs[0];
+ sects[i].head = hs[1];
+ sects[i].sector = hs[2];
+ sects[i].size = hs[3];
+ sects[i].deleted = (hs[4] & 4) == 4;
+ sects[i].bad_crc = (hs[4] & 2) == 2;
+
+ if(hs[4] & 0x30)
+ size = 0;
+ else
{
- UINT8 *hs = &imagebuf[offset];
- UINT16 size;
- offset += 6;
-
- sects[i].track = hs[0];
- sects[i].head = hs[1];
- sects[i].sector = hs[2];
- sects[i].size = hs[3];
- sects[i].deleted = (hs[4] & 4) == 4;
- sects[i].bad_crc = (hs[4] & 2) == 2;
-
- if(hs[4] & 0x30)
- size = 0;
- else
+ offset += 3;
+ size = 128 << hs[3];
+ int j, k;
+ switch(hs[8])
{
- offset += 3;
- size = 128 << hs[3];
- int j, k;
- switch(hs[8])
- {
- default:
- throw false;
- case 0:
- memcpy(&sect_data[sdatapos], &imagebuf[offset], size);
- offset += size;
- break;
- case 1:
- offset += 4;
- k = (hs[9] + (hs[10] << 8)) * 2;
- k = (k <= size) ? k : size;
- for(j = 0; j < k; j += 2)
+ default:
+ return false;
+ case 0:
+ memcpy(&sect_data[sdatapos], &imagebuf[offset], size);
+ offset += size;
+ break;
+ case 1:
+ offset += 4;
+ k = (hs[9] + (hs[10] << 8)) * 2;
+ k = (k <= size) ? k : size;
+ for(j = 0; j < k; j += 2)
+ {
+ sect_data[sdatapos + j] = hs[11];
+ sect_data[sdatapos + j + 1] = hs[12];
+ }
+ if(k < size)
+ memset(&sect_data[sdatapos + k], '\0', size - k);
+ break;
+ case 2:
+ k = 0;
+ while(k < size)
+ {
+ UINT16 len = imagebuf[offset];
+ UINT16 rep = imagebuf[offset + 1];
+ offset += 2;
+ if(!len)
{
- sect_data[sdatapos + j] = hs[11];
- sect_data[sdatapos + j + 1] = hs[12];
+ memcpy(&sect_data[sdatapos + k], &imagebuf[offset], rep);
+ offset += rep;
+ k += rep;
}
- if(k < size)
- memset(&sect_data[sdatapos + k], '\0', size - k);
- break;
- case 2:
- k = 0;
- while(k < size)
+ else
{
- UINT16 len = imagebuf[offset];
- UINT16 rep = imagebuf[offset + 1];
- offset += 2;
- if(!len)
- {
- memcpy(&sect_data[sdatapos + k], &imagebuf[offset], rep);
- offset += rep;
- k += rep;
- }
- else
- {
- len = (1 << len);
- rep = len * rep;
- rep = ((rep + k) <= size) ? rep : (size - k);
- for(j = 0; j < rep; j += len)
- memcpy(&sect_data[sdatapos + j + k], &imagebuf[offset], len);
- k += rep;
- offset += len;
- }
+ len = (1 << len);
+ rep = len * rep;
+ rep = ((rep + k) <= size) ? rep : (size - k);
+ for(j = 0; j < rep; j += len)
+ memcpy(&sect_data[sdatapos + j + k], &imagebuf[offset], len);
+ k += rep;
+ offset += len;
}
- break;
- }
+ }
+ break;
}
+ }
- sects[i].actual_size = size;
+ sects[i].actual_size = size;
- if(size)
- {
- sects[i].data = &sect_data[sdatapos];
- sdatapos += size;
- }
- else
- sects[i].data = NULL;
+ if(size)
+ {
+ sects[i].data = &sect_data[sdatapos];
+ sdatapos += size;
}
- track_count = track;
-
- if(fm)
- build_pc_track_fm(track, head, image, base_cell_count, track_spt, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size));
else
- build_pc_track_mfm(track, head, image, base_cell_count*2, track_spt, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size));
-
- track_spt = imagebuf[offset];
+ sects[i].data = NULL;
}
- if((track_count > 50) && (form_factor == floppy_image::FF_525)) // ?
- {
- if(image->get_variant() == floppy_image::DSDD)
- image->set_variant(floppy_image::DSQD);
- else if(image->get_variant() == floppy_image::SSDD)
- image->set_variant(floppy_image::SSQD);
- }
- throw true;
+ track_count = track;
+
+ if(fm)
+ build_pc_track_fm(track, head, image, base_cell_count, track_spt, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size));
+ else
+ build_pc_track_mfm(track, head, image, base_cell_count*2, track_spt, sects, calc_default_pc_gap3_size(form_factor, sects[0].actual_size));
+
+ track_spt = imagebuf[offset];
}
- catch(bool ret)
+ if((track_count > 50) && (form_factor == floppy_image::FF_525)) // ?
{
- return ret;
+ if(image->get_variant() == floppy_image::DSDD)
+ image->set_variant(floppy_image::DSQD);
+ else if(image->get_variant() == floppy_image::SSDD)
+ image->set_variant(floppy_image::SSQD);
}
- return false;
+ return true;
}