Brainfu*k for プチコン
Brainfu*kのインタプリンタをプチコンに移植してみた。
仕様はwikipediaの「Brainfuck」の項に基づく。
http://ja.wikipedia.org/wiki/Brainfuck
また、実装はdankogaiさんの実装を参考にした。
http://blog.livedoor.jp/dankogai/archives/50545151.html
ソースコードはMEMリソースファイルに保存し、そのファイルを読み込んで実行する。MEMリソースファイルの作成には、先日作成した簡易テキストエディタを利用する。
また、ちょっとしたテストができるように、コードの直接入力(LINPUTを使っているので1行まで)もできるようした(Lボタンを押しながらRUN)。
KEY 3,"SAVE"+CHR$(34)+"BRAINF_K" CLEAR TITLE$="BRAINFU_K for プチコン ver0.10" 'PRG:BRAINF_K '┏━━━━━━┓ '┃ ブレインファ○ク ┃ '┗━━━━━━┛ 'シヨウ: http://ja.wikipedia.org/wiki/Brainfuck 'セイゲン: ソースコードハ256バイトマデ 'L$() コードモジレツ 'C$ BRAINFU*Kコード 'C BRAINFU*Kコードノナガサ 'M() メモリ 'PC プログラムカウンタ 'SP メモリポインタ 'IC メイレイジッコウスウ 'T トークン 'I$ ヒョウジュンニュウリョク(FIFO) 'O$ ヒョウジュンシュツリョク 'W フレームマチジカン(ハヤイ0-9オソイ) @CONSTANT L$(0)=">":L$(1)="<" L$(2)="+":L$(3)="-" L$(4)=".":L$(5)="," L$(6)="{":L$(7)="]" MEMAREA=30000 LCLR$="":FOR I=0 TO 31:LCLR$=LCLR$+" ":NEXT @INIT DIM M(MEMAREA) O$="":I$="" PC=0:SP=0:IC=0:W=4 CLS:COLOR 0 ?TITLE$ ?"BRAINFU_K 256 byte free" ?"READY" LOCATE 0,4:?MEM$:LOCATE 0,3 GOTO @MAIN @LOADCD INPUT"ファイルメイ?";FN$ IF MID$(FN$,0,4)!="MEM:" THEN FN$="MEM:"+FN$ LOAD FN$ C$=MEM$ C=LEN(C$) MEM$=FN$ RETURN @INPCD LINPUT"コード?";C$ C=LEN(C$) MEM$=C$ RETURN @DISPCD COLOR 0 LOCATE 0,6:?LCLR$ LOCATE 0,6:?"PC: ";PC;" SP: ";SP;" IC: ";IC;" ハヤサ: ";W; LOCATE 0,7:?"CODE:" LOCATE 0,8:?C$ COLOR 13 LOCATE PC%32,PC/32+8 ?MID$(C$,PC,1) COLOR0 RETURN @DISPIO LOCATE 0,15:?"STDIN:" LOCATE 0,16:?LCLR$ LOCATE 0,16:?I$ LOCATE 0,19:?"STDOUT:" LOCATE 0,20:?LCLR$ LOCATE 0,20:?O$ RETURN @STDIN K$=INKEY$() IF K$!="" THEN I$=I$+K$:GOTO @STDIN RETURN @CNTL B=BUTTON() W=W-(B==2)*(W>0)+(B==1)*(W<9) RETURN @MAIN IF NOT BUTTON() AND 256 THEN GOSUB @LOADCD IF C$=="" THEN GOSUB @INPCD GOSUB @DISPCD GOSUB @DISPIO @LOOP GOSUB @DISPCD GOSUB @LEX_ANA ON T+1 GOSUB @NON,@C1,@C2,@C3,@C4,@C5,@C6,@C7,@C8 GOSUB @DISPIO PC=PC+1:IC=IC+1 IF PC>=C GOTO @EXIT GOSUB @CNTL VSYNC W GOTO @LOOP @EXIT END 'ジクカイセキ @LEX_ANA T=-1 P$=MID$(C$,PC,1) FOR I=0 TO 7 IF L$(I)==P$ THEN T=I:I=8 NEXT RETURN 'ムコウナメイレイ @NON RETURN 'メイレイ1 @C1 SP=SP+1 IF SP>=MEMAREA THEN SP=0 RETURN 'メイレイ2 @C2 SP=SP-1 IF SP<=0 THEN SP=MEMAREA-1 RETURN 'メイレイ3 @C3 M(SP)=M(SP)+1 IF M(SP)>255 THEN M(SP)=0 RETURN 'メイレイ4 @C4 M(SP)=M(SP)-1 IF M(SP)<0 THEN M(SP)=255 RETURN 'メイレイ5 @C5 O$=O$+CHR$(M(SP)) RETURN 'メイレイ6 @C6 IF I$=="" THEN GOSUB @STDIN:VSYNC 1:GOTO @C6 M(SP)=ASC(MID$(I$,0,1) I$=MID$(I$,1,LEN(I$)) RETURN 'メイレイ7 @C7 IF M(SP)!=0 GOTO @C7X NEST=0 FOR I=0 TO 1 PC=PC+1:I=0 IF PC>=C THEN I=0:PC=C-1:GOTO @C7NEXT P$=MID$(C$,PC,1) IF P$==L$(7) AND NEST==0 THEN I=1 IF P$==L$(7) THEN NEST=NEST-1 IF P$==L$(6) THEN NEST=NEST+1 @C7NEXT NEXT @C7X RETURN 'メイレイ8 @C8 IF M(SP)==0 GOTO @C8X NEST=0 FOR I=0 TO 1 PC=PC-1:I=0 IF PC<0 THEN I=1:PC=0:GOTO @C8NEXT P$=MID$(C$,PC,1) IF P$==L$(6) AND NEST==0 THEN I=1 IF P$==L$(6) THEN NEST=NEST-1 IF P$==L$(7) THEN NEST=NEST+1 @C8NEXT NEXT @C8X RETURN