YaBasicを試す
Brainux上で動くBASICインタープリタを探してみたところ、
グラフィックもサポートしているのものとして、YaBasicというものが見つかりました。
△ yabasic グラフィック処理も可能なBASICインタープリタ
https://packages.debian.org/bullseye/yabasic
https://2484.de/yabasic
起動:yabasic
Yabasicは伝統的なBasicインタプリタです。goto文や様々なループ文を備え、サブルーチンやライブラリを定義できます。簡単なグラフィック処理や印刷も可能です。C言語で書かれたライブラリを呼び出せるため、スタンドアロンプログラムの作成も可能です。YabasicはUnixとWindowsで動作し、充実したドキュメントが用意されています。小型でシンプル、オープンソースで無料です。
Burainuxでも動作するグラフィック処理も可能なBasicインタープリタです。
インストール1:APT経由 ”sudo apt install yabasic”
(グラフィック機能利用時には、XLIB_SKIP_ARGB_VISUALS=1が必要)
インストール2:ソースからインストール
(グラフィックモードの不具合解消に挑戦して、
opwn window自体はできるようになったが、
その先の描画でエラーになるので挫折中)
ビルド時に-o3 -march=native指定することでの高速化はおそらくできます。
YaBasicの実行方法
YaBasicでBASICコードを実行するには、以下のような方法があります。
・BASICコードをファイルに保存して引数として呼び出す
yabasic ./demo.yab
・yabasicを起動して、BASICコードを入力していき、最後に何も入力しないでEnterを押す
yabasic
print “Hello”
Hello
ただし、xterm上で起動すると、文字の色指定がうまく表示されないときがあるので、
その場合は、brainuxデフォルトのターミナル(lxterminal)を使いましょう。
———-
また、グラフィック処理を使う場合にはそのまま起動するだけではエラーになります。
user@brain:~$ yabasic
open window 100,100
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 1 (X_CreateWindow)
Serial number of failed request: 18
Current serial number in output stream: 22
これは、yabasicが想定しているグラフィック環境と、実態(BrainuxのX環境)間のずれのせいでグラフィックウィンドウがうまく開けないためのようです。
この場合、以下のようにしてyabasicを起動してください。
これでグラフィックモードも開けるようになります。
XLIB_SKIP_ARGB_VISUALS=1 yabasic
毎回入力すのが大変であれば、以下のようにalias設定すれば、
ターミナル上で、「yabasic」と入力するだけでOKになります。
|
1 2 |
echo 'alias yabasic="XLIB_SKIP_ARGB_VISUALS=1 yabasic"' >> ~/.bashrc source ~/.bashrc |
ちなみに、Linux上では、.yab の1行目に以下のどちらかを書いておいて、
chmod +x hoge.yab と打って実行権限を付ければ、
./hoge.yab で実行できるようになるそうです。
1 #!/usr/bin/yabasic
1 #!/usr/bin/env yabasic
ただbrainuxの場合は、以下のようにラッパーを作成しての対応が必要そうです。
(この対応をするのであれば、alias設定は不要です)
$ sudo mv /usr/bin/yabasic /usr/bin/yabasic-brain
$ sudo vi /usr/bin/yabasic
#!/bin/sh
XLIB_SKIP_ARGB_VISUALS=1 /usr/bin/yabasic-brain “$@”
$ sudo chmod /usr/bin/yabasic
———-
YaBasicのサンプルプログラム
YaBasicのマニュアルは、「https://2484.de/yabasic/support.html」に書かれています。
また、関連サイト「https://2484.de/yabasic/related.html」から、yabasicで使えるBasicコードにたどり着くこともできそうです。
Brainで使う場合は、解像度問題があるのでそこは考慮しないといけませんが、
特にRosetta Codeは非常に参考になります。
いくつか、サンプルプログラムを動かしてみます。
(一部変更済済)
hello.yab Hello World表示
1 #!/usr/bin/yabasic<br />clear screen<br />print "Press 'q' to quit ..."<br />label again<br />print color("green") "Hello ";<br />print color("blue") "World ! ";<br />if (inkey$(1)="q") exit<br />goto again

