our ($mode,$invertible);
$mode= 'barf';
+our (%sensepermute);
+# $sensepermute{$boardtype}[$objonboard]= $offset
+
+sub sensepermute_bitmap ($$$) {
+ my ($kind,$base,$mapstring) = @_;
+ my ($objnum,$bitnum);
+ my (@map)= split /\s+/, $mapstring;
+ @map==8 or die;
+ $bitnum= 0;
+ while (@map) {
+ $objnum= pop @map;
+ next if $objnum =~ m/[a-z]/i;
+ $objnum =~ m/^\d\d$/ or die "$kind $objnum ($bitnum) ?";
+ $objnum =~ s/^0*\B//;
+ die "$kind $objnum ($bitnum from $base)" if
+ defined $sensepermute{$kind}[$objnum];
+ $sensepermute{$kind}[$objnum]= $bitnum;
+ $bitnum++;
+ }
+}
+# see detect.asm:
+sensepermute_bitmap('reversers', 0, 'MM zz 01 02 03 00 04 05');
+sensepermute_bitmap('detectors', 0, 'MM 05 B2 B1 10 13 16 08');
+sensepermute_bitmap('detectors', 5, '19 09 12 15 18 04 20 17');
+sensepermute_bitmap('detectors', 13, '06 01 07 02 11 14 03 00');
+
sub line_barf () {
return if $mistakes;
mistake("first input line does not determine phase");
sub boob2objnum_sense {
my ($boardnum,$obj)=@_;
- my ($inpage);
- $inpage= $obj + $sensesbase[$boardnum];
- die if $inpage > 127;
- return ($boardnum << 7) | $inpage;
+ my $type= $boardtype[$boardnum];
+ my $bitnum= $sensepermute{$type}[$obj];
+ die "$type $obj ($boardnum)" unless defined $bitnum;
+ my $base= $sensesbase[$boardnum];
+ my $inpage= $base & 0x7f;
+ die if $inpage+$bitnum > 127;
+ return $base+$bitnum;
}
sub boob2objnum ($$$$) {