summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats
diff options
context:
space:
mode:
author R. Belmont <rb6502@users.noreply.github.com>2019-07-06 08:01:50 -0400
committer GitHub <noreply@github.com>2019-07-06 08:01:50 -0400
commit7f6cb86c5166bff4569e997f7b44cfdb7fae1c7a (patch)
treedfbfade752ef772bde25e64cc4c26134516df0f9 /src/lib/formats
parentd4a347e8c908fe84f5ff79ef806d8bb6c1b5c638 (diff)
parentab20a16990ac6975f63d63d40549cc64a95ce684 (diff)
Merge pull request #5316 from AmatCoder/AmatCoder-dsk_dsk-1
dsk_dsk.cpp: Surpass some copy-protected tracks
Diffstat (limited to 'src/lib/formats')
-rw-r--r--src/lib/formats/dsk_dsk.cpp26
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, &sector,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, &sector,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;