46 lines
1.7 KiB
Text
46 lines
1.7 KiB
Text
argc 3 < { ."Usage: furor brainfuck.upu brainfuckpgmfile\n" }{
|
|
2 argv getfile // dup #s print free
|
|
sto bfpgm
|
|
100000 mem dup maximize sto bfmem // Memóriaallokáció a brainfuck memóriaterület számára
|
|
tick sto startingtick
|
|
sbr §brainfuck
|
|
NL
|
|
tick @startingtick #g - ."Time = " print ." tick\n"
|
|
@bfmem free // A lefoglalt munkamemória felszabadítása
|
|
}
|
|
end
|
|
// ===================================================
|
|
brainfuck:
|
|
#g @bfpgm~ !{ rts } // Ha nulla a brainfuck progi hossza, semmit se kell csinálni.
|
|
zero p zero m // Indexregiszterek lenullázása (inicializálás)
|
|
((( @p @bfpgm~ < )
|
|
§jumpingtable "+-<>[].,"
|
|
@[]bfpgm @p // Az épp aktuális brainfuck utasítás kódja
|
|
switch // Ugrás a megfelelő brainfuck funkció rutinjára
|
|
____: inc p (<) // default action
|
|
_3c_: @m !{ rts } dec m goto §____ // <
|
|
_3e_: @m @bfmem~ >= { rts } inc m goto §____ // >
|
|
_2b_: #c @[++]bfmem @m #g goto §____ // +
|
|
_2d_: #c @[--]bfmem @m #g goto §____ // -
|
|
_2c_: @bfmem @m getchar [^] goto §____
|
|
_2e_: @[]bfmem @m printchar goto §____
|
|
_5b_: @[]bfmem @m then §____
|
|
zero d @p ++ @bfpgm~ {||
|
|
{} []@bfpgm '[ == { inc d {<} }
|
|
{} []@bfpgm '] == { @d !{ {+} sto p {>} } dec d }
|
|
|} (<)
|
|
_5d_: zero d 1 @p {|| {-} []@bfpgm '] == { inc d {<} }
|
|
{-} []@bfpgm '[ == { @d !{ {} !sum p {>} } dec d }
|
|
|} (<)
|
|
)) rts
|
|
// ===================================================
|
|
{ „startingtick” }
|
|
{ „bfpgm” }
|
|
{ „bfmem” }
|
|
{ „p” /* index az épp végrehajtandó brainfuck mnemonikra */ }
|
|
{ „m” /* index a brainfuck memóriaterületre */ }
|
|
{ „d” /* munkaváltozó */ }
|
|
// ========================================
|
|
jumpingtable:
|
|
// + - < > [ ] . ,
|
|
§_2b_ §_2d_ §_3c_ §_3e_ §_5b_ §_5d_ §_2e_ §_2c_
|