作りたいものに妥協しないために、会社を興してまで完成させた作品です。うれろー、うれろー。

2011年01月16日

MZ-2500とかX1とかの画面周り

ここ数日、2chの某スレで指摘されていた、MZ-2500やX1の画面周りの修正をやってました。

110116-1.png
X1のゼビウスがちゃんと動作するようになったのが、一番の目玉でしょうか。
(修正は一番簡単だったんですけどね)
CRTCで、1文字のラスタ数を4に、1画面の表示行数を50行にするといった、
変態設定をしたときの画面生成を修正しています。

この辺、MULTI8とかPASOPIAとかの、同じCRTCを使った機種にも横展開しないと
いけないんだろうけど、そっちでこんな変態的な使い方をしているソフトが
ある訳でもないだろうしなーと。
いっそ描画アドレスの生成処理も、全部CRTC側でやってしまおうかと思案中です。


MZ-2500では、画面のスクロールレジスタやマスク関係の機能を修正しています。
自分では持ってないので判らないのですが、店頭デモで、地球が割れてしまったり、
画面マスクが機能してなくて描画中の状態が丸見えになったり、といった問題が
修正されているみたいです。

まだエミュレータを開発し始めたばかりの頃のコードがいっぱい残っていて、
今見ると結構無駄な処理があるなあということで、かなり大掛かりに弄ってます。
おかげでdiffをとると、一面まっかっかです。
ただMZ-2500の細かい仕様を忘れてて、なんでそんな無駄なコードになっているか
判らないままに最適化しようとして、後で泣きながら元に戻したりとか(苦笑)
そういえば、MZ-2500の画面周りって複雑怪奇だったなーと色々懐かしんでます。


posted by 武田 at 15:02| Comment(5) | TrackBack(0) | 開発 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
>画面マスクが機能してなくて描画中の状態が丸見えになったり、といった問題が
修正されているみたいです。

お世話になりました。856です。
1985年発売MZ2500-V1同梱のBASIC(デモソフト含む)を改めて調べたところ各パート毎に
$E2強制ブランキング技が使われていました。

MZ神話には$F6の黒マスク技も使われていました。なんで気付かなかったんだろう…。
Posted by 856 at 2011年01月16日 18:36
 MZ-2500欲しかったなあ。
 武田さんぐらいインパクトのある実績をお持ちの方がシャープにお願いすれば、X68000の時のようにX1やMZのROMやDISKが配布フリーにならないかなあ。
Posted by 88ユーザーだった at 2011年01月20日 20:19
MZ-2531(グラフィックボードをフル増設したときだけ使われる)
640*200*16ページ1を表示する画面モードに限りバグが新たに混入しています
(640*200*16のページ0側は正常です。640*400*16や320*200シリーズも正常なので気づきにくいバグです)
G-CRTCコントローラ ポート0xbc 内部レジスタ0x0e (画面表示モード)1+2+4+16 +128だけ異常

2019年2月19日バージョンまで正常
2019年4月30日から不具合が発生して最新2020年2月18日も続いています
>改定履歴
>2019/4/30
>320x400 256色モードのサポート
>GCRTCアドレス関連の再現性向上
これが関係してそうです。

付属のBASICディスクで再現させる場合
init"crt2:640,200,16": screen ,,1,(1) :paint (0,0),2 ページ1側の表示と描画宣言を行って
ペイントすると画面中央から塗り始めて一周回るズレた挙動になります(正常時は画面上から下へ塗る)

G-CRTCコントローラのI/Oポートを直接叩く場合は
0xbd のレジスタ番号 0x0e (BASIC上から直接操作しても再現しました(LSI側エミュレートの問題と思われます)
out &hbc,&he : out &hbd,1+2+4+16   (0ページ目は正常)
out &hbc,&he : out &hbd,1+2+4+16 +128(1ページ目だけ異常 最上位ビットがページ0と1の制御)

シャープ純正デモンストレーションMZ-2531V2専用(地球が回転するG-RAM等フルオプション必須)内で
ページ1を用いる疑似テレビ画面枠の表示ズレで気づきました
お時間があるときにでも修正をお願い致します
Posted by 856 at 2020年04月11日 10:02
mz2500
crtc.cpp
void CRTC::draw_640x200x16screen(uint8_t pl)
 subplane = (pl & 1) ? 0x2000 : 0x0000;
1625ライン 0x4000 だった部分が 0x2000 (320x200x16 と同じになっています)
Posted by 856 at 2020年04月19日 14:11
X1センターのX1実験室のゲームパッチの「イース改良パッチ for X1」の高速PCG定義が失敗する原因ですが、

void DISPLAY::get_cur_code_line()メソッドのaddr > 0x7ffのケースの場合の、

addr = 0x7ff; → addr &= 0x7ff;
}
と代入ではなくANDマスクに変更すると高速PCG定義に成功します。

上記のロジック変更でイースのBディスク動作でも、他のソフトでも今のところ失敗するケースは発生していません。

ご一考願います。

Posted by YAT at 2020年05月04日 15:37
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
まるくん、がんばれ、ちょうがんばれ
×

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