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コードです。

Sunday, June 3, 2012

プチコンにBUBBLE BALLを移植

MSXFANに載ってたBUBBLE BALLというゲームを移植してみました。

十字ボタンで自機を操作し、はねまわるバブルをひたすら避けるゲームです。バブルはだんだん増えていきます。リプレイはABXYボタン。31万点でエンディング。



最後までたどり着ける人がいるのでしょうか。がんばっても7〜8万点しかいきませんでした。

QRコード:BUBBLE BALL
背景は6重スクロール。MSXと同じように、プチコンのBGF0をでキャラクタ書き換えをしてみました。
オリジナルはマシン語バリバリでしたが、プチコンの性能でカバー。
音がやや違う気もしますが、音方面にはうといので。。
スプライト衝突の練習になりました。

(分かる人向け)オリジナルはたしかファンダムライブラリー5にあったとおもいます。

Wednesday, May 23, 2012

プチコンでナイトレース

プチコンへその昔MSX・FANに掲載されていたNIGHT RACEを移植してみました。

赤い自機を左右キーで操作し、ひたすら青い道を進んでいきます。道をはずれるとゲームオーバー。リプレイはAかBかXかY。

見た目は地味ながらオリジナルはマシン語が使われており、画面のダイナミックなスクロールに使われています。プチコンではBGOFSでできてしまいます。
リストが短いけどわりと面白かったので移植。


【ニコニコ動画】【プチコン】NIGHT RACE

QRコード
NRACE

プチコン無印(Ver.1.2)のときに作ったものですが、いまさらながら公開。ニコニコとか見ていると大作やらすごいのが続々出ているので気が引けますが。

Thursday, April 12, 2012

プチコンmkIIでスプライトを3Dっぽく動かしてみる


なんとなくできるかなとおもって、スプライトを3Dっぽく動かしてみることにしました。某ハードの某ゲームの某おまけモードに影響を受けています。




3Dっぽく見えるためには、手前のものが手前に見えなくてはなりません(あたりまえですが)

プチコンのスプライトは優先順位を0〜3で設定できますが、今回の用途では足りませんでした。スプライトが管理番号が若いほど手前になることを利用し、奥から手前に向けて座標でソートをかけ、手前からスプライト管理番号を割り当て直しています。ここでRSORT命令の威力が炸裂しています。

3D表現には、日経ソフトウェア2011.7月号の「ニンテンドーDSiのBASIC「プチコン」で3次元コンピュータグラフィックスに挑戦!」の記事がとても参考になりました。

玉が7×7個なのは、内容が三角関数の嵐のため、それ以上だとスピードが苦しくなるからです。それでもそれなりに動いてくれるプチコンmkIIはすごいですね。

(追記)
QRコード

操作はSELECTキー以外すべて使います。
分かりにくい所で、Xが"II"を飛び出させて、Yで引っ込めます。たまに変な動作になりますが。

※実は1つだけ玉の表示の優先順があってないです。このおかげでQR公開してませんでしたが、要望があったのでまあいいかとアップしました。

Friday, April 6, 2012

プチコンでLOTLOTLOT

プチコンにLOTLOTLOT(YUKI♥氏作)を移植してみました。
青と赤の手を動かして、部屋の中身を入れ替えて、動き回る水色の玉が「OVER」ではなくより高い点数の所へ落ちるようにするゲームです。リプレイはSTARTボタン。
画面上の玉がうろちょろする様をみるのが楽しいです。


QRコード
1/4

2/4

3/4

4/4


プチコンVer1.2のときに作りましたが、あまり速くなく6FPS程度でした。mkIIだと10FPS程度です。それなりに動くようにがんばってみましたが、今のところはこの程度です。
オリジナルのMSX版は目測で20FPS以上なので、Z80+VDPは速い。
もうちょい速ければタッチペンで遊べるように改造してみたかったのですが。

LOTLOTLOTを紹介しているページがいくつかありました。
TPM.CO SOFT
石とMSX

ファミコン、アーケードにも移植されていました。
ロットロット(wikipedia)

Sunday, March 18, 2012

プチコンでいろんな円を描いてみる

とあるMSXのプログラムに、小さい円〜大きい円をグラフィック画面に描き、それをスプライトに定義するものがありました。

移植しようとしてプチコンでGCIRCLEしてみると、MSXとは見た目と異なる円ができ、半径=0のときは何も描かれません。

半径0はまあよいとして、見た目が大幅に違うのはいまいち。興味もあり、自前で円を描いてみることにしました。