asciitable.yab アスキーコード表示
1 #!/usr/bin/yabasic<br />for i = 32 to 47<br /> for j = i to i + 80 step 16<br /> s$ = chr$(j)<br /> if j = 32 s$ = "Spc"<br /> if j = 127 s$ = "Del"<br /> print str$(j, "#####"), ": ", s$;<br /> next j<br /> print<br />next i

gdemo.yab グラフィック表示デモ
1 #!/usr/bin/yabasic<br />w = 400<br />open window w, w<br />sleep 1<br />label again<br />backcolour 0,0,0<br />clear window<br />for i=0 to w step 5<br /> v = 255 * i / w<br /> color 0, v, (255 - v)<br /> line 0, i, i, w<br /> color (255 - v), 0, v<br /> line i, 0, w, i<br /> pause 0.025<br />next i<br />sleep 3<br />goto again

lifegame.yab ライフゲーム
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 #!/usr/bin/yabasic// Game_of_LifeX = 59 : Y = 35 : H = 4open window X*H,Y*Hbackcolor 0, 0, 0dim c(X,Y) : dim cn(X,Y) : dim cl(X,Y)// Thunderbird methuselahc(X/2-1,Y/3+1) = 1 : c(X/2,Y/3+1) = 1 : c(X/2+1,Y/3+1) = 1c(X/2,Y/3+3) = 1 : c(X/2,Y/3+4) = 1 : c(X/2,Y/3+5) = 1s = 0repeatclear windowalive = 0 : stable = 1s = s + 1for y = 0 to Y-1for x = 0 to X-1xm1 = mod(x-1+X, X) : xp1 = mod(x+1+X, X)ym1 = mod(y-1+Y, Y) : yp1 = mod(y+1+Y, Y)cn(x,y) = c(xm1,y) + c(xp1,y)cn(x,y) = c(xm1,ym1) + c(x,ym1) + c(xp1,ym1) + cn(x,y)cn(x,y) = c(xm1,yp1) + c(x,yp1) + c(xp1,yp1) + cn(x,y)if c(x,y) = 1 thenif cn(x,y) < 2 or cn(x,y) > 3 thencn(x,y) = 0elsecn(x,y) = 1alive = alive + 1end ifelseif cn(x,y) = 3 thencn(x,y) = 1alive = alive + 1elsecn(x,y) = 0end ifend ifif c(x,y) thenif cn(x,y) thenif cl(x,y) color 0, 0, 255 // adultif not cl(x,y) color 0, 255, 0 // newbornelseif cl(x,y) color 255, 0, 0 // oldif not cl(x,y) color 255, 255, 0 // shortlivedend iffill rect x*H,y*H,x*H+H,y*H+Hend ifnext xnext ypause 0.06// Copy arraysfor i = 0 to X-1for j = 0 to Y-1if cl(i,j)<>cn(i,j) stable = 0cl(i,j) = c(i,j)c(i,j) = cn(i,j)next jnext iuntil(not alive or stable)if not alive thenprint "Died in ", s, " iterations"clear windowelseprint "Stabilized in ", s-2, " iterations"end if

clock-degital.yab デジタル時計
1234567891011121314151617181920212223242526272829303132333435 #!/usr/bin/yabasicclear screenopen window 300,100backcolor 0, 0, 0window origin "cc"// Display digital clocksub digital_clock()local t$(1), voidstatic as$void = token(time$, t$(), "-")if t$(3) <> as$ thendraw_clock(t$(1), t$(2), t$(3))as$ = t$(3)end ifend subsub draw_clock(hour$, mint$, ssec$)local d$(1), voidvoid = token(date$, d$(), "-")clear windowcolor 200, 255, 0text -140, -30, d$(3) + "/" + d$(2) + "/" + d$(4), ""text 0, 0, hour$ + ":" + mint$ + ":" + ssec$, "cc", ""end subif peek$("library") = "main" thenrepeatdigital_clock()until(upper$(inkey$(.01))="ESC")exitend if

