2006年06月29日

画面まわり10

[24.8KHz, 400ラインの場合]

映像信号
+--------------------------------+
--------+ +------
⇔ ⇔
ブランク期間(TOP) ブランク期間(BOTTOM)

垂直同期信号

---+ +-------------------------------------+ +--
+-+ +-+

VSYNC期間

TSP SYNCコマンドでの設定値

8line
⇔ ⇔
25line 7line
← 400line →

← 合計440line →


実測値からの予想

・TSPステータスbit6: ブランク期間(BOTTOM)開始からVSYNC期間終了まで1
・ポート40h bit5: ブランク期間(TOP)終了から400line(*)分は0、それ以外は1。(*)は実際の表示ライン数に依存せず常に400line。

posted by Shinra at 22:51| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年06月27日

画面まわり9

TSP(μPD72022)の資料を入手!!
さがしてみるもんだ。

http://www.datasheet4u.com/html/U/P/D/UPD72022_NECElectronics.pdf.html

一番謎だったSYNCコマンドのパラメータの説明をよく読んでみた。

#スプライト制御テーブルやテキスト制御テーブルの説明が全然無いのは
#不満。

posted by Shinra at 23:54| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年06月26日

画面まわり8

> TSPステータス(ポート142h)のVB(垂直消去期間、bit6)を参照している。
> ポート40h bit5 (CRT垂直帰線区間)は実装済みだったけれど、
> こっちは実装していなかった。

実機で調べてみたら、TSPステータスbit6とポート40h bit5では、
1になるタイミングが全然違っている。

その上、表示ライン数を増やすと(400→408にするとか)
TSPステータスbit6が1の期間は変化しない(0の期間が延びる)が、
ポート40h bit5は1の期間が伸びて、0の期間が変わらない。

後者はいったい何を表しているのか謎。

6/25の実装でも、ソフトが動作するという意味では問題ないんだろう
けれど、実機と違うので、なんか気持ち悪い。

posted by Shinra at 23:01| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年06月25日

画面まわり7 / 幻影都市

幻影都市のディスクイメージ作成。7枚組!そんなに多かったっけ。
案の定、XDISK2VAではディスク1トラック2でハング。
ディスク1だけは9801+MAKE_HDでイメージ作成。
マイクロキャビンのは全部だめかなぁ。なんとかしたいなぁ。

起動、ハング・・・

TSPステータス(ポート142h)のVB(垂直消去期間、bit6)を参照している。
ポート40h bit5 (CRT垂直帰線区間)は実装済みだったけれど、
こっちは実装していなかった。

実装。

無事起動。デモは無事実行。

ic2.PNG

ic3.PNG

デモが終わったところでハング。
最初のメニューで「スタート地点から」を選択しても同様。

CS:IPがGVRAMを指しているところからみて、暴走しているらしい。
セグメント0000hをみると、割り込みベクタが破壊されている。
暴走するちょっと手前で適当に止めてみると、セグメントレジスタ
の値が0008hになって、そこを書き換えている。暴走の原因はきっとこれ。
では、0008hの出所は。

AH=48h int 21h (メモリ割り当て)が CY=1, AX=8(メモリ不足)で
帰ってきている。正常終了していれば確保したメモリのセグメント
アドレスがAXに入るのだが、エラー終了したのでエラーコードが
入ってきている。ところが、エラーだったかどうかをどうもチェック
していないっぽい(ソフトのバグだよなぁ)。なものだから、8をそのまま
セグメントアドレスとして扱って処理が進んでいた。
でも、なぜにメモリ不足??

ためしに、[PC]キーのセットアップ画面で、メインメモリ640Kにしてみた。
今度は正常に動くようになった。

ic4.PNG


でも、幻影都市のパッケージにはVAは512KでOKって書いてある。
実機では??

512Kに設定すると、確かに同様にハング。
確かにうちはメモリを増設していたけれど、当時、増設しないと動かない
とかいうような話は聞かなかったけれどなぁ。
自分でディスク1のconfig.sysを書き換えたりしちゃったかなぁ。
タイムスタンプ見る限りはそうでもなさそうだけど・・・

どなたか、うちは512Kでも大丈夫だよ、という方がいらっしゃたら
教えてください。

