73 lines
2.3 KiB
Text
73 lines
2.3 KiB
Text
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 ""
|