| #!/usr/bin/perl | |
| use Getopt::Long; | |
| use integer; | |
| $helpusage = "placeholder"; | |
| GetOptions ('len=s' => \$len, | |
| 'num=s' => \$num, | |
| 'den=s' => \$den, | |
| 'skip' => \$skip) || die("$helpusage"); | |
| if (!defined($len)) { $len=8; } | |
| $LEN=$len; | |
| $n=d2b($num); # numerator - quotient | |
| $m=d2b($den); # denominator - divisor | |
| printf(".i 8\n"); | |
| printf(".o 4\n"); | |
| printf(".ilb q_ff[3] q_ff[2] q_ff[1] q_ff[0] m_ff[3] m_ff[2] m_ff[1] m_ff[0]\n"); | |
| printf(".ob smallnum[3] smallnum[2] smallnum[1] smallnum[0]\n"); | |
| printf(".type fr\n"); | |
| for ($q=0; $q<16; $q++) { | |
| for ($m=0; $m<16; $m++) { | |
| if ($m==0) { next; } | |
| $result=int($q/$m); | |
| printf("%s %s %s\n",d2bl($q,4),d2bl($m,4),d2bl($result,4)); | |
| } | |
| } | |
| exit; | |
| #$LEN=length($n); | |
| $a="0"x$LEN; | |
| $q=$n; | |
| #printf("n=%s, m=%s\n",$n,$m); | |
| #printf("a=%s, q=%s\n",$a,$q); | |
| for ($i=1; $i<=$LEN; $i++) { | |
| #printf("iteration $n:\n"); | |
| printf("$i: a=%s q=%s\n",$a,$q); | |
| $signa = substr($a,0,1); | |
| $a = substr($a.$q,1,$LEN); # new a with q shifted in | |
| if ($signa==0) { $a=b2d($a)-b2d($m); } | |
| else { $a=b2d($a)+b2d($m); } | |
| $a=d2b($a); | |
| $signa = substr($a,0,1); | |
| if ($signa==0) { $q=substr($q,1,$LEN-1)."1"; } | |
| else { $q=substr($q,1,$LEN-1)."0"; } | |
| } | |
| #printf("a=$a\n"); | |
| $signa = substr($a,0,1); | |
| if ($signa==1 && !defined($skip)) { | |
| printf("correction:\n"); | |
| $a=b2d($a)+b2d($m); | |
| $a=d2b($a); | |
| } | |
| #printf("a=$a\n"); | |
| printf("%d / %d = %d R %d ",b2d($n),b2d($m),b2d($q),b2d($a)); | |
| if ($a eq $n) { printf("-> remainder equal numerator\n"); } | |
| else { printf("\n"); } | |
| sub b2d { | |
| my ($v) = @_; | |
| $v = oct("0b" . $v); | |
| return($v); | |
| } | |
| sub d2b { | |
| my ($v) = @_; | |
| my $repeat; | |
| $v = sprintf "%b",$v; | |
| if (length($v)<$LEN) { | |
| $repeat=$LEN-length($v); | |
| $v="0"x$repeat.$v; | |
| } | |
| elsif (length($v)>$LEN) { | |
| $v=substr($v,length($v)-$LEN,$LEN); | |
| } | |
| return($v); | |
| } | |
| sub d2bl { | |
| my ($v,$LEN) = @_; | |
| my $repeat; | |
| $v = sprintf "%b",$v; | |
| if (length($v)<$LEN) { | |
| $repeat=$LEN-length($v); | |
| $v="0"x$repeat.$v; | |
| } | |
| elsif (length($v)>$LEN) { | |
| $v=substr($v,length($v)-$LEN,$LEN); | |
| } | |
| return($v); | |
| } |