63 lines
2.1 KiB
Plaintext
63 lines
2.1 KiB
Plaintext
###sysinclude standard.uh
|
|
###sysinclude args.uh
|
|
###sysinclude str.uh
|
|
###sysinclude io.uh
|
|
|
|
#g argc 3 < { ."Usage: peri brainfuck02.upu brainfuckfile\n" }{
|
|
2 argv getfile
|
|
sto bfpgm
|
|
tick sto startingtick
|
|
@bfpgm '< >><<
|
|
@bfpgm '> >><<
|
|
@bfpgm '+ >><<
|
|
@bfpgm '- >><<
|
|
100000 mem dup maximize sto bfmem // Memóriaallokáció a brainfuck memóriaterület számára
|
|
sbr §brainfuck
|
|
NL
|
|
tick @startingtick #g - ."Time = " print ." tick\n"
|
|
@bfmem inv mem // A lefoglalt munkamemória felszabadítása
|
|
}
|
|
end
|
|
// ===================================================
|
|
brainfuck:
|
|
#g bfpgm~ inv { rts } // Ha nulla a brainfuck progi hossza, semmit se kell csinálni.
|
|
zero pp zero mm // Indexregiszterek lenullázása (inicializálás)
|
|
|
|
switchlabel:
|
|
switch "<>+-,.[]" §_3c_ §_3e_ §_2b_ §_2d_ §_2c_ §_2e_ §_5b_ §_5d_
|
|
mainloop:
|
|
safe case#c bfpgm[pp] §rtslabel // Ugrás a megfelelő brainfuck funkció rutinjára
|
|
____: ++() pp goto §mainloop
|
|
_3c_: safe bfpgm[pp] §rtslabel hilo inv sum mm goto §____ // <
|
|
_3e_: safe bfpgm[pp] §rtslabel hilo sum mm goto §____ // >
|
|
_2b_: bfpgm[pp] hilo safe sum#c bfmem[mm] §safelabel goto §____ // +
|
|
_2d_: bfpgm[pp] hilo safe inv sum#c bfmem[mm] §safelabel goto §____ // -
|
|
_2c_: getchar safe inv bfmem[mm] §rtslabel goto §____
|
|
_2e_: safe bfmem[mm] §rtslabel printchar goto §____
|
|
_5b_: safe bfmem[mm] §rtslabel then §____
|
|
switch "[]" §lbl5b0 §lbl5b1
|
|
zero dd @pp ++ bfpgm {~ ,
|
|
{~?~} case
|
|
{~<~}
|
|
lbl5b0: ++() dd {~<~}
|
|
lbl5b1: @dd inv { {~+~} sto pp goto §switchlabel } --() dd
|
|
~} goto §switchlabel
|
|
|
|
_5d_: switch "[]" §lbl5d0 §lbl5d1
|
|
zero dd 1 @pp {{ ,
|
|
bfpgm[{{-}}] case
|
|
{{<}}
|
|
lbl5d1: ++() dd {{<}}
|
|
lbl5d0: @dd inv { {{}} inv sum pp goto §switchlabel } --() dd
|
|
}} goto §switchlabel
|
|
rtslabel: rts
|
|
safelabel: ."Wrong program!" end
|
|
// ===================================================
|
|
{ „startingtick” }
|
|
{ „bfpgm” }
|
|
{ „bfmem” }
|
|
{ „pp” /* index az épp végrehajtandó brainfuck mnemonikra */ }
|
|
{ „mm” /* index a brainfuck memóriaterületre */ }
|
|
{ „dd” /* munkaváltozó */ }
|
|
// ===================================================
|