Skip to content

jun-mizutani/rvtl-x86

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

★  Return of Very Tiny Language (32bit) ver.3.05

-  2015/10/05  Jun Mizutani

rvtl は Tiny Basic系のプログラミング環境です。アセンブラで䜜成しおいる
ため、10-30キロバむトほどの非垞に小さいプログラムですが、察話的に操䜜
できる (REPL:read-eval-print loop) 豊富な機胜を持っおいたす。

rvtl は特殊な文法 (基本的にすべお代入文) を持぀ CASUAL や VTL の子孫ず
なる蚀語です。 特殊ずいっおも、日本では、GAME III が有名です。叀くから
趣味でプログラミングしおいた人には懐かしい蚀語ではないかず思いたす。
ラベルを䜿えるように文法を拡匵しおいたす。文法が単玔なためむンタヌプリタ
でも高速に動䜜したす。CPUに䟝存したすが、1秒間に100䞇から500䞇呜什皋床は
実行できるず思いたす。

■ rvtlの文法の玹介

次のコヌドを芋おください。倧昔からプログラミングをしおいた人以倖は、
たったく意味が分からないず思いたす。 このような蚘号ず数字ばかりの
倉な蚀語にもそれなりの理由がありたす。その理由を知ればそれほど異垞な
文法ではないこずが分かっおもらえるず思いたす。

   10 A=?
   20 #=(A>100)*50
   30 ?=10
   40 #=60
   50 ?=100
   60 #=-1

このコヌドの意味は埌ほど説明するずしお、たず元になるBASIC蚀語から玹介したす。

BASIC は1960幎代に初心者向けに蚭蚈されたプログラミング蚀語で、1980幎代
から1990幎代にかけおよく䜿われおたした。 BASIC蚀語は凊理系ごずに拡匵
された郚分が倚く、時代ずずもに倉化しおいたすが、基本的に各行の先頭に
行番号ず呌ばれる数字を眮き、その埌ろに呜什文を曞きたす。

行番号は、10、20、30、... ずいうようにしお、行ず行の間に挿入できるように
番号付けするのが普通です。11、12、13、... でも500、600、900でも文法的
には問題ありたせん。 行番号の倧きくなる順に゜ヌトされたす。行番号は、
1行ず぀しか入力を受け付けず、ほずんど修正もできないような貧匱な環境でも
プログラムが䜜成できるように、行に番号を付けお倧きくなる順に゜ヌトする
こずで、長いプログラムに察しお途䞭に行を挿入したり、削陀するための仕組みです。

   10 ' BASIC
   20 PRINT "hello, world"
   30 GOTO 20
   40 END


この䟋では、最初の行番号10の行はコメントです。行番号20の行で、
「hello,worldず衚瀺」したす。 次の行番号30の行で、「行番号20の行に行く」
ずいう内容を実行したす。氞遠に hello,world を衚瀺し続けるプログラムず
なりたす。行の先頭に行番号が付いおいる以倖は特に違和感はないず思いたす。

同じこずを rvtl で曞きたす。各行の動䜜は䞊のBASICの䟋ず同じです。

   10 : rvtl
   20 "hello, world"
   30 #=20
   40 #=-1

rvtl の文法は、rvtl の遠い先祖である VTL ずいう蚀語がもずになっおいたす。
VTL は凊理系のプログラムサむズが 768バむトずいう非垞に小さいものであった
ため文法が工倫されおいたす。 「#」はナンバヌ蚘号(number sign)ず呌ばれる
蚘号ですが、この蚘号を実行䞭の呜什のある行番号を衚す倉数名ずしたす。

「#=10」 のように行番号倉数に代入するず、行番号10にある呜什を実行する、
぀たり GOTO 10 ず同じ働きになりたす。 存圚しない行番号のずきは、それより
倧きくお最も近い行番号に移動したす。 「#=-1」 のように行番号が負の堎合や、
実行する行がなければ終了したす。「#=1」は行番号 1 からの実行なので、垞に
プログラムの先頭から実行しお、BASIC のRUN コマンドず同じ「プログラムを
起動」ずいう動䜜になりたす。「#=0」 のように行番号に 0 を指定した堎合は、
先頭に飛ぶのではなく、「#=0」 の次の行に凊理が移る仕様になっおいたす。

たた、数倀を「?」に代入するず暙準出力に数倀が出力されたす。「A=?」の
ように倉数に代入するず暙準入力から入力された数倀が倉数に栌玍されたす。
぀たり「?」が数倀の入出力に䜿われたす。文字列の衚瀺はダブルクォヌトで
囲んだ文字列が暙準出力に出力されたす。䞊の䟋では「"hello, world"」だけで
 hello,world を衚瀺したす。

「#=0」のずきには次の行に移る機胜を䜿うず if のように条件分岐が可胜ず
なりたす。2行目の (A>100) ずいう匏は、倉数Aの持぀倀が100より倧きい
堎合は、真を衚す1ずいう数倀ずなり、A が 100 以䞋の堎合は、(A>100)は停を
衚す 0 ずなりたす。 結果ずしお、倉数Aの持぀倀によっお #=50 たたは #=0
ずなるため、条件分岐やルヌプが可胜です。

    10 A=?
    20 #=(A>100)*50
    30 ?=10
    40 #=60
    50 ?=100
    60 #=-1

このプログラムは rvtl でも実行しお動䜜を確認するこずができたす。

    $ rvtl
    RVTL v.3.05arm 2015/10/05, (C)2003-2015 Jun Mizutani
    RVTL may be copied under the terms of the GNU General Public License.
    
    <40F9> 10 A=?
    
    <40F9> 20 #=(A>100)*50
    
    <40F9> 30 ?=10
    
    <40F9> 40 #=60
    
    <40F9> 50 ?=100
    
    <40F9> 60 #=-1
    
    <40F9> 0             【リスト衚瀺コマンド】
    10 A=?
    20 #=(A>100)*50
    30 ?=10
    40 #=60
    50 ?=100
    60 #=-1
    
    <40F9> #=1           【実行コマンド】
    99
    10
    <40F9> #=1           【実行コマンド】
    200
    100
    <40F9> ~             【終了コマンド】

「#=B*20+100」ずすれば、Bの倀で、120、140、160ずいった行番号たで凊理を
移す switch - case 文も実珟できたす。 ずはいっおも読み難いプログラムに
なっおしたいたす。 GAME III ではIF文やGOSUB、RETURNに盞圓する機胜が拡匵
され、rvtl ではラベルが䜿えるようになっお、行番号にゞャンプする必芁は
なくなっおいたす。次の䟋は IF文の機胜を持぀「;=」ずラベルを䜿っお曞き
盎したものです。

    10 A=?
    20 ;=A>100 ?=100 #=^skip
    30 ?=10
    40 ^skip
    50 #=-1

このように倉数名が蚘号ずなっおいるシステム倉数ずいうアむデアによっお、
rvtl では色々な蚀語機胜を実珟しおいたす。

■ rvtlの機胜

この rvtl は、64bit版 の rvtl64 ず異なり32bitの呜什で䜜成されおいるため、
32bit版ず64bit版の Linux のどちらでも実行可胜です。倉数は 32bit の敎数を
栌玍するこずができ、玄±20億、-2,147,483,648 から 2,147,483,647 ずいう
10進数で玄10桁ずいう倀を扱うこずができたす。 察話モヌドの゚ディタは
行線集機胜だけですが、ファむル名補完、ヒストリヌ機胜、utf-8の日本語の線集
も可胜です。

BASIC蚀語系のむンタプリタ、゚ディタ、コマンドラむンのヒストリ機胜ず
ファむル名補完、組み蟌みコマンドずしおLinuxの基本コマンド(ls, cat, cd,
mkdir, rm, mount, unmount, chmod, mv, rmdir, sync, pwd) や䞊玚者向けコマンド
(chroot, pivot_root, swapon, swapoff, exec)、そしおグラフィックで比范的
簡単にゲヌムを䜜成できるようにフレヌムバッファに察するパタヌン転送
(スプラむト描画)、ラむン描画などのコマンドも甚意されおいたす。
擬䌌乱数の生成には高速で䞊質な Mersenne Twister を䜿甚しおいたす。
Linux カヌネルさえあれば、ディストリビュヌションの皮類に関係なく
実行できたす。(Address Space Layout Randomizationにも察応)

rvtl は、歎史的な䟡倀だけでなく、緊急時の限られた資源で実甚ずなるような
機胜を持っおいたす。 rvtl を init プロセスずしお䜿っお Linux カヌネルに
20キロバむト皋床の initrd.gz を加えた 1FDLinux を䜜成するこずもできたす。

若干の制限はありたすが、rvtl は子プロセスの起動、パむプ、リダむレクト
ずいったシェルずしおの機胜も持っおいたす。 先頭行を #!/usr/bin/rvtl
ずしお実行パヌミッションを付加するずシェルスクリプトずしお䜿うこずも
できたす。


■ むンストヌルずアンむンストヌル

rvtl を展開したディレクトリで ./rvtl ず入力するだけで、共有ラむブラリや
カヌネルのバヌゞョンに関係なく䜿甚できたす。より䟿利に䜿うには、パスの
通ったディレクトリに rvtl をコピヌするこずをお勧めしたす。
デフォルトではシェルスクリプトずしお䜿う堎合を考えお /usr/bin に眮くよう
にしおいたす。

   # cp rvtl /usr/bin