# 実機でもハングするのでVA-EGの問題ではないだろう。


さて、幻影都市はRS-MIDIに対応しているわけですが。
確かに鳴ります。でも、MT-32/CM-64用なのに対し、
Windows内蔵のソフト音源はGSなものだから、
どうも音色がほとんどあっていないみたい。
かなり聞き苦しい。残念。

[備考]
PCキーのセットアップ画面でメモリ640Kにするには、
[Device]-[IO Bank Memory]で[Use IO Bank Memory]にチェックを
入れて、IOバンクメモリが増設された状態にしてください。
posted by Shinra at 22:59| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年06月24日

RS-232C 3 / Restmicaty 2nd Edition

[Device]-[Serial Option] は、変更してもエミュレータをリセットしないと
有効にならないようで。np2の仕様の模様。

MIDIプレーヤーをもう一個動作確認。火炎龍氏のRestmicaty 2nd Edition -Kahna-。.MIDファイルのドライバ&プレイヤー。
(http://harukago.sakura.ne.jp/ の [ぎじゅつしりょう]→[ソフトウェア]
から入手可)

restmicaty.PNG

とりあえずちゃんと演奏されている模様。

# 演奏データはVAのハードディスクから発掘したのだけれど、
# 聞くのは本当に久しぶりで、もう懐かしくて懐かしくて。
# あの時から動けない自分がいる、みたいな(意味不明)


posted by Shinra at 23:10| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年06月23日

RS-232C 2 / PLYRCP

ひまじん氏がフォーラムのほうにアップしてくださった、RCPプレーヤーPLYRCP。MPUだけでなくRS-MIDIにも対応しているらしい。
np2はRS-232Cの出力をWindowsのMIDI機能(っていうのかな)に接続して演奏できたはず。
VA-EGも同様にできるはず。

まずRS-232Cの実装状況を確認。
・ポート20h/21h(8251)→Xak2対応の時に実装した
・ポート1cdh bit2-0/ポート1cfh (8255) RS-232C割り込みマスク→いつの間にやら実装してあった
・ポート1cbh bit7-5 (8255) DCD/CTS/CI信号→未実装

1cbhは98側の処理を真似て実装(1行)

PLYRCPを実行してみる。
→「MIDIインタフェースを接続してね。」
MPU→MIF→RS-MIDIの順にインタフェースをチェックする仕様らしいが、
RS-MIDIを検出できていないようだ。
そもそもRS-MIDIってどうやって検出するの?

RS-232C関連入出力処理にブレークポイントを張って実行。
RS-232Cの信号線をなにやら操作して、CTS信号の変化を調べてるらしい。

PLYRCPの説明書を読んでみたらちゃんと書いてある。
RS-232Cの4pinと5pinをショートさせないと認識されないと。
本体からのRTSをそのままCTSに(正確には反転させて)つなげればいいのだろう。そうしてみる。

まだ足りない。

np2の処理はなぜかRTSやDTRを無視している。
また、そもそも8251のコマンド設定(これでRTSやDTRを操作)は、モード設定直後の1回しか受け付けないようになっている(バグ???)
そのへんも実装&修正。



plyrcp.PNG

無事起動&演奏。


posted by Shinra at 23:11| Comment(2) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

マルチプレーンモード 11

水平解像度320ドット の表示を実装。
posted by Shinra at 00:19| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年06月18日

ツールウィンドウ5

ツールウィンドウを非表示状態から表示状態にしたときに、
2つの不具合があった。
1. FDが挿入されていても、空(FD未挿入)の状態で表示される。
2. 動作モードのLEDが表示されない。

1はnp2では正常だった。以前、VA-EG起動時にコマンドラインでFDイメージファイルを指定した場合にツールウィンドウに反映されないので、その修正をしたが、そのときにおかしくなったらしい。
そのときは、DISKDRV.Cのdiskdrv_fnameに、挿入されているイメージファイル名が格納されているものと思っていて、それをツールウィンドウに反映させるように変更していた。ところが、diskdrv_fnameの値は、ディスクイメージ選択後、少し時間を置いて""にクリアするようにプログラムされている(理由はわからない・・・)。そのため、ディスクイメージ選択→ツールウインドウ表示の順に操作すると、ツールウィンドウには""(ディスク未挿入)の状態が描画されてしまっていた。
以前やった修正を削除して、コマンドラインのFDイメージファイルの反映は別手段に変更することで、1は修正。

