chiark / gitweb /
new pin data arrangements, wip
authorian <ian>
Sun, 4 Dec 2005 15:56:51 +0000 (15:56 +0000)
committerian <ian>
Sun, 4 Dec 2005 15:56:51 +0000 (15:56 +0000)
layout/data2safety

index be6041a3480cfcbe008e6a5cf28c890b88fd7e83..e84539a83002cc6482d7b8571132127c63c58a29 100755 (executable)
@@ -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();