Add preliminary program interpreter.
This commit is contained in:
parent
9faf870e6d
commit
22c3b4735a
3 changed files with 319 additions and 6 deletions
43
PRINTCNF.COB
43
PRINTCNF.COB
|
@ -17,6 +17,16 @@
|
|||
SELECT CHANNELS
|
||||
ASSIGN TO DISK
|
||||
ORGANIZATION IS SEQUENTIAL.
|
||||
SELECT PROGRAM-INDEX
|
||||
ASSIGN TO DISK
|
||||
ORGANIZATION IS INDEXED
|
||||
ACCESS MODE IS SEQUENTIAL
|
||||
RECORD KEY IS NAME OF INDEX-ENTRY.
|
||||
SELECT PROGRAM-CODE
|
||||
ASSIGN TO DISK
|
||||
ORGANIZATION IS RELATIVE
|
||||
ACCESS MODE IS DYNAMIC
|
||||
RELATIVE KEY IS PROGRAM-IP.
|
||||
|
||||
DATA DIVISION.
|
||||
FILE SECTION.
|
||||
|
@ -31,10 +41,20 @@
|
|||
FD CHANNELS.
|
||||
01 CHANNEL-RECORD.
|
||||
03 CHANNEL-NAME PIC X(50).
|
||||
FD PROGRAM-INDEX.
|
||||
01 INDEX-ENTRY.
|
||||
03 NAME PIC X(16).
|
||||
03 ADDR PIC 999.
|
||||
FD PROGRAM-CODE.
|
||||
01 PROGRAM-RECORD.
|
||||
03 INSTRUCTION-RECORD PIC X(999).
|
||||
03 PREV-IP PIC 999.
|
||||
03 NEXT-IP PIC 999.
|
||||
|
||||
WORKING-STORAGE SECTION.
|
||||
01 STATE PIC 9(2) VALUE 0.
|
||||
88 DONE VALUE 10.
|
||||
01 PROGRAM-IP PIC 999.
|
||||
|
||||
PROCEDURE DIVISION.
|
||||
DISPLAY "CONFIGURATION ENTRIES:"
|
||||
|
@ -52,6 +72,10 @@
|
|||
PERFORM PRINT-CHANNEL-ENTRY UNTIL DONE.
|
||||
MOVE 0 TO STATE.
|
||||
CLOSE CHANNELS.
|
||||
DISPLAY "PROGRAMS.".
|
||||
OPEN INPUT PROGRAM-INDEX, PROGRAM-CODE.
|
||||
PERFORM PRINT-PROGRAM UNTIL DONE.
|
||||
CLOSE PROGRAM-INDEX, PROGRAM-CODE.
|
||||
EXIT PROGRAM.
|
||||
|
||||
PRINT-CONFIG-ENTRY.
|
||||
|
@ -71,3 +95,22 @@
|
|||
AT END MOVE 10 TO STATE.
|
||||
IF NOT DONE THEN
|
||||
DISPLAY CHANNEL-RECORD.
|
||||
|
||||
PRINT-PROGRAM.
|
||||
READ PROGRAM-INDEX NEXT RECORD
|
||||
AT END MOVE 10 TO STATE.
|
||||
IF NOT DONE THEN
|
||||
DISPLAY NAME OF INDEX-ENTRY
|
||||
MOVE ADDR OF INDEX-ENTRY TO PROGRAM-IP
|
||||
PERFORM PRINT-INSTRUCTION UNTIL DONE
|
||||
MOVE 0 TO STATE.
|
||||
|
||||
PRINT-INSTRUCTION.
|
||||
READ PROGRAM-CODE RECORD
|
||||
AT END MOVE 10 TO STATE.
|
||||
IF NOT DONE THEN
|
||||
DISPLAY PROGRAM-IP, ".", INSTRUCTION-RECORD
|
||||
IF NEXT-IP OF PROGRAM-RECORD IS EQUAL TO 0 THEN
|
||||
MOVE 10 TO STATE
|
||||
ELSE
|
||||
MOVE NEXT-IP OF PROGRAM-RECORD TO PROGRAM-IP.
|
||||
|
|
74
WOPO-CNF.COB
74
WOPO-CNF.COB
|
@ -17,6 +17,16 @@
|
|||
SELECT CHANNELS
|
||||
ASSIGN TO DISK
|
||||
ORGANIZATION IS SEQUENTIAL.
|
||||
SELECT PROGRAM-INDEX
|
||||
ASSIGN TO DISK
|
||||
ORGANIZATION IS INDEXED
|
||||
ACCESS MODE IS RANDOM
|
||||
RECORD KEY IS NAME OF INDEX-ENTRY.
|
||||
SELECT PROGRAM-CODE
|
||||
ASSIGN TO DISK
|
||||
ORGANIZATION IS RELATIVE
|
||||
ACCESS MODE IS SEQUENTIAL
|
||||
RELATIVE KEY IS PROGRAM-IP.
|
||||
|
||||
DATA DIVISION.
|
||||
FILE SECTION.
|
||||
|
@ -31,10 +41,25 @@
|
|||
FD CHANNELS.
|
||||
01 CHANNEL-RECORD.
|
||||
03 CHANNEL-NAME PIC X(50).
|
||||
FD PROGRAM-INDEX.
|
||||
01 INDEX-ENTRY.
|
||||
03 NAME PIC X(16).
|
||||
03 ADDR PIC 999.
|
||||
FD PROGRAM-CODE.
|
||||
01 PROGRAM-RECORD.
|
||||
03 INSTRUCTION PIC X(999).
|
||||
03 PREV-IP PIC 999.
|
||||
03 NEXT-IP PIC 999.
|
||||
|
||||
WORKING-STORAGE SECTION.
|
||||
01 STATE PIC 9(2) VALUE 0.
|
||||
88 DONE VALUE 10.
|
||||
88 WRITING-PROGRAM VALUE 10.
|
||||
88 DONE VALUE 99.
|
||||
01 CURRENT-INSTRUCTION.
|
||||
03 INSTRUCTION PIC X(999).
|
||||
03 PREV-IP PIC 999.
|
||||
03 NEXT-IP PIC 999.
|
||||
01 PROGRAM-IP PIC 999.
|
||||
|
||||
PROCEDURE DIVISION.
|
||||
DISPLAY "WOPO CONFIGURATION PROGRAM".
|
||||
|
@ -54,24 +79,65 @@
|
|||
MOVE 0 TO STATE.
|
||||
PERFORM WRITE-CHANNEL-ENTRY UNTIL DONE.
|
||||
CLOSE CHANNELS.
|
||||
OPEN OUTPUT PROGRAM-INDEX, PROGRAM-CODE.
|
||||
DISPLAY "WRITING PROGRAMS."
|
||||
MOVE 0 TO STATE.
|
||||
PERFORM WRITE-PROGRAM UNTIL DONE.
|
||||
CLOSE PROGRAM-INDEX, PROGRAM-CODE.
|
||||
CALL "PRINT-CONFIG".
|
||||
STOP RUN.
|
||||
|
||||
WRITE-CONFIG-ENTRY.
|
||||
ACCEPT CONFIG-RECORD.
|
||||
IF CONFIG-RECORD IS EQUAL TO SPACES
|
||||
THEN MOVE 10 TO STATE
|
||||
THEN MOVE 99 TO STATE
|
||||
ELSE WRITE CONFIG-RECORD.
|
||||
|
||||
WRITE-USER-ENTRY.
|
||||
ACCEPT USER-RECORD.
|
||||
IF USER-NAME EQUALS SPACES OR USER-LEVEL EQUALS 0
|
||||
THEN MOVE 10 TO STATE
|
||||
THEN MOVE 99 TO STATE
|
||||
ELSE WRITE USER-RECORD.
|
||||
|
||||
WRITE-CHANNEL-ENTRY.
|
||||
ACCEPT CHANNEL-NAME.
|
||||
IF CHANNEL-NAME EQUALS SPACES
|
||||
THEN MOVE 10 TO STATE
|
||||
THEN MOVE 99 TO STATE
|
||||
ELSE WRITE CHANNEL-RECORD.
|
||||
|
||||
WRITE-PROGRAM.
|
||||
ACCEPT NAME OF INDEX-ENTRY.
|
||||
IF NAME OF INDEX-ENTRY EQUALS SPACES THEN
|
||||
D DISPLAY "DONE WRITING PROGRAMS."
|
||||
MOVE 99 TO STATE
|
||||
ELSE
|
||||
D DISPLAY "WRITING PROGRAM ", NAME OF INDEX-ENTRY, "."
|
||||
COMPUTE ADDR OF INDEX-ENTRY = PROGRAM-IP + 1
|
||||
WRITE INDEX-ENTRY
|
||||
MOVE SPACES TO INSTRUCTION OF PROGRAM-RECORD,
|
||||
INSTRUCTION OF CURRENT-INSTRUCTION
|
||||
PERFORM WRITE-PROGRAM-RECORD UNTIL DONE
|
||||
MOVE 0 TO STATE.
|
||||
|
||||
WRITE-PROGRAM-RECORD.
|
||||
ACCEPT INSTRUCTION OF CURRENT-INSTRUCTION.
|
||||
IF INSTRUCTION OF CURRENT-INSTRUCTION EQUALS SPACES THEN
|
||||
D DISPLAY "DONE WRITING PROGRAM ",
|
||||
D NAME OF INDEX-ENTRY, "."
|
||||
MOVE 0 TO NEXT-IP OF PROGRAM-RECORD
|
||||
MOVE 99 TO STATE
|
||||
ELSE
|
||||
D DISPLAY "ACCEPTED INSTRUCTION. ",
|
||||
D INSTRUCTION OF CURRENT-INSTRUCTION
|
||||
COMPUTE NEXT-IP IN PROGRAM-RECORD = PROGRAM-IP + 2
|
||||
IF WRITING-PROGRAM THEN
|
||||
COMPUTE PREV-IP OF CURRENT-INSTRUCTION =
|
||||
PROGRAM-IP + 1
|
||||
ELSE
|
||||
MOVE 0 TO PREV-IP OF CURRENT-INSTRUCTION.
|
||||
IF INSTRUCTION OF PROGRAM-RECORD IS NOT EQUAL TO SPACES THEN
|
||||
D DISPLAY "WRITING INSTRUCTION. ", PROGRAM-RECORD
|
||||
WRITE PROGRAM-RECORD
|
||||
IF NOT DONE THEN
|
||||
MOVE 10 TO STATE.
|
||||
MOVE CURRENT-INSTRUCTION TO PROGRAM-RECORD.
|
||||
|
|
208
WOPO.COB
208
WOPO.COB
|
@ -22,6 +22,16 @@
|
|||
SELECT CHANNELS
|
||||
ASSIGN TO DISK
|
||||
ORGANIZATION IS SEQUENTIAL.
|
||||
SELECT PROGRAM-INDEX
|
||||
ASSIGN TO DISK
|
||||
ORGANIZATION IS INDEXED
|
||||
ACCESS MODE IS DYNAMIC
|
||||
RECORD KEY IS NAME OF INDEX-ENTRY.
|
||||
SELECT PROGRAM-CODE
|
||||
ASSIGN TO DISK
|
||||
ORGANIZATION IS RELATIVE
|
||||
ACCESS MODE IS RANDOM
|
||||
RELATIVE KEY IS PROGRAM-IP.
|
||||
|
||||
DATA DIVISION.
|
||||
FILE SECTION.
|
||||
|
@ -35,6 +45,21 @@
|
|||
03 USER-LEVEL PIC 9(2).
|
||||
FD CHANNELS.
|
||||
01 CHANNEL-NAME PIC X(50).
|
||||
FD PROGRAM-INDEX.
|
||||
01 INDEX-ENTRY.
|
||||
03 NAME PIC X(16).
|
||||
03 ADDR PIC 999.
|
||||
FD PROGRAM-CODE.
|
||||
01 PROGRAM-RECORD.
|
||||
03 INSTRUCTION.
|
||||
05 IN-REG PIC 9.
|
||||
88 INPUT-FROM-RECORD VALUE 9.
|
||||
05 OUT-REG PIC 9.
|
||||
05 INTERPRETER PIC X(5).
|
||||
05 INSTRUCTION-CODE PIC X(992).
|
||||
03 RAW-INSTRUCTION REDEFINES INSTRUCTION PIC X(999).
|
||||
03 PREV-IP PIC 999.
|
||||
03 NEXT-IP PIC 999.
|
||||
|
||||
WORKING-STORAGE SECTION.
|
||||
*CONFIGURATION "CONSTANTS"
|
||||
|
@ -126,6 +151,16 @@
|
|||
03 MAYBE-CYCLE-LIMIT PIC 9(5)
|
||||
VALUE 0.
|
||||
|
||||
01 INTERPRETER-STATE.
|
||||
03 PROGRAM-IP PIC 999.
|
||||
03 IP-TEMP PIC 999.
|
||||
|
||||
01 PROGRAM-LISTING-HEADER.
|
||||
03 FILLER PIC X(4) VALUE " IP.".
|
||||
03 FILLER PIC X(2) VALUE "IO".
|
||||
03 FILLER PIC X(5) VALUE " LANG".
|
||||
03 FILLER PIC X(5) VALUE " CODE".
|
||||
|
||||
01 FORMATTED-TIME.
|
||||
03 FILLER PIC X VALUE "H".
|
||||
03 HOURS-DIGITS PIC 99.
|
||||
|
@ -523,7 +558,7 @@
|
|||
IF R(3) IS NOT EQUAL TO R(2) THEN
|
||||
MOVE 0 TO STATE
|
||||
PERFORM HANDLE-SWITCHES UNTIL DONE.
|
||||
IF STANDARD-INPUT THEN
|
||||
IF NUM-PARAMS OF WOPO IS GREATER THAN 1 THEN
|
||||
MOVE 2 TO PTR(1)
|
||||
MOVE 8 TO DEST
|
||||
PERFORM GET-REST
|
||||
|
@ -578,7 +613,15 @@
|
|||
ELSE IF R(1) IS EQUAL TO "CAT" THEN
|
||||
PERFORM HANDLE-CAT
|
||||
ELSE IF R(1) IS EQUAL TO "DUMP-REGS" THEN
|
||||
PERFORM HANDLE-DUMP-REGS.
|
||||
PERFORM HANDLE-DUMP-REGS
|
||||
ELSE IF R(1) IS EQUAL TO "PROGRAMS" THEN
|
||||
PERFORM HANDLE-PROGRAMS
|
||||
ELSE IF R(1) IS EQUAL TO "LIST-PROGRAM" THEN
|
||||
PERFORM HANDLE-LIST-PROGRAM
|
||||
ELSE IF R(1) IS EQUAL TO "RUN" THEN
|
||||
PERFORM HANDLE-RUN
|
||||
ELSE
|
||||
PERFORM INTERPRET-PROGRAM.
|
||||
D PERFORM DEBUG-REGISTERS
|
||||
D VARYING WOPO-COUNTER
|
||||
D FROM 1, BY 1
|
||||
|
@ -1112,6 +1155,167 @@
|
|||
FROM 1, BY 1,
|
||||
UNTIL WOPO-COUNTER IS GREATER THAN 8.
|
||||
|
||||
STRING-PROGRAM-NAME.
|
||||
READ PROGRAM-INDEX NEXT RECORD
|
||||
AT END MOVE 99 TO STATE.
|
||||
IF NOT DONE THEN
|
||||
STRING NAME OF INDEX-ENTRY DELIMITED BY SPACE,
|
||||
" " DELIMITED BY SIZE
|
||||
INTO R(1)
|
||||
WITH POINTER PTR(1).
|
||||
|
||||
HANDLE-PROGRAMS.
|
||||
OPEN INPUT PROGRAM-INDEX.
|
||||
MOVE 1 TO SRC, PTR(1).
|
||||
MOVE 0 TO STATE.
|
||||
PERFORM STRING-PROGRAM-NAME UNTIL DONE.
|
||||
CLOSE PROGRAM-INDEX.
|
||||
STRING "$NUL$"
|
||||
INTO R(1)
|
||||
WITH POINTER PTR(1).
|
||||
PERFORM BEGIN-STANDARD-REPLY.
|
||||
PERFORM DO-OUTPUT.
|
||||
|
||||
LIST-INSTRUCTION.
|
||||
READ PROGRAM-CODE RECORD.
|
||||
MOVE 1 TO SRC, PTR(1).
|
||||
STRING PROGRAM-IP, ".",
|
||||
RAW-INSTRUCTION OF PROGRAM-RECORD
|
||||
INTO R(1),
|
||||
WITH POINTER PTR(1).
|
||||
PERFORM BEGIN-STANDARD-REPLY.
|
||||
PERFORM DO-OUTPUT.
|
||||
IF NEXT-IP OF PROGRAM-RECORD IS NOT EQUAL TO 0 THEN
|
||||
MOVE NEXT-IP OF PROGRAM-RECORD TO PROGRAM-IP
|
||||
ELSE
|
||||
MOVE 99 TO STATE.
|
||||
|
||||
LIST-PROGRAM.
|
||||
MOVE INPUT-SOURCE TO SRC.
|
||||
PERFORM GET-PARAM.
|
||||
MOVE 1 TO SRC.
|
||||
MOVE R(1) TO NAME OF INDEX-ENTRY.
|
||||
MOVE 0 TO STATE.
|
||||
READ PROGRAM-INDEX RECORD
|
||||
INVALID KEY
|
||||
MOVE 1 TO PTR(1)
|
||||
STRING "NO SUCH PROGRAM " DELIMITED BY SIZE,
|
||||
NAME OF INDEX-ENTRY DELIMITED BY SPACE,
|
||||
".$NUL$" DELIMITED BY SIZE
|
||||
INTO R(1)
|
||||
WITH POINTER PTR(1)
|
||||
PERFORM BEGIN-STANDARD-REPLY
|
||||
PERFORM DO-OUTPUT
|
||||
MOVE 99 TO STATE.
|
||||
IF NOT DONE THEN
|
||||
PERFORM BEGIN-STANDARD-REPLY
|
||||
PERFORM DO-OUTPUT
|
||||
MOVE PROGRAM-LISTING-HEADER TO R(1)
|
||||
PERFORM BEGIN-STANDARD-REPLY
|
||||
PERFORM DO-OUTPUT
|
||||
MOVE ADDR OF INDEX-ENTRY TO PROGRAM-IP
|
||||
PERFORM LIST-INSTRUCTION UNTIL DONE.
|
||||
|
||||
HANDLE-LIST-PROGRAM.
|
||||
MOVE 1 TO DEST.
|
||||
PERFORM INDEX-PARAMS.
|
||||
IF NUM-PARAMS OF WOPO IS LESS THAN 1 THEN
|
||||
MOVE "<PROGRAM NAME> ..." TO R(1)
|
||||
MOVE 1 TO SRC
|
||||
PERFORM USAGE-REPLY
|
||||
ELSE
|
||||
OPEN INPUT PROGRAM-INDEX, PROGRAM-CODE
|
||||
PERFORM LIST-PROGRAM
|
||||
VARYING PTR(SRC)
|
||||
FROM 1, BY 1,
|
||||
UNTIL PTR(SRC) IS GREATER THAN NUM-PARAMS OF WOPO
|
||||
CLOSE PROGRAM-INDEX, PROGRAM-CODE.
|
||||
|
||||
DO-NEXT-INSTRUCTION.
|
||||
READ PROGRAM-CODE RECORD.
|
||||
IF IN-REG IS NOT EQUAL TO 9 THEN
|
||||
MOVE IN-REG TO INPUT-SOURCE
|
||||
ELSE
|
||||
IF NEXT-IP OF PROGRAM-RECORD IS EQUAL TO 0 THEN
|
||||
STRING "MISSING INPUT RECORD FOR INSTRUCTION ",
|
||||
PROGRAM-IP,
|
||||
" IN PROGRAM " DELIMITED BY SIZE,
|
||||
NAME OF INDEX-ENTRY DELIMITED BY SPACE,
|
||||
".$NUL$"
|
||||
INTO R(1)
|
||||
MOVE 1 TO SRC
|
||||
PERFORM BEGIN-STANDARD-REPLY
|
||||
PERFORM DO-OUTPUT
|
||||
MOVE 99 TO STATE
|
||||
ELSE
|
||||
MOVE PROGRAM-IP TO IP-TEMP
|
||||
MOVE NEXT-IP OF PROGRAM-RECORD TO PROGRAM-IP
|
||||
READ PROGRAM-CODE RECORD
|
||||
MOVE RAW-INSTRUCTION TO R(8)
|
||||
MOVE 8 TO INPUT-SOURCE
|
||||
MOVE IP-TEMP TO PROGRAM-IP
|
||||
READ PROGRAM-CODE RECORD.
|
||||
IF NOT DONE THEN
|
||||
MOVE OUT-REG TO OUTPUT-DEST
|
||||
MOVE INSTRUCTION-CODE TO R(1)
|
||||
IF INTERPRETER OF PROGRAM-RECORD IS EQUAL TO "WOPO" THEN
|
||||
PERFORM HANDLE-COMMAND
|
||||
MOVE 0 TO STATE
|
||||
ELSE
|
||||
STRING "INVALID INTERPRETER " DELIMITED BY SIZE,
|
||||
INTERPRETER DELIMITED BY SPACE,
|
||||
" IN INSTRUCTION ",
|
||||
PROGRAM-IP,
|
||||
" IN PROGRAM " DELIMITED BY SIZE,
|
||||
NAME OF INDEX-ENTRY DELIMITED BY SPACE,
|
||||
".$NUL$"
|
||||
INTO R(1)
|
||||
MOVE 1 TO SRC
|
||||
PERFORM BEGIN-STANDARD-REPLY
|
||||
PERFORM DO-OUTPUT
|
||||
MOVE 99 TO STATE.
|
||||
IF NEXT-IP OF PROGRAM-RECORD IS EQUAL TO 0 THEN
|
||||
MOVE 99 TO STATE
|
||||
ELSE
|
||||
MOVE NEXT-IP OF PROGRAM-RECORD TO PROGRAM-IP.
|
||||
|
||||
INTERPRET-PROGRAM.
|
||||
OPEN INPUT PROGRAM-INDEX.
|
||||
MOVE R(1) TO NAME OF INDEX-ENTRY.
|
||||
MOVE 0 TO STATE.
|
||||
READ PROGRAM-INDEX RECORD
|
||||
INVALID KEY MOVE 99 TO STATE.
|
||||
IF DONE THEN
|
||||
STRING "NO SUCH PROGRAM " DELIMITED BY SIZE
|
||||
NAME OF INDEX-ENTRY DELIMITED BY SPACE,
|
||||
".$NUL$"
|
||||
INTO R(1)
|
||||
MOVE 1 TO SRC
|
||||
PERFORM BEGIN-STANDARD-REPLY
|
||||
PERFORM DO-OUTPUT
|
||||
ELSE
|
||||
OPEN INPUT PROGRAM-CODE
|
||||
MOVE ADDR OF INDEX-ENTRY TO PROGRAM-IP
|
||||
PERFORM DO-NEXT-INSTRUCTION UNTIL DONE
|
||||
CLOSE PROGRAM-CODE.
|
||||
CLOSE PROGRAM-INDEX.
|
||||
|
||||
HANDLE-RUN.
|
||||
MOVE 1 TO DEST.
|
||||
PERFORM INDEX-PARAMS.
|
||||
IF NUM-PARAMS OF WOPO IS LESS THAN 1 THEN
|
||||
MOVE "<PROGRAM NAME>" TO R(1)
|
||||
MOVE 1 TO SRC
|
||||
PERFORM USAGE-REPLY
|
||||
ELSE
|
||||
MOVE 1 TO PTR(SRC)
|
||||
PERFORM GET-PARAM
|
||||
IF NUM-PARAMS OF WOPO IS GREATER THAN 1 THEN
|
||||
MOVE 2 TO PTR(SRC), DEST
|
||||
PERFORM GET-REST
|
||||
MOVE R(2) TO R(8).
|
||||
PERFORM INTERPRET-PROGRAM.
|
||||
|
||||
HANDLE-CTCP.
|
||||
D DISPLAY "HANDLING CTCP.".
|
||||
IF NOTICE AND
|
||||
|
|
Loading…
Reference in a new issue