diff --git a/PRINTCNF.COB b/PRINTCNF.COB index 54673b8..ee81ec2 100644 --- a/PRINTCNF.COB +++ b/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. diff --git a/WOPO-CNF.COB b/WOPO-CNF.COB index 4dda7f4..65ca2e3 100644 --- a/WOPO-CNF.COB +++ b/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. diff --git a/WOPO.COB b/WOPO.COB index c419a20..c707bbc 100644 --- a/WOPO.COB +++ b/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 " ..." 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 "" 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