プチコンで遊ぼう! (はてなブログ版)

任天堂3DSのプチコンで遊ぼう! [twitter:@eida_s]

はてなダイアリーから移行しました。 はてなダイアリーのURLを開いても自動的にこちらにリダイレクトされますのでご了承ください。

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