1 REM BRAIN SIMULATOR PROGRAM 2 REM *** REVISED BY EDWARD BAKER AND RON REISOR ********************** 5 GOTO 1020:DIMD(256):MATD=ZER 7 D2=A 9 PRINT 'MEMORY HAS BEEN CLEARED' 1010 DIM R(16),M(256) 1020 H$='0123456789ABCDEF' 1100 PRINT 1101 PRINT"TYPE 'LOAD' OR 'START' OR 'STOP'" 1110 INPUT I$ 1120 IF I$='LOAD' THEN 2110 1130 IF I$='START' THEN 3010 1140 IF I$<>'STOP' THEN 1100 1160 PRINT'DONE':GOTO9990 2000 REM *** LOAD *** 2110 PRINT 2120 GOSUB 9800 2140 PRINT'ADDRESS INSTRUCTIONS/DATA COMMENTS' 2210 N=A 2220 GOSUB 9100 2225 PRINT MID(A$,3,4);' '; 2230 INPUT I$ 2240 A1=A 2250 IF MID(I$,1,3)='SEE' THEN 2810 2260 IF MID(I$,1,3)='SET' THEN 2910 2270 IF MID(I$,1,3)='END' THEN 2960 2310 FOR L=1 TO LEN(I$) 2320 T5$=MID(I$,L,1):IFT5$=' 'ORT5$=CHR$(9%)THEN2440 2330 NEXT L 2335 GOTO 2450 2440 L=L-1 2450 IF L/4=INT(L/4) THEN 2610 2460 PRINT'NUMBER OF DIGITS IS NOT A MULTIPLE OF FOUR' 2510 PRINT'PLEASE RETYPE INSTRUCTION' 2520 A=A1 2530 GOTO 2210 2610 FOR I=1 TO L STEP 4 2620 A$=MID(I$,I,4) 2630 GOSUB 9200 2640 IF M>1.E+08 THEN 2710 2650 M(A+1)=N 2660 A=A+1 2670 IF A<256 THEN 2680 2675 A=0 2680 NEXT I 2690 GOTO 2210 2710 PRINT'ILLEGAL CHARACTER IN INSTRUCTION ';A$ 2720 GOTO 2510 2810 GOSUB9400 2820 IFN>255THEN2510 2830 A=N 2840 I$=MID(I$,5,2) 2845 I$=LEFT(I$,2)+SPACE$(6)+RIGHT(I$,9) 2850 M7=7 2851 IF A<249 THEN 2860 2852 M7=255-A 2860 FOR I=0 TO M7 2861 I5=I*5 2862 I$=LEFT(I$,8+I5)+' '+RIGHT(I$,10+I5) 2863 N=M(A+1+I) 2864 GOSUB 9100 2865 I$=LEFT(I$,9+I5)+A$+RIGHT(I$,14+I5) 2866 NEXT I 2870 PRINT I$ 2880 GOTO 2210 2910 GOSUB 9400 2920 IF N>255 THEN 2510 2930 A=N 2940 GOTO 2210 2960 GOSUB 9400 2970 IF N>255 THEN 2510 2980 A=N 2990 GOSUB 9900 2995 GOTO 1100 3000 REM *** START *** 3010 PRINT 3012 GOSUB 9800 3016 N=A 3017 GOSUB 9100 3018 PRINT'EXECUTION BEGINS WITH INSTRUCTION AT ADDRESS ';MID(A$,3,2) 3019 PRINT 3020 MAT R=ZER 3025 T=0 3029 FOR Q=1 TO 10000 3030 R0=INT(M(A+1)/256) 3040 REM E IS THE ADDRESS PORTION OF THE INSTRUCTION 3041 E=M(A+1)-256*R0 3050 REM C IS THE OPERATION CODE 3051 C=INT(R0/16) 3060 REM R0 IS THE REGISTER NUMBER IN THE INSTRUCTION 3061 R0=R0-16*C 3070 IF C>=0 THEN 3090 3080 C=C+16 3090 IF C>7 THEN 3095 3091 ON C+1 GOTO 4000,4100,4200,4300,4400,4500,4600,4700 3095 ON C-7 GOTO 4800,4900,5000,5100,5200,5300,5400,5500 4000 REM *** OUTPUT 4010 PRINT ' ';M(E+1) 4020 GOTO 6210 4100 REM *** INPUT 4110 INPUT N 4120 REM IF N=INT(N) AND N>=-32768 AND N<=32767 THEN 4160 4121 IF N-INT(N)+SGN(32767.6-ABS(N+.5))=1 THEN 4160 4130 PRINT'INPUT MUST BE AN INTEGER BETWEEN -32768 AND 32767' 4140 PRINT'PLEASE RETYPE INPUT' 4150 GOTO 4110 4160 M(E+1)=N 4170 GOTO 6210 4200 REM *** SUBTRACT 4210 R1=INT(E/16) 4220 T=R(R1+1)-R(E-R1*16+1) 4230 GOTO 6110 4300 REM *** LOAD 4310 R(R0+1)=M(E+1) 4320 GOTO 6210 4400 REM *** UNLOAD (STORE9 4410 M(E+1)=R(R0+1) 4420 GOTO 6210 4500 REM *** MULTIPLY 4510 R1=INT(E/16) 4520 T=R(R1+1)*R(E-R1*16+1) 4530 GOTO 6110 4600 REM *** OP-CODE 6 NOT USED 4700 REM *** OP-CODE 7 NOT USED 4800 REM *** OP-CODE 8 NOT USED 4900 REM *** OP-CODE 9 NOT USED 4901 N=A 4902 GOSUB 9100 4903 PRINT'ILLEGAL OP-CODE IN INSTRUCTION AT ADDRESS ';MID(A$,3,2) 4904 GOTO 8110 5000 REM *** ADD 5010 R1=INT(E/16) 5020 T=R(R1+1)+R(E-R1*16+1) 5030 GOTO 6110 5100 REM *** BRANCH 5110 N=INT(R0/2^(SGN(T)+1)) 5120 REM IF N IS EVEN AND R0<7 THEN 6210 5121 IF N/2-INT(N/2)+SGN(7-R0)=1 THEN 6210 5130 A=E 5140 GOTO 6220 5200 REM *** COUNT 5210 N=R(R0+1) 5220 IF N=-32768. THEN 6140 5230 R(R0+1)=N-1 5240 IF N=1 THEN 6210 5250 A=E 5260 GOTO 6220 5300 REM *** DIVIDE 5310 R1=INT(E/16) 5320 N=R(E-R1*16+1) 5330 IF N=0 THEN 5360 5340 T=INT(R(R1+1)/N) 5350 GOTO 6110 5360 N=A 5370 GOSUB 9100 5380 PRINT'ATTEMPT TO DIVIDE BY ZERO AT ADDRESS ';MID(A$,3,2) 5390 GOTO 8110 5400 REM *** ENTER 5410 IF E<128 THEN 5430 5420 E=E-256 5430 R(R0+1)=E 5440 GOTO 6210 5500 REM *** HALT 5510 PRINT 5520 N=A 5530 GOSUB 9100 5540 PRINT'HALT INSTRUCTION AT ADDRESS ';MID(A$,3,2);' EXECUTED' 5550 GOTO 1100 6100 REM *** CHECK FOR OVERFLOW 6110 REM IF T>-32768 AND T<32767 THEN 6160 6111 IF ABS(T+.5)<32767.6 THEN 6160 6120 N=A 6130 GOSUB 9100 6140 PRINT'OVERFLOW RESULTED FROM INSTRUCTION AT ADDRESS ';MID(A$,3,2) 6150 GOTO 8110 6160 R(R0+1)=T 6210 A=A+1 6211 IF A<256 THEN 6220 6212 A=0 6220 NEXT Q 6230 PRINT'10000 INSTRUCTIONS HAV BEEN EXECUTED' 8100 REM *** MEMORY DUMP 8110 PRINT 8120 PRINT'CONTENTS OF REGISTERS' 8130 PRINT'REG HEX DECIMAL REG HEX DECIMAL' 8140 FOR I=1 TO 8 8150 REM IF R(I)=0 AND R(I+8)=0 THEN 8220 8151 IF ABS(R(I))+ABS(R(I+8))=0 THEN 8220 8160 N=R(I) 8170 GOSUB 9100 8180 I$=A$ 8190 N=R(I+8) 8200 GOSUB 9100 8210 PRINTI-1;' ';I$;' ';R(I);' ';I+7;' ';A$;' ';R(I+8) 8220 NEXT I 8230 PRINT 8240 PRINT'CONTENTS OF MEMORY IN HEXADECIMAL' 8250 FOR A=0 TO 255 STEP 8 8260 FOR J=A+1 TO A+8 8270 IF M(J)<>0 THEN 8300 8280 NEXT J 8290 GOTO 8410 8300 N=A 8310 GOSUB 9100 8320 I$=MID(A$,3,2) 8330 I$=LEFT(I$,2)+SPACE$(6)+RIGHT(I$,9) 8340 FOR K=0 TO 7 8350 J5=K*5 8360 N=M(A+K+1) 8370 GOSUB 9100 8380 I$=LEFT(I$,8+J5)+' '+RIGHT(I$,10+J5) 8390 I$=LEFT(I$,9+J5)+A$+RIGHT(I$,14+J5) 8395 NEXT K 8400 PRINT I$ 8410 NEXT A 8420 GOTO 1100 9100 REM *** CONVERTS N INTO 4 HEX DIGITS A$ *** 9101 A$=' ' 9110 FOR J=4 TO 2 STEP -1 9111 N1=INT(N/16) 9112 H=N-N1*16+1 9113 N=N1 9114 A$=LEFT(A$,J-1)+MID(H$,H,1)+RIGHT(A$,J+1) 9115 NEXT J 9120 IF N>=0 THEN 9140 9130 N=N+16 9140 A$=MID(H$,N+1,1)+RIGHT(A$,2) 9150 RETURN 9200 REM *** CONVERTS 4 HEX DIGITS A$ INTO N *** 9210 C$=MID(A$,1,1) 9220 GOSUB 9300 9230 IF H<0 THEN 9280 9240 IF H<8 THEN 9260 9250 H=H-16 9260 N=H 9270 FOR J=2 TO 4 9271 C$=MID(A$,J,1) 9272 GOSUB 9300 9273 IF H<0 THEN 9280 9274 N=N*16+H 9275 NEXT J 9276 RETURN 9280 N=1.E+09 9290 RETURN 9300 REM *** CONVERTS CHARACTER C$ INTO HEX DIGIT H *** 9310 FOR H=1 TO 16 9320 IF MID(H$,H,1)=C$ THEN 9350 9330 NEXT H 9340 H=0 9350 H=H-1 9360 RETURN 9400 REM *** SETS N TO NEW ADDRESS BY MID(I$,4,6) 9410 IF LEN(I$)=3 THEN 9450 9420 IF MID(I$,4,1)=' ' THEN 9450 9430 IF LEN(I$)<6 THEN 9440 9431 IF MID(I$,4,1)='-' THEN 9460 9440 N=999 9441 GOTO9480 9450 I$=LEFT(I$,3)+'-00'+RIGHT(I$,7) 9460 N=0 9461 A$='00'+RIGHT(A$,3) 9462 A$=LEFT(A$,2)+MID(I$,5,2)+RIGHT(A$,5) 9463 GOSUB 9270 9470 IF N<256 THEN 9490 9480 PRINT'AFTER THE THREE LETTER COMMAND SHOULD BE' 9481 PRINT' EITHER NOTHING OF ELSE "-HH" WHERE' 9482 PRINT' EACH H IS A HEXADECIMAL DIGIT' 9490 RETURN 9800 REM *** FETCH VALUES OF M AND A 9810 MAT M=D 9820 A=D2 9830 RETURN 9900 REM *** SAVE M AND A 9910 MAT D=M 9920 D2=A 9930 RETURN 9990 END