diff options
author | 2014-04-09 13:46:04 +0000 | |
---|---|---|
committer | 2014-04-09 13:46:04 +0000 | |
commit | 2130b87ae0227e008942ef1636cba5562741cd71 (patch) | |
tree | decfef264bf3a59c023760e15e081b959a464b87 /src/lib/formats/td0_dsk.c | |
parent | af7aba4e1907fdb1e4f38e9f0d60be891e0de116 (diff) |
td0_dsk: cleanup (nw)
Diffstat (limited to 'src/lib/formats/td0_dsk.c')
-rw-r--r-- | src/lib/formats/td0_dsk.c | 304 |
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(§_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(§_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(§_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(§_data[sdatapos + k], &imagebuf[offset], rep); + offset += rep; + k += rep; } - if(k < size) - memset(§_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(§_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(§_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(§_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 = §_data[sdatapos]; - sdatapos += size; - } - else - sects[i].data = NULL; + if(size) + { + sects[i].data = §_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; } |