mirror of
https://github.com/holub/mame
synced 2025-05-20 20:58:51 +03:00
td0_dsk: cleanup (nw)
This commit is contained in:
parent
af7aba4e19
commit
2130b87ae0
@ -823,191 +823,183 @@ bool td0_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
|
|||||||
dynamic_buffer imagebuf(max_size);
|
dynamic_buffer imagebuf(max_size);
|
||||||
UINT8 header[12];
|
UINT8 header[12];
|
||||||
|
|
||||||
try
|
io_generic_read(io, header, 0, 12);
|
||||||
|
head_count = header[9];
|
||||||
|
|
||||||
|
if(header[0] == 't')
|
||||||
{
|
{
|
||||||
io_generic_read(io, header, 0, 12);
|
td0dsk_t disk_decode;
|
||||||
head_count = header[9];
|
|
||||||
|
|
||||||
if(header[0] == 't')
|
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);
|
||||||
|
|
||||||
|
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
|
||||||
|
return false; // single side hd?
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* 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)
|
||||||
|
image->set_variant(floppy_image::DSHD);
|
||||||
|
else
|
||||||
|
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;
|
||||||
|
|
||||||
|
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++)
|
||||||
{
|
{
|
||||||
td0dsk_t disk_decode;
|
UINT8 *hs = &imagebuf[offset];
|
||||||
|
UINT16 size;
|
||||||
|
offset += 6;
|
||||||
|
|
||||||
disk_decode.floppy_file = io;
|
sects[i].track = hs[0];
|
||||||
disk_decode.init_Decode();
|
sects[i].head = hs[1];
|
||||||
disk_decode.floppy_file_offset = 12;
|
sects[i].sector = hs[2];
|
||||||
disk_decode.Decode(imagebuf, max_size);
|
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])
|
||||||
|
{
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sects[i].actual_size = size;
|
||||||
|
|
||||||
|
if(size)
|
||||||
|
{
|
||||||
|
sects[i].data = §_data[sdatapos];
|
||||||
|
sdatapos += size;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sects[i].data = NULL;
|
||||||
}
|
}
|
||||||
else
|
track_count = track;
|
||||||
io_generic_read(io, imagebuf, 12, io_generic_size(io));
|
|
||||||
|
|
||||||
if(header[7] & 0x80)
|
if(fm)
|
||||||
offset = 10 + imagebuf[2] + (imagebuf[3] << 8);
|
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];
|
track_spt = imagebuf[offset];
|
||||||
if(track_spt == 255) // Empty file?
|
|
||||||
throw 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:
|
|
||||||
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)
|
|
||||||
image->set_variant(floppy_image::DSHD);
|
|
||||||
else
|
|
||||||
throw 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
|
|
||||||
throw 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;
|
|
||||||
|
|
||||||
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++)
|
|
||||||
{
|
|
||||||
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])
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sects[i].actual_size = size;
|
|
||||||
|
|
||||||
if(size)
|
|
||||||
{
|
|
||||||
sects[i].data = §_data[sdatapos];
|
|
||||||
sdatapos += size;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
sects[i].data = NULL;
|
|
||||||
}
|
|
||||||
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];
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user