Add 8-bit wraparound, make loops actually work

This commit is contained in:
Quinn Evans 2015-10-01 00:29:29 -06:00
parent 0c253dc34c
commit 3969cf49b8
1 changed files with 72 additions and 24 deletions

View File

@ -13,7 +13,7 @@
03 LOOP-STATE PIC 99 VALUE 0. 03 LOOP-STATE PIC 99 VALUE 0.
88 DONE VALUE 99. 88 DONE VALUE 99.
01 BF-MEMORY. 01 BF-MEMORY.
03 BF-CELL PIC S999 03 BF-CELL PIC 999
USAGE COMPUTATIONAL USAGE COMPUTATIONAL
OCCURS 9999 TIMES OCCURS 9999 TIMES
INDEXED BY CURRENT-CELL. INDEXED BY CURRENT-CELL.
@ -32,6 +32,19 @@
01 CONVERSION. 01 CONVERSION.
03 CHAR-CODE PIC 999. 03 CHAR-CODE PIC 999.
03 COBOL-STRING PIC X(6). 03 COBOL-STRING PIC X(6).
D01 DEBUG-DISPLAY.
D 03 FILLER PIC XXX VALUE "IP.".
D 03 DEBUG-IP PIC 9(3).
D 03 FILLER PIC X VALUE ";".
D 03 DEBUG-INSTRUCTION PIC X.
D 03 FILLER PIC X(5) VALUE "CELL.".
D 03 DEBUG-CURRENT-CELL PIC 999.
D 03 FILLER PIC X(4) VALUE "VAL.".
D 03 DEBUG-CELL PIC 999.
D 03 FILLER PIC X VALUE "L".
D 03 DEBUG-LOOP-DEPTH PIC 99.
D 03 FILLER PIC X VALUE "C".
D 03 DEBUG-CYCLES PIC 9(5).
LINKAGE SECTION. LINKAGE SECTION.
01 BF-I-O. 01 BF-I-O.
@ -54,6 +67,7 @@
FROM 1 BY 1 FROM 1 BY 1
UNTIL CURRENT-CELL IS GREATER THAN 9999. UNTIL CURRENT-CELL IS GREATER THAN 9999.
SET CURRENT-CELL TO 1. SET CURRENT-CELL TO 1.
D MOVE 1 TO DEBUG-CURRENT-CELL.
PERFORM EXECUTE-INSTRUCTION PERFORM EXECUTE-INSTRUCTION
UNTIL CYCLES IS GREATER THAN OR EQUAL TO CYCLE-LIMIT. UNTIL CYCLES IS GREATER THAN OR EQUAL TO CYCLE-LIMIT.
EXIT PROGRAM. EXIT PROGRAM.
@ -67,54 +81,80 @@
READ-INSTRUCTION. READ-INSTRUCTION.
IF IP IS LESS THAN 512 THEN IF IP IS LESS THAN 512 THEN
UNSTRING BF-CODE INTO CURRENT-INSTRUCTION WITH POINTER IP UNSTRING BF-CODE INTO CURRENT-INSTRUCTION WITH POINTER IP
D DISPLAY CURRENT-INSTRUCTION
ELSE ELSE
MOVE 99 TO LOOP-STATE. MOVE 99 TO LOOP-STATE.
EXECUTE-INSTRUCTION. EXECUTE-INSTRUCTION.
MOVE 0 TO LOOP-STATE. MOVE 0 TO LOOP-STATE.
D DISPLAY IP, BF-CELL(CURRENT-CELL), LOOP-DEPTH, CYCLES.
PERFORM READ-INSTRUCTION. PERFORM READ-INSTRUCTION.
D MOVE IP TO DEBUG-IP.
D MOVE CURRENT-INSTRUCTION TO DEBUG-INSTRUCTION.
D MOVE BF-CELL(CURRENT-CELL) TO DEBUG-CELL.
D MOVE LOOP-DEPTH TO DEBUG-LOOP-DEPTH.
D MOVE CYCLES TO DEBUG-CYCLES.
D DISPLAY DEBUG-DISPLAY.
IF DONE THEN IF DONE THEN
D DISPLAY "GOING TO HELL" D DISPLAY "GOING TO HELL"
GO TO HELL. GO TO HELL.
IF BF-LEFT THEN IF BF-LEFT THEN
PERFORM DO-LEFT PERFORM DO-LEFT
ELSE IF BF-RIGHT THEN MOVE 99 TO LOOP-STATE
ELSE IF BF-RIGHT AND NOT DONE THEN
PERFORM DO-RIGHT PERFORM DO-RIGHT
ELSE IF BF-DEC THEN MOVE 99 TO LOOP-STATE
ELSE IF BF-DEC AND NOT DONE THEN
PERFORM DO-DEC PERFORM DO-DEC
ELSE IF BF-INC THEN MOVE 99 TO LOOP-STATE
ELSE IF BF-INC AND NOT DONE THEN
PERFORM DO-INC PERFORM DO-INC
ELSE IF BF-OUT THEN MOVE 99 TO LOOP-STATE
ELSE IF BF-OUT AND NOT DONE THEN
PERFORM DO-OUT PERFORM DO-OUT
ELSE IF BF-IN THEN MOVE 99 TO LOOP-STATE
ELSE IF BF-IN AND NOT DONE THEN
PERFORM DO-IN PERFORM DO-IN
ELSE IF BF-BEGIN THEN MOVE 99 TO LOOP-STATE
ELSE IF BF-BEGIN AND NOT DONE THEN
PERFORM DO-BEGIN PERFORM DO-BEGIN
ELSE IF BF-END THEN MOVE 99 TO LOOP-STATE
ELSE IF BF-END AND NOT DONE THEN
PERFORM DO-END PERFORM DO-END
ELSE IF BF-DIE THEN MOVE 99 TO LOOP-STATE
ELSE IF BF-DIE AND NOT DONE THEN
GO TO HELL. GO TO HELL.
ADD 1 TO CYCLES. ADD 1 TO CYCLES.
DO-LEFT. DO-LEFT.
IF CURRENT-CELL IS GREATER THAN 1 THEN IF CURRENT-CELL IS GREATER THAN 1 THEN
SET CURRENT-CELL DOWN BY 1 SET CURRENT-CELL DOWN BY 1
D SUBTRACT 1 FROM DEBUG-CURRENT-CELL
ELSE ELSE
D MOVE 9999 TO DEBUG-CURRENT-CELL
SET CURRENT-CELL TO 9999. SET CURRENT-CELL TO 9999.
MOVE 99 TO LOOP-STATE.
DO-RIGHT. DO-RIGHT.
IF CURRENT-CELL IS LESS THAN 9999 THEN IF CURRENT-CELL IS LESS THAN 9999 THEN
SET CURRENT-CELL UP BY 1 SET CURRENT-CELL UP BY 1
D ADD 1 TO DEBUG-CURRENT-CELL
ELSE ELSE
D MOVE 1 TO DEBUG-CURRENT-CELL
SET CURRENT-CELL TO 1. SET CURRENT-CELL TO 1.
MOVE 99 TO LOOP-STATE.
DO-DEC. DO-DEC.
SUBTRACT 1 FROM BF-CELL(CURRENT-CELL). IF BF-CELL(CURRENT-CELL) > 0 THEN
SUBTRACT 1 FROM BF-CELL(CURRENT-CELL)
ELSE
MOVE 255 TO BF-CELL(CURRENT-CELL).
MOVE 99 TO LOOP-STATE.
DO-INC. DO-INC.
ADD 1 TO BF-CELL(CURRENT-CELL). IF BF-CELL(CURRENT-CELL) < 255 THEN
ADD 1 TO BF-CELL(CURRENT-CELL)
ELSE
MOVE 0 TO BF-CELL(CURRENT-CELL).
MOVE 99 TO LOOP-STATE.
DO-OUT. DO-OUT.
IF OUT-PTR < 505 THEN IF OUT-PTR < 505 THEN
@ -130,6 +170,7 @@
D DISPLAY "OUT", I-O-CHARACTER, BF-CELL(CURRENT-CELL) D DISPLAY "OUT", I-O-CHARACTER, BF-CELL(CURRENT-CELL)
ELSE ELSE
GO TO HELL. GO TO HELL.
MOVE 99 TO LOOP-STATE.
DO-IN. DO-IN.
UNSTRING BF-INPUT, UNSTRING BF-INPUT,
@ -154,46 +195,53 @@
CALL "ENCODE-ASCII" USING CONVERSION. CALL "ENCODE-ASCII" USING CONVERSION.
MOVE CHAR-CODE TO BF-CELL(CURRENT-CELL). MOVE CHAR-CODE TO BF-CELL(CURRENT-CELL).
D DISPLAY "IN", I-O-CHARACTER, BF-CELL(CURRENT-CELL). D DISPLAY "IN", I-O-CHARACTER, BF-CELL(CURRENT-CELL).
MOVE 99 TO LOOP-STATE.
DO-BEGIN. DO-BEGIN.
IF BF-CELL(CURRENT-CELL) IS EQUAL TO 0 THEN IF BF-CELL(CURRENT-CELL) IS EQUAL TO 0 THEN
MOVE LOOP-DEPTH TO LOOP-WORK MOVE LOOP-DEPTH TO LOOP-WORK
ADD 1 TO LOOP-WORK
PERFORM FIND-END UNTIL DONE PERFORM FIND-END UNTIL DONE
SUBTRACT 1 FROM IP
ELSE ELSE
ADD 1 TO LOOP-DEPTH. ADD 1 TO LOOP-DEPTH.
MOVE 99 TO LOOP-STATE.
FIND-END. FIND-END.
D DISPLAY "ENTERED FIND-END."
PERFORM READ-INSTRUCTION. PERFORM READ-INSTRUCTION.
IF NOT DONE THEN IF NOT DONE THEN
IF BF-BEGIN THEN IF BF-BEGIN THEN
ADD 1 TO LOOP-WORK ADD 1 TO LOOP-WORK
ELSE IF BF-END THEN ELSE IF BF-END THEN
D DISPLAY "FOUND END."
SUBTRACT 1 FROM LOOP-WORK
IF LOOP-WORK EQUALS LOOP-DEPTH THEN IF LOOP-WORK EQUALS LOOP-DEPTH THEN
MOVE 99 TO LOOP-STATE MOVE 99 TO LOOP-STATE.
ELSE D DISPLAY "FIND-END.", IP, ";", CURRENT-INSTRUCTION,
SUBTRACT 1 FROM LOOP-WORK. D "LD", LOOP-DEPTH, "LW", LOOP-WORK.
DO-END. DO-END.
SUBTRACT 1 FROM LOOP-DEPTH. SUBTRACT 1 FROM LOOP-DEPTH.
IF BF-CELL(CURRENT-CELL) IS NOT EQUAL TO 0 THEN IF BF-CELL(CURRENT-CELL) IS NOT EQUAL TO 0 THEN
MOVE LOOP-DEPTH TO LOOP-WORK MOVE LOOP-DEPTH TO LOOP-WORK
PERFORM FIND-BEGIN UNTIL DONE. PERFORM FIND-BEGIN UNTIL DONE
ADD 1 TO IP.
MOVE 99 TO LOOP-STATE.
FIND-BEGIN. FIND-BEGIN.
PERFORM UNREAD-INSTRUCTION. PERFORM UNREAD-INSTRUCTION.
IF NOT DONE THEN IF NOT DONE THEN
IF BF-END THEN IF BF-END THEN
SUBTRACT 1 FROM LOOP-WORK ADD 1 TO LOOP-WORK
ELSE IF BF-BEGIN THEN ELSE IF BF-BEGIN THEN
SUBTRACT 1 FROM LOOP-WORK
IF LOOP-WORK EQUALS LOOP-DEPTH THEN IF LOOP-WORK EQUALS LOOP-DEPTH THEN
MOVE 99 TO LOOP-STATE MOVE 99 TO LOOP-STATE.
ELSE
ADD 1 TO LOOP-WORK.
UNREAD-INSTRUCTION. UNREAD-INSTRUCTION.
UNSTRING BF-CODE INTO CURRENT-INSTRUCTION WITH POINTER IP.
IF IP IS GREATER THAN 3 THEN IF IP IS GREATER THAN 3 THEN
SUBTRACT 2 FROM IP SUBTRACT 2 FROM IP
UNSTRING BF-CODE INTO CURRENT-INSTRUCTION WITH POINTER IP
ELSE ELSE
MOVE 1 TO IP
MOVE 99 TO LOOP-STATE. MOVE 99 TO LOOP-STATE.