#!/usr/local/bin/perl -w #prepare: # install ports/archivers/macutils # install ports/misc/xd # install ports/graphics/netpbm # hexbin -d gogo.hqx (GoGo!.data is extracted) # macunpack GoGo!.data (Go-Go.bin is extracted) #usage: perl gogo.pl < Go-Go.bin > gogo.bit # xd -vAC -2 -w 16 gogo.bit | sed 's/ //g' > gogo.01 # split -l 228 gogo.01 # for i in x??; do (echo P1; echo 125 228; sed 's/...$//;s/./& /g' $i) | ppmtogif > $i.gif; done # gifmerge -6 *.gif > gogo.gif use strict; sub gogo_line($) { my ($s) = @_; my $ret = ""; my $l = length($s); my $i = 0; while ($i < $l) { my $x = ord(substr($s, $i++, 1)); if ($x >= 0x80) { my $c = substr($s, $i++, 1); my $n = -($x - 0x100) + 1; my $j; for ($j = 0; $j < $n; $j++) { $ret .= $c; } } else { $ret .= substr($s, $i, $x + 1); $i += $x + 1; } } return $ret; } sub main() { my $buf; seek(STDIN, 0x688, 0); while (read(STDIN, $buf, 1) && ord($buf) != 0xff) { my $x = ord($buf); if ($x == 0xa0) { read(STDIN, $buf, 2); } elsif ($x == 0x01) { read(STDIN, $buf, 39); } else { read(STDIN, $buf, $x); my $out = gogo_line($buf); printf("%s", $out); } } return 0; } exit main();