diff options
author | 2019-07-06 10:17:27 +0200 | |
---|---|---|
committer | 2019-07-06 10:17:27 +0200 | |
commit | ab20a16990ac6975f63d63d40549cc64a95ce684 (patch) | |
tree | aff9eb2dae7b30bae115571f20956efee9f2cda2 | |
parent | 85228e6f917a19b530b206c063ed81281f71002b (diff) |
dsk_dsk.cpp: Surpass some copy-protected tracks
Fix MT 06716
-rw-r--r-- | src/lib/formats/dsk_dsk.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/lib/formats/dsk_dsk.cpp b/src/lib/formats/dsk_dsk.cpp index e21598eaf36..db9d54920e5 100644 --- a/src/lib/formats/dsk_dsk.cpp +++ b/src/lib/formats/dsk_dsk.cpp @@ -424,10 +424,27 @@ bool dsk_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) if (tr.number_of_sector == 0) continue; + int protection = 0; + int first_sector_code = -1; + for(int j=0;j<tr.number_of_sector;j++) { + sector_header sector; + io_generic_read(io, §or,track_offsets[(track<<1)+side]+sizeof(tr)+(sizeof(sector)*j),sizeof(sector)); + + if (j == 0) + first_sector_code = sector.sector_size_code; + + if ((j > 0) && (sector.sector_size_code == 2) && (first_sector_code == 6)) + protection = 1; // first: 6144 rest: 512 + + if ((j > 0) && (sector.sector_size_code == j) && (first_sector_code == 0)) + protection = 2; // first: 128 rest: N*128 + } + desc_pc_sector sects[256]; uint8_t sect_data[65536]; int sdatapos = 0; int pos = track_offsets[(track<<1)+side] + 0x100; + for(int j=0;j<tr.number_of_sector;j++) { sector_header sector; io_generic_read(io, §or,track_offsets[(track<<1)+side]+sizeof(tr)+(sizeof(sector)*j),sizeof(sector)); @@ -437,7 +454,14 @@ bool dsk_format::load(io_generic *io, uint32_t form_factor, floppy_image *image) sects[j].sector = sector.sector_id; sects[j].size = sector.sector_size_code; if(extendformat) - sects[j].actual_size = sector.data_length; + { + if (protection == 1) + sects[j].actual_size = 512; + else if (protection == 2) + sects[j].actual_size = 128; + else + sects[j].actual_size = sector.data_length; + } else sects[j].actual_size = 128 << tr.sector_size_code; |