clock-analog.yab アナログ時計
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 #!/usr/bin/yabasicREM yaclockDEG_PER_RAD = 57.257751winx = 440winy = 440radius = min(winx,winy) / 2 - 1hx = (winx/2) - 1hy = (winy/2) - 1REM length of the hands (90% of the radius of the clock face)shand = int(radius * .9)mhand = int(radius * .9)hhand = int(radius * .5)REM drop coords by one since graphics are 0 basedwinx = winx - 1winy = winy - 1clear screenopen window winx,winyclockface()dohour = val(mid$(time$,1,2))mins = val(mid$(time$,4,2))sec = val(mid$(time$,7,2))updatehand("sec")updatehand("mins")updatehand("hour")pause .25loopsub updatehand(hand$)switch(hand$)case "sec"h_len = shandangle = sec * 6width = 6color 255,0,0ox = osxoy = osyoxm1 = osxm1oxm2 = osxm2oym1 = osym1oym2 = osym2breakcase "mins"h_len = mhandangle = mins * 6 + int(sec/10)width = 12color 0,255,0ox = omxoy = omyoxm1 = omxm1oxm2 = omxm2oym1 = omym1oym2 = omym2breakcase "hour"h_len = hhandangle = ((hour * 30) + (minutes / 12) * 6) + int(mins/2)width = 15color 0,0,255ox = ohxoy = ohyoxm1 = ohxm1oxm2 = ohxm2oym1 = ohym1oym2 = ohym2breakend switchh_angle1 = angle - widthif h_angle1 < 0 thenh_angle1 = h_angle1 + 360endifh_angle1 = h_angle1 / DEG_PER_RADh_angle2 = angle + widthif h_angle2 > 360 thenh_angle2 = h_angle2 - 360endifh_angle2 = h_angle2 / DEG_PER_RADangle = angle / DEG_PER_RADx = (hx + (sin(angle) * h_len))xm1 = (hx + (sin(h_angle1) * int(h_len * .2)))xm2 = (hx + (sin(h_angle2) * int(h_len * .2)))y = (hy - (cos(angle) * h_len))ym1 = (hy - (cos(h_angle1) * int(h_len * .2)))ym2 = (hy - (cos(h_angle2) * int(h_len * .2)))clear line hx,hy,oxm1,oym1clear line hx,hy,oxm2,oym2clear line oxm1,oym1,ox,oyclear line oxm2,oym2,ox,oyline hx,hy,xm1,ym1line hx,hy,xm2,ym2line xm1,ym1,x,yline xm2,ym2,x,yREM save off the old valsswitch(hand$)case "sec"osx = xosy = yosxm1 = xm1osxm2 = xm2osym1 = ym1osym2 = ym2breakcase "mins"omx = xomy = yomxm1 = xm1omxm2 = xm2omym1 = ym1omym2 = ym2breakcase "hour"ohx = xohy = yohxm1 = xm1ohxm2 = xm2ohym1 = ym1ohym2 = ym2breakend switchend subsub clockface()circle hx,hy,radiushtick = radius / 10mtick = htick / 2for z=0 to 360 step 6REM Begin at zero deg and stop before 360 degREM draw the hour markersangle = zangle = angle / DEG_PER_RADx2 = (hx + (sin(angle) * radius))y2 = (hy - (cos(angle) * radius))if mod(z,30) = 0 thentick = htickelsetick = mtickendifx3 = (hx + (sin(angle) * (radius - tick)))y3 = (hy - (cos(angle) * (radius - tick)))color 255,0,0line x2,y2,x3,y3color 0,0,0next zend sub

