66 lines
2.0 KiB
Plaintext
66 lines
2.0 KiB
Plaintext
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 ""
|