FMTowns新エミュレータ Tsugaruの情報交換用スレッドです。
Tsugaru : http://www.ysflight.com/FM/towns/Tsugaru/j.html
2020-07-28 12:41:40
プロジェクトGitHub → https://github.com/captainys/TOWNSEMU
作者ホームページ → http://ysflight.in.coocan.jp/
[使用方法] *ダウンロードから初期設定
(1)GitHubのReleasesより、"windows_binary_latest.zip"をダウンロード
(2)zipファイルを適当なフォルダに解凍後、Tsugaru_GUI.exeを実行
(3)「ROM dir:」ボタンを押してTownsのROMの場所を指定 (ROMはうんづのROMを使用)
(4)必要に応じてCPU SpeedでCPUのクロック周波数,RAMで搭載RAM容量,Scallingで画面の拡大率を指定
(5)必要に応じてSCSIタブより、接続するハードディスクイメージ(うんづの物を流用する場合は拡張子を.binに変更)を指定
(6)必要に応じてGamePortタブより、TownsのPAD/MOUSEポートへ何をつなぐのかを指定(通常はポート0にゲームパッド,ポート1にマウス)
(7)必要に応じてBootタブより、優先する起動先を指定
(8)Fileより、「Save as Default」を選択して設定をデフォルトとして保存
[使用方法] *運用
(1)「CD Image」/「FD0:」/「FD1:」でメディアを指定 ※1
(2)「START」ボタンにより動作開始
(3)FMTownsをお楽しみください。
※1 CD-ROMはISOまたはCUEファイル,FDはBINファイルを使用する。 D88ファイルはうんづ等を使用して変換しておく事,また、HDMファイルは拡張子をBINに変更するとそのまま使用できる。
[注意1] 新たにFDやHDのイメージファイルを作るには現時点ではGUIではなく、CUI環境(Tsugaru_CUI.exe)でパラメータを指定して起動する必要が有ります。 面倒な方でうんづを使用されている場合はうんづ上で作成してコピーするのが良いでしょう。
[注意2] SCSIを利用される方は初期状態ではドライブ構成が出来ていませんので、初回はCD-ROMにシステムCDを指定してTownsOSよりドライブ構成を行う必要が有ります。 うんづを使用されている方はうんづで使用していた"CMOS.DAT"をドキュメントフォルダ下の"Tsugaru_TOWNS"にコピーすると良い
2020-07-29 10:55:28
山川機長様
今どきあまり無いとは思いますが、Windowsバイナリ限定なのか不明ですがホスト側でオーディオデバイスが搭載されていなかったり、デバイスマネージャで無効化していたり、スピーカー類(イヤホンも含む)が全く接続されていない場合にVMの起動中にVMがシャットダウンしますが、オーディオに関しては無視して頂くことは可能でしょうか? 以前のリリースでは問題なかったと思うのは私だけでしょうか?
2020-07-30 15:49:50
PCMの音量が小さいように思うのですが、これは全体的な問題ということでいいでしょうか?(互換リストには個別に記入していません)
2020-07-30 21:55:18
うーん、サウンドデバイスが無い場合は、今WAVE生成のタイミング取るのにひとつのセグメントが終わったことを利用しているので、無いと多分変になりますね。ちょっと変更が大きい鴨しれません。
PCMの音量、やっぱり小さいですかね。8チャンネル全部最大の時、WAVの最大音量(+-32767)になるようにしたのですが、もう少し音量を上げて振り切れたときは+-32767で切り落とすようにした方がいいですかね。
2020-07-31 10:30:35
to山川機長様
サウンドデバイスの件、音無しでTownsを利用しようとする方がどれ程なのか謎ですが、あまり多くはないと思いますので、相当後回しでも構わないと思います。
しかし、現状だとエラー表示等がなくVMが終了してしまうので当てはまる環境の方が動作させようとした際に戸惑う可能性が有るかなと思いますので、コンソール画面への表示は欲しいと思います。
2020-07-31 12:57:24
>>5
スト2やマッスルボマーをプレイした時に、PCMがあまり聴こえませんでした。
両方ともBGMがCD-DA、効果音がPCMです。FM音源は使っていません。
考え方としては、PCM1chで最大音量に合わせて8ch合成した時に溢れた分はカット、だと思います。
合成というのは単純な足し算です。8chだから8で割る、というようなことはしません。
もちろん「最大音量に合わせて」というのは考え方の話であって、
実際には実機の鳴り方に合わせることになると思いますが。
2020-07-31 21:21:59
津軽のビルドについて質問です。
スレッドを作ろうかとも思ったのですが、一瞬で終わりそうな気がしたのでとりあえずこちらで。
Visual Studioをインストールして、Developer Command Promptを開いて、
src\buidフォルダを作って、その中で cmake .. を実行したところ下記のエラーが。
一度、buidフォルダを消してみたのですがエラーは変わらず。
これはどうすればいいでしょうか?
Visual StudioもCMakeも使ったことがないド素人なので優しくお願いします。
CMake Error at externals/fssimplewindow/src/CMakeLists.txt:56 (message):
In-source build prohibited.
Clear cache and Start cmake from somewhere else.
-- Configuring incomplete, errors occurred!
See also "E:/projects/TOWNSEMU/src/build/CMakeFiles/CMakeOutput.log".
2020-08-01 20:19:43
はじめまして、ヒロと申します。
私も、CMake初心者ですが、津軽のために、初チャレンジして
ビルドできております。
(VS6以来、Cのプログラミングはやってないエセ プログラマです。
この10年ぐらいは、メインはRでデータマイニングやっています。)
fuzzballさんのように
Developer Command Promptから実行しなくても、
GUIだけで、ビルド可能でした。
CMakeのGUIを立ち上げて、
ソースコードのパスと
バイナリ出力パスを入力しますが、
ここで、ソースコードのパスとバイナリ出力パスが同じだと、
fuzzballさんのようなエラーが出ました。
私は以下の様にパスを設定しています。(例です)
ソースコードのパス
C:/UTY/EMU/TOWNS.TSUGARU/v20200731/TOWNSEMU-master/src
バイナリ出力パス
C:/UTY/EMU/TOWNS.TSUGARU/v20200731/TOWNSEMU-master/bin
一度失敗していたら、
キャッシュを消してから、「Configure」のボタンを押すと
VS 2019を選べるので選んで(私の場合は、最初から選択されていた)、
「Finish」を押して
「Generate」を押して、
「Open Project」を押すとVSが立ち上がるので、
x64 でリリースモードになっているか確認して、
(私の場合、いつもDebugになっていることが多いです。)
F7でソリューションのビルドを実行すると
C:/UTY/EMU/TOWNS.TSUGARU/v20200731/TOWNSEMU-master/bin
の下のどこかに、exeファイルが出来ています。
このようにやってもうまく行かなかったら済みません。
2020-08-01 21:05:31
ちなみに出力先を
C:/UTY/EMU/TOWNS.TSUGARU/v20200731/TOWNSEMU-master/src/bin
としても、同じエラーがでますので、
ソースファイルのパスの下に出力先を設定しているのが問題かと。
2020-08-01 21:46:38
ヒロさん、ありがとうございます。無事にビルド出来ました!
‥で終わちゃうと面白くないので、コマンドラインでのビルドに挑戦しました。
試行錯誤した結果、個人的な趣味で以下のフォルダ構成/手順で行うことにしました。
1. プロジェクトルートに buid\ を作成して移動
2. cmake ..\src でConfigure/Generate
3. cmake --build でビルド
以上です。
無事にシャドー・オブ・ザ・ビースト起動しました。
2020-08-01 23:11:06
なんだかあちこちで buid と書いちゃってますが build のtypoです‥。(編集できなくて悲しい)
2020-08-01 23:14:44
fuzzballさん
無事に、うまくいったようで良かったです。
また、情報有り難う御座います。
私も、コマンドラインで試してみまして、
srcが見えているディレクトリで、binへ出力したいのであれば、
以下の2コマンド実行するだけでビルドできました。
(ディレクトリ移動やディレクトリ作成は必要無いようです。)
cmake -S src -B bin
cmake --build bin
2020-08-02 00:04:15
何度も済みません。
cmake --build bin
だと、デバッグモードで、ビルドされてしまうので、
cmake --build bin --config Release
ですね。
2020-08-02 00:19:23
ビルドできたようで、良かったです。僕がCmakeを使い始めたころ、何度かうっかりソースの中でcmakeコマンドをタイプしてしまってその後ビルドファイルをクリーンするのにものすごく苦労したことがトラウマになったので、ビルドディレクトリは完全にソースの外に無いとCMakeできないようになってます。
2020-08-02 11:42:19
忙しくてぜんぜん触れてないのですが、
cloneした状態のソースから、Tsugaru_GUIのビルドに成功している人いますか?
そもそもターゲットに出てこないんですよね……。
2020-08-02 17:01:35
src/ の下に無いから単独でビルドすれば‥と思ったら gui/src/public/src が上がってないようですね。
秘密のpublicソースなのかも知れませんw
2020-08-02 17:55:51
あ、わかりにくくてすみません。guiサブディレクトリにbuild_instruction.txtがあるので、それに沿ってやってみてください。
GUIモジュールは、僕が別にオープンソースで開発している(仕事+趣味兼用)ライブラリ群れが必要なので、CUIが単体でコンパイルできるようにディレクトリを分けました。
なお、全部コンパイルするとものすごく時間がかかるので、Tsugaru_GUIだけビルドするのがいいと思います。
2020-08-02 22:10:00
>>山川機長
もしかして、ルートの.gitignoreの build* に引っ掛かって上がってないのでは?
2020-08-02 23:55:16
大変失礼しました。その通りでした。先ほどPUSHしました。
2020-08-03 01:55:33
リリース出しました!Towns OS V2.1 L51 on DOS6.2がEMM386.EXEをロードした状態で少なくともTowns MENUまで起動するようになりました。(まだしばらくかかるだろうと思ってた)。キーボードBIOSが、キー00H (そんなキーは存在しない)が押しっぱなしになっていると思っていたので、そうならないようにキーボードを修正しました。あと、ゲームパッドのCOMビットを記憶してないというバグがあったので、それも直しました。キーボード、パッドでひっかかってたものはこの修正で正常になる鴨しれません。
サイバースティック対応のコードを書き始めてますが、まだ対応はできてません。当時Air RaiderとかTactical Air WingとかFormation Flightとか用に書いたサイバースティックのコード(Oh!FMTOWNSの記事を見ながら書いたんだと思った。EASTさんの記事でしたっけ?)が残っているので、それを元に書いてます。
ついでに、Wing Commander 1を無理やりジョイスティックとスロットルレバーに対応させるプロジェクト開始。Wing Commander II以降はDOS版と大差無いのですが、1に関してはオーケストラのBGMがついてるTowns用が最高の出来だと思ってます。
2020-08-20 07:46:58
>山川機長さん
ありがとうございます! 当方でもT-OS V2.1L51 on DOS6.2の起動、およびTownsMENU・MGV2(画像ビュアー)・ViVA(MSVプレーヤー)の動作を確認しました。
ただ、MiV(画像ビュアー・シェアウェア) v3.86はCPUID命令を実行しようとしてVMがAbortします。フリコレ11収録のv3.21なら大ジョブなのですが…
なお、インテルプロセッサにおけるCPUID命令の検出方法については以下のURLに資料がありますので参考にされてはいかがでしょうか。
https://www.intel.co.jp/content/dam/www/public/ijkk/jp/ja/documents/developer/Processor_Identification_071405_i.pdf
2020-08-20 15:44:25
↑で書くのを忘れてました。DOS3ベース/DOS6ベースを問わないのですが、512×480ピクセルモードでマウスカーソルの位置がずれます(汁
2020-08-20 15:59:43
>22(ただの自爆)
MiV v3.86がCPUID命令で落ちる現象は、EFLAGSレジスタの空きbit(MXあたりのi486DX2だとbit31~19)は本来0固定でなければいけないのに現状の津軽では全bitが保存・取得できるためにCPUID命令があると誤認識していたのが原因です(i486系の途中の製品からCPUID命令が追加され、EFLAGSのbit21が有効になっています。Fresh・FS/FTのAm486DX4も対応してたかも)。
この仮説の検証のため、こちらでEFLAGSのbit31~19を強制的に保存されないよう勝手ビルド(しかも手抜きな中途半端やっつけ仕事(汁))してみたところ、MiV v3.86も津軽で問題なく動くようになりました。
2020-08-21 02:04:38
おおなるほど!EFLAGSレジスタの件、修正します!512x480ピクセルモードはひとつだけCRTC設定と僕の解釈が合わない画面モードでっ、、、、て、マウスの位置だけでしたか?いつの間に動くようになったんだろう。なんか直したときに直ってしまっていたのか。確認してみますね。あ、あとRTCも直さなきゃ。RTC直そうと思ったまま放置してきたので、今日こそ直そう。
2020-08-21 03:15:58
ソースPUSHしました!アナログ軸をパッドの十字ボタンに使うオプションをGUIに出しました。IRETD, POPFDでEFLAGSのビット19以上をゼロに維持するようにしてみました。マウスは試しに5ステートにしてIDLE状態ではLow 4bitはすべて1を返すようにしてみました。PAUSEがかかりまくる現象がこれで収まってくれると良いのですが。RTCの月を直したのですが、見たら僕の環境では時計がローカルタイムと4時間ずれてますね。その現象発生しているでしょうか?RTCは正しいローカルタイムを返しているようなのですが。あとは、マウスインテグレーションで画面の表示位置を考慮するようにしたので、512x480モードでカーソルのずれはなくなりました。I/Oにいつだか掲載された「空飛ぶ箱庭エディタ」で確認しました。あと、多分15KHzモードで画面表示がずれる問題も直っていると思います。
2020-08-21 08:57:19
昨日少しだけ検証してみました。MiV v3.86がCPUID命令を実行しようとする件が修正されていることが確認できました。ありがとうございます。
マウスのIDLEステート時の実装は不要だと思います。本題(あすか120%)のほうではPAUSEはかからなくなったのですが、これがあると逆に一部のデータウエストDAPSタイトルでアイドル時にマウスポインタが右に飛んでいく現象が出てしまいます。こちらから報告する際に「実機でもマウスを接続した状態では同じ現象が起こります」と書き添えておけばよかったのですが…後出し情報で申し
訳ありません。512×480ピクセルモードでのマウスインテグレーションも正しい位置にマウスポインタが来ることが確認できました。
RTCの日時・時刻は日本国内ではどうやら正常に動作しているようです。
15kHzモードの画面表示ですが、画面表示自体が思いっきりずれることはないようですがインタレースモードの表示が正常でないようです(太っ腹No.1のTOWNS-Telopのデモで確認しました…ってなんでそんなので確認するんだか)。
2020-08-22 16:18:58
おおなるほど!それだと、実機ではマウスつないでるとPAUSEがかかるのが正しいんですね!では、IDLEステートは廃止の方向で検討します。
インタレースモードは、難敵ですね(^_^;)CRTCレジスタの値と本来こう見えるであろう見え方から意味を推測しながら微調整を繰り返してるのですが。太っ腹No.1のTOWNS-Telop、試してみます。一応技術の保存という観点では、そのうちスーパーインポーズとか対応した方が良いのかとか思ってます。
なお、今日はFM-7用のRS232Cカードが欲しいという方がいたので、ひさしぶりに半田ゴテを握ってました。物資の回収のためだけ短時間自分のオフィスに入ってもいい許可がやっと出たのでいろいろ回収してこようと思ってます。
2020-08-23 03:40:24
手前画面の拡大率が後ろ画面の拡大率の約数ではないとき、
memcpy(renderer.cpp内)によって前景描画中に背景用に描画した内容が変更されてしまうようです。
2020-08-23 11:14:00
おおなるほど!コードをずいぶん読んでいただいているようで、ありがとうございます!
確認してみます。その現象を確認できたアプリケーションがわかりましたら教えていただけますか?
2020-08-24 10:03:42
>山川機長さん
CRTCレジスタの設定値についてですが、基本的にはVSTのbit0が0である場合にインタレースモードと見なせば問題ないと思います。
実際のインタレースモードの表示動作については、ライン番号を上から0,1,2…と数えていった場合、偶数ラインはLOxで設定されたオフセットに従い、奇数ラインはLOxで設定されたオフセットにさらにFOxで設定されたオフセットが加算されるといった感じの実装で行けるはずです(UnzもFOxの設定が通らなくて480ラインインタレースモードにすると表示が崩れます)。
余談ですが15kHzモードでなくてもインタレースモード自体は使用可能です。あまり意味はありませんが。
2020-08-24 14:57:53
>30 山川機長さん
https://imgur.com/a/qpgGrnM
フリコレ10の T_OS/GAME/RAGNAROK にある Return of Ragnarok のエンカウントアニメーション中の一コマです。
背景は 3x3 に拡大されるはずが、3x2 と 3x4 の混じったようになってしまっています。
(もっと簡単に確認できるソフトを思いつけばよいのですが、他に思いつきませんでした)
2020-08-25 01:30:06
りうさん、
了解しました!ありがとうございます。現在インタレースであるかどうかは無視してレンダリングしているので、変になるのはこのへんの影響かもしれないですね。
pinさん、
ありがとうございます!確認してみます。
2020-08-25 11:13:18
どのスレッドに書こうかちょっと迷ったのですが、Genocide Squaredって起動中にRS232Cに何か書いてますね。ひょっとすると、応答するともっと長いメッセージが出たりするのかもしれないかと思ったのですが、これって既にみんな知ってる話でしょうか?ざっとGoogleで探したところでは見つからなかったですが、こういうの見つけると逆アセンブルして調べたくなりますね。
2020-08-25 13:13:51
>34
私は知りませんでした、興味が湧きます・・・・
シリアルデバッグでもしてたのかな?
2020-08-25 13:37:43
>>34
ジェノサイドと言えば、作者の方が裏技公開してましたねw https://togetter.com/li/743856
2020-08-25 20:46:06
RAGNAROK見てみました!これは、重ね合わせ問題以前に、ページ1の表示位置が間違ってますね。VRAMの左端をモニタ上のどのへんにするかの設定はCRTCのHDSレジスタで決まるらしいのですが、これがHDS=0だとVRAMの左端はモニタの左端よりも左に行ってしまうので、ゼロではない位置をセットすることになってるようなのですが、EGBの標準画面モード以外の正しい値が公開されてなくてこれもまた推測で実装してるんですね(^_^;)
HDSに設定するべき値はCLKSELとHSTレジスタで決まるようなのですが。ただ、どうも、CLKSEL, HSTの他にもPM, SCSELが関わってるのではないかという気がしているのですが、まだ法則がつかめてません。
どうも、これを調べてるうちに実はViewpointの画面表示も中央に表示して左右に空白があるのではなく、画面いっぱいに拡大しているのではないかという疑いを持ってしまったのですが、この拡大率も謎なんですよね。TBIOSのいくつかの画面モードには水平方向の最低拡大率が4のものがあって、その場合5倍設定にすることで256ピクセルを画面いっぱいに引き延ばすことができたのですが(確認せずに記憶で書いてるので微妙な間違いがあるかも)、CRTCのどのレジスタが水平方向の最低拡大率をコントロールしてるのかもまだわかってなくて。
既に大半の場合で動くようになってきているので、多分ちょっとした解釈の拡張が必要なのだと思うんですね。VINGが使ってるCLKSEL=3,HST=029DHと、RAGNAROKが使ってるCLKSEL=1,HST=0131FH の二種類は他に見ないパターンなので、とりあえず今はこの二種類の特殊処理にしておいて、特殊処理のケースがたくさんたまってきたら見直して一般解を探すという方向で対応しようかと思ってます。
もう、大量にサンプルしてMatrix Solverに力技で解かせてみようかな。と、言ってもサンプル数が少ないからやっぱだめか。
なお、FDCは奇跡的にトランジスタ技術スペシャルの記事を読むことができたのですが、とくにフォーマットコマンド後に一時的にDrive Not Readyになるとも書いてなくて、Xak II問題は引き続き謎が続いてます。何度か読んでいるうちに見落としてたことに気が付いて打開できるということはよく発生するので、今晩も再度読み直してみます。というか、Disk BIOSがフォーマットしてるんだから、フォーマットコマンドが来た時点で DS:[SI+0DH] を1 (多分要ディレクトリ再キャッシュフラグ)にしておくべきだと思うんだけどなあ。なんでそうなっていないんだろう。
2020-08-26 22:18:30
>37 山川機長さん
Ragnarokは表示位置も確かにずれているのですが、>29, >32 に上げたのは不均等な拡大のことでした。
フリコレ9のIRON-FIST(みんなで遊ぼう以下)でもっと簡単に確認できるようです。
https://github.com/pinterior/TOWNSEMU/tree/fix-zoom
このように変更すればよくなるのですが、もっとよい方法があるようにも思います
2020-08-27 01:22:59
おお、Iron Fist! 研究室でVSGP、Sky Duelとともにかなり流行りました。一応、直ったと思います。Backgroundに関してはmemcpyを使ってForegroundでは使わないように修正してみました。
表示位置問題はまだ直ってないのでRagnarokは心の目で主人公が表示位置より横に2ブロックずれたところにいると思わないとプレイしづらいかもしれません。
なお、まもなくリリース出します。横幅が640を超える場合Windowをリサイズするようにしたので、Microcosmが全画面見えるようになりました。ただ、アニメの表示位置が左にちょっとずれてます。表示位置問題は、なかなか根本的な解決が難しいですね。
2020-08-27 09:27:52
31番のたけがみりうさんの内容を見ていて、改めてVSTの関係とインタレース/ノンインタレースの関係を赤本で見ていたのですが、赤本改定3版の98ページ.表I-4-1 画面モード一覧の内容で、画面モード8,10のインタレースと書いてある所はひょっとしてノンインタレースの誤記でしょうか? 何やらその2つだけ"ノン"の入る隙間が有るような印刷ですが・・・
2020-08-27 11:38:18
画面モード8はインタレースで合ってると思います。でも、たしかに、画面モード10はノンインタレースですね。画面モード10の320x240 32Kのアンダースキャンモードは一昨年書いたDemoでも使ったので間違いないと思います。あ、301ページのEGBの説明も間違ってる。
2020-08-27 13:01:03
"VSTのbit0=0 → インタレース"とすると、136ページの表I-4-22にある画面モード8が絡むレジスタセットは、15,18,25となり、次ページからの表I-4-23のレジスタ設定値のVSTの値が、レジスタセット15,18,25は共に020BH(bit0=ON)となりますし、そもそも表I-4-1の画面モード7と画面モード8の違いが無くなってしまいます。
301ページの画面合成の所も画面モード8の合成可能なモードとして11が入っているのはおかしいのではないでしょうか?(11はノンインタレース)
総合すると画面モード8はインンたレースではなくノンインタレースとすると、全てに辻褄が合いますが、如何でしょう?
2020-08-27 14:02:52
おおなるほど。一応、CRTC設定の表が間違ってないか確認するために津軽で画面モード8,8としてCRTCレジスタキャプチャした値は↓です。
0x08,0x08,
0x0074,0x0530,0x0000,0x0000,0x0617,0x0006,0x000C,0x0012,0x020B,0x00E7,0x04E7,0x00E7,0x04E7,0x002A,0x020A,0x002A,
0x020A,0x0000,0x00E7,0x0000,0x0080,0x0000,0x00E7,0x0000,0x0080,0x0056,0x0001,0x0303,0x0005,0x0001,0x0002,0x0188,
CR0=5, HST=617Hなので、CLKSEL=1, Base clock=24545400Hz, 水平周波数15.744Hzとなりますね。15KHzモードはすべてインタレースだと思っていたのですが、たしかに、画面モード11は 15KHzなのにノンインタレースとなってますね。案外15KHzかつノンインタレースは可能だったのかもしれないですね。
2020-08-27 22:44:27
横位置について確認するため、赤本情報だけでCRTCとシフタの実装を想像してrendererを書いてみました。
HAJ = HDS であるほとんどの画面モードでは、x = HDS で行の描画を開始するときのVRAMアドレスは (FA + (y / ZV) * LO) * 4 になっているはずです。
HAJ < HDSのとき(Ragnarok, 達人王等)、HDSから描画を開始するときにVRAMのアドレスが
(HAJ-HDS) / (ZH * (1 << CL)) * 4 進んでいればよいと思います。(ここで、CLはCR0にある方)
気軽に除算しているけど割り切れないときはどうなんだ、というのは実機で要確認ですね…
https://imgur.com/a/ssTnAZr
https://imgur.com/a/5ilmh34
ソースにコメントのあるエメドラのような HDS < HAJ のケースでは、HDSからHAJまでは黒ないし透過で、HAJから FA + (y / ZV) * LO でしょうか。
(CDは出てきたのですが、たしかフロッピーが必要だったはずで確かめられない…)
2020-08-29 15:57:42
誤 (HAJ-HDS) / (ZH * (1 << CL)) * 4
正 (HDS - HAJ) / (ZH * (1 << CL)) * 4
失礼しました
2020-08-29 15:59:39
pinさん、
ご協力ありがとうございます!多分、LO, FOを使うとインタレースっぽい表示をエミュレートできるのではないかと想像しているのですが、現状ではまだ無視してました。RAGNAROKのスクリーンショットでスプライトの位置が背景と一致しているように見えるのですが、レイア1の表示開始位置(VRAMの左上をモニタ上のどこにマップするか)はどのように計算されているでしょうか?RAGNAROKの場合レイア0,1両方 HAJ-HDS==0 となっているので、VRAMの読み出し開始位置のズレはゼロのように思います。VRAMの左上に対応するモニタ上の位置は、31KHzモードの場合h、HDS-8AH になるようなのですが、これが仮に (HDS-8AH)*ZH であるとすればRAGNAROK問題は解決するのですが、他のタイトルでずれそうな気がします。 → 実験したらやっぱりずれますね。
2020-08-29 23:21:59
RagnarokはHDS=HAJでしたね
クロックと走査線を基準にした HST+1 x ((VST + 1) / 2) の描画領域があるとして、(ここでのHSTは赤本の図のビット10~1ではなくレジスタの値全体)
その中の (HDS0, VDS0/2) から (HDE0, VDE0/2) に描画するイメージです。
HAJがHDSより小さいときはVRAMアドレスの計算が(HDS-HAJ)クロック前から始まっているのですが、何クロックに1回カウントアップするかは
CL(CR0のほう)とZHによる――ZHクロックに1度シフタを駆動し、CLで決まる回数駆動したら次のdwordをフェッチする――だと思われます。
まだ書いただけで整理が全く追いついていないのですが一応コードもpushしておきました
https://github.com/pinterior/TOWNSEMU/blob/akahon-crtc/src/towns/render/render.cpp
2020-08-30 00:40:09
コード見ました!ありがとうございます。
2020-08-30 02:30:35
(全部書く前に書き込んでしまった)。HDS0とHDS1の小さいほうを基準にする方法ですね。そのようにレンダリングして画面の表示部分をセンタリングする、あるいはウィンドウサイズを表示部分に合わせて変えてしまうという手もあるかと思います。
とりあえず、pinさんのコードを読んで気が付いたのは、僕のコードではCLKSEL==1の場合は、開始位置を((HDS-0x8A)>>1)としていたのに対して、pinさんのコードではHDS-min(HDS0,HDS1)と取っている点ですね。自分のコードを見直してみたところ、どうやら表示開始位置のXは15KHzモードで(HDS-基準値)>>1, それ以外で(HDS-基準値)とすることで大体合っているようです。多分、僕がpinさんのコードのShiftとFetchの部分をもう少し理解すると、なぜこのルールになるのか理解できそうなのですが、とりあえず、RAGNAROKに関しては15KHz以外の場合は表示開始位置を2で割らないルールを適用することでずれが無くなったので、とりあえずこの方向で行こうと思います。
2020-08-30 02:54:58
実機が動くようになったらいじわるなテストスイートを作ってみようと思います。
15kHz非対応のモニタに隠し機能のスキャンコンバートを有効にして繋いでいた気がするのでインターレースや15kHzのテストは難しいかもしれませんが…
山川機長さんのコードで15kHzモードにおいて2で割るのが必要なのは、GetPageZoom2Xで15kHzのときに拡大率の解釈を変えているのと関係しているでしょうか?
2020-08-30 03:21:04
多分関係しているのだとは思うのですが、それぞれやってみて出てきたCRTC設定と本来あるべきと思われる見え方を元に調整したものです。
CRTCにはまだ僕は理解してない部分が多いですね。最終的にはMXのハイレゾにも対応したいと思っているのですが、困難が予想されてます。
2020-08-30 11:05:27
15kHzや24kHzは今となっては障壁ですよね。
私もどうしても実機で動作検証を行う必要が有る場合は、モデル2を使用するのですがTownsOSが立ち上がるまではモニターに何も映らず、31kHzでしか動作確認が出来ない状況です。
実家にFMT-DP8711が,屋根裏にFMT-DP532が眠っていますので、必要であれば復活させます。
でも、PC→Towns間の受け渡しにこれまた障壁が・・・(うちのはFDDが不安定なのです)
2020-08-31 10:15:03
そういえば、pinさんも書かれてましたが、MXに存在するという15KHzを31KHzに変換して出力する機能を有効化する方法ってわかりますか?フリコレに有効化するプログラムがあった(確か)ので試したのですが、だめで、どこかのサイトでI/Oが出ていたのを見て有効化するプログラムを書いてみたけどそれもだめで、CRIのゲームとか起動時にAボタンを押すのを忘れてるとモニタに何も映らない現象が発生します。まあ、実機でCRIのゲーム走らせるのは年二回ぐらいなのでそれほど大問題ではないのですが。
2020-08-31 10:37:38
M*シリーズに存在するスキャンコンバータに関しては、残念ながら存在は知っているのですが詳細は判らないです。
「Oh!誌に情報が載ったんだっけ?」という曖昧な記憶しかありません。
MX等のハイレゾ関連に関してはLinuxのXserverのソースが参考になります。(と言うかそれ以外に資料がない)
crtc_dr.cを見ているのですが、CRTCInit関数でcrtcChipがFMCRTC2の場合が新しいCRTCで従来の場合との違いが判ります。
2020-08-31 10:54:37
31KCHK.COMをみると新CRTCのレジスタ3番の最下位ビットを立てている(out 0x0472,3 -> out 0x0474,1)ようですが、
ドキュメントによると再起動が必要と書いてあるにも関わらず、それなしに有効になっていた記憶があるので本体のロット等によって細かな動作が違うのかもしれません。
24kHzはアナログ入力のあるFlexScanが結構対応しているので、なぜか今も流通しているサンワサプライのAD-D15NEを1000円ほどで買ってくれば使えます。
2020-08-31 22:26:34
>55
新CRTCレジスタですか・・・ そっちはハイレゾとフルカラー対応だけかと思ってました。
新CRTCレジスタ3のbit0は、Linuxのソースを見ても一切触ってないようですが、bit9は初期化のときにONとしていますのでディスプレイ関連の動作フラグが羅列されているのかも知れませんね。
24kHz対応は、I/OデータのハイスペックでないLCDモニターには今でも対応しているものが結構有るのはメーカーの優しさだと思っています。
家のモニターは名称こそFlexScanですが、相当古いCRTで24kHzには対応してないのです。何とかしたいのですが何ともならないものかと考えています。
2020-09-01 10:12:49
>pinさん、WINDYさん
新CRTCのスキャンコンバート設定レジスタ(0x0003)ですが、bit1が24kHz→31kHzコンバート設定、bit0が15kHz→31kHzコンバート設定となっており、どちらも1=ON、0=OFFとなっており、初期値はMX/MAでは0x0002、HA/HB/HCでは0x0003となっています。恐らくこれ以外のbitは未使用だと思います。
pinさんの考察では31KCHK.COMは0x0472に0x0003、0x0474に0x0001を書いているのではないか、とのことですが、ソースを見た感じでは0x0474にも0x0003を書き込み、ERRORLEVELとして1を返しています。
しかし、まさかフリコレ11でほとんど同ネタのツールがかぶるとは思ってなかったなぁ…某SCANCONV.COMはいろいろ付け足したからバイナリが大きくなったからなのか、あんまり目立たない場所(Q:\MS_DOS\TOOL\RHGTOOLS)に入ってたからなのか…orz
2020-09-01 14:19:44
>57 たけがみりうさん
情報の方、有り難うございます。
新CRTCに関しては赤本にも内容は載っていないので、情報が殆ど無かったので助かります。
大まかにはXserverのソースを観て把握はしていたのですが・・・・ よくご存じでしたね。 この辺ってどこかに情報が有りましたっけ?
他の機種でも未公開機能は当然ながら有るのですが、Townsに関してはそういった情報が(当時は有ったのかもしれませんが)なかなか見つからないので苦慮していました。
2020-09-01 15:08:55
>WINDYさん
全く資料はありませんでしたが、新CRTCを適当にいじってたら発見しました。
ほかにもTBIOSにパッチを当てて800×600ピクセル32768色モード(ただし1024×768ピクセルのまわりに空白を空ける形)を作ったりしてました。一応新CRTCやビデオカード3のレジスタについてはいろいろ調べたものがどこかにあったのですが、どこにいったんだろう…
2020-09-01 21:57:59
おおなるほど!そういうことだたったんですね!記憶をたどっていくと、たしか僕が試したのは31KCHK.COMで、リセットが必要だということだからCMOSに設定が書き込まれて起動時にSYSROMが何かするのかと思ったのですが、ということは電源切ったら再度実行しないと有効にならないんですね。今度やってみよう。ありがとうございます!貴重な技術資料ですね!ということは、I/Oのどこかに値を書き込んだら有効というのは僕の勘違いだったのかな?
なお、Wing Commander 2のマウスインテグレーション半分成功しました。マウスがプルプル震えるのて、これだとそのうちジョイスティックをマウスに使うモードを作ったとしてもとても操縦できないと思って、(なぜそこまでWing CommanderとStrike Commanderにこだわる?と思われても)気合入れて調べたのですが、そしたら、マウスの移動量はVSYNCの中で読んだものをイベントキューに貯めて、後にイベントキューを読んでマウス座標を更新するということをやってたので、現時点のマウス座標を元にマウス移動量を送ってやるとその移動量がイベントキューに何度も追加されてオーバーシュートしてました。これは、Lemmings 2がプルプルするのと同じ原因かもしれないですね。TBIOSを使ってるのにプルプル震えるやつは多分違う原因ですが。あとは、Wing Commander 2はマウスチェックの間マウス移動量は0を送り続けなくてはならないので、どうやってマウスチェックが終わったことを判定するか、デバッガ有効にしてCS:EIPを見たら簡単ですがパフォーマンスがガクっと落ちるからそれはだめで、デバッガを使わずにパフォーマンスにあまり影響を与えない方法でマウスチェック終了を検出する方法を模索してます。CDDA開始だと滅多に発生しないから、これがよさそうですね。
あ、そうだ、ついでに、Dual Targetsってデモ見たら止まりますかね?試したのですがデモ付きで初めても普通にゲーム始まったんですが。あと、Pulse per pixelを迎撃するようにしたので、-MOUSEINTEGSPDオプションを使わなくてもマウスがプルプルしなくなってます。
2020-09-01 23:11:02
>山川機長さん
いえ、スキャンコンバート機能の設定はI/Oレジスタに書き込む(0x0472←0x0003、0x0474←0x00000003)だけでOKです(書き込む前に新CRTCの存在チェックを行なう必要があれば0x0470を読んでbit7をチェックしておいた方がいいかも)。リセットも必要ありません。効果は即効性ありです。
ついでに。昨日やっとのことでSCANCONV.COM(フリコレ11に入っていたもう1本のスキャンコンバータ設定ツール)のソースが掘り出せましたんで(HCのHDDのバックアップから出土しました)、起動メッセージ等少しだけ変更したやつを置いときます。TOWNS用なのでLZHファイルです。ベースは25年前にでっち上げで書いたとんでもなくアレなものですが、31KCHK.COMにならって(?)ソース付きにしました。私が組んだ、数少ない対リアルモード用コードって意味では一見の価値があるかもしれないし、ないかもしれない(あとはTTBBSくらい(謎))。
http://retropc.net/ryu/unz/sconv15.lzh
もいっちょ。半非公開ページのTOWNSのサウンド出力比較ページに津軽(20200826版)を追加しておきました。現状の津軽では手元にあるPMDFMドライバを組み込むと初期化処理でコケてるっぽくてVM Abortもせずに止まるのでどうしようかと考えていたら、手元にあるPMDFMプレーヤーでPMDFM.EXPだけは動いたので助かりました。FMVOL:8192、PCMVOL:1280の設定にしておけばまぁまぁ本物と似た感じのバランスになってるんじゃないかと。
http://retropc.net/ryu/unz/snd/sndcompare.htm
ただの自分のサイトの宣伝になってしまうとマズイので(^^;)最後に。ソフトウェア互換リストでAになっているDAPSタイトルのうち、いくつかはDAPSリプレイで不具合が出ます。Orgelでは桜沢加奈子がドアの窓を降ろしたところで確実に停止、まだリストに出ていないAYAリメイク版でも何カ所かでSCSI ID:2のHDDにアクセスランプが点灯したまま止まります(どちらもまだ解析には手を付けていません)。もう一回最新版で調べた方がいいのかな…。
2020-09-02 08:57:45
ついでに。津軽には何の関係もありませんが(^^;)、V-TOWNSのTOWNSモードではMIDIカードを認識させるか否かの設定がI/Oからできるようになっていて、実際には同やるかというとI/Oポート0x0520(R/W)のbit0で設定します(0=なし、1=あり)。なお、初代でこの設定を1にすると純正EUPドライバを使ったソフトが全滅します(^^;;;;;;;;;;
2020-09-02 09:12:12
なるほど!テストありがとうございます!やはりDAPSは甘くなかったですか。多分かなり限界のことをやってたでしょうからね。
ちなみに、Air Combat II、ユーティリティからキーボードの割り当てができたので、見たらキー操作がすべてわかったのですが、それだと操縦しにくいのでカスタマイズしようと思ったら、ユーザディスク作成ができないことが判明したので、Cグレードに下げました。とくに変わったことはしてなくてCD-ROM BIOSを使って音楽演奏しているのですが、なぜかPAUSEもSTOPもしないままファイルを読もうとしているようです。現在調査中です。
2020-09-02 09:34:34
さらについでですが、だいぶ前に書いた隠しI/O情報、V-TOWNSのメモリマップ、各機種の機種ID/開発コードネームを書いたテキストファイルを置いておきます。なんか微妙に役に立ちそうにもないですが(^^;)
http://retropc.net/ryu/unz/tmp/towns_etcetra.zip
2020-09-02 10:07:43
たけがみりうさん
貴重な情報を有り難うございます。まだ準備は出来ていませんが、準備が整い次第WIKIの情報に追加させて頂きます。
探しもしなかった私と比べると、恐ろしい探究心ですね。 敬服いたします。
2020-09-02 10:21:04
>WINDYさん
20年くらい前に書いた資料に加筆修正した程度なので特に大したことはしてません。
あと、私のことは「りう」で構いません。NIFTYのハンドルが「RYU」→「RYU君」→「りゅうくん☆」→「Ryu」→「りう」→「たけがみりう」と変化してきたので(^^;)。ちなみに元ネタは某有名格闘ゲームの主人公…ってそのまんますぎるだろ!!
2020-09-02 10:31:11
>りうさん
了解しました。以後、そのようにさせて頂きます。 元ネタ・・・ 私のはちょっとアレですね、トヨタのカローラII WINDYのCMをしていた方の大ファンだった・・・ あ、今もか。
WIKIの主たる目的はWEBに散りばめられたり、過去に置いて来たFMTOWNSの情報を集約することです。
私は大した情報を持っていない(Oh!誌位?か関連図書)のですが、得られる情報は今となっては非常に大切なものですので感謝しています。
2020-09-02 10:40:50
Air Combat II Specialでユーザディスクを作成しようとしたら、CDDAを止めないままCD上のファイルを読もうとしてDrive Not Readyの無限ループが起こったのですが、どう見てもCDDAを止める気がなさそうだったんで、UNZで動作を見たのですが、ショックを受けました。CDDA止まってないのにユーザディスクができてしまうようです。別にエミュレータなので、この現象を再現するにはコマンドA0でCD演奏中のステータスを返さないことにすればできるのですが、そんなことが可能だったのでしょうか???
ただ、その後津軽で試したところ、実はユーザディスク作成しなくてもただのフォーマット済みディスクをAドライブに入れておけばキーのカスタマイズができるようなので、実はUNZはDOSの24Hを無視している(単にIRETしてるのかも)可能性もあるかもしれません。というのは、Emerald Dragonでフロッピーディスクにライトプロテクトをかけた状態でイベントシーンに入るとき、どう見てもDOSのINT 24Hに入って抜けられなくなるとしか思えないのですが、UNZだと抜けてくるんですよね。なおキーカスタマイズしたら普通に操縦できました。というわけなので、ランクをBに上げさせていただきます(^_^;)
デバッガからCDDAを強制終了するコマンドを追加して、CDDAが止まった状態でユーザディスクが作成できるか見てみようかな。
2020-09-02 11:17:03
元ネタに参戦すると、僕がFTOWNSにいた当時のハンドル名YS11は、自分のイニシャルが苗字を先にすればYSで、なぜか子供のころトイレの壁に貼ってあった学研か小学館の付録のポスターに「国産旅客機YS11」というのが出てたのがなぜか頭に残っていたので、そのようにしてましたね。あの辺から航空ファンになる片鱗があったらしい。今は、(セスナ172だけど)本当に機長になったので、山川機長 (英語のときは CaptainYS) にしてます。と、言うことを友達に言ったら、英語のPilot In Commandと機長は微妙に違うんじゃない?と言われましたが、でも、Pilot In Commandを訳したら機長で合ってると思うんですよね。ただ、CaptainとPICは違うので、CaptainYSは誇大広告だろうと言われるとその通りでございます。
2020-09-02 11:33:22
間違い。UNZでユーザディスク作ろうとしたとき既にキー割り当てが入ったディスクイメージに書こうとしたもんだからディスクがブランクでないというメッセージが一瞬出て消えてただけでした。ブランクディスクでやりなおしたらUNZでもやっぱりCDが入ってないというエラーが出ますね。やっぱり津軽もUNZも正しい動作をしてる気がする。CDDA鳴らしたままファイルを読むなんてできたのか!?とショックを受けたのですが、やっぱりできなかったようです。安心しました。
ユーザディスクは、どうもCDの\AC2\D1\CONFIG.KEY, DISKID, REPLAY1.DAT, REPLAY2.DAT, REPLAY3.DAT の3本のファイルをFDにコピーすればいいだけのようなので、想像として、マニュアルの他に一枚別紙が入っていてユーザディスクを作成するには、この5本のファイルをFDにコピーしてください、みたいなことが書いてあったとか、あるいは、いったんCDを開けて閉めてからユーザディスクを作成するようなインストラクションが入っていたとか、あるいは、「CDが入ってません」というエラーが出たら直感的に取る行動としてはCDを開けて閉めなおすという行動だろうから、結局みんなそうやってなんとかしてしまっていたとかそういうことだったのかも。実機でやってみりゃいいんだよな。
2020-09-02 13:05:00
>65 WINDY
まぁ、特にV-TOWNSに関してはいろいろ解析して最後にはTOWNSモード用のチューンナップツール(vttuneup)やらキーマップ変更ツール(elena)まで作ってしまったくらいなので。
vttuneupでも設定可能なスプライトのアレ(V-TOWNSでリミッターを解除すればスプライトが大量に表示できる件)は、富士通の技術陣がこっそり仕込んでいた機能がad hoc氏作のvtowns.com(ATモードからTOWNSモードを起動するツール)に隠しコマンドとして組み込まれていたものを1999/2/28…そう、忘れもしない初代TOWNS発表10周年の際に当時担当していたFTOWNSの週刊ダイジェストで触れたことがきっかけで、TOWNSカードのPCIコンフィグレーションレジスタを解析していた段階でどこを書き換えればいいのか自力で調べ、週刊ダイジェストで発表してから1年半くらい経ち、その他メモリサイズ設定等も発見して解析結果もまとまったので、改めてvttuneupとして発表したんですが、某pediaにスプライトの件の記載があることでそれを自分の功績と言わんばかりに上から目線で某匿名掲示板のTOWNSとはあまり関係ないスレに書きまくるのは困ります…本気で「てめーは何もしてないだろうが」と言いたいです。こういうのが多いから某匿名掲示板は困る…。
…って文章がグダグダだなorz
2020-09-02 13:13:13
>71(自爆)
あ、冒頭のWINDYさんの敬称が抜けてました。ごめんなさい>WINDYさん
2020-09-02 13:23:41
HCのHDDの中を漁っていたら新CRTCの適当な検証ツール(コマンドモードで新CRTCから出力するためのツール…でいいんだっけ(汁))が出てきたのでリンクしておきます。何の保証もしません(^^;
http://retropc.net/ryu/unz/tmp/RHG.C
2020-09-02 14:03:22
>69,70 山川機長さん
YS11は名機ですね、乗った事が有るらしいのですが2歳位だったので記憶に有りません。(見た事は何度も有り)
因みに私の部屋の壁にはB52のコックピットが貼ってありました。そのおかげ(?)でミリタリー好きで航空ファン誌も随分沢山買いました。
AirCombatIIは持っていますので実機で試す事が出来るかな?
問題はモデル2ではモニターの関係で24kHzが映らない(多分AirCombatIIは24kHzだと思う)のと、HCはCD-ROMが不良でCDから起動できるかが微妙・・・
あとは、FDDが動くか不安(前にやったときは何とか動いた)ですが、一度駄目もとでやってみます。
ひょっとして、CD-DA再生中にファイルの読み込みコマンドを送信したら、CD-DAの再生が中断またはキャンセルされるような動作なのでしょうかね。
>71 りうさん
あー、ホントだ。今気づきました! 全く問題有りませんよ。
元々本名が読みづらく、読み間違えられたり書き間違えられたりする事が日常茶飯事ですので、名前に関しては双方が認識するために必要な記号または音としか考えていませんので。
2020-09-02 14:09:07
りうさん、
なんと貴重な!ありがとうございます!参考にさせていただきます!
WINDYさん、
僕も当初MODE1READコマンドが出たらCDDAが止まるのかと思っていたのですが、その前の段階のコマンドA0でCDDA再生中をチェックしてエラーを返してしまっているので、MODE1READまで行ってない模様でした。コマンドA0に対してCDDA再生中のステータスを返すのは正しいはずで、こうしておかないと動かないタイトルもあったはずです。CRTCは、たしかに24KHzですね。とりあえず、津軽ではユーザディスク作成時はCDDASTOPコマンドで対応ができるので現実的は問題は無いですね。あとは、実はただのブランクディスクを入れておけば問題ないという可能性もあって、ユーザディスク作成しなくてもただのブランクディスクにキー割り当てを保存することができました。Air Combat IIはもう少し調査が必要のようです。
ちなみに、CD BIOSはCDDA再生中に別のREADコマンドなどを実行するとエラーになりますが、CD BIOSを経由せずに直接CDCにコマンドを送るとCDDAは止めて新しいコマンドを実行するのが正しいみたいです。
まだこちらでは確認していないのですが、マイクロコズムの動作確認にCDDAが始まった後でゲームを開始するとCDDAが止まらないとあるのは多分CDDA PAUSE/STOPコマンドを送らないでMODE1READを出してしまっているのだろうと思っています。津軽だとコマンドA0に対してCDDA再生中ステートを返さなければCD BIOSはCDのファイルを普通に読めるはずなのでそういうオプションを追加してみてもいいですね。
2020-09-02 21:19:56
>75 山川機長さん
AirCombatIIの実機動作の件、少しお待ち頂けますか?
先程モデル2でAirCombatIIを起動させて、モニターは映らないので音楽がなってからRETURNキーを押して音楽が変わってから↓キーを2回,ENTERキーでユーザーディスクの作成を見えない状態で行ってみたのですが、何かしらのエラーとなっている様でFDDのアクセスランプは1度点灯するのですがデータをコピーしている様子はなさそうでした。どういったメッセージが出ているかを確認しないとなんともならない様子です。(その時は、CD-DAから音楽を演奏しながらFDDのランプは点灯していました。)
HCは案の定CDからの起動は出来ない状態でした。
24kHzを表示できるモニターを実家or屋根裏からサルベージしますが、屋根裏のFMT-DP532は使っていた当時モニター無いからパチパチと時折音が出ていましたので使う気にはなれないので実家のFMT-DP8711を持ってくる方向で考えます。
2020-09-02 22:48:21
>76 WINDYさん
FMTDP8711は確か15kHz/31kHz/48kHz/56kHzの4モードスキャンなんでそれじゃ24kHzモードは映らないんじゃ…
2020-09-03 00:47:36
この間研究室から回収してきたコネクタなどを使ってMX稼働状態にしました!このMXは去年ヤフオクで落としたままテストもしていなかったもので、どのぐらいHealthyなのかわからなかったのですが、CD-ROMも生きていて内蔵HDも生きてます。が、ハードディスクにはOS以外何も入ってない模様でした。OASYSが入ってたからOASYS用に使ってたのかな?このディスクイメージ取りたいけどどうすりゃいいのかな。OASYSパーティションが生きているので貴重です!ディスクBIOSとRS232C経由でイメージ取るプログラム書けるけど192bpsでハードディスクイメージ転送っていつ終わるかわかんないし。RS232C経由でディスクイメージ転送するツールを作って、使ってないラップトップを一台数日がかりで送信する役割に充てようかな。多分1MBが1時間ぐらいとして、200MBだと、200時間!8~9日か。できないことはない。どっちかというと9日もMX連続稼働させて大丈夫かって方が心配。
それで、Air Combat II Specialですが、実機でも音楽演奏中にユーザディスクの作成はできませんでした。バグですね。ふたをあけてCDDAを強制的に止めることによってユーザディスク作成できました。これは、多分マニュアルの他に一枚紙がペラっと入ってたパターンではないかと思います。開発中はハードディスクから起動してて気が付かなかったとかですかね。CD-ROMに焼いた後のテストは既に作ってあったユーザディスクでテストしたから気が付かなかったとかいうパターンが想像できますが。実機での動作はふたを開けて閉めると、次にもう一度エラーが出てからユーザディスクが作成できますが、これはおそらくDisk Changedを見ているからと思います。津軽のCDDASTOP機能を使えばエラー無しでユーザディスクが作れるようです。CDDASTOPは今日の晩のリリースから(GUIからも)使えるようにします。
2020-09-03 01:18:07
ひらめいた!セクタの生データ読んでSCSI2SDのパーティションにセーブしたやつをWindowsに持って来りゃいいんだ!また今週末にも許可もらってSCSI2SD回収に行ってこよう。
2020-09-03 02:12:19
>77 りうさん
有り難うございます、あやうくデカい物を運んでくるところでした。
であれば、FMT-532しか無いですね。 しばらく使ってないから完全放電してるだろうし通電前に内部のクリーニングでもすれば大丈夫かな。
あとはFDDも調子が宜しくないようなので、ついでにクリーニングしようと思います。
2020-09-03 07:51:54
あ、でもAirCombatIIでの確認は出来たようなので急ぎではないものの、何時か必要になるのでそのうちやろう。
2020-09-03 09:53:25
新しいリリースをPUSHしました!今Githubがコンパイルしてくれてます(今終わったらしい)。なお、実験的にアナログジョイスティックをマウスにトランスレートする機能を追加してみました。Strike Commander, Wing Commander 2がものすごく操縦しやすくなって、Wing Commander 2ではおもしろいように弾が命中しました。ジョイスティックをちょっとぐらぐらっと動かすと有効になって、マウスを動かすとまたマウスが有効になるようにしたのでどっちも使えます。Wing Commanderはひねくれてて中立位置のマウスXYがコロコロ変わるので、どこに書いてあるのか解明してやろうと思ってます。Zキーを押すとマウス座標を中立位置に動かしてるらしいので、そのタイミングをつかまえるか、あるいは飛行中にマウス位置を読んでる箇所を特定すればそれに続いて中立位置との引き算をしているはずなので、見つけられるだろうと思ってます。
まだGUIには出してないですが、-FLIGHTMOUSEオプションです。
Wing Commander 2 -FLIGHTMOUSE 0 320 135 400 300
Strike Commander -FLIGHTMOUSE 0 320 200 400 300
みたいな感じで使えます。最初の数字がジョイスティックID、以降が中立位置、左右の移動幅です。どっちもApplication Specific Augumentationを有効にしてないとマウス座標を送れないので機能しません。この機能を有効にした状態でTowns MENUとか起動してジョイスティックをちょっと動かしてみるとどんな感じにトランスレートしてるか視覚的にわかると思います。
2020-09-03 10:47:33
>82 山川機長さん
マウストランスレートを試してみました、見違えるような操作感となり非常に面白い機能だと思います。
1点だけ余裕が有ればお願いしたいのですが、私のコントローラが少しボロいのかセンターで安定しない傾向がある事も要因ですが、センターに遊びが有れば少しのアナログ値のふらつきに敏感に反応しなくなるので、"-FLIGHTMOUSE 0 320 135 400 300 10"みたいな感じで設定できると良いかと思います。 ←の場合は10%
2020-09-03 23:09:44
おおなるほど!やりましょう!というか、やりました。今晩のソースでZero-Zoneが指定できるようになります。
2020-09-04 00:58:09
ハードディスクのサルベージ成功しました!必要なのは、津軽の環境の他にSCSI2SD(または相当品)と、動作可能なTOWNS実機です。詳しくは津軽のドキュメントに書きますが、
(1)実機上でイメージツール(ソースはひそかに既にGithubのtownsapp/hdimage/hdread.c)を使って、SCSI2SDのドライブにイメージをファイルとして保存。
(2)Win32DiskImagerなどを使ってSDカードのイメージをPCに読み込み。
(3)津軽にマウント
(4)津軽ファイル転送プロトコルを使ってイメージファイルを抜き出す
(5)つなげて終わり。
です。津軽ファイル転送プロトコルは、VNDRVで双方向のファイル転送が実現するようになったらそっちの方が手軽になると思われますが、とりあえず当面のつなぎとして使えると思います。CUIからしか使えませんが、コマンドで、
VM2HOST vmFileName hostFileName
というコマンドを打っておいて、VM上でこれもソースはgithubにある ftclient.exp を実行するとファイルが転送されるという仕組みになってます。Host to VMの場合はHOST2VM。これも、EXPファイルをgithubに出さないと使えないですね。そのようにします。
で、OASYSを起動してみようと思ったのですが、I/OにリセットをかけてHLTがかかって止まりました。そういえば、リセットボタンやI/Oによるリセットのシーケンスがわからなくて実装してないのですが、どうやったもんですかね。基本的に各デバイスにリセットかけてCPUの起動ベクトルに飛ばせばいいのかな?でもそれだと普通にTownsOSが起動してしまう気がする。
しかし、OASYSのイメージができたのは大きい。実家から回収してきたOASYSのフロッピーディスク読めなかったし。
2020-09-06 23:21:03
ついさっきPUSHしたソースで、ストライクコマンダー専用 -STCMTHR オプションをGUIにも出しました。これを使うとストライクコマンダー以外のアプリケーションではフルキーの1,2,3,...,0をアナログ軸を動かすことで入力できます。ストライクコマンダー以外にまったく使い道が思いつきません!
あと、バーチャルキーもGUIに出したのでパッドのボタンにキーを割り当てられるようになりました。RPGなんかで移動にパッド、他の操作にキーを使ってたようなやつには応用できる鴨しれません。これってUSキーボード使ってるときかな漢字変換キーに割り当てておくとテストに使えるという実用的な意味があることも判明しましたが。しかし、OAKを使ったことがあると今のMS IMEがあまりにも頭が悪くて日本語はTOWNS上でタイプしたくなってくる。というか、Windows 10についてくる最新版って、前のバージョンにはあったアルファベットと数字を常に半角に変換する機能が無くなってるのは英語版Windowsに日本語をプラスしたからなんでしょうか。あと、まったく学習しない気がするのですが。何度やっても僕が頻繁に使う単語を覚えないし。日本語版Windows 10だとここまで酷くないもんですかね。あまりにも日本語と英語が混じった文をタイプしづらいのでATOKを買ってしまおうかと思ってるのですが。ううう、富士通にはOAKだけ売ってほしい。
2020-09-09 09:43:18
>86
アップデート有り難うございます。-STCMTHRオプションは確かにニッチすぎる実装ですが、こう言ったオプションはある意味において可能性を示す無いようだと思います。
OAKは流石に今は有りませんが、OAKの後継としてはJAPANISTが有ります。2021年5月で終売,2026年6月でサポート終了です。
私はWINDOWS環境では頑なにMS-IMEとATOKを拒み、JAPANISTを使っております。使い心地はほぼOAKなのでこれを機に是非ー検討ください。
https://www.fujitsu.com/jp/products/software/applications/applications/japanist/
2020-09-09 09:56:39
リリース出しました!内容は、既にここで書いた通りですね。
ちなみにI/O 0020Hによるリセットに対応して、OASYSが起動しないか、と、思ったんですが甘かったですね。赤本だと0020Hに1を書き込むとCPUとFPUにリセットがかかるということですが、他にリセットするべきものがあるのかどうかですね。ただ、4A20:10E6でOUT DX,ALでリセット信号出して、次のバイトでHLTで、SYSROMのブートコードを通ってきてHLTの次のバイトにジャンプしてくるので、シーケンスは正しいっぽいです。でも、残念ながらその後エラーメッセージを出そうとして止まってますね。Windows 3.1も試しに起動しようとしてみましたが、Windows 3.1のロゴまでで止まりました。UNZってOASYSとWin3.1って対応してましたっけ?UNZでトライしてもCS:IPを見ると同じとこまでで止まってるっぽいので、イメージ化に失敗したかそもそもディスクドライブの内容が既に壊れていたという可能性もあるんですがね。明日 CR2032のソケットが来るのでMXのバッテリーを新しくしたら実機でどうなるかいろいろやってみるつもりです。
2020-09-10 09:03:21
>88
OASYSですが、うんづの掲示板に以下の様な書込が過去にあります。その後に動かないとの書込がないと言うことは動いたのでは?と思います。
https://8730.teacup.com/townsemu/bbs?page=24&
2020-09-10 09:49:54
おおなるほど!書き込みを見ると、OASYSパーティションからの起動にも対応すれば完璧、というような記述があるのでひょっとするとFD起動しか対応していない可能性もあるでしょうか。OASYS.EXEの動作を調べているのですが、多分OASYSのIPLと思われるコードをセグメント4A20H~に読み込んで、その中でI/O 0020Hに1を書き込んでCPUにリセットをかけているのですが(書き込み後HLT)、その後SYSROMは、HLT命令の次のアドレスにジャンプしてきて処理を続行するのでおそらくOASYSパーティションのIPLを読み込んで、正しい起動シーケンスが始まっている模様です。しかし、エラーメッセージが出るもののメッセージは完全に壊れているというとこで止まってます。今試している方は実機で起動を確認していないので、起動が確認できている昨日の晩にイメージ取った方でどうか、やってみます。FD再度見てみたのですが、カビがひどいんですね。多分読み込めないし、一応拭き取れる限りのカビは99%アルコールでクリーンしたものの、FDドライブに入れるのも不安という状況でした。
2020-09-11 21:46:32
いつぞや津軽のエミュレーションスピードに関して、リニアアドレス→物理アドレスのお話があったと思います。
PC-9821エミュレータであるSL9821のページ(http://www.satotomi.com/sl9821/)にある、技術的なはなしのなかで同様の事項が有りますが作者であるsatotomiさん工夫が紹介されています。
津軽のエミュレーションエンジンの構成まで見てなのでアレですが、毎回リニア→物理変換を行わずにセグメントごとに内部でキャッシュしておいて対応しているようですね。
2020-09-30 17:49:18
おおなるほど!ページングのキャッシュ問題はその作者さんとまったく同じ疑問を持ってました。キャッシュしたいが、CPUがページ有効にしたままページテーブルを書き換えてしまった場合に備えてページテーブルをモニタしたらキャッシュで得られるパフォーマンスがほとんど無になってしまう、と、思ったらなんかページテーブル書き換えたら必ずCR3に書き込む処理が入ってる、が、インテルの公式マニュアルを見てもCR3の書き込みが必要とは一言も書いてない、という問題です。実行中にばんばんページテーブル書き換えるのは、たしかフラクタルエンジンで見たと思いました。しかし98のアプリでも書き換えたらCR3を上書きする処理が入るということはインテルの公式文書のどこかにそういう注意書きが書いてあるのかな?あれも長いマニュアルだから端から端まで読んだわけではないですし。ページテーブルキャッシュ入れてみようかな。
2020-09-30 21:54:55
Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3 ですと、
4.10.4.1 Operations that Invalidate TLBs and Paging-Structure Caches に記載があるようです。
2020-10-01 05:15:18
なるほど!ということは、Page Tableの変更があった後に必ずCR3への書き込みがあると期待してもよさそうですね。そうだったらガバっとキャッシュを作ってしまうことで結構高速化ができそうな気がします。やってみます!
2020-10-01 09:29:43
>64 りうさん
towns_etcetra.zip内のIO.TXTに記載が有る、I/O 05E0h,I/O 05E2hのメインRAMウェイト制御レジスタはバイトデータでしょうか?
もし覚えていらしたら教えていただけませんか?
これって、モデル2が出て暫く後でメモリウェイトを少なくするソフト(AB.COMでしたっけ)で使ってた奴ですよね、随分とお世話になったなぁ
2020-10-02 18:13:17
>>94
手元にある80386のマニュアル(本)にも、ページテーブルキャッシュ(TLB)をクリアするには
mov eax,cr3
mov cr3,eax
しろと書いてありますね。ただし、不在ページはキャッシュに入らないので、不在ページが新たに存在するようになったときはcr3をロードしなくても良いとも書いてあります。
2020-10-02 18:44:28
津軽のCPUコアにページテーブルキャッシュ実装してソースをPUSHしました!感覚としては数%速くなったような感じがしますが、どんなもんですかね。クロック数をちょっと上げても着いてきてるような。Fractal Engine Demo、Megamorphのオートデモ、Microcosmのオートデモも走ることを確認したので正しく処理できていると思います。
最初単純に1M個のuint32_tにして、ビット1 (Present bit)が1のときは有効、0のときは無効にして、CR3に値が書かれるたびに全部ゼロクリアしたら妙に遅くなって、何事かと思ったらリアルモードに行ってプロテクテドモードに戻ってくるときにゼロクリアが発生してリアルモードのINTが出るたびに1M個のintがクリアされるという現象が起きてたので、カウンタをつけて、カウンタが閾値未満の場合はキャッシュ無効ということにして閾値を1プラスするだけでクリアできるようにしました。
2020-10-04 06:02:10
>97
今のところは数パーセントで上々では無いでしょうか。
他の機種の事情はよく解りませんが、TOWNSの場合はリアル←→プロテクトの切り替えがBIOSの関係で頻繁に起こるので効果が薄いのかも知れませんね。
最適化も充分にしていない状態でしょう、数パーセントの積み重ねが大事だと思います。
2020-10-04 22:47:08
>95 WINDYさん
基本的にI/Oポート 0x05E0~0x05F1は全てバイトアクセス前提で設計されていると思います。
ワードアクセスしてもあまり意味がないし、もし2代目以降で65535ウェイトなんて設定ができても誰も喜ばないので。
0x05E0,0x05E2,0x05E6あたりはまさにAB.COMで制御していたポートですね。懐かしい…
2020-10-11 14:17:31
現在ハイレゾモードでTowns MENUが使えるようにしたいと思っているのですが、りうさんのソースで解像度はなんとなくわかってきて、オフセットがわからないけど多分ハイレゾでスクロールゲームは出てなかったと思うからとりあえず無視するとして、色数の指定がどれだかわかりますかね?モードとしては、16色1024x768x2Layer, 256色1024x768x1Layer, 24bit 640x480x1Layerと32K色モードもありましたっけか?
なお、アナウンスしてなかった気がしますが、ひそかにMaximize WindowモードとAuto Scalingモードが増えてます。コマンドパラメータ、GUI両方使えます。
2020-10-20 10:06:23
>100 山川機長さん
ハイレゾモードではスプライトも使えませんし、そもそもゲーム目的と言うよりはWindowsでの対応を目的として実装された感じです。なお、Unzにおいてもスクロールオフセットは実装されていないので、ハイレゾモードでJ-TYPEが使えません。
あと、ハイレゾモードの画面モードは1024×768ドット16色、1024×768ドット256色(どちらも仮想画面は1024×1024ドット)、640×480ドットフルカラー(恐らく仮想画面は640×480ドット+余剰分)、512×384ドット32768色(仮想画面は512×512ドット)、640×480ドット32768色(仮想画面は1024×512ドット)があり、16色モードと512×384ドット32768色モードは2画面合成が可能です。
2020-10-20 16:54:09
引き続き貴重な情報をありがとうございます!赤外線スレッドでワイヤレスコマンダーライブラリがHigh-Cマルチメディアキットに入っていると聞いて、ひょっとしてと思ってドキュメントをgrepしたらハイレゾ画面モードについての記述も見つかったので、現状わからないレジスタはこれを使ってCRTC2に値を書かせてチェックしてみようと思います。多分スクロールさせることもできるので、単純にVRAMオフセットで実現しているのであればCRTC2のレジスタを特定して津軽で対応することも可能だと思います。
2020-10-22 01:19:57
リリース出しました。Amaranth3がプレイ可能になって、Splatter House等の1ピクセルずれる問題が直ってます。ハイレゾモード、16色2画面モードだけ対応したので、Towns MENUをハイレゾにできます。まだ半端なのでGUIには出してません。コマンドで-HIGHRESオプションをつけて起動するとハイレゾCRTCが有効になります。
32K色と256色モードは対応したいと思っているので、今どのレジスタが色数か探しています。とりあえず、基本的な画面モードでは、↓が違うようです。
640x480 32K色モード時 1024x768 256色モード時 1024x768 16色2画面モード時
CRTC2 Reg=0004 Value=00000002 Reg=0004 Value=00000002 Reg=0004 Value=00000002
CRTC2 Reg=0000 Value=00000001 Reg=0000 Value=00000001 Reg=0000 Value=00000001
CRTC2 Reg=0002 Value=00000000 Reg=0002 Value=00000000 Reg=0002 Value=00000000
CRTC2 Reg=0001 Value=00000000 Reg=0001 Value=00000020 Reg=0001 Value=00000022
CRTC2 Reg=0005 Value=00000100 Reg=0005 Value=00000100 Reg=0005 Value=00000300
CRTC2 Reg=0118 Value=00000103 Reg=0118 Value=00000102 Reg=0118 Value=00000101
CRTC2 Reg=011A Value=00000018 Reg=011A Value=00000018 Reg=011A Value=00000018
CRTC2 Reg=011B Value=00008000 Reg=011B Value=000000FF Reg=011B Value=0000000F
CRTC2 Reg=011C Value=00008000 Reg=011C Value=00000000 Reg=011C Value=00000000
なお、レジスタ116H,117Hがレイア0の、126H,127Hがレイア1のVRAMオフセットで間違いなさそうです。EGBでスクロールさせたらこのレジスタに値を書き込んでました。まだ津軽は対応してないですが、32K色と256色モードを解明したら対応したいと思います。フルカラーモードはその後ですね。でも、High-Cのマニュアルに使い方が載ってたので、テストプログラムを書いてハイレゾCRTCへの値の書き込みを調べたらなんとかなるかもしれません。引き続きEGBで違う画面モードにして違いを見てみようと思います。
2020-10-22 12:12:03
ハイレゾCRTCレジスタですが、りうさんのソースのコメントにあるもの以外の意味は↓のようです。
005H bit0:プライオリティページ bit8,9:表示ページ
006H bit1:VSYNC (TBIOSがハイレゾからなぜか抜けるとき&2が一度サイクルするまで待っている。)
116H ページ0表示オフセットX
117H ページ0表示オフセットY
11BH ページ0色数 8000H->32K-color, 0FH->16-color, 0FFH->256-color
126H ページ1表示オフセットX
127H ページ1表示オフセットY
12BH ページ1色数 8000H->32K-color, 0FH->16-color, 0FFH->256-color
それから、133Hのパレットですが、りうさんのソースではWordアクセス2回で設定していますが、32-bitアクセス可能のようです。TBIOSはOUT DX,EAXで設定していました。
Wink2のハイレゾ版が動くようになりました。256色、32K色は自分のテストプログラムしか試せるものが無いのですが、テストにいいようなアプリケーションてありましたかね?(画像フィルタ「がふぃる」というのを作ってOh!FM TOWNSに載ったことがあったような気がするからどこかにソースが残ってる鴨しらないですが捜索中です。)
津軽は次のソースからデフォルトでHigh-Res CRTCをEnableにする予定です。
2020-10-23 00:52:15
>104
256色、32768色ともにTownsPaint/Liteが使えるんじゃないかと思います(256色モードで使うにはアイテム登録時にパラメータを設定しないといけませんが、「お知らせ」の中にあるREAD4.DOCだったか何かに書いてあります)。
あと、256色の確認にはWINK3[波動版](簡単に言うとWINK2のセミハイレゾドライバ対応版)が使えなくもない気がします(宣伝、宣伝w)
2020-10-23 05:17:27
先ほど、高解像度モードのテストをしてみました(いちいちTsugaru_CUI.exeにオプションを付けるのが面倒だったので高解像度モードを強制的に有効にした(+いつものPCM調整)ものをこちらでビルドしました)。
その結果なのですが…
・1024×768ドット 16色モード
TownsMENU/WINK3[波動版]の1画面モード(レイヤ0のみ使用)においてはパレット設定を含めて特に問題なさそう
ただし、TownsMENUの壁紙やJ-TYPEのテキストは表示されない
・1024×768ドット 256色モード
パレット設定自体は有効。前半512KBと後半512KBの内容が同一になってしまう模様
だいたい上1024×512ドットと下1024×384ドットが同じ内容になる
また、MiVでは画面が崩れる(8ドットごとに互い違いの表示になる
・640×480ドット 32768色モード
だいたい1024×768ドット 256色モードと同様の傾向(上256ライン(多分)と下の残りが同じ内容になる)
MiVでは4ドットごとに互い違いの表示になる
・640×480ドット フルカラーモード
表示が崩れるので、そもそも現状の津軽では対応していない模様
また、16色モード以外同様に互い違いの表示になる現象が起こっている模様
・512×384ドット 32768色モード
TownsMENUの壁紙でテストしようと思ったが2画面モードを使用しているため表示されず
テストに使ったソフトは、
16色モード:TownsMENU V2.1L51(TownsSHELL V2.1L51),WINK3[波動版],J-TYPE,MiV
256色モード:TownsPaint/Lite,TownsPaintII,ViX,MiV,WINK3[波動版]
32768色モード:TownsPaint/Lite,ViX,MiV
フルカラーモード:TownsFullcolor,ViX,MiV
です。TownsMENUで壁紙が出ないのはおそらくまだ2画面モードに対応していないからだと思われます。また、ハードウェア拡大(0x0119/0x129?)にも対応していないようです。
ついでに…J-TYPEでは中解像度モードを含めてファイルセレクタは出るもののファイル名が表示されず、オプションパラメータでファイル名を指定するかパラメータを省略した場合は右クリックで終了するしかないこともわかりました。何が原因なのかは今のところ不明です。
2020-10-23 19:49:22
すいません、フルカラーにはそもそも対応していないとか1024×768ドット 256色モードの下のサイズ(正しくは1024×256ドット)とか、数点すっとぼけてましたw
あと、画面が崩れるMiVや2画面モードを使っているHEwinで追試してみたところ、オフセットは正常に効いていそうな感じです。
2020-10-23 20:09:09
早速テストしていただきありがとうございます!こちらも同じソフトで試してみます!
2020-10-24 02:45:38
J-TYPEを見てますが謎ですね。ディレクトリが表示されないのがなぜなのか調べようとしているのですが。これ、中解像度モードでも出ませんね。ディレクトリをストアしている場所の特定は割と早かったのですが、今逆アセンブルをたどってたどって、表示内容をREPNE SCASBしているところを見つけて先に進めたらなぜかEGBで文字列表示ではなくビットマップ表示に行きついてしまってがっくり来たところでした。間違った場所に書いてしまっているとかだったら書いてる場所を特定するのですが、文字列表示を呼んでない(本来発生するべき処理が発生してない)のは難しいパターンですね。さすがにJ-TYPEのソースなんてないですよね。まだ、最後の手段、実機で386DEBUGして動作比較という手は残っていますが。
2020-10-25 01:12:59
久しぶりにCPUのバグ鴨しれないんですが、
MOV EAX,DS
(逆アセンブルするとMOV AX,DXと表示するけどオペランドサイズは32)って、EAXの上位16ビットクリアするのが正解なんですかね?オペランドサイズにかかわらず上位16ビットは歩青んするように書いていたら、J-TYPEの中で、 MOV AX,DS CMP EAX,EBX JNE (Skip Drawing) というのがあって、字が出ないのはこの影響でした。むむむ、セグメントの比較だったら CMP AX,BX と書いてほしかった。ちなみに、いくらEGBの文字列表示を探してもだめなはずで、フォントBIOSを使ってビットマップを作ってビットマップ描画機能を使って描画してました。
というか、言ってる暇にテストプログラム書いて実験します。原因がわかったので多分なんとかなるでしょう。
2020-10-25 02:48:14
どうやら MOV EAX,DS は上位16ビットをクリアするべきのようです。386ASMは MOV AX,DS としないとエラーを出すので、上位ビットは残るような印象ですが、実際は MOV EAX,DS と MOV AX,DS は挙動が違うんですね。というわけで、J-TYPE高解像度版も動作するようになり、マウスカーソルが512を超えると0にラップされてしまう問題と、レイア1の内容がレンダリングスレッドにコピーされてなかった問題を解決して、J-TYPEは完全動作するようになりました。今晩のソースで使えるようになります。他のソフトもこれから調査してみます。
2020-10-25 06:07:15
ソースPUSHしました。とりあえず、J-TYPEとTowns Paint LiteとMiVは確認しました。WINK3ってフリコレ11にも見つからなかったんですが、どこかでダウンロードできますかね?なお、ハイレゾCRTCのシングルページモードの判定ですが、多分、レジスタ1のビット1のような気がします。一応ズームも対応したつもりなのですが、まだ試してないので間違ってるかもしれません。フルカラーモードですが、EGBでは対応してないんですね。今からHigh-Cのドキュメント読んで勉強します。ところで、MA/MX世代より前の機種用のフルカラーカードって刺すと高解像度も出るようになったんですかね?ハイレゾVRAMを持ってない機種に1MBのVRAMを搭載するカードのような印象を受けたのですが。
2020-10-25 10:04:31
一応、フルカラーモード対応したソースもPUSHしました。EGBはフルカラー非対応とマニュアルには出てるのですが、画面モード22番が一応非対応だけどフルカラーと書いてあって(なんだそりゃ)、試しに使ってみたら普通にフルカラーモードになりました。フルカラーモードはレジスタ11BHの値がFFFFFFHですね。なぜかFGSライブラリはフルカラーモードに入ることが出来なかったのですが、多分何か使い方が違うのだと思います。FGS_init2にドライバがインストールされてないと言われますね。Towns MENUの設定ではフルカラーにチェックを入れたのですが。
2020-10-25 13:59:13
>112,113 山川機長さん
WINK3(WINK[波動版・セミハイレゾ対応・MSV対応])はフリコレが発行終了した後に作られた(というか、作った)ソフトなので、フリコレ11にも収録されていません。下記のリンクよりダウンロードできます。
http://retropc.net/ryu/unz/lib2.htm
あと、フルカラーモードを含めた高解像度CRTCのEGBでの画面モード表をどこかで見たような気がするのですが、見つかりませんでした。記憶違いかもしれません。
2020-10-25 17:29:24
>112 山川機長さん
114で書き忘れましたが、フルカラーカードは単純に本体と独立したVRAMを持つフルカラーモード専用(と考えていいです。実際には640×480 256色+32768色2画面モードもあるっぽいですが)のオプションカードです。専用NSDD(TownsOS V2.1L30の時点ではMX/MAの本体フルカラーにも対応していますが)経由で制御し、TownsFullcolor V1.1L10ではフルカラー画像をフルカラーカード側から出力させ、その他のGUIまわりは本体側から出力させて、映像信号をフルカラーカード側でスーパーインポーズすることによって処理しています。
ハイレゾモード対応を含めたものというと、アップグレードカードのほうになると思います。実物を持っていないのでどのような挙動をするのかは不明ですが(秋葉原で中古がたたき売りされていたときに入手すればよかった…)、Oh!誌に掲載されていた写真のチップ点数を見る限り、本体VRAM 512KB(スプライトRAM含まず)+カード上VRAM 512KBの合計1MBでMX/MA/HA/HB/HC同等の新画面モードが使えるようになるっぽいです。もちろんOS(TBIOSやWin95のドライバ)側の対応は必須ですが…
2020-10-25 17:40:17
新バージョンを試してみました。
どうもCRTC2のレジスタ0x0000 bit0はCRTC切り換えとはあまり関係のない機能のようで、これを有効にしているとこちらで確認した範囲ではMiV、TownsOS標準の「システム設定」、EGB_MF.BINを組み込んだ状態のTownsMENU(TownsSHELL?)等でウインドウサイズが1024×768ピクセル分に広がって何も表示されないという現象が発生しました。
そのあたりをこちらで手直ししたもので調べてみた結果、フルカラーモード対応は当然として(TownsFullcolor,MiV,ViXで確認)、前回のバージョンにあった表示異常(1画面モードで映像がおかしい、MiVで互い違いの表示になる)も直っていましたし、J-TYPEやTownsMENUが使用している2画面モード、MiVやTownsMENUが使用しているハードウェア拡大も問題なく、概ね良好と言った感じでした。
現状の津軽は、CRTC2対応に関してはUnzよりいい感じです。
2020-10-25 19:02:32
早速テストしていただきありがとうございます!レジスタ0の切り替えは問題ありのようなので、無効にしておきます。ちなみに、なぜそうしたかというと、画面モード22番を一度使ってしまうと、プログラムを終了してもTowns MENUがHigh-Res CRTCを有効にしないという問題が出たからなのですが、そういう理由で22番は公式に非対応なのかもしれないし、あるいは、別の何かを僕が見落としてるのかもしれません。
しかし、秋葉原で中古がたたき売りのときに買えばよかったものはたくさんありますね。レトロゲームとかカゴで500円とかで売ってた時に買い戻しておけば良かったと後悔してるものがたくさんあります。今日もヤフオクでFM77AV専用Dig Dugが18000円とか値段ついてるし。
2020-10-25 22:16:19
FM音源のエミュレーションにかなり自信が出てきたので、Emerald DragonのBGMに「チリチリチリチリ」というノイズが出るのをなんとかしようとしてるのですが、、、、
XBOX Liveで録画したやつからMP3を抜き出したところ、MP3化でなまってしまうのではっきりとはわからないものの、どうやら20msのセグメントごとに最低でも2サンプル (2/44.1K秒=45us) 程度の隙間ができているらしいということがわかり、WAVE作成にどのぐらい時間がかかっているのか計ってみたら150~300us程度かかっていました。WAVE再生が終了してからWAVE作成していたので、45usをはるかに超える隙間がここで発生していたとわかったので(ということはDirectSoundは最後の100usぐらい残ってるのに終わったと言ってる?)、ここをダブルバッファにすればギャップを詰められるはず、と思ってやってみたけど、チリチリノイズが取れない。。。。
Strike CommanderもSuper大戦略もDinosaurのオープニングもそんなチリチリノイズは聞こえないのに、なぜだっ!?しかも、このギャップの出方はCPUのスピードを下げれば小さくなるはずなのに、4MHzまで下げても変わらんし。
Windowsだけで良ければStreaming Modeを使えば多分聞こえなくなるんですがね。macとLinuxも対応しておきたいし。並列化も考えたんですが、オーディオ関係はそのスレッドにまとめないと多分だめで、FMとPCMだけ別スレッドはできないと思うので、かなり複雑になるわりに得られるパフォーマンスは20000usに対して150~300us。2%にも満たない上にMutex Lockを使ったらもっとゲインは下がるはずなのでその意義は無さそうなのでやめました。エミュレータって並列化でパフォーマンス上げるの難しいですね。
2020-12-25 05:36:02
>118 山川機長さん
問題のチリチリ音ですが…FM音源だけの再生ならあまり気になりませんが、PCM音源も同時再生すると音色によっては確かに気になります。
その他、PCM音源のループ再生でチリチリ音が目立ったり(音声モードだとより顕著です)、音声モードの再生後等に本来無音であるべきところで謎の音(周波数が低めの矩形波っぽい?)が1~2秒間ほど発生し続ける、という現象も確認しました。
あと、現在の津軽弁の状況ですが、「誰得MSVディスク Vol.1」(仮称)収録予定のPSG物の発音がUnzに近い感じになっていて改善されていると感じました…が、MSVドライバでの再生中断で余計なRelease音が残ったり(しかも長め)、FM音源 Ch.3の効果音モードでよく使われるスロット単位でのKey On/Key OffやMSVドライバに搭載されている疑似リバーブ機能で使われているKey Off時にTotal Level(というか音色パラメータ全般?)の変更が反映されないっぽいなど、YM2612(or YM3438/YMF276-M/FH1024D)をTBIOS配下(レジスタへの直接アクセスは除きます)で使っている場合は全く問題にならなさそうな点ですが、まだまだ課題は多そうに感じます。まあ、FM音源 Ch.6のDACモードはそれほど重要ではないと思いますが…。
2020-12-27 14:56:54
Strike Commander Plusもクリア確認しました!
> りうさん
リリースが残る現象は僕もちょっと気になってました。Strike Commanderで着陸後、BGMが途切れた瞬間、トーンが残る感じで。Super大戦略の音を直したとき、前のトーンの途中で新しい音がKeyOnになった場合、前のトーンのレベルからエンベロープが始まってることに気づいたので、その修正を入れた後のように思います。スロット単位のKeyOn/Offはもう間もなく対応できるところに来ているので、そちらの方は間もなく対応してみます。(現在全部オンオフしか対応してない)。Ch.3の効果音モードも、F-NUMとBLOCKを別なとこから持ってくればいいだけのはずなので、対応してみます。DACモードは、ちょっと難しいかもしれないですが、DACモードって書き込んだ値がそのまま出力のボリュームになるのかな?
2020-12-28 02:22:50
>120 山川機長さん
Free386の386SX勝手対応やらメモリサイズ認識部分の書き直しやらなんやらで遅くなりましたが。
DACモードはレジスタ2BhのMSBでEnable/Disableが切り替わり(80hでEnable)、レジスタ2Ahに対して書き込まれた8bitデータが80hを±0として00h~7Fhはマイナス値、81h~FFhはプラス値として出力されるようです(何やらレジスタ2Chでビット数が拡張できそうな情報もありましたが)。
また、DACモードのPanpotはFM Ch.6のAlgorithm/Feedback情報が書かれているレジスタ1B6hの上位2bitで制御可能です。これはメガドライブ(Genesis)では当然のように使われた機能ですが、TOWNSで使われた例は片手で数えられそうなほどしかないのですが…。
2020-12-28 02:39:30
>りうさん
おおなるほど!GenesisのマニュアルはPDFが出回ってますが、PCMという記述があって、YM2612にPCMは無いんでないの?と、思っていたのですが、たしかZ80をYM制御専用にひとつ積んでたように思うので、このDACを使ってたんですかね。と、書き込む前に自分で読んでみろという感じですね。読んでみます。
あとチリチリノイズですが、確かに、言われてみるとPCMとFM両方使ってるときに出る気がしますね。ということは、実はDirect Soundでふたつのチャンネルを再生してるのが原因なのかな?だとすると1チャンネルにするとノイズは取れるのだろうか。
2020-12-28 11:03:51
>122 山川機長さん
メガドライブ(Genesis)の音周りの設計については、20年ほど前にXM7原作者のPI.さんのサイトにも載っていました。
YM2612のPCM(ただのDACモード?)はポーリングする必要があるため、メインCPUである68000での制御には向いていないので、Z80Aから制御した方が音質的にも有利です。ただ、実際のところ、メガドライブ(Genesis)でYM2612のPCMの性能をある程度活かせたソフトはあまりなかったりしますが(大抵は風邪声)。
2020-12-28 13:00:42
リリース出しました!FMとPCMをひとつのチャンネルにまとめたところ、Emerald Dragonで出ていたチキチキノイズが無くなりました。
> りうさん、
現在、一部スロットだけのOn/Off機能を追加してみて試しています。リリースが残る問題を調べているのですが、YM2612って強制的に音を止めるレジスタなんてありましたっけか、と、書いている途中でひょっとして発音途中にRRを書き換えてるとか?と、思ったので実装してみます。うーん、しかしリリースが残る問題は、僕の環境ではStrike Commanderで着陸後ぐらいしかこちらで出てないんですよね。仕方がない、もう一周飛ぶか!(喜んでる)
と、思って読み返してみたら、
Key Off時にTotal Level(というか音色パラメータ全般?)の変更が
ああ!これはKey 「On」時にTotal Levelを変更してるんですね!なんか脳内でつながりました。やってみます!
2020-12-30 07:38:53
Strike CommanderでReleaseが残る現象解明できました!着陸して停止すると、BGMを止めるためにまずキャリアスロットのTLを126にして、その後キーオフしてるんですね。まずKeyOnの状態でのTL、RRの書き換えに対応したのですが、それでもまだリリースが残り、なんでかと思ったら、TLを126にしてからキーオフの間に一度もWAV生成が無かったので、直前の出力がまだTL更新前の出力レベルを元にしていたもんで、大きな出力レベルからリリースが始まってしまっていました。厳密には正しくないのですが、リリースに入った段階で最後の出力レベルがピーク出力を上回っていた場合はピーク出力に丸めるようにしました。リリースが残る現象はこれで解決したと思います。あと、リバーブも対応できているのではないかと思います。しかし、案外みなさんLFOは使わないんですね。ソースは先ほどPUSHしました。
2020-12-30 10:58:38
すんません、リリースが残る問題、直ってませんでした。今PUSHしたソースだと本当に直ってると思います。Strike Commanderは修正前から着陸後に「ツーン」というトーンが残る場合と残らない場合があったので、昨日テストしたときはたまたま残らなくて直ったと思ってたみたいです。
2020-12-31 01:24:53
Windows 3.1が行き詰ってますが、BRANDISHのマウスインテグレーションに対応したやつをリリース出しました。-APP BRANDISHオプションをつけると、486問題も一緒に解決するようにしたので、このオプションがあれば-PRETEND386DXはつけなくても走ります。D77形式イメージを作るとゲーム開始できることは確認しました。それと、富士通Air Warrior V2.1 L10のジョイスティックとスロットルインテグレーションも対応しました。-APP AIRWARRIORV2 を追加して、あとはWing CommanderとかStrike Commanderとかと同じようにジョイスティックの軸を指定すれば動くはず。オプションでRS232CをTCP/IPにリダイレクトする機能を追加しようと思ってるので、それができたらクロスケーブルによる直結対戦機能ぐらいは使えるようになりそうです。
2021-02-03 12:14:20
Wizardry Bane of Cosmic Forgeを試してみてるのですが、ハードディスクにインストールができないのですが、だれか成功した人いますか?フロッピーから起動するようにすればプレイには支障なさそうですが。デバッガでインストーラをざっと見てみたのですが、INSTALL.EXPに入ってから、INT 21Hでドライブ構成もチェックしている様子もなく、INT 93Hが出ている様子も無いのですが。RPGはクリア確認しようと思うとちょっと腰を据えてかからないとエンディングまで行けないのがつらいですね。それはシューティングゲームも同じだろうという話もありますが。いや、シューティングゲームの場合、腕さえあればかかる時間は短いはずですが、僕の場合シューティングゲームはあまり得意では無いですね。シューティングゲームはステートセーブができるようになったらある程度行けるかな。
2021-02-07 06:33:30
FM TOWNSの立ち上げから事業を牽引し、TOWNS現役時代には社長として手腕を発揮された富士通元会長の関澤義氏が1月20日に逝去しました。
https://pc.watch.impress.co.jp/docs/column/gyokai/1305033.html
自分のサイトにも文章を載せましたが、パソコン事業に於いても「柔の関澤」という表現がしっくり来るほどFM TOWNS時代のソフト開発者のバックアップ施策は強力で、TOWNSは個人市場・文教市場に於いて一定の支持を受け、ベンダーフォーラムからユーザーフォーラムへと移り変わったFTOWNSも1フォーラム体制となってしまった1998年4月から2004年9月まで継続して運営されてきました。
関澤氏の逝去を受け、ご冥福をお祈りすると同時に、自分も前任の故・山本卓眞氏がごく初期から携わっており、関澤氏にDNAが受け継がれたFMシリーズに縛られ続けるのももうやめようと思います。
…駄文ですいません。
2021-02-08 12:14:36
りうさん、
その記事、僕も見ました。FMシリーズをリードしてきた人たちが去ってゆくのは、仕方のないこととはいえ、寂しいですね。
そうですね、FMシリーズに縛られるように感じるかかわり方は健全では無いですね。
僕はFMシリーズでプログラミングを覚えて、そのおかげで今の自分があるので、あくまでも余力の範囲ですがFMシリーズに恩返しをしたいと思ってやってます。もしも自分の力が役に立つならば、FMシリーズの文化を後世まで残すことに何かの貢献をしたいと思っています。
そして、FMシリーズ動態保存プロジェクト、津軽プロジェクトは本業の方にもフィードバックできてることも少なくないんですね。研究業の方にはあまり役に立ってないのですが、プログラミングの授業ではいろいろネタになります。りうさんにも多くのヒントと助言ををいただいて、YM2612のエミュレーションをかなり改善できましたが、それを使ったMML再生ライブラリを作ったので、学生さんに使ってもらおうと思っています。自分はMMLで音楽を演奏するのが楽しくて時間を忘れて楽譜をMMLに変換して演奏したもんでしたが、最近C++で同じことをしようと思っても手軽に使えるものがありませんでした。津軽の副産物でライブラリを自作することができたので、何人かでもこれでプログラミングが楽しいと思ってくれる学生さんが出たら大成功です。これも、ある意味FMシリーズから僕がもらったようなもんです。
数年前、実家で眠っているFM-7とFM TOWNS 2Fを見つけたときは、古い友人と再会したような感動がありました。今は、主力PCの後ろにMXがあって、いつでも電源を入れることができるようになっていますが、気分としてはまさに旧友が後ろに座ってるような感じです。古い友はときどき疎遠になるときがあっても、再開するときはうれしいものです。
りうさんも、FMシリーズのコンピュータと、旧友のような付き合い方ができると良いですね。
2021-02-08 14:06:49
りうさん
何にしろ、縛られるのは宜しくはないですね。
とは言えいい年の人間となると何かに影響され、刺激を受け、ある意味縛られて人生を歩んできたのは誰しも同じだと思います。
「ここまで来たらトコトンやってやりゃ~」と思うも良し、「ここから方向転換だ」と思うも良し、りうさんには是非、「縛られているのではない,自分で選択しているのだ」と思って頂きたいと思います。
2021年現在、縁があって故障したFM77AV40SXが私の足元に有ります。
当時欲しくても買えなかった奴なんですが、30数年ぶりに所有する夢が叶ったので、こいつを修理して再稼働させるのが近々の夢になります。
(富士通はスローガンとして「夢をかたちに」を掲げていますが、まさにそれですね・・・ 良いスローガンだ)
2021-02-09 13:28:47
MacOSバージョンもあるとのことで試してみましたが、起動画面から文字化けが起きたり、いくつか試したアプリ(Lunatic Dawn II、Ultima Trirogy)は全部正常に動作しませんでした。
MacOSのバージョンやCPU、GPU等の環境によっても動作したりしなかったりということはあるのでしょうか?
ちなみに2019年のMBP16インチ、Corei9のRadeon Pro 5500MのモデルでOSはCatalinaの最新版です。
2021-03-12 15:23:58
ktr0084さん、
こちらでは、2014年モデルのmac mini、Catalinaの10.15で試しています。古いバージョンのmacOSでは音が出ないかもしれないという問題がありますが、実行できないというのは今のところまで他には報告は上がってないですね。GPUにはビットマップイメージを転送しているだけなので、文字化けなどは関係ないと思います。起動画面はTOWNSのロゴが出るものの画面下のメモリテストなどのメッセージが文字化けする状態でしょうか?Townsシステムソフトウェアの起動はできますか?それから、使用しているROMはどの機種のものを使っていますか?せっかくなのでぜひ使っていただきたいと思います。以上の点についてお知らせいただけるでしょうか?
2021-03-13 02:04:03
山川機長 ID:wZWNkNzg2 さま
お返事ありがとうございます。
ルナドンに関しては、システムディスクをAドライブに挿入していなかったための様で、今の所ちゃんと動いているようです。
失礼いたしました。
ウルティマトリロジーに関しては、この様な感じでTownsMenuが起動した時点でところどころ文字が化けております。
https://imgur.com/a/ko0Xtmk
ゲームを立ち上げても、こんな状態です。
起動画面でも、メモリテストとTownsロゴの間に謎の化けた様な記号が表示されております。
ROMに関してはMAのものを使用しています。
2021-03-14 17:02:13
ktr0084さん
FMT_FNT.ROMが正しく吸えていないか、Mac版に不具合があるかのどちらかでしょうか。
TerminalでFMT_FNT.ROMのあるディレクトリで以下のコマンドを実行するとどうなりますか?
正しく吸えていれば、アルファベット大文字Vの字形に相当するダンプが表示されると思います。
dd if=FMT_FNT.ROM bs=1 skip=253280 count=16 | xxd
(Mac環境は持ち合わせていないため、一般的なUNIXコマンドの組み合わせで書いています
xxdが使えなかった場合は、hexdumpやodなどをお試しください)
2021-03-15 03:37:01
TownsOSのEUPプレーヤーの最上段にあるメニューの操作ができません。
カーソルのの上への操作ができないようです。
MIDI音源のエミュレートもできたら嬉しいです。
Niftyの資産も活用できそうですし。
またmacOS版でのゲームパッドが当方では操作できません。
Logicool Gamepad F310とELECOM JC-FU2912Fを持っています。
macOSで操作できるゲームパッドはないのでしょうか。
2021-03-16 00:25:42
ktr0084さん、
スクリーンショットありがとうございます!これは、確かに派手に字が壊れてますね。しかし全角の「Towns MENU」「ファイル」「ディスク」「金」など読める字もあるようですね。ということはANKフォントが読めてないのかな?こちらで同じ現象が再現できないかやってみます。
nanさん、
こちらも確認してみます。MIDI音源は、現役で使ってたころもMIDIカードを持ってなくてMIDIそのものの知識が無いので僕がすぐにサポートするのは難しそうです。
macOSのゲームパッドなのですが、非常に困難な点があって、AppleがごっそりゲームパッドAPIを変更してしまって、新しいAPIで対応しているゲームパッドが一握りという状況になってます。が、僕は Elecom の JC-U3312SBK が最後に確認したときは使えていました。ただし、モードをデジタルモードにする必要があります。最新の macOS で確実に利用できるのはAppleが認証した(高額な) Bluetooth Gamepad だけのようです。それ以外は運が良ければ使えるという感じで。困るのがフライトシミュレータ用の操縦桿とか新APIではごっそり使えなくなったんですよね。一応、セキュリティのオプションの変更で古いゲームパッドやジョイスティックAPIを使う方法もあるらしいのですが、いつまで使えるのか。。。。
なお、互換MSDOS.SYSですが、INT 21H AH=4BH (Load or Exec) を自作コードで置き換えに成功しました!この機能の実装が一番困難だろうと見ていたので、自己完結型のFM TOWNSエミュレータに向けて大きな一歩と自分で思ってます。とりあえず、Towns OS V1.1L10~V2.1L31のGUIは動いて、あと、AfterburnerとかRayxanberとかMicrocosmとかWing Commanderのオープニングとか我がAH=4Bから起動できています。いろいろ勉強になって、デバイスドライバの中身は.COMだと思っていたのですが、EXE形式のデバイスドライバもあるんですね。TOWNS.SYSとかOAK1.SYSとかそうなってました。あと、DOSはEXEとCOMを拡張子で見分けてるのかと思ったら、内部的にはとりあえず最初の1Ahバイト読み込んでみて判断してるんですね。しかも、64KBを超える非EXEファイルを与えられると、とりあえず64KBは読み込んでみるという習性があるらしく、Towns OS V1.1 L20, L30はこの試し読みが無いとSHSUCDXが壊れたRドライブのセクタをキャッシュに入れっぱなしになってアプリから復帰できないとか。MSCDEXだとキャッシュFlushコマンドが対応してるのかもしれないですが。
ぼちぼちCOMMAND.COMが心配になってきてますが、COMMAND.COMはCで書けそうですね。どこかにLSI-C試食版を保管してあったはずなんですが。一応High-Cでもできるのかな? ただ、これはMSが公開してるMS-DOS V2.0用COMMAND.COMに手を加えてなんとかできないかということも考えてます。MITライセンスだったと思ったので、これが動いてくれれば一番手っ取り早いですね。しかし、力尽きたら「誰かCOMMAND.COM書いてーっ」って叫ぶかも。FreeDOSのCOMMAND.COMが分離しててくれたらよかったんですが。
2021-03-17 02:52:28
山川機長さま
お返事ありがとうございます。
macOSで使用するゲームパッドですが、未だmacos Binaryでは操作できません。
しかし、Windows 7のエミュレートならwindows Binaryを使って操作できます。
VMWare Fusion使用 [Windows7]
Logicool Gamepad F310はアナログ・デジタルとも使えます。
イメージファイト起動後も切り替えられます。
ELECOM JC-FU2912FはCD-ROM起動前にデジタルモードのボタンを押して起動すればできますね。
どちらもWindows7を立ち上げてからUSB-Aの抜き差しでゲームパッドをFusionに切り替えてから
Tsugaruを操作することになります。
以上です。わかっている範囲で報告しておきます。
Apple 2013 MacBook Pro 15 macOS 11.0.1 使用しています。
2021-03-17 10:55:00
>137 山川機長さん
COMMAND.COMの件ですが、クロス開発ですと「OpenWatcom」がDOSバイナリを吐けるので使えそうな気がします。
オフィシャルはバージョン1.9で止まったままですが、GitHubでV2へのフォークが存在します。
また、バイナリのダウンロードはオフィシャルを含めて下記から可能です。
http://sourceforge.net/projects/openwatcom/files/current-build/
2021-03-18 15:13:51
Kasanovaさん作の互換FMT_SYS.ROM (ちょっとデバッグ) + YSDOS.SYSとSHSUCDXと本体のCOMMAND.COMで作ったFMT_DOS.ROM で、Towns OS V1.1 L20, L30, V2.1 L20,の起動に成功!!多分AH=46HをサポートするとTowns OS V1.1 L10も多分起動可能になりそう。 V2.1L31はなぞの INT 21H AH=FFh が発生してて、原因調査中。まだ使えるレベルではないですが、この週末にはソースを公開できそうです!
2021-03-20 11:31:38
YSDOS.SYS公開しました。津軽でも使えるようにしたバージョンのKasanovaさん作のFMT_SYSも同じレポジトリでメンテしていきます。
https://github.com/captainys/TOWNSROM
一応いろいろ実験するためにコマンドモードが使える方が便利なので、今、AH=0AH (GETS)を実装してます。難しいかと思ったら、考えてみたら完璧にする必要もないので、実験のためには似た機能が実装できればいいんですね。これができたら次はCOMMAND.COMですね。COMMAND.COMの機能はほとんどCの基本関数で書けそうなんですが、なんだか最初に起動するCOMMAND.COMには環境変数用セグメントが割り当てられてないんですね。だけどSETコマンドは使えてるわけで、このへんどういう扱いになってるのか解明できたらCで書けそうな気がしています。
2021-03-21 07:39:21
あ、ひとつ書くの忘れてた。YSDOS.SYSですが、なんと、
「オールマシン語」
です(w)
2021-03-21 07:55:17
えっと、Towns OS V2.1 L20が起動可能なCOMMAND.COMできました。まさか一日でここまで来れるとは思わなかった。
まだGOTOとかIF ERRORLEVELとかサポートしてなくて、環境変数とか%1 %2とかの代入もできないので、AUTOEXEC.BATから直接起動するものしか実行できない(Towns MENUからダブルクリックとか)ですが、とりあえずソースだけアップロードしました。LSI-Cの環境を作ってしまったのでLSI-Cで書きましたが、ちょっとインラインアセンブラがいまいちなのでWatcomCも検討したいと思います。大学で探せばBorland-Cぐらい見つかりそうですね。なお、DOSのINT 21H AH=4BHは拡張子が.COMでも中身が.EXEならEXEとして実行する性質がある(元がそうなってたから互換YSDOS.SYSもそうした)ので、COMMAND.EXEなのですが、拡張子をCOMに変えることで使えるようになってます。
それで、フォントが心配になってきてるんですが、一応、りうさん作のフォントジェネレータを使うか、あるいは、僕も津軽を書いてるときにコードの対応は解明したので、とりあえず津軽GUIからフォントファイルを作成できるようにしようと思います。が、できればフォントもフリーに使えるやつから生成してすぐ使えるパッケージ作れるといいんですけど、最近だとフリーフォントとかっていいの無いですかね。
2021-03-22 09:49:56
ついさっき、Kasanovaさん作のSYSROMを拡張して、キーコンビネーションF0、あるいは、REIPL A: でフロッピーディスクからの起動ができるようになりました。とりあえず、Towns OS V2.1 L20でシステムの複写をしたFDで起動、Super大戦略の起動からゲーム開始まで確認しました。本体を持ってない人、持ってたけどROMを抜き出す前に実機が動かなくなってしまった人も、正々堂々津軽でゲームしていると表明できる寸前です。安定してきたら津軽に標準搭載する予定です。多分UNZでも使えると思うのですが。githubにはまだコンパイルしたROMファイルは上げていませんが、もうすぐアップロードします。ソースはついさっき上げました。
OAK0.SYSが、「この機種では動作しません」と言わなくなった反面、FMT_DIC.SYSが空な影響か、かなをタイプしようとするとクラッシュするんですね。これどうしようかなあ。一単語だけ登録したユーザー辞書とか書いといたらなんとかならんもんだろうか。YSDOS.SYSがファイル名を判別してOAK0.SYSだけインストールしないことにするという手もあるのですが。
2021-03-26 07:10:57
とりあえず、そのまま利用可能な FMT_DOS.ROM, FMT_SYS.ROMをアップロードしました!
https://github.com/captainys/TOWNSROM/blob/master/FMT_DOS/FMT_DOS.ROM
https://github.com/captainys/TOWNSROM/blob/master/FMT_SYS/forTsugaru/FMT_SYS.ROM
https://github.com/captainys/TOWNSROM/blob/master/FMT_SYS/forUNZ/FMT_SYS.ROM
テストしてないですが、多分UNZでも使えると思います。
実機を持ってる人が使う意味はまったく無いのですが、実機持ってない人も合法的に利用できる環境を作っておくことは意義があると思います。よかったらお試しください。
書いてみて気が付いたんですが、DOSのデバイスドライバって実際書き込んでみるまでDisk Write Protectedを検出できないんですね。YSDOS.SYSではいくつかの機能で現在Drive Not ReadyとDisk Write Protectedをうまいこと検出する方法が見つからなくてどうしようかと思ってます。なお、-BOOTKEY F0でFD起動できます。
それから、Towns OS V1.1 L20のMENU_DRVにはまだバグがありますね。
0A7E:0000480F FF0E5E42 DEC WORD PTR [425EH] <- 多分CS:[425Eh]
ここでDOSセグメントの425Ehを破壊してしまうのですが、もともと入ってるMSDOS.SYSはたまたま使わないバイトで助かってるようです。
2021-03-28 09:47:46
https://github.com/pinterior/FMT_FNT.ROM
BDFフォントからFMT_FNT.ROMを作るスクリプトを書いてみました
Github ActionsでPublic Domainな東雲フォントからファイルを作るようにしています(IPAフォントがライセンス的に使えないため)
いわゆる機種依存文字、グラフィック文字、8x8, 6x12, 20x20フォントなどまだまだ足りないものは多いですが、こういう方法でどうでしょうか
2021-03-29 04:16:26
> pinさん、
おお!すばらしい!試してみます!ありがとうございます!機種依存フォントなどはこの際仕方ないかと思います。
今日は朝からTowns OS V2.1 L20をハードディスクにインストールできるようにするべくデバッグしていて、ついさっき、インストールできるようになりました。インストールしたシステムは、MXのROMを使って起動できることを確認しました。(副産物で津軽のデバッガにブレークポイントのパスカウント機能とFOPEN/FCREATEで特定ファイルにアクセスしようとしたときブレークする機能が増えた。)また互換ROMではハードディスクからの起動はできませんが(REIPLでも無理)SCSIアクセスのアセンブリコードはIPL開発のときに書いたものをNASMでアセンブルできるバージョンを作ったので、時間の問題でハードディスク起動もできるようになると思います。
昨日UNZでも使えないか試してみたのですが、フロッピー起動は無理でしたね。多分津軽のFDCは実機よりもかなりゆるくできているのかもしれません。ただ、互換ROM+UNZでAfterburner IIの起動ができたので、それなりにUNZの利用にも役に立つかもしれません。
2021-03-29 09:35:04
Artifactに12dotも足しておきました。
もしよろしければ、TOWNSROMプロジェクトでお使いください。
20ドットROMも並び順は資料があるのでKappa20フォントを使えば作れるのですが、RanceIV以外で使っているソフトってありましたっけ?
(RanceIVにしても、ROMがない機種用にファイル形式で20ドットフォント同梱だったような記憶も)
2021-03-29 20:33:54
pinさん、
試してみました!とりあえず何も困ることは無さそうですね。互換ROMはそのうち津軽を完全自己完結型でも動作可能にすることを目指しているのですが、そのときバンドルさせていただいてもさしつかえないですか?その際はCreditにpinさんによるコンバートという点は明記します。
なお、Towns OS V2.1 L20, L31, L51をハードディスクにインストールできるようになりました。今日はなぜL31がしくじるのか調べていたら、INT 21H AH=40H (FWRITE)で、書き込みバイト数がゼロと指定されると現在のファイル位置までファイルを短縮あるいは延長される、という点をまったく見落としていたので、延長は対応しないですが、短縮に対応して、通るようになりました。これならV1.1 L30は余裕だろう、と、思ったらV1.1 L30はIO.SYS書き込みにINT 26Hを使っていて、これに対応しないと無理のようですね。多分CDSからDPBを見つけて、DPBからデバイスドライバのポインタを取ってきてDevice Driver Callを出すだけだと思うので、この対応は簡単だと思ってます。インストールができるようになったらFMT_SYSのSCSI対応に手をつけて、ハードディスクからの起動にも対応しようと思ってます。
2021-04-01 14:11:38
FMT_FNT.ROMリポジトリのArtifactに置いてあるファイルはPublic Domainなフォントのみから作られているため、ことわりなく自由に扱ってください。
もし出典を書かれるのであれば、字形の違いや文字位置の違いなどがあったときにフィードバックが受けられるよう、githubのURLを書いておいていただけるとありがたいです。
2021-04-01 15:13:14
Free FM TOWNS Projectのページを作りました。
http://ysflight.in.coocan.jp/FM/towns/FreeTOWNS/j.html
動作確認したものを追加していこうと思ってます。もう少し動作確認が進んだらROM一式もダウンロードできるようにしようと思っています。
2021-04-07 22:13:41
> nanさん
EUPプレイヤーですが、macOSバイナリで試してみたのですが、問題なくメニューも選べるようです。Towns OSのどのバージョンに付属のEUPプレイヤーで最上段がクリックできない現象が発生するか、詳しい情報を教えていただけますか?
よろしくお願いします。
2021-04-11 04:20:54
山川機長さん
V2.1 L51 のEUPプレイヤーです。
アルバムを選ぼうとしても終了を選ぼうとしてもメニューがプルダウンできません。
他のソフトでも同じようなものがありました。
また、テキスト編集でも終了がクリックできません。
Windowsバイナリも同じ症状です。
確認お願いします。
2021-04-11 14:16:33
nanさん、
うーん、こっちで同様の現象が発生しないですねえ。nanさんの環境でV2.1 L31またはL20でも同じ現象が発生するか確認することは可能でしょうか?
なお、今ステートセーブ機能を作ってますが、セーブする項目が多くて、とても一発で動く気がせんですね(^_^;)
2021-04-17 11:21:19
山川機長さん
V2.1 L20のCDイメージでも試してみましたが、EUPプレーヤーは同様の症状ですね。
ただテキスト編集だけは終了ができるようになりました。(右上)
CDイメージの保存が失敗しているのかもしれません。
原盤はもう無く、CD-Rのみです。
ROMはTownsII MAで実機はHRだけです。
Let's Note(CPU i3)でも試していますが同じ症状です。
MacBook Pro以外でもカーソルが上段にいかないので、何が違うのでしょうね。
2021-04-17 16:05:27
nanさん、
うーん、そうですか。L20、L51共通の問題で、どちらも起動できているのであればイメージの問題ではなさそうに思います。起動時のオプションなど教えていただけますか?それから、マウスカーソルが一定以上上に移動しない感じでしょうか?あるいは、マウスカーソルは移動するものの画面上部でクリックに反応しないという感じでしょうか?
なお、リリースは出してませんが、実験的にステートセーブ機能を追加しました。PAUSEかけてロードしないとときどきクラッシュするのですが、今のところScavenger4みたいなコンスタントにCDを読んでいるゲームでもセーブ、リストアに成功するので結構使えるかもしれません。これまでにTowns OS V2.1L31、Strike Commander、Scavenger 4、Afterburner II、Super大戦略などでセーブ・ロードに成功してます。これでクリア確認まで進めるソフトが増えるのではないかという希望を持ってますが、しかし僕はシューティングゲームが下手なんですよね。
2021-04-18 12:31:18
nanさん、
原因多分わかりました。GUIで起動されていると思うのですが、GameportタブのMouse SpeedをFAST側にスライドしてみてください。いつの間にかSlowをデフォルトにしてしまっていたようです。
2021-04-18 22:32:33
山川機長さん
ありがとうございます。
そういえばマウスの動きが遅いなと感じていました。そういうものかなと。
FAST側にスライドすればGUIのカーソルとMacのカーソルが重なりますね。
気づいていただき、本当にありがとうございました。
2021-04-18 23:12:07
ktr0084さん、
Ultima TrilogyはTowns OS V1.1 L20なんですね。アップロードしていただいたような文字化け現象がこちらの環境で再現できないのですが、Ultima Trilogy以外が正常に動作しているのが謎ですね。起動時の設定など教えていただけますか?
よろしくお願いいたします
2021-04-21 06:40:37
まだリリースにしてないですが、GUIとVMをひとつのプロセスにまとめる修正を実験してます。制限としてはVMをPAUSEかけないとメニューが使えないという点ですが、がんばって同時に使えるようにしてみてもTownsのマウスとGUIのマウスがイベントを取り合うことになるので、この方式で正しいような気がしています。それで、GUIモードだとPAUSEかけるためにSCROLL_LOCKキーしか使えないのだとあまりにも不親切かと思ったので、GUIインテグレーションモードではウィンドウ右下に「MENU」ボタンを小さくつけてあります。今上下が反転してますが、もうすぐ直します。
気がかりなのは、実験中一度だけResumeしようとしたらクラッシュしたんですよね。一応フラグひとつで別プロセスとして起動するか、同じプロセス内で起動するか切り替えられるので、ユーザが選べるようにした方がいいのかな。
2021-05-03 05:04:41
リリース出しました。新しいバージョンではGUIと同じウィンドウでVMを実行できるので、メニューを使うためにAlt+Tabでアプリケーションを移動しなくてもよくなりました。ただ、ときどきクラッシュするので、従来通りプロセスを分けるのもオプションで選べるようにしました。
ステートセーブ機能も結構安定しているようで、これを使って遥かなるオーガスタのトーナメントモードで勝利に成功しました。次はDungeon Masterにトライしようかと思ってます。僕は結構RPGとかは一周したら、一週目で得た知見を元に二周目をプレイするのですが、Dungeon Masterはラスボス戦があまりにも難しくて二度目プレイする気力がくじかれたような気がするのですが、でもやっぱりがんばって二周はプレイしたような気もしています。でもステートセーブ機能を使えば勝てるかも。たしか、Dungeon Masterは素振りでちょっとずつ経験値が上がったような気がするので、マクロで自動レベルアップができるかなとか考えてます。
2021-05-07 09:19:22
新しいバージョンでは
GUIでの「CD Image」選択がスムースに行われるようになったのが地味にうれしいところです。
2021-05-08 11:26:28
> 新しいバージョンでは
> GUIでの「CD Image」選択がスムースに行われるようになったのが地味にうれしいところです。
と思ったら、違いました。
(スムースにいったのは ダウンロード後の1回目だけでした)
「CD Image」ボタン押下後、(2度ほど?)他のアプリをアクティブにしないとファイル選択ダイアログが開かない現象がちらほら。
2021-05-08 11:34:42
こうめいさん、
やっぱりその現象起きますか。こちらでも何かのタイミングで発生するのですが、原因を解明できずにいます。大学が(アメリカは)ぼちぼち春学期が終わって暇になるのでもう少し調べてみます。
2021-05-12 01:15:53
えーと、原因はすぐ究明できて、「全角」キーが押されてると思ってリリースを待ってるんですね。なんとなくWindows Update後にこの現象が発生し始めたような気がしていたのですが、GetKeyStateのリターンが変わってしまったのではないかと思います。Windowsの場合全角キーの押し下げを無視するようにする手もあるのですが、全角以外で発生しないという保証が無いですね。ファイルセレクタを閉じた後に残留しているキーとかマウスとかが背後のGUIを選んでしまわないために待っているので、基本的にユーザはダイアログを選んだらすぐにキーなどは放すと思われるので、1秒ぐらいでタイムアウトするようにする手ですかね。とりあえず直しますんで。
2021-05-12 01:40:17
GetKeyStateをGetAsyncKeyStateに変更したらなぜかその現象が発生しなくなったので、多分、これで大丈夫なのではないかと思います。2~3日中にリリース出します。
しかしもうひとつ謎なのは、同じライブラリを他にも仕事と趣味に使っているのですが、この現象が発生したのは津軽だけなんですよね。うーん、もう少し突っ込んで調べた方がいいのかもしれない。
なお、Dungeon Masterを始めて、現在地下10階まで来ました。イベントログ機能を拡張して自動トレーニング(50回素振りの後魔法を使う)ができるようにしたりしてます。これはさらに拡張するとキーボードから魔法を撃つショートカットとか作れて、当時プレイしたときぱっとFireballを撃ちたいのにマウスクリックがもどかしかった欲求不満を一気に解消できるようになるかも。ということをさらに考えていくと記録したマクロをキーに割り当てるとかいうことができるといいのか。
2021-05-13 22:37:50
お久しぶりです。津軽にステートセーブ機能が実装されたのでRAYXANBERに挑戦してきました。
数十回のセーブの末、ついに念願のラスボス討伐を果たしました。
ステージを細切れにしてやっとですが、エンディングまで見てきました。津軽での動作Aです。
自分はコードは書けませんが陰ながら応援しています。m(_ _)m
2021-05-15 22:37:09
おお!RAYXANBERクリア確認ありがとうございます!ちなみにDungeon Masterもクリア確認できた、、、のですが、謎がすべて解けてなくて、英語版がバグっているのか、地下6階の壁のメッセージがひとつ読めない(ブロックに踏み込むと破損したコードに飛ぶ)、そして、それが解けてないところに関与しているのではないかという気がすごくしているので、日本語版でやりなおそうかと思ってます。魔法を素早く撃つショートカット機能とか追加してしまいました。この機能があれば、人間がマウスクリックするよりも遥かに早く魔法を撃てるのでとっさに防御魔法を出したいとかいうときも瞬間芸でバリアを張れるので、無双できる予定です。(というかそういう機能を追加してしまったんでもう一周したくなった)
2021-05-16 12:14:41
>167 Type.dさん
本業が多忙でしばらく放置しておりました、申し訳ありません。(でも、まだ中間点なんですよね・・・ 夏休みくらいには暇になると思います)
RAYXANBERクリアおめでとうございます。 そして津軽の評価もAとの事で素晴らしい。
せっかくステートセーブが実装されたので私も時間が取れるときに何かをクリアしたいものです。
後は動作確認表に載っていない物を埋めるか・・・・ まだ手持ちのソフトの中で載っていない物も結構有るんですよね。
2021-05-18 23:20:20
>>168 山川機長さん
呪文をボタン一発で唱える感じでしょうか。斬新ですね!
津軽のステートセーブはファイルとして複数セーブできて直近のデータを簡単にロードできるところが使い易いです。あれがなかったらクリアは無理でした。
>>169 WINDYさん
お忙しい中コメント有難うございます。いつかはステージ単位のセーブだけでクリアしてみたいですが、自分にとっては一区切りつきました。
津軽は動作が軽快でアクションものが楽に進められるのが良い感じです。
セーブできるようになったことで時間のかかるタイトルも挑戦できるようになったので確認できたら報告します。
2021-05-22 00:54:27
要望です。
GUI版で起動時にPCMVOLとFMVOLを設定したいのですが可能でしょうか。
CUI版のほうは起動オプションに指定はできますが反映されないようで、コンソールからのコマンドのみが使えるようです。
ご検討宜しくお願い致します。
#ジェノサイド^2プレイ中 :)
2021-05-22 17:10:53
了解しました!一応、ソースにはダイアログにFM VolumeとPCM Volume (SOUND TAB)を追加したものをPUSHしました。コマンドからの値が反映されてなかったのは、pcmVolumeにも間違ってfmVolumeの設定値を書き込んでいたもので、多分直ったと思います。ジェノサイド2、ご健闘ください!
2021-05-23 10:33:17
>>172 山川機長さん
ありがとうございます!
2021-05-23 15:27:39
CAPCOM CFPS 6ボタンジョイスティックのエミュレーションに対応しようとしているのですが、このジョイスティックはコンバータみたいなのを噛ましてTOWNSなどMSXジョイスティックポートに接続していたようですが、なにかディップスイッチみたいなものでTOWNSモードがあったでしょうかね?
Muscle Bomberで試して、どうやら実装できたと思うのですが、まずいったんCFPSモードに設定しないとSTARTボタンが使えなくて、CFPSモードに設定するためにはSTARTボタンを押してCONFIGURATIONメニューに入らなくてはならないという鶏と卵状態になってしまったので、とりあえずボタン8と9をTOWNSのSTART/SELECT (上下または左右同時押し)に割り当てたのですが、それもいまいちというか。この仕様だと、当時CFPSジョイスティックを使おうと思ったら、まずTOWNSパッドをつなげた状態で起動して、CFPSモードに設定してからCFPSジョイスティックにつなぎえるといまどろっこしいことをしなくてはならなかったのではないかという気がしているのですが、どなたか知ってますか?
アダプタの写真を見たらアダプタ自体にジョイスティックポートがあるみたいだから、ひょっとしてそのジョイスティックポートにTOWNSパッドをつなげたのかな?
2021-05-24 12:53:10
山川機長さんはじめまして。
津軽楽しませていただいてます。
自分の環境だけかもしれませんが、最新バージョンからフォルダやファイル名に日本語が入っているとCDイメージを読み込めなくなっている事に気付きました。
前バージョンでは問題なく読み込めていたので気になってお便りした次第です。
今後このフォルダ構成がデフォルトになるのでしょうか?
2021-05-24 14:10:54
>174 山川機長さん
当該のジョイスティックは持っておらず、間違いかもしれませんが・・・
アダプタの方に2ボタンと6ボタンの切替SWが物理的に存在するようですので、2ボタン設定でCFPSモードにした後に6ボタン設定に切替を行ったのではないでしょうか?
なお、アダプタ自身のジョイスティックポートはGENESIS(メガドラ)のパッド接続のようですね。
どなたか実物をお持ちの方がいらっしゃったらフォロー願います。
2021-05-24 17:26:30
> ガイブラシさん
はじめまして。日本語ファイル名の件ですが、Windowsでご利用でしょうか? 今自分の環境でテストしてみたのですが、日本語ファイル名も問題なく読めています。ただ、自分の環境では英語版Windowsの言語を日本語にして使っているので、純粋な日本語Windowsと微妙に違うのかもしれません。言語の設定に、英語版では"Beta: Use Unicode UTF-8 for worldwide language support."というオプションがあって、これをオンにしているのですが、日本語版でも同じオプションがあればこれをオンにすると直るかもしれません。
> WINDYさん
情報ありがとうございます!Cyberstickも結構起動してからアナログモードに切り替えないとマウスが飛び回って収集がつかなくなるソフトがあったので、設定してから切り替えだったのかもしれないですね。
Muscle Bomberですが、最初のうち仕方がないので2P側のパッドでStartボタンを押してメニューを表示してCFPSモードに切り替えるようにしたら、なぜか1PのBボタンで開始するとなぜか2Pオンリー、1Pのスタートボタンで開始すると1Pと2P対戦モードになってしまうという謎現象が発生して、結局逆アセンブルして調べることになったのですが(まったく苦ではない)、結論として、起動後メニュー画面で一度でもSTARTボタンを押した方のプレイヤーが参加するようにできているようです。ではどっちもボタンを押してなかったらどうなるのだろう? と、思ったのですが、メニュー画面に入るために一度どちらかのSTARTボタンを押す必要があるので、必ず1Pまたは2Pは選ばれるようでした。それ以外はCFPSサポートもできたっぽいです。近日中にGUIからも使えるようにします。
2021-05-25 05:40:01
GUIでの「CD Image」選択、新バージョンでいい感じです!
過去の自作プログラムのdocを見てたら。。。
ーーーーーーーーーーーーーーーーーーーーー
○ツ-ル
・空飛ぶ箱庭エディター
・3次元サーフェスモデラー SurfEdit
By YS11 さん
○ライブラリ
・High-C用高速3Dグラフィックライブラリ
・High-C用32K色モード高速ぐらふぃっくライブラリ
・High-C用固定小数点演算ライブラリ
by YS11 さん
ーーーーーーーーーーーーーーーーーーーーー
当時、バーチャファイターもどきのゲームを作ろうとしてました。
この場を借りて、
わくわくするツールをご提供いただきありがとうございました。
2021-05-25 12:25:43
>177 山川機長さん
使用してるOSはWindows10です。山川機長さんが仰る通り"Beta: Use Unicode UTF-8 for worldwide language support."をオンにするとCDイメージの読み込みができるようになりました。ただGUIのフォントが変わったようなので一応ご報告させていだきます。
とは言えゲームプレイには支障はありませんので、また存分に楽しませていただきますね。素晴らしいエミュレーターありがとうございます。
2021-05-25 21:38:12
こうめいさん、
僕が公開してたライブラリ、使っていただけてたんですね!ありがとうございます!なお、今年のDemosplash (http://demosplash.org)にはTOWNSで参戦しようと思っているので、このライブラリは現役です!
ガイブラシさん、
Windowsの言語・フォントの処理が中でどうなっているのか、僕にもよくわかりません。UTF-8オプションをオンにしてから、たしかに漢字が中国語っぽいフォントになってしまったのですが、ただ、多分この先UTF-8がデフォルトになっていくと思います。プログラマーとしては、Linux、macOSが既にUTF-8で日本語も対応できるようになっているのでWindowsもそのようになってくれると一番ありがたいんですがね。
なお、ここ数日はぷよぷよのクリアを目指しているのですが、長い間プレイしてなかったのと、「通」に慣れてしまっているので、2連打で狭い隙間での回転ができなくて、ミノタウルスあたりを突破できずにいました。
2021-05-28 09:51:57
現在、「シャーロックホームズの探偵講座」を動かそうとしてるんですが、どうも動画再生中にバッファの先読みが再生に追いついてしまってクラッシュ、という現象が起きてるぽいんですよね。現在の津軽は倍速CDよりやや速いスピードにしてあるのですが、これを大体1Xスピードにしてやるとクラッシュせずに動くようです。MXの内臓CD-ROMは既にたまに読めるけど、高速モードにしたら絶対読まない状態で、2Fはそもそも1Xスピードなので、実機で実験できないんですよね。そもそもあまりヒットした作品では無さそうなので、やったことがある人が少ないのではないかという気がするのですが、当時実機で互換モードでのみ実行可能みたいな制限があったかどうか、わかります?
当時、CDが遅くて先読みが追い付かない心配はありましたが、CDの先読みが再生に追いついてしまう心配は無かったので、チェックしてない可能性はあるかなと思うのですが。一応、CD-ROMの読み込み速度を今は定数にしてますが、調整可能に変更しようかと思ってます。
2021-06-05 05:08:11
>181 山川機長さん
MXの内蔵CDドライブについて、WIKIの方にbestmmkさんからドライブのピックアップモジュールの情報が有ります。
(編集が追いついていなくてページ一覧からのみ参照できる状態なのですが、三洋製モジュールの交換についての情報です)
私の所有しているMXも内蔵CD-ROMが不調で、ピックアップモジュールを入手して交換してから情報の内容を整理してメニューに追加する予定ですが、モジュールが今週中にも届くと思いますので交換してみようと思います。
当該のソフトについては所有していませんので私では確認が出来ませんが、もしモジュールの交換でドライブの状態が良くなるようなら山川機長さんのMXのモジュールも交換すると言う手は有ると思いますので、暫くお待ちください。
ソフト自体の発売はWikipediaによると1991年6月1日との事ですので、まだ等速ドライブの時代ですね。
2021-06-07 09:18:21
MXの内蔵CDドライブの件、bestmmkさんの情報ではMEで使用されているモジュールはSF-C93(4線)との事でしたが、所蔵のMXのドライブで使用されている物とは明らかに形状が異なり、SF-C93(4線)では交換できそうにない感じです。
基本的にMEとMXであれば世代が同じなのでロット違い等により調達した部品が異なっている可能性が有ります。
実際の所、このあたりの情報は不足しており調査が必要かもしれません。
2021-06-09 08:57:10
>183 WINDYさん
MX/MA/一部のMF(?)/HA/HB/HCに搭載されているドライブと、ME/前者を除く一部のMF(?)/EA/Fresh・E系/Fresh・T系に搭載されているドライブは全くの別物で、ピックアップモジュールにも互換性はないと思います。
信号線自体は一緒なので、MX/MAであればME/EA/Fresh系のドライブを「無理矢理」搭載することも可能なのですが、あまりオススメはできません。
また、噂によると三洋の「3DO TRY」のCD-ROMドライブがTOWNSと同じものだという噂を聞いたこともありますが、バラしたことがない以前に実物を目にしたことすらないので、本当かどうかは分かりません。
…って結局何の情報にもなってないかorz
2021-06-10 11:56:07
>184 たけがみりうさん
そうなのですね、ME/MA/Fresh系はドライブを私自身まじまじと見たことが無いので筐体の違いくらいにしか認識していませんでした。
ピックアップモジュール、余っちゃいましたね(汗)
MX/MA/HA/HB/HC系のピックアップモジュールは形状を見る限り売ってないのですよ、モジュールが取れるところまで分解するのが大変そうだったので今回は元に戻しちゃったのですが、そうなればやはり分解してモジュールの形番を確認する必要が有りそうな気がします。
出来ればMXのドライブは半死状態でも生かしておいて、将来的に信号解析の為に置いておこうかなとも思っていましたが・・・・ HCのドライブがまだ元気なのでMXのドライブには最悪昇天してもらう方向で分解しますか。
3DO TRYですか! ってレア物ですね。 実物を見たこともないや。
ネットの写真を見る限り3DO REAL(FZ-10)のピックアップがそっくりかも・・・
個人的な考えとしてはTOWNSを生かす為に3DOに死んでいただくと言うのは気が引けますので、新品のモジュールを探す方向で考えます。
有用な情報を有り難うございます。
2021-06-10 13:42:13
津軽を使ってDOOMをTownsOSに移植してる人がいるみたいです!感動しました!
https://twitter.com/bcc2528/status/1403287084958248963
2021-06-11 23:27:24
初めまして。DOOMの移植を行っているものです。
元FM TOWNS 20F / 2 MXユーザーだったものの、どちらの機種もCDドライブの故障で廃棄(今のノウハウあったら修理できていたかもしれないのにもったいないことした)してしまい吸い出していたROMで仮想TOWNSを楽しんでいます。自宅の物置を整理していた際に無くしていたと思っていたFM TOWNS用ソフトの一部が見つかりその中にHigh C V1.7があったので当時は理解できなかったCでのTOWNSプログラミングを体験、これまた当時TOWNSからAT機に移行した際に初めてDOOMをプレイしてこれがTOWNSで遊べたらなぁという雪辱を今晴らすためにチマチマやっております。
エミュレータもそうなのですが、FM TOWNS版DOOMでは山川機長製のライブラリ「Tornade」(固定小数点演算ライブラリ・フリコレ10収録)も使用予定です。DOOMエンジンでは16.16の固定小数点を使用していて、乗除算の計算でCソースではLong Long型・x86 DOS版ではアセンブラでレジスタ連結による計算後シフトで精度を戻すということをやっているようですが、High CがLong Long型に対応しておらずアセンブラも所持していないので自力での実装は難しそうなので代用できないか試してみようと思っています。
2021-06-12 00:31:48
BCCさん、
おお!そうでしたか!僕も青森県立弘前高校にmodel 2を寄付してしまい、渡米のときMXを友達にあげてしまって、二台ほどもったいないことをしてしまったのですが、実家に奇跡的に残っていた2F (とFM-7)を大事に保管してます。レトロPCを修理するなんてことが可能だと知っていればFM77AVも一台救うことができたはずだったのですが、かわいそうなことをしました。
引き続きDOOMの開発を楽しみにしています!
2021-06-12 01:58:10
BCCさん
DOOMの開発の方、楽しみにしています。
当時、Linux版をTOWNSでやった覚えが有ります。
数十分もすると3D酔いでクラクラする感覚をネイティブ版で味わえる日が来るとは!
当時の力量では出来なかったことがその後の経験で出来るようになる事って結構有りますよね、ところでアセンブラに関しては頭脳圧搾工場 in 仙台さんの所でNASM on TOWNSを公開されていますので必要であれば386ASMとは文法が異なりますが、利用できると思いますので利用されてみては如何かと思います。
2021-06-12 08:07:30
BCCさん
FixedMulだけなら、_inline で埋め込むのも楽でよいですよ
最近は https://defuse.ca/online-x86-assembler.htm のようなオンラインアセンブラもありますので
2021-06-14 03:12:30
山川機長殿
津軽の機能追加希望を書き込んでもよろしいでしょうか。
私自身が機能追加できる能力があれば、アップデートの一助になれたのに。
オブジェクト指向をやってみようと、デザインパターンの書籍を読みましたが、
ソフト組んでみようとするとオブジェクト指向の設計できずに、諦めました。
この年になってからでも、オブジェクト指向に精通した教師が
授業なさっているスクールに通うべきか、悩みます。
2021-06-14 12:24:42
ヘルムートさん、
何か要望があればここに書き込んでいただいてもいいですし、メールしていただいてもかまいません。
オブジェクト指向は、僕は一度オブジェクト指向じゃない方法で複雑なものを作ろうとして困る経験をするまで意義が理解できませんでしたね。秋学期の授業では最初の一か月間C++で非オブジェクト指向な書き方で突き進んで、大変になってからクラスの概念を次の一か月で教えるという方針でやってます。秋学期はこの流れで非常にいいのですが、春に教えてる続編のコースがいまいちうまく進まないんですけどね。
2021-06-14 12:50:14
山川機長殿
オブジェクト指向のアドバイスありがとうございます。
やってみるしかないようですね。
要望としては以下の2機能となります。
・クイックセーブ・クイックロード機能
・プレイ速度指定機能です。
(クイックセーブ・ロード 機能イメージ)
ファイル名:テキストボックスなどで事前指定(スケーリングと同様)
クイックセーブ:F2などのボタンを押下すると、confirmダイアログなしで、上記指定ファイル名でセーブする。
クイックロード:F4などのボタンを押下すると、confirmダイアログなしで、上記指定ファイル名でロードする。
(プレイ速度変更 機能イメージ)
テキストボックスで指定した速度に変更する。
F2を押下すると100%と上記指定速度にトグルで速度変更する。
シューティングなどが下手な私のようなものでもエンディングが見えるように
10%~300%のように幅広くできるとうれしいです。
この機能を有効とする場合は、サウンドをミュートする手もあるかもしれません。
いずれの機能も、他のエミュレータには類似のものがあると思います。
ご検討くだされば幸いです。
2021-06-14 13:18:07
ヘルムートさん、
なるほど!たしかに、ぷよぷよのテスト中(久しぶりにやったらはまった)、自分もスピード調整が欲しくなりました。一応すでにCPUのクロックは変更できるのですが、VSYNCやタイマーでタイミングを取っているプログラムだとCPUを遅くしてもあまりスピードが変わらんですよね。クイックセーブ・ロード機能も自分で欲しいと思ってました。僕はクイックセーブはファイルではなくメモリにセーブを考えてましたが、ファイルにセーブにしておくと、起動時のステートファイルを指定することで、前回クイックセーブした場所から再開みたいな使い方もできるようになるのでいいかもしれないですね。
ちなみに、もうひとつキー一発でスクリーンショットをどんどん指定ディレクトリにセーブしていく機能も追加したいと思ってます。
が、現在、キーが足りない問題に直面しています。FM TOWNSのキーボードは、とにかくキーが多くてただでさえすべてカバーしきれてないもので、Scroll Lockだけは対応するキーが無さそうだったのでPauseに使ってしまいましたが、他に使えるキーが無くなってしまって、どうしたもんかと思ってました。Townsに無くて、今のPCにはあって、今のところ使ってないキーは結構難しいんですよね。。。。そうか。Right Ctrl+Shift+キーとかならアリかな。
2021-06-14 23:04:19
TOWNSにあって現代のキーボードにないキーはアプリケーションキーとの2ストロークなどと考えて
(VK_APPS → VK_NUMPAD0 で 「000」、VK_APPS → VK_RETURNで「実行」等々)
ここで提案しかけたのですが、現代のノートPCはこのキーを備えていないものもあるのですよね
また、(右Ctrlを使ってもそうなのですが)そのまま押せるキーとそのまま押せないキーの同時押しを表現できないのも悩ましい点です
2021-06-15 01:11:14
右Ctrl+Shiftを検討したのですが、Windows用だけだったらそれでいいのですが、LinuxとmacOSがキーの状態を検出できないですね。macOSは左右のShift/Ctrlの区別ができなくて、LinuxはShift/Ctrlを押してもキーイベントが発生しなくて、ほとんどドライバを直接攻撃しないと無理っぽいですね。なお、macOSは最近のバージョンでローレベルのライブラリ自体がDisableされてしまったので根本的に不可能になりましたね。(ユーザがPreferenceでセキュリティの許可にアプリケーションを登録すればできるらしいがなぜか僕の環境ではさせてくれない)
これだと、Townsでまず使わないキーコンビネーションを使う方法がひとつで、あるいは、起動時のオプションでF12はスクリーンショットみたいな指定ができるようにするという手ですかね。オプションで指定する方法の難点は、アプリケーションによって変わるのでちょっと不便な点ですね。Fnキーは人によっては使わないですが、フライト系のゲームだと視点切り替えに使いまくるので。
そうそう、ときどきTownsのアプリケーションで「取消」キーと「実行」キーを押さないと反応してくれないのがありますよね。当時は実行キーがいい位置にあるもんで、バシーンと叩いてたもんでしたが、それでも壊れなかったですね。
2021-06-15 07:00:47
ということで、結局ユーザがカスタマイズできる方向で実装することにしました。内部的には、ホットキーを押すとコマンドを送るようにしたので、コマンドでできることはなんでもできるようになってしまったのですが、GUIでは割り当て可能な機能を限定してキー一発でスクリーンショット、ステートセーブ、ロード、スピード調節などの機能を割り当てられるようにしようと思います。とりあえず自分で使いたいスクリーンショット機能は追加したんですがね。今すでにあるコマンドでできることでホットキーに割り当てるとありがたいものって他に何がありますかね?案外思いつかないな。リセットボタンを割り当ててもそんなに頻繁にリセットするものでもなさそうだし、スピード調節は、多分できると思うのですが、案外簡単じゃないもので、できなかったらごめんなさい。
2021-06-16 13:27:17
山川機長殿
津軽のLoad Machine State(L)を選択した際、自動でゲームウィンドウをアクティブにできないでしょうか。
マウスクリックの一手間がなくなると便利です。
ご検討くだされば幸いです。
2021-06-17 10:23:55
ヘルムートさん、
Windowをアクティブにするのは、思ったよりちょっとややこしいんですよ。その場合は、Separate Processのチェックボックスをオフにして使用していただければと思います。本当はGUIのタイトインテグレーションができた時点でプロセスを分けるオプションは廃止しようと思ったのですが、万一タイトインテグレーションが安定して動かない場合に備えてボタンだけ残してあります。
2021-06-17 12:50:54
山川機長殿
承知しました。
無理な機能要求ばかりで申し訳ありません。
Separate ProcessのチェックボックスをOFFにすると、
MENUを呼び出すマウス操作が必要となります。
可能であればMENUを呼び出すショートカットキーを設定くだされば幸いです。
私見にすぎませんが、
キーボードでプレイしているならば、キーボードから手を放さずに
いろいろと操作できれば、プレイにのめりこみやすくなるかもと
感じました。
ご検討くだされば幸いです。
2021-06-17 18:16:02
>197 山川機長さん
初期アサインはPauseがあると便利だと思います。
GUI版はメニューが出ますし、CUI版はコマンドを打てますからどちらでも問題ないかと。
同じキーでPause解除(Run)できるようにすると分かり易いですけど、
その辺は作者さんの好み次第かと思います。
2021-06-17 22:20:16
ヘルムートさん、
おおなるほど。すみません、Scroll Lockキーでメニュー出ますので。(もう一度押すと消えてVMが再度走り出す)。そういえばどこにも説明書いてなかったかもしれません。
2021-06-17 23:35:18
山川機長殿
ありがとうございました。Scroll Lockキーは助かります。
今後separate processを廃止するならば忘れてください。
separate processを有効としている場合、start vertual machine→power offなどの操作をすると、
MAIN/SCSIなどのメニューを表示しなくなります。
起動し直す手間だけですので優先度低ですが、気になりましたので、ご指摘します。
以上、よろしくお願いします。
2021-06-18 13:13:29
"ご指摘します"は、大変失礼な表現でした。
申し訳ございます。以下ののように訂正致します。
津軽を起動し直せばMAIN/SCSIなどのメニューを表示可能です。
修正優先度低ですが、気になりましたので、記載いたします。
2021-06-18 19:05:45
申し訳ございません。
IMEの初期化をしてきます。
変な表現が候補に上がるようになってしまいました。
2021-06-18 19:07:04
Scroll Lockでメニューが出るんですね。知らなかった…orz
2021-06-18 21:00:27
ヘルムートさん、
いえいえ、気にせんでください。多分僕の方がアメリカ暮らしが長くて日本語が変になっているのではないかと思います。なお、起動ダイアログ(プロファイル)ですが、View->Profile Dialogを選ぶと再度開くと思います。が、VMのウィンドウを閉じた場合はそうなってしまうのですが、メニューからPower Offを選んだ場合は自動的に開きなおすように作ってたはずなので確認してみます。原則として起動時のパラメータはプロファイルダイアログで、起動後はメニューでという使い分けになってます。ディスクイメージを入れ替えられないというメールがあって、どうやらVM起動後にプロファイルダイアログで選んだものが反映されてなかったようなので、VMが走っている間はプロファイルダイアログを閉じるようにしました。
Type.dさん、
考えてみたらScroll Lockはどこにも説明を書いてなかったかもしれないですね。なお、ついでなので、このキーもカスタマイズできるようにしますんで。
2021-06-18 22:39:04
おお・・・これは何回もメニューを開くときに便利です。
自分のキーボードのScroll LockはFnキーが必要なのでカスタマイズ機能は有難いです。
今日気付いたのですが今のところプロファイルを保存するとロードでエラーが発生するようです。
2021-06-19 20:31:46
山川機長殿
separate processはコア数の多い最近のCPUに向いているのかもと考えて、デフォルトで有効にしていました。
コア数が多いCPUでは、各コア単体の性能を上げるよりも、多数のコア全体で性能を出す傾向にあるようですので。
メニュー表示キーのカスタマイズは助かります。
こちらはゲームパッドを使わないので、できればゲームで使用するキーのカスタマイズも有効にできないでしょうか。
Type.d様
Vertual Machineを起動していない状態では、こちらの環境ではエラーメッセージを見ておりません。
GUIの設定のうちデフォルトから設定を変更にされている項目を
記載されると山川機長殿がバグ確認しやすいのかもと感じました。
2021-06-19 22:28:59
説明不足、失礼しました。
本日(06/19)取得したソースをコンパイルした状態で、デフォルト設定の津軽でプロファイルをセーブし、ロードすると、
"Profile Load Error" "Unrecognized keyword:PAUSEKEY"
というエラーダイアログが表示されて設定を読み込めなくなります。
また、設定ファイルの末尾に2行追加されている分を消すと読み込めるようになります。
>>209 ヘルムートさん
こんな感じで通じるでしょうか
2021-06-19 23:41:37
Type.d殿
よくわかります、ありがとうございます。
以下は有識者への質問です。
次のビルド向けに全ソースファイルの修正が終わっているのかが
GITを使ったことがない私にはわからないです。
各メンバがそれぞれプロジェクトに含まれるソースファイルを
修正していって全員の修正が終わったら、バージョンを切って
バージョン指定でソースファイルを取得できるような
システムだと管理しやすいのですが。
GITでも可能なのでしょうか。
転職した会社では管理ツールを使っていないので、すっかり忘れてしまいました(汗。
2021-06-20 01:16:41
すみません、GUIはバッチでテストを仕掛けのが面倒なもので、Profileのセーブとロードの確認を忘れてました。GUIの方も複雑になってきたので、もう少しユニットテストとか考えた方がいいですね。
ソースをPUSHする前には一応ユニットテストを走らすようにしているのですが、GUI関係はすべてのパターンをテストできないので、試してエラーを報告していただけると非常にありがたいです。
なお、ソース修正したものをPUSHしました。
2021-06-20 06:55:47
山川機長殿
212の書き込みを拝見して、
GITを使用してプロジェクトに参加されている方が
結合テストくらいはしていることを前提とした
ソース管理システムな印象を受けました。
どのタイミングでソースファイルを取得しても
問題ないことを前提としているようですので。
新規開発のプロジェクト初期には
使いづらそうです。
2021-06-20 07:55:24
ヘルムートさん、
昨日の問題はプロファイルのセーブとロードを自動テストに含めていれば検出できたはずなので、追加しました。新しい機能を追加したときなどはクラッシュ予防になると思います。
津軽の開発体制はあまり製品開発の参考にはならないと思います。Githubも有料アカウントだともっとできることが多いのですが、現在津軽はすべて無料アカウントでやっているので、結構な制限を受けています。本来であれば、GithubにPUSHするたびに自動的にコンパイルテストが走って、ユニットテストが走ってエラーがあったら通知が来るようにしておくと良いのですが、コンパイルテストしか自動化していません。
仮に有料アカウントを使ってテストなど自動化を進めたとしても、GUIのデバッグは難しいですね。製品の開発であればテスターさんを雇うところなのだと思いますが、この点は、ユーザの皆さまからのレポートが頼りです。また気が付いたことがありましたら、ご報告をよろしくお願いします。
2021-06-20 10:58:16
ありがとうございました(^^)/
2021-06-20 11:22:17
山川機長殿
ソフトの修正とGITに関する助言くださりありがとうございます。
GITについては早速調べてみます。
モジュールのテストはどこまで自動化できるんでしょうね。
単体や結合をソースを見て、自動でテスト条件を設定して、テストしてくれるAIができたら
晴耕雨読の生活になるかもしれません。
あまり助力になりませんが、書き込みいたしますのでよろしくお願いいたします。
2021-06-20 16:47:00
新バージョン(6/24)を使用しての要望です。
1点目はHot Keysタブ内のQuick State-Save File Name:の指定で
ファイルがない場合もパスが有効ならOKとできないでしょうか。
報告事項としては、Separate Processが有効な場合は、
Virtual Machineを起動してPower Offすると、Hot Keysなどのメニューを表示できない現象は
現バージョンでも発生しています。
よろしくお願いいたします。
2021-06-27 11:09:12
将来に向けた要望2点(回避策あり)
Quick State-Save File Nameをゲームプレイ中に
変更できるようにメニュー表示の調整願えないでしょうか
現状は、State(S)メニューからのセーブで対応できます。
ゲームプレイ中にScroll Rockキーを押下し、
Power Offした際、表示されるウィンドウサイズが小さく、HotKeysなどが表示されません。
可変ウィンドウサイズに設定くださっているので、問題はありませんが、
起動時と同じウィンドウサイズにされてはいかがでしょうか。
御多忙のところ要望ばかりですが、よろしくお願いします。
2021-06-27 11:24:07
ご報告ありがとうございます。
えーと、Quick State Saveのファイル名指定が無い場合というのは、ファイルダイアログですね。あれ?指定できなかったかな?Openモードでファイルダイアログを開いてしまってたかもしれないですね。確認してみます。プレイ中のファイル名変更は簡単なのでそれは対応しましょう。
Separate Processで起動した場合のダイアログは、リリースにする前に確認するのを忘れてました。確認してみます。
2021-06-27 11:51:09
こんな感じの設定になるのでしょうか。
SaveFileDialog.CheckFileExists = false;
2021-06-27 17:36:21
0bfa51daad63cfc07befef6964ecf8b6435be119 を Visual Studio 2019でリリースビルドしたものですが、
Tsugaru内で、
eax: 00000000
edx: 80000000
ecx: ffffffff
の状態で idiv ecx するとTsugaruが例外で落ちるようです。
こんな除算をする人はいないとは思うのですが、気付いてしまったので共有しておきます。
2021-09-03 04:49:55
おおなるほど!ありがとうございます!直します!
2021-09-04 11:33:24
簡単に直そう、と、思ったら、これ、整数の割り算で普通に落ちるんですね。そうか、オーバーフローもExceptionになるんだった。うーん、なんか考えます。
#include <stdio.h>
int main(void)
{
int x=0x80000000;
int y=x/(-1); // これでも落ちるらしい。
return 0;
}
2021-09-04 11:40:38
C++の仕様的に符号付きのオーバーフローは未定義動作と知っていても、x86のレベルでは加減乗算同様下位ビットだけ見えるものと思っていました
0除算以外に事前にチェックが必要なのは
この組み合わせ(符号付きで負の最大値を-1で割った時)だけだと思うので(ですよね?)、同様のチェックでいいと思います
quo が std::numeric_limits<(u)int??_t>::min() ~ max() におさまっていないときもTOWNS側に例外を起こしてやるとより実CPUに近くなるのですが、こちらは除算後のチェックで十分だと思うので…
2021-09-04 12:06:20
いやあ、本来は、
EAX=0, EDX=1, ECX=1
で、
DIV ECX
すると、割り算結果は33ビット必要なのでEAXに収まらず本当は例外0が出ることになっているのですが、津軽のCPUではこの例外を無視して単に割り算結果の下位32ビットをEAXに入れるようにして続行してます。DOS Extenderアプリで例外0が出るということはまずクラッシュするので、クラッシュしない場合だけ走れば大体カバーできるだろうという発想でした。
が、VMがクラッシュするのはいかんですね。逆にこのチェックを入れるのであれば、正しくチェックするように書き直した方がいいかもしれないかなあ、という気になりつつあります。
2021-09-08 13:01:39
FM TOWNSで影絵「Bad Apple!!」を再生するデモプログラムを作成してみました。
https://drive.google.com/file/d/1qj4KDKEAxFguTrnwzKV4nbwA3Hk-J-Ln/view?usp=sharing
エミュレータ「うんづ」での動作例
https://www.youtube.com/watch?v=BNt7iwdIFPY
「津軽」上の環境で開発してテストしていたのですが、「津軽」では映像と楽曲が同期しません。
原因が分からず1か月くらい悩みフレームスキップを実装したり一定周期で垂直同期待ちを外してみたり思考錯誤してしまいましたが、もしかしたらFM/PCM音源の割り込み周期は「うんづ」の方が正しいんでしょうか?
TOWNS実機は現在持っていないのでどちらが正しいかテストをお願い致します。
2021-09-09 16:00:48
おおなるほど!多分津軽で何かが違うようです。「シャーロック・ホームズの探偵講座」と「ハイパー・プラネット」の落語が時間が進むと音と画像がずれてしまう問題が起きていて、原因が特定できずにいます。垂直同期で映像、FM/PCM割り込みで音のタイミングを取っている感じでしょうか?
2021-09-09 22:10:26
映像側はDOOMの時にも利用したHISライブラリでVSync割り込み時に関数を読み出すようにし、偶数フレーム毎にEGB_putBlockでバッファ上にある解凍済みの画像データを表示するようにしています。
音声側はTowns OS V2.1 L30以降で追加されたWAVEライブラリを使用し、High C コンパイラに付属していたサンプルプログラムを参考に組んでいます。
リングバッファ64KB中4KBの音声データが再生されると割り込みが発生して該当の関数が読み出されフラグ変数を加算していき、4回分割り込みが発生したら次の16KB分の音声データをファイルから読み出してバッファに書き込みの繰り返しです。
HISライブラリとWAVEライブラリの再生関数を連続して読み出しているのでほぼ同時に流れているはずなのですが、津軽で再生すると映像に比べて音声の方が早く流れ、音質自体元の音声と比べると変化しているようです。
2021-09-09 23:44:39
おおなるほど!うーん、なんとなく原因がぼんやりとわかるような。Direct Soundの音の再生が、厳密にサンプル数から予想される時間と微妙に合ってないんですよね。PCMの割り込みはDirect Soundにデータを送ったタイミングでかけている(なので4KBずれるがズレは一定)VSYNCのタイミングとDirect Soundのタイミングが一致していないとだんだんズレていくことになります。そうか。実機だと大元のクロックが同じだからVSYNCとPCMと厳密にタイミングが一致してたのかな。
2021-09-10 05:52:08
手元では音のピッチに不自然さは感じないものの、絵がやけに遅れる感じだったので調べてみました。
BCCさんの手元と同じ現象かどうかはわかりません。
津軽 0bfa51d
Visual Studio 2019 (手元でリリースビルド)
Windows 10
起動オプション: -FREQ 100
この環境ですと、VSYNC割り込みの回数が少ないようです。
↓のプログラムを実行すると、実機では60と出ますが津軽では50程度の数字が表示されます。
https://1drv.ms/u/s!Aqq3BKBfkjZ2pt5UbjOigrGf-SbD0Q?e=JPbM0x
2021-09-10 06:50:59
おおなるほど。-FREQ 100だと相当速いPCでも多分VMの実行が実時間に追いつかないと思います。VSYNCはVM時間を元に計算していますが、time(NULL)はRTCから来ていて、RTCはHOST OSのタイマーから取っているので実時間になります。そのため、-FREQ 33ぐらいだと59か60と出ると思います。しかし、シャーロックホームズとハイパープラネットの落語は-FREQ 16まで下げても途中からズレるので、何かが一致してないようです。というか、VSYNCの計算のときTowns Timeを1666666nsで割り算した余りを出すより、16777215とANDを取ったら誤差は0.66%だし、速い、と、思ってそうしているのですが、うーん、でもこれが問題だろうか。
2021-09-10 13:44:20
より小さいFREQで試してみました。
CPUは Ryzen 7 2700X です。
-FREQ 33: 58 60 52 59 56 58 59 56 59 59 57 59 60 58 59 60
-FREQ 16: 57 54 54 58 58 57 59 57 57 57 56 52 59 57 58 60
2021-09-10 15:27:30
今BADAPPLEを試してみたのですが (-FREQ 33, Core i9-10900F 2.80GHz)音と絵のタイミングは合っているように思いました。実は単に処理が追い付いてないだけかもしれません。あと、ディスクアクセスが発生すると結構実時間よりも遅延が発生しそうなので、SSDの速度にも影響されるかもしれません。音質は、TOWNSのPCMよりもホスト側の音源の方が周波数が高いので、本来であればサンプルとサンプルの間は滑らかに(せめて線形)補間すると良いのだと思いますが、時間稼ぎの意味でもホストから見ると階段状の波になっているので、楽器によっては実機よりやや音質が劣って聞こえるかもしれません。
やっぱりスピードアップかなあ。CPUじゃなくてイメージファイルからの読み込みを少し最適化すると違うような気がしてきましたね。シャーロックホームズとかハイパープラネットはCDを読みながら動画再生してるので多分ファイル読んでるあたりでかなりVSYNCその他の割り込みが実時間より遅れていってるんですよね。それを考えるとフラクタルエンジンは結構偉いな。CDなんか、最近のRAMだとデータトラックを全部オンメモリにしてしまってもいいぐらいなんですよね。そういうオプションを追加してみようかな。
2021-09-11 02:55:16
ディスクアクセスが間に合わない説は自分も最初疑って、VMのメモリを多くとって先に展開してみたり、イメージファイルの場所をHDDとNVMe SSDの両方を試してみましたが、それでも結果はあまり変わりませんでした。
-FREQ 33、Core i7 4790Kの環境でFREQ 60まではVMの実行速度が間に合うことは確認しています。
自分の環境での津軽を使用しての再生
https://www.youtube.com/watch?v=bvOQpSe9aHU
タイミングがあっていれば
-スー・・・バッ!、と鳴る「バッ!」のタイミングで放り投げたリンゴが丁度キャッチされる
-歌詞「気だるさがほら グルグル廻って」の「グルグル廻って」で人差し指を同時に振られる
-歌詞「私は 私 それだけ」のそれぞれ「私」で両手の手のひらを上に広げる
-歌詞「もし変われるのなら白になる」が歌い終わった直後に下側から三人組が出てくる
-歌詞二番目の「気だるさがほら グルグル廻って」で左側からグルグル廻って出てくる
-動画では陰陽マーク時に曲が終わっているが、リンゴを持っている霊夢にアップされて画面が暗くなった後もまだ鳴り響いている。
2021-09-11 10:47:43
おおなるほど。うちのCore i9では、大体タイミングが合ってるような感じです。少なくとも、VSYNCが本来出るべき回数分出ていないのは間違いなさそうですね。pinさんの計測結果だと、FREQを下げても57とか54とか出ているようで5~10%の遅れになるので、動画と音が5%ずれると結構でかいですね。
試しに、再生中に、コマンドで、 pri timebalance としてみていただけるでしょうか? 区間ごとの時間収支を表示するのですが、プラスのときはVMの方が実時間より速く進んだので待ちを入れて、マイナスのときはVMが遅れているので、遅れを以後数回の区間に分散して取り返します。VRAMレンダリングのタイミングで定期的にマイナスが出ると思いますがFREQが十分小さければそれ以外はプラスになってると思います。うちのPCだと、大体普通400000nsぐらいの黒字で、レンダリングのとき-250000~-400000nsぐらいの赤字になってるようです。もしも画面転送でガバっと赤字が出ていたりすると遅れを取り戻しきれていない可能性があります。
あ、ちなみに、nVidiaのグラフィックドライバだとVSYNC待ちがデフォルトで有効になってるので、オフにしないと絵を転送するときにガバっと遅れるのですが、それが起きてる可能性とかありますかね?
しかし、僕はBAD APPLEという曲は初めて聞いたのですが、Visualと合わせていい感じのデモですね。この年になると、意識して新しい音楽を聴いたりしないと知ってる曲ばかり聴くようになるので、脳に刺激を与えるためにこういう曲はいいですね。
2021-09-11 11:56:01
DOS6のコマンドプロンプトで特に何のプログラムも動作していない状態の、pri timebalance です。
・render.txt 通常状態
・no-render.txt townsrenderingthread.cpp の world.Render の呼び出しを除去したもの(ここはレンダリングスレッドでもUIスレッドでもなくVMスレッドなのですね)
https://gist.github.com/pinterior/0418e3396fca6642dc021720b7c6f032
GPUはQuadro P1050相当品ですが、NVIDIAコントロールパネルはインストールされないので
VSYNC待ちにかかわる設定の状態は不明です。(が、怪しいですね)
2021-09-11 23:39:21
Bad Apple!!再生中にpri timebalanceを出力した結果です。(-FREQ 33、実PCの垂直同期オフ)
https://drive.google.com/file/d/1qf38Djyf2TdPqLJsR4mWOKuyU_JRiixG/view
nVidiaコントロールパネルから垂直同期を外すとズレが少なくなるようですが、それでもあっていないようです。
2021-09-12 21:19:04
早速チェックしていただき、ありがとうございます!どちらもそんなに負債が大きくないような感じがしますね。しかし、現実問題として絵が音よりも遅れているので、時間負債を返済しきれていないのではないかと思います。
なお、うちのCore i9で再生した動画がこんな感じです。(開始は大体動画開始から5秒)
https://1drv.ms/v/s!AmlM0OLrEo8vgfg4Vk0TIayDFdQ2BA?e=UUMa0l
BCCさんの動画では3人組登場のタイミングが約5秒遅れですね。1分57秒(117秒)の時点で5秒遅れということは、動画の遅れは音に対して4.26%になりますね。歌詞の最後で陰陽太極図が出るので合ってるのであれば、3:31秒の時点で太極図になるはずが9秒遅れのようなので、211秒に対して9秒は一定して4.27%の遅れのようです。
音を比べると、BCCさんのYouTubeでは3:43秒で音が終わってますね。こちらの環境では動画開始後3:41秒で音と動画がほぼ同時に終わります。動画再生のタイマーを参照しながら数えているので、プラスマイナス1秒の誤差は出るので、音は221~223秒ということで正しいと思うんですね。
可能性として、WAVの再生が速く進み過ぎているのではないかということも考えたのですが、動画を比較するとどうやらその可能性は無いですね。もうひとつの可能性として、std::chronoが返すタイマーが遅れているのではないか、ということも考えたのですが、さすがに4.3%の差はあり得ないですね。これはcount.expの結果とも一致しますね。VSYNCが一秒あたり57~58回しか出ていない場合、3~5%遅れということになるので。VSYNCはVM時間を元に出しているので、というとやっぱり時間負債返済しきれてない問題の可能性が高くなってくるように思います。
試しに、
- pri timebalance で、通算の時間負債も表示する。
- ディスクの読み込みを別スレッドにする。
の2点の修正を入れてみます。時間負債を返済しきっているのになお遅れるようであれば、何か次の問題を探す必要があるので、表示してみる価値はあると思います。fstreamのアクセスはディスクの速さと関係なくファイルをロックしたりアンロックしたりOS内部のオーバーヘッドが絶対あるはずなので、単に時間負債を返済しきれていないという問題であれば、ディスク読み込みの別スレッド化によって改善が見えると思います。
world.Renderはレンダリングスレッドを分けてからはどっちかというと単にできあがったイメージを転送するだけになってます。以前はこの中でレンダリングして転送していたのでこういう関数名になってますが、ちょっと紛らわしいですね。そもそも負債が発生しないのが一番いいので、world.Renderを高速化できるといいんですけどね。ものすごい手抜きをしてglDrawPixelsを使って絵を転送しているのですが、本当は2次元なのでわざわざOpenGL使う必要ないんですよね。しかし、クロスプラットフォーム化ではこれが楽なもんで。
2021-09-13 09:18:26
ついさっきPUSHしたソースで直ってないですかね? TownsThread::AdjustRealTimeを見直してたら「あ」と思うような間違いがあったので直したところ、ThinkPad X1 Yoga 3rd Gen (ほぼ3年前のLaptop)でも-FREQ 33で遅れなくなったので、多分直っているのではないかと思うのですが。
2021-09-14 12:43:53
>山川機長さん
試したところ、-FREQ 33で大体あっている状態になりました。ありがとうございます。
厚かましいかもしれませんが、自分の環境だと-FREQ 16や-FREQ 12だとまだズレるようです。
初代機でも再生できる(うんずで確認)負荷にしたので16MHz(更にメモリウェイトありでも)相当でも問題ないはずなのですが、設定すると前バージョンより改善はされていますが音声の方が早く流れている状態です。
2021-09-14 19:28:20
とりあえず、改善はしているようでよかったです。しかしFREQを下げた方が遅れるのは意外ですね。VMの実行に余裕があるからタイミングは遅れなくなるはずなのですが。
ん? ひょっとするとFREQを下げると1ms (時間調整のインターバル) で実行できるインストラクションの数が減るから、1インストラクションあたり512nsの返済だと返し切れてないのかな? REP MOVSD とかはどれだけ長くても1インストラクションと数えてるし。1msだと1000usだから16MHzだと16000サイクルで、700000nsの負債があると1367インストラクション必要でインストラクションの平均が11クロックを超えてると返済しきれてない計算になりますね。多分16MHzだと負債は減りそうですが、動画再生だとREP系のインストラクションを多用してると、1インストラクションの平均クロック数が結構多いのかな。今、負債が長期間にわたって積みあがってしまわないように、1msのインターバルで返済しきれなかった時間負債は踏み倒しているので、画面転送があったときだけ踏み倒した分ずつ時間が遅れていってるかもしれない気がしてきました。そうであれば、負債を次のインターバルに繰り越すようにすれば改善するかな。いろいろ試してみます。
2021-09-14 20:58:49
多分遅れてる原因は、予想通りみたいです。pri timebalanceだと、直前の64/1000秒分しかバランスを表示しないのですが、それよりももう少し低い頻度でかなり大きく遅れる区間が発生するようです。返済しきれなかった場合のみ時間負債をプリントしてみたら、ときどき2ms (VM1ms分の処理をするのに実時間3msかかった)とか出ていたので、これが繰り返すとさすがに遅れてきそうですね。それでも、33MHz駆動だと区間内に実行するインストラクションが多い分影響が見えない程度までキャッチアップしてしまっていたようです。なお、512ns/instructionと思ったらヘッダを見直したら1024nsでした。
が、時間負債を複数区間で返済すれば(踏み倒さなければ)改善するかと思ったのですが、これがなぜかほとんど結果に影響がなくて、果たして繰り越すように書いたコードが間違ってるのか、本質的に発想が正しくないのか調査中です。
2021-09-15 07:49:51
ぎゃー!時間合わせるのにtownsTimeじゃなくてcpuTime使ってた!ということに気が付いて直して、ついでに一念発起してタイミングの取り方を見直したら、シャーロックホームズの探偵講座の動画が普通に再生できるようになった!と、思ったら一度成功したけど二度目は成功しませんでした。しかし、多分、ディスクアクセス時の時間負債が原因だったらCD-ROMぐらいだったらオンメモリに読み込むオプションを追加することで案外解決するのではないかと見ています。
なお、ソース先ほどPUSHしました。BAD APPLEの方は、12MHzはまだきついですが、14MHzぐらいだったらほぼ完璧なタイミングで再生できると思います。時間負債が長時間積みあがってしまうのを防止するために、2ms以上の負債は踏み倒すようにしている関係かもしれません。が、クロックを落とした方が負債は発生しにくいはずなのですが、この点はまだ謎です。なお、1インストラクションごとに負債を返済する方式は非常に場当たり的に作った方式だったのでこの際やめることにしました。
多分なのですが、時間負債が発生しにくくすれば改善していくはずなので、ディスクイメージの読み込みを別スレッドにすることでほぼ改善するのではないか、と、思ってます。
2021-09-15 13:11:01
対応ありがとうございます。
Bad Apple!!の方もちょっとだけ更新してみました。
https://drive.google.com/file/d/14jk80HTWxvjDD-W0ZnGfWnVvlz0bNY2V/view
動画
https://www.youtube.com/watch?v=U4nU7ZKzFcs
横1ドットしか変化しない箇所はランレングス圧縮するのを飛ばして2ドット以上としてましたが、データ量が4KB以下に収まるフレームは圧縮するのをやめました。
フレーム毎に解像度の変化が生じる方が逆に目立つかな、と思って全フレームこの手法を取ってましたけど、津軽で同期しない問題の原因が分かったのでちゃんと確認してみたら解像度の変化よりも荒い画質が続く方が問題でしたね。
プログラム自体には変更はなくデータのみの変更、大半のフレームで解凍時間が伸びてはいますが、まだ負荷的に大したことはないので初期型相当の速度でも再生可能な状態のはずです。
一秒間のデータ容量的にも映像(4KB * 30fps) + 音声(22KB)で計142KBなのでデータの読み込みを工夫すればデータCDからの直接再生も間に合いそうなんですが、実機もなく検証もできないのでそこまで実装するかは決めてません。
2021-09-16 01:39:17
新バージョンも試してみました!なお、勝手ながら、CMUで今日の授業の最初にスクリーンさせていただきました。うちのクラスは10月中に各自デモを作るという課題を出すので、非常に良い例題になりました。ありがとうございます!
ところで、画面を見て思ったのですが、Xの偶数ピクセルと奇数ピクセルが入れ替わってないですかね? 確認しようと思って、 _fill_charのところを、
unsigned char c=*color_pointer;
_fill_char (screen_buffer_pointer, *num_pointer, (c<<4)|((c>>4)&0x0f));
このように変えてみようと思ったのですが、僕が持ってるバージョンのHigh-C Multimedia Kitにはhis.hが入ってなくてコンパイルできませんでした。386ASMのディスクも見てみたのですが、入っていなかったようなのですが、新しいバージョンのHigh-Cに付属のライブラリでしょうか?
試しに津軽側でXの偶数と奇数を入れ替えてレンダリングしてみたところ、ギザギザが無くなりました。意図したエフェクトだったらごめんなさい(^_^;)
2021-09-16 08:41:19
奇数偶数ピクセルの入れ替えをデータの方で修正しておきました。ついでに2ドット圧縮する前に4階調化でデータサイズが収まるか確認してからパック化するようにしてみました。
Googleドライブのファイルをそのまま更新したのでダウンロードリンク自体は同じです。
改良版の動画
https://www.youtube.com/watch?v=S8bP73y_qLc
解像度が低くてもディザリングになるかと思って手抜きしていた箇所でしたが、圧縮プログラム側で入れ替えて見てみたら問題なかったですね。
これ以上画質を上げるとなると実解像度自体上げることになりそうですが、デバッグ用にフレームレート表示機能つけた時にちょっと処理速度が怪しくなっていたのと、間違って(?)CD読み込み化に着手したら読み込み容量が問題となるのでこれで限度としています。
"his.h"は割り込み支援プログラム「HIS」のヘッダーファイルです。
TOWNS DOOMのソースコード内に一緒に収録しておいたものか、oh! FM TOWNSに付属していた天晴 Vol.2 CD内からHIS.LIBをHigh CのSMALLフォルダ、HIS.HをINCフォルダにコピーするかソースやリンカで直接指定すれば使えるはずです。
自分が使っているHigh CはV1.7 L12なのですが、もう一つバージョンが上のL13も存在するような情報があるんですが詳細は分かっていません。
2021-09-16 12:15:51
なお、Xが偶数と奇数のピクセルを津軽のrender.cppで無理やり入れ替えた場合の動画です。無理やり入れ替えてるので、Towns MENUとかコンソールとかの表示はガビガビになってます。
https://1drv.ms/v/s!AmlM0OLrEo8vgfg9EzlVK8LDe4CotQ?e=rSGVX3
試しにCD-ROMのバイナリをメモリに全部読み込んでしまうコマンドを追加してみたのですが、シャーロックホームズの探偵講座の動画はどうしても途中から音が変になりますね。どうもシャーロックホームズの探偵講座は全力でCDを先読みするらしく、2.5Xスピードぐらいになると、リングバッファの先読みしすぎ(まだ使ってる部分を上書きする)でクラッシュするらしいという問題があるのですが、1Xにスローダウンしてもクラッシュはしないものの音は崩れてしまいますね。何が合っていないのか。。。。
2021-09-16 12:16:44
たびたびすみません、HIS_はVSYNC割り込みの設定に使っているようだったので、clock()でフレームをカウントするように書き換えてコンパイルできました! _fill_charの行を、
unsigned char c=*color_pointer;
_fill_char (screen_buffer_pointer, *num_pointer, (c<<4)|((c>>4)&0x0f));
このように修正することで、ギザギザが無くなることが確認できました。よかったらご検討ください。
2021-09-16 13:08:55
あ、ごめんなさい、行き違いになってしまいました。(コード書き始めると他の注意が散漫になる)。ありがとうございます!
2021-09-16 13:14:18
なお、実機2MXでBAD APPLE!!の動作を確認しました!実機の方が音が津軽より音がいい気がしますね。やっぱり44.1KHzに伸ばすときに線形補間ぐらいしないといかんのかなあ。
2021-09-17 06:33:50
実機での動作検証ありがとうございます。
Demosplash 2021が開催されるようならちょっと修正(デモ中の終了ボタンの追加など)して送ってみようかと思います。
2021-09-17 10:07:09
と思ったら、他人の著作物部分が引っかかるかもしれなかったですね。
2021-09-17 10:25:34
そうですねえ。移植ものだと、デモコンペには出せないですねえ。ですが、スクリーニングで流せるように推してみます!かく言う僕も、Townsのスプライトを使ったデモを書こうと思ったところで、自分には絵が描けないという現実に直面して止まってました。ちなみに、津軽の音が悪いと思ったら、単に音が割れてたようで、PCMVOLを下げて、PCスピーカーのボリュームを上げたら割とまともになりました。
Demosplash 2021は開催することはほぼ決まりなのですが、人を入れてできるか、去年みたいにオンラインにするかまだ決まってません。人を入れても大丈夫そうな気がするんですけどね。
2021-09-17 11:46:00
互換フォントROMの一部の字形が異なっていた(0xe4と0xe7の文字が入れ替わっていた)ので、直したものを
https://github.com/pinterior/FMT_FNT.ROM/releases/tag/1.0 の fmt_fnt-1.0.1.zip に置いておきました
2021-09-18 02:23:43
pinさん、
ありがとうございます!使わせていただきます。
ところで、ハードディスクリードアクセスを別スレッド化したソースをPUSHしてみました。多分、ファイルをオープンして読んでクローズするという処理は山のようにロックとかアンロックが発生していると思うので、大した負荷もかからずアシンクロナスにディスクを読むようになったと思うのですが、予想に反して12MHzだとまだBad Apple!!は遅れますね。初代TOWNSのメモリウェイトを考慮すると多分10~12MHz相当ぐらいで大体合ってると思うのですが。
2021-09-20 08:04:54
BadApple!!の20210915のほうHCで動かしてみました。
高速モードも互換モードもほぼ差が分からないくらいスムーズに動きました。
東方系コンテンツをTownsという別の時代のハードで動かすというのが面白いですね。
津軽でも同じように動くし凄いですなあ。
2021-09-22 22:23:26
動作報告のほうであったALLTYNEXの4面ボスは、VRAMをみてみると上2ラインからのコピー(ただし後半128KB側でのみ描画)で間違いなさそうだったので、
以前やりかけだったダブルバッファスプライトを整理してPRにしておきました。
スキャンライン風演出も偶数・奇数フレームで消える行が変わり、実機に近くなったと思います。
また、個人的に好きなデモのひとつであるフリコレ11の \T_OS\DEMO\MOTPLAY も動作するようになります。
このBBSで問題報告されていたジェノサイド2やソースコメントで触れられていたシャドウオブザビーストなどでデグレがないといいのですが、手元ではちょっと確認できないです。
ところで今の津軽はスプライトのSPYSビット(スーパーインポーズ)を無視していますが、
ALLTYNEXの挙動をみるにこのビットが立っていると、本来ドットを打つ場所(透明でない場所)に
透明色を書き込むことができるんじゃないかなという気がします。
2021-09-25 09:06:34
Pull Requestありがとうございます!Githubの方にコメントを上げたので、詳しい話はGithubでということで。しかし、更新個所を読んでいて、うーん、RunScheduledTasksはCPUインストラクション一個ごとにチェックしてたんだよなー、と、思って一応確認しようと思ったら、なんと!VmBaseのRunScheduledTasksがInlineになってないということに気が付いてしまって直しましたが、vmbase.h/cpp, towns.h/cppの変更なのでMergeには影響無いと思います。1インストラクションごとに関数呼び出しが1個減るとちょっとはスピードが上がるのではないか、と、期待したのですが、案外変わらんですね(^_^;)
2021-09-26 00:37:52
pinさん、
修正ありがとうございました!Mergeさせていただきました!こちらの自動テストは全て成功で、Shadow of the Beastはスプライトがチラつくものの(前からだったかもしれない)プレイに支障が出るレベルでは無さそうで、Genocideも僕が下手であまり先に進めない以外は問題無さそうです。SpriteのState Variableがふたつ増えた分、旧バージョンでセーブしたStateファイルだと多分ズレるので、その点はこちらで直しました。
大航海時代のオープニングがものすごいスピードで流れてしまう問題を解決したら新しいリリースにしようと思ってるところですが、水曜までになんとかならなかったらそのままリリースにしようと思ってます。IOアクセスを見たらFree Run Timerをモニターしてるっぽいのですが、結構実機に近い挙動になってるはずなのにな。大航海時代は、高校の頃一年下の後輩が学校にあったPC88(だったと思うがメガドライブだったかも)でプレイしてるのを見ておもしろそう、と、思っていたので、冬休みにでもクリアを目指してみようと思ってます。
2021-09-26 07:58:34
大航海時代のオープニングがあり得ないスピードでスクロールしてしまうのはきっとI/Oの実装が悪いのだろうと思ったら、ただのBUSY LOOPでタイミング取ってた。。。。orz
2021-09-26 09:15:36
今は画面全体を一方のページから表示することになるのですが、
実機では DP1 による表示ページ選択、SPENによる DP1 の有効無効は上から下への走査中にも機能するので
実機の動作を期待して DP1 や SPEN をいじっている途中に画面更新タイミングが来ているとチラつくというのはあるかもしれません。
2021-09-26 09:15:45
なるほど!たしかに、プログラムが積極的にSPENのオンオフを制御してるから表示ページ選択もいじってるかもしれないですね。
ただ、前はSPENをオフにしたタイミングで最後に一度レンダリングしてやることで対応していたのですが、同じ修正を入れてもチラつきが残ったままでした。が、プログラムが自主的に切り替えまで制御していてそれがうまくいってないのだとすると可能性があるかもしれないですね。しかし、シグノシスのゲームは、「そこいじったらだめだろう」という微妙な書き方をしてるのが多い印象ですね。
だとしても、プレイに影響が出るほどでもなさそうです。
2021-09-26 23:44:01
はじめしまして。
お手数なのですが、レス2番には使用方法について解説されていますが、ステートセーブ・ロードのやり方についてもこちらで解説していただけないでしょうか?
メニュー【State(s)】にある【Save Machine State(S)】を選んでも、TSateファイル?のことが分からずセーブを実行することができません。
どうかエミュ初心者をお助けくださいませ。
2021-11-03 12:47:34
>263 ドシロウさん
ステートセーブについては、VM(仮想マシン)が走っていない状態・・・つまりは、エミュレーション前ではセーブできません。
GUIですと、各種設定後に右下の「START」ボタンを押してエミュレータを動作後にエミューレータ画面の右下に有る「MENU」をマウスクリックするとステートセーブが可能です。
他のエミュレータでは「どこでもセーブ」とか言われる機能ですので、エミュレーションを実行中でないとセーブできないと言うわけです。
2021-11-04 23:19:45
ドシロウさん、
はじめまして。あれ?State Saveできなかったですか?単にファイル名を指定するだけでセーブできるはずになってるのですが、失敗しますか?拡張子は、適当に.TStateというのにしてしまったのですが、何でもかまいません。
ひょっとすると、ディレクトリ名、ファイル名に全角文字が入ってると失敗するかもしれないので、半角英数字だけのディレクトリにセーブできるか試していただけますか?
2021-11-04 23:26:50
お返事ありがとうございます。
ディレクトリ名やファイル名から日本語を排除してみましたがステートセーブはできませんでした。
本来であれば、
1.メインウインドウからSave Machine Stateを選択すると、Save Machine Stateのウインドウが表示される。
2.ここで【ファイル名(N):】項目のTstateファイルに適当な名前(今回は01としました)をつけて【開く】を選択する。
3.Tsugaru_Townsフォルダ内に自動的にTstateファイルが作成されてセーブが完了する。
という流れなんでしょうか?
私の環境ですと、2で【開く】を選択してもTstateファイルが作成されません。
OSはWindows 8.1になります。
2021-11-05 18:11:19
おおなるほど!Windows 8.1なんですね。Windows 7以降は対応できているはず、なのですが、確かに既にテストできる環境が無いのでテストしていませんでした。
津軽GUIを起動したときに一緒にコンソールウィンドウが開いていると思うのですが、ファイル名を選択した後で、コンソールウィンドウに何か表示が出ていないかわかりますか?本来であれば、
>SAVESTATE "C:\Users\soji\Documents\Tsugaru_TOWNS\test.TState"
Saved C:\Users\soji\Documents\Tsugaru_TOWNS\test.TState
というような表示が出るはずなのですが、何か違うメッセージが出ていないでしょうか?
2021-11-05 22:35:55
ありがとうございます。早速確認してみました。
2.ここで【ファイル名(N):】項目のTstateファイルに適当な名前(今回は01としました)をつけて【開く】を選択する。
上記を実行した時のコンソールウィンドウには、
>VM:Error: Cannot save file.
>Deleted 1 dialogs scheduled for deletion.
というメッセージが表示されます。
2021-11-06 12:27:05
早速ありがとうございます!何かファイルの書き込みでしくじってるようですね。VM:Error:Cannot save file.の上の行にSAVESTATEコマンドの行が無いですかね? SAVESTATEコマンドに続いてファイル名が書いてあるはずなのですが。
2021-11-06 14:25:28
メッセージはこの2行のみになります。
お手数ですが、コンソールウィンドウの画像をアップロードしたのでご確認いただけますか?
https://d.kuku.lu/4a80eff97
2021-11-06 16:52:19
スクリーンショットありがとうございました!あ、そうか。同じプロセスにしたからコマンドのエコー出ないんですね。コマンドのエコーが出るように書き換えますんで、少しお待ちください。
とりあえずなのですが、Profileのセーブとロードは普通にできますか?
2021-11-06 23:58:54
Profileのセーブとは、[Files(F)]メニューにある[Save Profile(S)]や[Save as Default]のことでしょうか?
それでしたらセーブは可能です。
Profileのロードとは何を指してるのでしょうか?理解不足で申し訳ありません。
2021-11-07 13:43:02
早速ありがとうございます!それです。
もう一点確認をお願いできますか?VM起動中にメニュー(FD0->Select FD Imageなど)からCDやFDイメージの切り替えはできますか?
2021-11-07 23:32:51
確認しました。
[FD(0)]から[Select FD Image]の切り替えは可能です。
上記操作後、コンソールウィンドウには「VM:Loaded FD image.」と表示されます。
この後、[FD(0)]->[Select FD Image]で、Open FD0 Imageのウィンドウを表示すると、切り替え後のイメージに変わっています。
[CD-ROM(C)]から[Select CD image]の切り替えは不可でした。
上記操作後、コンソールウィンドウには「Loaded Disc Image:(フォルダやファイル名が続く)」と表示されます。
この後、[CD-ROM(C)]->[Select CD Image]で、Open CD0 Imageのウィンドウを表示してもイメージは変わっていません。VM上でも切り替え前のCDイメージが動作し続けます。
2021-11-08 13:58:20
ご確認いただきありがとうございます!CDの切り替えができないのも変ですね。
状況を整理すると、
(1) FDはロード可
(2) CDはエラーが出ないのに入れ替わらない
(3) ステートファイルはコンソールにエラーが出て読み書きできない、というか書けないので読めるか確認できない
という状況ですね。FDでエラーが出ないということは少なくともVMにファイル名は渡っているはずですね。なぜCDが変わらないのか、なぜステートファイルだけ書けないのだろうか。ちょっと今週はDemosplashなので、来週になると思いますが、詳しく見てみます。少しお待ちください。
2021-11-11 02:16:21
遅くなりましたが、ついさっき出したリリースで、Windows 8でGUIからステートセーブ・ロードができない問題は多分解決していると思います。お時間のあるときにでもご確認ください。
2021-11-26 08:12:08
v20211125にて、Windows 8.1のGUIからステートセーブ・ロードができることを確認しました。
ご対応いただきありがとうございました。
2021-11-26 17:32:13
そういえば、津軽開発開始から2周年が経過しました。1月16日からだったとうろ覚えだったのですが、1月16日はメモに大雑把な概要を書いただけで、Gitのログによると1バイト目のコードを書いたのは1月17日だったようです。これまで、多くの方々に助けていただいてここまで続けて来れました。ありがとうございます!
引き続き津軽をよろしくお願いします!
2022-01-18 04:27:28
> 85 山川機長さま
> (略)実家から回収してきたOASYSのフロッピーディスク読めなかったし。
OASYS FDですが、トラックゼロのフォーマットだけがフツーの倍密度「MFM」フォーマットではなくて
単密度「FM」でフォーマットされていたような気がします。その他のトラック1以降はMFMだったような。
今確認したら、TOWNSテクニカルデータブックのディスクBIOSのパラメタにMFMとFMのビット指定がありますね。
BIOSを駆使すればセクターの抽出はできそうな気がします。
AH=00h; ドライブモード指定で、
・AL=20h; デバイス番号 上位ニブル=2(FDD), 下位ニブル=0(ドライブ番号)
・DL=??h; b7=1(FM), b4b3=00(2HD), b1b0=??(セクター長:128,256,512,1024)←OASYS FDのトラックゼロのセクター長がわかりません…。トライアンドエラーで確認…でしょうかね。
・BH=02h; ヘッド数:2
・BL=28h; セクタ数:40…OASYS FDのセクター数が不明ですが、セクター長が最小の128バイトと仮定して、短密度だとトラックに5000バイトぐらいデータが書けるとして40セクターぐらいを暫定で指定でしょうか。
AH=07h; セクターの検査で、CX=0:シリンダー番号、DH=0:ヘッド番号、DL=1;セクター番号、BX=40:セクター数で実行して、
BXの返却値を読めば、何セクターあるかわかるかもですね。
セクター長が AH=00h で指定したときのものと異なる場合 AH=07h でエラーがあるかもですが、その場合は
セクター長を AH=00h で変更して(128→256→512→1024)からのリトライでしょうか。
ところで以下に書いてあったフォーマットの件ですが、
http://ysflight.in.coocan.jp/FM/towns/writefdimage/j.html
IOCTL_DISK_FORMAT_TRACKS_EX の例題が見つからなかったとありましたが、
IOCTL_DISK_FORMAT_TRACKS の例題なら以下にありました。
「DeviceIoControlを使って、フロッピーをフォーマットするには?」
https://okwave.jp/qa/q153911.html
こちらの FormatPara.MediaType = F3_1Pt44_512; を
FormatPara.MediaType = F3_1Pt23_1024; // ※
(※: https://docs.microsoft.com/ja-jp/windows/win32/api/winioctl/ne-winioctl-media_type )
に変更すればいけるかもしれませんね。
IOCTL_DISK_FORMAT_TRACKS の部分も IOCTL_DISK_FORMAT_TRACKS_EX にして
エラートラック用のメモリーを渡せばいけそうな気がします。
すべて仮定の話ですみません(汗)
2022-01-22 11:37:03
TGDRVを試してみました。良い感じに共有できています。ありがとうございます。
ただ、VZ Editorのファイラーで、共有ドライブがボリュームラベルのみとなってしまうようです。
DIRコマンドなどでは、sAttr = 0x08 でボリュームラベルを読んでからファイルの一覧を sAttr = 0x16 で読んでいるようですが、
このファイラーは sAttr = 0x18 で一度に読んでいる(?)ようです。
FILMTNは問題なく動くのであまり困らない気がしますが、一応ご報告まで。
2022-03-10 00:27:54
> カトさん
情報ありがとうございます!実家から回収してきたフロッピーディスクはカビがひどくて読めなかった方ですね。一応アルコールでクリーニングは試みましたが、断念しました。ディスクのメディアの判定はどうやってやっているのか、僕もまだよくわかってないんですよね。2DD/2HDの判定だけでなく1.23MBと1.44MBの判定もどうやってやっているのか。その影響でMAKED77.EXPはディスクサイズをパラメータで指定することになっているのですが、いまいちなので自動化したいと思っているのですが。正式なやりかたはそのうちDisk BIOSを解析して確認してやろうと思っているのですが。
> pinさん
おおなるほど。VZ Editorはどこかに残っていたはずなので、確認してみます。というか、sAttr=0x18の場合ボリュームラベルとその他ファイルを全部渡すようにすればいいんですね。そのように変更してみます。
2022-03-13 00:53:29
VZどこかにあったはず、と、思ったのですがどこにしまってしまったか発見できなかった(RED2は見つけた)のですが、非常に単純な解決でsAttr==0x08の場合のみVolume Labelを返して、他のフラグが立っていたら sAttr&=~8 としてVolume Labelが無かったことにしてみました。ソースをPUSHしたので、お時間のあるときにでもお試しください!
2022-03-13 01:25:24
漢字変換方法や全角入力の方法や設定が良くわからないです
別のTOWNSエミュレーターでは設定次第で全角入力や漢字変換ができていたけど(ただ、とあるキーを入力してしまうと一時的にフリーズっぽい現象が起きることはある)
ヒントわかりますか
JOYSTICKとか別のコントローラーを使わないと無理ですか
大至急ではありませんが漢字変換や全角入力ができていない原因究明をおねがいします
2022-03-14 16:51:38
OAKのキーって何を使うんでしたかね?「かな・漢字」などは日本語キーボードにも載ってなかったりするので、キーマッピングを変更するか、ゲームパッドのボタンに機能を割り当てるか、ソフトウェアキーボードを使うしかないかもしれません。僕はそもそも日頃英語キーボードなもので、日本語入力が必要なときはあきらめてソフトウェアキーボードを使ってます。OASYSでバシバシ文書が書けるようになると格好いいんですけどね。
2022-03-14 22:38:06
masterをpullしました
VZファイラーでもファイルが見えるようになりました
ありがとうございます
2022-03-15 01:08:48
アフターバーナーで操作しないでいると始まるデモ中なのですが、エミュ(津軽、うんづ)では ファイヤーとか爆発音のPCMが鳴るのですが 実機では鳴りません。
最初実機の故障かと思ったのですが、ゲーム中は鳴るし 他の実機でも同様にデモ中は鳴らないので鳴らないのが正常と思われますが 他の方の環境ではどうなのか気になります。
2022-03-20 10:41:19
ご報告ありがとうございます!実機MXで確認しました。はて、何を忘れてたかな?って思ったら、I/O 4D5HのFM/PCM Muteをばっちり無視してるし。とりあえず、この点を修正したソースをGithubにアップロードしました。次のリリースから有効になります。ありがとうございます!
ところで、このMuteフラグは、完全に音は消えないんですね。実機MXでは、Afterburnerのデモ中は音がものすごく小さいですが鳴ってました。
2022-03-20 13:49:50
HCにL51のインストールがエラーなくできました!
ありがとうございました!
2022-03-20 18:25:05
すみません誤爆です(^^;
2022-03-20 18:25:41
ありがとうございます。2つのエミュで鳴っていたので焦りました。
実機、再確認したところ 元々 動作確認していたV-Townsではデモ中はやはり聞こえませんが CXのほうは、確かに ディスクの回転音より小さいくらい?ですが何か聞こえます(^^;
2022-03-21 11:40:27
共に何が起きているのか追いかけられておらず、環境依存の要因もあるかもしれませんが、
TOWNS側で MASM を実行したとき(DOS6 + MASM5)、出力先が tgdrv の共有ドライブですと、
リストファイルやオブジェクトファイルを書き出せずに失敗するようです (0バイトのファイルが残る)
また、DOS6 + TOS環境 (HIMEM.SYS, EMM386.EXEはTOSの T_FILE\DOS6\DOS 由来のもの) で SMARTDRV /U を実行すると、
プロンプトに戻らず、キー入力でTOWNS側が再起動します。実機では問題ありません。
2022-03-22 01:44:43
おおなるほど。うちの環境で試したところ、最初の一度だけSRC.OBJの書き込みに失敗したのですが、その後津軽を再起動しても失敗しなくなってしまいました。
しかし、なぜか DEL SRC.OBJ としても津軽上からSRC.OBJを消すことができなくなってしまったので、現在関連を調べています。
それから、SMARTDRV /U はCD-ROMキャッシュのためのモジュールを読み込まない、とありますね。見るとINT 2FHが出ているので、何かネットワークリダイレクト関係みたいですね。こちらも調査してみます。
2022-03-22 10:37:22
DOS6でDeleteができない問題は、INT 2FH AX=1105H (CHDIR)が、失敗したときAX=2 (File Not Found)を返していたのですが、正しくはAX=3 (Dir Not Found)を返すべきでした。果たしてこれがMASMの問題と関係しているのかはわからないのですが、ソースをPUSHしたので試してみていただけるでしょうか?
SMARTDRVは多分TGDRVが管理するドライブにキャッシュを設定しようとしてしくじっているのではないか、と、思います。多分以下のINT 2FHの呼び出しに対して正しく応答するようにさせれば良いと思うので、やってみますが、正しくは何を返すべきなのかがわからないので、難航するかもしれません。
INT 2FH Intercept. Req=4A10
INT 2FH Intercept. Req=4A11
INT 2FH Intercept. Req=4A11
INT 2FH Intercept. Req=150B
2022-03-22 11:14:48
b0cd9ceb で試してみましたが、変化ありませんでした。
https://imgur.com/a/rUnjY8H
https://gist.github.com/pinterior/060bc7fae1567b385ffe88882a3645a8 (1109のとき、CXを表示するようにしたログ)
Req = 1109, CX = 0 のときに何か特別扱いが要るのかもしれません。
smartdrv /u は tgdrv 導入前の v20220117 でもダメなようです。
https://imgur.com/a/hSWA4nP (2枚目はドライブ構成)
/u を与えない場合はうまく動作するのですが、なんでしょうねえ。
2022-03-23 00:45:33
いや、 Req = 1109, CX = 0 は単に現在位置の取得でしょうか。うーん…
2022-03-23 01:34:53
状況再現できました!INT 21H AH=45HでHELLO.OBJのファイルハンドルをDuplicateして、その後、AH=3EHで元のファイルハンドルとコピーしたハンドルをクローズしているようなのですが、TGDRVから見ると二度同じファイルをクローズしようとしているように見えるので、既にクローズされたファイルハンドルを再度クローズしたとき、TGDRVはエラーを返しています。ところがMASMはエラーが返ってこないことを期待しているので、エラーを返さないようにすれば通過するようです。
既にクローズしたファイルハンドルを再度クローズしたとき無視するというのは、これが正しい解決とは思えないのですが、しかし、INT 21H AH=45HのタイミングでINT 2FHを呼んでない(というかそもそもINT 2FHにはDuplicateというコマンドが無い)ので、TGDRVからはリファレンスカウントなどで同じファイルが複数のハンドルからアクセスされていることを知ることはできません。
ということは、例えばDuplicateされたファイルハンドルをクローズしようとした場合は何もしないというような対応が必要な気がしますが、Duplicateフラグとかありましたっけかね?
2022-03-23 06:59:42
あ、そうか。ファイルハンドルとSysten File Tableは別物だった。Reference Countの管理はDOSがやってるからカウントが1の場合のみ本当にクローズすればいいのか。多分なんとかなりそうな気がしてきました。
2022-03-23 07:14:47
直したソースをPUSHしました。MASM問題は解消していると思います。
SMARTDRV問題はまだ解決してないですが、/UをつけるとINT3を出してますね。ドライブのスキャンまでは共通のようなので、どこで分岐したのか調べれば原因がわかりそうな気がします。
2022-03-23 07:32:22
SMARTDRV /U でリセットしてしまう問題は、INT3命令が出てしまうのは正しいような雰囲気ですね。コマンドラインをスキャンしながら /U を見つけて分岐した直後2ステップでINT3命令になっているので、バイナリが壊れているのでもなければ正しい処理のようです。
だとすると、INT3の実装が間違ってる可能性がありますね。単に INT 03H と同じ処理をさせていたのですが、何か違うのかもしれません。引き続き調べてみます。
それで正しいかどうかは別として、INT3をNOPに置き換えたらクラッシュしなくなりました。そもそもこのINT3はBreak Point割込みなので、デバッグ用のインストラクションが消し忘れではないかという疑いを持ってます。
2022-03-24 01:25:14
対応ありがとうございます。MASMは問題なくなりました。
SMARTDRV /U は HIMEM.SYS だけ(EMM386.EXEなし)だと問題ないことに気付いたのですが、とすると仮想86モード関連でしょうか。
Windowsとの相性がよくない謎につながればよいのですが。
2022-03-24 03:34:41
そうですね。僕もWindows 3.1関係の何かが見つかるのではないかと期待して調べているのですが、INT 3のハンドラにはいって直後に、
0048:000000BB 6A00 PUSH WORD PTR 00H
0048:000000BD 6A00 PUSH WORD PTR 00H
この二つの PUSH 0 がある影響で、それ以後スタックが4バイト確実にずれるようになっているので、本当にこのハンドラに入るのが正しいのかという疑問を持っています。が、Intel 80386マニュアルによると、INT FROM VM86の場合は、必ずCPLが3->0になるので、権限の問題は無くて、IDTもきちんと書いてあるからIDTが無い例外が出る可能性も無くて、何が間違っているのだろう?
他のFAULTだと.... EFLAGS, CS, EIP に続けて追加情報がPUSHされて入ってくるのでその分を調整しているかと思ったら、ハンドラ内でおそらくSSを読むべきところでSPを読んでいて、SPを読むべきところでFLAGSを読むようになってます。
2022-03-24 10:17:51
あっ、i486 Programmer's Reference良く読んだら、INT3はVM86モードだと、
Interrupt 3 (0CCH) generates a breakpoint exception
って書いてある。この0CCHってなんだ、、、と思ったらopCodeか。InterruptじゃなくてExceptionだとなんか違うんだったっけ????
もう少しよく読んでみます。VM86モードだとINT3の挙動がやっぱりちがうっぽいですね。
2022-03-24 11:52:57
うーん、やっぱりまだわからないものの、
"EMM386 例外エラー #03 - リターンキー を押すとリブートします."
という文字列を表示しているものの、IF=0なので画面がリフレッシュされずに見えてなかったということがわかりました。キー待ちになったところで、強制的にFM音源割り込みを出す(INTERRUPT 4D コマンド)ことで無理やりリフレッシュさせることができます。デバッグレジスタとか実装してないことと関係あるのだろうか。
2022-03-24 12:53:09
どうも調べたところ、INT3が発生してしまったら最後、普通に戻るパスは存在しないようです。
また、EMM386.EXEがインストールされてない状態だと、INT 3のハンドラは単にIRETでした。試しに、EMM386.EXEがインストールされた状態でハンドラの最初をIRETに置き換えたところ、SMARTDRV /Uは何事もなく通過するようになりました。
だとすると、可能性として実機では(1)そもそもINT 3が発生していない (2)ハンドラが違う、のこのうちのどちらかだと思います。こちらで実機にDOS6環境を作っていないもので、pinさんの環境でMASMが動くということなので、以下のコードを実機で実行したとき通過するかクラッシュするかテストしていただくことは可能でしょうか?もしも可能であればお時間のあるときにでもお願いしたいと思います。
ASSUME CS:CODE
CODE SEGMENT
MAIN: PUSH CS
POP DS
MOV DX,OFFSET BEFORE
MOV AH,9
INT 21H
DB 0CCh ; INT3 (Prevent assembler from writing CD 03)
MOV DX,OFFSET AFTER
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
BEFORE DB "Before INT3",0Dh,0Ah,'$'
AFTER DB "After INT3",0Dh,0Ah,'$'
CODE ENDS
END MAIN
もしもこれがクラッシュするようであれば、SMARTDRV.EXEに何かの変化があると考えられます。例えば本来 INT3 の箇所には別のバイトが上書きされるべきだとか。もしもこれが通過するようであれば、ハンドラが違うことになります。これを知るためには、プロテクテドモードのIDTをゲットして、次にINT 3のハンドラのエントリアドレスを探す必要がありますが、EMM386によってVM86モードにされているとどうやったらいいもんだろうか。
津軽上だと、EMM386.EXEがインストールされた状態では、INT 3のハンドラは 0048:00BB で、最初のインストラクションは PUSH WORD PTR 00H (6A 00)になっているのですが、これが果たして実機でも同様なのか確認したいところです。
2022-03-25 02:30:57
cc c3 で試していたのですが、たしかに出力メッセージがあった方がいいなということで
b0 42 cd 29 cc b0 41 cd 29 b4 4c cd 21 と .com ファイルを作って試してみました。
中身は以下の通りです。
mov al, 42
int 29
int3
mov al, 31
int 29
mov ah, 4c
int 21
これを EMM386.EXE を組み込んだ環境で実行したところ、実機では「BA」と表示してプロンプトに戻り、津軽ではリセットでした。
ハンドラの内容はちょっと時間がかかるかもしれませんが、また後日みておきます。
2022-03-25 03:42:46
typoがありました
× mov al, 31
〇 mov al, 41
2022-03-25 03:43:47
いや気になって今みてみました。
搭載メモリ量が36MBのとき、0048:00bb の物理アドレスは 2540bb で、(ここまでは津軽で確認)
DOS-Extenderの int21, ax=250a を使って実機でその箇所のメモリをみてみると、やはり 6a 00 6a 00 66 55 66 0f b7 ec となっていました。
2022-03-25 04:16:34
搭載メモリ36MBに加え、SETUP2でアプリ領域1-3登録, HMA登録, EMS0KB, RAMディスク1024KBのときです。
2022-03-25 04:35:05
おお、さすが!早速ありがとうございます!
実機だとINT 3が出てもクラッシュせず、津軽だとリセットしてしまうんですね。津軽上で0048:00BBからトレースした感じだと、0048:00BBに入ってしまったらもはや抜ける余地はなく、必ずエラーメッセージを表示してリセットするみたいなんですよね。果たして0048:00BBに本当に飛んでいるのか、あるいは別の個所に飛んでいるのか。他に考えられそうなのは、JMPF CS:[111EH]のとび先が違うのか。津軽だと、↓で、エラーメッセージを出してキーを押したらリセットになってしまうようなのですが、実機で違ってるか見れますかね?
18C3:0000111E DB 02 01 F0
あと考えられるのは、実機で0048:00BBに EB FE (JMP self)みたいなのを書ければ INT 3 でその場に飛んでるか見れるのだろうか。どうも、津軽でのクラッシュの問題は間違いなくINT3のハンドリングに原因がありそうですね。
2022-03-25 06:20:50
あ、そうか。18C3:111EはCONFIG.SYSとかその他いろいろによって場所が変わってるかもしれないですね。うーん、こっちもMXでDOS6が起動できる環境作った方がいいかな。
2022-03-25 06:52:46
津軽で dump idt してみると、
> IDT at Linear Address=0025D500 Limit=000007FF
> 03:SEG=0048 OFFSET=000000BB P=01 DPL=00 TYPE=0E(386 32-bit INT)
実機でIDTをみてみる (sidt [0200]; 0f 01 0e 00 02) と、25d500
INT3 とき参照されるはずの 25d518 は、bb 00 48 00 00 8e 00 00 で、
P=1, DPL=0 の Interrupt Gate、アドレスは 0048:000000bb
IDTの内容は一致しています。
そして、実機で 2540bb から32バイトを eb fe の繰り返しで埋めてさきの .com ファイルを実行したところ、
なぜかプロンプト戻ってきます。(念のため fa f4 (cli hlt) も試してみましたが、同様でした)
仮想86モード側から、DPL=0のIDTエントリを参照してしまっているのがまずい感じでしょうか?
2022-03-25 16:20:53
おおなるほど!INT3が出てもそのアドレスに飛んでないんですね。実は、VM86モードからのINTのCPLチェックに関して、よくわからんのですね。↓のPseudocode を上から順に読んでいくと、INTERRUPT-FROM-V86-MODEに分岐するパターンが無くて、VM86モードは必ずCPL=3でVM86モニタが管理しているはずだからINTのCPLチェックは無いのか、それともCPLは普通にプロテクテドモードとしてチェックするのかが書いてないんですよね。
https://css.csail.mit.edu/6.858/2014/readings/i386.pdf
実機で飛んでいないということは、プロテクテドモードの IF Software Interrupt THEN IF gate descriptor DPL<CPL THEN #GP(vector number *8+2+EXT) が有効なのかもしれないですね。あとで試しにGP faultを出して通るかやってみます。
2022-03-25 21:30:56
ご協力ありがとうございました!まず、INTの処理でDPLをとび先のCSから取っていたのが多分間違いでIDTのDPLから取るようにして、Software Interruptの場合でDPL<CPLの場合はGPを出すことにしたら、無事 SMARTDRV /U も通過するようになりました!githubにソースをPUSHしたのでご確認ください。
Win3.1の方はというと、別のところで止まるようになりました。従来VM86モードから直接使うべきではなかったINTで正しくGP例外が出るようになって処理が正しくなったのかもしれません。まだ起動までこぎつけられないものの、一歩前進したように思います。
2022-03-26 00:40:30
ありがとうございます。
INTERRUPT-FROM-V86-MODE は最新の Intel® 64 and IA-32 Architectures Software Developer’s Manual にも残っていて
ちゃんとそこへ行く分岐があるので、当時の編集ミスでしょうか。
最新のドキュメントを見ると今度はいつ導入されたのか分からない機能に関連した分岐が山ほどでてくるのが困りものですが…。
ところでint3(cc)とint 3(cd 03)は命令長だけでなくIOPLチェックの有無という差があるんですね。
よくもまぁ80年代にこんなプロセッサを設計したものです。
2022-03-26 01:04:28
話は飛んじゃいますが、ネットをフラフラしていたら川合秀実さんの"川合のプログラミング言語自作のためのテキスト第三版#1 ~ 通称「10日くらいでできる!プログラミング言語自作入門」"にたどり着きました。
目的が言語自作なのですが、高速化のためにJITを導入する話があります。
Tsugaruとは目的が異なりますがJIT自体の仕組みは共通する部分も多いと思いますので何かの参考になりますでしょうか?
http://essen.osask.jp/?a21_txt01
2022-04-08 10:13:42
現行バージョンの津軽だと、ALLTYNEXなどのBGMで鳴らないパートがあったり、FM/PCMのボリュームバランスをどう調整しても音割れしたり音量が小さすぎたりするタイトルが出てくる問題があるのですが、
ソースを見るとFM/PCMの各チャネル波形を合成した最終段階になってから16bit幅(-32767~32767)のクリッピングを行っていて、
ちょっとでも大きめの音が複数音鳴るだけですぐ上限となってしまい元の波形から大きく異なった状態で出力されると推測し、
試しにチャネル毎に合成する段階で16bit以上のオーバーフローを起こしていたら波形の元値と加値をそれぞれ2で割ってから加算合成、
FM音源のボリューム調整は全アルゴリズムで同じ値の除算をしていた個所を最大値となる値から-32768~32767に収まる範囲でそれぞれ変更、
PCM音源のボリューム調整はPAN*ENV*WAVEの値を右4ビットシフト→符号付→音量調整(それぞれ左右(ch * state.volume) / 8192)→加算合成という風に変更してみました。
FM・PCMともにボリューム設定は8192基準で、ALLTYNEXのBGM問題も完璧ではないですが改善され、何度も聞いていたTownsシステムソフトウェア付属のクラシック曲のEUPも当時試聴した雰囲気に近づいた印象、音割れが発生したり極端に音量が低くなるタイトルも無くなったようです。
現行バージョンの津軽
https://www.youtube.com/watch?v=RAbuOROrx8M (「記憶の旅人」戦闘BGM FM音源の3~6chまでが殆ど聞こえない)
https://www.youtube.com/watch?v=t80Rz0NpChQ (「ALLTYNEX」1面曲 ギターの音がかなり小さく印象)
改造版
https://www.youtube.com/watch?v=7jzXi7u8Cho
https://www.youtube.com/watch?v=2HmowWEDWrk
ソースコードでは
int Gain(int a, int b)
{
int c = a + b;
if (c < -32768 || 32767 < c)
{
a = a / 2;
a += b / 2;
}
else
{
a += b;
}
return a;
}
という新しい関数を加えて
ym2612wave.cpp内MakeWaveForNSamplesTemplateで
leftOut+=(LeftANDPtn[chNum]&l);
rightOut+=(RightANDPtn[chNum]&l);
となっているところを
leftOut = Gain(leftOut, (LeftANDPtn[chNum] & ampl));
rightOut = Gain(rightOut, (RightANDPtn[chNum] & ampl));
に変更。
同cpp内のCalculateAmplitudeで全アルゴリズム【switch(ch.CONNECT)】とも同じ定数(UNSCALED_MAX)で割っているところをcase 0~3では1024、4は2048、5~6は3072、7では4096という風に変更。
rf5c68.cpp内のAddWaveForNumSamplesも
LvolCh[chNum]=(LvolCh[chNum]*ch.ENV);
RvolCh[chNum]=(RvolCh[chNum]*ch.ENV);
L>>=4;
R>>=4;
if(true!=chMute[chNum])
{
L = (L * state.volume) / 8192;
R = (R * state.volume) / 8192;
Lout = Gain(Lout, L);
Rout = Gain(Rout, R);
}
と該当部分を置き換えていく。
2022-05-01 00:19:23
おおなるほど!ありがとうございます。この手の微調整のセンスがいまいち自分にはないもので助かります!コードに反映させていただきます!
2022-05-01 10:04:32
うーん、PCMの方ってこれで合ってますかね?この修正を入れたところAfterburnerのボイスが聞こえなくなってしまったのですが。あとGain関数は、
inline int Gain(int a,int b)
{
int c=a+b;
if(c<-32768 || 32767<c)
{
return c/2;
}
else
{
return c;
}
}
このようにさせていただきました。BCCさんのコードと+-1を超える差は出ないはずです。
2022-05-01 13:15:29
Githubのほうがまだ反映されてないのでソースで確認したわけではないですが、FM音源・PCM音源共にボリューム設定は8192に変更されていますか?(ym2612.h・rf5c68.hのWAVE_OUTPUT_AMPLITUDE_MAX_DEFAULTは=8192に変更)
自分の方でもアフターバーナーの音量バランスは確認したのですが、改造前よりも音割れが無くなって実機に近づいた印象でした(下URL)。
https://www.youtube.com/watch?v=N-96jnWkLBc
2022-05-01 14:24:10
おおなるほど!ありがとうございます!8192基準というのはWAVE_OUTPUT_AMPLITUDE_MAX_DEFAULTだったんですね!聞こえるようになりました!
ソースをPUSHしたのでご確認ください。
2022-05-01 20:46:21
対応ありがとうございます。コードを確認したところ自分の記述通りで、コンパイルして試聴した結果も問題ありませんでした。
アフターバーナーついでに、スロットル操作で加速減速時に上下もしくは左右に移動できなくなる問題を解消する処理を追加できたのですが需要ありますかね?
FsSimpleWindowConnection::DevicePolling内に
if (TOWNS_APPSPECIFIC_AFTERBURNER2 == towns.state.appSpecificSetting && 0 <= throttlePhysicalId && throttlePhysicalId < gamePads.size())
{
unsigned int inputThr = (unsigned int)((1.0f - gamePads[throttlePhysicalId].axes[throttleAxis]) * 1.5f); // 0 to 2 scale
towns.AB2_Throttle(inputThr);
}
と追加して、towns.AB2_Throttleでは
・パッド判定ルーチンのRUN/SELECTの状態をスロットル状態を示すメモリアドレスに反映する箇所があることを検出したら無効化(90で埋める)、AB2起動中フラグを立てる
・AB2起動中フラグが立っていればinputThrの値が2なら1、0なら2、1なら0の値をスロットル状態を示すメモリアドレスに反映する
という処理をする形です。もうちょっとスマートな方法があるかもしれませんが、1.02版と1.03版(フリコレ1収録)で正常に動作することは確認しました。
2022-05-02 02:12:26
おおなるほど!需要は大ありですね。足しましょう!詳細を書いていただけたら反映します。
2022-05-02 10:18:46
townsapp_daikoukai.cppを参考にtownsapp_ab2.cppを新規に作成し、
void FMTowns::AB2_Throttle(unsigned int inputThr)
{
if (true != cpu.IsInRealMode())
{
if (state.ab2_frag == 0)
{
if (0x66 == cpu.DebugFetchByte(32, cpu.state.CS(), 0xeeea, mem) && 0xa3 == cpu.DebugFetchByte(32, cpu.state.CS(), 0xeeeb, mem) &&
0x44 == cpu.DebugFetchByte(32, cpu.state.CS(), 0xeeec, mem) &&0x2f == cpu.DebugFetchByte(32, cpu.state.CS(), 0xeeed, mem)) // for After Burner 1.01
{
cpu.DebugStoreDword(mem, 32, cpu.state.CS(), 0xeeea, 0x90909090);
cpu.DebugStoreWord(mem, 32, cpu.state.CS(), 0xeeee, 0x9090);
state.ab2_frag = 1;
}
else if (0x66 == cpu.DebugFetchByte(32, cpu.state.CS(), 0xef4e, mem) && 0xa3 == cpu.DebugFetchByte(32, cpu.state.CS(), 0xef4f, mem) &&
0xa8 == cpu.DebugFetchByte(32, cpu.state.CS(), 0xef50, mem) && 0x2f == cpu.DebugFetchByte(32, cpu.state.CS(), 0xef51, mem)) // for After Burner 1.02
{
cpu.DebugStoreDword(mem, 32, cpu.state.CS(), 0xef4e, 0x90909090);
cpu.DebugStoreWord(mem, 32, cpu.state.CS(), 0xef52, 0x9090);
state.ab2_frag = 2;
}
else if (0x66 == cpu.DebugFetchByte(32, cpu.state.CS(), 0xf6f6, mem) && 0xa3 == cpu.DebugFetchByte(32, cpu.state.CS(), 0xf6f7, mem) &&
0xe4 == cpu.DebugFetchByte(32, cpu.state.CS(), 0xf6f8, mem) && 0x5d == cpu.DebugFetchByte(32, cpu.state.CS(), 0xf6f9, mem)) // for After Burner 1.03
{
cpu.DebugStoreDword(mem, 32, cpu.state.CS(), 0xf6f6, 0x90909090);
cpu.DebugStoreWord(mem, 32, cpu.state.CS(), 0xf6fa, 0x9090);
state.ab2_frag = 3;
}
}
else if (state.ab2_frag == 1) // for After Burner 1.01
{
switch (inputThr)
{
case 2: // High
cpu.DebugStoreByte(mem, 32, cpu.state.DS(), 0x82f44, 1);
break;
case 0: // Low
cpu.DebugStoreByte(mem, 32, cpu.state.DS(), 0x82f44, 2);
break;
default: // Normal
cpu.DebugStoreByte(mem, 32, cpu.state.DS(), 0x82f44, 3);
}
}
else if (state.ab2_frag == 2) // for After Burner 1.02
{
switch(inputThr)
{
case 2: // High
cpu.DebugStoreByte(mem, 32, cpu.state.DS(), 0x82fa8, 1);
break;
case 0: // Low
cpu.DebugStoreByte(mem, 32, cpu.state.DS(), 0x82fa8, 2);
break;
default: // Normal
cpu.DebugStoreByte(mem, 32, cpu.state.DS(), 0x82fa8, 3);
}
}else if (state.ab2_frag == 3) // for After Burner 1.03
{
switch(inputThr)
{
case 2: // High
cpu.DebugStoreByte(mem, 32, cpu.state.DS(), 0x85de4, 1);
break;
case 0: // Low
cpu.DebugStoreByte(mem, 32, cpu.state.DS(), 0x85de4, 2);
break;
default: // Normal
cpu.DebugStoreByte(mem, 32, cpu.state.DS(), 0x85de4, 3);
}
}
}
}
滅多にないとは思いますが、リセットしたりしてもしAB2を終了した場合無関係なプログラムで書き換えが起きないよう、ab2_fragはFMTowns::State::Resetで初期化するようにしました。上記のコードも含めて自由に変更してもらって結構です。
1.01のメモリ値は山川機長さんが上げていたAB2AGAINの解析情報から推測したもので実際に試したわけではありません。
実行中、パッドのRUN/SELECTによる加速減速は無効化され(同時押し時のポーズだけは有効)、ホスト側のスロットルコントローラでLow・Highに切り替わるようになります。自分の環境だとXboxコントローラで左右トリガーを引けば加速減速しながら機体コントローラが行えることを確認しました。
2022-05-03 02:14:09
了解しました!やってみます!
2022-05-03 04:32:46
初心者の疑問に答える初心者掲示板をつくってほしい。
2022-05-04 02:34:31
BCCさん、
実装しました!まだGUIには出してないですが、-APP AB2 (または -APP AFTERBURNER2), -FLIGHTTHR joystickId axisId で有効になります。Elecomのゲームパッドで確認しました。機体の上下左右もアナログ軸で操作する、というひそかな野望もあるのですが、そのうちやってみたいと思います、あるいは、解析されましたら是非教えてください!
なお、CRTCの初期化でスロットル軸の書いてある物理アドレスをキャッシュして、AB2_Throttleの中で物理アドレスに対して書き込むようにしました。大航海時代のパッチは、マウスBIOSの初期化のタイミングを捕まえているので、ほぼ100% 000C, 0014, 0110セグメントが有効なのですが、それ以外のタイミングだと、ごくまれに割り込み処理などでCSが0008セグメントだったり0010セグメントだったりするハンパな状態である可能性があるので、マウスBIOSの初期化やCRTCの書き込みタイミングで物理アドレスをキャッシュする方法にしています。DOS Extenderがスワップとかしないからできる方法ですね。
初心者さん、
多分、「その他質問事項」スレッドがその目的のスレッドではないかと思いますので、ご質問などはそのスレッドにしていただくと良いのではないかと思います。
2022-05-04 10:42:47
山川機長さん。
ありがとうございます。皆さんについて行けるように頑張ります。
2022-05-04 15:16:01
DOS6のEDITコマンドでTGDRV上の既存ファイルを津軽側から編集した際、
元ファイルより短くなるような編集を行ったときにファイルサイズが小さくならず、元の内容が末尾に残るようです
2022-05-14 23:57:50
おおなるほど!ご報告ありがとうございます。こちらでも確認してみますが、INT 2Fがかかるとコンソールにデバッグ情報を表示していると思うのですが、EDITでセーブしたときINT 2Fの機能(AX)は何を使っていたかわかりますか?
2022-05-15 06:37:42
以下のようでした。すべてハンドルされているReqだと思うのですよねえ。
> INT 2FH Intercept. Req=1123
> G:\A
> INT 2FH Intercept. Req=1116
> INT 2FH Intercept. Req=1109
> INT 2FH Intercept. Req=1109
> INT 2FH Intercept. Req=1109
> INT 2FH Intercept. Req=1106
2022-05-15 07:28:40
ありがとうございます!おそらくハンドルの仕方を間違ってるものと思います。確認してみます!
2022-05-15 11:23:44
DOS6のEDITは、セーブするときAX=1123H Open Existing File、mode=1 (write-only)で開いてますね。可能性として、
(1) Open Existing Fileでmode=1 (write-only) のときはTRUNCATE扱いとする。
(2) Close Remote File (AX=1106H)でFile Pointerがファイルの最後よりも前だったらそのサイズにファイルを短くする。
(3) ファイルがwrite-only modeで、Close Remote FileのときFile Pointerが最後より前だったらそのサイズにファイルを短くする。
この3点ほど考えたのですが、どれが正しいのかなんか資料無いですかね?とりあえず(1)にしてみようかなあ。
調べようと思ったら Google sitesのpcdosretroが消えてるし。。。。ダウンロードしとけばよかったな。
2022-05-18 13:26:25
>Google sitesのpcdosretro
Internet Archiveにデータが保存されているようなのでそちらを参照してはいかがでしょうか?
2022-05-18 22:54:07
DOS6で int 21h の ah=3DH al=01h, ah=40H, ah=3EH で試してみましたけど、
int 21hの挙動を見る限り、対応する ax=1116, ax=1109, ax=1106 では
書き換えのみ発生してTRUNCATEされないのが正常な動作に思えます。
2022-05-18 23:49:21
原因解明しました!普通にDドライブにSaveしてINT 21Hの動きを追ったところ、最後のFwrite (AH=40H)でゼロバイト(CX=0)で入ってきてますね。そういえばと思って記憶をたどったところ、互換DOSを作ってた時も同じ問題に直面してましたね。FILE.ASMの中に、
; http://www.ctyme.com/intr/rb-2791.htm
; CX=0 will truncate or extend the file to the current file position.
; I don't support extend, but Towns OS V2.1 L31 installer uses truncation.
; Also I don't release clusters if some becoms unused.
と、いうメモを残してあったのですが、CX=0の場合、その場のファイルサイズにTruncateするもの、だそうです。多分この修正で直ると思いますので、そのようにしてみます。ご報告ありがとうございました!
2022-05-19 05:25:24
ソースPUSHしました!これで直っていると思います。
2022-05-19 07:04:50
ちゃんとファイルが短くなりました。ありがとうございます。
DOS2のドキュメントにも書かれていましたね。 https://github.com/microsoft/MS-DOS/blob/master/v2.0/bin/SYSCALL.DOC#L1478-L1480
(しかしXENIX由来のシステムコールだったとは。APIに歴史あり…)
2022-05-20 21:12:47
うーん、FMとPCMですが、どうもAmplitudeを8192にしているとSuper大戦略のトーンが音割れしますね。4096まで下げないとだめみたいです。
試しにFMとPCM両方下げて、代わりにDirect Soundの方でボリュームを上げられないか考えたのですが、既にDirect Sound的にはMAXになってました。
手元のコードでは、バランスが取れるようにFMとPCMどっちも4096にしてみたのですが、両方4096だとバランスはどんな感じですかね?
2022-06-01 15:23:37
現ソースだとFM音、PCM各chを合成する際はgainで音量調整しているのみだったと思いますが、FMとPCMの波形を合成する際もgain調整するとどうでしょうか?
2022-06-01 15:28:46
大戦略は持っていないので同じ現象なのかはわかりませんが、確認したところAmplitudeを下げたりFM・PCMのgain調整を追加してもどうも6d7e0743c0885487be0d5abe7fb91b22da6a291c以降から音割れやノイズが発生しているようでした。
https://twitter.com/bcc2528/status/1532219508253147136
2022-06-02 13:41:24
ううむ、そうですか。CDDAをストリーミングにするのは犠牲が大きすぎるようですね。
うちの環境で発生しないので原因ははっきりわからないのですが、多分、ストリーミングに処理がかかりすぎて、FM/PCMのWAVEを送るのが間に合ってないのだと思います。例えば、PCMのレベルが+10で一定していると、ゼロではないのですが、振動しないので音がしませんが、もしも、この一定+10のWAVEを間髪入れずに送信できないと、間にゼロの区間が発生してしまって、結果的にノイズに聞こえます。6d7e0743c0885487be0d5abe7fb91b22da6a291cの前後ではFM/PCMはいじってないので、このぐらいしか原因が思いつかんですね。
ちょっとCDDAのストリーミング化は断念して元に戻します。ナディア対応ですが、Direct Soundのボリュームコントロールで対応してみます。
2022-06-02 17:08:30
ということで、Streamingはやめて、その代わりにDirect Soundのボリュームコントロールとパニングでコントロールするようにしてみました。ソースPUSHしました。これでどんなもんですかね?
2022-06-02 21:22:40
最新ソースで試したところ、
・FM・PCMに載っていたノイズは解消
・ナディアは正常に再生
・オルゴールのデータウエストロゴ再生ループ問題はまだ未解決
という結果でした。
Super大戦略の音割れはボリューム調整が問題の場合は、rf5c68.cpp内のWordOp_Add関数先頭を
value = Gain(cpputil::GetSignedWord(ptr),value);
に変更でもよいのではないのでしょうか?
Amplitudeが8192だと-32767~32767値となっているFM波形とPCM波形を単純に足してしまうとオーバーフローになってしまい最大値の状態が続くのかと思います。
2022-06-02 23:14:31
Super大戦略は、FM音源だけですね。PCMは使ってない模様です。しかし、これはAmplitude調整すればある意味なんとかなる問題ですが、それよりオルゴールが深刻ですね。ロゴ再生ループは、ロゴ画面が終わった後、またロゴ画面が最初から流れるループですか?あるいはロゴ画面最後まで行くけど次に進まない感じですか?
あ、そうか。Direct Soundのストリーミング問題、他のエミュレータはどうやってるんだろう?と思ったけど、XM7のソースが公開されてるんだから見てみよう。
2022-06-03 07:46:53
>Super大戦略
DIV_CONNECT0~7の値のどれかを倍にすれば解決かもしれないですね。
うんづの方で津軽よりも実機に近い感じのEUPを鳴らしてみて、うんづのモニタ機能でFM音源のレジスタを見て該当chのアルゴリズム設定を確認し、
SLOTOUTEV_Db_0~3が-4096~4096の値になるかと思ってその設定値にしてましたけど、実際には超えるところがあったのかもしれません。
オルゴールは、ロゴ画面が終わった後またロゴ画面が最初から流れるループでした。
XM7以外ですとPCエンジンエミュレータの「Ootake」のソースコードはどうでしょうか?
こちらもFM TOWNSと同じようにゲーム機としては世界初のCDドライブ搭載機だったということもあり、CD媒体のゲームだと大半が内蔵音源を使わずCD-DAから再生されるようになっていました。
2022-06-03 09:30:38
おおなるほど。それだと、Orgel問題はCDDAとは何か別の原因のような気がします。津軽起動時のオプションを教えていただけますか?
2022-06-05 11:42:21
データウエストロゴループ問題は原因がわかりました。
リリース版津軽と開発版で別にCMOSファイルをしていて、開発版のCMOS設定ではRAMディスクを有効にしたまま起動していたためのようでした。お騒がせしました。
ただし、その先のメッセージ画面がズレるのとマウスが動かせない症状は最新ソースでもまだ未解決のようでした。
どのバージョンから発生し始めたのかちょっと調べてみます。
2022-06-05 14:17:46
最新ソース版でもFREQを16以下にすればカーソルがプルプル震えるものの動かせる状態、v20210418までならFREQを上げていてもホスト側のカーソルに随伴するようになっていました。
2022-06-05 15:05:13
確認しました!最新版ソースでは直ったと思います。試してみてください!
2022-06-11 21:32:36
最新ソースで確認したところマウスカーソルの問題は解決しました。対応ありがとうございます。
Oh! FM TOWNSの記事を参考に1フレームで表示可能なスプライト数を計測するベンチマークプログラムを作ってみたのですが、表示数を最大の1024枚に指定すると逆に一瞬にして転送が終了してしまう症状がありました。
おそらく1024設定にするとNumSpritesToDrawの戻り値が0になってしまうのかと思います。
実行ファイルとソースコード
https://drive.google.com/drive/folders/1KDAd4OENFB20kDPm0F0hBb1avXmuCes0
検証動画50秒から、1023枚では4フレーム描画(15fps)なのに1024枚になると0~1フレーム描画(60fps)となる
https://www.youtube.com/watch?v=9ExZWcjXdwA
2022-06-12 01:04:59
ファイルはこっちでした。
https://drive.google.com/file/d/1-2AUC5IxDnptaepQpTjcW7UpXejXbMt4/view?usp=sharing
2022-06-12 01:08:19
- と & の優先順位ですね
出先なので動作は試していませんが https://github.com/pinterior/TOWNSEMU/commit/730f54342a074e6aee0a19dfc8f2b153a81dedc7 で直るんじゃないでしょうか
2022-06-12 09:01:51
ああ、本当だ!かっこひとつ足りないし。ありがとうございます!そのように修正します。
2022-06-12 16:05:27
こんにちは。
データウエストの石見銀山殺人事件ディスク入れ替え後2枚目のディスクを認識してくれません。
私は互換ROMを使っていますが、実機ROMを所持している知人は普通に2枚目も遊べているようで互換ROM側の問題なのかなと思っています。
現在の仕様として、互換ROMはCD入れ替えに対応していないのか、それとも「このゲーム」がたまたま対応していないだけなのでしょうか。
2022-07-01 20:37:31