Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
66
Task/Subleq/ALGOL-W/subleq.alg
Normal file
66
Task/Subleq/ALGOL-W/subleq.alg
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
% Subleq program interpreter %
|
||||
begin
|
||||
|
||||
% executes the program specified in scode, stops when the instruction %
|
||||
% pointer becomes negative %
|
||||
procedure runSubleq ( integer array scode( * )
|
||||
; integer value codeLength
|
||||
) ;
|
||||
begin
|
||||
integer maxMemory;
|
||||
maxMemory := 3 * 1024;
|
||||
begin
|
||||
integer array memory ( 0 :: maxMemory - 1 );
|
||||
integer ip, a, b, c;
|
||||
for i := 0 until maxMemory - 1 do memory( i ) := 0;
|
||||
% load the program into memory %
|
||||
for i := 0 until codeLength do memory( i ) := scode( i );
|
||||
|
||||
% start at instruction 0 %
|
||||
ip := 0;
|
||||
% execute the instructions until 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 %
|
||||
string(1) input;
|
||||
read( input );
|
||||
memory( b ) := decode( input )
|
||||
end
|
||||
else if b = -1 then begin
|
||||
% output character from a %
|
||||
writeon( code( memory( a ) ) )
|
||||
end
|
||||
else begin
|
||||
% subtract and branch if le 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 %
|
||||
begin
|
||||
integer array code ( 0 :: 31 );
|
||||
integer codePos;
|
||||
codePos := 0;
|
||||
for i := 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
|
||||
do begin
|
||||
code( codePos ) := i;
|
||||
codePos := codePos + 1;
|
||||
end;
|
||||
runSubleq( code, 31 )
|
||||
end
|
||||
|
||||
end.
|
||||
Loading…
Add table
Add a link
Reference in a new issue