Mandelbrot.yab マンデルブロート集合描画
12345678910111213141516171819202122232425262728293031323334353637 #!/usr/bin/yabasicopen window 640, 400wid = 4xcenter = -1: ycenter = 0ms = 0for xcoord = 0 to 639for ycoord = 0 to 200ms = 0ca =(xcoord-320)/640*wid+xcentercb =(ycoord-200)/640*wid+ycenterx = 0: y=0for t = 1 to 20xnew = x*x-y*y+caynew = 2*x*y+cbx=xnew:y=ynewmagnitudesquared=x*x+y*yms = magnitudesquaredif (magnitudesquared > 100) break//if(magnitudesquared < 100) then : color 0,0,0 : dot xcoord, ycoord : end ifnext tms = ms+1if(ms > 250) thencolor 32,64,mod(ms,255)dot xcoord, ycoorddot xcoord, 400- ycoordelseif (ms > 150) thencolor mod(ms,255),64,32dot xcoord, ycoorddot xcoord, 400-ycoordelsecolor 0,0,0dot xcoord, ycoorddot xcoord, 400-ycoordend ifnext ycoordnext xcoord

その他参考になるサンプルプログラムを公開しているサイト
その他いろんなサイトで、サンプルプログラムを見つけることができます。
公式デモ
Yabasic公式ページ内にあるyabasicのソースコード内にある
demo.yab を実行すると、
素数調査&テキスト横スクロールデモ、
グラフィックデモ、三角錐回転デモ
が見られます。




yabasic-examples
https://github.com/spartrekus/yabasic-examples
サインカーブ表示デモとテトリスが含まれています
(テトリスは解像度の関係で下部分が表示されていないので別途調整が必要です)
(2か所ほど数字を変えれば調整できますので、挑戦してみてください。)
(ヒント: 縦20行->17行にすれば、Window最前面化せずとも表示できます。)


Rosetta Code(YaBasic)
https://rosettacode.org/wiki/Category:Yabasic
いろんな言語でのサンプルプログラムが刑されていますが、YaBasicだけで大量のサンプルがあります(今回サンプルとして実行したものもここサイトのものをベースにしているものがあります)。
参考(PS2版YaBASIC)
PS2版YaBasicについて
ネット上で探すと、PS2用のyabasicソースもみつかりますが、
一部PS2専用に追加されている命令が使われているようで、Brainuxで利用可能でX11版では動きませんでした。
これは、PS2で追加されたBASIC命令がいくつかあるためです。
特にsetrgb命令がが頻出するようです(色のパレット変更命令ぽい?)。
ただ、Brainで利用可能なX1ポート版では未対応で、一時期本家に取り込むかという話はあったようですが、X11などでは実装は難しいとのことでペンディングになっているようです。
https://github.com/marcIhm/yabasic/issues/39
// Additions introduced with the PS2 version
void triangle(struct command *cmd);
void gtriangle(struct command *cmd);
void setrgb(struct command *cmd);
void setdrawbuf(struct command *cmd);
void setdispbuf(struct command *cmd);
PS2用のBasicをWin32ポートに移植したものや、
javascript実装したもの(Web上で実行できます)もあるので、
こちらで動かすことはできそうです。
Win32移植版
https://sourceforge.net/projects/win32yabasic
Javascript実装
https://www.mrdictionary.net/yabasic
PS2用ゲームプログラムについて
PS2用YaBasicソース
Yabasic for PS2
Yabasic for PS2 : Free Download, Borrow, and Streaming : Internet Archive
昔はPS2のゲーム機加税回避のため、一部の国でプログラミング言語を梱包したことがあるようで、その際に梱包されたのがこのYabasicの移植版だったそうです。
先ほどの通り、特殊な命令が追加されています。
上記のリックから、Ps2用のYaBasicソースが入手できます。
ただ、一部特殊な命令が使われているのと、Window解像度が640×512になっていることが多いので、ゲームレイアウト的にも厳しいものもあるかもしれません。
(Brainuxの解像度は縦480ですが、Windowの枠を考えるとを実質440-450くらいです。)
———-
Win32 PS2 YaBasic Samples
https://win32yabasic.sourceforge.net/samples.html
PS2版YaBasicのWindows移植版のサンプルプログラムです。
特に、「rotating_triangle」というグラフィックデモをBrainで動かしてみたかったのですが、
PS2版で追加された専用命令をメインで使用しているため、断念しました
(下の画像はJavascript実装上で実行したものです。)。

Views: 2