summaryrefslogtreecommitdiffstats
path: root/reverse_engineering/bits.pl
diff options
context:
space:
mode:
Diffstat (limited to 'reverse_engineering/bits.pl')
-rwxr-xr-xreverse_engineering/bits.pl150
1 files changed, 150 insertions, 0 deletions
diff --git a/reverse_engineering/bits.pl b/reverse_engineering/bits.pl
new file mode 100755
index 0000000..c6b3c7f
--- /dev/null
+++ b/reverse_engineering/bits.pl
@@ -0,0 +1,150 @@
+#!/usr/bin/env perl
+use strict;
+
+use IO::Socket::INET;
+use Data::Dumper;
+#use IO::Socket::Timeout;
+#
+#
+
+my $prompt= '> ';
+
+sub my_readline_worker($)
+{
+my $sock=shift;
+my $ret="";
+my $d="";
+
+while (1) {
+return $ret if $sock->read($d,1)!=1;
+
+next if $d eq "\n";
+
+$ret.=$d;
+
+return $ret if $d eq "\r";
+return $ret if $ret =~ /> $/;
+
+}
+
+
+}
+
+sub my_readline($)
+{
+my $sock=shift;
+my $ret=my_readline_worker($sock);
+#print $ret."\n";
+return $ret;
+}
+
+
+
+
+sub wait_for_prompt($)
+{
+my $ocd=shift;
+
+1 while (my_readline($ocd) ne $prompt);
+}
+
+
+sub open_ocd($) {
+my $addr=shift;
+my $sock = IO::Socket::INET->new( $addr);
+wait_for_prompt($sock);
+return $sock;
+}
+
+
+sub write_reg($$$)
+{
+my ($ocd,$r,$v)=@_;
+
+$ocd->printf("mww 0x%08x 0x%08x\n",$r,$v);
+wait_for_prompt($ocd);
+}
+
+sub read_reg($$)
+{
+my ($ocd,$r)=@_;
+my $ret;
+
+$ocd->printf("mdw 0x%08x\n",$r);
+
+$ret=my_readline($ocd);
+$ret=my_readline($ocd);
+
+wait_for_prompt($ocd);
+
+
+$ret =~ s/[\r\n\s]//g;
+
+
+if ($ret =~ /0x[0-9A-Fa-f]+:([0-9a-fA-F]+)/) {
+ return hex($1);
+}
+
+return undef;
+}
+
+
+sub dir_get($) {
+my $ocd=shift;
+return read_reg($ocd,0x50000514);
+}
+
+
+sub dir_set($$) {
+my ($ocd,$v)=@_;
+write_reg($ocd,0x50000518,$v);
+}
+
+
+sub dir_clr($$) {
+my ($ocd,$v)=@_;
+write_reg($ocd,0x5000051c,$v);
+}
+
+sub io_set($$) {
+my ($ocd,$v)=@_;
+write_reg($ocd,0x50000508,$v);
+}
+
+sub io_clr($$) {
+my ($ocd,$v)=@_;
+write_reg($ocd,0x5000050c,$v);
+}
+
+sub io_get($) {
+my $ocd=shift;
+return read_reg($ocd,0x50000510);
+}
+
+my $ocd=open_ocd('127.0.0.1:4444' );
+
+
+my $ov=-1;
+while (1) {
+my $v=dir_get($ocd);
+
+next if $v == $ov;
+
+$ov=$v;
+
+
+printf "%04b %04b %04b %04b %04b %04b %04b %04b\n",
+ ($v >>28) &0xf,
+ ($v >>24) &0xf,
+
+ ($v >>20) &0xf,
+ ($v >>16) &0xf,
+
+ ($v >>12) &0xf,
+ ($v >>8) &0xf,
+
+ ($v >>4) &0xf,
+ ($v) &0xf;
+
+}
+