100 REM BRAINF*CK FOR TRS-80 LEVEL II BASIC 103 DB=0:REM SET TO 1 FOR DEBUGGING 105 REM FIRST MAKE SURE WE HAVE ENOUGH STRING HEAP FOR PROGRAM 110 READ C$:C=LEN(C$):IF C>M THEN M=C 120 PS=PS+C 130 IF C THEN 110 135 REM ALLOCATE THE HEAP 140 CLEAR 2*(PS+M) 145 REM RE-READ PROGRAM, REMEMBERING IT THIS TIME 150 RESTORE 160 P$="" 170 READ C$ 180 P$=P$+C$ 190 IF LEN(C$)<>0 THEN 170 195 REM PAIR UP BRACKETS INTO B% 200 DIM B%(LEN(P$)) 205 REM TRACK OPEN BRACKETS IN O% 210 DIM O%(INT(LEN(P$)/2)):O=0 220 FOR I=1 TO LEN(P$) 230 : I$=MID$(P$,I,1) 240 : IF I$="(" OR I$="[" THEN O%(O)=I:O=O+1 250 : IF I$<>")" AND I$<>"]" THEN 290 260 : IF O=0 THEN PRINT "UNMATCHED BRACKET AT"I". ABORTING.":END 270 : O=O-1:M=O%(O) 280 : B%(I)=M:B%(M)=I 290 NEXT I 300 IF O THEN PRINT "UNMATCHED BRACKETS AT EOF. ABORTING.":END 303 REM SET MS TO NUMBER OF MEMORY CELLS NEEDED 305 REM THE BF SPEC REQUIRES 30000, WHICH DOES WORK ON A SYSTEM WITH 48K RAM. 307 REM THE DEMO HELLO-WORLD PROGRAM ONLY REQUIRES 4 CELLS. 310 MS=4:DIM M%(MS/2-1):MP=0 313 REM FUNCTION TO READ BYTE AT CELL N 315 DEF FNMP(N)=INT(M%(INT(N/2)) / (1+255*(N AND 1))) AND 255 320 FOR I=1 TO LEN(P$) 323 : IF MP<0 OR MP>=MS THEN PRINT "ERROR: MP OUT OF RANGE AT"I:END 327 : IF DB THEN PRINT "IP:"I"("I$") MP:"MP"("FNMP(MP)")" 330 : I$=MID$(P$,I,1) 340 : IF I$<>"(" AND I$<>"[" THEN 370 350 : IF FNMP(MP)=0 THEN I=B%(I) 360 : GOTO 480 370 : IF I$<>")" AND I$<>"]" THEN 400 380 : IF FNMP(MP) THEN I=B%(I) 390 : GOTO 480 400 : IF I$="<" THEN MP=MP-1:GOTO 480 410 : IF I$=">" THEN MP=MP+1:GOTO 480 420 : IF I$="-" THEN V=FNMP(MP)-1:GOTO 500 430 : IF I$="+" THEN V=FNMP(MP)+1:GOTO 500 440 : IF I$="." THEN ?CHR$(FNMP(MP));:GOTO 480 450 : IF I$<>"," THEN 480 460 : K$=INKEY$:IF K$="" THEN 460 470 : V=ASC(K$):GOTO 500 480 NEXT I 490 END 495 REM UPDATE CELL AT MP WITH VALUE IN V 500 M=INT(MP/2):O=M%(M):V=V AND 255 510 N0=(O AND -256)+V 520 N1=(V*256+(O AND 255)) 530 M%(M) = (MP AND 1)*N1 - ((MP AND 1)=0)*N0 540 GOTO 480 545 REM HELLO, WORLD PROGRAM 570 DATA "+++++++++[>++++++++<-]>." 580 DATA "<+++++[>+++++<-]>++++." 590 DATA "+++++++..+++." 600 DATA ">>++++[<+++++++++++>-]<." 610 DATA ">++++[<--->-]<." 620 DATA "<++++++++." 630 DATA "--------." 640 DATA "+++." 650 DATA "------." 660 DATA "--------." 670 DATA ">>[++][<+++++++>-]<+." 680 DATA ">++++++++++." 690 DATA ""