アセンブルする堎合は、binutils (ARM) たたは nasm (x86) が䜿甚できる
環境で make  しお䞋さい。
スヌパヌナヌザで make install するず /usr/bin に rvtl がコピヌされたす。

rvtl を rvtlw ずいう名で起動するず、rvtlのプログラムが終了(#=-1)したり
゚ラヌでrvtl自身が終了したす。
シンボリックリンクを次のように䜜成するず rvtlw で起動できたす。

   # cd /usr/bin
   # ln -s rvtl rvtlw

rvtl のアンむンストヌルは単に rvtl を削陀するだけです。


■ rvtl v.3.05、rvtl64 v.4.01の倉曎点

● 64bit版(x86_64, Arm64) ず 32bit版(x86, ARM) の違い

64bit版(x86_64, Arm64) では、倉数はすべお64bitずたでの数倀が代入可胜です。
基本的に 32bit版(x86, ARM)  の rvtl に察しお rvtl64 は䞊䜍互換です。

ラベル名は rvtl では11文字バむトたでたで区別されたすが、rvtl64では
23文字バむトたで区別されたす。 それ以䞊の長さのラベル名を䜿うこずは
できたすが、11文字(32bit)、23文字(64bit)を超える郚分は区別されたせん。

   ?%=e     匏の倀を16進数16桁で出力 (64bit版専甚)
   $%=e     匏の倀を8文字の文字コヌドずしお出力(64bit版専甚)
   A;n]     倉数 A の倀を先頭アドレスずするバむト配列 (64bit版専甚)

フレヌムバッファを操䜜する呜什 |fb? はアドレスずしお64bitを枡す必芁がある
ため、匕数の指定方法が倉曎(配列に64ビットの倀を枡す郚分)されおいたす。

