mirror of
https://github.com/trudnai/Steve2.git
synced 2024-12-22 21:29:50 +00:00
188 lines
5.0 KiB
Plaintext
188 lines
5.0 KiB
Plaintext
|
#!/usr/bin/perl
|
||
|
|
||
|
my $state = 'begin';
|
||
|
|
||
|
my $trk = 0;
|
||
|
my $sec = 0;
|
||
|
|
||
|
my @sectorData = ();
|
||
|
|
||
|
my $reLDA_C08C = qr/LDA\s+\$C08C,X\t0x([8-9A-Fa-f][0-9A-Fa-f])/;
|
||
|
my $reLDY_C08C = qr/LDY\s+\$C08C,X\t0x([0-9A-Fa-f]{2})\t0x([0-9A-Fa-f]{2})\t0x([8-9A-Fa-f][0-9A-F])/;
|
||
|
|
||
|
my $reSTA_0300 = qr/STA\s+\$0300,Y\t0x([0-9A-F]{2})\t0x([0-9A-F]{2})\t0x([0-9A-F]{2})/;
|
||
|
my $reSTA_26Y = qr/STA\s+\(\$26\),Y\t0x([0-9A-F]{2})\t0x([0-9A-F]{2})\t0x([0-9A-F]{2})/;
|
||
|
|
||
|
|
||
|
sub hexdump {
|
||
|
my ($arr) = @_;
|
||
|
|
||
|
for($i = 0; $i < scalar(@{$arr}); $i++) {
|
||
|
if ( $i % 16 == 0 ) {
|
||
|
printf("\n%04X: ", $i);
|
||
|
}
|
||
|
printf("%02X ", @{$arr}[$i]);
|
||
|
}
|
||
|
|
||
|
print "\n";
|
||
|
}
|
||
|
|
||
|
|
||
|
while (<>) {
|
||
|
|
||
|
chomp;
|
||
|
s/[\n\r]+//;
|
||
|
|
||
|
print;
|
||
|
|
||
|
{ # for the redo to avoid print input twice
|
||
|
|
||
|
if ( $state eq 'begin' ) {
|
||
|
if ( /LDA\s+\$C08C,X\t0xD5/ ) {
|
||
|
print "\t marker D5";
|
||
|
$state = 'loaded_D5';
|
||
|
}
|
||
|
}
|
||
|
elsif ( $state eq 'loaded_D5' ) {
|
||
|
if ( /LDA\s+\$C08C,X\t0xAA/ ) {
|
||
|
print "\t marker AA";
|
||
|
$state = 'loaded_AA';
|
||
|
}
|
||
|
elsif ( /$reLDA_C08C/ ) {
|
||
|
$state = 'begin';
|
||
|
redo;
|
||
|
}
|
||
|
}
|
||
|
elsif ( $state eq 'loaded_AA' ) {
|
||
|
if ( /LDA\s+\$C08C,X\t0x96/ ) {
|
||
|
print "\t marker 96";
|
||
|
$state = 'loaded_96';
|
||
|
print "\t; sector marker";
|
||
|
}
|
||
|
elsif ( /$reLDA_C08C/ ) {
|
||
|
$state = 'begin';
|
||
|
redo;
|
||
|
}
|
||
|
}
|
||
|
elsif ( $state eq 'loaded_96' ) {
|
||
|
if ( /$reLDA_C08C/ ) {
|
||
|
print "\t marker v1";
|
||
|
$state = 'loaded_v1';
|
||
|
}
|
||
|
}
|
||
|
elsif ( $state eq 'loaded_v1' ) {
|
||
|
if ( /$reLDA_C08C/ ) {
|
||
|
print "\t marker v2";
|
||
|
$state = 'loaded_v2';
|
||
|
}
|
||
|
}
|
||
|
elsif ( $state eq 'loaded_v2' ) {
|
||
|
if ( /$reLDA_C08C/ ) {
|
||
|
print "\t marker t1:$1";
|
||
|
$trk = hex($1) << 1;
|
||
|
$trk |= 1;
|
||
|
$state = 'loaded_t1';
|
||
|
}
|
||
|
}
|
||
|
elsif ( $state eq 'loaded_t1' ) {
|
||
|
if ( /$reLDA_C08C/ ) {
|
||
|
print "\t marker t2:$1";
|
||
|
$trk &= hex($1);
|
||
|
print "\t; trk:$trk";
|
||
|
$state = 'loaded_t2';
|
||
|
}
|
||
|
}
|
||
|
elsif ( $state eq 'loaded_t2' ) {
|
||
|
if ( /$reLDA_C08C/ ) {
|
||
|
print "\t marker s1:$1";
|
||
|
$sec = hex($1) << 1;
|
||
|
$sec |= 1;
|
||
|
$state = 'loaded_s1';
|
||
|
}
|
||
|
}
|
||
|
elsif ( $state eq 'loaded_s1' ) {
|
||
|
if ( /$reLDA_C08C/ ) {
|
||
|
print "\t marker s2:$1";
|
||
|
$sec &= hex($1);
|
||
|
print "\t; sec:$sec";
|
||
|
$state = 'loaded_s2';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
elsif ( $state eq 'loaded_s2' ) {
|
||
|
if ( /LDA\s+\$C08C,X\t0xD5/ ) {
|
||
|
print "\t marker D5";
|
||
|
$state = 'waitingfor_AA';
|
||
|
}
|
||
|
elsif ( /EOR\s+#\$D5/ ) {
|
||
|
$state = 'begin';
|
||
|
redo;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
elsif ( $state eq 'waitingfor_AA' ) {
|
||
|
if ( /LDA\s+\$C08C,X\t0xAA/ ) {
|
||
|
print "\t marker AA 2";
|
||
|
$state = 'waitingfor_AD';
|
||
|
}
|
||
|
elsif ( /$reLDA_C08C/ ) {
|
||
|
$state = 'begin';
|
||
|
redo;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
elsif ( $state eq 'waitingfor_AD' ) {
|
||
|
if ( /LDA\s+\$C08C,X\t0xAD/ ) {
|
||
|
print "\t marker AD";
|
||
|
$state = 'loaded_AD';
|
||
|
print "\t; sector data marker";
|
||
|
}
|
||
|
elsif ( /EOR\s+#\$D5/ ) {
|
||
|
$state = 'begin';
|
||
|
redo;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
elsif ( $state eq 'loaded_AD' ) {
|
||
|
if ( /$reLDY_C08C/ ) {
|
||
|
print "\t byte read: $3 (t:$trk s:$sec)";
|
||
|
}
|
||
|
elsif ( /$reSTA_0300/ ) {
|
||
|
printf( "\t byte to mem: \$%04X:$1\n", 0x300 + hex($3) );
|
||
|
}
|
||
|
elsif ( /$reSTA_26Y/ ) {
|
||
|
my $y = hex($3);
|
||
|
printf( "\t byte to mem ind: (\$26)+\$%02X:$1\n", $y );
|
||
|
if ($y >= 255) {
|
||
|
$state = 'sector_decode';
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
elsif ( $state eq 'sector_decode' ) {
|
||
|
if ( /$reSTA_26Y/ ) {
|
||
|
$i = hex($1);
|
||
|
$y = hex($3);
|
||
|
printf( "\t byte to mem ind: (\$26)+\$%02X:$1\n", $y );
|
||
|
$sectorData[$y] = $i;
|
||
|
if ($y >= 255) {
|
||
|
$state = 'sector_decode';
|
||
|
print "\nHEXDUMP track: $trk sector: $sec\n";
|
||
|
hexdump(\@sectorData);
|
||
|
}
|
||
|
}
|
||
|
elsif ( /$reLDA_C08C/ ) {
|
||
|
$state = 'begin';
|
||
|
redo;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} # for the redo to avoid print input twice
|
||
|
|
||
|
print "\n";
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|