2は、LEDの状態を保存している変数が、ツールウィンドウ表示時にクリアされていたから。というより、ツールウィンドウ表示時にクリアされる構造体にLEDの状態を保存していた。LEDの表示を保存する構造体を変更。(TOOLWIN→NP2TOOL)

posted by Shinra at 15:14| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

高速化 4

>テキスト画面が全て空白文字かつ背景色0かつアンダーラインなし
>なら、
>テキスト画面の描画を休止(固定的に0を書き込み)。
>TVRAMへの書き込み、TSPへのコマンドがあれば再開。

休止した状態で、どこでもセーブした状態をロードすると、
ロード直後の画面にテキスト表示があっても、休止フラグが立ったまま
なので、表示されない、という問題があった。修正。

posted by Shinra at 15:00| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年06月16日

高速化 3

テキスト画面が全て空白文字かつ背景色0かつアンダーラインなし
なら、
テキスト画面の描画を休止(固定的に0を書き込み)。
TVRAMへの書き込み、TSPへのコマンドがあれば再開。


画面描画処理を常に480ライン分やっていたのを、
#というのに今日気づいた
実際の表示ライン数分(通常400)に限定するように変更。


これで、ソーサリアンはほぼ56.5FPSをキープ。


気が付けばR-TYPEも40FPS代前半まで落ちてたのだけれど、
50FPS代に回復。

posted by Shinra at 23:43| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

マルチプレーンモード 10

ループをマシン語化。
ソーサリアンで 50〜53 FPS。だいぶ良くなった。

Auto Frame じゃなくて Full Frame を選択すると、
56.5FPSで実行速度も7.99MHzをほぼ維持できている。

よくわからないけれど、そういうものなのかな。


# __asm ブロックで loop xxx とやるとループのジャンプ先が
# xxxにならずに、どっか見知らぬアドレスになってしまう。
# なぜ?? あきらめて dec cx / jnz xxx に置き換えた・・・
posted by Shinra at 00:08| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年06月11日

マルチプレーンモード 9

足を引っ張っていたのは、マルチプレーンモードで、
GVRAMの内容から、カラーコード(0〜15)の列(1ライン分)を求める処理。
4プレーン分を合成するために、シングルプレーンモードより
負荷が高いらしい。

処理は単純で
# カラーコードは1ピクセル1WORDで表現。


WORD *b;

for (xp = 0; xp < 640/8; xp++) {
if (--wrapcount == 0) {
addr = screen->wrappedaddr;
}

d0 = grphmem[addr];
d1 = grphmem[addr + 0x10000];
d2 = grphmem[addr + 0x20000];
d3 = grphmem[addr + 0x30000];
addr = addr18(screen, addr + 1);

for (i = 0; i < 8; i++) {
*b++ = ((d0 & 0x80) >> 7) |
((d1 & 0x80) >> 6) |
((d2 & 0x80) >> 5) |
((d3 & 0x80) >> 4);
d0 <<= 1;
d1 <<= 1;
d2 <<= 1;
d3 <<= 1;
}
}


