Monday, December 24, 2012

プチコンでTiny BASIC

プチコン版Tiny BASICを作ってみました。

Tiny BASICとはその昔作られた、OSがほぼ無いようなPCでRAM容量数KBで動くBASIC処理系です。英語版のwikipediaが詳しいです。

プチコン版を作るにあたり、各種Tiny BASIC(※1)がある中で、Palo Alto版を元にインタプリタ型とし、最も命令が少なそうなものを参考にしました。

プチコン版Tiny BASICの勇姿




処理速度。。。?プログラムによりますが、ループと計算を多く繰り返すようなプログラムでは、プチコン上で実行する速度に比べ、100倍以上遅いです。
動画の後半にある素数を求めるプログラムで、プチコン版だとは25個でTIME=12。Tiny版では7800くらい。(TIME:MAINCNTLのカウント値)




Tiny BASIC for Petitcom 起動後の画面。
現在はバージョン1.0alphaです。
Tiny BASIC on SMILE BASIC !


プチコン版Tiny BASICの仕様
  • プログラムは99行まで
  • プログラムは先頭に行番号が必要
  • 変数はA〜Zの26個(数値用、文字列変数はない)
  • コンソールで命令の直接実行も可能
  • プロムラム実行中、Xボタンで中断可能

命令一覧
HELPコマンドの実行結果です。使える命令が分かるようになっています。
プチコン版TinyBASICのHELP

補足説明
  • GOTO命令の飛び先には、変数を指定できます。
  • LINENOシステム関数は実行中の行番号を返します。GOTOと組み合わせると、なんちゃってGOSUB〜RETURNが実現できます。
  • LIST命令でPAUSEパラメータが指定されると、LIST表示は1画面毎に停止し、キー入力(EnterかAボタン)を待ちます。
  • SAVE、LOAD命令はパラメータに数値を指定します。プチコンの"GRP:TBn"(nは指定した数値)というファイルで保存されます。
  • MEM命令は、プログラム可能な行数の残りを表示します。

オリジナルにあって、プチコン版にない機能
  • コントロールキャラクタの表示 (^Lだとか^Gだとか)
  • GOSUB〜RETURN
  • 配列変数@
  • 数値、変数の2バイト整数演算(演算はプチコンの数値変数による演算そのままなので)
  • ほかにもいろいろあるかも

その他
プログラムの入力は、プチコンのLINPUT命令を利用しています。簡易な実装にはもってこいの命令で、ほぼオリジナルと同じような機能となるようです。しかし32桁しか入力できない、カーソル移動が無いためLIST結果の編集ができないなど、BASIC入力環境としての使い勝手はいまいちです。というわけで現在はbeta版作成中。

beta版以降の夢:
  1. LINPUTよりましなスクリーンエディタ
  2. GOSUB〜RETURN
  3. 配列変数 @
  4. FOR〜NEXT
  5. ほか



作った後に思いましたが、プチコンのSMILE BASICでTINY BASICを動かすのは
  • 車輪の再々...々発明
  • まさに屋上屋
  • いまどき行番号?
などいろんな意味で時代に逆行している感がありますが、それでも作って動くと楽しいのです。



TinyBASIC(alpha) for Petitcom




Saturday, December 8, 2012

プチコンでWIDTH80

プチコンでWIDTH80を実現します。1行に80文字を表示します。
そもそも256ピクセルしか無いところにムリヤリそれっぽく見えるようにしているだけで、その上特定の機種に依存しているため、あまり使えません。



 一部を虫眼鏡で拡大したところ


DSiの画面。虫眼鏡を通したため周辺が歪んでいます
なおこのプログラムはDSiのサブピクセルの仕様を利用(悪用)しているため、DSiでしか意図通りに表示されません。3DSでは、おかしな表示になり文字に見えなくなります。理由は、下の図のとおり、1ピクセル内のサブピクセルの並びがDSiと異なるためです。

DSiのサブピクセルの並び

B
 

G
 

R
 

3DSのサブピクセルの並び
   B   
   G   
   R   

3DSでは3D表示のため、左右方向のサブピクセルにはできなかったのかも知れません。
虫眼鏡でデバッグしていて、3DSで表示できなくて切ない気分を味わいました。

QRコードです。
SUBPXL2
WIDTHを1〜128まで変えられます。WIDTHに応じて、表示する方法を変えています。
WIDTH32までは通常、WIDTH40までは6x8っぽく、それ以上はsubpixel表示です。

サブピクセル関係は、機種依存が判明したため、ここでおわり。

Sunday, December 2, 2012

プチコンでサブピクセルレンダリング?

プチコンでサブピクセルレンダリングと題しましたが、たいしたことはなく、サブピクセルを利用して小さな文字を表示してみるテストです。

DSiの上画面

サブピクセレンダリングとは、おおざっぱにいうと、1ピクセルを構成するRGBをそれぞれ1ピクセルに見立てて、画面を描画することです。

サブピクセルレンダリングの利用例として、MacOS8.5とかClearTypeだとかで、液晶ディスプレイ上でのみ文字がキレイにみえるようにする、特殊なアンチエイリアシングのような技術があります。今でもMacOSXなど各種OSでの表示やテレビなどにも利用されているようです。

次は拡大画面。
文字部分の拡大
"ABCabc123%"という文字が上に横方向に縮小されて表示されます。フォントは、その下に表示されているプチコンのフォントをそのまま使っています。
変な色ですが、なんとか文字が読めるのではないでしょうか。

DSiの液晶は(少なくとも家にあるDSiは)、液晶の1ピクセルにサブピクセルが3つB,G,Rの順番に並んでいます。2つ目の画像を拡大すると見えるかもしれません。(蛇足ながら、B,G,RはBlue,Green,Redの略です)

プログラムでは、プチコンのフォントを読み取り、フォント定義の各ピクセルについて、1サブピクセルを使う様にパレットを定義し、GPSETしています。

例えば、"A"のフォントの1列目は"000F0000"なので、大文字を点灯、小文字を消灯とすると"bgrBgrbgr"となります。"bgr〜"が9個あるのは1ピクセルが3サブピクセル(BGR)で構成されており、8ピクセルの表現に3ピクセル=9サブピクセル必要なためです。

ただ今のプログラムでは制約がきつく、1ピクセルに1パレット割り当てるため、10文字を表現するのが上限です。(1文字あたり3列*8行=24ピクセル必要なので、FLOOR(256/24)=10(文字))

表示を割り切れば、所詮BGR3ビットの組み合わせなので、8パレットを使うと好きなだけ表示が可能になると思います。計算では FLOOR(256/3)=85 となるので、プチコン画面でMSXのSCREEN0,6,7が(変な色で)再現できるかもしれません。

自分のプチコンで見てみたいという物好きな人がいるかもしれませんので、QRコードです。