###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ó */ } // ===================================================