100 REM BRAINF*CK FOR COMMODORE BASIC 110 DB=0:REM SET TO 1 FOR DEBUGGING 120 P$="" 130 READ C$ 140 P$=P$+C$ 150 IF LEN(C$)<>0 THEN 130 160 REM PAIR UP BRACKETS INTO B% 170 DIM B%(LEN(P$)) 180 REM TRACK OPEN BRACKETS IN O% 190 DIM O%(INT(LEN(P$)/2)):O=0 200 FOR I=1 TO LEN(P$) 210 : I$=MID$(P$,I,1) 220 : IF I$="[" THEN O%(O)=I:O=O+1 230 : IF I$<>"]" THEN 270 240 : IF O=0 THEN PRINT "UNMATCHED BRACKET AT"I". ABORTING.":END 250 : O=O-1:M=O%(O) 260 : B%(I)=M:B%(M)=I 270 NEXT I 280 IF O THEN PRINT "UNMATCHED BRACKETS AT EOF. ABORTING.":END 290 REM SET MS TO NUMBER OF MEMORY CELLS NEEDED. 300 REM THE BF SPEC REQUIRES 30000, WHICH WILL WORK ON C64 OR 48K+ PET. 310 AN UNEXPANDED VIC-20 WILL HANDLE 1000, A C-16 9000. THE DEMO ONLY NEEDS 4. 320 MS=4:DIM M%(MS/2-1):MP=0 330 REM FUNCTION TO READ BYTE AT CELL N 340 DEF FNMP(N)=INT(M%(INT(N/2)) / (1+255*(N AND 1))) AND 255 350 FOR I=1 TO LEN(P$) 360 : IF MP<0 OR MP>=MS THEN PRINT "ERROR: MP OUT OF RANGE AT"I:END 370 : IF DB THEN PRINT "IP:"I"("I$") MP: "MP"("FNMP(MP)")" 380 : I$=MID$(P$,I,1) 390 : IF I$<>"[" THEN 420 400 : IF FNMP(MP)=0 THEN I=B%(I) 410 : GOTO 530 420 : IF I$<>"]" THEN 450 430 : IF FNMP(MP) THEN I=B%(I) 440 : GOTO 530 450 : IF I$="<" THEN MP=MP-1:GOTO 530 460 : IF I$=">" THEN MP=MP+1:GOTO 530 470 : IF I$="-" THEN V=FNMP(MP)-1:GOTO 560 480 : IF I$="+" THEN V=FNMP(MP)+1:GOTO 560 490 : IF I$="." THEN PRINTCHR$(FNMP(MP));:GOTO 530 500 : IF I$<>"," THEN 530 510 : GET K$:IF K$="" THEN 510 520 : V=ASC(K$):GOTO 560 530 NEXT I 540 END 550 REM UPDATE CELL AT MP WITH VALUE IN V 560 M=INT(MP/2):O=M%(M):V=V AND 255 570 N0=(O AND -256)+V 580 N1=(V*256+(O AND 255)) 590 M%(M) = (MP AND 1)*N1 - ((MP AND 1)=0)*N0 600 GOTO 530 610 REM HELLO, WORLD PROGRAM 620 DATA "+++++++++[>++++++++<-]>." 630 DATA "---." 640 DATA "+++++++..+++." 650 DATA ">>++++[<+++++++++++>-]<." 660 DATA ">++++[<--->-]<." 670 DATA "<++++++++." 680 DATA "--------." 690 DATA "+++." 700 DATA "------." 710 DATA "--------." 720 DATA ">>[++][<+++++++>-]<+." 730 DATA ">++++++++++." 740 DATA ""