#!/usr/bin/perl -- -*-perl-*- # Eple: assemble .DSK file from those dropped on the program # (c) 2002 Systeme D # doesn't yet check if too many directory entries # no sector interleave yet # @args = ("H1.MXM","PLSPR.BIN","SMLMESS.TXT"); # files to test on use constant USER => 0; # user number use constant SEPARATOR => ':'; # directory separator # ------------------------------------------------------------------------------------------ # Stage 1: Prepare size of image # ------------------------------------------------------------------------------------------ $totalrecs = 2; # total number of records so far $pointer = 0; # which file are we up to? foreach $inputFile (@ARGV) { # @args for testing # ---- Open file open (INFILE, $inputFile) or die "Can't open $inputFile: $!\n"; # ---- Get size of file ($a,$a,$a,$a,$a,$a,$a,$size,$a,$a,$a,$a,$a) = stat(INFILE); $rec = Round($size/1024); if (($rec+$totalrecs)>180) { die "$inputFile: Too many files for a data format .DSK"; } $filename[$pointer] = $inputFile; $filestart[$pointer] = $totalrecs; $filesize[$pointer] = $size; $filerecs[$pointer] = $rec; $extents[$pointer] = Round($rec/16); $cpmrecs[$pointer] = Round($size/128); print "File $pointer: $inputFile. Start record: $totalrecs. Size: $size. Records: $rec. Extents: $extents[$pointer].\n"; $totalrecs=$totalrecs+$rec; $pointer++; close INFILE; } $totalfiles = $pointer-1; # how many files written? # ------------------------------------------------------------------------------------------ # Stage 2: Start writing .DSK # ------------------------------------------------------------------------------------------ print "Enter .DSK filename: "; chomp ($dskfile = ); $dskfile = uc $dskfile.".DSK"; open (OUTFILE, ">$dskfile"); # ---- Write image header print OUTFILE "EXTENDED CPC DSK File\x0D\x0A"; print OUTFILE "Disk-Info\x0D\x0A"; print OUTFILE "Eple v1.0\x00\x00\x00\x00\x00"; print OUTFILE "(\x01\x00\x00"; print OUTFILE "\x13" x 40; print OUTFILE "\x00" x 164; # ------------------------------------------------------------------------------------------ # Stage 3: Write directory # ------------------------------------------------------------------------------------------ $track = 0; $trackbytes = 0; NewTrack(); for ($i=0; $i<=$totalfiles; $i++) { # ---- Convert filename into 8.3 format $thisfile = $filename[$i]; $thisfile = substr($thisfile,rindex($thisfile,SEPARATOR)+1); if (index($thisfile,'.') == -1) { $mainname =$thisfile; $extension=' '; } else { $mainname =substr($thisfile,0,index($thisfile,'.')); $extension=substr($thisfile, index($thisfile,'.')+1); } if (length($mainname)>8 or length($extension)>3) { die "$thisfile: incorrect filename format"; } $mainname = uc $mainname . ' ' x (8-length($mainname )); $extension = uc $extension. ' ' x (3-length($extension)); $cpmrec = $cpmrecs[$i]; $rec = $filerecs[$i]; for ($extent=0; $extent<$extents[$i]; $extent++) { print OUTFILE chr(USER); # user number print OUTFILE $mainname; # filename print OUTFILE $extension; # | print OUTFILE chr($extent); # extent print OUTFILE "\x00\x00"; # not used print OUTFILE chr(Smaller($cpmrec,128)); # number of 128-byte records $blanks=16; # write extent numbers for ($extwrite=0; $extwrite