Jump to content

Fixing Bellcom disk D068_A, The Nephew

Posted by Atari_Ace, 08 August 2018 · 97 views

Bellcom disk D068_A is the first disk in the Bellcom archive I've examined where the damage is substantial.  This is the first disk of a four disk graphical adventure from Germany, "The Nephew".  The Bellcom catalog exclaims: "I had this unique game translated into English because I knew you’d want it."  All the sectors from 952 up are empty, except for 1024 (where the DOS 2.5 is partially stored), but the directory shows that at least two files (ROLLE, HINTS.BAS) should have data there.  So let's see what we can find to fix this.
I decided to use the string "TAKE, OPEN, " which is on the disk to look for a donor disk, and I added all the TOSEC Atari 8-bit images from archive.org to increase my chances of finding matches.  Sure enough, that TOSEC archive proved useful, as it has a four disk set for the Nephew.  The third and fourth disks are exact matches of disk Bellcom disks D069_A and D069_B, and I can see that there is data from sectors 952 up on the first disk.  There are about 75 sectors to copy, so I could invoke our given single sector tool that many times to fix it.  But let's extend the tool to copy sector ranges instead.

sub copy_sector {
  my ($srcFile, $dstFile, $srcSector, $dstSector, $fixlink, $count) = @_;
  $fixlink = 1 if !defined $fixlink;
  $count = 1 if !defined $count;
  my $raw = $srcSector =~ /^0x/;
  my $src = $raw ? { buff => read_file($srcFile) } : read_disk($srcFile);
  my $dst = read_disk($dstFile);
  for (; $count > 0; $count--) {
    my $srcOffset = $raw ? hex $srcSector : (sector_offset($src, $srcSector))[0];
    my ($dstOffset, $sectorSize) = sector_offset($dst, $dstSector);
    my $sectorData = substr($src->{buff}, $srcOffset, $sectorSize);
    substr($sectorData, -1, 1) = pack "C", $sectorSize - 3 if $raw && $fixlink;
    substr($dst->{buff}, $dstOffset, $sectorSize) = $sectorData;
    fix_disk_link($dst, $dstSector) if $fixlink;
    $srcSector = $raw ? $srcSector + $sectorSize : $srcSector + 1;
  write_file($dstFile, $dst->{buff});

This routine isn't substantially different than the last version, except for the optional $count value you can specify.  Using this, we can do:
atr.pl -copy src.atr D068_A.atr 951 951 0 75
And voila, we replace all those blank sectors with full ones from the TOSEC disk.  Interestingly, the resulting disk isn't an exact copy of the disk from the TOSEC archive.  The TOSEC version has some changes to the Turbo BASIC runtime in sectors 42 and 43 so that it loads saying "The Nephew" instead of "TURBO-BASIC XL 1.6".  So the Bellcom version does differ slightly from the TOSEC version.
Attached File  D068_A.atr (130.02KB)
downloads: 5
There may be problems with the 2nd disk as well, but I'll revisit that another day.

December 2018

910111213 14 15