chiark / gitweb /
depermute detection data
authorian <ian>
Mon, 14 Apr 2008 01:00:26 +0000 (01:00 +0000)
committerian <ian>
Mon, 14 Apr 2008 01:00:26 +0000 (01:00 +0000)
layout/data2safety

index afbdd9787e2ce351ebac55695aaf47d8b86a97c2..2561498b26d6fa7544d1b0492fa60235c1847be5 100755 (executable)
@@ -52,6 +52,32 @@ our (%kind_count,%pin_info); # from BOARD.pin-info
 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");
@@ -320,10 +346,13 @@ sub boob2objnum_reverse {
 
 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 ($$$$) {