6 my @code = map { chomp; [ split /\s+/ ] } <>;
9 my ($regs, $pc, $qsnd, $qrecv, $nsnd) = @_;
10 while ($$pc < @code) {
11 my ($ins, $a1, $a2) = @{ $code[$$pc] };
12 my $v1 = $a1 =~ /[a-z]/ ? $regs->{$a1} : $a1
14 my $v2 = $a2 =~ /[a-z]/ ? $regs->{$a2} : $a2
18 $$nsnd++ if defined $nsnd;
21 } elsif ($ins eq 'set') {
23 } elsif ($ins eq 'add') {
25 } elsif ($ins eq 'mul') {
27 } elsif ($ins eq 'mod') {
29 } elsif ($ins eq 'rcv') {
31 $regs->{$a1} = shift @$qrecv;
35 } elsif ($ins eq 'jgz') {
36 $$pc += $v2-1 if $v1 > 0;
38 die "unknown insn $ins";
48 my ($pc0, $pc1) = (0, 0);
49 my ($s0, $s1) = (0, 0);
52 if ($s0 == 0 || ($s0 == 1 && @q1to0)) {
53 $s0 = execute(\%regs0, \$pc0, \@q0to1, \@q1to0);
54 # say "p0 state $s0 at $pc0";
56 if ($s1 == 0 || ($s1 == 1 && @q0to1)) {
57 $s1 = execute(\%regs1, \$pc1, \@q1to0, \@q0to1, \$nsnd);
58 # say "p1 state $s1 at $pc1";
60 last if ($s0 >= 1 && $s1 >= 1);