my $last_bits = '';
sub print_io {
my $bits = shift;
+ my $o_bits = $bits;
$bits = reverse $bits; # make substr work as expected
- return if $last_bits eq $bits;
-
print "pin off io___ ICO prv | " x 4, $openocd_remote,"\n";
foreach my $i ( 0 .. ($#$pin2io/4)-1 ) {
foreach my $j ( 0 .. 3 ) {
print "\n";
}
print "\n";
- $last_bits = $bits;
+ $last_bits = $o_bits;
}
#foreach my $h (qw(0 1 2 e f 10 11 12 1e 1f 20 30 40 50 100 200 1000)) {
my $bin = hex2bin($hex);
diff_bits($BSR, $bin);
$BSR = $bin;
- print_io $bin;
+ print_io $bin if $bin ne $last_bits;
last;
} else {
warn "# in ",dump($_);
print "[press enter]\n";
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];
+if ( $cmd =~ /(p|o)(\d+)=(\d+)/ ) {
+ my ( $what, $p, $v ) = ( $1, $2, $3 );
my $old_bsr = reverse $BSR;
+ my $b = $old_bsr;
+
+ if ( $what eq 'p' && length($v) == 1 ) {
+
+ my $pin = $p;
+ warn "# pin $pin = $v\n";
+
+ my $io = $pin2io->[$pin];
+ my $bit = $io2bit->{$io}->[0];
+
+ $b =
+ substr($old_bsr,0,$bit+1) # leave input as-is
+ . ( $v eq 'Z' ? 1 : 0 ) # control
+ . ( $v & 1 ) # output
+ . substr($old_bsr,$bit+3)
+ ;
+
+ } elsif ( $what eq 'o' && $p < 288 ) {
+ my $o = $p;
+ $b = substr($old_bsr,0,$o) . reverse $v . substr($old_bsr,$o+length($v));
+ } else {
+ print "IGNORED ",dump( $what, $p, $v );
+ }
- my $b = substr($old_bsr,0,$bit+1)
- . ( substr($old_bsr,$bit+1,1) ^ 1 )
- . ( $v & 1 )
- . substr($old_bsr,$bit+3)
- ;
$b = reverse $b;
diff_bits( $BSR, $b ), $/;
print $sock "drscan x300.tap 288 0x", bin2hex($b), "\n";
print $sock "irscan x300.tap 0x00\n"; # EXTEST
print $sock "drscan x300.tap 288 0x", bin2hex($b), "\n";
+
+} elsif ( $cmd =~ m/\?/ ) {
+ $last_bits = '';
+ print $sock "irscan x300.tap 0x55\n"; # SAMPLE/PRELOAD
+ print $sock "drscan x300.tap 288 0\n";
} else {
print $sock "irscan x300.tap 0x55\n"; # SAMPLE/PRELOAD
print $sock "drscan x300.tap 288 0\n";