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表示
12345678 #!/usr/bin/yabasicclear screenprint "Press 'q' to quit ..."label againprint color("green") "Hello ";print color("blue") "World ! ";if (inkey$(1)="q") exitgoto again

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

gdemo.yab グラフィック表示デモ
1234567891011121314151617 #!/usr/bin/yabasicw = 400open window w, wsleep 1label againbackcolour 0,0,0clear windowfor i=0 to w step 5v = 255 * i / wcolor 0, v, (255 - v)line 0, i, i, wcolor (255 - v), 0, vline i, 0, w, ipause 0.025next isleep 3goto 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実装上で実行したものです。)。

BasiC-256を試す

プログラミング学習用のBASIC動作環境とのことです。
標準では、GUI表示されるウインドウの中に、
・エディタ部分、
・テキスト出力エリア、
・グラフィック出力エリア
が入っています。
また、変数確認エリアも追加できます。
ただ実行するだけでなく、デバック実行として、1行ずつ実行していくことも出来ます。
この際には」、変数確認エリアを見ながら確認することも出来るので、学習に役立つでしょう
〇 basic-256 (basic256) 子供向けの教育用BASICプログラミング環境
BASIC-256は、誰でも(特に中学生・高校生)にコンピュータプログラミングの基礎を教えられるように設計された、使いやすいBASICバージョンです。gosub、for/next、gotoといった伝統的な制御構造を採用しており、子どもたちがプログラムのフロー制御の仕組みを簡単に理解できます。グラフィックモードが組み込まれており、数分で画面に絵を描くことができます。
また、楽しい演習を通してプログラミングの概念を紹介する、詳細で分かりやすいチュートリアルも用意されています。
https://packages.debian.org/bullseye/basic256
https://basic256.org/
起動:basic256
ドキュメントも日本語はありませんが、用意されており、
このページにサンプルプログラムも紹介されています。
https://doc.basic256.org/doku.php
YaBasicと比べると遅いですが、実行結果の確認は楽です。
Brainで実行する場合は、Basic-256が統合環境のため、
各ウィンドウが小さくなってしますが、学習用途であれば何とかなるかもしれません。
グラフィックウィンドウについては、エディタ、テキスト出力エリア、グラフィックを同時に出力した場合で、調整すれば、縦幅170くらいは表示できそうです。
(グラフィックウィンドウについては、縮小化表示もできます[1/2(half),1/4(quarter))
出力結果をPDFで出力することも出来ます。
サンプルプログラムについて
サンプルプログラムとしては、以下からソースプログラムをダウンロードすれば、
中に入っていました(.kbsファイル)
https://sourceforge.net/projects/kidbasic/files
basic256_2.0.99.10.orig.tar.gz
solar_system.kbs

snowflakes.kbs

rainbow.kbs

spriteslice.kbs

ring_01.kbs

その他参考になるサンプルプログラムを公開しているサイト
ドキュメントに掲載されているサンプルプログラム
https://doc.basic256.org/doku.php?id=start
spinner.kbs 針が動いて1-10がランダムに選ばれます。

gamesballons.kbs 大量の風船が上に浮かんでいきます(がBrain上だとめっちゃ遅いです。)

CopyCat.kbs サイモン的記憶ゲーム(実行には一部修正が必要)

mobius.kbs アニメーション化されたメビウスの輪(スムーズに回転します)

morie.kbs モアレ模様が表示されます。

square.kbs スクエア・スパイラル

jagged.kbs Jagged Depths 三角形を使ってカラフルな円形を表示します。(1/2表示)

Rosetta Code(BASIC256)
https://rosettacode.org/wiki/Category:BASIC256
いろんな言語でのサンプルプログラムが刑されていますが、BASIC-256だけで大量のサンプルがあります。
マンデルブロート集合描画
https://rosettacode.org/wiki/Mandelbrot_set#BASIC256
(全部表示されるまでに、1時間以上かかります。)

Basic Bits – Copy paste & run
BASIC-256で動作する各種プログラムを公開されています。
グラフィックデモの他に、いくつかのゲームも含まれています。
Views: 144