home *** CD-ROM | disk | FTP | other *** search
- #!/USR/BIN/PERL
- # tHIS pERL SCRIPT TRIES TO DECODE DATA IN cOMMODORE TAPE FORMAT
- # FROM CORRUPTED PULSE STREAMS IN THE "tap FILE" FORMAT.
- # iT TOLERATES LARGE VARIATIONS IN THE PULSE WIDTHS.
-
- # tHIS SCRIPT HAS BEEN SUCCESSFULLY USED IN DECODING DATA FROM ABOUT
- # 18 YEARS OLD TAPES THAT WERE UNREADABLE BY THE cOMMODORE rom
- # ROUTINES.
-
- # uSAGE: ./DECODE.PL DATA.TAP > DATA.BIN 2> ERRORS.TXT
- # yOU WILL NEED TO EDIT "DATA.BIN" - IT CONTAINS TWO COPIES OF EACH BLOCK.
- # tHE FIRST COPY SHOULD START WITH THE COUNTDOWN SEQUENCE $89,$88,...,$81,
- # AND THE SECOND COPY SHOULD START WITH 9,8,...,1. yOU CAN EXTRACT AND
- # COMPARE THE TWO COPIES E.G. WITH gnu eMACS AND DIFF. gOOD LUCK!
-
- # iMPROVEMENTS ARE WELCOMED AT MSMAKELA@NIC.FUNET.FI. oN MY TAPES,
- # THE SCRIPT SEEMS TO REPORT BOGUS PARITY ERRORS - THE DATA BITS ARE
- # OFTEN CORRECT.
-
- {$7b}
- LOCAL $/, $CNT=0, $LAST="";
- $_=<>;
- FOR (SPLIT /([o-~])/)
- {$7b}
- IF ((LENGTH) > 19)
- {$7b}
- WARN "IGNORING ", LENGTH ($LAST) + (LENGTH), " PULSES AT $CNT\N";
- $LAST = "";
- {$7d}
- ELSIF ((LENGTH) < 19)
- {$7b}
- # A MEDIUM PULSE WAS MISINTERPRETED AS A LONG ONE
- $LAST .= $_ IF LENGTH ($LAST) {$7c}{$7c} (LENGTH) > 1;
- IF (LENGTH ($LAST) == 19)
- {$7b}
- $_ = $LAST; $LAST = "";
- {$7d}
- {$7d}
- IF (LENGTH == 19)
- {$7b}
- WARN "IGNORING ", LENGTH ($LAST), " PULSES AT $CNT\N"
- IF LENGTH ($LAST);
- $LAST="";
- $CNT++;
- LOCAL @_ = SPLIT //;
- LOCAL $BITS = "", $PARITY = 0;
- IF ($_[1] GT $_[2]) {$7b}$BITS.="1";$PARITY=!$PARITY{$7d}ELSE{$7b}$BITS.="0"{$7d}
- IF ($_[3] GT $_[4]) {$7b}$BITS.="1";$PARITY=!$PARITY{$7d}ELSE{$7b}$BITS.="0"{$7d}
- IF ($_[5] GT $_[6]) {$7b}$BITS.="1";$PARITY=!$PARITY{$7d}ELSE{$7b}$BITS.="0"{$7d}
- IF ($_[7] GT $_[8]) {$7b}$BITS.="1";$PARITY=!$PARITY{$7d}ELSE{$7b}$BITS.="0"{$7d}
- IF ($_[9] GT $_[10]) {$7b}$BITS.="1";$PARITY=!$PARITY{$7d}ELSE{$7b}$BITS.="0"{$7d}
- IF ($_[11] GT $_[12]) {$7b}$BITS.="1";$PARITY=!$PARITY{$7d}ELSE{$7b}$BITS.="0"{$7d}
- IF ($_[13] GT $_[14]) {$7b}$BITS.="1";$PARITY=!$PARITY{$7d}ELSE{$7b}$BITS.="0"{$7d}
- IF ($_[15] GT $_[16]) {$7b}$BITS.="1";$PARITY=!$PARITY{$7d}ELSE{$7b}$BITS.="0"{$7d}
- IF ($_[17] GT $_[18]) {$7b}$PARITY=!$PARITY{$7d}
- WARN "PARITY ERROR AT $CNT\N" IF ($PARITY);
- PRINT PACK ("B*", $BITS);
- {$7d}
- {$7d}
- {$7d}
-