47 lines
2 KiB
Text
47 lines
2 KiB
Text
# Subleq program interpreter #
|
|
# executes the program specified in code, stops when the instruction pointer #
|
|
# becomes negative #
|
|
PROC run subleq = ( []INT code )VOID:
|
|
BEGIN
|
|
INT max memory = 3 * 1024;
|
|
[ 0 : max memory - 1 ]INT memory;
|
|
# load the program into memory #
|
|
# a slice yields a row with LWB 1... #
|
|
memory[ 0 : UPB code - LWB code ] := code[ AT 1 ];
|
|
# start at instruction 0 #
|
|
INT ip := 0;
|
|
# execute the instructions until ip is < 0 #
|
|
WHILE ip >= 0 DO
|
|
# get three words at ip and advance ip past them #
|
|
INT a := memory[ ip ];
|
|
INT b := memory[ ip + 1 ];
|
|
INT c := memory[ ip + 2 ];
|
|
ip +:= 3;
|
|
# execute according to a, b and c #
|
|
IF a = -1 THEN
|
|
# input a character to b #
|
|
CHAR input;
|
|
get( stand in, ( input ) );
|
|
memory[ b ] := ABS input
|
|
ELIF b = -1 THEN
|
|
# output character from a #
|
|
print( ( REPR memory[ a ] ) )
|
|
ELSE
|
|
# subtract and branch if le 0 #
|
|
memory[ b ] -:= memory[ a ];
|
|
IF memory[ b ] <= 0 THEN
|
|
ip := c
|
|
FI
|
|
FI
|
|
OD
|
|
END # run subleq # ;
|
|
|
|
# test the interpreter with the hello-world program specified in the task #
|
|
run subleq( ( 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
|
|
)
|
|
)
|