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
>石見銀山殺人事件
ディスク交換がされるとBIOSからはエラーコード0x80が返ってくるようなのですが、互換BIOSのsys_cd.asm部分を読むとノットレディとパラメータ異常の処理しかないからですかね。
2022-07-03 09:41:46
そうだったのですね!
ありがとうございます。
なんとか実機を手に入れるしかなさそうですねw
2022-07-04 10:44:12
おおなるほど。うーん、しかし、石見銀山殺人事件はIO.SYS内のDisk BIOSじゃなく敢えてROM側の機能を使ってる、ということなのでしょうかね?sys_cd.asmに入れ替えチェックを入れるのは簡単なのですが、sys_cd.asmでは起動に必要な 0EHと05Hしか実装してないような気がするので、影響があるかどうか。。。。
あ、自分のメモで、
; CaptainYS >>
; This wait is used by IO.SYS to check time out for STATUS from CD-ROM.
; It does have a meaning.
; Moved the procedure to before 32-bit code.
とかメモしてあるな。IO.SYSから使われるルーチンもあるのか。ここがなんか影響してるのかな。一応、sys_cd.asmにディスク入れ替えチェックを入れたバージョンを作ってみて、今テスト走らせてるので、テストが通ったらGitHubに上げるのでFMT_SYS.ROMを交換してみてください。
2022-07-04 13:32:30
>山川機長様
おお?!了解しました。
お待ちしております。
2022-07-04 14:06:23
>山川機長様
ご報告です。
FMT_SYS.ROMが更新されているようでしたので試してみました。
実CD、イメージ共に試してみたのですが原因は別のところになるのかCD入れ替えを認識してくれませんでした。
2022-07-04 17:54:46
自分も確認したところ、「ディスク2を入れてマウスをクリックしてください」というメッセージでディスク2に変更してマウスをクリックしても互換BIOSでは一瞬津軽上のCDアクセスランプが点灯するものの画面が移行しない状態のようでしたが、
最近FM TOWNS マーティー買ってBIOSを吸い出しておいたんで試しにFMT_DOS.ROMだけマーティーのものと入れ替えてFMT_SYS.ROMなどは互換BIOSのままにしたところ、こちらでは問題なく次に進みました。
2022-07-04 21:41:40
おおなるほど!おそらく、FMT_DOSの問題ですね。ディスク交換のタイミングで、INT 21Hのどの機能が出てるかわかりますかね?BRKON INT 21 で止まるのですが、DOS-Extenderからだとリアルモードでのレジスタを特定の場所に書き込んで飛ぶというのを使ってるとどの機能を使ってるのかいまいち把握しにくいのですが。
というか、石見銀山ってディスク2に進むまでってそんなに早く進みます?それだったら自分でやってみた方が早いだろうか。
2022-07-04 22:20:33
brkon int 21を設定後、ディスク入れ替え画面でマウスをクリックした結果です。
CS:EIP=0008:000012B0 LINEAR:00039DC0 EFLAGS=00000046 CPL=00
EAX=00003D00 EBX=00000005 ECX=00000000 EDX=000547C4
ESI=00000000 EDI=00000000 EBP=000545A4 ESP=00054570
CS=0008(LIN:00038B10) DS=0014(LIN:00100000) ES=0000(LIN:00000000)
FS=0014(LIN:00100000) GS=0014(LIN:00100000) SS=0014(LIN:00100000)
CR0=80000001 CR1=00000000 CR2=00000000 CR3=0005C000
CF0 PF1 AF0 ZF1 SF0 TF0 IF0 DF0 OF0 IOPL00 NT0 RF0 VM0 AC0
Default Operand Size=32 Default Address Size=32 Stack Address Size=32
SS+00000000:03 ED 01 00 0C 00 00 00 46 02 00 00 14 00 00 00
SS+00000010:14 00 00 00 14 00 00 00 A4 45 05 00 01 00 00 00
Break on INT 21 DOS fopen AL=mode(0:r 1:w 2:rw) DS:DX=Filename CL=attrMask Q:\MS2
スムーズに行けば1時間程度で入れ替えシーンまで進めることができますが、ちょっとわかりにくいところに重要アイテムがあったりするんでYoutubeとかでプレイ動画を見ながら進めると楽かと思います。
2022-07-04 22:50:47
うーん、3DHということは、FOPENですね。SHSUCDXのキャッシュだろうか、と、思ったので3DHが来た時試しにキャッシュクリアしてみようかと思ったら、キャッシュクリアコマンドが無い!うーん、どうしようかな。ただ、SHSUCDXのコメントにはディレクトリキャッシュは10個らしく、ルートディレクトリが入り切ってないし、そもそもキャッシュにMS2というファイルが無ければ探しなおすはずだからその可能性は低いのか。
一応、SHSUCDXのコメントによると、アクセスとアクセスの間に7秒の間があるとメディアチェックコマンドを使ってディスクの入れ替えをチェックするらしいです。なので、CD入れ替えてから7秒以上まってからマウスをクリックしていただけると良いかと思ったら、
mov ax, [46ch]
DOS前提で0000:046CHでTick取ってる。。。。。。そうだったのか。DOSはこれで秒が読めるのか。
これは、絶対にCD入れ替えチェックしないのではないだろうか。でも、入れ替え検出した場合もあったんだよなあ。それは、サブディレクトリを見に行ったりしてディレクトリキャッシュがクリアされていたのだろうか。
TOWNS_CDとMENU_CD問題のときは作者のJasonさんにコンタクトして直してもらったけど、さすがにTOWNS用にクロックを直してもらうのをお願いするのはちょっと気が引けるからパッチを当ててしまおう。
731 GetTicks
731 ****************** warning: label alone on a line without a colon might be in error [-w+label-orphan]
732 00000490 1E uses ds
732 ****************** warning: dropping trailing empty parameter in call to multi-line macro `save' [-w+macro-params-legacy]
733 %ifdef i8086
734 zero ax
735 mov ds, ax
736 %else
737 00000491 6A001F ld ds, 0
738 %endif
739 00000494 A16C04 mov ax, [46ch]
740 00000497 1FC3 return
これをなんとかして秒が欲しい。なんとかなるだろうか。考えてみます。
2022-07-05 22:50:35
大事になってしまったようですみません…
なかなか強敵のようですね
2022-07-05 23:04:35
ということで、githubのFMT_DOS.ROMをアップデートしてみました。
(1) YSDOSにINT 21H AX=77D2H を追加。AXにクロックを返す。
(2) SHSUCDXのGetTickがこの機能を使うようにパッチを当てた。(FMT_DOS.ROMに書き込むときにパッチを当てるので、githubに入ってるやつはオリジナル)
これにより、7秒間アクセスが無かった場合、SHSUCDXはMedia Checkで入れ替えをチェックするようになったはずです。これで動かんですかね?
2022-07-06 00:01:16
mokさん、
ぜんぜん大事ではないですよ。むしろ、ご報告ありがとうございます!ユーザからの報告が無いと、こちらとしても何が動いてないか把握できないので、非常にありがたいです。他にもなにかありましたらご報告よろしくお願いします!
2022-07-06 00:30:39
>山川機長様
了解しました。
早速試してみました。FMT_SYS.ROMを置き換えてみましたが変化が無いようです。
ログウィンドウには
Towns TIME (Nano-Seconds): 26852497875
CS:EIP=000C:00019DED LINEAR:00119DED EFLAGS=00000217 CPL=00
EAX=00000002 EBX=00000002 ECX=7FFFFFFE EDX=00000001
ESI=FFFFFFFF EDI=0005498C EBP=0005496C ESP=0005495C
CS=000C(LIN:00100000) DS=0014(LIN:00100000) ES=0014(LIN:00100000)
FS=0014(LIN:00100000) GS=0014(LIN:00100000) SS=0014(LIN:00100000)
CR0=80000001 CR1=00000000 CR2=00000000 CR3=0005E000
CF1 PF1 AF1 ZF0 SF0 TF0 IF1 DF0 OF0 IOPL00 NT0 RF0 VM0 AC0
Default Operand Size=32 Default Address Size=32 Stack Address Size=32
SS+00000000:48 AE 28 00 B2 49 05 00 06 00 00 00 8C 49 05 00
SS+00000010:98 49 05 00 12 84 00 00 8C 49 05 00 DA B4 02 00
000C:00019DED 50 PUSH EAX
>Deleted 1 dialogs scheduled for deletion.
CDLOAD "E:\Dropbox\game\TOWNS\石見銀山殺人事件2.CUE"
[E:\Dropbox\game\TOWNS\石見銀山殺人事件2.CUE]
Loaded Disc Image:E:\Dropbox\game\TOWNS\石見銀山殺人事件2.CUE
RUN
Mouse Display Page: 0
Mouse Display Page: 0
Mouse Display Page: 0
Mouse Display Page: 0
Mouse Display Page: 0
最後のMouse...はクリックする度に表示されます。
2022-07-06 00:51:46
Github側ではソースコードは変更されているようですが、FMT_DOS.ROMが更新されていないようです。
2022-07-06 01:04:59
>BCC様
ありがとうございます。
ROMファイル自体は更新されていなかったみたいですね。
2022-07-06 01:25:06
すみません、秒を返すと思ったら、秒x17が必要ということがわかって、さらに、DEVCALL_READ_CLOCKにもエラーがあるっぽいことが判明したんで、今直してます。
2022-07-06 02:02:10
一応、FMT_DOS.ROMアップロードしました。7秒ではなく8秒アクセスがなかったらキャッシュクリアするはずです。
ただ、なんかIO.SYSのクロックが返してくる秒の値がおかしくて、ときどきジャンプして、その後ジャンプバックするようです。例えば06Hが来たと思ったら次に26Hが来たりして。IO.SYSのクロックデバイスが何から値を取っているのか究明しないといかんのですが、デバッガで追ったら実時間ではなくVM時間で更新されているようなのでRTCでは無さそうです。32秒もジャンプバックされると、8秒待ったつもりが、まだ元の時間以前と思われるかもしれなくて、その場合キャッシュのクリアが起こらないかもしれません。
その場合でも、少なくとも一分待てば絶対カウントアップするはずなので、試してみてください。
2022-07-06 02:37:49
>山川機長様
深夜遅くまでありがとうございます。
早速更新されたFMT_DOS.ROMを更新してみましたところ、CD入れ替えを認識することに成功しました。
これで続きをプレイすることが出来ます!感謝です!
今度もTOWNのソフトを購入するつもりですのでまた何かありましたら報告させていただきますね。
2022-07-06 02:58:33
おお、認識しましたか!!!!!良かったです!!!!
秒がジャンプする、と、思った現象は、どうも僕の勘違いだったようで、その後調べたら単にRTCが返してる秒をそのまま流しているようでした。いや、RTCの実装バグってるのかな?そういう兆候も見られないような。でも、動いたとのことで良かったです。
また何かありましたらご報告をよろしくお願いします!
なお、実は僕はペンシルバニア州ピッツバーグに住んでるもので、今昼なんです。大学は夏休みだし。
2022-07-06 04:04:01
>312 のあたりで話題になっていた「INTERRUPT-FROM-V86-MODEに分岐するパターンが無くて」ですが、
Intel486 Processor Family Programmer's Reference Manual の2版(240486-002)で訂正されているようです。
(240486-003 までは世に存在するのですが、-004 が発行されたのかどうかは不明です。)
2022-07-07 17:33:15
>pinさん、
おおなるほど。1992年版ですかね?参考にします。1990年版を最初のうち使っていたのですが、エラーが多くて結構往生しました。
しかし、この点を直したらいきなりWindows 3.1が起動したり、というほど甘くは無さそうですね。(^_^;)
2022-07-14 10:15:14
002は92年版のようですが、さらにBT, CMPSなどに修整が入っているようなので003(1995)以降の入手をおすすめします。
2022-07-14 18:32:42
需要があるかわからないのですが、FM音源とPCM音源のWave作成の解像度を4msにしてみました。多分、耳のいいひとだと、LFOの代わりにYM2612のレジスタをすごい勢いで変化させているようなソフトでは違いがわかるかもしれません。ソースをPUSHしたのでよかったらお試しください。
もっと需要があるかわからないFM77AV40のエミュレータ「陸奥」(https://github.com/captainys/77AVEMU)を作り始めたのですが、Xanaduの"What?"のときに鳴る「キュッ」という音が正しく鳴らなくて、どうも10msの解像度では足りないようだがXM7は正しく鳴るんだろうか?と思って、XM7のWaveの解像度の設定を見たらもっと長くて、この解像度では音楽がまともに流れるはずがないのでは?と、思った次の瞬間、なにもプレイバックの解像度に合わせてWaveを作る必要はないではないか。ということに気が付いて、WaveをDirectSoundに送るのは20ms解像度だけどWave生成を2ms単位にしてみたら直ったので、津軽にもフィードバックしてみました。ただ、津軽だと間に合わない不安があったので4msにしてます。
ちなみになんでFM77AV40のエミュレータ作り始めたかというと、津軽ができたんだからFM-7系もその気になればできそうだよなあ、でも、既にXM7あるから需要無さそうだしなあ、と、前から思っていたものの、この6月に帰省したときゲーム保存協会のジョセフさんと話して、コピープロテクトを解除したソフトを実行するのではなくコピープロテクトごと再現するエミュレータがあったらいいよね、という話になって、じゃあやるか、と、思って始めたのですが、さすが同じ富士通のパソコン、津軽のコードがかなり再利用できて、6月20日開始ですでに起動までだったらかなりのソフトが確認できていて、Dragon Busterはステージ3まで確認、Polar Star IIIはステージ2までクリア確認(これは際限なく続くから全クリアというのは無い)、Ys, Ys2クリア確認、Thexderもプロテクトごと再現してステージ3までクリア確認、今Xanaduシナリオ1(これもプロテクトごと再現)がレベル5まで順調に動いてて、多分今日か明日にはクリア確認できそう、という勢いになってます。おそらくXM7ほどの再現性に追いつくにはまだかなりかかりそうですが、まあ、エミュレータは複数種類あれば、どれかが生き残る確率も上がると思うので、もう一本ぐらいあってもいいんじゃないかということで。
2022-08-12 03:49:01
あ、時系列間違えた。XM7の設定見て「なるほどそうやってるのか!」と思ったのは FOR I=0 TO 1000:BEEP1:BEEP0:NEXT の音をどうやって出そうかと思ってる時だったかな。結局書き換えに踏み切ったのは「キュッ」の音程が安定しなかったからでしたが。
2022-08-12 05:21:00
うん。自分で言うのもなんだけど、時間解像度上げたらAlltynexとDinosaurのBGM良くなった気がするんだけど。気のせいだろうか。たしかEmerald DragonもLFO使わずにFM音源のレジスタ高速書き替えしてたと思ったけどこれはあんまり違い感じなかったかな。
2022-08-15 00:39:51
>377 山川機長さん
おお~ FM-7/77/77AVに進出ですね。 後で試してみたいと思います。
仰る通りXM7と言う考えられる限り完全なエミュレータが存在する状況とは言え、複数のエミュレータが有るメリットも充分に有りますし陸奥の色が出せれば存在意義は有ると思います。
AV40EXは所有していますので、将来的に対応を考えられるのであれば動作検証も可能です。
(SXも有るのですが、起動しない状態です。 修理しなくてはと考えていますが、いつになることやら)
2022-08-17 09:14:19
陸奥いいですねー
FM77といえば自分はレイドックの印象が強いですけどイースにザナドゥ、テグザーは当時の定番ですね。
2022-08-26 01:29:24
陸奥もご利用いただきありがとうございます!
なお、6月20日に初めて、既に当初の目標は大体できてしまいました。プログラミングが速い(自分で言うな)。同じ富士通のプラットフォームだけにかなりのコードが再利用できて、エミュレータの大体の作りが津軽でわかってたというのも大きかったですね。まだFM音源の効果音モードと音声モードがエミュレートできていなくて、スペースハリアーで敵を撃墜したときの音が普通のトーンになってしまったり、シルフィードがしゃべらなかったりしますが、追って対応して、これは津軽にもフィードバックできますね。
現在、ROMの抜き出しがXM7のユーティリティにおんぶにだっこなのですが、実機からRS232Cで転送できるようなユーティリティも書こうと思ってます。あとは、各方面と協力してコピープロテクトをそのまま再現する仕組みを開発しようとしてます。ただ、読み込んだ値が次々に変わるタイプは予想外に厄介ですね。あとは、生データに近いデータが読めているので、劣化してCRCエラーが出てるようなディスクのイメージを修復するようなことは可能だろうかとか考えてます。これって案外機械学習に解かせたらうまくやりそうですね。学生さんにやらせてみたら面白いトピックかな。
AV40EXは多分対応しないのですが、AV40EXのROMでも走るようにしたいと思っています。もしもお時間がありましたら試していただけるとありがたいですね。
2022-08-27 22:05:05
自分は7月初頭に陸奥を発見したのですが、あっという間でしたね。流石です。
なる程、津軽のコードも使われていたのですね。いやほんと、感心するばかりです。
これでジョイパッドの方向入力が津軽みたいになると、使えるものが増えて便利かも知れないですね。
2022-08-29 02:50:09
FM77AVのスペースハリアーは効果音モードかと思ったら、SSG_EGですね。実装してみたんだけど、XM7だとソフトになんというか豆腐が崩れるようなイメージの音がするのに、陸奥だとボゴンというもっと爆発音っぽい音になってしまうなあ。一応、SSG_EG対応してみたバージョンの津軽のソースをgithubにPUSHしましたが、TOWNS用ソフトでSSG_EG使ってたゲームって知ってます?今まで試した範囲では一つも無かった(なかったもんだから実装してなかった)んですが。
Space Harrierの原本ディスクは手元に生き残っている(一か月ぐらい前に読ませたら全セクタエラーなかった)けど、テストのために何度も実機に読ませるのははばかられるので、現在実機でどういう音だったか確認するべくディスクイメージをRS232C経由で書き戻してます。
2022-08-30 11:52:25
>384 山川機長さん
YM2612にSSGは搭載されていなかったので使用するソフトも無かったのではないでしょうか?
陸奥を試してみました!
試したのがシルフィードだったので最初から敷居が高めでしたが、喋らない事と時期を含むグラフィックに施されているディザリングによる陰影処理が再現できていない以外は大丈夫そうでした。
40EXのROMでも試してみようと思います。
「陸奥」のスレッドを作った方が良いのか迷います。(そうすると掲示板のタイトルも見直す必要が有りそうです)
2022-08-31 09:12:53
なんとFM77AVのスペースハリアーの爆発音は、SSG_EGをLFOのように使ってるんですね。エンベロープは今までミリセカンドのオーダーで計算していたのですが、スペースハリアーだとせいぜい数ミリの周期になっていて、1/32ミリセカンドにしたら、今度はリリースが変になって、半日ぐらい調べたらエンベロープからdBを計算するところでオーバーフローが発生してて、直したら良くなったようです。スペースハリアーみたいなSSG_EGの使い方をされた場合と普通に音を出す場合だと1000倍も時間に差が出るのでは、スペースハリアーに合わせたらオーバーフローもしますよね。
それから、せっかくBCCさんにCONNECTIONごとのYM2612の出力を調整していただいたのですが、これだとSuper大戦略、Emerald Dragonその他のBGMがどうしても違うもので、CONNECTIONごとに出力を調整するのはRevertさせていただいて、どのCONNECTIONも無調整(?)にしました。多分、FMとPCMのバランスが合ってないんだと思うんですよね。実機があるんだから、時間をかけて調整すればいいんですけどね。
2022-08-31 09:34:11
> WINDYさん、
ありがとうございます!陰影処理が再現できてませんでしたか。シルフィードはテストしてたんですが気が付きませんでした。YM2612はSSGは無かったのにSSG_EGだけ残ってたんですよね。しかし、SSG_EGを使ったからと言ってエンベロープ作るのが簡単になるかというとそんなこともなかったようなので、多分使う意味が無かったのかもしれないですね。一応、SSG_EGは津軽でも有効になりました。YMで残ってるのは効果音モードと音声モードですね。PCM積んでるTOWNSでは音声モード使う意味はなかったろうなあ。
2022-08-31 09:39:23
なお、Silpheedの陰影らしきものは、ハードウェア直線補間のラインスタイルで描いてました。サポートするのを忘れてました。その機能を追加してソースをPUSHしたので、シルフィードのグラフィックスは直ったと思います。しかし、当時、どうやってグラフィックスを描いているんだろう?と、思ったもんでしたが、直線補間だったんですね。最初VRAM論理演算でなにか工夫してるのか?と、思ったらそうではなくて、VRAMに書き込んでる個所でブレークさせようとしても自機の描画で止まらなくて、結局残りは直線補間しかなかろうと思って直線補間のI/Oでブレークさせたら見つかりました。
2022-08-31 12:05:51
>388 山川機長さん
元であるPC-8801では恐らく普通に描画していたと思う(調べたことが無いので憶測です)のですが、77AVでは直線補間を使っていましたね。
遥か昔に勝手にTOWNSに移植しようと思ってXM-7で延々とトレースした記憶があります。 DMAとMMRも使って殆どフル機能だったので当時感心させられました。
移植しようとした動機? それはTOWNSであの声が聞いてみたかったと言うだけの事です。
2022-08-31 16:54:16
先ほどPUSHしたソースで、スクリーンショットクロッピングとマップXY座標計算機能を追加してみました。陸奥を作ってて、ふと、メモリフィルタ機能を使えば簡単にRPGとかのマップの全体のどの部分が画面に表示されてるか検出できそう、ということに気が付いて、YsとかYs2とかで、左右に移動しながらメモリフィルタで増減したアドレスを抜き出したら、これが簡単に見つかるんですね。だったら、クイックスクリーンショットを取るときに、座標をファイル名にエンコードすれば、外部プログラムで正しい位置にスクリーンショットを張り合わせることができるのではないか、と、思って、そういう機能を追加してみました。で、それを津軽にも持ってきてみました。試しにエメラルド・ドラゴンでやってみたら、あっさり座標を書いてあるアドレスがわかって、自作の2次元レトロマップツール(github/captainys/publicの中に入ってる)で、ファイル名の座標に対応してみたら、マップ作製が簡単に進む進む。ただし、物理アドレス指定する必要があるので(読み取ったときCSがどこにあるかわからんから)プログラムが同じ物理アドレスに読み込まれるように同じ設定で起動しないと正しい座標が出ません。例えば、物理アドレスをメモリフィルタで発見した後で、搭載メモリ量を変更してしまったら多分プログラムやデータが違うアドレスに配置されてしまって、探しなおしになります(か、メモリを戻すか)。それから、スクリーンショットを張り合わせてマップを作るとき、マップ表示してる領域外のグラフィックはいらないので、出すときクロップしてしまおうということで、そういう機能も追加してみました。多分、おもしろい使い方ができるのではないか、と、思います。よかったらお試しください。
2022-09-12 11:24:51
陸奥書いてて思ったんですが、津軽で音楽の再生とか実機より2.6%ぐらい速い、とかありますかね?陸奥を書いてわかったのが、TOWNSのYM2612のマスタークロックは2MHzであるということと、だとすると、ひょっとすると津軽がタイマーを走らせる速度が実機よりも2.6~3.5%速いかもしれない、ということなのですが、実機手元にあるんだから計測すればいいんですが、ちょっとおもしろいプロジェクトが多すぎて手が回りません。どなたか、お手すきの方がいましたら、EUPファイルとかの再生時間を実機と津軽で比べるとかしていただけると非常にありがたいです。
2022-09-21 11:07:27
おおお、FM音源のマスタークロックが解明できたからタイミングとかそれに合わせて修正したら、シャーロックホームズの探偵講座のビデオの音声が最後まで崩れずに流れるようになった!ハイパープラネットの星座落語も途中から音声再生の順番?が狂ってしまう現象が無くなったけど、途中ノイズが入って聞こえない部分があるのは、CDのイメージ化に失敗したのかな。でも、タイミングずれなくなったから結構最後の方まで聞けるようになった。陸奥開発って結構津軽にも役に立ってるな、と自己満足。
2022-09-22 11:25:44
TownsRenderingThread::ThreadFunc内でFlipUpsideDown()という画像を反転する関数がありおそらくglDrawPixelsで描画を行っていた際に必要だったのかもしれませんが、
glTexImage2Dで描画している現在ではFsSimpleWindowConnection::RenderBeforeSwapBuffers内の
DrawTextureRect(this->dx,this->dy,this->dx+img.wid*scaling/100,this->dy+img.hei*scaling/100);
を
DrawTextureRect(this->dx, this->dy + img.hei * scaling / 100, this->dx + img.wid * scaling / 100, this->dy);
と置き換えれば不要かと思いました。
2022-09-26 02:04:51
おお、たしかに!修正します。ありがとうございます!
なお、Windows版もFM/PCM音源をストリーミングで鳴らすようにしてみました。今までだとときどきタイムリーに次のWAVEを送り出せなかったタイミングで「ぷつっ」とノイズが出る傾向がありましたが、解消されていると思います。PAUSEかけてもリングバッファが流れ続けるという副作用が出てますが、まあ、本来TOWNSは一時停止するものじゃなかったので、ほっといてますが。自分のメモにはDirect Soundはストリーミングで40ms未満の単位でデータを流し込むと捌ききれなかった、とあるのですが、今再度トライしたら20msで鳴ってしまっているのですが、ひょっとしたら他の環境だと鳴らないかも。
CDDAの再生もストリーミングにするかどうか考えてて、オーディオCD全体を再生するみたいな指示があると、今はDirect Soundにオーディオを送って放置しているのですが、それだとDirect Soundが再生できる限界の長さに制約されてしまって、CD PlayerプログラムがオーディオCD全体を再生できないんですね。TOWNSにはユニークなCDプレイヤーが多くて結構好んで使っていた人もいたような印象なので、ひょっとして需要があるだろうかとも思うのですが。ただ、普通ゲームのBGMなどはトラック単位の再生だったのでとくに問題は出ないわけですが。
2022-09-27 03:07:08
RF5C68についてです。
再生周波数を元のサンプルより上げるのは問題ないのですが、下げると音程がおかしくなるようです。
9.6kHzのサンプルを2つ(それぞれ基音C4とF4)、1オクターブごとに鳴らした動画を撮りました。
https://twitter.com/kashiwa/status/1599424155111239680
2022-12-05 00:47:45
おおなるほど!貴重なテスト情報をありがとうございます!RF5C68は録音した周波数は意識していない(と思った)ので、おそらくFDの値が小さいときに起こる現象鴨しれないですね。確認してみます!
2022-12-06 05:39:39
うーん、JSOUNDでTownsOSに入ってるPMBをいくつかトライしたのですが、同様の現象が確認できないですねえ。おそらく、テストに使われたPMBファイルが、低い音と高い音で波形を切り替えているのだと思うのですが、そのPMBファイルってどこかでダウンロード可能でしょうか?
2022-12-07 11:27:50
https://app.box.com/s/lyiug282aqvuxnh4pdwtwjon9hfrvhwu
PMBファイルはこちらになります。
そういえば私は長いこと「うんづ」でしかTOWNSを触っていないので、もしかすると実機では津軽と同じ挙動なのかもしれません。
# そうだとしたら、うんづは内部でFDH/Lか何かの精度を上げているということになるのかな
2022-12-08 11:29:26
ありがとうございます!津軽で波形の切り替えがあるとき何か間違ってるの鴨しれません。Towns System Softwareに入っているEUPでも微妙に音程が合ってないような?と思うことがあるので、これで解明できるといいんですけどね。
確認してみます。
2022-12-09 03:41:42
kashiwaさん、
確認しました。低い音のとき、PCMの波形をホストのドライバに送るたびにプレイポインタの下位ビットを捨てていたのが問題でした。音質によってはあまり顕在化しないようですが、送っていただいたPMBファイルのようなものでは顕著に影響が現れるようです。PMBファイルにはベースとなる波形の音程が記録されているので、それがもともと低いものはFDの値をあまり下げなくても低音になるので顕在化していなかったのではないかと思います。
修正版ソースは先ほどPUSHしたので、よかったらお試しください。Towns System Softwareに入っていたEUPファイルでいまいち音程が合ってないと思ってたような曲もこれで正しい音程になったような気がします。ご報告と例題データをありがとうございました!
2022-12-11 14:44:15
確認と修正ありがとうございます。
件のPMBでも音程ずれが出なくなったのを確認したのと、プラセボかもしれませんが今まで問題ないと思っていたフリコレなどのEUPデータも和音がクリアになったような気がします。記憶通りに鳴っているという実感があります。こうなってくると機種ごとの再現ローパスフィルタが欲しいかもしれないですね。
ともあれご対応ありがとうございます。
ところでRF5C68.hのSAMPLING_RATEなのですが、8MHzの分周比384で20.833KHzになると聞いて、もっともらしい理屈だと思い手元のソースでは20833にしています。もともと採用されている値と聴き比べてもあまり違いが分かりませんが……。
2022-12-13 05:51:17
なるほど!8MHzの384分周というのはもっともらしい値ですね!僕は、どうやって今の値にたどりついたんだか、開発のメモには残ってないのですが、多分波形を見ながらYM2612の周波数と合わせていくうちにこの値になったと記憶しています。おそらく、差が小さいので聞いても違いは認識できるレベルではないと思います。
2022-12-18 07:56:23
Towns Magazine Vol2 の動画が再生できないと思ったら、CDCコマンド03を使ってるようで、メモによると意味はRAWREADらしいんですね。多分、Linuxのソースか何かにそう書いてあったものと思いますが、パラメータにはMSFを積んであるのでどうもそうらしいです。このコマンドが何を返せばいいのかがわかれば実装は可能だと思うのですが、このコマンドって何を返せばいいもんだか誰か知ってます?試しに普通のREADと同じにしたらどうなるか見てみようかな。なお、帰省中なもんで実機にアクセスできなくて実機で実験できません。
2022-12-18 08:01:29
試したことは無いのですが、Oh!FM 1991年5月のINSIDE TOWNSにUNO氏による「CD-ROMサブシステムを解析する」と言う記事が有ります。
その中ではBIOSを経由せずにI/Oポートを直叩きするので、コマンド一覧が有るのですが、コマンド03HはRAW(2340byte)READと有ります。
赤本220ページのCD-ROMのデータブロックのフォーマットを見ると、2340byteとは同期信号以外の情報を指すようです。
モード1だと、ID(4バイト)+データ(2048バイト)+EDC/ECC(288バイト)
モード2だと、ID(4バイト)+データ(2336バイト)
上記のデータを返せば良いのだと思いますが・・・・
2022-12-21 23:40:55
うーん、CD-ROM I/Oにはモード1、モード2という指定は無かったような。コマンド02がMODE1READ, コマンド01がMODE2READ (まぎらわしい)、それとは別にコマンド03のRAWREADがあるんですよね。これは、ピッツバーグもどったら実機でやってみるしかないですね。一応、プレスしたCDなら読める機体がまだ3台残ってるので、最初のセクタを読ませて何が出てくるか見てみましょう。なお、現在東京にいて、明日、Tokyo Retro Computer Meet Upに行きます。
2022-12-23 19:18:05
TownsMagazineVol2のディスクがモード1のディスクであればID+DATA+EDC/ECCを返せば良いし、モード2であればID+DATAを返せば良いと思います。
イエローブックの規定では同一ディスクでのモード混在は出来ないようだし、第一どういうディスクかは制作しているサイドが一番知っている事でしょうし・・・
2022-12-24 23:18:03
上の書込、後半に何を言いたいかよくわからないですね。
TownsMagazineVol2のプログラムを作成した方はRAWREADをなぜ使っているのか、またはどうしてRAWREADを使わざる得なかったのか不明だった心の声がそのまま出た次第です。
ここで言う"制作しているサイド"とはTownsMagazineVol2の制作者です。
CD-ROMに対するREADに関してはコマンドとしてMODE1READ,MODE2READ,RAWREADがありますが、ディスクがモード1なのかモード2なのかはどの時点で判断されているのか不明ですがその判断に従ってどのコマンドを使用するかはプログラマサイドで指定するのだと思います。
BIOSでは、INT93H,AH00Hのドライブモードの指定ができますのでこの時に選んだドライブモードに従ってCDコマンドが選択されるように思われます。
2022-12-26 09:15:46
2340バイト/セクタの場合はSync部(12バイト)を除いたデータになるので、モードを問わず頭の12バイトを削ってやればいいです。(ようするにWINDYさんが書かれている通りですw)
なお、モードは各フレームのHeaderに書かれています。
2022-12-29 22:40:21
新年おめでとうございます。僕は今日の飛行機で帰ピツしたのですが、荷物がひとつ積み損ねたらしく、届くかどうか新年早々やきもきしてます。AirTagを入れておいたので、羽田空港内をうろうろしているのは見えているのですが。
なお、INT 93H AH=00Hのドライブモードの指定もひとつ謎なんですよね。これって、MODE1のCDとかMODE2のCDとかがあったわけですか?僕は単にCRCなどを含めて読むのがMODE2READなのかと思っていたのですが、それだとRAWREADとの差がたしかにわからん、というわけで津軽ではMODE2READも未実装になっているわけですが。
ISOイメージだとセクタデータ以外は書かれてないのでどうにもならないですが、BIN/CUE、MDF/MDSだったらなんとかできそうですね。やってみます!ただ、WINDYさんも書かれている通り、なぜここでRAWREADなのか?というのが謎なんですよね。
2023-01-02 09:06:12
電子辞書(EPWING)はXA準拠らしいのでおそらくMODE2ですね。TOWNSって最初から対応してましたっけ?
フォトCDやビデオCDもMODE2ですが、これらはTOWNS発売以降の規格ですね。
2023-01-02 13:30:49
お久しぶりです。潜ってました(謎)。
>410 fuzzballさん
確か3代目でXA対応になった気がします(2代目以前では某ツールでフォトCDが読めない制限があったので)。
2023-01-03 11:33:44
確かに3代目からCD-ROM XA対応ドライブのはずです。
Mode2はエラー訂正機能が劣るのでコンピュータ用の記憶メディアとしてはMode1を,マルチメディア(映像,音声)用としてMode2をYellowBookで規定されていたようです。
また、規定上はMode1,Mode2を同一のディスクに混在する事が出来ない仕様となっていました。
(Towns用のCDは当然ながらMode1を使用しているはずです)
時代が流れるにつれ1枚のCD-ROMにMode1とMode2を混在させたいと言うニーズが発生したため、Mode2の中にForm1とForm2が策定されてディスク全体としてはMODE2でその中でForm1とForm2で情報用のECC/EDC付きのセクタとECC/EDC無しでデータ量の多いセクタを混在させるCD-ROM XAが登場した流れとなります。
TownsMagazineVol2がXAディスクで、動画部分のセクタがMode2Form2で記録されていたと仮定すると初代,2代目でも動作させる為のRAWREADなのかと思ったのですが、そうするとそもそもXA対応でないので起動する事が出来ないのではないかとも思います。
TownsMagazineVol2が有るかどうか判らないのですが、探してみようと思います。
2023-01-03 23:50:17
redump.orgのcueシートを見る限りでは TownsMagazine Vol. 2 はMODE1ですね。
確か私も持っていたような気がしますが、どこかに埋もれています。
ついでに調べてみましたが、redump.orgに登録されているTOWNS用のCDは全てMODE1でした。
2023-01-05 23:35:42
あと、
>>電子辞書(EPWING)はXA準拠らしいのでおそらくMODE2
は勘違いです。電子ブックと混同していました。
何かに対応するためにBIOSでMODE2をサポートしたわけではないのかな。
単にドライブが対応していたから読めるようにしておいた、みたいな感じでしょうか?
2023-01-05 23:57:27
TownsMagazineVol2は、実CDを確認したところfuzzballさんの仰る通りMODE1(DISC1はデータ,DISC2はデータとオーディオ)でした。
また、XA非対応であるMODEL2でも起動でき、ムービーも途切れ途切れですが見ることができました。
RAWREADはI/O上のコマンドでは存在しますが、BIOSでは機能として実装されていませんのでメーカーとしては隠してはいませんが積極的に使用することは推奨しない機能だったのでしょう。
そこまでは見ていませんが、MODE1である以上ムービーのデータもファイルとして存在しているでしょうし、態々RAWREADで読み込む意図が不明な点は残りますが、今からその糸を推測する事は困難ですね。
2023-01-06 09:07:29
いろいろ調べていただいてありがとうございます。僕は、本当にこのCDCコマンドはRAWREADなのか?という気がしてきていて、帰ピツしたらコードを解析してやろう、と、思ったものの、鬼のように難しかったFM-7用フラッピーはステートセーブを使いまくればクリアできるのか?という謎を解明するべくお正月からフラッピーにはまってました。(結果、さすがにクリアできた)探したら全200面網羅した攻略サイト無いっぽいですね。だったら作るか、と、思って二周目細かくメモやスクリーンショットを残しながら始めてしまったのですが、途中で挫折するかもしれません。しかし、このゲームなんで当時あんなに知名度あったんだろう?みんな名前は知ってましたよね。僕は、買ったものの途中で挫折しましたが。フラッピー落ち着いたら、もう少しTowns Magazineはコード読んでみますね。
2023-01-10 05:15:51
ディスクはモード1だった訳で、尚更RAWREADを使う意味が判らなくなりました。
仰るようにRAWREADではない可能性も有り,そんな事は無いとは思いますがマスタデータの作成にミスってそのセクタはリードエラーになってしまうので止むなくRAWREADを行う必要が有ったのか・・・,知的探究心の結果なのか謎は深まるばかりです。
フラッピーの制覇おめでとうございます。
覚えやすい音楽と愛らしいキャラクターで人気でしたが、その前より倉庫番等も人気がありましたのでそれが下地となったのではないかと思います。
私も持っていますが当然ながら?未踏走ですので、未踏走が"やり尽くしていない"となると膨大な積みゲーが手元に存在する事になりますね。
TOWNSでもWizardryやUltimaに始まり、手持ちのソフトの殆どが未踏走かも知れません。
2023-01-11 09:18:30
X68000用にソースコードが公開されていた「くるんくる~ぱ」というゲームをFM TOWNSに移植していて、元のX68K版ではコントラスト機能でフィードイン・アウト表現をしている箇所をTOWNSでは拡大表現に置き替えようとしているのですが意図しない表示になります。
https://www.youtube.com/watch?v=vpr8XG1rNxw
上記の動画1:18のあたり、津軽最新ソースでのテスト。ゲームタイトルを拡大表示を行ってまた縮小する際に一瞬画面右側に表示されないはずの球が表示される。
TBIOSでレイヤ0,1ともに画面モード5にした後直接CRTCを弄って4:3比率のアスペクト比変更をしていてこの設定をしなければ問題ない拡大縮小表示となる、またエミュ「うんづ」の方ではここの箇所は問題なく表示され(逆にゲーム中のテンポがおかしい不具合があるがこれはまたうんづの問題と思われる)、津軽のクリップの問題だと思います。
4:3比率のアスペクト比変更方法は以下のようにしています。
void Write_CRTC_register(int address, int data)
{
_outb( 0x0440, address );
_outw( 0x0442, data );
}
Write_CRTC_register( 0, 80);
Write_CRTC_register( 1, 590);
Write_CRTC_register( 4, 669);
Write_CRTC_register( 29, 3);
Write_CRTC_register( 9, 130);
Write_CRTC_register( 18, 130);
Write_CRTC_register( 10, 642);
Write_CRTC_register( 11, 130);
Write_CRTC_register( 22, 130);
Write_CRTC_register( 12, 642);
拡大表示はレイヤ0,1同時に拡大率を横2~4、縦2~8までフレーム毎に段階的に切り替えていく手法です。
CRTCでアスペクト比を弄らず16:15のまま表示すればいいのですが、4:3でないと今度は球が卵型の比率表示になってしまい見栄えが良くないのと、256*240用にグラフィックを書き換える手間が難しいのでこの設定のまま表示が崩れないようにできないでしょうか。
2023-01-14 01:16:43
フレーム毎に段階的に切り替えていることはおそらく関係ないのでしょうから、
このレジスタセットで(津軽なら dump crtc の結果全体のコピペでも)画面の四隅がVRAMのこの番地のはずがそうなっていない…といった報告の方が対応しやすいのではないでしょうか。
2023-01-14 16:56:50
おおなるほど!X68KのゲームをTOWNSに移植とかいうのは大好きです!
画面モード5は赤本だと256x256となってるやつですが、これって本当に縦256ピクセルになってるんでしたっけ?このWrite_CRTC_registerの値は、ちょうど画面の見えてはならない領域が見えてしまっているタイミングのものですか?あと、多分そうではないかと思うのですが、VSYNC中にレジスタの値を書き替えていますか?
もう一点気が付いたのは、拡大中は正常のように見えるのですが、ロゴが画面いっぱいになった直後に右の玉が見え始めて、最も縮小された段階では画面表示領域がほぼ正方形で左右に黒い領域があり、その直後にまた全画面に戻っているように見えました。CRTCに書き込む値は、拡大中と縮小中はまったく同じ内容を逆順に書いていますか?同じCRTCの設定値なのに拡大中と縮小中で結果が変わるのだとすると、なんらかの理由でCRTCに正しく値が書き込まれていないという可能性が考えられそうですね。はて、そんなフィルタみたいなもの入れてあったかな?
こういう話は大好きなので、なんとかしましょう!
2023-01-17 11:57:49
15KHz画面(モード8)にして一応完成したので実際の実行ファイルとソースコードを出したほうが手っ取りばやいってことで上げておきます。
https://drive.google.com/file/d/1u2OnU-rE0Ou7E6VVDebWehN_ujXkDbok/view?usp=sharing
Youtube動画
https://www.youtube.com/watch?v=ROFlwvrKMw8
やや拡大感覚は違うもののこういう感じで拡大表現が行われる
問題の31KHz画面版はこちらです。
https://drive.google.com/file/d/1C7jOzbUkEMpIdgENWDoNlFFEwldIeXOj/view?usp=sharing
KURUN_32.EXPを15KHz版に収録されたGRAPHICS・SOUNDSフォルダと同じ場所に入れて実行
31KHzではCRTCを弄って4:3化したのに対し、15KHz版では拡大率を横5倍縦1倍設定にして4:3化、拡大方法はどちら同じコードで拡大率とVRAM表示開始位置を書く値のみ変更しているだけです。
31KHzで画面右に余計な表示が出る際のdump crtcも出しておきます。
HSW1:0050 VST1:0000 HDS0:0082 HDE0:0282 VDS0:0046 VDE0:0406 FA0 :07C3 HAJ0:0082 FO0 :0000 LO0 :0080
HSW2:024E VST2:0004 HDS1:0082 HDE1:0282 VDS1:0046 VDE1:0406 FA1 :07C3 HAJ1:0082 FO1 :0000 LO1 :0080
HST :029D EET :0000 VST :0419 EHAJ:0058 EVAJ:0001 ZOOM:6363 CR0 :8005 CR1 :0003 CR2 :0192 FR :0000
----:0000 ----:0000
Sifters (Isn't it Shifter?):1F 09 PLT:00 Priority:1 CLKSEL:3 SCSEL:0(02x) PM:0192
Address Latch: 0000001BH
CL0:1 CL1:1
2-Page Mode.
Page 0
Top-Left:(0,0) Display Size:(1408,480)
16-bit color
VRAM Base=00000000 Offset=00001F0C
BytesPerLine=00000200 SkipBytes=00000000
Zoom=(5.5,7)
Page 1
Top-Left:(0,0) Display Size:(1408,480)
16-bit color
VRAM Base=00040000 Offset=00001F0C
BytesPerLine=00000200 SkipBytes=00000000
Zoom=(5.5,7)
VSYNC:0
Show Page (FDA0H):1 1
Show Page (0448H):3 3
FMR VRAM Display Offset:00
FMR VRAM Display Planes:0F
どうも表示サイズが1408と極端に表示領域が広がるようです。
2023-01-17 19:20:40
TownsCRTC::GetLowResPageZoom2X() ですねえ。
普通の31kHzモード (赤本のレジスタセット1番・画面モード12(640x480x8bpp)) では以下のような出力なのですが、
- 水平解像度: (HST + 1) = (0x31f + 1) = 800
- 垂直解像度: (VST + 1) / 2 = (0x419 + 1) / 2 = 525 (走査線の数)
- 水平周波数: 25.175MHz(CR1=2) / 800 = 31.469kHz
- 垂直周波数: 25.175MHz(CR1=2) / 800 / 525 = 59.940Hz
問題になっている設定では以下のようになっているわけですね。
- 水平解像度: (HST + 1) = (0x29d + 1) = 670
- 垂直解像度: (VST + 1) / 2 = (0x419 + 1) / 2 = 525
- 水平周波数: 21.0525MHz(CR1=3) / 800 = 31.422kHz
- 垂直周波数: 21.0525MHz(CR1=3) / 800 / 525 = 59.851Hz
帰線区間を考慮しないざっくりとした計算ですが、前者の各ピクセルが完全にアスペクト比 1 : 1 だとすると、
CRT上では後者のそれはおよそ 1.2 : 1 になっているわけですね。
(各周波数はほとんど変わらず、水平解像度――各ピクセルの送出タイミング――だけ低下しているので)
このような場合、津軽に限らず一般的にエミュレータの画面出力というのはどうあるべきなのでしょうね。
ピクセルが滲む(あるいは不均等なサイズになる)ことを許容してもCRTに近いアスペクト比を望むか、
アスペクト比を再現しないことを許容してもエミュレーション対象のピクセル境界と画面のピクセル境界が一致することを望むか。
2023-01-17 21:43:51
おおなるほど。KURUN_32.EXPで、BP C:773 でステップごとに見れますね。YouTubeの動画だと拡大していく方は正常で戻ってくる方だけ崩れているような感じに見えたのですが、この実行ファイルだと拡大していくときも崩れてますね。
これ、途中で表示サイズが1024x480だと思ってるので、GetPageSizeOnMonitorも変ですね。たしかPsygnosisのゲームでも起動中画面が本来ありえない横幅になってしまったことがあって、そのときはどうやって対応したんだったかな?
あと、これは、HST=0x029D, CLKSEL=3なので、
if(5<=zoom.x()) // I have zero confidence in this condition. It just takes care of known cases.
ばっちり、この「まったく自信が無い」パターンをヒットしてますね!法則がわからなくてとりあえず場当たり的な対応になってしまってる状況なんですが。できればここでHST=0x29D, CLKSEL=3の場合のズームと表示範囲の計算をまとめて直せればいいんですけどね。
2023-01-18 06:42:36
やっぱ、表示範囲ですね。試しに、
if(5<=zoom.x()) // I have zero confidence in this condition. It just takes care of known cases.
{
wid*=zoom.x();
wid/=4;
}
この部分を消して実行したら、表示範囲間違ってるから右が見えないんですが、ズームは正常にできてるっぽいです。ここの正しい法則がわかったらいいのですが。
2023-01-18 06:51:03
ためしに↓みたいにしたら、なんとなくよくなった気がするけど、絶対間違ってると思う。。。
if(5<=zoom.x()) // I have zero confidence in this condition. It just takes care of known cases.
{
wid*=zoom.x();
wid/=4;
if(640<wid)
{
wid=640;
}
}
2023-01-18 06:54:41
なんか、640でキャップするので正しいような気がしてきた。
// VING games use this settings. Apparently zoom-x needs to be interpreted as 4+(pageZoom&15).
// Chase HQ HDS0=0082H HDE0=00282H (Diff=512) HST=029DH ZOOM=1111H Zoom2X=5 wid=640
// Viewpoint HDE0=008AH HDE0=0028AH (Diff=512) HST=029DH ZOOM=1111H Zoom2X=5 wid=640
// Pu Li Ru La HDE0=008AH HDE0=0028AH (Diff=512) HST=029DH ZOOM=1111H Zoom2X=5 wid=640
// Splatter House HDE0=008AH HDE0=0028AH (Diff=512) HST=029DH ZOOM=1111H Zoom2X=5 wid=640
// Operation Wolf N/A
// New Zealand Story N/A
// Alshark Opening HDS0=0082H HDE0=0282H (Diff=512) HST=029DH ZOOM=0000H Zoom2X=2 wid=512? 640? Single-Page Mode
// Freeware Collection 8 Oh!FM TOWNS Cover Picture Collection
// HDE0=0082H HDE0=0282H (Diff=512) HST=029DH ZOOM=0000H Zoom2X=2 wid=512? 640? Single-Page Mode
// Kurunkurupa While Zooming
// HDS0=0082H HDE0=0282H (Diff=512) HST=029DH ZOOM=1111H Zoom2X=5 wid=640
// HDS0=0082H HDE0=0282H (Diff=512) HST=029DH ZOOM=2222H Zoom2X=8 wid=640
// HDS0=0082H HDE0=0282H (Diff=512) HST=029DH ZOOM=3232H Zoom2X=8 wid=640
// HDS0=0082H HDE0=0282H (Diff=512) HST=029DH ZOOM=4242H Zoom2X=8 wid=640
// HDS0=0082H HDE0=0282H (Diff=512) HST=029DH ZOOM=4343H Zoom2X=11 wid=640
// HDS0=0082H HDE0=0282H (Diff=512) HST=029DH ZOOM=5353H Zoom2X=11 wid=640
2023-01-18 13:18:37
正しいような気がしてきたので、そのように修正したバージョンのソースをPUSHしてみました。これでおそらく意図した動きになっているのではないかと思います。ご確認ください。
多分他に悪影響は出ないと思うのですが。
2023-01-18 13:25:28
意図した表示になりました。ありがとうございます。
2023-01-18 21:37:42
了解しました!ご確認ありがとうございます!
HST=029DH, CLKSEL=3の場合については、使用が確認されてるパターンで残ってるのは、ZOOM=0000Hのとき、表示範囲の横幅を512にするか640にするか、難しいとこですね。
pinさんが、エミュレータでどうするのが正しいのか、というのは、ウィンドウサイズ=CRTモニタサイズとして、その一部を表示範囲とするか、あるいは、ウィンドウサイズ=表示範囲とするかということだと思ったのですが、津軽ではとりあえずウィンドウサイズ=表示範囲にしてます。
そして、多分Alsharkのオープニングとフリコレ8のOh!FM TOWNS表紙絵コレクションの表示範囲は512とするべきなのではないかと思ってるんですが、今の計算方法だと640になってしまうもんで、右側に黒い部分ができてしまってちょっと格好悪いんですよね。
でもひょっとするとCRTCにしてみると右端をどこで終わらせるかは実はあんまり気にしてないのかもしれなくて、それだと実はCRTC設定から厳密に表示範囲を計算するのは無理なのだろうか?
2023-01-21 12:10:57
エミュレータが…というのは、例えばこういう話です。
https://www.youtube.com/watch?v=ssluTgfkdlg
TBIOSと件の画面モードだけの話であれば、zoom の値の特別扱い等一切なしに HST+1 x (VST+1)/2 の領域のビットマップを作って、
H:31kHz V:60Hz っぽい周期であれば 800x525 の領域にフィットするよう描画する…が正解かなと思います。
(TBIOSの画面モードであればドットバイドットになり、HST=029dh, CLKSEL=3 であれば 670x525 のビットマップなので横にのびる)
周辺の黒い部分が大きいですが、800x525 の領域のうち、TBIOS画面モードで表示する 640x480 部分+その周辺をある程度表示する感じでどうにか。
ただ、ちょっとだけ(たとえば1本)水平走査線を減らした場合に滲んでいいのか、などと考えると答えは出ないです。
(CRTでは走査線間隔がちょっと開くのだと思うのですが)
2023-01-21 23:00:47
おおなるほど!HSTってそういう意味だったんですか。そういうモードも作ってもいいですね!
ところで、OH!TOWNSの表紙絵ってどうなるべきなのか実機で見てみりゃいいじゃん、と、思ってMXでやってみたんですが、ZOOM=0000Hなのに、512ピクセルを1.2倍拡大して画面幅いっぱいに出てますね。ということで、拡大率の式から正しくなかったということが判明してしまって、どうしようかな、という状況です。
2023-01-22 11:46:18
表紙絵のDOCだったかには、M系以降はスキャンコンバータ(という名の設定値へのオフセット加減算?ないし読み替え?)の影響でうまく全画面にならないようなことが書かれていませんでしたっけ?
もしLCDをお使いですと、その表示領域自動調整が働いていることもあります。
2023-01-22 20:29:35
すみません、ちょっと前の話題になってしまって、流れてしまってますが、CDCのRAWREADコマンド、まだプレスしたCDなら読める実機MXで試してみました。実機MXでプリルラのIPLセクタを読んだのですが、IPLセクタはどのCDも共通だからまあいいと思うので、OneDriveに上げました。
https://1drv.ms/u/s!AmlM0OLrEo8vgqkQpo0oC5GBexnDjQ?e=ewlw65
4KBのバッファを0xCCに初期化して、そこにDMAが読みたいだけ読ませたところ、どうやら本当にRAWREADで2340バイト読んでいるようです。最初の4バイトが 00 02 00 01 なんですね。これって、サブQコードとかいうやつなんですかね?00 02 00はまず間違いなくmin=00 sec=02 frm=00だと思うのですが、次の1の意味がわからんですね。4バイト目から"IPL4"が見えるので、セクタの中身で、最後の288バイトはエラーコレクション情報という感じでしょうか。ISOだとこの情報は言ってないですが、BIN/CUEだとこの情報も入ってきてるようですね。
なぜTowns MagazineがRAWREADを使うのかという謎はまだ残ってますが(まだ解析してない)、実行できるようにはなる鴨しれません。
2023-01-31 11:15:24
なお、実験に使ったプログラムは、
https://github.com/captainys/FM/tree/master/TOWNS/EXPERIMENTS/CDC_CMD
ここです。
2023-01-31 11:42:23
>433 山川機長さん
RAWREADは、本当にRAWREADだったのですね。
ヘッダの第4バイトは、"モード"ですね。モード1のディスクなので01hとなっているようです。
2023-02-01 09:10:03
おおなるほど。そういう意味だったんですね。
しかし、残念ながらまだTowns Magazineのビデオは再生できなくて、調べたら、CDCにコマンドFFを書き込んでるところがありました。
CDROM Command FF |00 5F FC 5F FC 00 00 00
これは謎ですね。果たしてこのコマンドの処理がうまくできていないから再生できないのか、それともこれは関係ないのか。
2023-02-01 11:26:30
なお、Towns Magazineに入ってる.MVEファイルをTowns System Software V2.1 L31とかからダブルクリックしたら普通に見れますね。なんでTowns Magazineから実行したときは見えないものか。木屋善夫さんのインタビューが見たかったので、それを見ることはできたものの、Towns Magazineで見れなかったのがなんか悔しい。
2023-02-01 11:32:53
>436 山川機長さん
1991年5月のOh!誌P64~を読んでいるのですが、FFと言うのはコマンドレジスタへの書き込み値でしょうか?
もしそうであれば、最上位ビットが立ってますのでState系コマンドなんですが、State系はパラメータが無いので00Hのダミーデータを8バイト書き込むと有ります。
また、紙面にあるState系コマンドは00H~07Hまでで該当するコマンドも載っていないです。
Play系であれば、コマンド1FHが存在するのですが最上位ビットがPlay系は0なのでFFHとなる事は有りません。
Play系コマンド1FHも紙面では"正体不明(BIOS INT93 61Hで使用)"となっており内容までは判りません。
"State系にパラメータは無い"とは有りますが、これは解析結果からそのように判断していたのかも知れませんのでこの時点で未発見であった機能が存在しており
その機能がState系でパラメータの存在する物である可能性も充分にあると思います。
(山川機長さんが確認されたパラメータは、明らかに時間データではなく,アドレス値のようにも見えます)
なお、この記事"CD-ROMサブシステムを解析する<基礎編>"続く記事がその後のOh!誌に掲載されているかを随分前に探したのですが見つけられませんでした。
ひょっとしたら続きに何かヒントが有るかもしれないのですが・・・・・
やっぱりOh!誌の総目次データが必要ですよね。
2023-02-01 23:53:27
そうなんですよ。総目次プロジェクトはあるんですが、お正月はフラッピーで遊んでしまったりした影響でぜんぜん進んでません。ただ、CD-ROMサブシステムの解析は、僕も続きがいつ載ったのか知りたかったので結構目を皿にして探したのですが、見つかりませんでした。載らなかった可能性が高いように思います。
Towns Magazineですが、さらに調べたところ、どうやらTowns Magazineのプレイヤーは、Towns OS付属のプレイヤーがコマンド62Hで読むのと同じセクタをコマンド63Hを使って読んでいるようです。とりあえず、コマンドFFは必ずエラーを返すようにしたところ、その後連続でコマンド63Hを出すようになったのですが、三度目以降コマンドが出なくてムービー再生も始まらないという感じです。今の実装ではコマンド63Hは、セクタから2340バイト読みだす以外、コマンド62Hと同じようにしてみたのですが、何か違うのかもしれません。
2023-02-03 14:28:46
↑と、書いた直後ですが、津軽のエラー見つけました。最初、63Hのパラメータを見間違ってて、RAWREADは必ず1セクタずつ読み込むものだと思って連続読み込みしないように書いてました。それを直したら再生できるようになりました。
どうやら、コマンドFFHはとりあえずエラーを返しておけばいいようで(それが無いと続く63Hが連続して出ない)、あとは63Hは2340バイトずつ読み込むだけで大丈夫なようです。
というわけで、Towns Magazine Vol.2のムービーも再生できるようになりました。ISOイメージだとエラー修正情報とかどう作っていいかわからないのでいい加減にしかサポートしてないので、実質BIN/CUEまたはMDF/MDSのみコマンド63H対応です。ソースPUSHしました。
2023-02-03 14:41:42
>440 山川機長さん
総目次なんですが、Wikiの方で実現できるか試してみたのですが検索等を考えると実現が難しいのかとも思えたので私も手を着けてはいません。
Googleスプレッドシートの方がある意味便利なのかも知れませんね。
TownsMagazineの方は前進できて何よりです。
EDC/ECCの計算は↓辺りを見ると参考に出来そうですが、そもそもRAWデータを読み込んでアプリケーション側で自力計算しているとも思えないし、何より今のところはRAWREADを行っているのはTownsMagazineのみなのでいい加減でも良いのではないかと私は思います。
https://github.com/claunia/edccchk
2023-02-03 17:58:09
ちなみに、RAWREADができたんだから、試しにMODE2READも実機で試してみたら、RAWREADの最初の4バイトが無いだけで、これってCD-ROM BIOSのモードと一致してただろうか?と、思って確認したら、赤本459ページに書いてあるまんまでしたね。というわけで、津軽でMODE2READも実装してみたんですが、これ使ってるソフトって無いですよね。今までサポートしなくても何も支障が無かったので、多分無いのだろうと思うのですが。あ、カラオケとか実は使ってたりして?カラオケソフトはどういう仕組みになっていたんだろうか?
RAWREADは結構使い道あるかもしらんですね。例えばこの間のBubble Bobbleみたいにセクタ0が読めないようなものは、実機で読んでしまえばいいので、選択したセクタを実機で読み込むプログラムを書いたら役に立つかもしれません。しかし、手持ちのイメージのうち、どのディスクにエラーが出てたかメモしておくべきだった。そういえば、ハイパープラネットはBIN/CUEを作ったときエラーが出ていたらしく、星座落語の最後の方でザーッというノイズが出てたのですが、ついさっきMDF/MDSを作り直したらエラー無く読めて、動画も最後まで再生できてしまったので、実機で一部セクタだけ読み直す必要はありませんでした。
なお、Oh!FM, Oh!FM TOWNSの目次作戦は、ついに!始めました。いつ終わるかわかりませんが、出来上がったらどこかに公開します。途中からちょっとずつ公開していく鴨。
2023-02-06 10:41:37
やっぱりMODE2でも読めるのですね。
CD-ROM XAは基本的にはMODE2で未使用だった領域にMODE1で存在していてMODE2で存在していないデータが再配置されただけのようですので、MODE2が読めるのだったらCD-ROM XAも読めそうですね、
カラオケは、記憶が正しければ音楽は通常のCD Audioで画像はサブコードだったと思います。
Oh!FM,Oh!FM TOWNSの総目次はちょっとずつ公開していただければ手伝えると思います。
2023-02-07 09:28:55
あ、そうか。Oh!FM総目次は、持ってる分ずつContributeしていただけると分業できますね!とりあえずExcelで作り始めて、各号ごとにタブを分けるか、ひとつのタブに全部まとめるかで、とりあえず全部ひとつのタブに書くのが一番シンプル化と思ってそのように始めたのですが、分業を考えるとタブに分けた方がいいですね。うーん、Google Spreadsheetにして、ここで編集可能なリンクを大公開してしまうのもなんなので、リンクを送ります!
2023-02-07 12:44:45
津軽の高速化について前から考えてたんですが、C++のVirtual Functionって、まずRTTIを見に行って、そこからFunction Pointerをゲットしてジャンプだから二段階で、しかもキャッシュをミスするチャンスが二度あるのではないか、それに対してCの関数ポインタだと間接ジャンプ一回だから、結構差が出るぐらい速いのではないかと、思っていたので、試しに下のような実験プログラムを書いてみました。
#include <iostream>
#include <chrono>
class Base
{
public:
virtual int VirtualFunc(int incoming) const=0;
int (*FuncPtr)(int incoming);
};
class Sub : public Base
{
public:
virtual int VirtualFunc(int incoming) const override;
};
int Sub::VirtualFunc(int incoming) const
{
return incoming+1;
}
int AddOne(int incoming)
{
return incoming+1;
}
int main(void)
{
Sub sub;
Base *base=⊂
sub.FuncPtr=AddOne;
auto t0=std::chrono::high_resolution_clock::now();
int x=0;
for(uint64_t c=0; c<1024*1024*64; ++c)
{
x=base->VirtualFunc(x);
}
auto dt=std::chrono::high_resolution_clock::now()-t0;
std::cout << std::chrono::duration_cast<std::chrono::microseconds>(dt).count() << " " << x << std::endl;;
t0=std::chrono::high_resolution_clock::now();
x=0;
for(uint64_t c=0; c<1024*1024*64; ++c)
{
x=sub.FuncPtr(x);
}
dt=std::chrono::high_resolution_clock::now()-t0;
std::cout << std::chrono::duration_cast<std::chrono::microseconds>(dt).count() << " " << x << std::endl;;
return 0;
}
これをVisual C++でコンパイルして実行すると、Cの関数ポインタを使った方がほぼ倍のスピードになるようです。関数の中身は整数に1を加えるだけなので、おそらく関数呼び出しと復帰が大半の時間を占めていると思います。
普通のプログラミングではほとんど気にならない差なのだと思いますが、メモリアクセスとかでこの差が出ると結構効いてくるかな、と、いう気がして、メモリアクセスオブジェクトのvirtual関数を全部Cの関数に置き換えようかと思っているのですが、どう思います?ってやってみりゃいいんですよね。やってみます。
これで差が出るようだったらI/Oアクセスも同じ手が使えるはずなんですがね。
2023-02-15 12:00:11
↑やってみたけど、ほとんど有意な差が出ませんでした、というか、他のプロセスの負荷によって影響を受ける誤差範囲ですね。
ただ、やってる途中、メインRAMアクセスが、physMemPtr->state.RAM みたいな感じになってて、「あ、ここも二段階になってんじゃん」と思ってRAMのポインタをキャッシュするような変更も試したのですが、これも誤差範囲でした。
なかなか甘くないですな(^_^;)
2023-02-16 11:31:36
津軽の高速化とは違いますが、負荷(FREQの値や動かすTOWNSソフト)に関わらずホストPCの1スレッドCPU使用率が100%で張り付いたままとなる現象が発生している(当環境:Core i5 12600)のですが解決できないでしょうか?
おそらくAdjustRealTime内でwhile文によってウェイトをとっているためかと思います。
2023-02-16 16:24:43
BCCさん、
実は、解決策思いつかないんです。std::this_thread::sleep_forを使って決まった時間寝かせられる、ということになってますが、この寝る時間の解像度がわからない、というか何の保証もないので、マイクロセカンド以下で寝かせると指定した時間を超えて10msぐらい寝てしまう可能性があって、ここはbusy waitでナノセカンド単位の解像度が(多分)保証されているhigh_resolution_timerをポーリングするしか思いつきません。さらに、待たせている間にサウンドバッファが空になったら継ぎ足してやらなくてはならないので、ずっと寝かせているわけにもいきません。せめて500nsぐらいで確実に寝て起きることができるようならそういうsleepを入れるという手もあるのですが、今のところ手が無いですね。
cppreference.comの例題(https://en.cppreference.com/w/cpp/thread/sleep_for)で130usも誤差が出てるし(^_^;)
2023-02-17 01:19:42
うーん、今だと、
物理アドレスからメモリアクセスオブジェクト取得→RTTI読み込み→間接ジャンプ→physMemPtr読み出し→RAMのポインタ取得→アクセス
アクセスまでに5段階かかってるのを一段減らしたぐらいだと差が出なかったのか。メインRAMをstaticにしていつも64MB取って設定によって使う上限を変えることにすればさらに二段階減らせるのか。バイトアクセス、ワードアクセス、ダブルワードアクセス(読み書き)、メモリウィンドウ取得をそれぞれ別の配列にするとそれだけで64MB食ってしまうが、その前も減らせるのか。
さすがに、これを、
物理アドレスから関数に間接ジャンプ→アクセス
まで縮めたらいくらなんでも有意に速くならないだろうか。しかし、RAMをstaticにしてしまうと、今なら一応1プロセスに複数のTOWNSインスタンスを走らせることも可能になってるのが、1プロセス1個になってしまう、とはいえ、1プロセスに複数のTOWNS走らせるなんていうことはそもそも起こらないからいいのか。だとしても、一応やったけど、virtual関数をCの関数ポインタに変更するというのもコードの綺麗さという点では相当マイナスだしなあ。
ここ最近、確実にステップ数減らしてるはずなのにほとんど効果が見られなかったことが多いし、実はページトランスレーションとかセグメントトランスレーションにかかる時間に比べて上のステップが小さすぎて意味が無いのだろうか。ステップ数が減ると言ってもたしかに小手先なんだよな。
どうしようかな。
2023-02-17 02:28:32
速度アップについては悩ましい問題ですね。
コードの保守性を求めるか,速度を求めるか・・・・ これはもう開発者のスタンスというか考えの問題のような気もします。
「津軽は実験的なプロジェクトで、速度は重視せず,互換性とコードの読みやすさを優先する」と言う考えも理解できますし、「ある程度の目標を達成した後はSTEP2として津軽開発の経験と実績から別プロジェクトとして速度を重視したものを考える」も理解できます。
ただ、今の時点でここがブレるとコードのスクラッチ&ビルドで作業が大変な事になるんじゃないかと思います。
今現在,「津軽の実行速度が遅くて実機の速度が出ない」と考えられている方がどの程度いらっしゃるのかが問題なんですが・・・
2023-02-17 09:37:25
遅くて困る、というコメントは僕にはあまり入ってこないのですが、ストライクコマンダーのフレームレートを上げたい、というのはありますね。実機だとサイバースティック対応してなかったからキーボードでさんざん苦戦したのをとりあえず津軽ではジョイスティック→マウストランスレーションによって快適にプレイすることができましたが(しかも3周ぐらいクリアした)、地上のテクスチャをオフにしたりフィーチャーを消してやっと快適なフレームレートが出ていたので。ただ、最近の津軽だと多分体感20fpsぐらいは出てるっぽいんですがね。オペランドを放置してあったからここに結構最適化の余地があるような気がしてきてます。今Operandとひとつのクラスにしてしまったけど、考えてみると、CRとかDRは別クラスにした方が良くて、そうするとEvaluateOperandの中で、BCCさんが発見してくれたassume(0)の最適化が使える鴨しれません。
あ、そうか、Strike CommanderはFM音源でBGM流してるからFM音源コアのスピードアップってのもあった。あとエンジン音がPCMで鳴りっぱなしだからPCMの処理もスピードアップできればちょっと効いてくるかな?
ちなみに、速度問題以外で津軽で現在残ってるものというと、
- MXの新PCM
- RS-232C←→TCP/IPのトランスレーション
- MIDI (RS232CからTCP/IPに出すようにしたら誰かRS-MIDIを外部プログラムで書いてくれないかな?という他力本願なことを考えてますが。)
- ビデオキャプチャカード
- Ethernetカード(仕様急募)
- CDのSubQ I/O (だが、これを使ってるプログラムを一本も確認できてない)
- Application Specific Supportの外部ファイル化
- Windows 3.1/95
- 長時間のCD再生
。。。結構ありますね(^_^;)うーん、MXの新PCMがずっとひっかかってたんだった。あれ使ってるプログラムってフリコレとかに入ってましたっけ?
2023-02-18 02:13:53
YM2612のCONNECTの分岐と、CPUのEvaluateOperand, StoreOperandValueのswitch-caseに__assume(0)を適用したところ、これは効いた感じがします。Strike CommanderのTime Balanceが目に見えて改善しているようです。REGのswitch&caseにも効くはず(regは&7を取ってるから絶対0~7)なので、それも適用してみます。
switch&caseのレンジチェックは結構なクロック数を食ってるはずなので、これが削減できると大きいですね。前にも書きましたが、このレンジチェックが不要なところでチェックさせない方法はそういう#pragmaがあるんじゃないかと思って探しても見つからなかったもんで、BCCさんに__assume(0)を見つけていただいて、非常にありがたかったです!
なお、clangとg++だと__unreachable_code();らしく、macOSとLinux用バイナリでも恩恵を受けられるようです。これ、C++23から、std::unreachable(); と標準化されるんですね。
2023-02-18 08:44:25
>MXの新PCM
どこかのサイトで公開されていたセガサターン用ソフト「だいならいあん」をFM TOWNSでプレイするソフトで使用されているようです
https://drive.google.com/file/d/1FoHJ737fVwZrmSJGL-YKi_0D2Rr4ceuR/view
転載は自由という表記が説明ファイル内にあったので実行・ソースファイルを置いておきます。
PCMの他、津軽で実装されていない部分として486のBSWAP命令を使うみたいです。
2023-02-18 10:32:37
BCCさん、
おおなるほど!ありがとうございます!うーん、「だいならいあん」が必要なんですね。入手できるか検討してみます。
ところで、高速化しようと思ってPICを見直している間に、PICのIMRレジスタを完全に無視していたようだという事実に気が付いて、今までどうして走ってたんだろう?という謎に直面してます。IFじゃなくてPICでキーボード割り込みをマスクするとかやってるソフトありそうなもんだけどな。そういやWindows 3.1は今PIC関係のなんかで止まってたような。関係あったりして。
2023-02-18 12:53:53
入手難の情報なのでお役に立てなさそうですが、魔法大作戦のサブ武器発射音も新PCMらしいです。
このゲームはメニュー画面で新機種または旧機種を選べるようになっていまして、MAやFreshだと新機種を選べて、HCだと新機種を選べません。
HCにMAのシリアルROMを挿すと新機種を選べるようになり、武器発射音が出るようになります。
Strike Commander PLUSはアナログスティック対応ぽいですが、初代の方は非対応だったのですね。
操作方法や武器種が理解の外側でしたので練習モード?でドッグファイトや爆撃、低空飛行でスピード感を楽しむのを繰り返していました。
2023-02-18 22:25:14
Strike Commander初代はサイバースティック非対応だったんですよね。なぜ?という感じでしたが。一応それでも当時キーボードで一通りクリアしたんですけどね。
なお、Strike Commanderとか、IDIVとかIMULを多用しているはずで、どちらかというとエミュレータには有利なコードなはずなのに、なんで苦戦するかな?と、思ってCPUのIMULとIDIVを見直したところ、またちょっとTime Balanceが改善したような気がします。
だとしても、いまいち都市上空とかで真下を見下ろしたときのフレームレートが悪いんですよね。これって実は実機MXのDXの66MHzだとそもそもこんなもんだっただろうかという気になりつつあります。MXにインストールしてあるし、一応キーボードで操縦できるから、実機であとでやってみりゃいいんだな。あとでやってみます!
2023-02-19 03:32:29
実機MX、やっぱり速いですね。津軽だと現状うちのデスクトップ、Core i9 10900F 2.8GHzで、486の40~45MHz相当ぐらいというところですかね。しかし、既に買ったの2年前か。じりじりとCPU自体スピードアップしてるから案外今の一番新しいやつだともうちょっと出るのかな。
2023-02-19 14:34:27
今度のは効いた鴨。今まで、AND DWORD PTR [EDI+0x100],EBX みたいな、オペランド1から読みこんで計算して書き込むような命令で、ページトランスレーションが二度発生してることに気が付いて、ポインタをキャッシュするような書き替えを加えてますが、Time Balanceが目に見えて改善してるようなので、これは結構効いたような感じがします。まだ他にも適用可能な場所があるので、これを全部やったらかなり効くんじゃないかな。
2023-02-22 09:36:26
ソースPUSHしました。この書き換えは結構速くなったと思います。1割ぐらい違うような気がします。たしかに、一命令の中で二度もページトランスレーションするのは非能率的でしたね。一応、津軽のテストはすべて通って、今互換ROM用のテストも走らせていて、現在6割ぐらい走ったところですが、すべてパスしているのでCPUコアは壊してないと思うのですが。
2023-02-22 14:25:12
Auto Release v20230113と最新ソース版を比較して試してみましたが、こちらの環境では明確にpri timebalanceの値に差異が出ていないようでした。
2023-02-22 20:11:57
早速テストしていただいてありがとうございます!クロック周波数はどのぐらいで試されたでしょうか?うちの環境では、66MHzでStrike Commanderをベンチマークにしているのですが、オープニングでフェードインが完了した直後あたりだと、この修正前が大体350000~380000、修正後が300000~350000、画面がスクロールして前方からMig-29とF-16が飛んでくるアニメで、修正前が300000前後、修正後が220000~240000程度に改善しています。飛行中でベンチマークできればいいんですが、変動が多くて飛行中は体感でしかわからないですけどね。なので、VMが実時間についてこれなくなるぐらいの周波数で試していただけると効果が見えるのではないかと思うのですが。
2023-02-22 22:24:12
TownsOSのTMENU上だとFREQ 66設定でpri timebalanceを出すとどちらも220000、FREQ 83までならまだVMが実時間に追いつく、FREQ 100あたりで遅れが生じてくるようです。Sky Duelや館などの3D系のタイトルを動かしても同じ。
フリコレ10に収録されていたTOWNSベンチマークを実行してスコアに変動がなくなってくるFREQまで上げていってもやはりどちらもおなじFREQ値(166)となりました。
2023-02-22 23:29:31
おおなるほど!それは、速いPCですね。うちでも試しに去年大学から支給してもらったThink Pad Yoga Gen 7で試したら余裕で66MHz出ていて複雑な気分になりましたが(^_^;)メインで使ってるデスクトップ機とは1年半の開きがあるだけなのですが。一時期CPUがぜんぜん速くならない時期がありましたが、また最近スピードが上がってますよね。
一応、BINARYOP MEM,REG のパターン(メモリから読み込んでメモリに書く)場合、修正前は読むときと書くときでページトランスレーションが発生していたのが1度になったので、この系のインストラクションが多いコードだと効果があると思うのですが、そうでないとあまり差が出ないと思います。Strike Commanderのオープニングは、アニメーションの展開とかでそういうインストラクションが多いのかもしれないですね。しかし、オープニングだから速くなってもあまり意味が無いという問題がありますが。そして、肝心の飛行中のフレームレートにはあまり差が見られないという。。。
2023-02-24 01:27:17
CPUのコードを見直すと、素直にoperandSizeをif(16==operandSize) else で処理を分ければいいところを、テーブルとかANDとか駆使して敢えて分岐しないように書いてるところがたくさんあるけど、結果的にオペランドサイズのチェックが何度も入ってしまってるんだな。ちょうどGLSLも書いてた影響で分岐は悪、みたいなメンタリティになってた時期だった。地道にこういうところを書きなおそう。
2023-02-26 02:06:34
お世話になります、
「津軽」を動作させたくて試行錯誤しておりますが
全くダメです
当方の環境等
macOS : 10.13.6
津軽 : macos_binary_latest 17-41-46-780
解凍後に 「 Tsugaru_GUI.app 」と同じフォルダに下記4フォルダを作り
HDD Image
FDD Image
CD Image
BIOS
「津軽」起動後に 「 ROM dir: 」をクリックしてBIOSを選択し(FMT_SYS.ROMでよいですか? 画面上はBIOSのパスですが)
スタートさせると「予期しない理由で終了しました」と表示され全く変化なしです
ググってもMACでの情報が見つかりませんのでココにたどり着いた次第です
お手数をおかけして申し訳ございませんが
よろしくお願いいたします
2023-03-13 18:33:28
たろすけさん、
ROM dir:をクリックできているということは、GUIの起動まではできているわけですね?
お使いのmacはM1/M2でしょうか?Intelでしょうか?リリースのバイナリはIntel用にコンパイルしているので、M1 macだとエミュレーションによる実行になるため、何かがひっかかっているかもしれません。
それから、"Separate Process"ボタンはチェックがチェック状態になっていたらはずしてみてください。セキュリティの問題で起動しないかもしれません。
M1バイナリも多分githubのworkflowでビルドできると思うんですけどね。まだセットアップしてないもので。
2023-03-14 05:42:55
お世話になります、鈴木です
ご連絡が遅くなりまして、申し訳ございません
(マトモな労働環境ではないのでようやく解放されました)
>ROM dir:をクリックできているということは、GUIの起動まではできているわけですね?
はい、ウインドウが表示されるので「 ROM dir: 」をクリックしてBIOSを選択し(FMT_SYS.ROMでよいですか? 画面上はBIOSのパスですが)
スタートさせると「予期しない理由で終了しました」と表示され全く変化なしです
>お使いのmacはM1/M2でしょうか?Intelでしょうか?
intelです (mac mini 2012 macOS : 10.13.6)
>それから、"Separate Process"ボタンはチェックがチェック状態になっていたらはずしてみてください。
すみません・・ どこにありますか?
OSがかなり古いので起動可能なmacos_binary_latest 17-41-46-780(起動可能な最新版)が関係しているのでしょうか?
ちなみにですが、"Tsugaru_GUI.app"のパーケジ内"Tsugaru_CUI"をターミナルで直接起動すると下記となります
Last login: Thu Mar 16 09:49:20 on ttys000
Macintosh:~ ****$ /Users/****/Desktop/FM-T/macos_binary_latest/Tsugaru_GUI.app/Contents/MacOS/Tsugaru_CUI ; exit;
YM2612 Emulator for Tsugaru [Tsugaru-Ben]
dyld: lazy symbol binding failed: Symbol not found: ____chkstk_darwin
Referenced from: /Users/****/Desktop/FM-T/macos_binary_latest/Tsugaru_GUI.app/Contents/MacOS/Tsugaru_CUI (which was built for Mac OS X 10.15)
Expected in: /usr/lib/libSystem.B.dylib
dyld: Symbol not found: ____chkstk_darwin
Referenced from: /Users/****/Desktop/FM-T/macos_binary_latest/Tsugaru_GUI.app/Contents/MacOS/Tsugaru_CUI (which was built for Mac OS X 10.15)
Expected in: /usr/lib/libSystem.B.dylib
Abort trap: 6
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[プロセスが完了しました]
2023-03-16 09:58:39
お世話になります、追記です
アップされている1番古いバージョン(v20200628)でも試しましたが同様な結果でした
お忙しいところ大変恐縮ですが
よろしくお願いいたします
2023-03-18 09:08:50
ご報告ありがとうございます。うーん、 dyld: Symbol not found: ____chkstk_darwin は、どうやらmacOS 10.15の機能を使っているということのようです。
津軽のソース自体はそういう機能は多分使っていないと思うので、macOS 10.13でビルドすれば実行できると思います。たろすけさんの環境でソースからコンパイルすることは可能ですか?津軽はXCodeにもともと入ってくるライブラリ以外に依存するライブラリが無い(はず)ので、比較的ビルドは簡単だと思うのですが。
2023-03-19 00:08:25
ご連絡いただきまして、ありがとうございます
(素人なので申し訳ございませんが) 当方のビルド経験からですが ・ ・
「ダ ダ ダーー とバラバラ文字が目まぐるしく流れて大量のエラーらしき文字に怯えて
何事もなかったように静まり返り」出来たか !? と期待しながらダブルクリックするとエラーで起動できない・・ 等々の苦い思い出しか ・ ・ (多少の演出あり)
最新の " Auto Release v20230113 " にアップされている " Source code(zip) " をビルドすればよいのでしょうか?
一応ですがターミナルで " gcc -v "の結果は下記となります
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.11.45.5)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
2023-03-20 09:40:13
おおなるほど。ターミナルで、
cmake --version
とタイプしてCMakeのバージョンが表示されるか確認できますか?
2023-03-20 21:40:37
ターミナルで " cmake --version "とタイプした結果は下記となります
cmake version 3.22.1
2023-03-21 09:47:46
OKです!gitは入ってますかね?
git --version
でバージョン出ますか?
2023-03-21 13:38:06
" git --version "とタイプした結果は下記となります
git version 2.17.2 (Apple Git-113)
2023-03-21 16:24:52
OKです!では、以下のコマンドを試してみてください。最後の行は実行です。我が2014 mac miniでタイプしたコマンドをカット&ペーストしたので、コマンドは間違ってないはずです。多分コンパイルできると思うのですが。
git clone https://github.com/captainys/TOWNSEMU.git
cd TOWNSEMU/gui/src
git clone https://github.com/captainys/public.git
cd ..
mkdir build
cd build
cmake ../src
cmake --build . --config Release
cp main_cui/Tsugaru_CUI.app/Contents/MacOS/Tsugaru_CUI main_gui/Tsugaru_GUI.app/Contents/MacOS/.
main_gui/Tsugaru_GUI.app/Contents/MacOS/Tsugaru_GUI
2023-03-21 22:42:19
お世話になります
ご連絡いただきまして、ありがとうございます
ご教授いただきましたコマンド(私にとって救済の魔言葉)をタイプしたと結果 ・ ・
おかげさまで無事に起動いたしました(仕事の関係で時間がないので本当の検証はまだですが・・ )
"えんぴつ" やら " イヌ " やら " クリップ " が表示されましたので多分大丈夫だと思います
感謝感激です
あと、当方側の問題かと思いますがHDDイメージを作って保存しているのですが
ファイルが作られない現象が以前より続いております
時間が取れ次第、色々とテストしてみたいと思いますので
今後とも、宜しくお願いいたします (何十年ぶりに実機が復活したような感じです!!)
2023-03-23 09:21:17
スミマセン 書き忘れです
毎度おなじみのビルド中に" warning "が結構表示されて寿命が縮む思いなのですが
大丈夫なのでしょうか? (ビルド自体を理解していないゆえ??)
2023-03-23 09:24:15
動いたとのことで良かったです。mac Mini 2012だと多分初代TOWNSぐらいのパフォーマンスぐらいしか出ないと思いますが、初代に合わせたゲームは多くあるのでそれなりに使えるのではないかと思います。
Warningは、取った方が良いのですが、OpenGL関係のWarningはAppleによる脅迫なので無視することにして、あとコンパイラのバージョンが上がるたびにだんだんWarningが増えてきて、取る気がなくなって放置してあります。気にしないで大丈夫です。
ファイルが作られない現象というのは、もう少し詳しく教えていただけますか?HDDに書いた内容が保存されない現象でしょうか?mac版で動作検証していただいてる方があまり多くないらしい(Linuxは多いらしい)ので、ありがたいです。
2023-03-24 00:02:51
ビルド中の" warning " ですが、全く別のビルドでも結構大量に表示される → しかし、全く問題なく動作する等々 ・ ・ なので
心臓に悪いイメージはあるのですが 「問題ないら寿命を縮めないでほしい(Apple ?)」 という感じでしょうか?? ← 単なる小心者ですので ・ ・
mac Mini 2012(改) でどこまで実用になるか? 含めてレポートしたく思っておりますが、仕事の合間しか時間が取れないので
かなりレスポンスが悪いことをお許しください
HDDイメージ(当方の間違いかも?)ですが、画面左上メニューのFileからNewHard-Disk・・ を選択して例えば512MBを入力しOK
SAVE Asでイメージファイルを保存していると思うのですが何も表示されません(当然、LOADしようとしてもイメージファイル自体が存在しないので選択不可です)
こんな感じです
2023-03-24 09:01:08
たろすけさん、
原因究明しました。GUIライブラリのバグでした。publicレポジトリを git pull してから再度ビルドしていただけるとHDDイメージが作れると思います。
お試しください。
2023-04-03 14:24:58
山川機長
ご連絡いただきまして、ありがとうございます
時間取れ次第、ガンバってみます
結果等含めまして、ご報告申し上げます
2023-04-04 17:11:58
山川機長
ご報告が遅くなりまして、申し訳ございません
おかげさまでHDDイメージが作れるようになりました
最初、git pull を勉強して再ビルドしたのですがダメで・・
全て削除して最初からやり直したら大丈夫でした
ちなみにですが・・ やはり i7 2.6GHz ではパワー不足ゆえと思われる「音声がブチブチ途切れる」のですが
フレームスキップ等の暫定処置とかは無いですよね?
2023-04-22 17:54:59
起動自体には問題が無いので特に重要ではないのですが、津軽の実行ファイルのアイコンって用意する予定はありますか?
Windowsのスタートメニューにショートカットを登録していて他のアプリとは違う見栄えなのが気になったので。
https://drive.google.com/file/d/1dOQC9MVK95JnqB6kATcYJVWnEQdYTZAu/view?usp=sharing
とりあえず、上の様な仮アイコン(縦型TOWNSのCDドライブにしようかと思ったけどうんづとダブるので縦型TOWNSの色合いを意識したただのディスク)を作ってコンパイルのリソースにicon.rcを登録してアイコン表示を行っていますが、仮の物でもアイコンを登録したいようであればお使いください。
2023-04-26 23:30:23
たろすけさん、
うーん、多分オーディオバッファに空きができてから、残ってるデータを再生しきる間にデータの追加ができてないんでしょうね。問題はフレームよりはCPUのエミュレーションなので、ちょっと難しい鴨しれません。ただ、うちのCore i9 2.8GHzでもソフトによってはブチブチ音が出ることがあるので、何か別の問題があるの鴨しれません。この問題は(githubのissueにも出てるし)引き続き改善を検討します。
BCCさん、
アイコンはあったらいいなとは思っていたのですが、僕は絵心がないもんで。アイコンはありがたく使わせていただきます。PNGに変換してmac/Linuxでも出るようにしようと思います。ありがとうございます!
2023-05-01 06:14:01
お世話になります、たろすけです
音声の件、CD-DA再生が絡むと顕著です
フレーム的には引っかかる感じがしないので音だけがNGの可能性もあります
今後とも、宜しくお願いいたします
2023-05-01 16:05:25
音声のノイズとは話は逸れますが最適化として
vmbase.hのVMBase::RunScheduledTasksは
Device *devPtr;
for(auto devIndex=allDevices[0]->vmNextTaskScheduledDeviceIndex;
0<=devIndex;
devIndex=devPtr->vmNextTaskScheduledDeviceIndex)
{
devPtr=allDevices[devIndex];
とforの変化式を変更したほうがTimebalance値が良くなるようです。何度も計測して誤差はないことは確認して、TMENU画面でFREQ 66時に230000~240000だったのが250000~260000まで上がるようでした
2023-05-02 21:43:53
おおなんと、そこで差が出るとは。そうか。allDevicesはstd::vectorだから二度参照が起こるのか。キャッシュミスしてたら有意に差が出るのかな?
ありがとうございます!変更してみます!
2023-05-05 04:12:42
横から素人が失礼して大変恐縮ですが
期待してよさそうな朗報でしょうか?
2023-05-05 09:33:23
いやあ、多分、そこまでの効果は無いと思います。申し訳ない。
2023-05-06 04:48:19
ご連絡いただきまして大変感謝です
今後とも、よろしくお願いいたします
2023-05-07 10:40:07
ここ数日「大航海時代2」をやってたんですが、イギリスのオットー・スピラーノ(名前変更して、セスナ・マイクタンゴ)のシナリオで、これから(多分)最後の決戦、というところでバグって先に進めなくなったんですが、誰か実機で最後までプレイした人います?このゲーム、大航海時代1よりも難易度が結構高いようなので、挫折した人の方が多そうな気がする反面、当時だったら攻略本とかもたくさんあったのではないか、という気がします。最後の最後でバグった以外はこのゲーム、かなり頭を使うようにできてて、やっぱりおもしろいですね。
ただ、このゲーム頻繁にディスクをアクセスするようで、海戦で負けが確定したときとかRESETコマンドを使ってリセットしたときになんか壊したのかという気もしているので、再度やってみます。コツもかなりつかんだし。
このゲームどこかでout-of-boundアクセスが起きてるのは確定っぽくて、何度か艦のグラフィックが崩れる、店から出たらパレットが壊れてクラッシュ、ということがありました。もう一度続行不能に陥るようだったらデバッグしてみよう。多分津軽のバグではないと思うんですが。
2023-05-08 04:00:49
たろすけさん、
macOS上で、音がプチプチ切れる現象ですが、もう少し詳しい状況がわかりますか?音が切れやすい状態とかありますか?Windows版でも同じ現象が起きていて、プチプチ音を防止するためにストリーミングにしたのに前よりかえって増えちゃったと思ったら、なんと、Microsoft公式情報では、DirectSound8の「write cursorはplay cursorの15msほど前方」と明示的に書いてあるのに、実際調べたら20msで、津軽は20ms単位でWaveを送っていたので、本来あるはずの5msの余裕が実はゼロだったということがわかって、こっちはバッファを長くしてやれば解決しそうなのですが、macOSについては、ダブルバッファ的なことをしていて、仮にバッファを埋めるために20msかかっているとするとそれだけでエミュレーションはもはや80386 8MHzどころではない遅さになって実質的に使えないはずなので、いくらなんでもそれはあり得ないと思うんですよね。
2023-05-09 00:48:50
山川機長、お世話になります
まだ少しの稼働時間で参考になるのか不明ですが、具体的なソフト名ですと「データウエスト VOL.4 Orgel」が初っ端からモーレツにプチプチです
勝手な憶測推測 ? ですが・・
・ 画像処理の負担?(シューティングゲーム的)と関係ないような感じで、静止画状態でもプチプチ音が切れます
・ FDDやCD-ROMアクセスとの関係は ? ← インジゲーター自体がズレてるから関連性をおえない ?
・ マウスカーソルの動きは関係なさそう ? ← 激しく動かしても変化なし ?
・ 内蔵音源とCD-DAが絡むとさらに症状悪化 ?
・ 80386 のクロック数を低めにするとプチプチ度合いが若干緩和される感がします(気のせいかも ?)
ちなみにですが、macOS側のCPU 130%以上でほぼ変動なしです
なにか試す必要がありましたら、お知らせください (時間が取れ次第確認いたします)
2023-05-09 09:17:16
大航海時代2はプレーしたことが無いものの持ってはいますので、起動FD内のEXPファイルのサイズや日付を見てみました。
MAIN.EXP 361.891 1993.04.14
END.EXP 72.056 1993.04.06
これと異なる物をお持ちの方がいらっしゃれば、1の時みたいに何らかの修正があったのかもしれませんね。
2023-05-11 06:18:32
手持ちの大航海時代2では以下の通りとなっています。
MAIN.EXP 362027 93-03-29 17:08
END.EXP 72052 93-03-29 17:08
オスマン帝国のアル・ヴェザスでクリアしています
2023-05-12 23:17:37
大航海時代2情報ありがとうございます!なお、バグって先に進めないと思ったところは無視すればクリアできることが判明して、オットー・スピラーノでエンディングをふたつとも(公爵になるエンディング、エゼキテル司令官に勝利エンディング)確認しました!なお、ほとんどヨーロッパから出なかったので、現在エンディング後データでインド・アジアを巡ってます。
うちのディスクは MAIN.EXPが361891バイトで93-04-14 でした。解析して津軽にキーボードショートカットで操作できるような拡張(大航海時代1でやったみたいにキーボードでマウスクリックイベントとVMに送る)を追加したんですが、違うバージョンだと動かないかもしれないですね。
2023-05-15 05:34:02
特定のキーを押しながらの電源オンやリセットで 起動ドライブを選択できると知り 試してみたのですが実機と うんづでは出来ましたが 津軽では出来ないようでした。認識されないのでしょうか??
2023-05-18 21:27:25
tomoさん、
キーの判定ですが、起動直後ものすごく短い時間で起こっているので、そのタイミングでキーを押すのが難しいのだと思います。コマンドモードだと起動時はターミナルのウィンドウがアクティブだし、GUIモードだとリセットするためにはGUIモードがキーを取ってしまっているので。代わりに-BOOTKEYオプションでリセットがかかったタイミングで確実にキーが押されてるようにしたのですが、知ってるキーの組み合わせしか対応してないので、未対応のものがあったら追加しますが、以下の組み合わせの他に何かありましたっけ?
CD
F0
F1
F2
F3
H0
H1
H2
H3
H4
ICM
DEBUG
2023-05-18 22:17:37
キーを押しながら[START]や[Reset Virtual Machine]で試してました。Bootタブにありました!失礼しました。
Townsには詳しくないのでよく判っていないのですが、Nで互換モード、Fで高速モードと言うのもあるようでした。
2023-05-20 09:17:42
>499 tomoさん
高速モードでの起動は「T」を押しながらリセットですね。「F」はフロッピードライブ起動に取られてるので。
2023-05-31 14:53:25
ありがとうございます。
参照したサイトは こちらでした。
http://www43.tok2.com/home/cmpslv/Debug/EnrDbug.htm
他のブログでも 同じように(Fで高速と)書いてあったのですが もしかしたら同じサイトを参照したのかもしれませんね。。
2023-06-04 21:48:23
TとNキー、津軽で対応してみました。こんな起動キーがあったとは。津軽だとTを選ぶと他のF0とか選べなくなってますが、実機だと多分T+F+0みたいな感じで高速モードでフロッピーディスク起動みたいなことができたんでしょうね。
なお、需要があるかわからないのですが、津軽に.VGM形式ファイルのキャプチャ・出力機能を追加してみました。知らない人はあまりなじみがないかもしれないですが、FM・PCM音源のレジスタ・メモリへの書き込みをそのままキャプチャするフォーマットで、仮に津軽のFM・PCM音源のエミュレーションの再現性が悪い場合でも、多分VGMプレイヤーの方にデータをかけると正しく演奏してくれます。
そのうち津軽でキャプチャしたVGMを実機で再生するプログラムを書いてやろうと思っているので、需要がほとんど無いと思われる使い方ができるようにしようとか思ってます。一度デモを書くと、何の役にも立たないコードを書く楽しみの味を占めてしまってこういうことを始めたくなるわけですね。もっともF-BASIC 386のPLAY命令で演奏させたデータを実機でそのまま再生させられるとかいうとデモのBGMに使えるかな。しかし、デモもやっぱり何の役にも立たない。
2023-10-04 13:21:34
ここ見に来てる人って大体Windowsでしたっけか?津軽のサウンド再生を一念発起してかなり手を入れたのですが、macOSかLinuxで使ってる人がいたら、最新版ソース試していただけるとありがたいです。
なお、うちの環境では2014 mac miniでも2015 ThinkPad X250上のLinux(Ubuntu 18)でも音が途切れずに再生できるようになりました。
しかし、本来そうあるべきですが、Linuxはさすが軽いですね。さすがに2015年の機種だと重いかと思ったら、ThinkPadでまったく快適に動作してちょっと感心しました。ALSAライブラリには相当困りましたが。
2023-10-22 01:31:06
大きく差異が発生するわけではないですが、486DXCommon::OperandValueのGetAsDwordとGetAsByteは配列でANDを取る値を取ってくるようにはせずSwitch文で計算式をそれぞれ実行したほうが若干ですが最適化できるようです。
ホストCore i5 12600でTMENU画面でpri timebalanceを実行した際の値の最大結果がFREQ66時に290000から300000まで向上しました。配列からの取得で何度試しても300000を超えるようなことはなかったので誤差ではないはず。
2023-11-16 19:19:26
自分はWindowsメインですが、手許にDebian12環境があるので津軽を入れてみました。
UBUNTUではないですが、派生元だし動くだろうと思いまして。
環境は2017年頃のLifebook(i5 2.6GHz)ですが、Galaxy force 2が処理落ちも音切れもなく動きました。
幾つかパッケージの追加は必要でしたが、特別な設定等なしでジョイパッドも使えています。
2023-11-21 22:14:52
Windows版で時計が12時間ずれる(JSTより津軽内の時計が12時間進んでいる)のですが、津軽に対してVMのタイムゾーンを指定するような方法はありますか?
2023-12-02 18:44:07
訂正:12時間進んでる→8時間遅れてる
2023-12-02 23:50:15
気づいたらなおってました。お騒がせしました(恥ずかしい
2023-12-03 02:03:08
まだ現象が起こったので調べてみたのですが、JSTなWindowsにおいて。
00時~:正常
12時~:8時間遅れる
17時~:12時間遅れる
20時~:8時間遅れる
みたいな感じです。なんかバグっぽい印象ですが……。
2023-12-04 00:34:24
おおなるほど。RTCはあまり気にしてなかったので、多分バグっているものと思います。(EST/EDTだといつも時間合ってなかったような気がするけど放置してた)。
最近、開発環境を前みたいにDOSBoxでビルドして津軽に持ってくるのをやめて、全部津軽の中でビルドするようにしたので、ちょっと気にはなってたんですよね。
確認してみます。
2023-12-04 00:45:31
バグってました。多分最新版ソースで直ってると思うのですが、よかったらご確認ください。
2023-12-04 02:45:25
すんません、直ってませんでした。というか、RTCの24-hour/12-hourモードはどっちがデフォルトなのかデータシートに書いてなくて、どうもTOWNSは時刻を設定したとき24-hourモードに設定して、あとはバッテリーがバックアップしているような感じなので、デフォルトで24-hourモードにしました。これによって午前と午後正しく出るようになったと思います。ソースPUSHしました。
2023-12-04 09:04:08
ビルドして確認しました。
RTCなおったようです。ありがとうございます。
2023-12-04 17:29:12
>512 山川機長さん
同じ系統のRTCを使っているFM77AVでは24hourモードがデフォルトみたいです(XM7の実装で確認)。
2023-12-07 13:22:50
多分、ICメモリカードスロットと並ぶTOWNSで有効利用されなかったデバイスと思われる、MX世代で追加されたハイレゾPCMに対応してみました。今は起動時に-HIGHRESPCMオプションを付ける必要があってCUIしか対応してなくて、ステートセーブも対応してませんが、大丈夫そうだったら機種がMX以降の場合自動的に有効にしようと思ってます。High-CのWAVライブラリを使って実験したんですが、なぜかハイレゾPCMを使ってくれなくて、よくよく調べたらこれはシステム設定をするときにハイレゾPCMが有効になってて、しかもWAV形式ファイルを使うオプションをオンにした場合のみハイレゾPCMを使うSND_WEX.BINが選ばれるんですね。
ただ、ハイレゾPCM使ってるアプリケーションってTowns TALK以外になんかありましたかね?
ところで、これを実装してて謎がひとつ発生したんですが、ハイレゾPCMは、DMA転送が16ビットモードのみということになっていて、カウントに指定した値+1の2倍のバイト数が転送されるのですが、元からあるDMAは、赤本69ページによると、バス幅は16-bitになってますが、BIOSその他どれを見ても、カウンタに指定した値+1バイトが転送されるようになっています。しかも、赤本71ページには「64KBまで連続してDMA転送できます」とあります。これは赤本69ページの記述が間違いで、8ビット幅固定なのではないかという気がしてきています。
2023-12-10 14:29:27
48KHz PCMは前にも掲示板で話題が出たと思いますが、市販ゲーム「魔法大作戦」とフリーソフトでサターン用ソフトだいならいあんを再生するものが対応していたはずです。
と、掲示板の書き込み後に調べたところ「FM TOWNS デモンストレーション 93年冬」というデモディスクで白型FM TOWNS IIの新機能紹介時に48KHz PCMを再生する場面があったので試してみました。
https://www.youtube.com/watch?v=qokwsHENa1s
上記の動画のように再生速度がおかしいのか割れたような音質で時折大きなノイズも発生しています。-HIGHRESPCMオプションを外すと無音になるので確実に48KHz PCM側から再生されているはずです。
2023-12-10 19:54:22
おお、なるほど!早速試していただきありがとうございます!一応、PRI HIGHRESPCM でハイレゾPCMのステータスを見ることができるので、DMAとかの値が変化していたらハイレゾPCMが動いているのが確認できます。
こちらでも試してみましたが、48000KHzモードになってるんですね。うーん、ダウンサンプルに失敗してるのかな。なんとかスムーズになるようにやってみます!
2023-12-10 23:40:39
原因究明しました。デモディスクだと、DMAEのタイミングでバッファにWAVEを送るのでなく、20ms周期でデータを送っていたようです。しかし、とりあえず内部バッファサイズがわからなくて、1993年のサウンドチップだし、1KBぐらい?ということにしてあったもので、5回に一度送り損ねてバッファアンダーランが起きてました。適当に8KBにしたところ、音が割れなくなりました。あと、バッファの継ぎ目でリサンプルがスムーズに進むように変更しました。今PUSHした新しいソースでは直ってると思います。
あっ、と、思ったら1024x768モードで絵が出てないし。直さなきゃ。
2023-12-11 00:54:20
絵も出るようになりました。ハイレゾCRTCのレジスタ11Bhの値が、0xFFのとき8ビットモードとしていたのですが、0xFF00FFのときも8ビットモードにするものらしく、というか、下位16ビットだけ見れば良さそうなので、0xFFFFでマスクして0xFFなら8ビット、0x8000なら16ビット、0xFFFFならフルカラー、それ以外なら4ビット、と変更しました。ついでに、ときどきCD-ROMのステートセーブにしくじる問題が解決できてしまったので、それも反映したやつをPUSHしました。最新版だとデモCDが最後まで走ると思います。
早速テストしていただきありがとうございました! > BCCさん
2023-12-11 04:27:30
おお、なんと。Bad Apple! for TOWNSってハイレゾPCM対応じゃないですか!感動して3度も再生してしまいました。
2023-12-11 13:11:18
DOOM for TOWNSもハイレゾPCM対応だったんですね! Bad Apple!もDOOMも11KHzで再生しているようですが、22KHzとか44KHzにするとやはり音声データがメモリに入りきらないですかね?
2023-12-12 05:40:23
DOOMに関しては元データで11KHzのPCMが大半(唯一22KHz再生なのがDOOM2で追加されたスーパーショットガンの効果音)なのでそのレートで再生しています。
Bad Appleは386機でも再生できることを前提にしていて、実機がどれほどの負荷に耐えられるか分かっていなかったので余裕を持った音質にしたと思います。
2023-12-12 12:28:50
おおなるほど!元のPCMだとソフトウェア転送だからCPUに負荷がかかるわけですね。了解しました。
2023-12-12 13:38:38
津軽に要望です。
共有フォルダ内 の「小文字のDOS実行ファイル(exe/com)」が実行できないので、
std::string TownsTgDrv::FilenameTo11Bytes(std::string in)
の最後で
transform(eleven.begin(), eleven.end(), eleven.begin(), toupper);
とかして、常に大文字で返すように修正していただけないでしょうか。
※手元での動作確認はとっています。
2023-12-12 19:25:01
おおなるほど。了解しました。ソースPUSHしました。
ついでにWindowsだと8.3ファイル名に変換する機能があった気がしたから長いファイル名もアクセスできるようにしようと思ってたので、それも入れました。
ところで、DOS6のコマンドでTABでファイル名補間とかってドライバとか常駐ソフトとかってありましたかね?COMMAND.COMをそっくり置き換えるんだったら http://wiki.freedos.org/wiki/index.php/FreeCOM こんなのあるみたいですが。ん?こんなのあったのか。互換ROM作ってたとき自分で書かなくても良かったのか!?
2023-12-12 23:06:51
その都度リネームすればいいのですが、ファイル名に半角カナ/全角日本語が含まれるものもそのままTGDRVでやり取りできるようにはできますでしょうか?
ソフトウェアコンテスト内のプログラムに半角カナのファイルが出力されるものが含まれていてホスト側にバックアップ取ろうとしても移動コピーやファイル操作が行えないようなので。
ついでに、48KHz PCMの対応ソフトに上げていた「だいなあいらん」再生ソフトの「Dina4TOS」は自分でテストして、TBIOSを経由せずpdrv.libというライブラリで再生させているようですが正常に動くことが確認できました。
2023-12-13 00:13:59
ああ、それ(Shift-JIS <-> システムエンコーディング変換)やろうと思っててまだやってませんでした。ちょうどいい機会なのでやってしまいますかね。
少しお待ちください。
2023-12-13 03:01:32
多分最新版ソースで漢字と半角カナ対応できてると思うんですが、よかったらお試しください。
2023-12-13 13:54:54
津軽ってwindowsXPでは動きませんよね?
2023-12-13 20:37:06
あー、XPだと多分さすがに動かないと思いますね。多分XPにも対応していたバージョンのVisual C++でコンパイルしようとしても、C++11とかWin32 APIのバージョンとかでひっかかると思います。既にコンパイルできる環境がないもので試したことはないですが。
2023-12-13 22:34:46
なるほどwindowsXPのx86で使おうとしたら有効なアプリケーションではないと怒られたのでおや?と思っていました
x64を中古で購入する前に念の為質問しに来て良かったです
素直にwindows11に入れ換えて使う事にします
ありがとうございました
2023-12-14 06:24:47
ファイル名関連の変更の一つ前のバージョンを使ってみました。
デモ93では
-HIGHRESPCMと-NOHIGHRESPCMでの違いは分かりませんでした。
-NOHIGHRESを付けると起動直後からほぼ静止画で、無しですとアニメーションしまくりでした。
ハイレゾグラフィックには動画に有利な機能が搭載されたのでしょうか。
魔法大作戦では、サウンドテストでNo.17以降も選択できましたので(旧TOWNSですと16までしか選択できません)新PCMの使用できるモードで起動してはいますが、
サブ武器発射音が無いままなので新PCMの音は出ていないようです。
ゲームデモではサブ武器発車時に一瞬ノイズが鳴っている雰囲気はあります。
2023-12-14 20:16:53
最新版のv20231124(やそれ以降のソース)だとRF5C68 PCM音源に不具合があるようです。
気づいた範囲だと自作のWolfenstein 3DでPCMが鳴らない、ALLTYNEXのBGM(各EUPをプレーヤーで再生してトラック8のPCMドラム音だけ有効にするとわかりやすい)でバスドラムが鳴らないなど。
2023-12-26 14:54:38
津軽でのCPUエミュレーションについて。
Free386開発中に気づいたのですが、IRETD でCPUリングレベルの内側から外側に戻る際にスタックからセグメントレジスタをpopしますが、セグメント値を16bitで読み捨てず、bit16-31(正確にはbit16-23)を読み込んで対象セグメントレジスタのベースリニアアドレスとして設定しているようです。
調べてみると普通にpopしても、狂うようです。以下16bitモードで。
push -1
push ss
db 66h
pop ss
セレクタロード時は、上位16bitは常に無視するのが正しい仕様だと思っているのですが(調べてはいない)、どうでしょう。
2023-12-26 18:10:05
はじめまして。Win11で津軽を利用させていただいている者です。
すみません、質問3つさせてください。
・CDソフトから引き出したISOを津軽に差して使ったのですが、音声は出ているのですが音楽が出ないです。何か特別な設定が必要なのでしょうか?
(ソフト名:ぷよぷよ、プリルラ)
・ウィルススキャンソフト(当方はNortonです)が走っていると津軽は使えない?
・津軽を配信プレイ(OBS)に使いたい場合、ゲームキャプチャソースを使って取り込むのでしょうか?
有識者の方よろしくお願いします
2024-01-02 21:28:30
>探星亭静闇さん
ISO化ではデータトラックしかイメージ化できていないと思うので、CD Manipulatorbinなどを使って/cueもしくはimg/cueの形式でイメージ化する必要があると思います。
ウイルススキャンに関してはWindows標準の物を使用していて特に問題ないので何とも言えません。
OBSで配信する場合は
ソースは「ゲームキャプチャ」
モード「特定のウィンドウをキャプチャ」
ウィンドウ「[Tsugaru_GUI.exe] Fm Towns Emulator - TSUGARU」
で取り込めるのを確認。
最新ソースでPCM音源の一部が聞こえなくなっている問題ですが、「AYA」「オルゴール」なども再生中に音声が途切れるようでした。
2024-01-03 15:10:34
> nabeさん
それは、結構大きな問題ですね。見つけていただいてありがとうございます!IRETD to VM86 modeの場合ですね。一応直して、今テスト走らせてるので通ったらPUSHします。
> 探星亭静闇さん、BCCさん
おおなんと、PCM変になってましたか。最近の変更だとPCMのMuteフラグを見るのを忘れてたのを見るように直したぐらいですが、いつのあたりから変になってるかわかりますかね?
昨日日本から戻ってきたのですが、新潟の友達を尋ねたらその数日後に地震が起こるわ、まさか羽田空港の展望デッキから炎上する日航機を目撃することになるとはまったく思いませんでした。
2024-01-05 01:23:35
>山川機長さん
調べた限りでは2023年10月19日付の"PCM register scheduling."からおかしくなっているようで、
RF5C68::AddWaveForNumSamples内のwhile(nFilled<numSamples && 0<numPlayingCh)文中のwhile(regSchedPtr<regWriteSched.size())を手前外に出してやるとWolfenstein 3D・ALLTYNEXのBGMは正常になりました。ただ、まだオルゴールで音飛びが発生しているようです。
2024-01-05 19:03:27
おおなるほど。スケジューリングの方でしたか。FM音源とかPSG音源だとレジスタ書き込みだけですべてが決まるのでいいのですが、PCMだとPCMメモリへの書き換えも関わってくるのでちょっと気にはなっていたのですが。
はて、なんでレジスタのスケジューリング有効にしたんだったっけ?と、記憶をたどると、たしかALSAが少なくともうちのThinkPadのドライバではリングバッファの再生の解像度が悪すぎてラグを防止するために有効にしたんだったっけ。うーん、しかし確かにPCMメモリへの書き込みまではログ取ってないから、PCMに関してはスケジューリング使わない方がいいのかな。とりあえずPCMのレジスタスケジューリングはオフにしておきますかね。
2024-01-06 02:22:54
PCM音源から外れますが、別スレッドでpinさんが書かれている通りI/O 0xc34がSCSIモードステータスレジスタのようでMS-DOS 6.2のブート時ですと、
・0xc34の上位ビットが0の場合、DMACモードコントロールレジスタのW/Bビットに1が書き込まれVMがAbort
・機種IDをFM TOWNS II CXに設定した場合も、0xc34の上位ビットの内容にかかわらずW/Bビットに1が書き込まれVMがAbort
・W/Bビットに1が書き込まれた場合state.ch[state.SELCH].bytesPerCountを2、0が書き込まれた場合は同1となるようにしたところVMはAbortせず正常起動
となるようでした。
2024-01-06 19:18:32
BCCさん、pinさん、
この件放置しててすみません。確認しました。つまり、16ビット幅だけどバイト単位、とかそういうことが可能なんですね。
津軽のパフォーマンスとしてはバイト・ワードにかかわらず一気に転送してしまうので影響ないのですが、Towns TypeがCXでDOS6が動かないのは気持ち悪いですね。この点修正したソースをPUSHしました。
情報ありがとうございます!
2024-01-11 12:52:58
再質問すみません
先日一度は使えるようになったのですが、「システムが違います」を吐かれて使えなくなってしまいました…。CDとHDDのアイコンが高速で入れ替わっています。
それとimg/CUEでもやはりプリルラの音は出ませんでした…効果音は出ているのですが。
2024-01-16 22:41:38
>探星亭静闇さん
CDとHDDのアイコンが高速で入れ替わっているとのことですが、その状態で右下の「MENU」ボタン(GUI版の場合)→「CD-ROM」→「Select CD Image」で再度CDイメージを再設定しても駄目でしょうか?
プリルラに関しては自分の吸い出したイメージでは問題ないのでよくわかりません。
話は変わりますが、ハイレゾPCMってWindows 3.1も使ってましたね。ちょっと前にそんな書き込みがあったのに忘れていました。
コントロールパネルから「ドライバ」で「FM TOWNS ME/MA/MX用Wave」が組み込んだら正常に鳴り、音質が向上してWindowsの負荷も軽減されることが確認できました。
もう一点、Windows 3.1関連の動作報告なのですが、3.1で32bitプログラムを動かす「Win32s」が動かないようです。
Windows用「シムタウン」をインストール(これのインストーラは何故かFIADD m32intが必要だったので自前で実装)できることまでは確認できたのですが、ゲームそのものを動かそうとするとWindows 3.1がフリーズしてしまいました。
Win32sのサンプルプログラムとして一緒にインストールされるフリーセルも同様にフリーズします。
TwitterでそもそもTOWNS版3.1はWin32sに非対応なのか、と疑問を呟いたら実機では正常に動いていると教えてもらったので、津軽側か自分のWindows 3.1の設定のどちらかが悪いというのは間違いないはずです。
Win32sランタイム単体版のダウンロード先
https://www.vector.co.jp/soft/win31/util/se033480.html
2024-01-17 00:35:18
>探星亭静闇さん
ブート時に「システムが違います」と出るのは、ブートデバイスからIPLが読み込めたもののその後のIPLチェックでNGと判断された場合だったと思います。
ブートメディアのイメージが破損している可能性も有りますので、もう一度イメージを作成してみてはどうでしょう?
実機のFDブートであれば、windowsで開くとIPLが破損するのですが、津軽でのお話だとそれも関係ないと思います。
2024-01-17 09:23:02
> BCCさん、
おおなるほど!Win32sってまだ入手可能だったんですね!おそらくWindows 95が起動できない問題と関係があると思うので、確認してみます!
2024-01-18 02:49:30
とりあえず経過報告ですが、まず最初はINVLPG命令が未実装だったので実装して、次にCMP命令が32-bitオペランドのとき例外をハンドルしてなかったので、ハンドルするように変更し、次に、Page Faultが出るはずのない場所で出てる、と、思ったら、CMP [EBX+14H],EDI なんですが、これはメモリ・レジスタ間の比較で、同系列の命令例えば SUB [EBX+14H],EDI だった場合、引き算して結果をメモリに書き込むという流れだったので、Page Tableが書き込み禁止だったらエラーにするという処理をしていたもんで、本来出るべきではないPage Faultが出てたというところまでわかりました。
いつもながら、Win32sの件を教えていただいたのでなかなか見つかりにくいCPUの実装エラーを発見することができました。ありがとうございます!
まだそれだけ直せば通るのかはわからないので、引き続き調べて経過をお知らせします。
2024-01-19 00:24:23
フリーセル起動に成功しました!全面的に動かなくてももう少し先まで進む鴨しれません。ソースをPUSHしたので、ご確認ください。
Win32sの件、教えていただいてありがとうございました! > BCCさん
このPage Fault問題は結構大きかった気がしますね。あとでWindows 95を再度トライしてみようと思います。「ぷよぷよ通」が動くようになるとでかいんですけどね。
2024-01-19 00:51:35
プロテクテドモードでDS,ES,FS,GSに0000~0003までの値を設定できるように修正して、フリーセルのヘルプも出るようになりました。昨日と今日で隠れてたバグをふたつも取れてしまった。すごい。
2024-01-19 03:52:29
対応ありがとうございます。
Win32sアプリの方はエラー21が出ていて実行確認ができていない(調べるとエミュ環境関わらずWin32s関係で出てくるので自分のWindows 3.1設定がおかしいだけだと思う)のですが、
Windows 95の方は例外エラーで止まることなくインストールが完了できるようになっていました。
ただインストール完了後の再起動で実際にブートする際にまだDMAC ADIRが必要(とりあえず自分で組み込み)で、それが回避した後も
VM Aborted!
Device:486DX
Reason:Clocks-Passed is not set.
Towns TIME (Nano-Seconds): 28724856421
CS:EIP=0028:00000013 LINEAR:00000013 EFLAGS=00003082 CPL=00
EAX=CA702020 EBX=FC002ED2 ECX=00000A01 EDX=C13A2000
ESI=EAFC000A EDI=B3EAFC00 EBP=117EEAFC ESP=C12CEFDC
CS=0028(LIN:00000000) DS=0030(LIN:00000000) ES=0030(LIN:00000000)
FS=0030(LIN:00000000) GS=0030(LIN:00000000) SS=0030(LIN:00000000)
CR0=8000002B CR1=00000000 CR2=20202021 CR3=003D0000
CF0 PF0 AF0 ZF0 SF1 TF0 IF0 DF0 OF0 IOPL03 NT0 RF0 VM0 AC0
Default Operand Size=32 Default Address Size=32 Stack Address Size=32
!EXCEPTION!
SS+00000000:00 00 00 00 00 00 00 00 0C 00 00 FF 00 00 00 00
SS+00000010:00 00 00 00 EA E8 01 00 FC 51 00 00 00 00 00 00
0028:00000013 C17C4DB0FF SAR DWORD PTR [EBP+ECX*2-50H],FFH
と実装されてないCPU命令で引っかかるところがあるようです。
2024-01-19 19:14:50
ご報告ありがとうございます!Windows 95ですが、インストール時に多分機種判別間違いが大発生していたと思われます。うちの環境だとなぜか本来削除されるべきWindows 3.1用ドライバが残ったままで、なぜかFM-R用ドライバが入ったりということが頻発していたのですが、この勢いで一気にWindows 95インストールまでなんとかしようと思って一念発起して調べたところ、Call-Gateの呼び出しではスタック切り替えるとき、パラメータを何バイトかコピーするなんていう機能があったんですね。
CPL=3のプログラムでI/Oの反応を調べるには、CPL=0に権限を上げる必要がありますが、このとき調べたいI/Oをスタックに積んでCall Gateで上位権限のセグメントにジャンプしてましたが、パラメータがコピーされてなかったので適当なI/Oを読んでました。
それを実装したところ、その点に関しては間違えなくなって、ファンファーレが鳴るとこまで進みました。が、ハイレゾ画面にしようとしてしくじってるようなので(これもgithubに報告があった)その原因を究明中です。カスタムインストールで中解像度ディスプレイを選べばできるらしいですが、それもいまいちだし、なによりハードウェアマウスカーソルを使ってくれればとりあえずマウスインテグレーションが動くようになるので。
2024-01-20 05:51:39
ハイレゾにならない件、ひとつはHigh-RES CRTCのレジスタに全部DWORD Writeしていて、それは想定してなかったのがひとつと、これまでの研究では、Low-Res CRTCをDisableしたときはじめてHigh-Res CRTCがEnableされる、と解釈していたのですが、Windows 95のTDISP.DRVはLow-Res CRTCに手を付けないでHigh-Res CRTCのレジスタだけでHigh-Res CRTCを有効にできると思ってるようです。仕様がわからんのが難しいですね。
しかし、-NOHIGHRESオプションをつけてインストール~初回起動するとマウスが使えなくてキーボードで操作しなければなりませんが、初回起動までは最後まで走るようになりました。Win32sから一気に大きく前進したように思います。
が、その後起動しようとすると、KRNL386.EXEをロードするあたりで、File Allocation Tableが破壊されるという問題が起きて、その先に進まないようです。が、どのように壊れるのかはわかったので、問題個所に変なものを書き込んだタイミングでブレークするようにscsi.cppに細工をして原因を究明・修正してやろうと思います。
2024-01-20 11:44:50
うーん。またわからんくなってしまった。FATの破壊が起きるのは、Windowsカーネルが線形→物理アドレス変換しないまま線形アドレスを物理アドレスに書いてしまっているからということまで突き止めたけど、本来どこで変換が起こるべきなのかが特定できない。いくつか考えられるタイミングはあるものの、これは難航しそうですね。これまで、何かが起こるんだけど変な起こり方をしている場合は割と特定しやすいのですが、本来起こるべき何かが起こらなかったというケースは一番苦労しますね。うーん、せっかくインストールイメージまでできたからこれで実機で起動するかやってみようかな。
2024-01-21 02:54:53
追加報告ですが、ADIR問題の原因は、I/OのAAhの読み込みがFFhを返しているのが原因でした。正しい値を返すようにしたらADIR問題は発生しなくなりました。
そして、実はFATの破壊の前にSCSIのINQUIRYが出るものの、タイムアウトしていて変だと思ったら、どうもDMAかSCSIのドライバの初期化が途中で止まっていたようです。いや、いくら問題個所を見ていても原因はわからんわけですね。
それで、止まっていた原因というのが、SCSIがStatus Phaseに入ってからPICにIRRを立てるチェックがあった後にIMSKが1になっていたようで、これだといつまでたってもSCSIの割り込みが発生しないという状況でタイムアウトになっていました。そこで、これを、STATUS Phaseに変わった直後はまだREQ, INTをfalseにしておき、スケジュールで両方trueに切り替える、そして、もしもそのときまだIMSKが0だった場合、IMSKに1を書きこまれて、INTも1だったらIRRを立てる、というように書き替えて無事突破するようになりました!
ということで! -NOHIGHRES オプションをつけるとWindows 95の起動までできるようになりました!あとはハイレゾCRTC問題をなんとかできるといいんですが。
2024-01-21 07:16:22
応急的な方法だと思いますが、HIGHRES_REG_CTRL0にDWord書き込みされる際に1ビット目に1が書き込まれればハイレゾ有効化にしたところマウスが使えるようになったので少しWindows 95を動かしてみました。
Windows 95そのものがどういう仕様だったか記憶が薄らいでて、TOWNS版Win 95も当時触ってないので特有の問題なのかもわかりませんが気づいた点など
・Windowsのアイコン操作
ドラッグしても少しの範囲しか動かせず、別ウィンドウへのドラッグ&ドロップが行えない。
メニューから「コピー」「切り取り」を使用してファイルを移動するのは問題ない。
・HDBENCH Ver 2.61(3.30以降はWININET.DLLが必要)
http://www.hdbench.net/ja/hdbench/download.html
ベンチマーク自体は完走するものの、「システム」のアイコンをクリックした瞬間エラーなどもなく突然VMが終了する。
・WinQuake(要シェアウェア版か製品版のQuakeゲームデータ)
https://ftp.gwdg.de/pub/misc/ftp.idsoftware.com/idstuff/quake/wq100.zip
Githubにも記載しましたが、FLDENV・FIADD m32int・FSUBR STi ST・FDIV STi ST・FDIVR ST STiの5命令追加でデモが完走されることを確認。
ただしキーボードが↓キーしか反応しない。TOWNS版Windows 95が問題?
2024-01-21 20:53:37
おおなるほど。HIGHRES_REG_CTRL0については、その方法でLow Resに戻るとき問題が無ければ使えそうですね。ハイレゾCRTCはTBIOSその他の動作を見ながらいろいろ推測しながら書いたので、実は単純にCTRL0にビット0だけでOn/Offになるものなの鴨しれません。
こちらはとりあえずWin3.1用に書いたTGMOUSEがWindows 95でも使えたのでその方法で今マウスをインテグレートしています。こちらの環境ではドラッグ&ドロップ問題なかったので、ハイレゾCRTCによるマウスインテグレーションの問題か、BCCさんの環境で多分ですがVM上でキーボードの何かのキーが押しっぱなしになっているような気がします。
FPU命令は、これまで追加した分も含めて、果たして正しく実装できているのかテストがしにくいのが難しいですね。386ASMでテストコード書いて実機から結果をサンプルしてこようと思っているのですが、まだやってません。というか、386ASMでFPU命令使ったこと無いんですよね。普通に使えるのだろうか。
その他、コマンドモードに入ろうと思ったらCMPSBがまだExceptionをハンドルしてなくて落ちたりしているので、こちらでもいろいろ直せる部分を直してみます。VMのクラッシュはいかんですね。デバッガで見てみましょうかね。もう一点、100回に1回ぐらいのレベルで、起動中に変なところにジャンプして止まってしまう現象も確認されているのですが、あまりにも頻度が低くてデバッグに苦慮しています。一応、デバッグ用特別バージョンを作って止まるまでログ取りまくりながら再起動を繰り返してみようかと思っているのですが。
2024-01-21 22:58:53
>山川機長さん
もうちょっとテストする必要はあると思いますが、既存のハイレゾCRTC切替方法であるWriteCR0関数を無効化して、IOWriteByte・IOWriteWord・IOWriteDwordでHIGHRES_REG_CTRL0のビット1書き込みでオンオフだけにしたところ
TMENUのハイレゾ表示とアプリの起動/終了、F-BASIC 386 V2.1 L20でのハイレゾ切替、デモンストレーション 93冬、Windows 3.1の起動/終了、Windows 95は問題ないようでした。
もう一つバグを見つけたのですが、Windows 3.1 / 95ともにフルカラーモードに切り替えると色がおかしくなるようです。
https://drive.google.com/file/d/1feUlu0Su-f3f2FAEYe71jLjsyCXB4lga/view?usp=sharing
https://drive.google.com/file/d/1Bm2jtzFxQgDgoRqLp2Lu2_g_D6wQwZDz/view?usp=sharing
見た感じRGB値が入れ替わったような感じですが。
2024-01-21 23:52:02
おおなるほど!テストありがとうございます!
実はハイレゾCRTC切り替えは単に僕が難しく考えすぎていただけという可能性は結構ありますね。とりあえずそのように修正してみます。
フルカラーモードは、ひょっとするとRGBの順を入れ替えるビットがあるのかもしれませんね。まあ、順にひとつずつ対応していきましょう。
2024-01-22 06:32:13
ちなみに、マウスでMS IMEのモード切り替えようとしたらExplorere.exeがクラッシュしますか?パラメータのひとつにNULLポインタ(0000:0000)が渡ってくるのが原因だったのですが、いろいろ駆使してどこからそのNULLポインタが出てくるのかと思ったら、 PUSH DWORD PTR 00H から来ていて、手詰まりになったところです。
2024-01-22 12:28:08
>MS IME
こちらでもクラッシュするようです。変換モードの切り替えだけでなく、タスクバーのIMEペンを右クリックしてプロパティを開いてOKボタンを押してもExplorere.exeが落ちます。
もう一つ、コントロールパネルから「キーボード」を開いて言語タブからMS IME95をダブルクリックするとExplorere.exeではなくRundll32の方が落ちました。
2024-01-22 21:20:03
あとCD-ROM読めませんね。しかし、実機で試したら何もしなくてもSCSI CDを認識するようなので試しに津軽で-SCSICD4使ってみたら未実装のコマンドをいくつか使っているようなので、間もなく対応します。CPUのCMPS, BTRがExceptionをハンドルしてなかったので、それを直してコマンドモード開けるようにしました。Visual C++ 2.0をインストールできればいろいろ試せることが増えるので現在これを目指してます。
2024-01-22 23:39:47
CDが読めないのは実機でも白TOWNS以前のHRでも同様だったようで内蔵CDを無効化してSCSIドライブを使用していたようですね。
http://twinklemagic.la.coocan.jp/towns_kai/twin95/hr.html
白TOWNSからのCDエクストラ対応ドライブ用のドライバなのか津軽では未実装のコマンドFFが実行されるようですね。
あと気づいたのですが、ハイレゾPCMを有効化(コントロールパネル→マルチメディア→デバイスをFM TOWNS Waveデバイス)していると音量の調整が機能していませんでした。
CD-DA同様に電子ボリュームで調整されるようなので実装してみたところ、全体の音量を調整するボリュームコントロールの項目で音量が小さくできました。何故かウェーブの項目が機能していませんが。
Pull requestsに出しておきましたが(誤って二つ一緒になってしまいました)、今の電子ボリュームの調整方法は
電子ボリューム値 / 63
で伝送比率を出してますが、これですとどうもボリューム調整がおかしい(TownsOS標準のCDプレイヤーやWindows 95の音量調整でゲージを半分にした段階で殆ど聞こえなくなる)ので
db = 0.5 * ( (電子ボリューム値) - 63); // db 値計算 (-0.5 ~ -31.5)
tr = std::pow( 10 , db / 20 ); // 伝送比率計算
とするとデータ表に近い正確な音量調整が行えるようです。
https://wiki3.jp/fmtowns/page/124
2024-01-23 00:01:27
おおなるほど!それはまた貴重な情報をありがとうございます!内蔵CDで時間を浪費せずに済みました!ひょっとするとコマンドFFを実装するとMXだと思って読めるようになるかもしれませんね。ただ、実装がいい加減なおかげでCD入れたままでもWindows 95が起動したのはラッキーでした。そうでなかったらまだハマってましたね。
Pull Requestありがとうございます!確認してみます。なお、Windows 95からSCSI CD使えるようにしました。コマンド15Hと1AHの実装が必要でした。1AHはいい加減な値を返していて、15Hはコマンドを受け付けるだけで何もしないのですが、Visual C++ 2.0のCDは読めて、インストールもできて、MFCアプリのコンパイル~実行まで成功しました!
めちゃくちゃ懐かしいです。泣く泣くTOWNS OSからWindows 3.1のゴミみたいな16ビット環境での開発に移行して、約一年間ろくな3D Graphicsプログラムも書けなかった後、ついに32-bitコンパイラが出たというので秋葉原のT-Zoneで輸入盤のVisual C++ 2.0を当時50000円で買って(いや、70000円だったかな? 学生には結構痛かったという記憶は残ってるんだけど)、やっと32-bit環境に戻れたという思い出の(?)コンパイラで、まだCD-ROMを保管していて本当に良かったです。
自分で言うのもなんですが、まだIMEがクラッシュするとはいえ、Visual C++ 2.0が実行できるというのは結構再現性上がってきてますね。引き続き、問題点を解決すべくいろいろやってみます!
2024-01-23 11:59:08
IMEがクラッシュする件ですが、SendMessage(hWnd,0x46,0,0);がMSIME95.IMEの 0137:7FCC8925 で出ているのですが、このLPARAMは本来構造体へのポインタで、ハンドラがそれを参照しようとしてクラッシュしているようです。そして、SendMessageが出るのは正しいということまで実機で確認しました。(MSIME95.IMEにパッチを当てて SendMessage(hWnd,0x46,0,0); を JMP self に書き替えてフリーズすることを確認した) しかし、だとすると、ハンドラにNULLポインタが本当にわたってしまうのか、もしも渡ったとするとなぜ実機ではクラッシュしないのか、ハンドラがIMEを特別扱いしているのか(それは考えにくいけどWindows 3.1ではときどきありえない特別扱いを見たような記憶がある) 特定できません。同じバージョンの日本語WindowsがあったらDOSBOXと挙動を比較してみるんですが、手元にあるのは英語版だけですね。IMEのクラッシュがものすごく気持ち悪いのですが、次の一手が思いつかないですね。
HDBENCHが電源を切ってしまう件ですが、電源オフのI/Oをアクセスして電源を消してしまっているようです。 https://wiki.osdev.org/CPU_Bugs#NULL_selector_load_may_not_clear_MSR_GS_BASE この最後のサンプルコードを見るとDOSでは 0x22, 0x23には何か別の意味があるようで、それをいじってしまっているのではないかと思います。
あと、みつけたのは、COMポート発見してくれないですね。あと実機MXだと津軽で作成したWin95イメージからデバイスの検索をかけるとフロッピーディスクドライバとFM TOWNS WAVEドライバを検出するようなのですが。あ、そうか。WAVEは単に僕が-HIGHRESPCMつけるの忘れてただけだ。
2024-01-25 12:40:39
いやあ、なんとか打開できるもんですね。DefWindowProcA(hWnd,0x46,0,0);を出すと、津軽だとクラッシュ、実機だとクラッシュしないということがわかって、だとするとES=0,BX=0で問題個所に突入するのは間違いなさそうと思ったら、直前に、
176F:00000887 26800F00 OR BYTE PTR ES:[BX],00H ここで出るべきGP(0)が出てない!
というのがあって、これ、ES=0をチェックしてるだろう?と、思ってよく見たらNull Selectorのチェックが入ってませんでした。一応、インラインアセンブラでES=0の場合にESにアクセスして挙動が実機と違うことまで確認して、High-Fidelity ModeでNULL Selectorの読み書きでGP Exceptionを出すようにしたら、無事IMEのモード切り替えもできるようになりました。
次は、果たしてコマンドFFhに対応したらMXだと思って内蔵CDを読むのかやってみましょうかね。FFhで何が返るべきなのか、実機使って調べてみようと思います。
2024-01-26 13:08:25
最新ソースで試したところ、エクスプローラなどを操作していると「例外 0E が 0137:BFF9A228で発生」というメッセージでブルースクリーンが発生する様になりました。念のためWindows 95を再インストールしても同じでした。
2024-01-27 00:10:15
正確にはエクスプローラではなく「マイコンピュータ」の方でブルースクリーンが発生することを確認しましたが、もう少し確認したところSegmentReadExceptionの0 == (seg.value & 0xFFFC)チェックをコメントアウトしてSegmentWriteExceptionの方だけチェックする様にしたところIMEの切り替えは問題なし・マイコンピュータのブルースクリーンは無くなったようです。
2024-01-27 01:09:57
おおなるほど!ドライブのプロパティを開いて閉じると発生しやすいようですね。直前に、
0117:00000C9B 26813E00004E45 CMP WORD PTR ES:[0000H],454EH KRNL386.EXE内
ES=0でここを通過しているようで、ここでExceptionを出すか出さないかで運命が分かれているようです。非常に興味深いのは、Page Fault自体は復帰に成功しているのですが、そのあとしばらくしてブルースクリーンになっているようです。しかも、実際に最後に例外が起こった箇所は、0137:BFFA53D7 E882160000 CALL BFFA6A5E この飛び先のインストラクションフェッチで起きているので、表示されるアドレスも変になってるようです。
当面Null Selector Readを無視することにしてもいいのですが、本来であればExceptionを出すのが正しいので、週末にでももう少し追跡してみます。
2024-01-27 03:45:25
Windows 95から内蔵CD-ROM使えるようにしました!起動時にコマンドFFhが出ていますが、それに対して期待通りに応答するようにして、あとは、TOC READのときSIRQ出し忘れてたのをきちんと出すようにしたら動きましたね。白TOWNS前だとFFhの応答に多分何かあるんでしょうね。
Null Segment Readは意外と難敵ですね。例外出すようにしたらクラッシュしますが、出さないことにして、一応検出したらメッセージを出すようにしたら、そもそも発生しなくなってしまった(メッセージ出ない)。しかし、そもそもまだよく理解してない例外とかたくさんありそうなので、まあ何か発生したら調べて潰してをしばらく繰り返すことになるんでしょうね。
2024-01-27 12:17:12
対応ありがとうございます。
Windows 95標準のCDプレイヤー(スタート→プログラム→アクセサリ→マルチメディア)で音楽トラックのあるCDを再生しようとすると「MODE1READ time out. CDROM Command 7F function unknown. Currently just return no-error status.」のメッセージでWindowsがマウスカーソルすら動かないフリーズ状態になるようです。
2024-01-27 21:09:56
確認しました!これは、コマンド7Fh (03 00 00 00 00 00 00 00)を出して、結果をずっと待ってるようですね。一応タイムアウトがあるので、定期的にカーソルは動くようです。MODE1READのタイムアウトは他にも出ている個所があるので、多分正常だと思います。どうやら、コマンド7Fh (1Fh+SREQ+IRQ)は、第1パラメータによっていろいろ違う情報を返すようで、
0028:C0047C63 C6050A6E04C003 MOV BYTE PTR [C0046E0AH],03H
0028:C0047C6A E88C0A0000 CALL C00486FB ; パラメータ積んでコマンド7Fhを出す。
ここで、1Fh|03hの結果を待つようです。雰囲気として、BCD to BIN 変換をかけているので、時間情報とか、トラック情報とか返すものと思われます。
03h以外の他のパラメータだったら何を期待してるのか?という心配があったのですが、津軽の誇る(?)FINDCALLERコマンドによると、 C00486FBを呼んでるのはこの一か所だけのようです。わざわざコマンド7Fhを出すPROCを作ってるんだから、他には使ってないだろうと期待して、実機MXでテストしてみます。
2024-01-28 00:51:04
実機サンプルを元に、CDC CMD 1F|3 0 0 0 0 0 0 0 対応したところ、Windows 95のCDプレイヤー動くようになりました!ソースPUSHしたのでご確認ください。
ご報告ありがとうございました!
2024-01-28 02:02:45
CDプレーヤーの実行、ゲーム「セガラリー」の実行(TOWNS非対応のDirectX3がインストールされるので対策が必要)とCD-DA再生が問題ないことは確認できました。
またバグと思われるものが出てきたのですが、容量の大きいサイズ(おそらく32MB以上)の単一ファイルをCDからHDDにコピーするとブルースクリーンが発生しました。
https://drive.google.com/file/d/1Z_eETjQ5BgyoxzggWHkY9vK1abEgEIx3/view?usp=sharing
何度試しても同じところで落ちるので津軽かTOWNS版Windows 95のどちらかが問題なのは間違いないとは思います。
2024-01-28 03:58:22
おおなるほど!FATって32MB超えるファイルって扱えたんでしたっけ?あとで実機で確認してみます。
CPUのNull-Segment Read問題ですが、まだ使われるセグメントセレクタがあるのに、使い終わるより早くセレクタを無効化してしまってクラッシュしているようです。クラッシュする場合としない場合何が違うんだろうと思ったら、実行順の問題だったようです。最初、セレクタを使うのが間違いなのか、セレクタを無効化するのが間違いなのか特定しようとしていたのですが、実はクラッシュしない場合でも両方起きていることがわかって、運が良ければいい順に処理が進むということがわかりました。
ひょっとするとわざわざマルチスレッドを使っていて本当はロックできてるはずの何かがロックできてないとか、あるいはメッセージの処理で本来発生しないはずのリエントランスが起きてしまってるとか、そういう感じな気がします。Windows95はタスク切り替えはソフトウェアでやってるはずなので、タスク関係のフラグが影響しているとは思えないのですが。何か思い当たるCPUの機能とかあります?
2024-01-28 12:36:25
CPU問題は、Null-Selector Readをたまたま何か別の問題が打ち消しているのが気持ち悪いのでなんとかしたいと思って相当調べたのですが、謎ですね。原因はわかって、Explorerはドライブのプロパティを開くと別スレッドを開始するようなのですが、そのスレッドの中でひとつのセレクタをAllocateするようです。ところが、ウィンドウを閉じるとき、ウィンドウスレッドはいろいろ処理してExitThread関数を呼び出して、その中で問題のセレクタを削除するのですが、別のスレッドがそのセレクタにアクセスしようとして例外発生。さらに例外ハンドラの中でなぜかそのセレクタのリミットを別のセレクタとしてアクセスしようとして(それ自体は正しいらしい)さらに例外発生。その例外処理の中でさらにセグメント無し例外が発生して三段階の例外になってブルースクリーンになっているようです。細工して例外処理中に例外が出ないようにしたら、通過せず「例外が発生しました」ダイアログが出たので、やはり本来最初の例外が出るべきではないのだと思います。
クラッシュしないときは、プロパティシートを閉じてから、ExitThreadに達する前に別スレッドの処理が終わっている場合で、これはたまたまどっちが先に終わるかによってブルースクリーンになるかならないかが決まるようです。このセレクタはふたつのスレッドで共有されているようなので、本来であればなんらかのロックがかかるべきなのですが、ロックしてそうな形跡もまだ見つからないですね。
まあ、動いてはいるわけなので、とりあえず困ってはいないのですが、しばらく迷宮入りしそうな感じです。Windows 95 System Programming SecretsとWindows 95 Unauthorizedの二冊を発注したので、届いたら中でスレッド関係をどうやって処理しているのか勉強してみます。
2024-02-02 22:04:16
多分原因解明しました!セグメントレジスタに値をロードするときは、まずタイプやアクセス権限チェックをしてGenral Protection Faultにならなかったら次にP-flagを見て0だったらNo Descriptor Exceptionを出すんですね。参考にしてた 80386 Programmer's Reference Manual 1986と i486 Programmer's Reference Manual 1990にはPsuedo Codeが出てなくて、例外を出す優先順位がよくわからなかったんですよね。1992年版を見たら明示的に書いてあってわかりました。
修正前は最初にP-flagを見てたので、本来GPが出るべきところでNDを出してました。これを変更してどうやら動いているっぽいです。一応、Windows 3.1の起動とかTEST386とか流して問題なかったので、これによって壊れたものは無さそうです。あとでWindows 3.1とWindows 95のインストールを再度チェックしますが。ソースPUSHしました!
本来読み込み時もNull Selectorはチェックするべきだったので、これをチェックしないことでたまたま動いているというのは、エラーを別のエラーが打ち消しているのは間違いなくて、歯に野菜のきれっぱしが挟まったような感じがして、この一週間さんざん逆アセンブルを読んできたのですが、当初、共有リソースをロックせずにアクセスするなんて馬鹿なことをしているはずがない、という前提で調べていたものの、どうもロックしてる形跡も無く、この例外が出るのは仕方ないらしいという結論になって、MOV命令を見直したらわかりました。
2024-02-06 11:02:12
お疲れ様です。
ついにWin95が起動しましたね。おめでとうございます!
凄いです!
マウスでのドラッグが短距離しかできない現象は自分も起きてるのですが、何か追加設定が必要でしょうか。
今はWindows版を-HIGHFIDELITYオプションを追加して起動していて、2台ほど試しましたが同じでした。
キーは何も押していません。
もう一つ、キーボードがTRANS2だとShift+文字が大文字にならず、アンダーバーを打つと2回押されるようです。
こちらはdirectで回避していますが、コマンドを打つとき結構辛いっす(^^;
まだインストールして共有フォルダを試したくらいですが、ご報告まで。
2024-02-07 23:04:04
試していただいてありがとうございます!うーん、マウス問題は、まだ直ってませんでしたか。うちで発生しないもので何がおきているのか。多分津軽は何もキーコードを送ってないのにWindowsがESCが押されたとか思い込んでるんじゃないかと思うんですよね。TRANSモード問題はこちらでも発生しているのですが、プログラムによって起きたり起きなかったりするようです。うちだとDOS窓では起きないようなのですが。
安定してうごいていたかに見えたWindows95ですが、今朝あらぬ場所にジャンプしてクラッシュが起きたので、まだ何か残ってますね。あと、しばらくほっておくと勝手に電源が切れてVMが終了する現象が起きているのですが、これはVisual C++と一緒に入ったドライバが何かしてるのか。
現在重点的に追ってるのはぷよぷよ通が、起動中midiStreamOpen→midiStreamClose→midiStreamOpenすると二度目でオープンできなくて先に進まない現象が起きていて、Visual C++で、GetProcAddressなど駆使してOpen->Close->OpenやってみたらWinMMの同じ関数に入ってくるのですが、普通に二度目のOpenもできてしまうので、ぷよ通だと何が二度目失敗させてるのか調査中です。ぷよぷよ通は実機で動作実績があるらしいのでなんとしても津軽で動かしたいと思ってます。
2024-02-08 00:51:58
ハイレゾCRTC経由のマウスインテグレーションだけだとドラッグ操作がおかしいようで、TGMOUSEを起動すると問題ないことは確認できました。
2024-02-08 02:15:16
おおなるほど!そういうことだったんですね。デフォルトではマウス位置をCRTC2の値から読み取るのですが、きっとまだ未解明の何かがあるんですね。
なお、ぷよぷよ通は、ハイレゾPCMを有効にして(実装しといてよかった)、WAVEの再生をハイレゾPCM (TOWNS WAVEドライバ)に設定することで起動できました。遅いですけど。ぷよぷよ通はDirect X2なので、FM TOWNS改造白書の方法を使わなくても少なくとも津軽上ではWindowsが起動できないなどの問題はなさそうです。
2024-02-08 09:55:55
Xeviousしか起動してませんが、Namco History Vol.1の動作も確認できました。これ、多分実機でも動きますね。MODE2のディスク読ませる必要があるので、SCSI CDドライブから読ませる必要があるかもしれませんが。内蔵CDにもMODE2READコマンドあるけど、きちんとドライバが実装してあるかな?
まったく今更なんですが、電波新聞社の「全16面あるTiny Xevious」とも揶揄されるあのめちゃくちゃなロークオリティポートがトラウマになっていた旧FM-7ユーザとしては、TOWNS上でXeviousが動くのを見るのはもうひとつ失われた過去を取り戻したような感覚になりました。
しかし、Windows 95の動作遅いですね。多分、30MHz相当ぐらいの感じなのではないかと思いますが。こりゃリング0とリング3の行き来をもう少し最適化考えないとだめだけど、でもWindowsサポートは津軽的にはおまけだから、まあ、気が向いたらやります!
2024-02-08 11:23:19
ドラッグが途切れる件、"TOWNSEMU/winapp/TGMOUSE/TGMOUSE.EXE"をWindowsで起動して解決しました。
タスクバーに常駐させなければいけないようなので必要に応じて起動してもいいかも知れないですね。
情報ありがとうございます!
津軽はESCキーを押していないのに押したと思ってしまうのですね。
コンソール側の出力で何か分かるのかも知れませんが残念ながら自分には分かりませんでした(^^;
キーボードの件は日本語キーボードの場合、Directモードでコロンが"^"キーで打てることが分かったので、
使う上では問題ないです。以前は英語キーボードの位置にあると思い込んでいました。
TRANS2は勿体ないですが仕方ないですね。
自分にソースに触れるくらいの技量があれば良いのですが、無いものは仕方ないのでdirectで使います。
最近すっかりROM落ちしてますが、分からないながらも読んでいます。
陰ながら応援していおります。
2024-02-08 13:45:26
なお、先程linux版で津軽のWin95に、tgdrv.comで繋がったDebianの共有フォルダからTGMouse.exeを送り込んで動かすことができましたのでご報告します。
ゼビウスも津軽なら動くんですね。おまけの威力凄いです。
2024-02-09 00:07:30
マウスドラッグ問題、こちらでも確認しました。ドラッグが途中でキャンセルになるのではなく、カーソルがふっとんでしまう問題ですね。実は同じ問題はWindows 3.1から存在していて、TOWNSのハードウェアマウスカーソルは、白黒のカーソルしか対応していないため、カラーのカーソルになった途端にソフトウェアカーソルになってしまい、システムがハードウェアマウスカーソルの位置を更新しなくなるもので、その影響です。なので、TGMOUSEをご利用ください。ごくまれ(100回に1回未満)MS-DOSプロンプトがクラッシュする問題を確認していますが、それ以外結構安定して動いてますね。
2024-02-09 14:15:57
なんと、あれは吹っ飛んでいたのですか。
右ドラッグ中にアイコンが動かなくなった後でも、マウスボタンをリリースするまではメニューは出ないので、離していないのにアイコンが動かないのが釈然としなかったのですが、それなら納得です。
TGMOUSEはマウスでの操作を安定させるのに必須ですね。
2024-02-10 17:35:06
ドラッグ中、こちらではアイコンが止まってからなんとか動かそうとするとふっとんでから白いアイコンになって戻ってくるような感じだったのですが、D-TypeさんとBCCさんの環境だと止まるだけでしたか?でも、これはTGMOUSEで解決ということで。TGMOUSE、Windows 95専用でタスクバーに入れるバージョンも作ろうかと思ったのですが、Windowをminimizeするとなぜかマウス位置を取ってこれなくなるっぽいので、とりあえず現状のまま、ただ画面右上に移動してマイ・コンピュータとか隠さないようにしようと思ってます。
なお、DOS窓が30~40回に一度クラッシュする問題が発生していましたが、SS:ESPの指す場所のポインタをキャッシュしてたんですが、たまたまページテーブルを削除された線形アドレスがこのキャッシュの領域にヒットしてしまうとPush16/Push32関数がPage Faultにもかかわらず値を書きこんでしまっていた、ということが判明してので直しました。これでDOS窓もクラッシュしなくなったと思います。(誰も気にしてなかったかも)。でも僕はVisual C++ 2.0をコマンドモードから使う人なので結構困ってたんですよね。
二週連続しんどいデバッグでした。副産物でメモリにステートセーブ機能を追加しましたが、今のところCUIモードからのみ対応になってます。これ、その気になれば1秒ごとに過去一分の記録を取りながらゲームをプレイとかいうこともできますね。そういう機能を実装したら、当時どうしてもクリアできなかったゲームをこれでエンディングを見るとかできるかも。ああ、これいいかもしれないなあ。陸奥にも実装しよう。
2024-02-11 11:25:03
カーソルの件は自分の環境だと止まるのですが、さっき一度だけアイコンと一緒に左端に吹っ飛んで止まりました。
TGMOUSEのご解説有難うございます。出しておいたほうが良いということなので、開いておきます。
デバッグお疲れ様です。
2024-02-11 23:24:53
その後 -USEFPU でも -DONTUSEFPU でも Namco History Vol.2 がインストールできて、ドルアーガの党が起動できるようになったので、津軽に追加のテストをセットアップしようとしていたのですが、、、、
誰か、Visual C++ V1.5 (V2.0におまけでついてくる)のランタイムライブラリのtanの計算にバグがあるとかいう話聞いたことあります? -DONTUSEFPUとした状態で、どうも、第二象限、第三象限のtanの値を一度でも計算してしまうとその後tanが返す値の符号がすべて裏返ってしまうという現象に直面していて、FPUエミュレーションの結果が間違ってるけど、さすがにいまさら整数演算に間違いもないだろう、と、思って昨日から果たしてこれが津軽の問題か、Visual C++の問題か調べているのですが、どうも、一度でも第二、第3象限のtanを計算してしまうと、あるフラグを立てたまま二度とクリアしなくなって以後符号が反転してしまうようである、というところまでわかったのですが、フラグをクリアしないのは津軽が何かしくじっているからなのか、そもそもVisual C++ 1.5のランタイムライブラリが間違ってるのかまではわかってません。
面白いことに、Windows 3.1にはシステムが持ってるFPUエミュレーションコードがあって、あるバイトをいじるとシステムのエミュレーションを使うようになって、そうすると正しい答えが返ってくるようです。実機MXだったらWindows 3.1起動できるようになってますが、FPU入ってしまっているし。
そもそもVisual C++ 2.0のおまけのV1.5はIDEもいい加減、V1.0からアップグレードするメリットがほぼなく、誰も使ってなかったんじゃないかという疑いを持ってるので、実はバグってたけど誰も真剣に使ってなかったから誰も何も言わなかったという可能性を結構疑ってるのですが。
2024-02-16 00:27:05
解決しました。お騒がせしました。
https://www.betaarchive.com/wiki/index.php?title=Microsoft_KB_Archive/111067
2024-02-16 01:49:02
初めまして、ポチと申します。
現在、MacBookPro(2022 M2Pro、macOS14.3.1)にて「20231124」バージョンの津軽を使用して、エミュレータで構築した環境を実機と共有しながら遊んでします。
TGDRVでmacOSとのやりとりができ、便利に使わせてもらっています。ありがとうございます。
ただ現時点で、キーボードから「¥」、SHIFT押しながらの英字以外のキー入力が受け付けない事象が発生しています。
(109キーボードを接続してみましたが、入力できませんでした)
こちらの環境の問題かもしれませんが、対処等ご存じの方いますでしょうか。
2024-02-18 10:59:47
はじめまして。macOSのキーボードについてご報告ありがとうございます!
。。。ああ、本当だ!たしかにキーマッピング入ってない!今ある程度直してソースコードPUSHしました。ただ、日本語・英語キーボードの差などによってどうしても一部変になるので、コマンドをタイプするときなどは、キーボードのTranslationモードを使っていただくと大体なんとかなると思いますので、Translationモードもお試しください。
2024-02-21 00:52:34
コメントありがとうございます。自分のMacBookProは日本語キーボードを使用しています。
最新のソースからビルドした資産と、20240223版を使用してみましたが、状況は変わりませんでした。
ただ、前回気づかなかったのですが、SHIFT+7で*の入力は出来ていたようです。
あとすみません、「キーボードのTranslationモード」とはどうすればよろしいのでしょうか。
調べてみたのですがよくわからずで。。。
2024-02-25 08:28:01
うーん、直りませんでしたか。うちはいまだに2014 mac miniなのでIntel Macですが、その差異は無さそうな気がしますね。我が妻がM1 mac使ってるので今度借りて試してみます。
キーボードのTranslation Modeは、コマンドであれば KEYBOARD TRANS で、GUIであれば、FM TOWNS -> Keyboard Modeから選ぶことができます。
2024-02-28 00:37:04
Keyboard Modeの情報ありがとうございます。
GUI版のみですが確認してみましたので、結果を共有します。
①DEFAULT
・変わらずでした。
②DIRECT
・変わらずでした。
③TRANS1〜3
・SHIFT押しながらの記号入力はできました。
・SHIFT押しながら”Z"を入力しても"Z"ではなく"z"として入力されます。
SHIFT押さない時は"z"で入力されます。
なお、その他英字は全て大文字で入力できます。
・¥の入力ができない。
2024-02-28 07:40:43
FM TOWNS版Windows 95に標準(ない場合はオプションインストール)で入っている「システムモニター」(アクセサリ→システムツール)がFISUBR(m32int)を使用しているようです。
それと互換モード時にスプライト描画速度を初代機相当(スプライト秒間約227枚、一枚につき約73us)に落とす機能を追加する予定はありますか。
Twitterで津軽だとアフターバーナーの動作速度が速いという話が出たのと、自分もターボアウトランやギャラクシーフォースを動かしたときに動きが早すぎるのが気になっていたので。
現在だとMXからの実測で57us(約280枚)になってますが、多分実機でも互換モードに設定するとスプライト描画速度が初代機相当に落ちるのかと思います。
2024-03-05 21:53:17
FISUBR(m32int)了解しました!
スプライトの件ですがその機能を追加する予定はなかったですが、やりましょう!
ところで、Windows 95でキーを読み取れないことがある問題は解決したんでしたっけ?
2024-03-06 07:41:47
スプライト対応してみました。PUSHしたソースでどんな感じですかね?
2024-03-06 07:59:41
互換モードに切り替える起動FDDを作って試したところ、動作速度が初代機に近くなったようです。ありがとうございます。
2024-03-08 01:35:23
Keyboard ModeがTRANS1〜3で"¥"が入力できなかった件ですが、optionキー+"¥"キーで入力できました!
2024-03-14 10:41:15
殆どエミュレータとFM TOWNSに触れたことが無い超初心者ですが
皆様、よろしくお願いいたします
津軽を動かして遊んでみようと、頑張ってみましたが
上手くいかずお知恵をお貸しくださると嬉しいです
現象は津軽のGUI画面は表示されるが
初期設定等を済ませ、ゲームCDを設定し
STARTボタンをクリックすると
一瞬だけ黒い画面が表示され、それ以降何も起こりません。
タスクマネージャーを見ても津軽は起動していない様で強制終了しているのでしょうか。
CPU SPEEDを4~60位に変更・RAMを4~16MB位に色々と変更しながら試しましたが
結果は変わらずで何が原因かがわかりかねています
津軽のVerは最新の物から6世代位前のVerを使用しました
使用BIOSはうんづで利用していて、うんづは正常に動作しているので
多分、津軽でもいけるかなと思っていましたが上手くいきません
うんづで使用しているBIOS
・fmt_dic.rom
・fmt_dos.rom
・fmt_f20.rom
・fmt_fnt.rom
・fmt_sys.rom
互換BIOSも試しましたが、同じ結果です。
互換BIOSをうんづで使うと面白いものが見れるので壊れてはいないと思います。
当方の環境
・Windows11 Pro
・CPU Corei7-9700K(OC無し)
・メモリ 32GB
・グラボ RTX3070
・1TB M.2SSD*2
・8TB HDD*1
もう少し細かく現象を書きます
1. WINDY様の書き込み2番の説明に従って
[使用方法] *ダウンロードから初期設定
(1)~(4)と(8)を実行
2.[使用方法] *運用
(1)を設定し
(2)を実行すると
一瞬だけ黒い画面が出てそのまま津軽が起動しない状態
補足
・津軽の展開場所は1TBのm.2SSDでTugaruフォルダを作成しそこに解凍してできた5つのファイルを展開
・command.md
・readme.md
・Tsugaru_CUI.exe
・Tsugaru_GUI.exe
・TsugaruUtil.D77(このファイルは古いVerは無い?)
・BIOSの指定はTugaruフォルダ内にBIOSフォルダを作成し、そこを選択
・CDの指定はTugaruフォルダ内にCDフォルダを作成し、そこを選択
・Windows Defenderに邪魔される可能性がある為、Tugaruフォルダを丸ごと除外に設定
・Tsugaru_CUI.exeをクリックすると"WindowsによってPCが保護されました"と青画面の警告がでるので
詳細設定をクリックして実行をクリックすると、津軽のGUI画面が表示されます
・ドキュメントフォルダにできる設定ファイル?は削除したり、しなかったりです
起動を試したゲーム
※うんづでは全て起動し途中・最後までプレイしましたが
津軽では全て黒い画面が一瞬だけ表示され起動できませんでした
・Ultima IV - Quest of the Avatar
・Xak2
・ロードス島戦記 灰色の魔女
・ドラゴンスレイヤー 英雄伝説1
WINDY様の説明に従ってやっているはずですが
互換BIOSで津軽が動かない事はないと思うのですが
一瞬だけ黒い画面が表示されるので何かが間違っているのでしょうか?
2024-03-17 17:09:00
津軽をダウンロードいただきありがとうございます!おそらく黒い画面というのはターミナルですね。ダイアログ右下の方に、「Separate Process」というオプションがあるのですが、そのチェックをはずしてみていただけますか? そうすると、ターミナル画面は消えなくなるので、「START」をクリックした直後ターミナル画面になにかエラーメッセージが表示されていないか確認していただけるでしょうか?
既にこれまでのWINDYさんの書き込みは参考にされたとのことなので、確認済みかもしれないですが、よくあるのは津軽またはROMを置いてあるディレクトリに全角文字が混じっているパターンです。これ、システムのエンコーディングがUTF-8だと日本語が混じっても大丈夫なのですが、Shift-JISだと起動しないと思います。("."を指定したら自身のディレクトリを見に行くように変更しようと思ったまま放置中)
2024-03-18 01:14:17
山川機長様
回答ありがとうございます
>「Separate Process」というオプション
「Separate Process」に関しては、最初からチェックはついていませんでした
チェックをつけてもつけなくても、津軽を起動すると一瞬だけ黒い画面が表示され津軽は起動しません
ディレクトリに関しては、全角文字(2バイト1文字)は使っておりません
以下の様な形でディレクトリを構成しています
dir_Tugaru
│
├─dir_BIOS
│
│
└─dir_CD
・"dir_Tugaru"の直下に津軽の実行ファイル等を配置
・"dir_BIOS"にうんづで使用したオリジナルのBIOSもしくは互換BIOSを配置
・"dir_CD"にGAMEのBIN等を配置
山川機長様の仰る
>Shift-JISだと起動しないと思います。
が混じっているかもと思い、一度作成したディレクトリを削除し
再度上記の図と同じ形のディレクトリを構築し
WINDY様の説明に従って設定し、津軽を起動させても
黒い画面が一瞬だけ表示される状態でした
が、うんづと同様にBIOSを津軽の実行ファイルと同じ場所に配置し
BIOSの指定場所を"dir_Tugaru"に指定し津軽を実行しました所、無事に起動できました
互換BIOSも津軽の実行ファイルと同じ場所に配置することで起動しました
尚、"dir_BIOS"にBIOSを配置し指定した後、津軽を起動すると
黒い画面が一瞬だけ表示される状態になります。
Gameの名前に関しては起動イメージ・ディスク等に全角が入っていても
今の所、問題は無いように思います。
こちらの環境の問題かもしれませんが
ともかく津軽が起動したのでよかったです。
Gameもうんづと違って仮想ドライブを使用しなくても良いので大変便利で
HDD等の設定等もやって使い倒していきたいと思います。
Gameは最初方だけ少しやってみて特に問題はなさそうですが
・Ultima IV - Quest of the Avatar
だけは、最初のキャラクターメイキングのジプシーの選択を終えた状態で
津軽が固まって動作しない
BGMだけ鳴っていてキーボードの操作を受け付けない状態
が稀に発生します
・最初からキャラクターディスクを入れていない
・キャラクターディスクがフォーマットされていない
もしくはキャラクターディスクがフォーマットしてある
・途中からキャラクターディスクを入れる
・キャラクターディスクが入っていないとメッセージが表示された状態で
キャラクターディスクを入れる
と上記の様な状態になる可能性がありますが
再現性が低く、確実に再現できるわけではないので
こちらも環境の問題かもしれません
この様な素晴らしいエミュレータを無償で使わせて頂きありがとうございます。
ソースコードも読み込んでみたいと思っています
この度は、ありがとうございました
2024-03-18 15:24:42
>もってさん
>山川機長さん
無事解決したようで安心しています。
ドキュメントに関しては初期Tsugaru時に判る範囲で書いたものですので、今となってはOSもTsugaruもバージョンが上がっていますので食い違う所が有りそうです。
また、上手く行かない場合の対処方法についてもまとまった資料が存在しない状態では有ると思います。
これらの事柄についてMacやLinuxの場合も含めた資料を作成することがTOWNSやTsugaruに興味を持たれる片にとっても有意義な事に間違いは無いと思いますので取り組む時間が取れれば作成したいと思います。
(ただ、Linuxは環境を整えればどうにかなりますがMacは私の方では知識面においても環境面においても手が出ませんので皆さんのご協力をお願いするかもしれません)
2024-03-21 10:15:26
ハードウェア解析・考察スレッドの方にも書きましたが、最新版のソースで、Linux for TOWNSの出回ってるCD、Linux + JE4でCDからの起動とX-Window, fvwmの起動までできるようになりました。-HIGHFIDELITY必須です。
なお、それに伴って、シングルページのハイレゾモードのVRAMのアクセス方法を正しく修正した影響で、同モードを使用した状態のステートファイルを読み込むと画面が崩れてしまうと思いますが、すみませんが、その場合、前のバージョンで起動してなんらかの方法でセーブが必要なものをセーブしてから新しいバージョンで起動してステートファイルを作り直してください。
2024-03-24 02:51:32
まだ不完全、確認しているのはジェノサイドスクエアのみではありますが津軽でRS-MIDIではなく内蔵MIDIが鳴らせることができました。
Windows10標準MIDI(Microsoft GS Wavetable Synth)でのジェノサイドスクエア 動画(割り込みを使用してないようでFREQ 5にしてないと音楽の速度が正常に鳴らない)
https://www.youtube.com/watch?v=6YYuAZo4vvM
TOWNSは4枚までのMIDIカード、各カード出力2ポートと入力1ポートということですが、どうせ鳴らせるだけなら1カード目の出力1ポートだけを使用し、入力されたMIDIメッセージ1~3バイトをWindowsのMIDIメッセージ出力関数(midiOutShortMsg)に直接送れば鳴ってくれるんじゃないかと思ってやってみたら問題ないようです。
コマンドレジスタ(0x0E51)I/Oをリードした際に返す値がよくわからないので0x4(ジェノサイドスクエアはこれにしないと進行しない)、割り込みが発生した際のテストをしていない、LinuxやMacでの実装方法がわからないなど問題はありますが。
Linuxのソースから推測されるポート番号(MIDI カード1番目)
0x0E50 出力1ポート目 データレジスタ
0x0E51 出力1ポート目 コマンドレジスタ
0x0E50 入力ポート目 FIFOデータレジスタ
0x0E51 入力ポート目 FIFOコマンドレジスタ(ビットを立てることででFIFOの有効化?)
0x0E50 出力2ポート目 データレジスタ
0x0E51 出力2ポート目 コマンドレジスタ
0X0E70 MIDI出力割り込みマスク(カード4枚×各2ポートの計8出力がそれぞれのビットに割り当てられる)
0X0E71 MIDI入力割り込みマスク(カード4枚×各1ポートの計4入力が下位4ビットに割り当てられる)
ソース例
void TownsMIDI::IOWriteByte(unsigned int ioport,unsigned int data)
{
case TOWNSIO_MIDI_CARD1_DATREG1: // 0x0E50, MIDI card(MT-402 or 403) No.1 Out port 1 datReg1 (from Linux source)
if (state.data_byte == false)
{
int data_check;
data_check = data & 0xf0;
state.MIDI_data_bytes = 0;
state.MIDI_states = data & 0xff;
state.MIDI_data[0] = 0;
state.MIDI_data[1] = 0;
state.data_byte = true;
if (data_check == 0xf0)
{
switch (data)
{
case 0xf0:
case 0xf1:
case 0xf3:
state.MIDI_data_length = 1;
break;
case 0xf2:
state.MIDI_data_length = 2;
break;
default:
state.MIDI_data_length = 0;
//outside_world->MIDIMessage(MIDI_states, 0, 0);
midiOutShortMsg(hMidiOut, MIDIMSG(data, 0x0, 0, 0));
state.data_byte = false;
break;
}
}
else
{
if (data_check == 0xc0 || data_check == 0xd0)
{
state.MIDI_data_length = 1;
}
else
{
state.MIDI_data_length = 2;
}
}
}
else
{
state.MIDI_data[state.MIDI_data_bytes++] = data;
if (state.MIDI_data_bytes == state.MIDI_data_length)
{
#define MIDIMSG(status,channel,data1,data2) ( (DWORD)((status<<4) | channel | (data1<<8) | (data2<<16)) )
midiOutShortMsg(hMidiOut, MIDIMSG((state.MIDI_states >> 4), (state.MIDI_states & 0xf), state.MIDI_data[0], state.MIDI_data[1]));
state.data_byte = false;
}
}
if (state.int_mask_send & 0x1)
{
townsPtr->pic.SetInterruptRequestBit(TOWNSIRQ_MIDI, true); // TOWNSIRQ_MIDI = 4
}
break;
case TOWNSIO_MIDI_MIDI_INT_MASK_SEND: // 0x0E70 //MIDI SEND interrupt MASK
state.int_mask_send = data & 0xff;
break;
case TOWNSIO_MIDI_MIDI_INT_MASK_RECEIVE:// 0x0E71 //MIDI RECEIVE interrupt MASK
state.int_mask_receive = data & 0xff;
break;
}
unsigned int TownsMIDI::IOReadByte(unsigned int ioport)
{
case TOWNSIO_MIDI_CARD1_CMDREG1: // 0x0E51, MIDI card(MT-402 or 403) No.1 cmdReg1 (Linux source)
return 4;
break;
case TOWNSIO_MIDI_MIDI_INT_MASK_SEND: // 0x0E70
return state.int_mask_send;
break;
case TOWNSIO_MIDI_MIDI_INT_MASK_RECEIVE: // 0x0E71
return state.int_mask_receive;
break;
}
2024-04-04 18:04:38
(あれ? 今朝コメントしたつもりが書き込めてなかった。)
Win32にそんな機能があったとは!さすがです!既に動いているコードがあるのであれば、Pull Request出していただければ Outside_World への整形などこちらでやりますが、いかがでしょうか?
2024-04-05 06:40:57
その後、TownsOSのEUPプレーヤーのMIDI再生や、Windows 95で内蔵MIDIカードが認識したのでMIDI再生したところ、割り込みの実装が間違ってるのかマウスカーソルだけしか動かないでフリーズしてしまいました。
これらが再生できるようになってからPull Requestを出すと思いますが、一度作り直しで暇な時にやると思うのでちょっと時間がかかるかもしれません。どうせ一新になりますし、実装できそうであれば山川機長さんの方でお試しください。
一応わかっていることは
MIDIカードのFMT-402の写真を確認するとMB89371Aというシリアル通信用LSIが載ってて、i8251相当のデータ/コントロールレジスタが2ch分用意されている。これが出力用シリアル?
MB89371Aデータシート
http://act-ele.c.ooco.jp/jisaku/rsmoni/MB89371A.pdf
midiOutShortMsgのサンプル
http://www13.plala.or.jp/kymats/study/MULTIMEDIA/midiOutShortMsg.html
MIDIメッセージ一覧
https://www.g200kg.com/jp/docs/tech/midi.html
2024-04-05 20:46:54
おおなるほど。了解しました。こちらでも検討してみます。なおMIDIの割り込みがどういう感じでかかってくるか何か資料はありますか? 上げていただいたコードだと、ioWriteByteの中でIRRを立てていますが、この間のIRRとISRの件でも上がってましたが、TOWNSのPICはレベルトリガなので、どれかのI/OアクセスでIRRをfalseにしないとMIDI割り込みがかかりっぱなしになると思います。多分割り込み要因のI/Oをリードしたタイミングでオフになるような仕組みになってると思うのですが。
2024-04-05 21:22:43
Linuxにソースがあるとのことだったので、こちらも1.1.30のソースを見てみました。多分なのですが、IRRクリアのタイミングはMIDIデータレジスタに書き込みがあったタイミングなのではないかと思うので、データレジスタに書き込みがあったら、
townsPtr->pic.SetInterruptRequestBit(TOWNSIRQ_MIDI, false); // TOWNSIRQ_MIDI = 4
としてやることで書き込み割り込みが連続でかかってしまうのを防止できるのではないかと思います。津軽はIRRをオフにしないとIRETしたら次のインストラクションを実行する前にすぐ割り込みがかかってしまうので、何も動かなくなります。マウスはタイマー割り込みで動いてるとするとINT 0なのでMIDIより優先順位が高いので動いているかもしれません。
2024-04-05 23:04:40
上のコードはとりあえずMIDIメッセージだけホストに送信できればよしとしたテストですので、割り込みについては正直よくわからない感じです。
Linuxのtsound/midi.cには
OUTB(0x0E70,0x00); /* MIDI送信割り込み マスク */
OUTB(0x0E71,0x00); /* MIDI受信割り込み マスク */
/* 0xE70,1: aaaa|iiii|oooo|oooo
o:Output interrupt(A-H) (R)0:occur (W)1:enable
i:|Input interupt(A-D) (R)0:occur (W)1:enable
a:Foot pedal(A-D) (R)0:occur (W)1:enable */
という記載しかないです。
MB89371Aの割り込みマスクビットから該当しそうなのはTXRDYか、EUPプレーヤーでのI/O操作を見ると0x0E70に1を書き込んだ後I/Oを見に行かないで動きが停止するのでTRNEMPだとは思うのですが。
2024-04-05 23:07:10
そうですね。Linuxの割り込みハンドラの中では、データの書き込みと割り込みDisableもしてるようなのでひょっとすると割り込みEnableビットと内部のTxRDYのANDがIRRビットに出てるかもしれないですね。僕も実験してみます。
2024-04-05 23:31:28
ああ、Linuxのmidi.cの、初期化部分、
OUTB(cmdReg,0x00); /* 初期化 */
snd_io_wait();
OUTB(cmdReg,0x00);
snd_io_wait();
OUTB(cmdReg,0x00);
snd_io_wait();
OUTB(cmdReg,0x40); /* モードレジスタ選択 */
snd_io_wait();
OUTB(cmdReg,0x4E); /* 非同期通信, stop bit=1 len=8 speed=31.25Kbps */
snd_io_wait();
OUTB(cmdReg,0x37);
snd_io_wait();
これUSART i8251の初期化そのまんまだ。たしか電源投入時の初期状態が不定だからコマンドに0を3度書き込むやつだ。ただ、これはふたつUSARTが載ってるということですね。[A][B]とか記述があるのは、チャンネルがふたつあるということだろうか。
2024-04-06 01:55:07
なお、
> コマンドレジスタ(0x0E51)I/Oをリードした際に返す値がよくわからないので0x4(ジェノサイドスクエアはこれにしないと進行しない)
これはまず間違いなくTxEMPTYフラグだと思います。津軽にはすでにi8251があるので、コマンドとステータスの受け渡しはそれを使ってしまえばできそうな気がします。今試しに書いてみてますが、ところで、実機でMIDIカード複数枚刺しって可能でしたか? I/Oが分かれてるのでできるのかと思ったんですが。多分まずやった人はいなさそうですが。
2024-04-06 04:29:59
説明書を見たところ、
MIDIカード側に1~4までの番号を割り振るためのスイッチがありまして、I/O拡張ユニット使用時に最大の4枚まで使用可能です。
ソフトウェアインターバルタイマは1番のカードの物のみ使用可能との事です。
富士通のカタログで、
MUSIC SOFTWARE COLLECTIONSやオーケストラ シミュレーション システムのタイトルの物に4枚装着の紹介がされていました。
16MIDIチャンネルx8ポートと紹介されていて、すごいなぁと思っていました。
2024-04-06 08:26:14
おおなるほど。さすがにWindowsのMIDI APIがそれほどのチャンネル数を支えられるかというと無理な気がしますが、とりあえず、津軽に枠組みを追加したソースをPUSHしました。まだWindowsのMIDI APIとはつなげていなくて、とりあえず値が出てくるか見ようとしています。多分、複数枚も認識するけれど音が出るのはWindowsでポートゼロのみという感じになると思います。現在コマンド ENA MIDI でこっそりMIDIを有効にできるようになってます。
Towns OSのEUPプレイヤーで試したところ、初期化はうまく通過したっぽいのですが、なぜかカード2があると思っているらしくカード2のFIFOを待ち続けて帰ってこない現象が起きているようです。また、IRRをクリアする条件はI/O 0E70h読み込みのようです。そうでないと、他に何もしないうちに ISR をクリアして STI してしまって無限Interruptが発生します。ひょっとすると、割り込み有効にしたまま TxRDY が来るたびにまたIRRがセットされるような可能性もあるので、デバイスのスケジューリングで定期的にステートをチェックする必要があるかもしれません。
2024-04-06 09:55:04
MIDIカードのタイマーについて何かわかりますかね? TOWNS OSのEUPプレイヤーは、MIDIカードを検出するとMIDIカードのタイマーを使うようです。このため、MIDI有効にするとMIDI音源だけでなくすべての音源の演奏ができなくなるようです。フリーズはしなくなったんですが。ちょっとひどいと思ったのが、Towns OSの途中から追加されたMIDI管理BIOS使ってないんですね。MIDI管理BIOS 0110:[00C0H]を迎撃してもう少し調べてやろうと思ったのですが、そもそも使ってませんでした。使用しているI/Oは0E73Hから0E77Hでまず間違いないのですが、開始・終了、割り込み許可、など条件がまったくわからんですね。せめて使ってるチップがわかればと思うのですが。
2024-04-06 12:26:14
FMT-402が8253、403が8254でした。
MIDIカードを装着しているだけで途中で止まってしまうゲームがありましたね。
ウルティマ5だったような。
2024-04-06 13:13:20
なるほど!8253だとすると、MIDI存在チェック直後のI/Oの動きが↓なので、
IOWrite Port:00000E73 Value:00
IOWrite Port:00000E77 Value:30
IOWrite Port:00000E74 Value:2C
IOWrite Port:00000E74 Value:0A
IOWrite Port:00000E73 Value:01
2度同じアドレスに書き込んでいるのはカウント値と見て間違いないですね。0E73hは割り込み禁止・許可のビットと仮定して、E77はカウント値書き込み前に8253を2バイト連続書き込みモードにしていると感じですかね。
割り込みハンドラ内の動きが↓なので、
000C:0002DCE8 Read IO8:[0E73] FF
000C:0002DA85 Write IO8:[0E77] 00
000C:0002DA93 Read IO8:[0E74] FF
000C:0002DA98 Read IO8:[0E74] FF
000C:0002DA59 Write IO8:[0E77] 30
000C:0002DA68 Write IO8:[0E74] D4
000C:0002DA71 Write IO8:[0E74] 06
000C:0002DAAD Write IO8:[0E77] 70
000C:0002DABC Write IO8:[0E75] FF
000C:0002DAC5 Write IO8:[0E75] FF
0E73hのReadがIRRのクリアだとして、0E77hにゼロを書いたのはカウンタラッチ、次の2度の読み込みはカウンタ値の取得。次の3度のWrite accessはカウンタ値の再設定、E77hはチャンネル1のカウンタセットだとすると、0E75hはチャンネル1のカウンタ値ですね。いや、0E73hが0060hと同じような動作だとすれば0E73hはビット0がチャンネル0、ビット1がチャンネル1のUPを表してそうですね。あとは、タイマーに入ってくる周波数がわかれば実装できそうですね。適当に仮定してやってみるかな。
ありがとうございます!
2024-04-06 13:29:25
すみません。FMT-402も8254でした。
2024-04-06 16:27:23
PC本体からのクロックと思われる配線がLS393に入って5番ピンのQD(500kHz?)から出て、8254の9,15,18番へ繋がっていました。
2024-04-06 18:52:49
とりあえず、MIDIのタイマーも実装して、うまいこと動いているようです。タイマーのクロックを500KHzとするとTowns System Software付属EUPプレイヤーのテンポも合っているようで、MIDIへの書き込みも確認しました。あとは、うまいことWindowsのMIDI関数に出してやれば鳴ってくれるかも。ひょっとすると、Genocideが何も待たずにMIDIにコマンドを出していたのはMIDIカードのタイマーを使っていたから鴨しれません。0E77hとかにアクセス無かったですかね?
2024-04-11 12:42:11
midi.cpp内でwinmm.libのリンク、読み出し時にmidiOutOpenでの初期化、終了時にmidiOutReset・midiOutClose、TownsMIDI::MIDICard::ByteSentFromVM内で直接前に上げたソースを元にif (state.data_byte == false)となっているところをif (data & 0x80)と変更(MIDIファイルによってはMIDIメッセージのステータスバイトを更新せずにデータバイトをすぐ送るものがある)してMIDIメッセージをWindowsに上げるテストをしたところ、それっぽく鳴りました。
https://www.youtube.com/watch?v=2qUKHtsYcOQ
曲はFM TOWNS システムソフトウェアのFJ2\GSフォルダ内にあるMORNING WAVE(MORNING.MID)という曲、CD-DAの2トラック目に演奏が収録されているので比較しやすい。鳴りっぱなしになるキーがあるものの演奏はあっている。
ジェノサイドスクエアはやはりタイマーなどは使っていないようで、0e73に0が書き込まれる以外は特に変化はなかったです。FREQ 5で正常な模様。というかFM音源版ですらCPU速度を上げてると曲が早送りになってしまう。
2024-04-11 17:26:38
ああ、やっぱり!僕も今出てくるバイト列を見ながら、どうもステータス変えずにデータだけ更新してるっぽいなあ、と、思っていたところでした!
やっぱり鳴りっぱなしになるキーありますね。音色がTOWNSが想定するものと合っていないんですかね?それでDecayが恐ろしく長いとか。
2024-04-11 21:57:23
なんか、鳴りっぱなし問題も直った感じがします。最新のソースよかったらお試しください。macOSにもcore MIDI APIなるものがあるようですね。うーん、しかしObjective-Cか。うちの大学がかなり関与して作った言語とはいえ、あの言語は失敗だったな。
2024-04-11 22:29:31
MIDIメッセージのデータはTOWNSとWindows環境で差異はないと思います。WindowsでTOWNS時代のSC-55やMT-32を接続して鳴らしたりできるようですし、このMORNING.MIDをWindows 10のWindows Media Playerで再生したらCD-DA収録版に近い演奏が鳴りました。
if (data_check == 0xf0)
{
switch (data)
{
case 0xf0:
case 0xf1:
case 0xf3:
state.MIDI_data_length = 1;
break;
case 0xf2:
state.MIDI_data_length = 2;
break;
default:
state.MIDI_data_length = 0;
midiOutShortMsg(hMidiOut, MIDIMSG((data && 0xff), 0, 0, 0));
break;
}
}
else
{
state.MIDI_data_length = 2;
}
システムメッセージ以外は全てデータ長は2バイトと解釈すれば鳴りっぱなしになる現象は無くなりますが、今度は音がキーがすぐ離されるのか残響しなくて質素な音になりました。
MIDIメッセージのデータバイト部分の解釈を間違えてるんだと思います。
2024-04-11 22:33:01
書込み中に山川機長さんの追記があったようなので上のは無視してください。
2024-04-11 22:45:55
おお、かぶりましたね。しかし、MIDIのWin32インターフェースの部分git addするの忘れたままCMUに来てしまったので、帰ったらPUSHするのでしばらくお待ちください。
2024-04-11 23:03:56
今度こそ無事全部ソースアップロードしたと思います。しかし、Win32の関数でこんなに簡単にMIDIがサポートできるとはまったく知りませんでした。BCCさん、ありがとうございます!
まだコマンドからMIDIをEnableするのでGUIでは使えないですが、明日大学でレトロPCを展示するイベントがあるので、その最中コンピュータ番してる間は暇なのでパラメータ追加したりGUI追加したりしようと思います。
2024-04-12 12:10:29
上げられたソースコードで試したところ問題なく演奏が行えることを確認しました(ジェノサイド、EUP プレーヤー、Vectorに上がっているシューティング「RUMSTORM」)。ありがとうございます。
TOWNSの市販ゲームタイトルでMIDIに対応しているものはテストを行ったジェノサイド以外はXak 3と幻影都市くらいですかね?ウルティマ5がMIDIカード接続時に停止するとのことなのでGUI版の設定項目にその注意書きを書いててもよいかもしれません。
TOWNS版Windows95でも試しましたがこちらはまだMIDI演奏しようとするとマウスカーソルしか動かずフリーズするようでした。
MIDIを有効にした状態でコントロールパネルの「ハードウェア」でMIDIカードを認識とインストール、再起動後コントロールパネルのマルチメディアの「MIDI」タブから「FM TOWNS MIDIカード Port AのMIDI」を選択
2024-04-12 19:18:45
今日のイベント、PC番だけしてればそんなに人も来ないかなと思ってたらまったくそんなことはなくて大盛況で展示したFM-7, FM77AV40, FM TOWNS IIMX で遊んでくれる人がたくさんいて嬉しい悲鳴でしたが、一日立ちっぱなしでした。しかし、Thexder走らせてたらいきなりFM77AVのドライブ0が壊れてしまった。急遽AV40を引っ張り出しましたが。AV修理できるかな。うちにもう一台あるにはあるけど。一台増強した方がいいだろうか。今からパラメータとかGUIに出すとかやります。
2024-04-13 08:13:16
あっ、ソース見直したら、High-Res CRTCとHigh-Res PCMってまだGUIに出してなかった!?なんてこった。
2024-04-13 08:43:37
Windows 95のMIDIプレイヤーが固まる現象確認しました。FIFO Registerが何か関係しているのではないかと見たのですが、その予想はぜんぜんはずれで、まずシリアルのTxENがfalseのときはそもそもIRQを出すべきではなかったんですね。ということは、シリアルのTxENに変更があったときはPICのIRRも更新する必要があったんですね。という2点を変更したところ、Windows 95のMIDIプレイヤーも最初から入ってるCaynon.midを再生できるようになりました。
2024-04-14 03:38:15
シリアルの割込みが使われていると言うことは、4枚刺しの場合はレベル入力を活かしてIRQシェアを実現しているのでしょうかね。
MIDI対応ゲームはアマランスIII、マーダークラブDX、マイトアンドマジックIII、ミラージュ、指輪物語、それ以外に数本ありました。
Xak3ではCM-64で妖精界の音楽を聴くのが好きでした。
2024-04-14 11:02:30
GUI版のほうですが、MIDIオンで立ち上げVMをPower Offしたあと津軽を終了させず再びStartを押してVMを立ち上げるとMIDIが鳴らないようでした。
2024-04-14 19:36:11
初めまして。
mac環境で「パニックボール」をプレイしたいのですが、
一番最初の起動の段階で躓いているため、どなたか知恵をお借り出来れば幸いです。
PCに詳しくないため、どのように説明すれば伝わるのか分からないので、
長くなってしまいますが、ひとまずフォルダ内と設定画面等がどのようになっているかを下記に記載します。
(画像はimgurに上げましたが、見れますでしょうか。また、ファイル指定先の一部はマスキングしています)
①津軽フォルダ内
https://imgur.com/a/bwqZW0N
②設定画面
https://imgur.com/a/Q2VxVoO
③HDD設定画面
https://imgur.com/a/5BzIVFt
④起動画面
https://imgur.com/a/UrY9vuh
githubから「Auto Release v20240223」内の「macos_binary_latest.zip」をデスクトップへDL、
解凍したものを「Tsugaru」というフォルダ名へ変更、
その中に「BIOS」「CD image」「FDD image」「HDD image」フォルダを作成し(画像①)、
設定画面は他のサイト等で調べて、画像②と③の通りにしました。
・ハードディスクイメージの作成
「File」メニュー→「New」→「Hard-Disk Image」→「HDD Image」フォルダを指定→512MBで作成
・CD Imageの作成
下記サイトから「PANIC-BALL2」の圧縮フォルダを解凍し、「PANIC2.iso」を作成
http://cc.ctk23.ne.jp/~elfaria/games.htm
・isoディスクイメージの作成
下記サイトを参考に、「ディスクユーティリティ」を利用して作成
https://support.act2.com/hc/ja/articles/208084756-Mac-で-ISO-ディスクイメージを作成する方法
上記の通りにした状態で「START」を押すと、画像④の画面のまま動きません。
どこが間違っているのか全く分からないので、
どなたかわかる方がいらっしゃったらご教示いただけますと幸いです。
何卒よろしくお願いいたします。
2024-04-14 20:10:26
>ウミさん
TownsOSそのものがないと起動しません。システムソフトウェアのディスクが入手できない場合は、安価で売っているフリコレか天晴を買ってきてイメージ化してそこから起動し、フロッピー内にパニックボール2のデータを書き込んでおいて実行する(どちらにせよセーブにFDDが必要)。
2024-04-14 21:26:22
> ウミさん、
BCCさんが既に書かれている通りで、まだ互換ROMは出来てるのですが互換Towns OSまでは実現できていません。ですので、フリーソフトを動かす場合だと、一枚はTowns OSのGUIが起動可能なCD-ROMが必要です。できればTowns System Softwareを一枚入手されると良いと思いますが、フリコレなどが安くて良いかもしれないですね。
> BCCさん、
MIDIはデストラクタを書くのを忘れてました。(学生にはコンストラクタを書いたらすぐデストラクタも書けって言ってるのに!)。最新版ソースだと直ってると思います。
2024-04-15 07:35:33
MIDI対応で気づいたのですが、ジェノサイド2のオープニングが崩れて表示されているようです。かつてズーム公式サイトで配布されていたイメージファイルでの確認。
https://youtu.be/YXkNHVldmqM?si=GIYbX-0uHenBDTgr&t=2024
実機動画の33:44が該当部分。実機では夜景がスクロールするが、津軽では画面半分がノイズ上になっている。
2024-04-15 23:42:08
>BCCさん、山川機長さん
お二方とも教えてくださりありがとうございます。
TownsOSが必要だったんですね・・・!
システムソフトウェア(V2.1 L31)がありましたので、こちらでISOイメージファイルを作成して起動出来ました!
また画面を見ることが出来て嬉しいです・・・!
(システムソフトウェアの中に「パニックボール2」が入っていたのを初めて知りました)
ーーーーーーーーーーーーーーーーー
分からないところが新たに出てきましたので、追加で質問させてください。
こちらもお時間のある時で問題ございませんので、
分かる方がいらっしゃったら、知恵をお借り出来ますと幸いです。
①ゲームパッドについて、
「Sony PlayStation DualSense ワイヤレスコントローラ」があるのですが、
こちらを津軽内で、ゲームパッドとして認識させることは可能でしょうか。
(プルダウンメニュー?内にあるもの全てを選択して確認しましたが、認識しないようです)
②マウスとゲームパッド(もしくはキーボード)の切り替えは
津軽起動中に出てくる右下の「MENU」→画面上部の「Devices」→「Game Port 0」で切り替える認識で相違ないでしょうか。
③「パニックボール2」プレイ中に中断して、
デスクトップ画面(言い方が正しいのかわかりませんが)に戻りたい場合は、どのようにすればよろしいでしょうか。
何卒よろしくお願いいたします。
2024-04-16 01:32:50
Sony Playstation DualSenseに関しては、macOSのその他のゲームで認識できているでしょうか?一応、うちのmacでは手持ちのUSBゲームパッドは使えたのですが、Bluetooth接続のゲームパッドは認識しませんでした。
ゲームパッドについては、プルダウンメニューからの選択は原則Towns OS(またはWindowsかDOSかLinux)起動後に切り替える場合で、起動前はGamePortタブで指定です。このへんヘルプか何か書いた方がいいんだと思うんですが放置しててすみません。
デスクトップ画面というのは、多分津軽のGUIのことですね? ウィンドウ右下に「MENU」と書いたボタンがあるので、それをクリックすると津軽のGUIに戻ります。あるいはデフォルトではScroll Lockキーで戻りますが、Scroll Lockキーが無い場合は、Hot Keysタブで他のキーに割り当てることもできます。
2024-04-16 08:59:04
> BCCさん、
ぐ、GENOCIDEのエンディングですか。このゲーム僕の腕ではクリアできないんですよ。。。。どうしよう。
2024-04-16 09:03:41
>山川機長さん
いえ、ジェノサイド2のオープニングです。メニューからGENOCIDE2を押して暫く待ってれば該当部分が流れてきます。
CRTCの状況を見ると
15KHz
Registers:
HSW1:0074 VST1:0006 HDS0:00E7 HDE0:05E7 VDS0:0028 VDE0:0208 FA0 :0003 HAJ0:00D3 FO0 :0040 LO0 :0040
HSW2:0530 VST2:000C HDS1:00E7 HDE1:05E7 VDS1:0028 VDE1:0208 FA1 :0003 HAJ1:00D3 FO1 :0040 LO1 :0040
HST :0617 EET :0012 VST :020B EHAJ:0056 EVAJ:0007 ZOOM:0303 CR0 :800F CR1 :0001 CR2 :0188 FR :0002
----:0000 ----:0000
Sifters (Isn't it Shifter?):0A 18 PLT:01 Priority:0 CLKSEL:1 SCSEL:0(02x) PM:0188
Address Latch: 00000016H
CL0:3 CL1:3
Single-Page Mode.
Top-Left:(0,0) Display Size:(640,960)
8-bit color
VRAM Base=00000000 Offset=00000018
BytesPerLine=00000200 SkipBytes=00000005
Zoom=(2,1)
VSYNC:0
Show Page (FDA0H):1 1
Show Page (0448H):2 2
FMR VRAM Display Offset:00000000
FMR VRAM Display Planes:0F
となっており、15==khz && FO0 == 0x40時にheiを240にするとノイズ部分が消えて画面上部半分のみに正常な背景が表示されます。これを画面いっぱいに表示させれば実機の映像と同じようになりそうです。
2024-04-16 09:58:19
おおなるほど。オープニングでしたか。これは、256色1画面モードで15KHzというのは確かに新しいですね。多分VerticalのZoomが2倍と判断するべきなのかな。ZOOMは0303なのになぜこれをY方向1倍と思っているかというと、GetLowResPageZoom2Xがsingle-pageモードのときzoom[1]*=2としているからですね。ということは倍率を2倍にするか4倍にするかの判定はsingle-pageかtwo-pageかではないということか。ついでに画面サイズが640x960 (1倍換算)だと思ってるのも解釈が違ってるんだろうな。どう直したもんか。
2024-04-16 11:15:03
どうもFOxとLOxの関係が鍵な気がしますね。TBIOS標準画面モードでは、FOxがゼロではない画面モードは14、16、18で、いずれもFOxはLOxの半分の値でした。このGENOCIDE 2のオープニングの問題個所では、FOx=LOxなのが違いますね。他に15KHzでFOxがゼロではないゲーム(ゲームで無くてもいいけど)ってありますかね?
ちなみに、Super Street Fighter 2のオープニング画面が横方向1280ピクセルだと思ってしまう問題もあって、これもCRTCの何をどう解釈すればいいのかまだ謎です。
2024-04-16 13:18:59
山川機長さん
回答下さりありがとうございます。
色々調べていく中で下記の通り解決しました。
①ゲームパッドが動かないと言った件ですが、Game Port 1の方で指定していたためでした。
②起動前にゲームパッドの指定が出来ることは認識出来ております。
起動後に切り替えるのかどうかで質問をしていたのは①の通りに設定している状況だったので、起動前に設定していても反映されない、動かないのかな?と思ったからでした。
改めて下記の通り起動前の段階で設定し直した上で、起動後も無事に動作確認が出来ました。
(よく読んだら本スレッドの2番の方で説明されてましたね、見落としており大変失礼いたしました)
・Game Port 0→Game Pad by Host Game Controller 0
・Game Port 1→Mouse
③デスクトップという言い方が悪く、混乱させてしまい申し訳ありません。
ゲームを中断して、津軽起動後に出てくるメニューの画面(日付やメニュータブ等が表示されている画面)に戻るにはどうしたらいいのか、という質問でした。
https://imgur.com/a/D59Nwah(デスクトップと言ったのはこの画面のことです、適切な呼び方がわからずで申し訳ありません)
これも②で確認する流れで、ゲームパッドで操作出来るようになったことで、ゲームオーバーの画面を表示させるボタンの位置が分かりましたので解決しました。
https://imgur.com/a/B2n6WBH(ここで下を選択すれば中断してメニューの画面に戻れる、という流れです)
度々お騒がせしてしまい申し訳ありませんでした・・・
津軽起動後の右下の「MENU」ボタンは「Hot keys」タブで他のキーに割り当てられることは知らなかったので、大変有益な情報でした。
今回津軽に触れたことで、20数年ぶりにパニックボールが出来るようになって本当に嬉しいです。
私にとっては何年経ってもずっと色褪せないゲームで、最後までクリア出来ないままだったのが心残りでした。
今回を機に時間を見つけて全面クリアを目指したいと思います・・・!
本当にありがとうございました。
2024-04-17 00:12:55
> 私にとっては何年経ってもずっと色褪せないゲームで、最後までクリア出来ないままだったのが心残りでした。
ああ、その気持ちめちゃくちゃわかります。僕も、Wing CommanderとかStrike Commanderとかもう一度クリアしたかったゲーム 、エメラルド・ドラゴンとか大航海時代とかロケットレンジャーとかクリアできなくて心残りだったゲームがたくさんあったんですよね。最近だとロケットレンジャーをクリアしたとき津軽を作って本当に良かったと思いました。レトロゲームはエミュレータさえあれば、積んでおけば時間ができたときにできるのがいいですね。
是非、他のゲームも津軽でクリア目指してください。
2024-04-17 06:30:16
最近CRTCの事が気になって今更ながらCRTCに関するパラメータに関する資料を作りかけていました。
折角なので役に立つかどうか判りませんが公開しておきます。↓
https://docs.google.com/spreadsheets/d/1xoks2r98FI5n-2sO48N85-OR8zzUSUx6YjJP1QltqBA/edit?usp=drive_link
256色タイミングのタブにGENOSIDE2のオープニング部におけるCRTCのパラメータ欄を判る範囲で書き込みましたが、これによると水平周波が15.73KHz,垂直周波数が60.17Hzで320*240,256色モードです。(まだまだ判らない部分も多々有りますので間違いも有ると思います)
画面モード14の亜流みたいな感じですね。
FOxとLOxについてですが、LOxについては赤本では'インタレースモード時に・・・飛ばし読みするときの各'と有りますが、LOxが0000hのデータは無いので単純に次ラインまでのオフセットが入っているような気がするのですが。
2024-04-17 10:11:07
LOxに関してはその通りです。インタレース、ノンインタレース関係なく次のラインまでのオフセットが入っているようです。これも赤本の誤植一覧に加えてもいい鴨しれません。あと「フィールド」って何よ、という話もあるんですが。赤本はものすごく貴重な資料であることは間違いなくて、赤本無くして津軽は実現できなかったわけですが、ときどき未定義のタームを使うとかこの人本当に研究者?って思うことがありますね。
15KHzモードで480ライン表示する場合は、1フレームごとに奇数ライン、偶数ラインを表示してなんとなく480ラインを実現しているようなのですが、このときFOxが効いてくるようです。原則としてFOxはゼロまたはLOxの半分で使う場合がほとんどのようなのですが、GENOCIDE2はFOx=LOxという初のケースのようです。今、津軽のCRTCでは、FOx!=0の場合は特別な処理をしているのですが、FOx=0, FOx==LOx, FOx!=LOxの3通りを考えるとうまくいくのではないか、というのが現在の予想なのですが、他にFOx!=0の場合をいくつか集められるともう少し確信が持てると思うのですが。
2024-04-17 11:07:52
>WINDYさん
ジェノサイド2の該当シーンは画面モード14の亜流というよりは、画面モード11(32768色、320×240、15KHz)の亜流のように思いました。
用途的には画面が暗くなっていくフィードアウト効果を滑らかに使うために1667万色パレットのある256色画面を使いたいのだけど、シーンの前後で大きく表示モードや解像度が変わると違和感が出る、そこで画面モード11をベースに256色モードへの切り替えと解像度を近くなるようにレジスタ値を変更したものと推測できるんですがどうでしょうか。
2024-04-17 11:13:38
>山川機長さん
フィールドについては、インターレースモード時の偶数ライン描画時と奇数ライン描画時のそれぞれの呼び名と解釈しています。
FOxは、赤本ではP.133(図I-4-37)の右側の最初の走査線のずれ量を指定する数値ですので、通常は図のようにLOxの半分となります。
ではFOxが0000hの場合は? と言われると実証しないと判らないのですが図で言うところの奇数走査フィールドが偶数走査フィールドにも表示されますので結果的には縦2倍表示になるのではと思います。
>BCCさん
おおっ! 32K色の方は見てなかったので画面モード11だとは思いませんでした。
見比べてみると確かに画面モード11の亜流(画面モード11の256色版)でしょうね。
2024-04-17 13:20:32
上の書き込みですが、FOxが0000hの場合の内容はおかしいですね。
FOx=LOxの場合を聞かれたのに何を言ってるんだか。(汗) そもそもFOx=0000hの場合でもインターレースだと中央からVRAMオフセット0が始まるので縦2倍なんてならずに、ごちゃ混ぜになりますね。
さて、FOx=LOxの場合ですが・・・・ よく解らないです。(爆)
この変も含めてよく解らない所(例えば仮想画面の大きさの決定等)なんです。
GENOSIDE2に限って言えばLOx=FOx=0040hですから、256色モードだと4pix/addressなのでピクセル数としては256pix飛ばしなんですが、なんだか数値が合わないですね。
2024-04-17 13:59:17
そうですね。「フィールド0」「フィールド1」は奇数フレーム、偶数フレームだと多分合ってますね。480ライン表示したいんだけど240ラインしか出ないからVSYNCがかかるたびにフィールド0とフィールド1を切り替えて交互に偶数ラインと奇数ラインを表示させて、長い目で見ると480ラインあるみたいに見える、というような。なので、15KHz、480ラインモードでは、LOxが2ライン分、FOxが1ライン分の長さを表しているものと思ってます。おそらくGENOCIDE2ではLOxも1ライン、FOxも1ライン分の長さだと思うので、それだと実機だと画面が上下に1ピクセルずつピクピク揺れるような見え方になったのではないかという気がするのですが、15KHzモードがそもそもチカチカしていて気が付かなかったのかもしれないですね。
あるいは、15KHzモードって1フレームごとに半ラインだけ表示開始位置を上下にずらす、みたいなことってできるんですかね?そうであれば、15KHz特有のライン間が暗くなる現象を軽減できそうな気がしますが、ただ、そんなことができるならなぜ他の15KHzモードでそうしなかったのかがわからないというか。
2024-04-17 20:52:36
ということで、FOx==LOxの場合をFOx==0と同じ扱いに修正したソースをPUSHしました。GENOCIDE2のオープニング画面は正常になったようです。これで他に悪影響が出てなければいいんですが、多分ほとんど大丈夫な気がします。
2024-04-17 21:54:35
FOxの方はイマイチ判らないので、取り敢えずLOxの方だけ。
私、何も実験をしてないので推測だけで今から書くのですがひょっとしたらある程度の経験を持たれている方であれば当然の事なのかもしれません。
2画面モードの時、LOxは基本的に仮想画面の横幅とVRAM32bitに入るピクセル数(16色→8,256色→4,32K色→2)を考えて設定されています。
仮想画面が256pixの32K色モード(画面モード5等)の場合は、LOxには0080hが設定されています。 0080h=128*2(pix/adr)
1画面モードの場合は、同じ32K色モードで仮想画面幅が512の画面モード15のLOxの設定値も0080hなのです。 そう、2画面モードの計算では合わないのです。
前から気になっていたのですが、FAxの説明の所でFAxを1増減させた場合の表がI-4-28に有るのですが、1画面モードの場合は同じ32Kモードでも倍の移動量となっています。
さらに、ご存じかと思いますが1画面モード時と2画面モード時では、CPUから見たVRAMアドレスが別に割り振られています。
また、図I-4-3に画面制御系ブロック図が有りますがVRAMは256KBのブロックが2つ存在し、それぞれレイア0用/レイア1用となっています。
FAxに与える値はCRTCが表示領域に入ったときに最初に読み出すVRAMアドレスですから32Kモードの場合はVRAMがフラットであれば2画面モードでも1画面モードでも2pix単位のはずですので、1画面モード時はフラットではないVRAM構成であるとしか思えない事となります。 ← あくまでもCRTCから見たVRAM構成です。
辻褄を合わせようとしたら、1画面モードではCRTCからVRAMを見ると偶数アドレスにレイア0用ブロックを,奇数アドレスにレイア1用アドレスを用いた場合にFOxを1増減させると4pix移動する事になります。
このままではCPUから非常に使いづらいので、CPUへのアドレスマッピングは別エリアにVRAMが交互にアクセスするようにマッピングしたのでは? と思っています。
仮に1画面モードの場合は上記のような形であれば、LOxに設定する数値も1/2の値を設定するのが正解となり、辻褄が合うと思うのですが・・・・
実証コードがかければ良いのですが、ここ最近High-Cのセットアップを行っていますが難航しており未だに正しくコンパイルが出来ない状態です。(涙) (High-C初心者なので許してください。)
取り敢えずF-BASIC386でやろうかなと・・・・ (これをするから何年経ってもHigh-Cが使えない)
2024-04-18 00:39:51
2画面モードと1画面モードですが、1画面モードVRAM 80100000h~に以下の内容を書き込むと、
80100000 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10|
2画面モードVRAMでは4バイトずつ分かれて以下のように現れます。
80000000 01 02 03 04 09 0A 0B 0C 00 00 00 00 00 00 00 00|
80040000 05 06 07 08 0D 0E 0F 10 00 00 00 00 00 00 00 00|
「機甲師団」がなぜか2画面モードなのに1画面モードVRAMに書き込んでいて、この変換を正しくやらないとタイトル画面が正しく出てくれません。多分ストライクコマンダーとかこのアドレス変換を無くしたらちょっと速くなるんじゃないかという気がしているのですが、ほぼ「機甲師団」のためだけに津軽はきちんとアドレストランスレーションするように書いてます。(「機甲師団」は、やってみたいと思ったままになってたゲームのひとつだったので、津軽でやってみたけど、なんか思ってたのと違った。)
なので、1画面モードVRAMの方が本来のRAMチップ上での並びになっていて、それを4バイトずつ分けて2画面モードVRAMに出している感じですかね。だとすると、1画面モードのFA0の値1が本来のRAMチップ上での8バイトに対応していて、でもそれがふたつに分かれるから2画面モードだと4バイトに相当するという感じですかね? ややこしくてあまり深く考えてなかったんですが、WINDYさんの書き込みでもう一度考えてみたところそんな気がしますね。
それからLinuxがハイレゾCRTCがあるとわかると、ローレゾCRTCが有効な状態でも1画面モード用ハイレゾVRAMに値を書きこんでいることが判明していて、どうやらハイレゾVRAMにも同じ変換がかかっているようです。
2024-04-18 10:03:08
> FOx
奇数フィールドのときにFAに加算するイメージですが、VSTが奇数のとき(垂直走査時間が水平走査時間の整数倍のとき)は効果をもたなかったと思います
2024-04-18 14:20:49
「機甲師団」がそうだったのですね。 中々イレギュラーな事をしていますね。→「機甲師団」
逆に2画面モード用VRAMに連番のデータを置いた場合も、1画面モード用VRAM上を読むと4バイト毎に入れ代わる(混じる)形となりますので、アクセスするアドレスによりVRAM群(レイア0,1)のCEラインの制御方法が異なるだけだと思います。 (なぜ「機甲師団」はそれを無視して困難な方法を選んだのかは解りませんが)
で、どっちを念頭にハードが開発されたのかを推測すると2画面モードが基ではないかと思います。
こう言う構造上の理屈も有って1画面モードではFAxの1増減に対するスクロール量が大きくなっているのだと推測しています。
FAxは双方のレイアに有りますので、それぞれはFA0が80000000,FA1は80040000を基準としたオフセットとなるはずで、1画面モード用のVRAMでは連続した8バイトを指すものですから1増加させると8バイト(=32K色で4ドット)移動する事となる。
2024-04-18 14:40:10
CRTCから逸れますが、動作確認でチェイスHQ(これも無線画面の解像度が大きく出る)を試したところ、ゲーム画面に移る際にReason:Clocks-Passed is not set. Opcode=0FA2HでAbortしました。
v20240223でも駄目でv20231124で正常に動くのでおそらくWindows 95対応でCPUに変更したところが原因だと思います。
2024-04-19 00:04:14
調べたら2024/1/27付のCDROM TOC READ command correctly shoot SIRQ.の更新でチェイスHQがフリーズするようになってました。
2024-04-19 02:07:08
おおなるほど!いつもご報告ありがとうございます!Chase HQはオートデモまで自動テストに入ってるので、ゲーム開始でクラッシュしていたとは。割り込みがかかるのが間違いなのか、割り込みのハンドリングを間違っているのかですが、これ、BIOSがバグってるぽいですね。
CD-ROM BIOS内で↓のようなことをやっているのですが、
0262:00001F8A 891E5100 MOV [0051H],BX
0262:00001F8E 893E4F00 MOV [004FH],DI
0262:00001F92 80FC00 CMP AH,00H
0262:00001F95 752F JNE 00001FC6
0262:00001F97 B400 MOV AH,00H
0262:00001F99 B209 MOV DL,09H PICの9番て意味だな (CPU的には49H)
0262:00001F9B BF5300 MOV DI,0053H
0262:00001F9E CDAE INT AEH (INT-Manager)
このときDS=083Aなので、083A:004Fと083A:0051に前の値を退避して、その後、
0262:0000200B 1E PUSH DS
0262:0000200C B400 MOV AH,00H
0262:0000200E B209 MOV DL,09H
0262:00002010 8B1E5100 MOV BX,[0051H]
0262:00002014 8EDB MOV DS,BX
0262:00002016 8B3E4F00 MOV DI,[004FH]
0262:0000201A CDAE INT AEH (INT-Manager)
0262:0000201C 1F POP DS
このようにリストアしていますが、MOV DS,BXとするのが速すぎて、DIの値を083A:004Fではなく、005D:004Fから拾ってしまっています。しかし、CD-ROMアクセスをCD-ROM BIOS経由で実行している限り、ポインタを0053Hに設定→CDアクセス→CDアクセス終了→ポインタを破壊してBIOSから戻る、だったので、ポインタが破壊されていても誰も気が付かなかったということのようです。
CHASE HQはCD-ROM I/Oを直接攻撃しているので、割り込み管理ブロック(?)の値が0053Hにならない状態、破壊された状態で割り込みがかかってしまうと確実にクラッシュします。
なので、CHASE HQの場合割り込みがかからないのが正解のようです。クラッシュしたときのCD-ROM状態を見ると、
>pri cdrom
Last Command:E5(CDDAPAUSE)+IRQ+REQSTA
Last Command Param:00 00 00 00 00 00 00 00
Param Queue (Towns->CD):
Last Command Issued At:0000000C:001A81D0 Last Parameter Written At:0000000C:001A81C2
Reading Sector(HSG):1121 End Sector(HSG):1120
Status Queue (CD->Towns):00 01 00 00 12 00 00 00
DMA Transfer:0 CPU Transfer:0
SIRQ:1 DEI:0 STSF:0 DTSF:0 DRY:1 enableSIRQ:0 enableDEI:0
CDDA:PAUSED
enableSIRQがゼロになってますね。はて。なんでこれでIRQを出したんだろう?
多分、ここは void TownsCDROM::SetSIRQ_IRR(void) この中でstate.enableSIRQをチェックしてなかったのが原因だと思うので、そのようにしてみました。
1/27のSIRQの修正は、Windows 95のCD Playerが固まる問題への対応だったはずで、この修正を入れてもWin95のCD Playerは固まらないので大丈夫だと思います。
2024-04-19 04:02:28
Chase HQの無線画面の幅問題ですが、HDE0=38AH, HDS0=08AHで差し引き300H (768)だという計算になってしまうんですよ。ちょっと最近思ってるのが、実はこのHDExですが、大きすぎると走査線が画面の端を超えてしまっても、HSYNC信号で次の行に戻るだけなので、大きな値が入っていたら単純に無視されるのではないかという気がしてきています。それだと仕方ないので、Low-Res CRTCの横幅上限を720、High-Res CRTCの横幅上限を1152ということにしようかとちょっと思ってます。Chase HQはそれでも右に黒い帯が発生しますが、少しは軽減すると思います。
2024-04-19 04:12:08
HDE0-HDS0>(HST+1)-HSW1であれば水平走査線を越えていないと判断できると思います。
あとはどの位のフロントポーチ,バックポーチを確保できればCRT側が追従できるかはCRT側の性能かと思います。
とは言え設定値である以上何処かで限度を制限するのは致し方ないとは思います。
2024-04-19 09:28:24
おおなるほど!それだと、画面サイズは min(HDEx-HDSx,HST+1-HSW1) にするという手も考えられますね。Super Street Fighter 2のタイトル画面が、HDE0=510h, HDS0=010hで、差し引き1280ピクセルになってしまうけどそんなはずはないという問題があったんですが、これだと704ピクセルの計算になるので少し良くなりそうです。
2024-04-20 01:52:31
標準の画面モードならば問題ないので致命的ではないと思いますが、「マッスルボマー」が「HIGH WIDE」「VIDEO」に切り替えると画面右端が途切れている、「レインボーアイランド エキストラ」が「VIDEO WIDE」でオプション画面右端の途切れとゲーム画面でスプライトレイヤーがビットマップレイヤーより16ドット上になっているようでした。
また話を変えてしまいますが、互換BIOSのFMT_DOS.ROMに音声メッセージデータ10種が収録されていないので「VOICEVOX 四国めたん」(商用・非商用使用可)を使って音声データを作ってみたのですがどうでしょうか。
https://drive.google.com/file/d/1yRrI1NNbqAFpiYfMzRIF3zffSaO1Wsi6/view?usp=sharing
音声サンプル
https://www.youtube.com/watch?v=FhvvmvJymlA
これを使用したソフトがあるのか正直わからないので組み込んでも意味があるかわかりませんが。
記憶の中ではシムファームの終了時に「バイバーイ」と発音していたはずなのにされないので互換BIOSのせいかと思って作ったものなんですが、天晴Vol.1に収録されている体験版でのみROM音声使って再生し、製品版ではそもそも音声が流れないようになってただけというオチでした。
2024-04-20 19:50:01
MIDIが鳴ると聞いてTsugaruを最近また触り始めたにわか者です。
Tsugaru(4/13近辺のソースをビルド、ROMはH20から抽出)で漢字変換するとフリーズ、コンソールでは下記の表示が延々出続けていました。
PhysMem: Undefined I/O Write 05C8 2F
漢字変換は問題なく出来る機能なのでしょうか?
2024-04-21 23:46:00
> LFOさん、
漢字変換でクラッシュの事例は今のところ確認できてないですね。自分のMXから抽出したROMと2Fから抽出したROMで、Towns OS V2.1 L31, L51 では少なくとも漢字変換は正常に動作しています。I/O書き込みの警告メッセージはこちらでも出ていますが、I/O 05C8Hへの書き込みは未公開機能なので何をすればいいのかわからないのですが、とりあえず無視しておいても大丈夫そうです。TOWNS OSのバージョンとアプリケーションプログラムは何をお使いでしょうか?
> BCCさん、
いいですね。やりましょう!互換ROMに追加してみます。
2024-04-22 08:30:43
作っていただいたVoiceを組み込んだFMT_DOS.ROMをgithubに上げました。多分きちんと入ってると思うのですが、よかったらお試しください。
2024-04-22 12:36:14
>663 山川機長さん
スーパースト2のCRTCパラメータが判らないので何とも言えないのですが、HSTとHSWが関連してくるのはあくまでも同期タイミングでこれにより水平同期タイミングが決定されます。((HST+1)の周期でHSW幅のパルスが繰り返し出力されます)
HDEとHDSは、上の水平同期信号の中でどこからどこまでを表示期間(=水平の各ドットの色データを出力する期間)とするかのパラメータで、HDE-HDSで期間を設定します。(HDE-HDSが横ドット数の倍数となるはずです)
実際にデータが送出される時にはHDSタイミングよりFAxやHAJx等のパラメータや横方向のズーム値を考慮して送出されます。
スーパースト2の場合ですとHDE=510h,HDS=10hですから、1280ドットとなりますが恐らくズーム値2が指定されて640ドットとなっていると思います。
2024-04-22 13:13:11
>山川機長さん
音声ROMから再生するサンプルプログラムで問題なく声が聞こえることが確認できました。ありがとうございます。
他に互換BIOSでバグらしきものがあったのですが、Linuxのブートローダーがメモリ確保に失敗して起動しないようです。DOS 6.2ベースのTownsOSで起動していたから気づきませんでしたが、6.2抜きのHDDで互換BIOSからLinuxを動かしてみたところ
not enough free memory.のエラーが出て終了しました。
同時に収録されているソースコードだと「_dos_allocmem(0xFFFF, &freememsiz);」が実行されるようで、YSDOSのMEMORY.ASMにあるMEM_SPLIT_ARENAルーチンで0サイズで確保しないようにあえてINC BXしているのが原因かと思いました。
2024-04-22 19:01:30
おおなるほど。関数名から想像するとそれは0xFFFFはAllocできないからfreememsizに確保可能なパラグラフ数を返すやつですね。それだと、MEM_FIND_AVAILABLEでチェックしているはずだからMEM_SPLIT_ARENAまで入ってきているとするとMEM_FIND_AVAILABLEが何かしくじってるっぽいですね。ソースコードの個所では、直後にfreememsizをチェックしてエラーメッセージを出すようにしていますか?
ただ、記憶をたどっていくと、同じINT 21H AH=48H (MALLOC)でBX=FFFFとして確保可能なパラグラフサイズを求めるのはDOS Extender等でも見られたはずなので、これだけ動かないというともう少し根が深いかもしれません。もうすぐ「挑戦!Linux「基本操作s&日本語環境構築」」が届くので、それに同じソースが入ってるといいのですが。
2024-04-22 22:14:35
「DOSBOOT5.EXE β2 を V1.0 としてリリース。転載可。」ともREADME.DOCにも書かれていますし、こちらでソースと実行ファイル一式を上げておきます。
https://drive.google.com/file/d/1Gphm7W636nfiwAHaJfN5knNEVz504DLL/view?usp=sharing
2024-04-22 22:37:51
>666 山川機長さん
ありがとうございます。メッセージの方は無視しておきます。こちらで使用しているのはTOWNS OS V2.1 L51でHEat ver 1.02c/OS標準のテキスト編集シェル版V2.1L40で発生しました。話を聞く限りこちらの環境の問題のようです。windows XP+うんづの頃からPC/HDDを色々跨いで引き継いだ10数年物のHDDイメージなので、いい加減壊れてるのかもしれません。後でHDDイメージ新規作成してみます。
2024-04-22 22:47:36
了解しました!"not enough memory."というメッセージはDOSBOOT.Cの中ですね。BRKON FOPEN zimageで止めて、zimageが無いもののそこは無理やり突破させたところ、どうやらこれはTCCを使ってコンパイルしたようですね。allocmemの最初のリターンが56E4hでした。これはDOSのパラグラフ数なので、バイト数としては56E40h=355904バイトとなりますが、この値をzimageのファイルサイズと比べて、入りきらないと思ったらnot enough free memoryエラーを表示しているようです。zimageのファイルサイズはわかりますかね?
2024-04-23 00:05:56
あ、なお実験したのはTowns OS V2.1 L20をCDから起動してDOSBOOT5.EXEにアクセスするためにTGDRVを入れた状態なので、Linuxの起動環境だとドライバが少ない分もう少し多いかもしれないですね。ただ、帰ってきてる値は正常そうです。
2024-04-23 00:12:24
ziimageのサイズは397546ですね。
((freememsiz)*16L)の値は393616のようです。
2024-04-23 00:20:41
って単にメモリ不足かと思ってCONFIG.SYSを弄ったところブートイメージの読み込みは進めました。
次は「Hit RETURN key the boot!」のメッセージでキーボードのエンターを押しても進めない状態です(i=getchar();の箇所)。
2024-04-23 00:57:21
おおなるほど。TOWNS OSのゲームが大体動けばいいや、と、思って結構いい加減にしてたとこですね。確認してみます。
2024-04-23 01:26:41
うーん、getchar()なんて単純にINT 21Hを呼んでるだけだろうと思ったら案外中が複雑ですね。zimageは再配布不可ですか? zimageがあれば多分getchar()までたどり着けると思うんですが。
2024-04-23 05:36:58
あ、そうか。Debugger Enable状態で、getchar()で止まったところで pri cst でコールスタックを表示して最後に出たINT 21Hの機能が何かわからんですかね?予想では、AH=01 (GETC with echo) ではないかと思うのですが。
2024-04-23 12:30:43
すみません、INT 21H AH=3F BX=0000でした。CONから読み込みでCX=200Hとなってるもんで、リターンキーが512回出るまで待ち続けてました。多分、一分ぐらいリターンキーを押し続けると先に進むと思います。これは、どうやらリターンキーが押されたらすぐ戻るのが正解なんですね。YSDOSをそのように変更してみます。
2024-04-23 14:07:14
getchar()問題、原因わかりました! MXのROMでやってみたら、デバイスドライバに対してまずリクエスト5(Non-Destructive Read)を出して、入力があったらリクエスト4(本気Read)を出して1バイト文字を読むということをやってるのですが、僕は単純にリクエスト4だけ出していたのでCXバイト埋まるまで帰ってこなかったようです。多分リクエスト4でまとめて読まずに1バイトずつ読んでリターンキーがあったらそこで止めて戻るでもいいと思うんですね。archive.orgのpcdosretroで多分やり方はわかったので、直せると思います。
2024-04-23 23:04:52
漢字変換がフリーズする件、HDD再インストールでも駄目で色々やった結果、(多分)cmosクリアで漢字変換出来るようになりました。お騒がせしました
2024-04-24 00:54:59
互換ROMのgetchar()問題、応急処置なのですが直ったと思います。FMT_DOS.ROMその他githubに上げたのでお試しください。本来はYSDOS.SYSの中に簡単なラインエディタ機能を書くべきなのですが、とりあえず指定のバイト数が埋まる、またはリターンキーを押すまで1バイトずつ読み込むようにしました。本来のgetchar()ではエコーが出るはずですが、YSDOS.SYSでは出してません。が、リターンキー待ちは正しく動くようになったと思います。
こちらもLinux本が明日届くことになってます。
2024-04-25 10:36:36
リターンキーは認識し、ブートまで進んだのですが今度はHDDのパーティーションチェック時に
VFS: Cannot open root device 00:00
Kernel panic VFS: Unable to mount root fs on00:00
で止まりました。山川機長さんに届く本がDOSBOOT付きのものであればいいのですが。
自分が持っている「Linux入門」の本には「CDに収録されている内容は各利用規約に沿って使用してください」とあるんですが、肝心の配布条件とかCD内にもテキストファイルとかが見当たらずちゃんと記載されてないんですよね。
Slackware自体はGPLだろうし、TOWNS差分部分も再配布とか許可してるとは思うんですが。
2024-04-25 23:25:53
なんと、Linuxコードに入ってから止まりましたか。そこまで進んでしまえばあとは互換ROMか実機抽出ROMかは関係なさそうですけどね。ひょっとするとSCSIかDMAの状態が変になってるのかもしれないですね。なお、Linux本届きました。CDも未開封のようです。(これにネットワークカードのドライバとソースが入っててくれるとうれしいが、果たして本当にTOWNSでも起動できるのか!?)。それはまだ試してないのですが、互換ROMで、Linux+JE2 1995-12のCDから起動しようとしたら INT 21,AX=4808H DOS.Malloc ここから戻ってこない現象が発生したので、まずこっちを解決してみます。
2024-04-26 22:22:10
「挑戦!Linux」届いたのでCDをイメージ化しようとしたら、なんとCDが傷んでました。表面の汚れと思ってクリーニング、さらには磨き粉でリペアまでトライしたのですがまったく汚れが落ちないところを見ると、蒸着が甘くて中のアルミが劣化してしまったようです。200円だったから仕方ないんですが、プレスしたCD-ROMがビニールから出していない状態でここまで劣化している例を見たのは初めてです。残念。保存状態が悪かった可能性もありますが、「挑戦!Linux」の付録CDは生産のクオリティが悪かった可能性も予想されるので、もう一冊別のものをヤフオクで落とすのはやめておきます。
ただ、互換ROMではLinux+JE4 1995-12が起動できなかったのですが、これは上の方でBCCさんが指摘されていたMREALLOCが問題でした。これがMemory Control Blockを破壊してた影響でMallocから出てきませんでした。これを直したところ、なぜかリターンキーを押さないと先に進まないと思ったら、まだリダイレクションをサポートしてなかったのが原因だったのですが、そこはリターンキーを押せば通過して、起動しそうになった、と思ったけど途中でクラッシュした、と、思ったら-HIGHFIDELITYつけ忘れてたといううっかりがあったものの、-HIGHFIDELITYをつけて起動しなおしたら無事zimageも読み込んで起動まで行きました。
そのFMT_DOS.ROMはgithubに上げましたが、これでBCCさんのLinux起動しないですかね?
2024-04-27 09:21:34
すみません、githubの方がまだ更新されていないようです。
2024-04-27 19:09:38
すみません、今本当にPUSHしました。
2024-04-27 20:16:22
ソースコードの方は更新されているようでしたが、FMT_DOS.ROMはまだのようでした。DosboxとMASMを使って自力でコンパイルしようとしてもMASMのバージョンが違うのかエラーが出てobjファイルが作成できませんでした。
2024-04-27 23:46:42
すんません、この部分がいまいち自動化できてないもんで。(学生にはビルド自動化しろっていつも言ってるのに!) ちょっとこの際YSDOS.SYSとYAMAND.COMをビルドして所定の位置にコピーするまで自動化しますんで、ちょっとお待ちください。
2024-04-28 06:20:37
大変失礼しました。WATCOM CでWindows上からDOSのCOMファイルをクロスコンパイルする方法をやっと理解して、FMT_DOS.ROMのビルドからアセンブルまでbuild.pyでできるようにしたので、以後この手の間違いは減ると思います。COMMAND.COMのリダイレクトに対応(パイプは未対応)したので、Linux+JE2 1995-12は互換ROMからCD起動できるようになりました。Undocumented DOS、「なんでもっと早く買わなかったんだ!大体の内容は既に解明しちゃった!」と、思ったもんでしたが、今回はリダイレクト対応の仕方の説明があって助かりましたね。実はこの本の例題コードはバグってるんですが。ただ、何を探せばいいのかわかったので、FREEDOSのコマンドインタープリタを参照したところやり方がわかりました。
2024-04-28 08:43:54
MALLOCの修正とredirectionが実装されたROMでもVFS: Cannot open root device 00:00で止まってしまいますね。
DOS部分だけマーティーから抽出したROMに置き替えると問題なく立ち上がるので間違いなくYSDOSが原因のはずなんですが。
関係のない差異かもしれませんが、TownsOS上でLinuxパーティーション(ext2)を開こうとすると、実DOSだと「ドライブの準備ができていません」と出るのにYSDOSだと「システムエラー(/FFFH)」と返ってくるようです。
山川機長さんが書かれているとおりDMAやSCSIの問題なのかもしれないので、それとコールスタックのデバッグ情報も載せておきます。
pri cst
FR=000C:000078C9 TO=0110:0001D399 RET=000C:000078CB (INT 21,AX=4C00H DOS.Exit Program AL=Returncode))
FR=4958:00000031 TO=386D:000004A4 RET=4958:00000033 (INT 21,AX=4C00H DOS.Exit Program AL=Returncode)
R=39FE:00002E4A TO=386D:000004A4 RET=39FE:00002E4C (INT 21,AX=4B00H DOS.Load or Exec D:\LINUX\DOSBOOT5.EXE)
FR=0010:00108FBD TO=0010:0010A5E0 RET=0010:00108FBF (INT 80,AX=0070H)
pri dmac
CH00(FD ): MODE=00 BASEAD=00000000 CURRAD=00000000 BASECT=00000000 CURRCT=00000000
CH01(SCSI ): MODE=45 BASEAD=0001F000 CURRAD=0001F400 BASECT=000001FF CURRCT=FFFFFFFF
CH02(PRN ): MODE=00 BASEAD=00000000 CURRAD=00000000 BASECT=00000000 CURRCT=00000000
CH03(CD-ROM): MODE=00 BASEAD=00000000 CURRAD=00000000 BASECT=00000000 CURRCT=00000000
TFRSIZE=02 BASE=0 SELCH=01 DEVCTL=0000 REQ=00 MASK=0F
pri scsi
PHASE:BUSFREE
REQ:0 I/O:0 MSG:0 C/D:0 BUSY:0 INT:0 PERR:0
DMAE:1 SEL:0 ATN:0 IMSK:1 WEN:1
Selected SCSI ID:1 Last Data Byte:00H
COMMAND BUFFER: 08 00 00 00 02 00
SENSEKEY_NO_SENSE STATUSCODE_GOOD
TOWNSのDOS ROMは3.1なので参考になるか分かりませんが、MS-DOS 4.0のソースコードが公開されましたね。
https://github.com/microsoft/MS-DOS/tree/main/v4.0
2024-04-28 13:26:13
うーん、起動せんですか。残念。こうなるとDOSBOOTがコンソールに出してる出力が見たくなりますね、ということで、DOSのSTDOUTをキャプチャする機能を津軽に追加してみました。さっきPUSHしたソースで、デバッガ有効な状態で、ENA DOSSTDOUTCAP とするとキャプチャ開始、SAVEDOSSTDOUT filename で結果をファイルに書きだします。Linuxの起動が始まったタイミングでセーブしたら何て言ってますかね? MXで起動したときと互換ROMで起動したときでパラメータとか、読み込んだブロック数とか変化ありますかね?
Linux+JE4 1995-12 で互換ROMだとoverload以後は下のような出力になります。zimageってどうやらFDダンプですね。だとするとzimageの最初のとこはDOSを使ってたりするだろうか。メッセージの雰囲気として、このrootimageをマウントできてないっぽい感じですかね。
overload cdrom.fmt dosboot5 -i zimage root=0101 <nul$
Found Q:\TOWNS\OVERLOAD.EXE
dosboot5 -i zimage root=0101 ramdisk=1200 rootimage=0xed4000,1228800
Linux boot loader for TOWNS ver 0.5 copyright(c) TECO, 1992
V5.0 beta2
Now loading LINUX boot image (zimage)
parameter="root=0101 ramdisk=1200 rootimage=0xed4000,1228800"
717 blocks read.
Hit RETURN key the boot!
DOS4公開は僕も見ましたが、そのうちDOS3も公開されるかもしれないですね。まあ、そうなったらもっと再現性の高い互換ROMが作れるってことで。
2024-04-28 21:48:53
そうか。BCCさんのはHDから起動ですね。。。。。
あ、ひょっとして、 BOOT "/dev/sda1" みたいにダブルクオートつけてたりします? YAMAND.COMがダブルクオート正しく扱ってないことに気が付いて、試しにやってみたらKernel panic起きますね。今から直します。
2024-04-28 22:42:45
ソースがまだ上がってないですが先に、Slackware LinuxのTOWNS差分部分ファイルをちゃんと確認(README.DOC)したら「GNU General Public Licence に従います。」と書かれていることを見落としていたので上げておきます。
https://drive.google.com/file/d/1mFdpkEOXiJS2kbj_evqsl7VdUchMMbBX/view?usp=sharing
\TOWNS\Linuxフォルダ内にあるZIIMAGEというやつが該当する物と思います。
あと、上の方で言われていたネットワークカードのドライバ/ソースももしかしたらこの中に入っているかもしれません。\TOWNS\DOC\DEVICE\にあるETHER.TXTにはFM50L186/FM50L187/REX-3586/FM50L189という対応カード名が書かれているので、\TOWNS\FMD1\FMKERN.TGZ\FMKERN.tar\usr\src\linux\drivers\net\とか探したら該当ソースがあるかもしれません。
2024-04-28 22:42:45
ありがとうございます!ダウンロードしました。試しにうちのLinuxインストールHDのLINUXディレクトリを送っていただいたものと置き換えてみたのですが、Linux+JE4だと普通に起動してしまいますね。zimageの読み込みブロック数が777になったので送っていただいたzimageで起動しているのは間違いないです。また、ダブルクオートの問題かと思ったのですが、ダブルクオートをつけるとMXのROMでもrootのマウントに失敗するので違う原因のようですね。今のところDOSからLinuxに渡っている情報というとこのパラメータしか思いつかないのですが。
2024-04-28 23:53:03
山川機長さんの書き込みで気づいて原因がようやくわかりました。
BOOT.BAT内で「dosboot5 root=%1 townscd=polling <nul」と記載しこれをTMENU上でアイテム登録、パラメータに「/dev/sda1」としていたのが原因でした。
「dosboot5 root=/dev/sda1 townscd=polling <nul」と直接BOOT.BAT内に記載したら起動しました。
2024-04-28 23:59:01
おおなるほど!COMMAND /cでバッチファイルにパラメータを渡すとこがバグってました。直したバージョンをPUSHしたので、多分アイテムからも起動できると思います。うちの環境でもドライバを減らさないと起動しないので、ちょっとダイエットが必要そうですね。
ネットワークドライバありますね!RATOC REX-3586がサポートされたのは1996年の1月だったんですね。それだと1995-12のJE4には入ってないわけですね。どうやって使ったらいいのかは不明ですが、これで、RATOCカードのI/Oは7000Hまたは7100Hから、FM50L188/9は10A0Hまたは10C0Hから+7までを使ってることはわかりますね。そして、これはMB86965を使ってるんですね。ただ、僕は物理レイアの上がどうなってるのかよくわからないので、TOWNSのネットワークカード用ドライバを自力で書く自信はまったくないのですが、一歩前進した気がします。
2024-04-29 05:46:43
DOSメモリに関してですが、[設定]→[辞書管理]→[かな漢字変換領域の確保]を「する」にしないと、OAK0.SYSが79KBも余計にDOSメモリを使ってしまうようです。デフォルトが「しない」になっているらしく、その場合、CMOSの32B2hの下位2ビットが0になっていて、そのバイトは、INT 8EH AH=00Hで返されるデータの+23H (未公開バイト) に書き込まれて、OAK0.SYSはこの下位2ビットをチェックして、3だったら10Hパラグラフ、それ以外だったら13E8Hパラグラフを取ってしまうようです。
それでもまだアイコンから起動させようとすると足りないですね。AUTOEXEC.BATの中とかから起動だと初期のコマンドインタープリタで起動するので平気なのですが、COMMAND /cで起動すると一個余計にCOMMAND.COMを開いてしまう影響で微妙に足りないようですね。
2024-04-29 09:55:34
ご無沙汰しております(女B)。
最近は忙しいわけでもないのにこちらにも顔を出せておらず、ご心配をかけたかもしれません。
本当はMIDIカードの解析の時に顔を出そうとしていたんですが、Oh!FM TOWNS 1993年6月号「INSIDE TOWNS」のMIDIカード仕様をテキストに起こしている間にこちらの掲示板で解析が進んでしまい、結局そのテキストもお蔵入りしてしまいました。FMT-401のI/OポートとかMIDI IN 2~4、OUT 3~8、フットスイッチに関する情報も載っていて現在では得がたい情報ではあるのですが。
>698 山川機長さん
辞書管理から設定できる「かな漢字変換領域の確保」はMS-DOSでいう「アプリ領域」の設定のどれかと一緒で、「する」に設定するとコンベンショナルメモリより上位のメモリ(とはいっても0x000C0000~0x000CFFFFはないと思いますが)にOAK0.SYSが逃げてくれます。これは確かDOS3からそういう仕様で、DOS5/6(DOS6ベースT-OS含む)だと別の方法(確かOAK0.SYSに/Eだったか何かオプションスイッチを付けるはず)でEMSメモリに逃がすように変更されています。
2024-04-29 23:32:45
YAMAND.COMですが、いくらCコンパイラだからって本来10KBもあれば実現できるはずのものがなんで22KBも食ってるのか調べたところ、WATCOMのCランタイムライブラリがごっそり食ってることがわかったので、fopen, fclose, printfなどを使うのをやめてDOSの機能を直接使うようにしたところ、14KBぐらいまでに減りました。多分もう少し減らせそうですが、とりあえずTowns MENUのアイテムからBOOT.BATを起動してもメモリ不足になりにくくなったと思います。
> りうさん
おおなるほど!Oh!TOWNSの1996年6月号ですね。それは手元にあったはず。というか、確かにMIDIカードについて載ってますね。だから目次を作っておけばよかったものを。。。(途中で止まっちゃった)実装が間違ってないかあとで確認してみます。
しかし、さすがにネットワークカードのI/Oと使い方について書いてた号は無いですよね。手元にRATOCのネットワークカードがあるのですが、TOWNS OSから使えなくて持ち腐れになってるんですが。
辞書管理はそういう意味だったんですね。MXが現役だったころは気にしてなかったのでまったく気づきませんでした。
貴重な情報をありがとうございます!
2024-04-30 12:06:01
ぎゃああああ鯖鰓で書いた中身が全部翔んで埼玉ぁぁぁぁorz
>700 山川機長さん
TOWNS用LANカード(FMV-TOWNS用のFMV-181/182/183/184の制御方法はFM50L188/189と一緒です。いや逆か?)のドライバはTOWNS用Linuxにもあったはずですし(実際のところは未確認)、DOS6ベースTownsOSであればNDISドライバ(RATOCのカード用のものはRATOCのサイトで現在でも配布してい…るといいな)+FMR用MSLANMANとかODIドライバ(でいいんだっけ?)+NetWareクライアントとかの組み合わせで行けます。うちでは実際に前者でSCE版nasneを介してFMV-TOWNSとモデルMX間のファイルのやりとりをしています(FMV-TOWNSのTOWNSモード用NDISドライバを見たことがないので、ODIドライバ+某ツールを使ってはいますが)。
2024-04-30 13:08:16
あれ?僕もなぜか昨日書き込んだはずの内容が書かれてないですね。最近サバエラ多いですね。
RATOCのドライバなんですが、今だとWindows 95用ドライバしかダウンロードできないんですよ。archive.orgのWayback Machineでも2000年ぐらいまでしか遡れなくて、DOS用ドライバは既にダウンロードできないんですよね。Windows 95かLinuxで使えば使えると思うんですが。
なお、YAMAND.COMはその後の調査で、Open Watcom 1.9のdup, dup2, getcwd関数が必要ないのにmalloc/freeをリンクしていることがわかり、さらに、なんと、int main(int argc,char *argv[])とすると、argをヒープに展開するらしくmalloc/freeにリンクして、合計3KBぐらい使うことがわかって、そのへんを直して11KB程度まで小さくなりました。ここまで小さくなったらあとはまだ書いてない機能を足してもそんなに大きくなることは無さそうです。
2024-05-01 00:44:03
互換BIOSでTMENUからもインストールしたLinuxが起動するようになりました。ありがとうございます。
Twitterで見かけたのですが、OpenWatcom C Ver2.0でTOWNS用RUN386で動くEXPアプリが作成できるようなのですが、time.hに記載されている関数・sprintf()・fprintf()を記述すると互換BIOSだとフリーズするようですね。自分は実際に試していないのでどうなっているのかはわかりませんが。
REX-3586のDOS(ODI)ドライバはRATOCのドライバ内に入っているREX3586.COMというファイルだとは思います。
Another TownsのCD内にFM TOWNS用のTCP/IPアプリ(ping、ftp等)を移植した「TOWNS(DOS)用ダイアルアップ接続アダプタ&TCPIPライブラリ」というのを見つけたのですが、LAN環境でREX-3586を使う際のドライバファイル名はこれが記載されてます。
2024-05-01 01:31:13
>702 山川機長さん
RATOCのカードがREX-3586/7なら↓なんですが、今でもDOS用ドライバ込みで配布されているようです。
https://www.ratocsystems.com/services/driver/lan/3586.html
そういえばFTOWNSにTCPIPFMとかいうのがあったなー…何もしませんでしたが(ばく
2024-05-01 12:17:51
>りうさん、BCCさん、
そのファイルなんですが、NetWareのドライバとあるんですが、このドライバを組み込めばDNSからIP取ってきてネットワークに加わるところまでできるもんですかね? 僕はネットはSOCKETライブラリから上しか使ったことがなくてドライバレベルのことがよくわかってないのですが、NetWareってTCP/IPと違うものかと思ってたんですが。自力でSOCKET使ったコードさえ書ければいろいろ調べられると思うんですが。
りうさんの書き込みから探したところ、↓に行きついたんですが、
https://hp.vector.co.jp/authors/VA018718/towns/towns-tcpip-faq-091.txt
これによると、「TCPIPFM のプロテクトモード版ライブラリは、32bit版 Wataloo TCPライブラリ (GCC版) を High-C 1.7/1.4 で動作するように移植したものです。」とのことなんですが、これってgithubにあるみたいなんですが、今からでも移植したら使えるもんですかね。SOCKETが使えるようになりさえすればいろいろできることが増えると思うのですが。
しかし、多くのTOWNS用プログラムが散逸してしまったのが非常に惜しいですね。僕もOh!FM TOWNS終了あたりで後ろ髪を引かれる思いでメインをWindowsにしてしまったので人のこと言えないんですが。
まったく別の問題でFM-7をネットワークにつなげないかという話が上がってはいるんですが、これってさすがにまだ実現した例無いですよね? ネットワークつきのArduinoとのインターフェースを作ればネットにつながったことになるのではないか、と、いう道を模索しているのですが。でもサーバーPCを介すると反則だから、Arduinoだとネットにつながったと言っていいのかなあ。。。
2024-05-02 01:03:39
自分の言った「TOWNS(DOS)用ダイアルアップ接続アダプタ&TCPIPライブラリ」とたけがみさんの言ったTCPIPFMは同一の物と思うのですが、FTOWNSのサイトで配布されていたようですね。既に閉鎖されていますがInternet Archiveには残ってました。
https://web.archive.org/web/20010614032507/http://www.nifty.ne.jp/forum/ftowns/
「TCP/IP for TOWNS」→「ダウンロード」→「TCP/IP for TOWNS Ver 0.02 フルセット (1,298KB)」で実行ファイルとソースがダウンロード可能。
これにNetWareドライバとLANカードのドライバを組み合わせることでネットワーク接続ができるような感じだと思うのですが。
FMR/TOWNS用のNetWareドライバ(FMRWS_1.EXE/FMRWS_2.EXE)はここから入手可能のようです。
https://ftp.zx.net.nz/pub/archive/novell/clients-jp/
話逸れますが、山川機長さんがCDが劣化していると言っていた『挑戦!Linux「基本操作s&日本語環境構築』を自分も200円だったので購入してみましたが、案の定白濁化していてそのままではイメージ化できませんでした。
ですが、ドライヤーでチリチリになるまで温めてティッシュで押し付けたところ白濁部分が減少し、読み取りが遅かったもののイメージ化に成功しました。
2024-05-02 01:16:50
>705 山川機長さん
https://strawberry-linux.com/catalog/items?code=36012
↑
「この辺りを使うとFM-77あたりでもネットワークに接続できるかも」と考えたことが有ります。
ネットワークに関する知識が著しく低いので手は出せずに居ましたが、なんとかなるのかな?
MSXのネットワークカード制作などを見るとカニチップを搭載していたりするのですが、今ならこっちの方がネットワーク関連をチップが面倒を見てくれるので楽かも知れませんね。
2024-05-02 09:16:16
>706 BCCさん
CDの劣化ですが、そんな方法もアリなんですね。表面上の傷は過去に液体コンパウンドで磨いて消したことは有りますが、それも良い方法かどうか解りません。(手元に有った物で対処したので)
過去に買ってきたCDが透明で、「??? こんなCDも有るのかな?」と思ったけどやっぱり認識しなかった事は有ります。記念に置いてあると思います。(ダンジョンマスター)
2024-05-02 15:05:55
貴重なファイルがそんなところにあったとは!ChatGPTに聞いてもわからなかったのに、さすがです!CMUは再来週から夏休みに突入するので、RATOCのLANカードをネットに接続できるかやってみます!
花小金井3丁目さんによると、文教モデルは結構LANカード付で出荷されたような感じがしてますが、案外LANカード刺さってるけど眠ってしまってるTOWNSも多いんでしょうかね?
2024-05-03 03:18:22
>705 山川機長さん
RATOCのドライバはDOS用のNDISドライバやパケットドライバも入っているようなので、パケットドライバを使って(NetWare ODIドライバを使わずに)TCP/IP for TOWNSを動かすことも、(コンベンショナルメモリを大量に消費しますが)DOS LAN ManagerでTCP/IPを有効にして使うことも可能かと思います。
NetWare Clientを使うのはドライバが配布されていない富士通のLANカード(20年ほど前にヤフオクで割とたくさん出品されてました)でTCP/IPやLAN Managerを使うときの代替手段です。純粋にファイルサーバのクライアントとして使うならNetWareが一番使い勝手がいいと思うのですが。
2024-05-03 20:03:37
富士通純正カードのODIドライバは、
FM50L186/186A/187/187A: FMRLAN.COM
FM50L188/189, FMV-181/182/183/184(VTOWNS用): FJN00F.COM
FM50N183, FMV-J181(共にモデルSN用): FJP00F.COM
となっています。FMRWS_1.EXE/FMRWS_2.EXEにはFMRLAN.COMしか入っていないようです。VLMFMR1.EXEの方にはそれ以外のドライバも入っています。
2024-05-03 21:24:18
> BCCさん
僕もドライヤーメソッド試してみようかと思ったのですが、完全に破壊してしまう可能性もあると思って、最後にもう一度読ませてみたら、なぜか今日はリトライひとつなく読んでしまいました。見るアングルによって白濁が見えたり見えなかったりするので、ドライブの機嫌によって読めたり読めなかったりするのかもしれません。ということで、ディスクイメージができたので、インストールしようかと思ったらDOS6+EMM386環境で試したらクラッシュしますね。原因を調べたところ、現状ではキーボードコントローラがデータをCPUに送る間隔を最低1/600秒にしているのですが、こうすると
DOSINST5がキーボードBIOSをリセット→4バイトのデータ発生→1バイト読んだところでEMM386終了→キーボード割り込みハンドラ消滅→4バイトの残りのバイト送信→クラッシュ、
と、なってしまうのですが、この間隔をゼロにすると、
DOSINST5がキーボードBIOSをリセット→4バイトのデータ発生→4バイト次々に読んでしまう→EMM386終了→キーボード割り込みハンドラ消滅するけど関係ないので続行
と、なるようです。考えてみるとキーリピートの間隔は1/600秒ということですが、キーデータ読み取り後1/600秒待つという意味ではないので、ここでその間隔待つ必要は多分無いのですが、1/600秒待つように書いたのは何か理由があったのではないかと思ってここまでの開発の記録を見ても(そもそも長すぎて全部読めないけど)それらしいことは書いてなくてゼロにしてしまって他に副作用が出ないのかどうかちょっと心配ですね。
一応、キーボードにコマンドA3を出してからデータが帰ってくるまでの時間を実機で計測してみようと思ってますが。
2024-05-05 10:33:24
訂正:1/600秒はキーリピートじゃなくて、9600bpsから1 wordのタイミングですね。ということは、正しくは1/1200秒だった。
そのように修正したら通過しますね。そして、でもクラッシュすると思ったら -FASTSCSI オプションつけてたからでした。それはずしたら起動するようになったんで、インストールできそうです。
2024-05-05 12:42:43
MIDI出力実装おめでとうございます。
こちらでいろいろ試したところ津軽でソフトウェアMIDI以外に、外付けMIDI音源も鳴らすことができました。
津軽からはMIDIポートマッパー固定で出力されるようなので、ポートマッパーの出力先を変えるソフトで外部と繋ぎました。
確認したのはGenocide2の3面までとTownsOS V2.1L51上のGSPLAY/Pureです。
Windows95からはやり方が悪いのかソフトMIDIか内蔵MIDIになりうまくいきませんでした。
こちらはメディアプレイヤーとTMIDI PLAYERでやってみました。
以上ご報告まで。
2024-05-06 21:40:28
すみませんポートマッパーではなくMIDI Mapperでした
2024-05-06 21:58:52
すみません、誰かLinux+JE4 1995-12を実機で実行できる人いますかね? ディスクイメージ自体はLinuxなのでarchive.orgから罪悪感ゼロでダウンロードできると思うのですが、うちのTOWNSはCD-Rだと読んでくれないもので。
どうも津軽が5~6回に一度Linux+JE4 1995-12の起動に失敗するので解析してどこで詰まってるのかまで解明したのですが、どうもsysvinitのversion 2.4にはバグがあって、子プロセスを起動してから、子プロセスを記録してるstructにpidを書く前に子プロセスが終了してしまった場合止まってしまうようです。2.57bでは直ってないようです。2.88のソースではそのバグが修正されているのを確認したのですが、2.57bと2.88の間のどのバージョンで修正されたのかまでは特定できませんでした。
一応僕としてはこれは津軽の問題ではなくsysvinitの問題であると見てほぼ間違いないと結論に至ったのでほっといて次に進もうと思うのですが、そうであれば実機TOWNSでもLinux+JE4 1995-12のCDからの起動は数回あるいは十数回に一度は失敗するはずなので、それを確認したいのですが。
多分、子プロセス起動~pid保存までの間に子プロセスが終了してしまうという事態は子プロセスがディスク上のファイルであればほぼ発生しなかったと思います。ですが、CDから起動する場合、initが起動するプロセスはRAM Driveに書いてあるため、ディスクアクセスのオーバーヘッドが無く、高速起動してしまうのでこの問題が顕在化したものと思います。
2024-05-10 13:25:41
Linux+JE4 1995-12ですが、HCとモデル2で状況が違った結果となりました。なお、どちらもドライブが万全ではない可能性も有りますのでその点は考慮してください。
モデルHC→5度程度テストを行いましたが、高速モード,標準モード共に開始後各種ドライバの読み込み画面後にカーネルダンプが表示されて停止します。
モデル2→10度程度テストを行い、1度だけ最初に画面がクリアされた後に何も表示されずに停止(CDドライブが停止),他は問題なくログイン画面が表示されます。
モデルMXはドライブの調子が悪くテストを行っていません。(他のCDからの起動や読み込みも出来ないことから除外)
お役に立ちますでしょうか?
2024-05-14 00:08:45
おおなるほど。実験していただきありがとうございます!モデル2で10回に一度失敗したというのは、止まってる場所は違うようですが、多分Race Conditionのチェックが甘い個所が他にもあるということかもしれないですね。
HCで起動しないのは意外ですね。ただ、ハードディスクにインストールしたものだと、-FASTSCSIをつけて起動するとカーネルダンプになる場合があるようなので、この場合はCDですが、何か反応が速すぎるものがあると失敗するのかもしれないですね。HCだとさすがに標準モードにしても何か速いままになってるものがあるのかも。
とりあえずLinux+JE4の問題は津軽側でなんとかする必要のあるものでは無さそうという可能性が高まったように思うので、安心して(?)放置しておこうと思います。ありがとうございました!
2024-05-14 23:19:50
Pull requestを送っておきましたが、Youtubeのコメントで「津軽だとあすか120%動かない」という話があって、製品版は持っていないので実際に確認したわけではないですが天晴Vol.2に収録されている体験版と同じ症状であればマウスを接続したままだと対戦画面でフリーズする現象がある(エミュの問題ではなく実機でも同じ)ようなので新たにApplication-Specificを設けてゲームポートにマウスが接続している場合は抜くような設定を追加してはどうでしょうか。VM起動中にマウスをオフにすればいいだけなんですけど、この現象が分かっていないとそのような対処方法があるのを知らないまま津軽側の問題だと誤認する可能性が高いので、Application内の設定で用意されていれば見つけてくれるかもしれません。
2024-05-14 23:47:47
>718 山川機長さん
Linux+JE4 1995-12がHCで動かない原因はよく解らないのですが、スクリーンの推移ではSCSIの認識後にカーネルダンプが出るように感じます。(速すぎて見れない)
気がかりなのは我が家のHCはメモリが最大容量(104MBなので、そっちの原因かも知れません。(カーネルの更新履歴を見ていたら過去に64MB以上を搭載した際に不具合が有ったようです)
SIMMを外すだけなので時間が取れたら試してみます。
2024-05-15 08:59:06
自己レスです
>>714でWin95上から外付けMIDIを鳴らせなかった件ですが自己解決しました。
手動でWin95のハードウエアウイザードを実行したところ正常にデバイスがインストールされ、MIDI OUTが使えました。
スロットに実装されるだけではWin95の場合動作しないのでしたね。
こちらの件、スレッドが適切でなかったようですみません。
前回の投稿で津軽に問題があるように誤認されると困るので今回はこちらのスレッドに投稿します。
なお、私のHCはFastモードにするとCDDが正常動作しないのでlinuxは試せませんでした。ご了承ください。
2024-05-16 01:02:52
BCCさん、
たしかに、この問い合わせ多いんですよね。ありがたく、Mergeさせていただきます。いずれデフォルトでアプリケーション自動判別しようと思っているので、このオプションプラス自動判別にしたらこの問い合わせも減るかもしれません。
ここ数日、CPUコアで、ひとつのインストラクションの中で何度もオペランドサイズやアドレスサイズをチェックしてるところをチェックを減らすように書き替えたり、割り込み処理で連続Push/PopをまとめてPush/Popするように書き替えたりして、うちの3年前のPCでWindows 95のぷよぷよ通がそれなりにプレイ可能なスピードになったので効果はあったようです。タイムバランスを見るとあまり変わってないのですが。ぷよ通、しばらくプレイしてなかったので腕がなまってましたが、なんとかレベル5までコンスタントに行けるところまで回復してきました。
A列車で行こう・レジェンドパックができないか、と、思ったけどこれはXP/Vista用だったか。残念。
2024-05-17 13:40:26
動かす意味があるのかはわかりませんが、オープンソースのOS「OSASK」というものにFM TOWNS版があるようで起動させようとしてもシステム読み込み中のまま停止してしまうようです(互換BIOS使用、HIGH_FIDELITY設定)。
フロッピーイメージのダウンロード先
http://osask.net/d/download/download1.html
2024-05-18 23:54:21
おおなるほど。それは是非保護(?)したいですね。ただ、ハードウェアによるタスクスイッチング機能は必要最小限しか実装していないので、もしもそれを使っていたら難しいかもと思う反面、ソースがあるので、何を期待しているのかある程度推測することができるのはプラスですね。今週木曜まで旅行中なので、戻ったら見てみます!情報ありがとうございます!
2024-05-21 23:44:03
先ほどのOSASKリンク先だとダウンロードが不安定なようなのでこちらから
http://osask.net/d/download/index2.html
マーティーBIOSで起動させようとすると「386 16-bit INT gate not supported」とのメッセージでAbortするようで、やはりタスクスイッチを使用しているようです。
もう何点か、津軽のGUI版でModel設定をMARTYに変更してスタートすると何故かGUI上の設定が全て反映されなくなってしまうようです。
あとFREQの設定値が津軽の設定ファイルを消すと40が初期値で入りますが、あまり高速なCPUを積んでないPCだとこの値は厳しくて、適切な設定値が分からない人がそのまま起動し処理落ちや音割れに見舞われたり、FREQ 20でもメモリアクセスが実機よりも高速なため実486 20MHz(FM TOWNS II HR)機よりも早く動くんで下げても問題はないかと思いました。
2024-05-22 22:16:11
正確には、機種IDをMARTYにしている場合はBIOSもマーティーのものに変更しとかないとその他の設定が反映されなくなるようでした。
2024-05-22 22:26:48
一応、OSASK、ランチャーのGUIまで出るようにしました。起動画面まで見れます。が、何か選ぶと、
LOOP: TEST EAX,EAX
JNE LOOP
の無限ループで何かを待ち続ける状態になってしまいますね。おそらくIRQハンドラ内でEAX=0としてリターンするとかだと思いますが。うーん、何が足りないのか。
2024-06-01 11:52:17
あれ?今やったらOSASKでプログラム起動するじゃん、と、思ったら、これ.JPGとか.TXTをダブルクリックして開こうとすると無限ループに陥るっぽいですね。でも、.BINファイルは実行できるっぽい。INVADERとか起動したし。操作方法がわからんかったけど。実機でどうなるのかやってみりゃいいのか。
2024-06-01 13:13:22
なんてことだ。.JPGダブルクリックで普通に表示されるようになっちゃった。さっきまでの無限ループ起こらなくなってしまった。一応、OSASKもサポートできたっぽいということで。半角フォントの表示がまだおかしいかな?
2024-06-01 13:47:12
ちなみにOSASKのドキュメント内に気になる記述があって、CX以降であれば確実にCompact Flashカードを読めるらしいんですね。コードを解析すれば読む方法がわかるかも。ちょっと世の中おもしろいことが多すぎてなかなか手が回り切らないですが。
2024-06-01 22:54:17
OSASKの起動、おめでとうございます。
CompactFlashカードの件、下記リンクのPCCTOOLを用いた実験では過去にHCでPCMCIA_SDカードで読み書き可能でした。
EXPプログラムに仕立てようと考えましたが未だ未着手ですが。
http://oswiki.osask.jp/?pcctol
2024-06-03 09:24:50
YM2612(陸奥ではYM2203)のエミュレートでSustain Levelテーブルが-3db毎に変化し最大値だと-45dbとなってますが、実際は-42dbから一気に飛び越して最後だけ-93dbのようですがどうでしょうか。
同じチップが載っているメガドライブの開発資料、OPN系の仕様書いている記事、その他エミュのソースコードでもこのように実装されているのでこれが正確かと思います。
https://est.ceres.ne.jp/2020/12/16/opn-params/
https://lipoyang.hatenablog.com/entry/20131112/p1
ソースコードの該当箇所だと
void YM2612::MakeSLtoDB100(void)
{
for(unsigned int SL=0; SL<15; ++SL)
{
SLtoDB100[SL]=SL*300;
}
SLtoDB100[15]=9300;
}
このようになるはず。
2024-08-22 14:42:47
おおなるほど。デシベル値は、そのようにすると実機に近くなるっぽいですか?
2024-08-27 06:48:50
これに該当する音色(各オペレータSLに15が設定されるトランペット)が流れるTownsOS付属のEUPを流したところ、出だしのトランペットが弱まり、-45db時よりは早く減音することは確認できました。
が、この変化が実機通りかはまだ定かじゃなく、記憶だと-45dbが近いような気もしてくるんですよね。
EUPプレーヤーのVELOCITYメーターの動きと音の流れが-93db時の方が近い、うんづでも-93db相当の音で、結構思い出補正も激しいんでマーティーでもいいから実機確認もしてみます。
2024-08-27 12:19:14
実機(マーティー)で該当曲を鳴らして確認しましたがやはり-93dbの方が実機に近い印象でした。
2024-08-27 20:50:05
なるほど!では、修正も簡単そうだし、そのように変更してみましょう。僕も変更前と変更後で何曲か聞いてみますね。
2024-08-27 22:27:44
津軽でMIDI音源がリセットできないというのを見つけて、MIDIの知識がなくて前に提示したソースでは0xF0から始まるMIDIメッセージも長さが2バイトという扱いにしてましたが、これはシステムエクスクルーシブという音源(GS・GM・XG等)固有のメッセージのようでF7の値がくるまで長さが可変のメッセージデータなんですね。
https://dtm-hyper.com/midicc/sysx.html
0xf0だったらf7がくるまで配列に貯めてmidiOutLongMsgで出力するようにすればよさそうです。
http://www.sm.rim.or.jp/~shishido/midimsg.html
2024-11-25 02:36:14