From: ian Date: Mon, 14 Apr 2008 01:00:26 +0000 (+0000) Subject: depermute detection data X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=8054603e5fc3c34928cdb631f3e3fcd964cebeab;p=trains.git depermute detection data --- diff --git a/layout/data2safety b/layout/data2safety index afbdd97..2561498 100755 --- a/layout/data2safety +++ b/layout/data2safety @@ -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 ($$$$) {