調べてみると、アルゴリズムが何個も。 今回確認したのは以下:
  1. プチコンのGCIRCLE
  2. 微分/SOFTIST:円、楕円の描画(アルゴリズム) (一番遅い)
  3. 三角関数(すべての角度について、x=x0+r*cos(a)、y=y0+r*sin(a))三角関数
  4. ブレゼンハム(Bresenham)の円描画/伝説のお茶の間 No007-09(1) 円の描画(1) MichenerとBresenham
  5. ミッチェナー(Michener)の円描画/Comparing Circle Drawing Algorithms
  6. ピタゴラスの定理(x^2+y^2=r^2)/Comparing Circle Drawing Algorithms
  7. ブレゼンハム 中点分岐を用いた円描画アルゴリズム/伝説のお茶の間 No007-09(1) 円の描画(1) MichenerとBresenham
  8. ピタゴラスの定理(値のより近いピクセルを選択する方式)/Comparing Circle Drawing Algorithms
  9. 直径の長さが正しくなる円描画/伝説のお茶の間 No007-10 円描画(2)
プチコンで実装してみた図。
横は左から半径0〜9。縦はアルゴリズム

MSXで円を描いてみる。
MSXのプログラム
MSXでの実行結果(FS-A1WX)

これだけやって、MSXとぴったりなのはなし。どうも8.(ビタゴラ2)が近いようなのでこれを採用。半径0は補正すればそっくりになるかも?
(プチコンのGCIRCLEとおなじものもなし。。3.(SIN/COS)の四捨五入版が近いかも)

どうしても自前で円を描画したい、という人はそういないとおもいますが、記録のためQRコード。



Saturday, March 17, 2012

プチコンでラスタースクロール

sin関数を利用して画像を変形させる擬似ラスタースクロールです。
プチコンmkIIのお勉強のために、強化されたグラフィック機能で遊んでみました。
mkIIは速い。画像は使い回し。

画像だけにしようかとおもいましたが、実際に動いている方が分かりやすいですね。
RASTER 1/1枚

こんなことが簡単にできるようになるなんて、隔世の感があります。

画面をはみ出すようなラスタースクロールを見てると、Xak-ガゼルの塔-のオープニングを思い出します。。ちょっとしたいい年ですね。

「MSX」はMSXライセンシングコーポレーションの登録商標です。

プチコンmkIIのgcopyバグ?

gcopyで遊んでいると、思い通りにいかない場合があった。 
転送先のx座標が0のときにgcopyがうまくいかないっぽい。
以下、検証用のリスト。
---
GCOLOR 15
GPAGE 0,1,1:GCLS 0
GLINE 0,0,255,192
GPAGE 0,0,0:GCLS 0
GCOPY 1,0,0,255,192,0,0,FALSE
---
QRコードに変換する気力はなかった。。

 裏画面(PAGE1)に描いた斜め線が表画面(PAGE0)にコピーされてほしいのに、コピーされない。 転送先のx座標を1にすると、コピーされる。 ???

いろいろやってみると、どうも転送元のx,y座標と転送先のx,y座標が一致しているとだめらしい。上記リストで
  • GCOPY 1,1,0,255,192,0,0,FALSE
  • GCOPY 1,0,1,255,192,0,0,FALSE
  • GCOPY 1,1,1,255,192,0,0,FALSE

はいずれもコピーされる。

(追記)
なんでそうなるか想像してみた。
同じページ間で転送元座標=転送先座標の場合は、転送してもしなくても結果は同じ(むしろ重なっていると何かおこるかも??)なので転送を省略してるような気がする。このとき、異なるページ間の転送かどうかの考慮が入っていない。。。のかもしれない。

Friday, March 16, 2012

プチコンに時刻をしゃべらせた!

mkII発売記念。 つくってあったTALKTIMEを動かしてみた。
これでしゃべる時計を買わずにすむ!
  
QRコード
1
2

データの打ち込みがメンドウだったので、プログラムで20〜59の日本語を生成してますが、かえって何してるか分かりにくいプログラムに。素直に作ればよかった。

バグを直したり、しゃべってる間は表示を止めたり、ちょっとだけ手を入れてます。

Sunday, March 11, 2012

プチコンで時刻をしゃべらせる?

mkII正式発表記念で作成(2012/2/26ごろ)。

Aボタンか下画面をタッチすると、現在時刻を音声合成で教えてくれる(はず)です。 プチコンv1.2以下ではTALK文はエラーになるので、時刻の日本語を画面に表示します。

プチコンv1.2以下かMKIIかをVERSION変数で判定できると想定して作っているので、そうなるといいなぁ。
具体的には「システム変数VERSION<=4192なら、mkIIではない」と考えています。

(今のところ、動くかどうか分かりません)

(2012/3/9)プチコンmkIIのコマンド一覧公開!
これをを見る限り、大丈夫そうですが。。。

Saturday, February 25, 2012

プチコンでMSXのタイトル画面 その2


プチコンでMSXのタイトル画面 その1のつづき。
絵は描けたので、次は表示のしかた。
MSX2は縦スクロール、2+は横スクロールし、いずれも1ドット単位。 GRAPHIC画面にはスクロール機能はないので、スクロール機能があるBGを使う。
(キャラクタを画面に敷きつめておき、パターンを書き換えする力技もあるにはある)

