Prepare for block level program handling
This commit is contained in:
parent
96a4705cce
commit
ee896160b3
@ -4,6 +4,7 @@ namespace Automata;
|
|||||||
|
|
||||||
use Automata\Storage\ProgramMemory;
|
use Automata\Storage\ProgramMemory;
|
||||||
use Automata\Storage\ToolMemory;
|
use Automata\Storage\ToolMemory;
|
||||||
|
use Program\Block;
|
||||||
use Program\Program;
|
use Program\Program;
|
||||||
use Program\Word;
|
use Program\Word;
|
||||||
use RuntimeException;
|
use RuntimeException;
|
||||||
@ -55,28 +56,21 @@ class Machine
|
|||||||
throw new RuntimeException('No program loaded');
|
throw new RuntimeException('No program loaded');
|
||||||
}
|
}
|
||||||
foreach ($this->activeProgram as $block) {
|
foreach ($this->activeProgram as $block) {
|
||||||
|
$this->executeBlock($block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function executeBlock(Block $block): void
|
||||||
|
{
|
||||||
/** @var Word[] $words */
|
/** @var Word[] $words */
|
||||||
$words = $block->words;
|
$words = $block->words;
|
||||||
while ($word = array_shift($words)) {
|
while ($word = array_shift($words)) {
|
||||||
if ('G22' === $word->toString()) {
|
|
||||||
$identifier = array_shift($words);
|
|
||||||
if ($identifier->register !== 'X') {
|
|
||||||
throw new RuntimeException('Expected X9xxx after G22');
|
|
||||||
}
|
|
||||||
$subProgram = $this->subProgramMemory->read($identifier->value);
|
|
||||||
$this->programStack->push($subProgram);
|
|
||||||
system('clear');
|
|
||||||
dump($subProgram);
|
|
||||||
readline();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$this->state->apply($word);
|
$this->state->apply($word);
|
||||||
system('clear');
|
system('clear');
|
||||||
dump($this->state);
|
dump($this->state);
|
||||||
readline();
|
readline();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function reset(): void
|
public function reset(): void
|
||||||
|
@ -13,9 +13,7 @@ class ProgramMemory
|
|||||||
|
|
||||||
public function save(Program $program): void
|
public function save(Program $program): void
|
||||||
{
|
{
|
||||||
if ($program->N > 9998 || $program->N < 9001) {
|
$this->guardInvalidProgramNumber($program->N);
|
||||||
throw new InvalidArgumentException('Program number must be in range 9001 - 9998');
|
|
||||||
}
|
|
||||||
$this->memory[$program->N] = $program;
|
$this->memory[$program->N] = $program;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -24,4 +22,13 @@ class ProgramMemory
|
|||||||
{
|
{
|
||||||
return @$this->memory[$N];
|
return @$this->memory[$N];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function guardInvalidProgramNumber(int $N): void
|
||||||
|
{
|
||||||
|
if ($N > 9998 || $N < 9001) {
|
||||||
|
throw new InvalidArgumentException('Program number must be in range 9001 - 9998');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace Automata\Storage;
|
namespace Automata\Storage;
|
||||||
|
|
||||||
use Automata\Tool;
|
use Automata\Tool;
|
||||||
|
use InvalidArgumentException;
|
||||||
|
|
||||||
class ToolMemory
|
class ToolMemory
|
||||||
{
|
{
|
||||||
@ -12,6 +13,7 @@ class ToolMemory
|
|||||||
|
|
||||||
public function save(Tool $tool): void
|
public function save(Tool $tool): void
|
||||||
{
|
{
|
||||||
|
$this->guardInvalidToolNumber($tool->T);
|
||||||
$this->memory[$tool->T] = $tool;
|
$this->memory[$tool->T] = $tool;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -20,4 +22,13 @@ class ToolMemory
|
|||||||
{
|
{
|
||||||
return @$this->memory[$T];
|
return @$this->memory[$T];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function guardInvalidToolNumber(int $T): void
|
||||||
|
{
|
||||||
|
if ($T < 1 || $T > 64) {
|
||||||
|
throw new InvalidArgumentException('Tool number must be in range 1 - 64');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user