53 lines
1.8 KiB
Plaintext
53 lines
1.8 KiB
Plaintext
\Subleq program interpreter
|
|
|
|
\Executes the program specified in scode, stops when the instruction
|
|
\ pointer becomes negative.
|
|
procedure RunSubleq ( SCode, CodeLength);
|
|
integer SCode, CodeLength;
|
|
define MaxMemory = 3 * 1024;
|
|
integer Memory ( MaxMemory );
|
|
integer IP, A, B, C, I;
|
|
begin
|
|
begin
|
|
for I := 0 to MaxMemory - 1 do Memory( I ) := 0;
|
|
\Load the program into Memory
|
|
for I := 0 to CodeLength do Memory( I ) := SCode( I );
|
|
\Start at instruction 0
|
|
IP := 0;
|
|
\Execute the instructions to IP is < 0
|
|
while IP >= 0 do begin
|
|
\Get three words at IP and advance IP past them
|
|
A := Memory( IP );
|
|
B := Memory( IP + 1 );
|
|
C := Memory( IP + 2 );
|
|
IP := IP + 3;
|
|
\Execute according to A, B and C
|
|
if A = -1 then begin
|
|
\Input a character to B
|
|
Memory( B ) := ChIn(1)
|
|
end
|
|
else if B = -1 then begin
|
|
\Output character from A
|
|
ChOut(0, Memory ( A ) )
|
|
end
|
|
else begin
|
|
\Subtract and branch if <= 0
|
|
Memory( B ) := Memory( B ) - Memory( A );
|
|
if Memory( B ) <= 0 then IP := C
|
|
end
|
|
end \while-do
|
|
end
|
|
end \RunSubleq \;
|
|
|
|
\Test the interpreter with the hello-world program specified in the task
|
|
integer Code;
|
|
begin
|
|
Code := [ 15, 17, -1, 17, -1, -1
|
|
, 16, 1, -1, 16, 3, -1
|
|
, 15, 15, 0, 0, -1, 72
|
|
, 101, 108, 108, 111, 44, 32
|
|
, 119, 111, 114, 108, 100, 33
|
|
, 10, 0 ];
|
|
RunSubleq( Code, 31 )
|
|
end
|