なのでGRPからBGを作成。
8x8ドット分GSPOITで読み取り、CHRSETの画像文字列にする。 これでいけるはずだったが、作ってみるとエラーになった。
BGU0のキャラ数256個では足りなかったのが原因。
黒い部分は(23,43)-(234,123)。
同じ位置に表示させるため、8ドット区切りにすると(16,40)-(240,128)。
つまり28x11=308キャラ必要だった。

意外と大きいタイトルロゴ

対策は2つ。
  1. BGU0に収まらない分はBGU1にいれる。プチコンは1024個BGキャラが作れるので余裕。
  2. なんとかして256キャラ以内に(BGU0)におさめる。
じゃあどうやっておさめるか、と画面を眺めると、黒や白だけのマス目が多い。
黒や白だけのマスを2つ定義しておけば、必要なキャラ数が減るのでは! (BGキャラを並べるのがめんどくさくなるけど)

  • あらかじめ、真っ黒と真っ白BGキャラは定義しておく
  • 左上から右下に向けてGRAPHIC画面からちまちま画像文字列を作成
  • 真っ黒か真っ白のBGキャラなら、BGキャラ定義しない
  • 真っ黒でも真っ白でもなかったら、BGキャラ定義
  • BGキャラ定義した場合、そのBGキャラコードをキャラ表示用配列に記録
  • BGキャラ定義しない場合、真っ黒/真っ白コードをキャラ表示用配列に記録
みたいなかんじでやってみると、210キャラぐらいに納まった。

ここまでできると、BGに"MSX"と表示し、BGOFSで好きにスクロールできる。

MSX2タイトル画面は、画面中央くらいから、MSXのロゴがせり上がってくるので、BGCLIPで表示範囲を制限して、縦スクロールさせれば完成。

MSX2+タイトル画面は、1ラインおきの画面が左右から横スクロールし、合成される。 (動画後半参照)

どうしたかというと、
  • GRAPHIC画面からの読取結果を偶数ラインならBGU0に、奇数ラインならBGU1に、BGキャラ定義 
  • BGキャラ表示用配列に従ってBGPAGE0にBGU0のBGキャラ、BGPAGE1にBGU1のBGキャラを配置 0,1ページとも256ドット左右にスクロールさせておく
  • 適当なスピードで0,1ページともBGOFSでスクロール表示

Saturday, January 14, 2012

プチコンでMSXのタイトル画面 その1

プチコンでMSX(2,2+)のタイトル画面を再現してみようとおもいました。

実機やエミュレータで動きをみてると走査線割り込みを使っていそうなのですが、プチコンでそれはできません。
しかしプチコンには
  • 豊富なBG定義(上画面で1024個)
  • 2ページのスクロールレイヤー(BG)
  • ウィンドウ機能(BGCLIP)
があるので、それなりに再現できそうです。

MSXのロゴをBG画面に作るにあたり、
  1. グラフィック画面に描画
  2. グラフィック画面を読み取り
  3. キャラクタパターンへ変換
  4. BGキャラ定義
という流れで作ることにしました。

今回は1.の部分です。

方針が決まったところで、次はデータ作成です。
MSX2,2+のタイトルロゴはこんな感じです。
MSX2のタイトル画面。2+だとVRAMではなくRAMとなる
"MSX"の部分はSCREEN6らしいので、ピクセル数は512x212になります。
("VRAM:128KBytes"の部分はSCREEN5っぽいですが)
プチコンの画面は256x192なので、横方向を1/2にし、さらに縦192ドット以降は無視。

もととなる画像から位置を割り出し、GLINEで書いていきます。
黒い部分は(23,43)-(234,123)てな感じで。※この大きさが後で問題に。。

データを打ち込み、描画結果を見ながら適当に補正し、思いつきで短くしてみた結果が以下のプログラムです。
MSXタイトルロゴ作成プログラム。謎の文字列がいい感じ
期せずして1画面に収まりました。(1行目GOSUB @SETUPはとび先でRETURNしているだけです。消し忘れ)
とはいえ、いきなりこんなリストになったわけではありません。最初はDATA文で数字で座標を打ち込み、見栄えを確認してからデータを圧縮・プログラムを変更しています。

プチコンでの実行結果は次の画像です。
MSXタイトルロゴ作成プログラム実行結果。一瞬で表示される
なかなかそっくりにできたのではないでしょうか。
Sの曲線がそれっぽくできました。
ただ斜め線ががたがたに見えるのがやや残念なところです。
本物の画面をよく見るとわかりますが、斜め線では灰色も使用しており、アンチエイリアシングされています。
でもめんどくさい現状のできばえに満足してしまったので、灰色ピクセルの再現はしませんでした。

「MSX」はMSXライセンシングコーポレーションの登録商標です。