--- /dev/null
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+use HADES::TrbNet;
+#use Data::Dumper::Concise;
+use Data::Dumper;
+use DBM::Deep;
+#use IO::All;
+#my $db = io $fn;
+use English;
+
+my $address = 0x16f7;
+my @registers = ();
+
+my $fn = "/tmp/.trbnet_save_regs.db";
+my $db = DBM::Deep->new(file => $fn, locking => 1, autoflush => 1) || die "could not open file: $fn";
+
+trb_init_ports() or die trb_strerror();
+
+#print Dumper $PROGRAM_NAME;
+
+$address = shift @ARGV;
+@registers = @ARGV;
+
+usage() unless($address);
+usage() unless(@registers);
+
+$address = hex($address) if($address=~/^0x/);
+
+
+if ($PROGRAM_NAME=~/save/) {
+ save_regs(@registers);
+}
+else {
+ restore_regs(@registers);
+}
+
+sub save_regs {
+ my @regs = @_;
+
+ my $rh_res;
+ foreach my $cur_reg (@regs) {
+
+ $cur_reg = hex($cur_reg) if($cur_reg=~/^0x/);
+ #print Dumper $cur_reg;
+ $rh_res = trb_register_read($address, $cur_reg);
+ #print Dumper $rh_res;
+ if(!defined $rh_res) {
+ my $res = trb_strerror();
+ print "error output: $res\n";
+ exit();
+ }
+ else {
+ my $val = $rh_res->{$address};
+ #printf("0x%08x\n", $val);
+ printf "read: address: 0x%x, register: 0x%x value: 0x%x\n", $address, $cur_reg, $val;
+ $db->{address}->{$cur_reg} = $val;
+ }
+ }
+
+}
+
+sub usage {
+ print "usage:
+ trbcmd<save|restore> <address> <list of registers>\n";
+
+ exit;
+}
+
+sub restore_regs {
+ my @regs = @_;
+
+ my $rh_res;
+ foreach my $cur_reg (@regs) {
+
+ $cur_reg = hex($cur_reg) if($cur_reg=~/^0x/);
+ my $val = $db->{address}->{$cur_reg};
+ unless (defined $val) {
+ printf "register 0x%x is not stored, so skipping.\n", $cur_reg;
+ next;
+ }
+ #print Dumper $cur_reg;
+ $rh_res = trb_register_write($address, $cur_reg, $val);
+ printf "wrote: address: 0x%x, register: 0x%x value: 0x%x\n", $address, $cur_reg, $val;
+ #print Dumper $rh_res;
+ if(!defined $rh_res) {
+ my $res = trb_strerror();
+ print "error output: $res\n";
+ exit();
+ }
+ }
+
+}
+
+