return unpack("B$blen", pack("H$hlen", $h));
}
-my $cmd;
+sub bin2hex {
+ my $b = shift;
+ my $blen = length($b);
+ my $hlen = $blen / 4;
+ return unpack("H$hlen", pack("B$blen", $b));
+}
-while(1) {
+#my $cmd;
+
+my $BSR;
-print $sock "irscan x300.tap 0x55\n";
+# first sample
+print $sock "irscan x300.tap 0x55\n"; # SAMPLE/PRELOAD
print $sock "drscan x300.tap 288 0\n";
-print $sock $cmd if $cmd;
+while(1) {
while (<$sock>) {
warn "<< ",dump($_);
if ( /^\s*([A-F0-9]+)/ ) {
my $hex = $1;
my $bin = hex2bin($hex);
+ $BSR = $bin;
print_io $bin;
last;
} else {
}
}
+sub diff_bits {
+ my ($old, $new) = @_;
+ $old =~ s/(...)/$1 /g;
+ $new =~ s/(...)/$1 /g;
+ my @o = split(/ /, $old);
+ my @n = split(/ /, $new);
+ foreach my $i ( 0 .. $#o ) {
+ if ( $o[$i] eq $n[$i] ) {
+ $o[$i]='.';
+ } else {
+ $o[$i].='>'.$n[$i];
+ }
+ }
+ return join('', @o);
+}
+
print "[press enter]\n";
-<STDIN>;
+my $cmd = <STDIN>;
+chomp $cmd;
+if ( $cmd =~ /(\d+)=(\d)/ ) {
+ my ( $pin, $v ) = ( $1, $2 );
+ warn "# pin $pin = $v\n";
+
+ my $io = $pin2io->[$pin];
+ my $bit = $io2bit->{$io}->[0];
+
+ my $b = substr($BSR,0,$bit+1)
+ . ( substr($BSR,$bit+1,1) ^ 1 )
+ . ( $v & 1 )
+ . substr($BSR,$bit+3)
+ ;
+
+ print diff_bits( $BSR, $b ), $/;
+
+ print $sock "irscan x300.tap 0x00\n"; # EXTEST
+ print $sock "drscan x300.tap 288 0x", bin2hex($b), "\n";
+} else {
+ print $sock "irscan x300.tap 0x55\n"; # SAMPLE/PRELOAD
+ print $sock "drscan x300.tap 288 0\n";
}
+
+
+}#while(1)