From: ian Date: Sun, 4 Dec 2005 15:56:51 +0000 (+0000) Subject: new pin data arrangements, wip X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=618d0a4f112b9e7c155599720ed25d27a205e25d;p=trains.git new pin data arrangements, wip --- diff --git a/layout/data2safety b/layout/data2safety index be6041a..e84539a 100755 --- a/layout/data2safety +++ b/layout/data2safety @@ -28,15 +28,16 @@ our (%nodes); # $nodes{$node}[$side]{Seg} # $nodes{$node}[$side]{End} -our ($nextboardnum,@boardtype,%numboards,$nreverses); +our ($nextboardnum,@boardtype,%numboards,$nreverses,@sensesin,@sensesbase); # @boardtype[$boardnum] # $numboards{$type} # $nreverses -# $boardobjbase[$boardnum]{$kind} +# $sensesin[$page] +# $sensesbase[$boardnum]= ($page << 7) | $baselsbyte $nextboardnum= 0; $nreverses= 0; +$sensesin[0]= 0; @objkinds= qw(pt sense reverse); -map { $boardobjbase[0]{$_}= 1; } @objkinds; our (%kind_count,%pin_info); # from BOARD.pin-info @@ -119,16 +120,34 @@ sub line_boards () { ($num,$type)=($1,$2); mistake("board $num when expected $nextboardnum") if $num != $nextboardnum; + $nextboardnum++; - require "./$type.pin-info"; $boardtype[$num]= $type; $numboards{$type}++; - if ($type eq 'reversers') { - my ($i,$objnum); - for ($i=0; $i<5; $i++) { - $objnum= so_boob('reverse', [ $num,$i ]); - $nreverses= $objnum+1 if $objnum >= $nreverses; - } + require "./$type.pin-info"; + + my ($sense_count, $page); + $sense_count= $kind_count{$type}{'sense'}; + for ($page=0; + $sensesin[$page] + $sense_count > 128; + $page++) { + mistake("too many senses for encoding scheme") + if $page > 7; + push @sensesin, 0 + if $page > $#sensesin; + } + $sensesbase[$num]= ($page << 7) | $sensesin[$page]; + $sensesin[$page] += $sense_count; + + &{"line_board_$type"}($num); +} + +sub line_board_reversers ($) { + my ($num) = @_; + my ($i,$objnum); + for ($i=0; $i<5; $i++) { + $objnum= so_boob('reverse', [ $num,$i ]); + $nreverses= $objnum+1 if $objnum >= $nreverses; } } @@ -211,16 +230,17 @@ sub pa_boob ($) { return [ $1,$2 ]; } -# so_boob_KIND($boardnum,$boardtype,$objnum) -> global object number +# so_boob_KIND($boardnum,$objnum,$boardtype,$pininfo) -> global object number -sub so_boob_pt($$$) { - my ($boardnum,$boardtype,$obj)=@_; - die if $boardnum>31 || $obj>31; +sub so_boob_pt { + my ($boardnum,$obj)=@_; + mistake("point encoding out of range") if $boardnum>31; + die if $obj > 31; return ($boardnum << 5) | $obj; } -sub so_boob_reverse($$$) { - my ($boardnum,$boardtype,$obj)=@_; +sub so_boob_reverse { + my ($boardnum,$obj,$boardtype)=@_; # Converts board and object number (in canonical pic number plus # and reverse0...reverse5 as seen on pinout diagrams), to @@ -238,11 +258,9 @@ sub so_boob_reverse($$$) { # # * We compute the README.protocol bit and byte number. - my ($cycle); - mistake("reversable segment on non-reversers board $board") - unless $boardtype eq 'reversers'; - mistake("reversable segment out of range") - unless unless $obj>=0 && $obj<6; + my ($cycle,$boardincycle,$cyclebasebyte,$byte,$bit); + die unless $boardtype eq 'reversers'; + die if $obj > 5; $obj = sprintf '%d', $obj; $obj =~ y/302154/543210/; # mapping due to polarity_do_here $cycle= int(($boardnum+3) / 7); @@ -264,9 +282,11 @@ sub so_boob_reverse($$$) { } sub so_boob_sense($$$) { - my ($boardnum,$boardtype,$obj)=@_; - - die 'unimplemented'; + my ($boardnum,$obj)=@_; + my ($inpage); + $inpage= $obj + $sensesbase[$boardnum]; + die if $inpage > 127; + return ($boardnum << 7) | $inpage; } sub so_boob ($$) { @@ -277,11 +297,11 @@ sub so_boob ($$) { mistake("unknown board number $board") unless defined $boardtype[$board]; $type= $boardtype[$board]; - $objnum= &{"so_boob_$kind"}($board,$type,$obj); $pi= $pin_info{$type}{$kind}; mistake("object reference $kind $board.$obj out of range for". " board type $type") unless defined $pi->[$obj]; + $objnum= &{"so_boob_$kind"}($board,$obj,$type,$pi); $pin_used{$kind}[$objnum]= [ $board, $pi->[$obj], $obj ]; return sprintf("%4d /* %d.%-2d*/", $objnum, $board, $obj); } else { @@ -421,17 +441,28 @@ sub writeout () { o("\n};\n"); } -sub writeasm () { - my ($k,$w,$i,@d,$or,$p,$portnum,$bit,$each); - close STDOUT or die $!; - open STDOUT, ">$basename-pindata.asm" or die $!; - o("; autogenerated - do not edit\n"); - o(" include pindata.inc\n". - " radix hex\n". - "X equ 0xff\n"); - o(" -# $each= 10; -# for $k (@objkinds) { +# writeasm_KIND() + +sub o_section ($) { + my ($sec) = @_; + o("$sec code ${sec}_start"); +} + +sub writeasm_sense { + o_section("pindata_pic2detinfo"); + o("Exists equ 0x8000\n". + "Detectors equ 0x0080\n". + "Reversers equ 0x0000\n"); + for ($num=0; $num<@boardtype; $num++) { + if (!defined $boardtype[$num]) { o(" dw 0\n"); next; } + $base= $sensesbase[$num]; + o(sprintf " dw Exists | %-10s | 0x%02x%02x\n", + ucfirst($boardtype[$num]), $base >> 7, $base & 0x7f); + } + o(sprintf " fill 0, maxboards_count-%d\n", $num); + o("\n"); +} + # for $w (qw(pic port bit)) { # @d=(); # o("\n"); @@ -477,6 +508,18 @@ sub writeasm () { # } # } # } +sub writeasm () { + my ($k,$w,$i,@d,$or,$p,$portnum,$bit,$each); + close STDOUT or die $!; + open STDOUT, ">$basename-pindata.asm" or die $!; + o("; autogenerated - do not edit\n"); + o(" include pindata.inc\n". + " radix dec\n". + "X equ 0xff\n"); + $each= 10; + for $k (@objkinds) { + &{"writeasm_$k"}(); + } o("\n end\n"); } mainread();