for (i = 0 ... の部分を以下のようにテーブルを使った方法にしてみた。


{
DWORD p;

p = *((DWORD *)&byte2pixel[d0][0]);
p |= *((DWORD *)&byte2pixel[d1][0]) << 1;
p |= *((DWORD *)&byte2pixel[d2][0]) << 2;
p |= *((DWORD *)&byte2pixel[d3][0]) << 3;
*((DWORD *)b) = p;
b += 2;

p = *((DWORD *)&byte2pixel[d0][2]);
p |= *((DWORD *)&byte2pixel[d1][2]) << 1;
p |= *((DWORD *)&byte2pixel[d2][2]) << 2;
p |= *((DWORD *)&byte2pixel[d3][2]) << 3;
*((DWORD *)b) = p;
b += 2;

p = *((DWORD *)&byte2pixel[d0][4]);
p |= *((DWORD *)&byte2pixel[d1][4]) << 1;
p |= *((DWORD *)&byte2pixel[d2][4]) << 2;
p |= *((DWORD *)&byte2pixel[d3][4]) << 3;
*((DWORD *)b) = p;
b += 2;

p = *((DWORD *)&byte2pixel[d0][6]);
p |= *((DWORD *)&byte2pixel[d1][6]) << 1;
p |= *((DWORD *)&byte2pixel[d2][6]) << 2;
p |= *((DWORD *)&byte2pixel[d3][6]) << 3;
*((DWORD *)b) = p;
b += 2;
}

効果なし。

テーブルを変えてみた。

for (i = 6; i < 8 ; i-=2) {
*((DWORD *)&b[i]) =
*((DWORD *)
&plane2pixel[d0&3][d1&3][d2&3][d3&3][0]);
d0 >>= 2;
d1 >>= 2;
d2 >>= 2;
d3 >>= 2;
}
b += 8;

FPSが1程度上がったが焼け石に水。

np2はこの辺の処理をマシン語でやっていた。
やっぱりそうしないとだめ?
posted by Shinra at 23:33| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

FDサブシステム 23

友人から高速化のアドバイスをもらった。
「サブシステムが働いていないときにZ80の処理を止めちゃえば?」

なるほど、考えなかった。

サブシステム側からみて、コマンド待ちの状態のときにコマンドが
なければZ80を止めるようにしてみた。
具体的には、コマンド待ちループにおいて、in 0feh を実行する
タイミングで、読み取った値のbit3(ATN)が0なら停止。メイン側から
ATN=1の出力があれば動作再開。

これを、VA2のサブシステムのROM内ルーチンのコマンド待ちループと、
ソーサリアンのそれの場合で判定するようにした。
# 初代VAのサブシステムのROMは、吸い出してみたところ、VA2と全く
# 同じ。

さて、効果は。
普段動かしているのはデバッグ用にコンパイルしたものなのだが、
動作速度6MHz代だったのが、実機と同じ7.99MHzまで回復。
ソーサリアンでディスク読みに行くと急に遅くなったりするけれど。

リリース用コンパイルの方は。
PC-Engine起動後のFPSが55から56(フルフレーム)に改善。
ソーサリアン動作時は・・・
全然良くなってない(汗)

じゃあ、足を引っ張っているのはナニ???

次に続く。
posted by Shinra at 23:15| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年06月10日

マルチプレーンモード8

ソーサリアンが動作して気が抜けて、だいぶ間があいてしまった。

GVRAM制御ポート(ポート5xxh)の読み取りを実装。

テクマニによれば、ポート518h, 580hのbit7を1にすると読み取り禁止に
できるそうだが、VA2で確認したところでは、bit7は0固定(常に読み取り
許可)のようだった。
そもそも禁止にするメリットが分からない。初代VAだと読み取り禁止に
することで速度が上がったりするのだろうか。

ポート153hのbit4でGVRAMアクセスモードをマルチプレーンに設定すると
ポート580h〜(シングルプレーン用のポート)は無効(読み込んでもFEh,
FFh,FDh,7Fhなどが返る(*1) )になり、シングルプレーンにすればポート510h〜が
同様に無効になることが分かった。また、シングルとマルチの間で切り
替える時にポート5xxhの内容がリセットされることもわかった。

ポート528h(プレーン比較データレジスタ)の読み取り値はポート520h〜526hに
連動しているようで。そこまで細かいことはテクマニには書いて無いから実際
試さないと気づかない。

テクマニに掲載されていないポート508hを発見。bit0のみ有効で他は0。
SGP関連のポートだろうか。

マルチプレーンモードのときにSGPの処理ルーチンを全部スキップするように
してみた。ほんのちょっとだけスピードが上がった模様(FPS値が0.1くらい上がった)


(*1)読み取りは不安定のようで、時々FEがFFになったりする

[追記]
初代VAでもポート518h, 580hのbit7は0固定だった。
う〜ん謎・・・
初代VAの場合、5xxhの未実装ポート、読み取り無効のポートは
きれいにFFhでそろってた。
posted by Shinra at 23:12| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。