Subleq: Difference between revisions
Content added Content deleted
Line 1,207: | Line 1,207: | ||
halt: Say 'REXX program halted by user.'; |
halt: Say 'REXX program halted by user.'; |
||
Exit 1</lang> |
Exit 1</lang> |
||
=={{header|Pascal}}== |
|||
<lang pascal>PROGRAM OISC; |
|||
CONST |
|||
MAXADDRESS = 1255; |
|||
TYPE |
|||
MEMORY = PACKED ARRAY [0 .. MAXADDRESS] OF INTEGER; |
|||
VAR |
|||
MEM : MEMORY; |
|||
FILENAME : STRING; |
|||
PROCEDURE LOADTEXT (FILENAME : STRING; VAR MEM : MEMORY); |
|||
VAR |
|||
NUMBERS : TEXT; |
|||
ADDRESS : INTEGER; |
|||
BEGIN |
|||
ASSIGN (NUMBERS, FILENAME); |
|||
ADDRESS := 0; |
|||
RESET (NUMBERS); |
|||
WHILE (ADDRESS <= MAXADDRESS) AND NOT EOF (NUMBERS) DO BEGIN |
|||
READ (NUMBERS, MEM [ADDRESS]); |
|||
ADDRESS := ADDRESS + 1 |
|||
END; |
|||
CLOSE (NUMBERS); |
|||
FOR ADDRESS := ADDRESS TO MAXADDRESS DO |
|||
MEM [ADDRESS] := 0 |
|||
END; |
|||
PROCEDURE SUBLEQ (VAR MEM : MEMORY); |
|||
VAR |
|||
ADDRESS, A, B, C : INTEGER; |
|||
IO : CHAR; |
|||
BEGIN |
|||
ADDRESS := 0; |
|||
WHILE ADDRESS >= 0 DO BEGIN |
|||
A := MEM [ADDRESS]; |
|||
B := MEM [ADDRESS + 1]; |
|||
C := MEM [ADDRESS + 2]; |
|||
ADDRESS := ADDRESS + 3; |
|||
IF A = -1 THEN BEGIN |
|||
READ (IO); |
|||
MEM [B] := ORD (IO) |
|||
END |
|||
ELSE IF B = -1 THEN BEGIN |
|||
IO := CHR (MEM [A]); |
|||
WRITE (IO) |
|||
END |
|||
ELSE BEGIN |
|||
MEM [B] := MEM [B] - MEM [A]; |
|||
IF MEM [B] <= 0 THEN ADDRESS := C |
|||
END |
|||
END |
|||
END; |
|||
BEGIN |
|||
WRITE ('Filename>'); |
|||
READLN (FILENAME); |
|||
LOADTEXT (FILENAME, MEM); |
|||
SUBLEQ (MEM); |
|||
END.</lang> |
|||
{{in}} |
|||
hello-world.txt |
|||
<pre>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</pre> |
|||
{{out}} |
|||
<pre>Filename>hello-world.txt |
|||
Hello, world!</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |