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}}==