diff options
Diffstat (limited to 'mklevelinfo.pl')
-rw-r--r-- | mklevelinfo.pl | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/mklevelinfo.pl b/mklevelinfo.pl new file mode 100644 index 0000000..56a8894 --- /dev/null +++ b/mklevelinfo.pl @@ -0,0 +1,91 @@ +#!/usr/bin/perl -w + +%struct = ( + 0 => [ 2, 'desc', "first 2 bytes are level number in screencodes" ], + 2 => [ 2, 'sub0', "a subroutine" ], + 4 => [ 2, 'sub1', "a subroutine" ], + 6 => [ 2, 'sub2', "a subroutine" ], + 8 => [ 2, 'sub3', "a subroutine" ], + 10 => [ 1, 'num_bombs', "number of bombs to pick up on this level" ], + 11 => [ 1, 'bullet_chance', '0 = no bullets' ], + 12 => [ 1, 'y_start', 'jumpman starting Y position' ], + 13 => [ 1, 'x_start', 'jumpman starting X position' ], + 14 => [ 2, 'offs', 'points to $0600' ], + 16 => [ 1, 'points_per_bomb', 'points awarded per bomb pickup (always $64 aka 100)' ], + 17 => [ 2, 'time_bonus', 'amount of time bonus at start of level' ], + 19 => [ 1, 'offs', 'always $00' ], + 20 => [ 2, 'unkn_table0', 'pointer to ROM table or $06xx' ], + 22 => [ 2, 'map0', 'map data' ], + 24 => [ 2, 'map1', 'map data' ], + 26 => [ 2, 'map2', 'map data' ], + 28 => [ 2, 'unkn_table1', 'unknown, pointer to a ROM table or $0000' ], + 30 => [ 2, 'offs', 'always $0000' ], + 32 => [ 2, 'sub4', '$06E6 for most levels, or else a ROM subroutine' ], + 34 => [ 2, 'sub5', '$06E6 for some levels, or else a ROM subroutine' ], + 36 => [ 2, 'sub6', 'always $9740 aka game_main_loop' ], + 38 => [ 2, 'sub_eol', 'called at end of level (all bombs picked up). $06E6 for all but level07' ], + 40 => [ 6, 'offs', 'all zeroes' ], + 46 => [ 9, 'offs', 'unknown' ], + 55 => [ 3, 'offs', 'unknown, always $00 $00 $00' ], + 58 => [ 2, 'offs', 'unknown, not a ROM address' ], + 60 => [ 4, 'offs', 'unknown, level05 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00' ], +); + +sub mkaddr { + return sprintf("\$%04x", $_[0]); +} + +sub mknum { + return sprintf("%02d", $_[0]); +} + +sub mkrange { + my ($level, $label, $start, $len, $type, $comment) = @_; + my $sa = mkaddr($start); + my $ea = mkaddr($start + $len - 1); + my $llab; + if($level >= 0) { + my $ll = sprintf("%02d", $level); + $llab = "level$ll"; + } else { + if($level == -609) { + $llab = "cur_level"; + } else { + $llab = "work_level"; + } + my $l = <<EOF; +label { name "${llab}_$label"; addr $sa; size $len; comment "$comment"; }; +EOF + return $l; + } + my $range = <<EOF; +range { name "${llab}_$label"; start $sa; end $ea; type $type; comment "$comment"; }; +EOF + return $range; +} + +for $level (-610,-609,0..11) { + $addr = 0xa000 + $level * 0x40; + for $offset (sort { $a <=> $b } keys %struct) { + my ($size, $label, $comment) = @{$struct{$offset}}; + if($level == 0 && $offset == 0) { + $comment = "64-byte level descriptors, 12 of them (1 per level). " . $comment; + } + + $type = 'bytetable'; + if(($label =~ /^sub/) or ($label =~ /^map/) or ($label =~ /^unkn_table/)) { + $type = 'addrtable'; + } + + if($label eq 'time_bonus') { + $type = 'wordtable'; + } + + if($label eq 'offs') { + $label .= "_" . mknum($offset); + } + + print mkrange($level, $label, $addr + $offset, $size, $type, $comment); + } + print "\n"; +} |