81 lines
3.1 KiB
COBOL
81 lines
3.1 KiB
COBOL
identification division.
|
|
program-id. subleq-program.
|
|
data division.
|
|
working-storage section.
|
|
01 subleq-source-code.
|
|
05 source-string pic x(2000).
|
|
01 subleq-virtual-machine.
|
|
05 memory-table.
|
|
10 memory pic s9999
|
|
occurs 500 times.
|
|
05 a pic s9999.
|
|
05 b pic s9999.
|
|
05 c pic s9999.
|
|
05 instruction-pointer pic s9999.
|
|
05 input-output-character pic x.
|
|
01 working-variables.
|
|
05 loop-counter pic 9999.
|
|
05 instruction-counter pic 9999.
|
|
05 string-pointer pic 9999.
|
|
05 adjusted-index-a pic 9999.
|
|
05 adjusted-index-b pic 9999.
|
|
05 output-character-code pic 9999.
|
|
procedure division.
|
|
read-source-paragraph.
|
|
accept source-string from console.
|
|
display 'READING SUBLEQ PROGRAM... ' with no advancing.
|
|
move 1 to string-pointer.
|
|
move 0 to instruction-counter.
|
|
perform split-source-paragraph varying loop-counter from 1 by 1
|
|
until loop-counter is greater than 500
|
|
or string-pointer is greater than 2000.
|
|
display instruction-counter with no advancing.
|
|
display ' WORDS READ.'.
|
|
execute-paragraph.
|
|
move 1 to instruction-pointer.
|
|
move 0 to instruction-counter.
|
|
display 'BEGINNING RUN... '.
|
|
display ''.
|
|
perform execute-instruction-paragraph
|
|
until instruction-pointer is negative.
|
|
display ''.
|
|
display 'HALTED AFTER ' instruction-counter ' INSTRUCTIONS.'.
|
|
stop run.
|
|
execute-instruction-paragraph.
|
|
add 1 to instruction-counter.
|
|
move memory(instruction-pointer) to a.
|
|
add 1 to instruction-pointer.
|
|
move memory(instruction-pointer) to b.
|
|
add 1 to instruction-pointer.
|
|
move memory(instruction-pointer) to c.
|
|
add 1 to instruction-pointer.
|
|
if a is equal to -1 then perform input-paragraph.
|
|
if b is equal to -1 then perform output-paragraph.
|
|
if a is not equal to -1 and b is not equal to -1
|
|
then perform subtraction-paragraph.
|
|
split-source-paragraph.
|
|
unstring source-string delimited by all spaces
|
|
into memory(loop-counter)
|
|
with pointer string-pointer.
|
|
add 1 to instruction-counter.
|
|
input-paragraph.
|
|
display '> ' with no advancing.
|
|
accept input-output-character from console.
|
|
add 1 to b giving adjusted-index-b.
|
|
move function ord(input-output-character)
|
|
to memory(adjusted-index-b).
|
|
subtract 1 from memory(adjusted-index-b).
|
|
output-paragraph.
|
|
add 1 to a giving adjusted-index-a.
|
|
add 1 to memory(adjusted-index-a) giving output-character-code.
|
|
move function char(output-character-code)
|
|
to input-output-character.
|
|
display input-output-character with no advancing.
|
|
subtraction-paragraph.
|
|
add 1 to c.
|
|
add 1 to a giving adjusted-index-a.
|
|
add 1 to b giving adjusted-index-b.
|
|
subtract memory(adjusted-index-a) from memory(adjusted-index-b).
|
|
if memory(adjusted-index-b) is equal to zero
|
|
or memory(adjusted-index-b) is negative
|
|
then move c to instruction-pointer.
|