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ライセンシングコーポレーションの登録商標です。