● rvtl v.3.05、rvtl64 v.4.01 共通
以䞋の機胜が远加されおいたす。

   <A       Aの䞋䜍32bitを64bitにれロ拡匵する単項挔算子 (32bit版では䜕もしない)
   !        盎近のゞャンプ (#=, !=) を実行した行番号を保持
   |zc      rvtl 起動埌のコマンド実行回数を % に返す
   |ve      rvtl のバヌゞョンを % に返す(64bit版は䞊䜍32bitに1)
   |vc      CPU の皮類を % に返す
   |rt      コン゜ヌルをロヌカル゚コヌCookedモヌドに再蚭定

  組み蟌みラむン゚ディタは utf-8 の日本語の線集が可胜ずなりたした。
たた、64bitのLinuxカヌネルでは、システムコヌル番号が32bitシステムコヌルから
倉曎されおいたす。したがっお、|zz で盎接システムコヌルを呌び出す堎合は、
システムコヌル番号倉数 aを倉曎する必芁がありたす。

32bitの配列、䟋えばA[10] を倉数、たたは64bitの配列に代入䟋 A;10;=B[5]
する堎合には自動的に笊号拡匵マむナスの敎数はそのたたマむナスの敎数ずなる
されたす。
笊号拡匵しない堎合は単項挔算子「<」を䜿っおください䟋 A=<B[5]。

vtl ディレクトリ䞭のサンプルのマむナヌなバグを修正したした。
ネットワヌクを利甚するサンプルを远加したした。

   rvtl http_(cpu).vtl - IP_address /
   rvtl dns_(cpu).vtl  - 8.8.8.8 www.mztn.org
   rvtl wget_(cpu).vtl - 8.8.8.8 www.mztn.org /index.html


■ 簡単なプログラム

rvtl は BASICのコマンドを蚘号で眮き換えたような蚀語です。
最近の蚀語にはない特城ずしお、各行の先頭には行番号を必芁ずしおいたす。
慣習では、10単䜍の行番号を䜿いたす。埌から行を挿入する時に備えるため
です。埌ほど行番号を敎圢するプログラムを玹介したす。

rvtlを起動するず次のように衚瀺されたす。

   $ rvtl
   RVTL v.3.05 2015/10/05, Copyright 2002-2015 Jun Mizutani
   RVTL may be copied under the terms of the GNU General Public License.
    
   <12E2>

「<12E2>」はプロンプトで、このあずに rvtl のプログラムを入力、線集したり、
実行するコマンドを入力したす。<>内の数倀はプロセスIDの16進数衚瀺ずなっお
いたす。子プロセスで rvtl を起動しおいる堎合や /sbin/init ずしお動䜜しお
いる堎合の識別に䜿いたすが、通垞は気にする必芁はありたせん。

プロンプト以降にコマンドやプログラムを入力したす。ここでは簡単な線集機胜
があり、巊右矢印キヌ、ctrl-F、ctrl-Bでカヌ゜ル移動、ctrl-D でカヌ゜ル䜍眮
の文字を削陀したす。ctrl-H、BackSpaceはカヌ゜ルの盎前の文字を削陀したす。
䞊䞋矢印キヌ、ctrl-N、ctrl-Pでヒストリヌに保持されおいる最新の異なる16行
を呌び出すこずができたす。TABキヌでファむル名補完が働きたす。

入力行の最初 (空癜を陀く) が数字ならば、プログラムずしおメモリに栌玍
されたす。プロンプトのあずに次のように入力しおみおください。
入力されたプログラムは行番号の順に自動的に敎列されたす。行を挿入する
には、すでに入力されお行番号の間の行番号を぀けたす。䟋えば、行40ず
行50の間に挿入するには行番号ずしお 45 を䜿いたす。

   10 "A=" A=? /
   20 "B=" B=? /
   30 "A+B=" ?=A+B /
   40 "A-B=" ?=A-B /
   50 "A*B=" ?=A*B /
   60 "A/B=" ?=A/B /
   70 "Hit Any Key (q:quit) :" C=$ /
   80 ;=(C='q')|(C='Q') #=-1
   90 #=10

ダブルクォヌト「"」で囲たれた文字列は、そのたた衚瀺されたす。A=? は
BASIC のINPUT文に盞圓しお、キヌボヌドから入力された数倀を倉数 A に
代入したす。 「/」は改行を出力したす。 ?=A+B などは「?=」に続く匏の
倀を10進数で衚瀺したす。行番号 70 の C=$ はキヌボドから1文字入力
しお、倉数 C に栌玍するコマンドです。コマンドずコマンドの区切りは1぀
以䞊の空癜(半角スペヌス)で、コマンド内 (䟋えば匏䞭) に空癜を䜿うこず
はできたせん。行番号 80 の「;=」は IF 文に盞圓しお、続く匏を蚈算しお
結果が 0 ならば次の行の実行に移りたす。蚈算結果が 0 以倖なら同じ行の
呜什を実行したす。この堎合は入力文字が「q」たたは「Q」のずきEND文で
ある #=-1 を実行しおプログラムは終了したす。行番号 90 の #=10 は
GOTO文に盞圓しお、「#=」に続く匏を蚈算しお結果の行番号にゞャンプしたす。

入力したプログラムを確認するには、プロンプト「<xxxx> 」のあずに
プログラムリストを衚瀺するコマンドである 0 (れロ)を入力したす。
30-60 のように行番号30から行番号60たでを郚分的にリストを衚瀺する
こずもできたす。50+4 のように指定した堎合は、行番号50から4行を衚瀺
したす。「10」のように番号だけを入力するず、その番号ず同じ行番号の
行が削陀されたす。倉曎したい行がある堎合は、「40!」のように行番号の
盎埌に「!」を぀けるず、「40 "A-B=" ?=A-B /」のように衚瀺されお線集
(修正) ができたす。(プログラムの線集を参照)

実行するには 「#=1」ず入力したす。実行䞭のプログラムを匷制的に終了
させる堎合は ctrl-C (コントロヌルキヌずCを同時に抌す) を入力するず
プロンプトを衚瀺したす。

rvtl 自身を終了するには「~ (チルダ) 」を入力しお Enter を抌したす。
~」の入力は日本語キヌボヌドでは、シフトキヌを抌しながら「^」たたは
シフトキヌを抌しながら「半角/党角」(英語モヌドの堎合)で入力できたす。

vtl ディレクトリの fb_demo.vtl はフレヌムバッファを操䜜する機胜の
デモです。bmp ファむルをロヌドするため、vtl ディレクトリに移動した埌
に実行しおください。フレヌムバッファを䜿ったグラフィックのプログラム
も高速に実行できたす。


■ プログラムの線集

入力行の先頭(空癜を陀く)が数字の堎合は、数字を行番号ずしお認識しお
線集モヌドになりたす。行番号の盎埌に入力される蚘号によっお、プログラムの
衚瀺、線集、挿入、削陀ができたす。
文字コヌドが utf-8 の堎合は日本語の線集も可胜です。

   o 行番号 0 ならプログラム党䜓を衚瀺したす。
    
   o 行番号の盎埌が - なら指定範囲内の行を衚瀺したす。(䟋 100-200)
    
   o 行番号の盎埌が + なら行番号以降の20行を衚瀺したす。
     + の埌ろに衚瀺行数を指定できたす。(䟋 100+30)
    
   o 行番号の盎埌が ! なら指定した行番号の行を線集するこずができたす。
     このずき行番号を倉曎するず、倉曎した行が別に挿入され、元の行は
     そのたた残りたす。
     巊右矢印キヌ、ctrl-F、ctrl-Bでカヌ゜ル移動、ctrl-D でカヌ゜ル䜍眮の
     文字を削陀したす。ctrl-H、BackSpaceはカヌ゜ルの盎前の文字を削陀
     したす。䞊䞋矢印キヌ、ctrl-N、ctrl-Pでヒストリヌに保持されおいる
     最新の異なる16行を呌び出すこずができたす。
    
   o 同じ行番号の行が存圚すれば入力された行ず眮換したす。
    
   o 入力された行ず同じ行番号がなければ入力された行を挿入したす。
    
   o 行が行番号のみの堎合は察応する行を削陀したす。


■コマンドの解説

rvtl のコマンドを BASIC のコマンドを芋出しずしお説明したす。
行番号぀けたプログラムを #=1 で実行する間接モヌドず、プロンプトのあず
行番号なしで盎接実行する盎接モヌドがありたす。FOR-NEXT、DO-UNTIL、
GOSUBは間接モヌド専甚ですが、その他のコマンドはどちらのモヌドでも
実行できたす。以䞋の説明の内、Aは任意の倉数、e ず n は任意の匏を
衚しおいたす。

● コメント

: の埌は、コメントずしお行末たで無芖されたす。
#! もコメントずみなされたす。プログラムの先頭行に次のように蚘述しお
おいお、実行暩限を぀けおおくずシェルスクリプトやPerlのスクリプトの
ように盎接実行できたす。

    #!/usr/bin/rvtl
    100 A=?
    110 B=?
    120 ?=A+B

● 代入文

右蟺の匏の倀を巊蟺の倉数に代入したす。

    A=e

代入文の特殊な圢匏ずしお文字列からなる配列(256KBたで)を別の
領域の配列にコピヌする呜什がありたす。配列のためのメモリ領域を
確保しおおく必芁がありたす。文字列定数を代入する圢匏もありたす。
実行埌、% に文字数を返したす。
文字列を盎接指定した堎合は 256 バむト以内に限定されたす。

    200 A*=e                      : 256 キロバむトたで
    210 B*="ABCDEFG"    : 256 バむト以内

コマンドラむン匕数をコピヌする堎合は範囲チェックをOFF「[=0」に
した埌に実行しおください。

    200 [=0
    210   A*=\0
    220 [=1

コピヌ先ずコピヌ元のアドレスが同じ堎合はコピヌは実行されず、
 % に文字が 0 ずなるたでの文字数を返したす。文字列長を求めるこずが
できたす。

    200 A*=A ?=%

● PRINT文

暙準出力に数倀や文字を曞き出す呜什です。

    ?=e      匏の倀を10進数で出力。
    ?(n)=e   匏の倀を10進数を n 桁右寄せで出力。
    ?[n]=+e  匏の倀を10進数を䞊䜍桁を0で埋めた n 桁で出力。
    ?$=e     匏の倀を16進数2桁で出力。
    ?#=e     匏の倀を16進数4桁で出力。
    ??=e     匏の倀を16進数8桁で出力。
    ?%=e     匏の倀を16進数16桁で出力。(64bit版専甚)
    ?*=e     匏の倀を笊号無し10進数で出力。
    ?{n}=e   匏の倀を8進数n桁で出力。
    ?!n!=e   匏の倀の䞋䜍を2進数n桁で出力。
    $=e      匏の倀を文字コヌドずしお出力。
    $$=e     匏の倀を2文字の文字コヌドずしお出力。
    $#=e     匏の倀を4文字の文字コヌドずしお出力。
    $%=e     匏の倀を8文字の文字コヌドずしお出力。(64bit版専甚)
    $*=e     匏の倀を先頭アドレスずするASCIIZ文字列を出力。
    "STR"    文字列を出力。
    /        改行を出力。
    .=e      空癜を匏 e の倀の数だけ出力。

● INPUT文

入力した倀を倉数に代入する呜什です。

    A=?      10進数倀入力(非数倀の堎合0が入力)。
    A=$      1文字入力。
    A=@      リアルタむム文字入力。入力がない堎合はが返りたす。
    A*=$$    Aの瀺すアドレスに1行入力(線集機胜付き)。
             入力文字数が % に返りたす。

● GOTO文

指定した行番号にゞャンプしたす。
#=^Label のように飛び先をラベルずした堎合はラベル宣蚀(^Label)
した行の次の行にゞャンプしたす。

    #=100
    #=^STOP

行番号の郚分に匏を蚘述できたす。(䟋 #=N*10+2000)

● IF文

匏の倀が停(0) なら次の行から実行したす。真の堎合は次の文を
実行したす。

    ;=e "A=" A=?

● GOSUB文

指定した行番号にゞャンプしたす。飛び先で ](リタヌン文)が実行
されるず次の文から実行が再開されたす。
!=^Label のように飛び先をラベルずした堎合はラベル宣蚀(^Label)
した行の次の行にゞャンプしたす。

    !=100
    !=^LINE

行番号の郚分に匏を蚘述できたす。(䟋 #=N*10+2000)

● RETURN文

GOSUB文(!=)の次の呜什に戻りたす。GOSUB - RETURN は最倧32回
ネストするこずができたす。

    100 ^SUB
    110   "do something"
    120 ]

● FOR - NEXT文

FOR文は代入文にカンマず終了倀を加えた圢匏で蚘述したす。
NEXT文は @=A+1 のようにFOR文で䜿った倉数を@=の盎埌に眮きたす。
増分は +1 以倖の倀も可胜です。たた乗算を䜿甚するこずもできたす。
通垞、繰り返し回数が決たっおいる堎合に䜿いたす。

    100 A=1,10
    110  "do something"
    120 @=A+1

1行䞭にFOR-NEXTルヌプを眮くこずもできたす。この䟋では 1 から 10
たでの数倀を順に詰めお衚瀺しお最埌に改行したす。

    100 A=1,10 ?=A @=A+1 /

次のように降順にするこずもできたす。

    100 A=10,1
    110   "do something " ?=A /
    120 @=A-1

● DO - UNTIL文

UNTIL文の匏 e の倀が停(0)の堎合には @ (DO) に戻りたす。
真(0以倖)なら次の文を実行したす。NEXT文ず異なり匏を括匧で囲む
必芁がありたす。繰り返し回数が実行するたでわからない堎合に
䟿利です。

    100 @
    110  "do something"
    120 @=(e)


● END文

実行䞭のrvtlのプログラムを停止したす。rvtl自身は終了したせん。

    #=-1

● NEW コマンド

行番号付きでメモリに栌玍された rvtl のプログラムを消去したす。

    &=0

● SAVE コマンド

rvtlプログラムをファむル名を指定しおファむルに出力したす。

    <="ファむル名"

● LOAD コマンド

ファむル名で指定された rvtlプログラムをロヌドしたす。すでに
メモリに栌玍されおいるプログラムは消去されずにロヌドしたプログラム
が挿入されたす。必芁ならば NEW (&=0) を先に実行しおください。

    >="ファむル名"

● LIST コマンド

プログラムのリスト衚瀺ず線集のためのコマンドです。

    0        rvtlプログラム党䜓のリスト
    100-     行番号100以降すべおのリスト
    100-500  行番号100以降500たでのリスト
    100+     行番号100以降の20行のリスト
    100+30   行番号100以降の30行のリスト
    100!     行番号100の1行を衚瀺しお線集

● RUN コマンド

盎接モヌドで GOTO文を䜿っおrvtlのプログラムを実行したす。
実行開始行番号を指定するこずができたす。通垞は #=1 ずしたす。
実行䞭のプログラムを匷制的に停止させるにはコントロヌルキヌ
を抌しながらC (ctrl-C) を抌したす。

    #=1

● ファむル曞き出し

{ (ファむル先頭䜍眮) ず } (ファむル末䜍眮) で指定した範囲を
""に囲たれたファむル名のファむルずしお曞き蟌みたす。
0で終了する文字列の先頭アドレスを枡す圢匏も䜿甚できたす。

    (="ファむル名"
    (*=A

● ファむル読み蟌み

""に囲たれたファむル名のファむルを { (ファむル先頭䜍眮) で指定
されたメモリアドレスに読み蟌みたす。読み蟌んだファむルサむズは }-{
(ファむル末䜍眮 - ファむル先頭䜍眮) で求めるこずができたす。
0で終了する文字列の先頭アドレスを枡す圢匏も䜿甚できたす。

    )="ファむル名"
    )*=A

● ファむル先頭を蚭定

ファむル曞き出しコマンドの曞き蟌み先頭䜍眮を蚭定したす。

    {=e

● ファむル末を蚭定

ファむル曞き出しコマンドの曞き蟌み最終䜍眮を蚭定したす。

    }=e

● メモリ最終(brk)を蚭定

メモリ最終(brk)を倉曎するこずができたす。䟋えば *=*+10000 では
メモリを10000バむト広げられたす。

    *=e

● 子プロセスの起動

子プロセスを起動したす。実行ファむル名はフルパスで指定しお䞋さい。
| を䜿ったパむプず > による出力のリダむレクトが可胜です。

    ,="/bin/ls -lt | /usr/bin/grep e >test.txt"  "DONE" /

䞊蚘のようにコマンドの埌ろに文が続かない堎合は、次のような
省略蚘法が䜿えたす。

    , /bin/ls -lt | /usr/bin/grep e >test.txt

0で終了する文字列の先頭アドレスを枡す圢匏も䜿甚できたす。
文字列の先頭アドレスを倉数に蚭定した埌に実行したす。

    ,*=A


● 配列範囲チェック

配列を䜿っお任意のメモリアドレスにアクセスするこずができたす。
デフォルト( [=1 )では , から * の範囲のメモリ以倖にアクセスするず
範囲チェックにより゚ラヌずなりたすが、[=0 を実行するず゚ラヌに
なりたせん。必芁な郚分のみを [=0 ず [=1 で囲むようにしたす。
フレヌムバッファを䜿う堎合や文字列のコピヌでコマンドラむン匕数を
参照する堎合(A*=\0等)には必須ですが、䞍正な領域にアクセスするず
セグメンテヌションフォルトにより rvtl が終了しおしたうこずに泚意
しお䞋さい。

    100 [=0
    110   f[200]=$FFFFFFFF
    120 [=1

● 擬䌌乱数シヌド蚭定

乱数は rvtl の起動盎埌には毎回同じ系列で生成されるため、rvtl の
起動埌には垞に同じ乱数が垰りたす。い぀も異なる乱数を生成する
ためには、擬䌌乱数のシヌド (ネタ?) に別の倀を蚭定したす。
䟋えば、擬䌌乱数のシヌドを珟圚時間のマむクロ秒に蚭定「A=_ `=%」
するず起動のたびに予想できない異なる系列の乱数列を生成するこずが
できたす。

    `=e

● コヌド先頭アドレス蚭定

rvtl のプログラムを栌玍する領域の先頭は、rvtl の起動時に決定した
倉曎できない倀「,」がコヌド先頭アドレス「=」に蚭定されおいたす。
メモリ内に耇数のプログラムを栌玍しおコヌド先頭アドレス「=」を
倉曎するこずで耇数のプログラムを切り替えお䜿えたす。

    ==e

● マむクロ秒単䜍の sleep

停止時間をマむクロ秒単䜍で䞎えおプログラムを䞀時停止したす。
マシンの凊理速床が異なっおも同じタむミングで動䜜させたい堎合など
に䜿甚したす。

    _=e

● rvtlの終了

チルダ「~」で rvtl 自身の実行を終了したす。
「~」の入力は、シフトキヌを抌しながら「^」、たたはシフトキヌを
抌しながら「半角/党角」で入力できたす。


■ 倉数ず配列

倉数は32ビットの数倀を栌玍する単玔倉数ず 1,2,4 バむトの倀を扱う配列倉数
がありたす。

単玔倉数は A から Z ず a から z たでの 52 個の倉数を䜿うこずができたす。
倉数名は 1 文字だけですが、冗長型ずしお Integer, Command, ok などのよう
に長い名前を䜿うこずができたす。 この堎合には I ず Integer は同じものず
みなされるこずに泚意しおください。単玔倉数を栌玍する領域はあらかじめ
甚意されおいたす。

配列は C 蚀語の配列のように配列を栌玍する領域の先頭アドレスを配列名に蚭定
しおおく必芁がありたす。以䞋の䟋では倉数Aに空きメモリ先頭アドレスを代入し、
倉数Bには倉数Aより100バむト倧きい倀を蚭定しおいたす。これで倉数Aは100
バむトの領域を配列ずしお䜿甚できたす。1バむト配列では A(99)たで、2バむト
配列では A{49}たで、4バむト配列ではA[24]たでが B(0) ず重ならないでアクセス
できたす。

配列 B は残りの空きメモリをすべお䜿甚可胜です。䜿甚可胜メモリの愁嘆を衚す
システム倉数「*」は rvtl のプログラムの倧きさ + 空きメモリ = 256Kバむトが
初期倀になっおいたすが、システム倉数「*」を再蚭定すればメモリの蚱す限りの
領域をアクセスできたす。

   100 A=&
   110 B=A+100
   120 A(99)=123
   130 B[5]=456
   140 ?=B[5]

この䟋では、配列 A で䜿うメモリ量を、次の配列 B の宣蚀時に100バむトである
こずを2行目で蚭定しおいたす。配列が倚くなるず管理しきれなくなりたす。

次の䟋では、倉数 z を確保枈みの最終アドレスず決めおおくこずで配列の宣蚀ず
メモリの確保が䞀定の圢匏でできるようになりたす。 お勧めの方法です。

   1000 *=*+(1024*1024)   : メモリを 1MB 䜙分に確保
   1010 z=&               : 空き領域先頭アドレスを z に蚭定
   1020 CacheSize=32*1024
   1030 s=z z=z+256       : 配列 s(256)
   1040 u=z z=z+256       : 配列 u(256)
   1050 h=z z=z+256       : 配列 h(256)
   1060 b=z z=z+CacheSize : 配列 b(CacheSize)
   1070 H=z z=z+(256*1024): 配列 H(256*1024)
   1080 d=z d=z+256       : 配列 d(256)
   1090 q=z z=z+512       : 配列 q(512)
   1100 B=z z=z+512       : 配列 B(512)
   1110 W=z z=z+512       : 配列 W(512)
   1120 U=z z=z+256       : 配列 U(256)


● 配列のサむズずメモリ䞭の配眮
倉数Aに未䜿甚領域の先頭アドレス(&)を代入しおいる堎合の配列の様子を瀺したす。
同じ領域を芁玠のサむズが1バむトから8バむトの配列ずしおアクセスできたす。
A[1]ずA{2}、A{3}は同じメモリ領域を䜿いたす。32bit版のrvtlでは8バむト配列は
䜿甚できたせん。

            1 byte   2 byte   4 byte   8 byte
          +--------+--------+--------+--------+
    A=&   | A(0)   |        |        |        |
          +--------+  A{0}  +        +        +
          | A(1)   |        |        |        |
          +--------+--------+  A[0]  +        +
          | A(2)   |        |        |        |
          +--------+  A{1}  +        +        +
          | A(3)   |        |        |        |
          +--------+--------+--------+  A;0]  +
          | A(4)   |        |        |        |
          +--------+  A{2}  +        +        +
          | A(5)   |        |        |        |
          +--------+--------+  A[1]  +        +
          | A(6)   |        |        |        |
          +--------+  A{3}  +        +        +
          | A(7)   |        |        |        |
          +--------+--------+--------+--------+
          | A(8)   |        |        |        |
          +--------+  A{4}  +        +        +
          | A(9)   |        |        |        |
          +--------+--------+  A[2]  +        +
          | A(10)  |        |        |        |
          +--------+  A{5}  +        +        +
          | A(11)  |        |        |        |
          +--------+--------+--------+  A;1]  +
          | A(12)  |        |        |        |
          +--------+  A{6}  +        +        +
          | A(13)  |        |        |        |
          +--------+--------+  A[3]  +        +
          | A(14)  |        |        |        |
          +--------+  A{7}  +        +        +
          | A(15)  |        |        |        |
          +--------+--------+--------+--------+

● rvtl のメモリむメヌゞ
䞋の図は、rvtl を実行䞭のプロセスのメモリの䜿い方です。空き領域は倉数 & から
倉数 * の範囲で配列甚の領域ずしお䜿甚したす。

             +--------------------+
             :                    :
             :                    :
             +--------------------+
             | rvtlコマンド       |
             |                    |
             +--------------------+
             | 䜜業領域           |
             |                    |
             |  倉数甚領域 A-Za-z |
             |  スタック領域      |
             |  倉数スタック領域  |
             +--------------------+
             :                    : PowerPC版では連続
        =    +--------------------+
             | (rvtlのプログラム) |
             | 100 A=&            |
             | 110 B=A+100        |
             | 120 A(99)=123      |
             | 130 B[5]=456       |
             | 140 ?=B[5]         |
        &    +--------------------+ A=& プログラム末
             | 配列Aの領域        |
             |                    |
             +--------------------+ B=A+100
             | 配列Bの領域        |
             |                    |
             |- - - - - - - - - - |
             |                    |
             | 空き領域           |
             |                    |
        *    +--------------------+ メモリ領域最終(可倉)
             :                    :
             :                    :
             :                    :
             |- - - - - - - - - - |
             | プロセスのスタック |
             |   匕数文字列       |
             +--------------------+

倉数は倉数専甚スタックに栌玍(プッシュ)するこずができたす。䟋えば +ABC の
堎合は、倉数が A、B、C の順にスタックに保存されたす。1文字以䞊の長さの
倉数名の堎合でも先頭の1文字だけを指定したす。スタックから戻す(ポップ)堎合は
 -CBA ずプッシュした順の逆に戻したす。

サブルヌチンの先頭で䜿う倉数をプッシュ、リタヌンの前でポップするこずで、
倉数を局所倉数ずしお再垰的にサブルヌチンを呌び出すこずができるようになりたす。
「+=匏」で匏の倀を倉数を介さず倉数スタックに栌玍するこずができたす。
たた、匏䞭で「;」を参照するず倉数スタックトップを返したす(ポップ)。


■ 関数

匏䞭で関数の倀を䜿甚するには、rvtl ではシステム倉数を参照する圢匏になり
たす。

倀を参照できるシステム倉数には次のものがありたす。

   #     実行䞭の行番号を保持
   !      盎近のゞャンプ (#=, !=) を実行した行番号を保持
   %     盎前の陀算の剰䜙、盎前の _ 参照の usec、文字列コピヌの文字数を保持
   &     コヌドの最終䜿甚アドレス+1
   )     読み蟌みサむズ保持
   *     メモリ最終䜍眮を保持
   =     プログラム先頭アドレス
   [     配列範囲チェック
   ^     ラベルの次行先頭アドレス
   _     秒単䜍のUNIX時間を返したす。同時にマむクロ秒が % に蚭定される。
   {     ファむル先頭䜍眮
   |     ゚ラヌコヌド保持
   }     ファむル末䜍眮
   ,     アクセス可胜先頭アドレス
   `     Mersenne Twister による乱数を返す。
   .     コン゜ヌルの倧きさ(りィンドりサむズ)を䞊䜍16ビットに幅、
         䞋䜍16ビットに高さを文字単䜍で返す。
   ;     倉数スタックトップを返したす(ポップ)。
   _     珟圚の秒を返し、% にマむクロ秒を返す。
   ?     暙準入力から10進数倀を埗る。
   $     暙準入力から文字を埗る。
   @     暙準入力から文字を埗る。入力がなければ 0 を返す。
   \匏   匏の瀺す番号の匕数文字列の先頭アドレスを返す。番号はから。
   \\匏  匏の瀺す番号の環境倉数文字列の先頭アドレスを返す。


■ 匏

匏は、数倀、単玔倉数たたは配列倉数ず以䞋の挔算子で構成され、32ビットの
倀を返したす。挔算子の優先順䜍は ( ) 内が優先され、単項挔算子ず関数が
次に優先されたす。
算術挔算子ず比范挔算子は同じ優先順䜍ずしお扱われ、巊から右に順次実行さ
れたす。乗算ず陀算も加枛算ず同じ優先順䜍であるこずに泚意しおください。

通垞の蚈算では、乗算ず陀算は加枛算に優先されないこずに泚意すれば十分で
すが、A=B*--+(10-20) のように耇雑な匏の䟋を考えお芋たす。

最初に B ず乗算する数倀たたは倉数があるこずが認識されたす。その倀に察し
おは笊号反転する必芁があるこずが蚘憶されたす。さらに笊号反転、さらに
絶察倀を求めるこずを蚘憶したす。その埌 ()内に優先的に凊理する必芁のある
匏があるため、(10-20)を評䟡しお -10 ずいう結果を埗たす。これたでに蚘憶
しおきた凊理を順次実行するこずで ( の前の + により絶察倀の 10 が埗られ、
2床の笊号反転の結果、結局 10 ずいう倀をBず乗算するこずがわかりたす。
結果ずしお、A=B*10 ずいう蚈算になりたす。

● 算術挔算子

   A+B    加算
   A-B    枛算
   A*B    乗算
   A/B    陀算
   A&B    ビット論理積
   A\B    無笊号陀算
   A^B    排他的論理和
   A|B    ビット論理和
   A>>B   右シフト
   A<<B   巊シフト

● 単項挔算子

   -A     Aの笊号反転
   +A     Aの絶察倀
   <A     Aの䞋䜍32bitを64ビットにれロ拡匵 (32bit版では䜕もしない)

● 比范挔算子

   A=B    A ず B が等しければ 1 を返し、それ以倖は 0 を返す。
   A<B    A が B より小さければ 1 を返し、それ以倖は 0 を返す。
   A>B    A が B より倧きければ 1 を返し、それ以倖は 0 を返す。
   A>=B   A が B が以䞊ならば 1 を返し、それ以倖は 0 を返す。
   A<=B   A が B が以䞋ならば 1 を返し、それ以倖は 0 を返す。
   A<>B   A ず B が等しくなければ 1 を返し、それ以倖は 0 を返す。


■ 組み蟌みコマンド

rvtl はコマンドを ,="/usr/bin/bash" のように実行するこずができたすが、
最䜎限必芁なコマンドを組み蟌みコマンドずしお持っおいたす。
Linux のコマンドのうち rm、ls、cd、chmod、chroot、pwd、exec、mkdir、
mv、rmdir、sync、mount、umount、cat、swapon、swapoff、pivot_root に
盞圓する組み蟌みコマンドがありたす。

たずは、比范的䜿甚頻床の高いコマンドです。rvtl をシェルスクリプトずしお
䜿う堎合や、rvtl 䞭から ,="/usr/bin/ls -l" を実行するのが面倒な堎合に䜿
いたす。

|ls*=A のように組み蟌みコマンドに続けお「*=匏」ずするず匏の倀を先頭
アドレスずするASCIIZ文字列 (0で終わる文字列) を組み蟌みコマンドの
匕数ずしお枡すこずができたす。|sy や |fb? のように匕数を必芁ずしない
コマンドでは䜿えたせん。

【泚意】
匕数を必芁ずする組み蟌みコマンドは、行末たでが匕数ず刀断されたす。
組み蟌みコマンドの埌ろに文(マルチステヌトメント)を眮かないように
しお䞋さい。

● ファむルの内容衚瀺
cat コマンドに盞圓したす。 指定したファむルの内容を衚瀺したす。

    |ca file

● カレントディレクトリ内容の衚瀺
ls コマンドに盞圓したす。 カレントディレクトリのファむルを
衚瀺したす。8進数で衚した パヌミッション、ファむルサむズ、
ファむル名の順で衚瀺したす。 |ls /usr のようにディレクトリを
指定するこずもできたす。

● カレントディレクトリの移動
cd コマンドに盞圓したす。 カレントディレクトリを指定した
ディレクトリに移動したす。

    |cd /etc

● パヌミッションの倉曎
chmod コマンドに盞圓したす。 ファむルたたはディレクトリの
パヌミッションを倉曎したす。 パヌミッションは8進数で指定したす。

    |cm 755 tmp.txt

● ディレクトリの䜜成
mkdir コマンドに盞圓したす。
指定したディレクトリを䜜成したす。

● ファむル名の倉曎、ファむルの移動
mv コマンドに盞圓したす。 指定したファむル名の倉曎、たたは
ファむルを移動したす。

    |mv file1 file2
    |mv file ./dir

● ディレクトリの削陀
rmdir コマンドに盞圓したす。 指定したディレクトリを削陀したす。

    |rd dir

● カレントディレクトリの衚瀺
pwd コマンドに盞圓したす。 カレントディレクトリを衚瀺したす。

    |cw

● ファむルの削陀
rm コマンドに盞圓したす。 指定したファむルを削陀したす。

    |rm file

● ファむルシステムのマりント
mount コマンドに盞圓したす。 通垞、スヌパナヌザ(root) で実行
する必芁がありたす。 mountコマンドず同様にファむルシステムの
マりントしたすが、 匕数の䞎え方が異なりたす。|mo /dev/hda3 /mnt ext2
や マりント枈みのファむルシステムは |ca /proc/mounts での確認できたす。

    |mo /dev/hda3 /mnt vfat        → Windows
    |mo /dev/hda1 /mnt ext2        → Linux 暙準
    |mo /dev/hdc5 /mnt reiserfs    → reiserfs
    |mo none /proc proc            → /proc
    |mo /dev/hdb /mnt iso9660 r    → CD-ROM (読出しのみ)

● ファむルシステムのアンマりント
umount コマンドに盞圓したす。 通垞、スヌパナヌザ(root) で
実行する必芁がありたす。 マりントしおいるファむルシステムを
アンマりントしたす。 |um の匕数にデバむス名 (/dev/hda2等) は
指定できたせん。マりントポむント (ディレクトリ名) を指定しおください。

    |um /mnt
    |um /mnt/cdrom

● ディスクぞの匷制曞き蟌み
sync コマンドに盞圓したす。 倉曎されたファむルをディスクキャッシュ
からハヌドディスクなどの デバむスに保存したす。

    |sy

● ルヌトディレクトリの倉曎
chroot コマンドに盞圓したす。 ルヌトディレクトリを倉曎したす。

    |cr /mnt

● 倖郚コマンドの実行
exec コマンドに盞圓したす。 exec を実行したす。rvtlのプロセスが
指定されたファむルのプロセスに 眮き換わりたす。

    |ex /sbin/init

● ルヌトファむルシステムの倉曎
pivot_root コマンドに盞圓したす。 カレントプロセスのルヌト
ファむルシステムを第2匕数に指定した ディレクトリに倉曎しお、
第1匕数に指定したディレクトリを新しい ルヌトファむルシステムにしたす。
たずえば、フロッピヌディスクから rvtl 自身を/sbin/initずしお起動 した埌、
ルヌトファむルシステムをマりントしたハヌドディスクに倉曎しお、
そのマりントポむントを新しいルヌトファむルシステムに倉曎しお、
そこにある「本圓の」/sbin/init を exec するような堎合に䜿甚したす。

   【実行䟋】
    <0126> |mo /dev/hdc5 /mnt reiserfs
    Mount
    
    <0126> |cd /mnt
    Change Directory to /mnt
    
    <0126> |pv /mnt /mnt
    Pivot Root
    
    <0126> |ex /sbin/init

● スワップ領域のオヌプン
swapon コマンドに盞圓したす。 スワップ領域をオヌプンしたす。

    【実行䟋】
    <0126> |so /dev/hda3
    Swap On

● スワップ領域クロヌズ
swapoff コマンドに盞圓したす。 スワップ領域クロヌズ

    【実行䟋】
    <0126> |sf /dev/hda3
    Swap Off

● コマンドの実行回数
rvtlを起動しおからの呜什の実行回数の环蚈を% に返したす。

    【実行䟋】
   <0126> |zc             コマンド実行回数を  (>ver.4.00)
   <0126> ?=%
   8

● システムコヌルの実行
倉数 a, b, c, d, e, f, g を匕数ずしおLinuxのシステムコヌルを実行したす。
倉数 a にはシステムコヌル番号、b が第1匕数、c が第2匕数、 あずは同様に
第6匕数たで指定できたす。 結果は、倉数「|」 に返りたす。
倉数 a にはシステムコヌル番号は、32bit版では x86、ARM、PowerPCで共通ですが、
64ビット版では32ビット版ず異なる䞊、x86_64ずARM64でも異なりたす。

    |zz

● URLデコヌド
URL゚ンコヌドされた文字列をデコヌドしたす。

    u[0] URL゚ンコヌド文字列の先頭蚭定
    u[1] 倉曎範囲の文字数を蚭定
    u[2] デコヌド埌の文字列先頭を蚭定
    u[3] デコヌド埌の文字数を返す
    |ud

● rvtlのバヌゞョン
|ve を実行するず、% にrvtlのバヌゞョンを返したす。
(64bit版は % の䞊䜍32bitに1が返りたす)

     【実行䟋】
    <08C1> |ve ?=<%
    40100

● CPUの皮類
|vc を実行するず、CPUの皮類を % に返したす。 x86 は 1、arm は 2、x86_64 は 4、
arm64 は 5 が返りたす。

    【実行䟋】
     <086B>  |vc ?=%
    5


■ フレヌムバッファ甚組み蟌みコマンド

フレヌムバッファを䜿うための組み蟌みコマンドがありたす。|fbo, |fbc,
|fbs はカヌネルがフレヌムバッファをサポヌトしおいない堎合ぱラヌず
なりたす。それ以倖の描画呜什はフレヌムバッファのメモリに察しお描画する
だけでなく、任意のメモリ領域に察しおも実行できたす。メモリ䞭に確保した
オフスクリヌン領域に察しお描画しお、フレヌムバッファに転送するこずも
できたす。メモリ領域に察しお䞀括しお倀を曞き蟌む堎合や、メモリのコピヌ
ずしお䜿甚できたす。|fb 呜什に䞎える匕数は、各々決たった配列倉数を
ずしお枡したす。 呜什を䜿甚する前に配列甚の領域を確保しおおく必芁が
ありたす。「m=& l=m+64 t=l+64 r=t+64 」のように各配列に䞀埋に64バむト
確保しおおけば十分です(倉数の解説参照)。サンプルの fbinfo.vtl、
fb_demo.vtl を参考にしおください。

匕数の配列のむンデックスの指定方法が rvtlの32bit版ず64bit版では異なる
郚分がありたす。 メモリアドレスを指定する堎合に rvtl の64bit版では
アドレスに64bitを指定する必芁があるため、匕数の指定に8バむト配列衚珟
を䜿う郚分がありたす。

䟋えば Ubuntu 15.04 でフレヌムバッファを䜿うには ctrl ず Alt ず F1
を同時に抌したす。GUIの画面に戻るには  ctrl ず Alt ず F7 を抌したす。
たた、䞀般ナヌザでフレヌムバッファに曞蟌みするには video グルヌプ
に所属する必芁がありたす。 以䞋のコマンドで蚭定したす。

    sudo gpasswd -a ナヌザ video

video グルヌプを有効にするために再ログむンしたす。


● フレヌムバッファのオヌプン

実行埌フレヌムバッファが䜿える状態ならば、倉数 f にフレヌムバッファ
の先頭アドレス、倉数 g の瀺すアドレスからフレヌムバッファの情報
(Virtual Screen Information ず Physical Screen Information)が蚭定
されたす。 f, g ずもに rvtl が甚意しおいるアドレスが返されるため、
配列甚のメモリ を確保する必芁はありたせん。

フレヌムバッファにアクセスする前に [=0 を実行しお、アクセス範囲
チェックをOFFにする必芁がありたす。
フレヌムバッファが有効でない堎合には [ENODEV] No such device ず衚瀺
されお終了したす。

    |fbo

フレヌムバッファに関する情報は配列 g[] から取埗するこずができたす。

        Frame Buffer Virtual Screen Information
         [ 0]  x resolution            : g[0]
         [ 1]  y resolution            : g[1]
         [ 2]  x res virtual           : g[2]
         [ 3]  y res virtual           : g[3]
         [ 4]  x offset                : g[4]
         [ 5]  y offset                : g[5]
         [ 6]  bits/pixel              : g[6]
         [ 7]  grayscale               : g[7]
         [ 8]  RED    offset           : g[8]
         [ 9]         length           : g[9]
         [10]         msb_right        : g[10]
         [11]  GREEN  offset           : g[11]
         [12]         length           : g[12]
         [13]         msb_right        : g[13]
         [14]  BLUE   offset           : g[14]
         [15]         length           : g[15]
         [16]         msb_right        : g[16]
         [17]  TRANSP offset           : g[17]
         [18]         length           : g[18]
         [19]         msb_right        : g[19]
         [20]  nonstd                  : g[20]
         [21]  activate                : g[21]
         [22]  height                  : g[22]
         [23]  width                   : g[23]
         [24]  accel_flags             : g[24]
         [25]  pixclock                : g[25]
         [26]  left margin             : g[26]
         [27]  right margin            : g[27]
         [28]  upper margin            : g[28]
         [29]  lower margin            : g[29]
         [30]  hsync length            : g[30]
         [31]  vsync length            : g[31]
         [32]  sync                    : g[32]
         [33]  vmode                   : g[33]

        Frame Buffer Physical Screen Information
         [40]  ID string               : g(160) .. g(175)
         [44]  frame buffer mem start  : g[44]
         [45]  frame buffer mem length : g[45]
         [46]  frame buffer type       : g[46]
         [47]  interleave              : g[47]
         [48]  frame buffer visual     : g[48]
         [49]  x pan step              : g{99}
         [49]  y pan step              : g{100}
         [50]  y wrap step             : g{101}
         [51]  line length (bytes)     : g[51]
         [52]  Memory Mapped I/O start : g[52]
         [53]  Memory Mapped I/O length: g[53]
         [54]  acceleration type       : g[54]

● フレヌムバッファのクロヌズ

|fbo でオヌプンしたフレヌムバッファをクロヌズする堎合に 䜿甚したす。

    |fbc

● フレヌムバッファの蚭定倉曎

|fbo で返される g 配列にフレヌムバッファの蚭定を曞いおから 呌び出したす。

    |fbs

● 点の描画

フレヌムバッファに点を描画したす。配列 d に必芁な倀を蚭定しお呌び出したす。
d[0]=f ずするずフレヌムバッファに察する操䜜ずなりたす。 d[0] に
メモリアドレスを蚭定するずメモリに察しおの描画 になり、バックバッファ
に察する曞き蟌みが可胜です。

    d[0] = addr     描画領域先頭アドレス
    d[1] = x        転送先のX座暙
    d[2] = y        転送先のY座暙
    d[3] = Color    色
    d[4] = ScrX     転送先X方向のバむト数
    d[5] = Depth    1ピクセルのビット数
    |fbd

● 塗り぀ぶし

フレヌムバッファを指定した色で塗り぀ぶしたす。 配列 m に必芁な倀を
蚭定しお呌び出したす。 フレヌムバッファをクリアする堎合などに䜿甚したす。
m[0]=f ずするずフレヌムバッファに察する操䜜ずなりたす。
m[0] にメモリアドレスを蚭定するずメモリに察しおの描画 になり、
バックバッファに察する曞き蟌みが可胜です。

    m[0] = addr     メモリフィル先頭アドレス
    m[1] = offset   オフセット(バむト)
    m[2] = length   長さ(ピクセル)
    m[3] = color    色
    m[4] = Depth    1ピクセルのビット数
    |fbf

● ラむン描画

フレヌムバッファに指定した色の線を描画したす。 配列 l (英小文字の゚ル)
に必芁な倀を蚭定しお呌び出したす。 l[0]=f ずするずフレヌムバッファに
察する操䜜ずなりたす。 l[6]、l[7] は内郚で䜿甚する䜜業領域です。
指定する必芁はありたせん。 l[0] にメモリアドレスを蚭定するずメモリに
察しおの描画 になり、バックバッファに察する曞き蟌みが可胜です。

    l[0] = addr     描画領域先頭アドレス
    l[1] = x        始点のX座暙
    l[2] = y        始点のY座暙
    l[3] = x        終点のY座暙
    l[4] = y        終点のY座暙
    l[5] = col      ラむンの色
    l[6] = incr1    䜜業領域
    l[7] = incr2    䜜業領域
    |fbl

● パタヌン転送

メモリアドレス mem を先頭に栌玍されおいるパタヌン(画像)を addr に
転送したす。 配列 p に必芁な倀を蚭定しお呌び出したす。
p[0]=f ずするずフレヌムバッファに察する操䜜ずなりたす。
p[0] にメモリアドレスを蚭定するずメモリに察しおの描画 になり、
バックバッファに察する曞き蟌みが可胜です。

    p[0] = addr     転送先アドレス
    p[1] = x        転送先のX座暙
    p[2] = y        転送先のY座暙
    p[3] = PatW     パタヌンの幅
    p[4] = PatH     パタヌンの高さ
    p[5] = mem      パタヌンの栌玍アドレス
    p[6] = ScrX     X方向のバむト数
    p[7] = Depth    1ピクセルのビット数
    |fbp

● パタヌン転送2

メモリアドレス mem を先頭に栌玍されおいるパタヌン(画像)を addr に
転送したす。転送元(mem) の画像の䞀郚を転送したす。 配列 t に必芁な
倀を蚭定しお呌び出したす。 t[0]=f ずするずフレヌムバッファに察する
操䜜ずなりたす。さらに t[5]=f ずした堎合はフレヌムバッファ内で
矩圢領域をコピヌしたす。転送元ず 転送先が重なった堎合の動䜜は
保蚌されたせん。
t[0] にメモリアドレスを蚭定するずメモリに察しおの描画 になり、
バックバッファに察する曞き蟌みが可胜です。

    t[0] = addr     転送先アドレス
    t[1] = x        転送先のX座暙
    t[2] = y        転送先のY座暙
    t[3] = PatW     パタヌンの幅
    t[4] = PatH     パタヌンの高さ
    t[5] = mem      パタヌンの栌玍アドレス先頭
    t[6] = ScrX     転送先のX方向のバむト数
    t[7] = Depth    1ピクセルのビット数
    t[8] = x2       転送元のX座暙
    t[9] = y2       転送元のY座暙
    t[10]= ScrX2    転送元のX方向のバむト数
    |fbt

● マスク付きパタヌン転送

スプラむトをフレヌムバッファに描画したす。 配列 q に必芁な倀を蚭定しお
呌び出したす。 q[8] で転送しない色を指定できる他は |fbp ず同じです。
背景画像に察しおパタヌンを重ねる堎合に䜿甚したす。
q[0] にメモリアドレスを蚭定するずメモリに察しおの描画 になり、
バックバッファに察する曞き蟌みが可胜です。

    q[0] = addr     転送先アドレス
    q[1] = x        転送先のX座暙
    q[2] = y        転送先のY座暙
    q[3] = PatW     パタヌンの幅
    q[4] = PatH     パタヌンの高さ
    q[5] = Color    パタヌンの栌玍アドレス
    q[6] = ScrX     X方向のバむト数
    q[7] = Depth    1ピクセルのビット数
    q[8] = Mask     マスク色
    |fbq

● 矩圢領域の塗り぀ぶし

|fbf ず䌌おいたすが、任意の矩圢領域を䞀定の色で塗り぀ぶしたす。
配列 r に必芁な倀を蚭定しお呌び出したす。
r[0] にメモリアドレスを蚭定するずメモリに察しおの描画 になり、
バックバッファに察する曞き蟌みが可胜です。

    r[0] = addr     転送先アドレス
    r[1] = x        転送先のX座暙
    r[2] = y        転送先のY座暙
    r[3] = PatW     領域の幅
    r[4] = PatH     領域の高さ
    r[5] = Color    塗り぀ぶす色
    r[6] = ScrX     X方向のバむト数
    r[7] = Depth    1ピクセルのビット数
    |fbr

● メモリコピヌ

メモリを c[0] で指定したアドレスから c[1] で指定したアドレスぞ
c[2] バむトコピヌしたす。倧量の転送を rvtl で蚘述するず遅い堎合に
䜿甚したす。フレヌムバッファ以倖の䞀般のメモリ転送にも䜿甚できたす。
転送する領域が重なっおいおも䜿甚できたす。

    c[0] = source   転送元先頭アドレス
    c[1] = dest     転送先先頭アドレス
    c[2] = length   転送バむト数
    |fbm


■ 䞊玚者向けの機胜

rvtl のコマンドラむンで指定した rvtl のプログラムは、そのたたメモリに
栌玍されるのではなく、コン゜ヌル(キヌボヌド)から入力するように凊理され
たす。぀たり、行番号は敎列されおいる必芁がなく、行番号が「ばらばら」でも
メモリには敎列されお栌玍されたす。たた、#=1 (RUN) や &=0 (NEW) のように
行番号なしで盎接実行するコマンドを蚘述するこずが可胜です。

䟋えば:

   20 #=-1             : プログラム終了
   10 "Hello world!" / : 文字列を出力しお改行
   0                   : リスト出力
   <="hello2.vtl"      : リストをhello2.vtl ずいうファむル名で保存
   /                   : 改行出力
   #=1                 : プログラムを実行
   ~                   : rvtl の終了

のように曞かれたファむル(hello1.vtl)を実行するず、次の結果ずなりたす。

   $ rvtl hello1.vtl
   10 "Hello world!" / : 文字列を出力しお改行
   20 #=-1             : プログラム終了
   hello2.vtl
   Hello world!

rvtl にはプログラムの先頭アドレスを倉曎する機胜もありたす。メモリ䞭に
耇数のプログラムを栌玍しお、切り替えお実行するこずもできたす。
先頭アドレスは 「=」システム倉数に栌玍されおいるため、これを曞き換える
こずで実珟したす。デフォルトのプログラムの先頭アドレスは「,」に栌玍され
おいお、曞き換えるこずはできたせん。「=」システム倉数の初期倀は「,」です。
「==,」が実行されおいるず考えおください。ここで「==,+2000」ず実行したず
したす。これは、「プログラム先頭アドレスをデフォルトのアドレスに2000を
加えた䜍眮に倉曎する」ずいう意味になりたす。実際に「==,+2000」を実行するず、
「&=0 required.」ず衚瀺されたす。適圓にプログラムの先頭アドレスを倉曎した
ためにプログラムの終了アドレス(の埌ろ)が決められないため、「NEWを実行しろ!」
ずいっおきおいたす。「&=0」を実行しお、プログラムを䜕か入力しおください。
䟋えば「100 "Start"」ずしたす。「#=1」で実行しお、「==,」でデフォルトの
プログラム先頭アドレスに戻り、再床「==,+2000」を実行するず、今床は
「&=0 required.」ず衚瀺されたせん。「0」でリスト衚瀺をするず、

   100 "Start"

ず衚瀺されたす。前に入力したプログラムがそのたた認識されおいたす。
==<アドレス> を実行しお、プログラム先頭アドレスを倉曎した堎合に、すでに
有効なプログラムが存圚する堎合には、そのプログラムの終了アドレスも認識
されお実行できるようになりたす。

rvtlのプログラムをシェルスクリプトずしお盎接実行するためには、
先頭行に #!/usr/bin/rvtl を付加したす。# の前に空癜などを挿入しないで
䞋さい。rvtl の栌玍堎所が異なる堎合は #!/usr/bin/rvtl などず
したす。以䞋のプログラムを script.vtl ずいうファむル名で保存しお、
chmod 755 script.vtl のようにパヌミッションを実行可胜に倉曎したす。

   #!/usr/bin/rvtl
   10 "test"  /
   20 ?=12345 /
   #=1
   ~

実行するず行番号の付いた 2行のrvtlのプログラムがメモリ䞭に保存され、
 #=1 で実行、~ で終了のように動䜜したす。

   $ ./script.vtl
   test
   12345


■ コマンドラむン匕数

rvtl の起動時に rvtl のプログラムを匕数ずしお䞎えるこずができたす。
rvtl は起動ずずもにプログラムを読み蟌みたす。このずき耇数の rvtl
プログラムを指定するず順に読み蟌みプログラムで䜿甚しおいる行番号に
したがっおメモリ䞭に混ざった圢で栌玍されたす。匕数ずしお䞎える
プログラムずしお、行番号を付けない圢匏の「#=1」実行、「~」終了、
「0」リストなどを含んだファむルを指定するこずもできたす。
サンプルプログラムの run.vtl の内容は「#=1」だけ、runq.vtl は
「#=1」ず「~」のファむルになっおいたす。

   $ rvtl abc.vtl runq.vtl

ずコマンドラむンで指定するず、abc.vtl を実行しお、rvtl自身も終了
するこずができたす。

rvtl のプログラムにコマンドラむンから文字列を䞎えるこずもできたす。
コマンドラむン匕数の先頭が「-」である匕数の埌ろは、プログラム䞭で
 \0、\1 のように匕数の文字列の先頭アドレスを参照するこずができたす。
匕数文字列は rvtl のプロセスのスタック領域を瀺しおいるため、
配列ずしお参照したり、文字列コピヌ (䟋えば A*=\0) を実行する前には
範囲チェックをOFF ([=0) にしない堎合に「Out of Range」゚ラヌになる
こずに泚意しおください。

次のプログラムを arg.vtl ずいうファむル名で保存しおいるずしたす。

   100 I=0                  : 最初の匕数
   110 [=0                  : 範囲チェックを OFF
   120 @                    : 繰り返し (DO)
   130   S=\I               : 匕数の先頭アドレス
   140   ;=S(0)<>0 $*=S /   : 匕数を衚瀺
   150   I=I+1              : 次の匕数
   160 @=(S(0)=0)           : 空文字列なら繰り返しを終了
   170 [=1                  : 範囲チェックを ON に戻す
   160 #=-1                 : 実行終了

 S=\I の郚分で「-」の埌ろの匕数を参照しおいたす。
行番号 110 の「[=0」は、1バむト配列で匕数文字列をアクセスした堎合の
範囲倖゚ラヌを回避するためのものです。
 \I が空文字列 (行末の 0 のみ) を瀺す堎合には匕数を衚瀺するこずなく
(行番号 140)、ルヌプを終了(行番号 160) したす。

「-」ずいう匕数の埌に適圓に匕数を䞎えお実行したす。

    $ rvtl arg.vtl runq.vtl - abc xyz arg.vtl
    abc
    xyz
    arg.vtl

匕数に日本語の文字列を䞎えた堎合も確認しおみたす。

    $ rvtl arg.vtl - 日本語も できるかな

    <0F2F> #=1
    日本語も
    できるかな


実際に実行可胜なスクリプトを䜜成しおみたしょう。

    #!/usr/bin/rvtl
    100 $*=\0 /    : 最初の匕数を衚瀺
    110 [=0
    120 |ls*=\0    : ファむルリストを衚瀺
    130 [=1
    #=1            : 実行しお
    ~              : 終了

ls.vtlが䞊の内容のファむルの堎合、次のように ls.vtl に実行暩限を䞎えお
実行するず「/etc」を衚瀺した埌、ファむルリストが衚瀺されたす。

    $ ./ls.vtl - /etc
    /etc
    List Directory
    640755        1392 .
    040755         928 ..
    440755         744 X11
    300644        1615 rpc
    300644          19 motd
    300644         281 mtab
    640755         704 rc.d
    300644         126 ttys
    320777          13 utmp
    320777          13 wtmp
    :
    略
    :

次のように rvtl から実行しおも、たったく同じ動䜜をしたす。

    $ rvtl ls.vtl - /etc

rvtl を /sbin/init (プロセスIDが1) ずしお䜿う堎合に、/sbin/init.vtl
が存圚するず起動時に自動的に読み蟌たれたす。
1FDLinux や CD-ROMブヌトで rvtl をブヌトロヌダ代わりに䜿う䟋は
http://www.mztn.org/ を参照しおください。

■ プログラム䟋ずリナンバ

rvtl 自身にはリナンバ(行番号の敎理)機胜はありたせん。rvtlが自分自身を
曞きなおしおリナンバするこずができたす。GOTO (#=) や GOSUB (!=) の飛び先
にラベルのみを䜿っお行番号を指定しおいない堎合には、次のプログラムを
リナンバしたいプログラム(の最埌郚)にマヌゞしお #=90000 のように実行すれば
リナンバできたす。

rvtl のプログラムは、メモリに次のような圢匏で栌玍されおいたす。

    NextPtr(4), LineNo(4), Source Text(行番号を陀く), 0
      o NextPtr は次の行ぞのバむトオフセット.
      o NextPtr が $FFFFFFFF の時は最終行


   90010   Z=# : 行番号を保存
   90020   N==                     : コヌド領域先頭
   90030   S=1000                  : 行番号開始番号
   90040   ;=N[1]>=Z #=-1          : 自分自身は凊理しない
   90050   S=S/10                  : 新行番号は10番おきに蚭定
   90060   @
   90070     N[1]=S+I*10           : 新行番号
   90080     N=N+N[0] I=I+1        : 次行先頭
   90090   @=((N[0]<0)+(N[1]>=Z))  : 最埌の行たで凊理したか?

䞀方、GOTO (#=) や GOSUB (!=) の飛び先に行番号を䜿っおいる堎合には、
もう少し耇雑な凊理が必芁です。#=10 を #=1010 のように眮換する堎合には
行の長さが倉化したす。行番号の長さの倉化に远埓するのは面倒なので、
次のプログラムではリナンバした結果を暙準出力に曞き出しおいたす。
やはり、リナンバしたいプログラム(の最埌郚)にマヌゞしお #=90000 のように
実行すればリナンバした結果が衚瀺されたす。これでは衚瀺だけなので、
暙準出力をファむルにリダむレクトしたす。

   1) リナンバしたいプログラムをファむルに曞き出し
       <="xxx.vtl"
   2) リナンバを実行
       ,="./rvtl xxx.vtl renum.vtl > xxx2.vtl"


    90000   Z=# : 行番号を保存
    90010   :--------------- Renumber -----------------------------------
    90020   : renum.vtl 2003/10/03, 2015/09/17 Jun Mizutani
    90030   : ,="./rvtl xxx.vtl renum.vtl > xxx2.vtl"
    90040   :------------------------------------------------------------
    90050   :
    90060   T==                     : コヌド領域先頭
    90070   N=T                     : Nは行先頭ポむンタを最初の行に蚭定
    90080   B=&                     : 2500行分の旧行番号
    90090   C=B+10000               : 2500行分の新行番号
    90100   :
    90110   S=1000                  : 行番号開始番号
    90120   ;=N[1]>=Z #=-1          : renum.vtl 自身は凊理しない
    90130   I=0                     : 行番号テヌブルのむンデックス
    90140   S=S/10                  : 新行番号は10番おきに蚭定
    90150   @
    90160     B[I]=N[1]             : 旧行番号
    90170     C[I]=S+I*10           : 新行番号
    90180     N=N+N[0]              : 次行先頭
    90190     I=I+1                 : 行番号テヌブルむンデックス曎新
    90200   @=((N[0]<0)+(N[1]>=Z))  : 最埌の行たで凊理したか?
    90210   Q=I-1
    90220   : !=^TableList
    90230   N=T                     : 行先頭ポむンタを最初の行に蚭定
    90240   I=0                     : 行内の䜍眮
    90250   @
    90260     ?=C[I] " "            : 行番号出力
    90270     K=8                   : コヌド行頭
    90280     F=0
    90290     @
    90300       H=N(K) ;=H<>0 $=H   : 1文字出力
    90310       ;=((H='"')+(H=':'))*(F=0) F=1 #=^skip0
    90320       ;=(H='"')*(F=1) F=0 : コメント、文字列䞭は無芖
    90330      ^skip0
    90340       ;=((H='#')+(H='!'))*((N(K-1)=' ')+(K=8))*(F=0) !=^Replace
    90350       K=K+1               : 次の文字
    90360     @=(H=0)               : 行末たで繰返す
    90370     N=N+N[0] /            : 次行先頭
    90380     I=I+1
    90390   @=((N[0]<0)+(N[1]>=Z))  : 最埌の行たで凊理したか?
    90400   #=-1
    90410 :
    90420 ^Replace
    90430   ;=N(K+1)<>'='  ]        : GOTOたたはGOSUBでなければ戻る
    90440   K=K+1                   : 次の文字
    90450   $=N(K) K=K+1            : = 出力
    90460   ;=N(K)='-' "-" ]        : 負数(#=-1)の堎合は䜕もしない
    90470   ;=N(K)='^' "^" ]        : ラベルなら䜕もしない
    90480   L=0                     : 10進数字文字列を数倀に倉換
    90490   @
    90500     H=N(K) ;=(H>='0')*(H<='9') L=L*10+(H-'0')
    90510     K=K+1
    90520   @=((H<'0')+(H>'9'))
    90530   : / "L=" ?=L /
    90540   J=0                     : 行番号テヌブルをスキャン
    90550   @
    90560     ;=B[J]=L L=C[J] J=Q #=^skip1  : 同じ番号なら眮換
    90570     ;=B[J]>L L=C[J] J=Q           : 同䞀番号が無ければ次
    90580     ^skip1
    90590     J=J+1
    90600   @=(J>Q)                 : 芋぀けたら終り
    90610   ?=L  $=H K=K-1
    90620   ]
    90630 ^TableList
    90640   J=0,Q                   : 行番号テヌブルの衚瀺
    90650     ?(6)=B[J] " " ?(6)=C[J] /
    90660   @=J+1
    90670   ]
    #=90000
    ~

vtl/renum.sh を䜿っお、次の䟋のように check.vtl をリナンバしお
 __check.vtl に曞き出すこずもできたす。これが䞀番䟿利です。

   $ ./renum.sh check.vtl


■ 制限

   倉数スタックに積むこずのできる倉数の最倧個数   1024
   サブルヌチンのネスト+ (ルヌプのネストx 2)      最倧32
   プログラム + デヌタ甚のメモリの初期倀          256 キロバむト
   䜿甚可胜なラベルの最倧数                       1024


■ ファむルの構成

   README.txt        この文曞
   LICENSE-GPL2.txt  ラむセンス
   rvtl_ref.txt      rvtlの機胜䞀芧
   rvtl64            rvtl64 の実行プログラム
   source/           rvtl64 のアセンブリ゜ヌス
   vtl/              rvtl64 のサンプルプログラム


■ 最新情報

この文曞以倖の情報やサンプルプログラム、rvtlの最新情報は
http://www.mztn.org/ を参照しお䞋さい。

rvtl を䜿っおプログラムを䜜成された方は mizutani.jun@nifty.ne.jp たで
お知らせください。http://www.mztn.org/ で玹介させお頂きたす。


■ ラむセンス

この゜フトはフリヌ゜フトりェアです. GNU General Pulic Licenceにしたがっお
自由に䜿甚配垃改倉しお頂いおかたいたせん。
GNU General Pulic Licence の詳现はCOPYINGを参照しお䞋さい。

著䜜暩は私(æ°Žè°· 箔, mizutani.jun@nifty.ne.jp)が保有しおいたす。

本゜フトりェアによっお生じた損害に぀いお著䜜者は責任を負いたせん。
たた、著䜜者はバヌゞョンアップの矩務を負いたせん。

About

RVTL : Tiny BASIC in x86 assembly language for Linux

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages