# $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
($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;
}
}
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
#
# * 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);
}
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 ($$) {
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 {
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");
# }
# }
# }
+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();