aboutsummaryrefslogtreecommitdiff
path: root/mklevelinfo.pl
diff options
context:
space:
mode:
Diffstat (limited to 'mklevelinfo.pl')
-rw-r--r--mklevelinfo.pl91
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";
+}