Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
52
Task/Subleq/XPL0/subleq.xpl0
Normal file
52
Task/Subleq/XPL0/subleq.xpl0
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
\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
|
||||
Loading…
Add table
Add a link
Reference in a new issue