FMTowns新エミュレータ Tsugaruの情報交換用スレッドです。
Tsugaru : http://www.ysflight.com/FM/towns/Tsugaru/j.html
2020-07-28 12:41:40
お世話になります、鈴木です
ご連絡が遅くなりまして、申し訳ございません
(マトモな労働環境ではないのでようやく解放されました)
>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
他愛もないない事から、悩み事までなんでもお書きください。
では、手始めに私の困ったことから。
我が家のTowns・・・ モデル2FとMXとHC(MXは実家に置き去りにしていますので手元には無い)ですが、MXとHCはCD-ROMが弱っているようでCD-Rが読めなかったり、
特定のCD-ROMから起動できなかったり・・・・ FDDはメディアが悪いのか,安定しない状態です。
かといってSCSIのCD-ROMドライブを持っている訳でも無いので、Windowsとのデータのやり取りに苦慮する場面がチラホラとあります。
真剣に内蔵CD-ROMを何とかする手だてを考えないといけないのだろうか・・・・ みなさんのTownsの状況は如何ですか?
2020-07-29 10:03:48
どむやまさん、
いつか私も使えるレベルまで上がれば、と思いつつダウンロードさせて頂きました。
ありがとうございます。
モニターの記事も、初めて知る事ばかりで興味深かったです。
評判の良い9.7モニターは私も購入しまして、実際に他機種用としてとても良かったのですが、
個人的に2大”液晶モニターを拒むTownsゲーム”と思っている、雷電伝説とスーパーリアル麻雀P2&P3(プラスでは無い方)は、
前者は下側が切れて、後者は表示すらされませんでした。
私も書き換えをやってみようかな。
2023-02-18 22:17:39
aochanさん、ご報告ありがとうございます。
gccは今確認したらアカウントがロックされていてダウンロードできなくなってますね‥
githubにでも上げなおそうと思います。
townsのc開発については書籍がほぼ無いようなので、大変かと思いますが一緒に頑張っていきましょう!
9.7液晶に対応した書換ソフトも用意できたので、映らないソフトウェアに対応できるか私も調査してみます。こちらもまたアップしますね。
2023-02-21 23:30:22
TOWNSとPC-98にmemtest86を移植したので、お知らせします。
https://mcdom.blog.fc2.com/blog-entry-5.html
TOWNS版ではFDDからの起動処理に、山川機長様のFDブートローダーを参考にさせていただきました。
また、製作中のデバッグには「津軽」のデバッグ機能が大活躍しました。津軽最高ですね!
BEEP音やクロック数取得対応など、積み残しは沢山ありますが、とりえあず最低限のテスト動作はするようです。
もしお気づきの点やBEEP音の鳴らし方、実クロックの取得方法などご存じでしたら皆様ご教授ください。
>aochansさん
9.7液晶で確認してみましたが、雷電伝説は水平周波数32.3/垂直周波数60.3 768x512の設定を追加すると画面切れなく映るようになりました。
スーパーリアル麻雀P2&P3は736x480の解像度っぽいのですが、水平ブランキングを削りすぎているのか9.7液晶では映るようにはできませんでした。
mstarチップ搭載の液晶では表示できるのですが・・・残念です。
2023-02-28 20:19:16
> BEEP音
I/O 60h の SOUND ビットをセットするか、メモリ 000CFF98 をリードすることで鳴ると思います。
もしこれで鳴らない場合、PITのチャネル2の周期を設定してやる必要があるかと(PITの矩形波出力がミキサー経由でスピーカーに繋がっているので)
46h に out してチャネル2を選択し、44h に2回 out してカウント数をセットするのですが、これは津軽のI/Oモニタで 44h, 46h をモニタし、DOS等が設定している様子を見るのが一番楽だと思います。
2023-03-02 21:02:57
>pinさん
おお~、情報ありがとうございます。
津軽にはI/Oモニタまであるのですね!
PC-98版ではPITのCh:0インターバルタイマを利用してPentium以降のクロック数取得ができるようになったので、
TOWNS版も同じ対応でいけるか試しているところです。
BEEPも対応できたらまたgithub更新します。
2023-03-03 20:46:03
FM NOTEBOOKだけかもしれませんが、
FM NOTEBOOKシリーズプログラミングマニュアルではブザーBIOS(INT 9EH AH=03H)を使用するときは、次のようにしてねと記載されていました。
発音数分ループする{
BIOSを起動し(AH=03H)、カウンターによる発音を行う
{
BIOSを起動し(AH=04H)、現在のブザー情報を読む
}設定時間≠0ならループ
}
モニター情報もありがとうございます。
やはりスーパーリアル麻雀は変わった解像度だったのですね。
紹介してくださっている書き換え基板のうち、DSUB15ピンのある方を注文しました。
LCD-8000VがMStarだったような。
こちらは雷電伝説、スーパーリアル麻雀共に表示可能です。
以前LCD-8000Vの液晶パネルを1024x768のパネルに交換したのですが、左上に少し小さく800x600の映像が表示されるだけでした。
書き換えでフル表示や、逆に800x600のパネル内に拡大無しの640x400を表示出来るようにならないかなど、試したくなってきます。
2023-03-04 13:57:39
aochanさん、ありがとうございます。
プロテクトモードに移行したあとだとリアルBIOSは呼べないようなので、ご紹介いただいた方法は使えなさそうです。せっかく調べていただいたのに申し訳ない。
書換基板ですが、その後の調査により基板無しでRTD2556の書換方法判明したので無くても大丈夫です。書換用途の為だけに購入されたのであればキャンセルしてもらったほうがお得かも。書換えツールもgithubで公開しますんで。情報提供遅れてすみません。
LCD-8000vをお持ちで羨ましい。私は情報得た頃には販売終了してまして、結局手に入りませんでした。また書き換え結果など教えてくださいね。
2023-03-05 18:23:36
> その後の調査により基板無しでRTD2556の書換方法判明したので無くても大丈夫です。
なんと。急がず一度お伺いしてから購入すれば良かったかもですね。
せっかく注文した事ですし、キャンセルせずに到着を楽しみにしたいと思います。
LCD-8000Vはノングレアである事や、スーパーリアル麻雀の表示が可能なことを除けば、9.7液晶の方が良さそうです。
タイルパターンも奇麗に見えますしね。
4:3の液晶へ接続する場合、白TOWNSですと640x400の映像が縦に引き伸ばされにくいですし、
灰色TOWNSでも救済IPLから起動すれば、ゲーム画面は16:10を維持してくれますし(下側に関係ない映像が表示されてしまいますが)TOWNSには良いかもです。
2023-03-05 23:16:53
どむやまさん
ついに9.7液晶で雷電伝説の表示が出来ました。
csv出力プログラムが無ければやり切れる気がしませんでした。
ありがとうございます。
スーパーリアル麻雀の方は、私も出力なし表示から抜け出せませんでした。
交換可能なMStarのボード(できればS端子付き)があれば、入手したくなりますね。
WINDYさん
救済IPL対応ソフトウェアリストの変更をお願いします。
サーク2、パラメデス、プリンスオブペルシャ、ザレジェンドオブキランディア
の4本は現在のICカード版で◯になりました。
FD用の最新版は試していません。
サーク2のみSCSI-CDのオーディオOUTからTOWNSのオーディオインにケーブルを接続する必要があります。
これをすることで、お店に入った時にCD音がミュートされるようになり、FM音と被らなくなります。
2023-03-21 21:49:05
現在Windows 3.1の起動までこぎつけられないかと思ってCPUコアをいじってるのですが、まずLARインストラクションで詰まってたのでそれは単にLARを実装して突破したのですが、INT 91Hで詰まってます。
どうやら、Windows 3.1は、リアルモードのバイナリのうち処理を奪う必要がある個所に 63H (ARPL)を書き込んで、Virtual 86モードでINT 6を出させて処理をいったんカーネル側に移して、その後、IP+1から処理を再開、としているようです。最初ARPLを見たときは何かの間違いではないかと思ったのですが、最初のうちそのままで順調に進んでいるようだったので、どうやらARPLを書き込むこと自体は正しいようです。ARPLが書き込まれる場所の多くは、書き込み前は90H (NOP)になっているのも多分この書き換えが意図的なものであると考えて問題なさそうです。
INT 6ハンドラは、0048:00000102ですが、どうも169Cセグメント(DOS?)内でARPLが起きることを想定しているようで、INT 6を受けて、Exceptionが起きたインストラクションが63Hであった場合、Exception発生個所+2バイトに飛び、その場でリアルモードへの切り替えが起こるように書いてあるようです。0048セグメントはひょっとするとEMM386かも。
しかし、あるタイミングでIDTが書き換わって、INT 6をハンドルするのが0028:80006E5Cに変わり、再度0048:00000102に変わった後で、INT 91Hのハンドラの入り口(07F9:000023F4)のARPLでINT 6が出た後、00B8セグメントのあらぬ場所にジャンプしてクラッシュしてます。INT 91Hのハンドラは先頭にARPLが書かれているのですが、+2バイトではリアルモードに切り替わるように書かれていない上に、00B8セグメントのベースは169C0Hを指したままなので、違うセグメントの無意味なアドレスにジャンプということになってます。
MSDOS.SYS以外のINTのARPLは0028:80006E5Cだとうまくさばけるようなので、IDTが書き換わるべきではないのか、INT 91Hは別の処理の仕方であるべきなのか、そもそももっと前の時点で何かがこわれててINT 91Hが出るべきではないのか、なかなか難しいですね。どうもこの INT 91H (コンソールBIOS) はコンソールに1BHを書き込もうとしてるようなので、すでにコンソールは表示されていないことを考えると実はINT 91Hが出ていること自体が間違ってるのか。
なお、Core i9のPCを買いました。最近シングルコア性能は世代が変わってもほとんど変わらんと思っていたのですが、案外変わってたんですね。多分486SXの66MHz近いスピードが出てるようでStrike Commanderが快適になりました。ただ、nVidiaのGPUだったので、OpenGLのVSYNC待ち(なぜかnVidiaはデフォルトでオンにしている)をオフにしないと待ちが入ってスピードが落ちるという問題がありました。
2021-01-21 00:40:27
ありがとうございます。参考にさせていただきます。たしかにMAMEのデバッガで正しい動作がどうなのか追ってみるのも手かもしれませんね。
2022-02-16 12:13:56
MAMEで動くのならCPUでしょうか。
CPUで気付いた点で、おそらくほとんどのプログラムに影響しないのでわざわざ報告するのもなぁと放置していた点が何点かあって、
・NEGがAフラグを変更しない
これに依存するプログラムはおそらく地球上にはないので、こっちはどうでもいいと思います
・オペランドへのストア前に状態を更新している
ちゃんと検証できていないのですが、 push/pop mem で PF が起きるとページをマップして再実行した結果、esp が本来の倍変化するのではないかなあと思っています
2022-02-17 01:26:02
なるほど!CPUコアの問題であることは間違いないと思うのですが、現状津軽のCPUコアはFractal Engineを走らすための必要最低限のExceptionしか対応していないので、多分PUSHでExceptionが起こるとそのままVMがAbortしてしまうかも。
が、考えてみるとWin3.1の問題個所ではPFが出るかと思ったらCS,EIPその他をスタックに詰めないのでDouble Faultになりそうな気がしてきました。実はここはDouble Faultを出すと先に進んだりして。というか、それだとするとやっぱり真面目にInstruction Fetchの段階でもException見ないといかんのかな。これを入れるとTownsネイティブアプリに効いてきそうでちょっとやだな。
2022-02-19 00:02:59
おそらく需要がゼロと思われるWindows 3.1対応ですが、DOSBOX上のDOS用Windows 3.1との動作比較の結果、現在ひっかかっている箇所の問題が特定できました。ページテーブルのbit 5, bit 6 (0x60)をチェックしてるから何かと思ったら、Dirty bit (書き込まれると立つ)とAccessed bit(読み書きで立つ)でした。そういえばDOS Extenderでは使って無さそうだから対応してなかった!
しかし、これ対応しようと思ったらメモリアクセスするたびにフラグ立てなきゃならなくなって、(ただでさえ遅いと言われてる津軽なのに)Townsアプリの実行スピードに影響が出ると思ったので、これはビルドするときにマクロ定義かなんかで対応するとして、Windows 3.1を動かしてみたい人は各自ビルドしてもらう方向にしようかな。
それにこのフラグに対応してもまだ起動までこぎつけるかどうかは不明だし。
2022-04-01 22:53:14
やっぱり需要がゼロと思われるWindows 3.1ですが、pinさんがJCXZとLOOP命令のエラーを発見してくれて(まさかここだけCXとECXの切り替えがオペランドサイズじゃなくアドレスサイズと思わなかった)、さらに先に進むようになりました。が、現在
INT 47H
の中で固まってますね。INT 47Hって、何をするのが正しいのかまだわからんですね。INTの40H番台は、原則デバイスのI/Oに使っていて、47HはPICのブリッジで本来発生しないはずのINTということになってますが、なんかで使ってるようです。手動でNOPにしてAXに0F386Hをセットして先に進めてやるとさらに進むようなのですが、その先でクラッシュしてしまいますね。BRKON INT 47としてデバッガ仕掛けて実行すると、その場所までたどりつけます。
もしも何かヒントになりそうな情報があったらよろしくお願いします!
なお、Windows 3.1を(途中まで)実行するには、i486.hの中の、
// #define TSUGARU_I486_UPDATE_PAGE_DA_FLAGS
個々のコメントをはずしてコンパイルする必要があります。
2022-12-07 11:34:16
githubにTEST386というのを見つけたので(https://github.com/barotto/test386.asm)、High Fidelity Modeなるものを作ってTEST386がすべてパスするようにしてみたのですが、それでもWindows 3.1起動しませんね。TEST386がパスするので、プロテクテドモードは相当再現度が高いと思うのですが、ただ、VM86モードのテストとタスク切り替えのテストは入っていないということなので、怪しいのはタスク切り替えで失敗しているという可能性もありますが。しかしDOS6は割とよく動いているようなので、ひょっとしてデバイスの問題だろうか。
VM86モードをテストするプログラムとかって無いもんですかね。あるいは、DOS6からEMM386の機能をテストするようなプログラムでもいいんですが。
なお、High Fidelity Modeは、トップレベルのCMakeLists.txtの
# add_compile_definitions(TSUGARU_I486_HIGH_FIDELITY)
このコメントになってる行をコメント解除してコンパイルすると利用できます。フラクタルエンジンとか気にしないから一般的なTowns OSアプリが速く動くLow Fidelity Modeも作ろうと思ってます。ほとんどStrike Commander専用になりそうですが。
2023-03-04 14:34:11
もはや需要がゼロのWindows 3.1ですが、わがCPUコアで動作しないのが気に入らないというだけの理由でCMUの春休みを使ってかなり調べたところ、KRNL386.EXE起動までは正常に進んでいるようです。そして、OASYS.DICを開こうとしたところINT 93Hから戻ってこないというのは結構前から同じなのですが、
emb cs:eip B5 00 B8 B0 0E CD 93 EB FE
という無理やりINT 93Hを埋め込むという技を使ったところ、KRNL386.EXE突入直後は普通にINT 93が動作するんですが、INT 21HでOASYS.DICを開こうとした時点ではINT 93Hが動かなくなってるということが確認できました。どこでINT 93が動かなくなるのか究明しようとしてます。
これ、タスクスイッチングとか使い始められるとまったく未知の領域になってしまうのですが、今止まってる箇所はまだタスクレジスタは一個しか使ってなくて、ここは突破できそうな感じなんですがね。
2023-03-11 01:13:51
LAR, LSLインストラクションを見直して、opCode 0FFFH をどうやらINT 6テストに使っているようなのでINT 6を出すようにして、OR BYTE PTR ES:[BX],0 でPage Faultをわざと起こさせるようなので、これもハンドルするようにしたら、Windows 3.1がCRTC2に書き込んで、640x480モードに切り替えて、背景を白く塗るところまで進むようになりました。LAR, LSLは使用頻度が少ないので、Default Fidelity Modeでも動作を実機同様(実機MXで挙動を調べるコードを書いて、それに合わせた)に動作するようにしたので、多分DOS6の再現性にも少し改善があったと思います。
かなり奥まで進むようになったものの、なかなかGUIが使えるところまで進まんですね(^_^;)どうも、Exceptionが出ないように準備して呼び出すというより、Exceptionが出たらそれに対応するような書き方になっているようなので(最近のOSってそういうもん?)、そういうところでひっかかっているのでしょうね。まあ、気長にやっていけば、10年以内には津軽でもWindows 3.1が走るようになるでしょう。
2023-03-16 00:01:30
どうも、CRTC2のパレットは、書き込むとアドレスラッチが自動的にインクリメントされるようですね。その修正を加えたところ、背景がWindows 3.1っぽいグレーになるとこまで来ました。これはひとつTownsOSアプリの実行の正確さにも関連があった鴨しれません。
現在、INT 21H AX=4408H (ただしプロテクテドモードから呼んでいるのでINT 21Hと違う呼び出し)が、内部でBlock DeviceのInterruptの中で INT 93H AX=FAB1Hを出したところで、プロテクテドモードがいったんINT 93Hを迎撃するものの、そのままVM86モードに戻してしまって(そこまでは正常)、その後ARPLによるブレークポイントから先はまたプロテクテドモードが対応すればよかったのですが、コマンドAH=0FAHの場合、またまたそのまま処理をVM86モードに戻すものの、既にSCSI割り込み INT 48H はプロテクテドモードが取ってしまった後で、SCSIがコマンドフェーズに入ったままいつまでもかかってこない割り込みを待ち続ける現象が起きています。
このAX=4408Hを出しているのがSYSTEM.DRVであるということまでは確認して、同じコードはDOS版のWindows 3.1 SYSTEM.DRVにも存在することから、TOWNS特有では無さそうです。また、AX=4408Hはドライブがリムーバブルであるかのチェックということで、これに失敗するとは思えないので、ここに入ってくるまでは合ってると思うのですが、AX=0FAB?H で INT 93H が出てしまうともはや復帰の余地は無さそうです。
ひょっとしてSCSIコントローラがタイムアウトして、Parity Errorビットを立てる(その場合もINT 93H内のループから抜ける)という可能性も考えたのですが、実機で実験したところ、タイムアウトは起こらないようで、Selection Phaseに入れたまま放置するといつまでもSelection Phaseのままで、SELビットを下ろしてData Phaseに入れたまま放置してもいつまでも Data Phase のままのようでした。
というとこで、また万策尽きた感になってます。背景がグレーまで出たんだからウィンドウが開く寸前まで来てるんじゃないかと思うんですがね。なかなか難しいですね。
2023-03-19 13:13:02
雑談スレッドでハードウェア解析や考察が話題となっていますが、個人的に別途スレッドを立てた方がよいと思ったので立てました。
強制はしませんが、今後のハードウェア解析や考察についてはこちらのスレッドで話題にしていただけると助かります。
2020-09-24 09:40:33
はじめまして。FPGAでFM TOWNSクローンを作ろうとしているプーと申します。
早速ですが、少し行き詰っている部分があるのでわかる方がいらっしゃれば教えてください。
SCSIを搭載し、HDDをエミュレーションしようと試行錯誤しているのですが、DOS6.2L10のboot時(IO.SYS内)でSCSIのセレクションが
終わった後(07bd:026b周辺)、データ転送フェーズに入るのをタイムアウトするまで待ち続けるループ(07bd:0270周辺)があります。
少なくともコマンドを送らなければデータ転送フェーズには入れないと思うのですがその様な動作をしているようではありません。
DMAでコマンドを送れば該当するプログラムは無くてもよいのだとは思うのですが、TOWNSのSCSI回路はコマンドもDMAで転送は可能なのでしょうか。
ちなみに該当(永久ループ中)時のDMAアドレス、カウンタともに0のままでしたので、DMAでコマンドを送ろうともしていないのではないかと思います。
2022-11-05 01:29:57
プーさん、
FPGA TOWNS、既にFDからの起動が可能ということで、すごいですね!TOWNSのSCSIコマンドは、I/O 0C30hのFIFOバッファのはずですね。DMA転送はしてないと思います。7BD:270付近というと、
07BD:0000026D 8B5402 MOV DX,[SI+02H]
07BD:00000270 EC IN AL,DX
07BD:00000271 A801 TEST AL,01H
07BD:00000273 7501 JNE 00000276
07BD:00000275 C3 RET
07BD:00000276 803EB70C01 CMP BYTE PTR [0CB7H],01H
07BD:0000027B C3 RET
ここですかね? DXは0xC32なので、これはデータ転送フェーズ入りではなくPERRフラグを見ているような感じがします。この付近ではループを組んでいるような感じはしないのですが、アドレスはここで合ってるでしょうか?津軽のデバッガで追ってみた感じだと、その後普通にCOMMANDフェーズに移行しているように見えました。
2022-11-05 06:24:57
山川機長さま:
返信ありがとうございます。山川機長さまは津軽・互換BIOSの作者様でございますでしょうか。
いつもお世話になっております。BIOSソースと動作を見比べながら回路のデバグを行いましたので大変お世話になりました。
おかげでFDDからのDOS bootまではたどり着けました。
上の話ですが、275番地のretで1e5番地に戻っており、1f3番地でREQ,MSG,C/Dを残してマスクし、1f5番地でREQのみ1の状態で
なければ1cb番地に戻り、ループする、と解釈しております。REQ=1,MSG=0,C/D=0の条件はデータ転送フェーズですのでここを抜け出すには
データフェーズに入るしかないように思えますがこのルーチンに入る前はコマンドは1バイトも送っておりません。
2022-11-05 09:30:20
プーさん、
> 返信ありがとうございます。山川機長さまは津軽・互換BIOSの作者様でございますでしょうか。
そうです。互換BIOSはCD起動までKasanovaさんが開発されていたものを、改変したものも公開が自由とのことでしたので、FD起動など僕が追加しました。互換BIOS作っておいたら津軽で使えるほかに将来誰かFPGA TOWNSを作る人が現れたら単体で動作するTOWNSとして配布できるであろう、ということを考えてましたがまさかこんなに早く現れるとは思ってませんでした!津軽は、中身を研究するためにデバッガをかなり強力にしたつもりなので、ご活用ください。
SCSIは、津軽開発自分ジャーナルにアノテートした逆アセンブルが残ってました。ここですが、01F0HからBUSY=0で抜ける可能性もあります。
07BD:000001EE A808 TEST AL,08H ; AL comes from IN AL,0C32H. 08H is BUSY flag
07BD:000001F0 741C JE 0000020E { SCSI Status BUSY=0:}
各フェーズに対する処理はSCSIのInterrupt Handler内で起こっているので、このループは単にInterrupt Handlerがフェーズを先に進めてそれに応じて回っているだけと思います。ですので、フェーズが変わるごとにSCSIのIRQを出して行けば抜けてくると思います。
SCSIのIRQ (48H)のハンドラは 07F9:00DF ですね。と、言ってもALに20Hを入れていったん全部07F9:125に飛ぶことになっていて、そこから分岐ですが。
参考になりましたでしょうか?
2022-11-05 11:46:40
どうも情報ありがとうございました。
どうやら割り込みが無効になっていたため、コマンドを送れていなかったようです。
というのも、テクハンP262、IMSK(bit6)の説明で0=割り込み許可、1=割り込み禁止 と記載されていたため
そのまま負論理で記述していましたが、次ページINT(bit1)の説明でIMSKは0でマスクできると記載されており
こちらは正論理記載です。どうやら263ページの説明が正しく262ページの記載が誤記のようです。
該当部分論理反転したところ、少なくとも該当部分は正常になったようです。
2022-11-05 16:46:04
おおなるほど!そのpp262の誤りは津軽書いてるときに解明していたはず、と、思ったらWikiの正誤表(https://wiki3.jp/fmtowns/page/11)に転載し忘れてますね。一応、津軽開発中に見つけた正誤表が、
https://github.com/captainys/TOWNSEMU/blob/master/FMTOWNS_Technical_Databook_Errata.md
ここにあって、大体はWikiにも転載したはずなのですが、IMSKフラグは転載してなかったぽいです。他にも漏れがある鴨しれません。よかったらこちらも参考にしてください!
2022-11-06 00:22:11
そのようですね。何処かに記載があった気がするけど。。。wikiには書いていないからテクハンが正しかったのか、と負論理で記述してしまいました。
そうですね。先に見たのは津軽のgithubでした。じっくり再度読ませて頂きます。
ところで津軽のデバッガの使い方をご教授頂けないでしょうか。
2022-11-06 23:58:32
そうですねえ、デバッガもコマンド追加するたびに一応HELPには簡単な説明を書くようにしていたのですが、ちょっとわからん機能も多いですかね。一応、デバッガ有効にする ena debug コマンドとか逆アセンブルのUコマンドとか、ブレークポイント設定のBPコマンド、一ステップトレースのTなどはわかりやすいと思うのですが。よく使うのはbrkon(イベントでブレーク)ですかね。メモリに書き込みがあったときブレーク brkon memw seg:offset とか、特定の値の書き込みがあったときブレーク brkon memw seg:offset value=??、とか、あるいは逆にmemrでメモリ読み込みでブレークとかできます。あと、ブレークしないけど通過したときステータスを表示する、mp cs:offset も結構最近多用してますね。現在実機でD77より多くの情報を抜き出すダンププログラム書いててBIOSの細かい動きを解析してるので、IO Monitorコマンド ena iomon IOPort も良く使ってますね。IO書き込み、読み込みでブレークさせることもできます。 brkon iow IOPort みたいな感じで。あと過去65536段階までCS:EIPのログを取っているので hist コマンドで表示できます。hist 1000とかやると過去1000ステップまで見れます。あと、calc eax+edi*4+0x100 みたいな感じで式の計算機能も付いていて、計算機能以外は数値は原則16進数ですが、CALCコマンドの場合は、なにもつけないと10進数、16進にするには$100, 100H, 0x100のいずれかのパターンを使います。あとは、使ってみてこういう機能が欲しいとかこのコマンドはなんじゃ?という疑問があったらその都度聞いてください。
2022-11-07 02:45:39
あ、そうだ。そういえば、津軽と陸奥のデバッガは実はシンボリックデバッガなんですよ。これが使うとめちゃくちゃ便利で(自分で言うな)、起動時に-SYMオプションでシンボルファイルを指定しておいて、デバッグ中に
ADDSYM 000C:0000 "Code Segment Top"
みたいに書くと、逆アセンブルしたときそのアドレスにヒットするとその情報を表示します。また、ADDREMを使うとコメントっぽく表示して、ADDLABだとジャンプラベルみたいな感じの表示になります。あと、I/Oをいちいち覚えるのが面倒だったので、MOV DX,0200h みたいになってるところに、IMMISIO seg:offset みたいに書くと、I/Oの意味をコメントに表示します。その他、.EXPファイルのシンボル情報を読み込む機能もあって、、、、うーん、コマンド忘れたけど、ヘルプで出ますんで。大航海時代のデバッグのときには重宝しました。案外製品のEXPファイルにもシンボル情報残ったままになってるんですよ。ここ数日のFDUTIL.EXEを書くための Disk BIOS 解析でも活躍しました。陸奥の方はまだ I/O のテーブルとかデータに持たせてないんで、そこまでの機能は無いんですけどね。
登録した内容は自動的にシンボルファイルに記録するので次回起動時も同じシンボルファイルを読み込めば続きの解析ができます。これは自作プログラムのデバッグにも多分便利だと思います。
あと、
SYMFIND keyword
でキーワードを含むシンボルを表示します。うーん、ワイルドカード対応してたっけかな?してたようなしなかったような。(書いてるコードが多すぎて端々まで覚えられない)
2022-11-12 11:13:44
FMTowns実機や各種FMTownsエミュレータを使用する上での質問事項
2020-07-28 13:20:43
山川機長さん
うーん、やっぱり現実世界では様々な要素が有って難しいですね。
uPD71071のデータシートを見たのですが今のところ、"これだ!"と思える記述が発見できていません。
気になったのはDMAによるデータ転送後にバスフリーを行う処理が有るのですが、この時間が規定されていないようで100msのウェイトの件は此処にかかっているような気がします。
I/Oの00A9Hのデバイスコントロールレジスタのbit0にBHLDが有るのですが、TOWNSの場合は0(バスリリースモード)で使用している関係でDMAリクエストは実行中のDMA処理が終わった後にしか受け付けてもらえない("無視される"とは書いてないのですが、無視されると思われる)ので、バスフリーが終わらないうちに次のリクエストが入っているのではないかと思われるところです。
なぜバスフリー処理の時間が明確に規定されていないかについては、ターゲット側(HDD等)の処理時間が係わるからじゃないかと思っています。
SCSIのデータ転送が終了したかどうかは、データレジスタを見てターゲットがコマンドコンプリートメッセージを送出したかで判断するようですが、SCSIのデータレジスタはアクセスするとACKを送出してしまう事から見ることは出来なさそうですね。
2022-11-09 09:41:15
↑に色々書いたのですが、SCSIとDMACで混乱してますね。(汗)
バスフリー処理の時間に関してはDMACのバスフリーはCPUバスに対してだからSCSI側のターゲット側処理時間は関係無いですね。
CPUバスなので、DMACクロックに対するサイクル数で表現されてそうですが、それがmsオーダーなんてDMACとしてあり得ない数値ですね。
原因は何だろう・・・
2022-11-09 10:04:26
いやあ、でもSCSI書き込み後にFDCが方針してしまうわけなので、SCSIとなんらかの関係があることは間違いないと思うんですがね。ただ、タイムアウトを見てリトライさせたらなんとなく動くようになったので、公開してみました。
https://github.com/captainys/FM/tree/master/TOWNS/FDDUMP
ここにソースとバイナリがあります。D77フォーマットでは表現できないセクタ読み込み時間と、Track Readコマンドの結果を保存するために.RDD (Real Disk Dump)フォーマットというファイル形式を勝手に作りました。また、値が変化するセクタは12回マルチサンプルするようになってます。そのままだと津軽や陸奥で使えないので、RDD2D77なるプログラムも書きましたが、いずれ津軽・陸奥で直接サポートしようと思ってます。
まあ、あの手この手を試しているうちにだんだん複雑になってしまって、Watcom Cのインラインアセンブラを多用しているので、あんまり読みやすくないですが、もしも、何でFDCがときどき放心するのか、気が付いたことがあったら教えていただけると助かりますね。
なお、津軽と陸奥は.D77EXT (あるいは.D7X)というファイルを.D77ファイルと同じディレクトリに置いておくと、セクタ読み込み時間の情報をそのファイルから読むように作ってあるので、Ys2とかSilpheedとか三国志とか琥珀色の遺言とかプロテクトそのまま再現できるようになってます。今のところ、PaulineとかFDShieldでキャプチャしたイメージから問題のセクタの読み込み時間を計測して手作業で.D77EXTファイルを書いて実験していましたが、このFDDUMP.EXEで作ったディスクイメージからRDD2D77で .D77 + .D7X に変換したディスクイメージは、そのまま陸奥で使えるはず、という予定なのですが、実機によるテストはこれから本格的にやらないといかんですね。
本当はThexderとかFire Crystalみたいな、木の葉隠れプロテクトも検出してそれも読み込みに対応したいんだけど、Read Addressでタイムアウトが頻発してるっぽいから、ちょっと難しいかもしれんですね。
2022-11-09 15:58:46
なお、FDDUMP.EXE、実機MXで琥珀色の遺言のディスク1のセクタ読み込み時間の計測成功しました!陸奥で起動からチェッカーの通過まで確認できました!
そうか、あと木の葉隠れに対応できればFM-7系に使われたプロテクトは(伝説の複数インデックスホールプロテクト以外)対応可能になるかな。というか、3.5インチではそもそもインデックスホールプロテクトは存在できないし。なんか考えよう。
2022-11-10 01:03:55
木の葉隠れプロテクト、なんと対応できましたというか対応できてました。少なくともMXのディスクドライブだと、Read Trackコマンドでセクタデータが化けないので、Read Trackした結果から解析するとあっさり隠れた本物セクタが見えてしまいました。(というか、なんでFM-7だとRead Trackであんなにデータが化けたんだろう?同じMB8877なのに。)最初Thexderの隠れセクタのうちのひとつがインデックスホールをまたいでいるので取れないかと思ったんですが、それは気のせいで取れてました。これだと、FM-7シリーズのプロテクトは僕の知ってる範囲ではすべてFDDUMP.EXEでキャプチャできますね。
あとは、ときどきFDCが放心状態になるのが格好悪いのでなんとかできれば完璧なんですけどね。Disk BIOSの動きを見てできるだけ同じになるようにしているつもりなんですが。一応今のところタイムアウトしたらリトライすればほぼ確実に読めてるので実用的には問題無いようです。
2022-11-11 04:16:10
FDCの放心問題を解決するためにFM Towns Technical Databookを見直してるんですが、248ページの表 I-7-18の、2HDモードのモータ起動時間、"1000mS以上" って、"以下"の間違いですかねえ。少なくとも1秒かかる、だとあまり有益な情報じゃ無いような。
2022-11-11 05:56:34
原因解明!タイマーでした。Disk BIOSの逆アセンブルを見ていたら、最初にタイマーをふたつ解除していたので、試しにタイマーをマスクしてみたらすべてがスムーズに動くようになりました。考えてみたら初期のTOWNSにはDisk Changed BitがI/Oになかったので、タイマー割り込みで定期的にディスクが抜けたことを確認して、そうなったらディスク交換があったと判定していたと思います。最も考えられるのは、そのタイミングでドライブセレクトを0と1に切り替えるのでFDCが止まってしまったの鴨しれません。津軽だとそういえばFDCコマンドを出した後でドライブセレクトを切り替えるという状況は想定してなかったですね。
ということで、FDDUMP.EXE安定して使えるようになりました。
2022-11-11 08:45:04
無事解決できたようで安心です。
タイマーかぁ~、確かにタイマー割り込み先でドライブセレクトされたらと考えると説明がつきますが、ウェイトとの絡み(ウェイトを増やすと安定方向へ行く)がよく解らないですね。
でも、まあタイマーをマスクしたら安定するのならタイマー割り込み先での処理が原因だったと言えるので、解決ですね。
モーター起動時間の件は2DDと2HDで違う(と言うか逆)事は無いと思いますので、2HD側の誤植でしょうね。
3.5インチFDDの資料を何点か見ましたが、1000msって言うのは無くてMAX500msばっかりでしたので1000msってのは搭載するドライブが変更される事を見越して結構な余裕を持たせているのかもしれません。
ただ、Over1000msってのはあり得ない表現なので。
2022-11-11 09:30:45
タイマーを増やすとエラーが減るのが、そこがわからんところなんですよね。タイマーと気が付いたのは、MON IOR 200 20F, MON IOW 200 20F とした状態で DIR A: とすると、読み込みが終わって少し待ってから208と20Cにアクセスするような動きがあったので、BIOSの逆アセンブルの最初の方を見たらタイマーのキャンセルの処理があったのでわかった、という感じなんですね。しかし、このタイマーの挙動はBIOSでFDを読んだ後に起こるようで、津軽上ではI/Oを直接いじってる限り再現しないんですよね。何か実機の挙動で解明できてない点があるみたいなんですが、おそらくTOWNS実機を使ってディスクイメージを作るプログラムを書こうなんて人は僕以外にいないと思うので、そこまで解明する必要は多分無いですね。昨日は試しにFM77AV用のマンハッタン・レクイエムのイメージをFDDUMPで作ってみましたが、陸奥でばっちり起動確認できました。どうやら起動中にF6セクタを読んでいるのでチェッカーも無事通過していたようです。
2022-11-11 23:07:25
スレッド分けました。内蔵CDが故障してしまったTOWNSをフロッピーディスク経由でSCSI CDから起動するブートローダープロジェクト用スレッドです。一応、フロッピーディスク経由の場合と、SCSI2SDや変換番長のような仮想SCSIデバイスからの起動の両方を想定してます。似たようなことは既にYSSCSICD.SYSでできていますが、TownsOS起動ディスクに組み込む必要があるので、ディスクの再配布していいか微妙なのと、特殊なドライバを組み込むタイトルでは専用起動ディスクが必要などの問題がありましたが、このプロジェクトはその2点の解消を目指してます。
まだ津軽上の実験ですが、SCSI CDドライブからIO.SYSを読み込み、INT 93Hなどをインストールして、MSDOS.SYSまで読み込んだところで処理を迎撃することに成功しました。まだ青森県地図の表示はできてません。
しかし、迎撃地点ではMSDOS.SYSは読み込んでいるものの、まだINT 21HがEnableされていないようで、INT 21H AH=48Hでメモリを確保してやろうと思ったら固まってしまいました。これ、INT 21がまだ使えないのではなく、実はPSPとかが存在してないからという可能性もあるんですがね。ただ、考えようによってはBIOSのRedirectorをインストールしようと思ったらこの迎撃地点は悪く無くて、IO.SYSには内蔵CD-ROMから起動したと思い込ませているはずなので、ここでINT 93 AL=C0HがすべてSCSIにリダイレクトされるようにすると、IO.SYSは何事もなかったかのようにSCSI CDから起動してくるはずです。
問題は、リダイレクタをインストールしたとして、リダイレクタが使用するアドレスがその後別のプロセスに上書きされてしまうことを防止しなくてはならない点です。そのために、その後さらに調べたところ、どうも、MSDOS.SYSにジャンプするときのDXの値がMSDOS.SYSが使ってもいい最後のアドレス (DX=B800Hだと物理B8000Hまで使える)になっているようなのですが、どなたかこの解釈が正しいかご存知の方いませんか?また、そうした場合、DOS ExtenderがB8000~BFFFFを使わないと言えるのかという問題もあるのですが。nabeさんとか知ってそうと期待していたりするのですが。もしもこの解釈が正しければ C000H をDXにセットしている場所にパッチを当ててやれば、BIOSリダイレクタ置き場を作ることができるはずです。
これまで津軽のデバッガでMSDOS.SYS入り口で止めてLET DX B800H として放流してやった上でV2.1 L20上で何本かEXPファイルを走らせてみた限りではB8000~BFFFFは守られているようでした。
別な方法としては、もともとのCD-ROM BIOSはいらなくなるので、IO.SYSを識別して、もとのCD-ROM BIOSが書いてある場所にリダイレクタをインストールしてしまうという手もあるのですが、やや乱暴な方法で、多分CD-ROM BIOSは一か所に固まっているのですが他のINT 93Hがその部分のPROCを使っていたらこの手は使えないですね。
また、できればC0000H直前ではなくもっと下の方のIO.SYS直後あたりにインストールしたいところなのですが、どこでIO.SYSが使っていい領域の最初のアドレスをMSDOS.SYSに渡しているのやら。それはまだ見つかってません。ただ、IO.SYSのサイズはTownsOSのバージョンによって異なってもどのTOWNSのMSDOS.SYSを使っても起動できるということは、どこから使っていいかという情報もIO.SYSはMSDOS.SYSに絶対渡しているはずなんですがね。
2020-09-24 09:22:42
>296 山川機長さん
こちらこそありがとうございます!無事テストができて一安心です。
本当にこれは素晴らしい技術ですね。流石です!
メモリーカードスロットを使う方法は使い方が簡単でいいですね。
>297 WINDYさん
送って頂きましてありがとうございます。
縦型Townsの構造はどれも複雑で、開けるのは難しそうですね。
職人さんが書いた本を見てCXの調整をしたことがありますが、プラスチックが弱くなっていて苦労した記憶があります。
メモリカードスロットの活用法は考えるだけでも夢が広がりますね。
2022-07-07 01:57:49
質問です。
IC Memory Card 救済IPL書き込みユーティリティ(ICMWRITE.EXP)はFRAMカードに使えるのでしょうか。
“書き込み内容が一致しませんでした。”というエラーが出るのですが、この場合書き込みはされているのでしょうか。
何方かご教授頂けますと幸いです。
2022-09-30 23:54:54
使えます、というかそれ以外今のところユーティリティが無いですね。ただ、書き込み内容が一致しなかったというのは、ベリファイに失敗してますね。ライトプロテクトがかかっていた場合は、ライトプロテクトエラーになるはずなので、書き込みに失敗していると思います。それって、先日送ったFRAMカードでしょうか?アメリカの知り合いにもひとつ送ったところ、コネクタのはんだ付けが甘くて輸送中に取れてしまったらしく、彼はハンダを溶かしなおしたら直ったと言ってたんですよね。同じ状況になってないと良いのですが。
2022-10-01 09:36:49
>山川機長様
そうです。先日送って頂いたものです。Townsが非常に使い易くなりました。ありがとうございます。
今は2022511cが正常に動作しているのですが、そこに同じバージョンの上書きを試しています。
icmwriteの使い方は何処かに書いてありますでしょうか。
起動方法を幾つか試したのですが、普通にダブルクリックで起動したり、
run386 -nocrt icmwrite.exp icmimage.bin
を実行したりしたのですが、同様のエラーメッセージでした。
icmimage.binがカレントドライブになくてもエラーに変化が無いので、パラメータに問題があるのかもと思っています。
なお、ライトプロテクトスイッチはunprotectに切り替えたままで、cmosバックアップとリストアがエラーなく動作しています。
FRAMカードは段ボールを切り抜いて頑丈なパッキングが施されていたので大丈夫だと思いたいところですが、
悪あがきしても駄目だったらはんだを溶かすのもやってみようかと思います。
2022-10-01 21:03:57
私の環境でもFRAMカード、SRAMカード共に同じく“書き込み内容が一致しませんでした。”と表示されます。
run386 icmwrite.exp
を打ち込んで、メニューに従って書き込みを選択しています。
エラーが表示されるものの、書き込みは行われているようで、そのまま救済IPLとして使用しています。
普段書き込みに使用しているユーティリティでもFRAMカードではエラー表示されますが、書き込みは出来ているようです。
同ユーティリティでSRAMカードへ書き込む場合、容量64KB程度の小容量を指定した時だけエラー表示され、書き込みは正常に行えていた記憶があります。
2022-10-02 12:19:39
> aochanさん
あの状態で書き込みはできているのですね。
Towns本体の故障も疑っていたのですが、安心しました。
情報ありがとうございます。
2022-10-02 20:04:32
おおなるほど。それは、ICMWRITEのバグっぽいですね。確認してみます。ありがとうございます!
2022-10-03 03:15:58
コロナ陽性とその後の延期になった仕事の火の粉で大変でしたので暫く見れていませんでした。
プログラムを見ると、FRAMカードに書き込むIPLはICMWRITE.EXPに内包されているようですので実行ファイルの実行のみで良いようです。
確認できていないのですが、書込時はアセンブラ内のTRANSFER_TO_ICMルーチンを呼ぶのに対し照合時の読み出しはDiskBIOSのコールとなっていますが、これが原因では? > 山川機長さん
2022-10-06 14:38:58
WINDYさん、
おおたしかに。うーん、これはなんでこうしたんだったか、記憶をたどっていくと、書き込みは直接書くとして、読み込みは起動しなきゃならないんだからBIOSが読めるように、とかそういうことを考えたような気がします。MXだと動いたはずなんだよなあ。すみません、Towns OS V2.1 L31で試してみていただけるでしょうか?ひょっとするとBIOSのバージョンの違いに影響受ける鴨しれません。
2022-10-26 08:42:58
掲示板のタイトルからは外れますが、兄弟エミュレータと言うことで。
FM-7/77/AVエミュレータ Mutsu[陸奥]の情報交換用スレッドです。
2022-08-31 16:57:32
>CSMモード、効果音モード
ゲームではないですが、フリコレ10に収録されているEUP曲「かがやき」(F-OKESHI氏作曲)で聞こえていなかったパートが聞こえるようになったようです。対応ありがとうございます。
2022-09-10 00:37:42
CSMモード,効果音モードの実装を有り難うございます。
せっかくなのでシルフィードの第一中間デモまで、訳あってキーボードで行って参りました。
CSMモードの発声に関しては"あと一息"といった感じで、全体的にノイズが入っているのか声の"明瞭さ"が低く聞き取りにくいと感じました。("そもそもCSMで明瞭なんて無いだろ"って声が飛んできそうですが、実機やXM7と比べてです)
それ以外は、FMもPSG(SSG)も良い感じでした。 XM7と比べると双方で高音部で違いが感じられますが、大した違いではなくそれぞれの"味"と思える程度です。
2022-09-14 11:11:23
そういえば、Alltynexの鳴ってないパートがあった件、ひょっとしたらCSMだったりするのではないかと思ったんですが、どうですかね?CSMモードだとKey On/Offをタイマーがコントロールするので、音が鳴らなかったかも。CSMとSSG_EGは陸奥で作ったやつを津軽にも持って来れたので、よかったですね。
シルフィードの音声は、まだエンベロープの速さをスロットごとに計算しなおしてないので、それを直すとちょっと違うかもしれないですが、多分、津軽弁ライブラリは本物よりもサイン波がスムーズになってしまってると思います。あと、時間解像度も速いかもしれないので、なかなか他のOPNエミュレータに追いつくのは難しい鴨しれません。
2022-09-15 03:43:47
CSMモードですが、3ch用のF_NUMとBLOCKが3個余計にあるけど、そのうちのどれがどのスロットに対応してるのだ?というのが探してもわからなくて当てずっぽうだったのですが、FM Towns Technical Databookの212ページについに発見しました。間違いも多いけど、FM音源について他には載ってない情報がかなり載ってるので、この本は奇跡的です。それで、対応を直したところ、シルフィードの音声はかなり良くなったように思います。YMのコードはTOWNSEMUのレポジトリに入ってるので、そのソースをPULLして陸奥をビルドしていただけると確認できると思います。
2022-09-15 11:20:24
>7 山川機長さん
対応の方、有り難うございます。
CSMモードですが、劇的に良くなったと思います。
XM7比ですが、多少低音側が強くなっており声が野太い印象ですが随分と良くなったのは確かです。
実機の記憶ではXM7の音に近く、解りやすいのはゲームアーツのロゴの部分でもう少し子供の声に近いような高い声が正しいような気がします。
また、Alltynexの方は正直、違いが判らない状態です。
2022-09-15 16:49:20
そうですねえ、CSMの理屈を勉強した、というか教えてもらったんですが、フーリエ変換してDominant Termsを上から4個を拾ってきてるわけですね。で、声は聞こえるけど低く聞こえる、ということは低周波成分のボリュームが大きいのかな。しかし、FM音源には、高い音のエンベロープの変化を速くするという機能があるものの、現在まだ津軽弁はCSMモードではスロットごとに対応してないんですよね。これをスロットごとにすると、直観的にはかえって低周波成分の減衰が遅くなってもっと低くなるような気がするのですが、とか言ってる間にやってみりゃいいんですよね。今日の晩はボウリングの試合があるので、明日ミーティング中にやってみます、と、思ったら明日から普通に会議室で集合になってしまった。週末はフライトが入ってるし、案外時間ないなあ。とりあえず時間できたらやってみます!
2022-09-16 00:06:44
うーむ、スロット事にエンベロープのスピード変えてみたけど(時間が無いんじゃなかったのか)変わらんですね。実機やXM7のPresented by Game Artsを聞くと、抑揚がついてますね。ひょっとしてMULTIをいじってるのかと思ったけどそのようでもないし。はて、何が違うんだろう。
2022-09-16 05:47:02
さんざん調べた結果、結論は、Wave生成の時間解像度が足りないということがわかりました。2msにしてたのを1msにしたらかなり改善しましたが、まだ実機と違うので、500usまでトライしてみます。謎なのが、以前1msにしたら最後のWave生成からWaveをデバイスに送るまでの時間があまりにも小さかった影響で(多分)再生が間に合わないという現象が起きてたと思ったのですが、起こらなくなってました。
津軽の方はCSMを使ってるソフトがまだ確認できてないので、引き続き2msで行こうと思ってますが、、、、あそうか。津軽だと486のエミュレーションが厳しくて間に合わんかったのか。77AVだと余裕があるから500usまで下げても大丈夫な気がしてきた。
今日は時間切れになってしまったんですが、明日やってみます!一応、今のソースPUSHしたので、改善を確認していただけるかと思います。
2022-09-18 12:59:38
さらに調べた結果、YM2612のタイマーエミュレーションが間違ってたということが判明しました。津軽でここまで使われてきてるのに、まだこの違いが残っていたとは。XM7のopn.cを参考にさせていただきました。これでシルフィードのPresented by Game Artsはほぼ実機と同等になったと思うのですが、どうでしょう?
2022-09-20 13:34:33
FMTownsのアプリケーションの動作報告用
2020-07-28 13:17:50
ああ、原因わかったかも。publicレポジトリPUSHするのばっちり忘れてました。今PUSHしたので、試してみてください。
2022-06-18 16:12:40
おお、鳴りました。対応ありがとうございます!
2022-06-18 21:32:54
ゆみみみっくす、放置してすみません。忘れてたわけではないのですが。とりあえず、原因は、Shadow of the Beast 2対策が邪魔してました。
Shadow of the Beast 2が何をやってたかというと、CD-ROMのIRQハンドラが、Data ReadyのSIRQとDEIが交互に入ってくることを期待していて、直前のDEIが処理される前にSIRQが出てしまうと永遠にDEIを待ち続け先に進まない、という状況に陥りました。そのため、直前のInterrupt RequestがConsumeされていない場合はData Readyを出さない、という方法でShadow of the Beast 2が走るようになったのですが、ゆみみみっくすの場合、直前のInterrupt Requestが処理されてなくてもData Readyが出ないと先に進まないという状況ですね。
さてどうしたもんか、と、思ったのですが、ここまで書いてて、直前のInterrupt Requestが処理されてなくて、かつDEIが1のときだけ待たせればいいのではないか、ということに気が付いたのでやってみます。
2022-09-05 08:19:57
ゆみみみっくす、起動できるようになりました!ソースPUSHしたので、よかったら試してみてください!
2022-09-05 08:40:22
ゆみみみっくす対応ありがとうございます!
起動できるようになりました!
2022-09-08 22:01:29
仮想ゲーム機エンジン「PICO-8」向けに作られていたフリーゲーム「CELESTE Classic」をFM TOWNSに移植してみました。
https://bcc.hatenablog.com/entry/2022/09/10/234539
エミュレータ「津軽」「うんづ」及びFM TOWNS MARTY実機上でクリアまでいけることを確認したんですが、「津軽」上だと髪の毛や吹雪の表示が問題ないのにMARTY実機で試したところ髪がズレて表示されたり吹雪がすべて2ドット分の大きさで表示されてしまう現象が発生しました。
おそらく津軽の再現性の問題かと思いますので、確認をよろしくお願いします。
TOWNS版CELESTEの表示方法は
・画面は全てスプライト表示。表示枚数は最大448枚。
・スプライトは縮小表示で8*8相当に縮めている。
・128*128で描いたスプライト面を3倍拡大して384*384にして画面中央に表示
という手順をとっています。
2022-09-11 14:25:28
髪は知りませんが、雪は縮小アルゴリズムの実機との差異ですね
CELESTE側ではスプライトを定義する際に2x2ドットの境界をまたがないようにするか、
そもそも縮小を使わない(左上8x8のみ使用して残りを透過色で埋める)ようにしてはどうでしょうか
2022-09-11 21:13:21
なるほど!津軽上では問題なかったけど、実機に持って行ったときと動作が違うということですね。
たしかに、津軽上で実機用ソフトを開発するときにそれに当たると困りますね。FM77AV上でコード書いてて、FM-7に持ってきたらVRAMアクセスフラグ立て忘れてて画面が変、みたいな状況ですね。(違うかもしれない)
動画拝見しましたが、チップチューンのBGMがいい感じですね。
縮小は単に1ドットずつ飛ばして書いてるだけだろうと思ったのですが、実機だと何か複雑なことしてるのだろうか。あと、Martyと他の実機では違いがあるのだろうか。MXでテストコード書いて試してみます。X=奇数のピクセルが白のスプライトとX=偶数のピクセルが白のスプライトを縮小表示してみれば何かわかるかな。
2022-09-11 21:40:45
通常スプライトRAM側で奇数番目(あるいは奇数行目)のピクセルが表示されるのですが、透明色の場合に偶数番目を参照するようです。
件の雪は(-: 透明ピクセル, x: 不透明ピクセル, |: バイト境界)
+56 ...|-x|x-|...
+64 ...|-x|x-|...
のように定義されていたため、1x1で表示して欲しいところ2x2になっていました
SYPSが立っていた場合の優先順位はまた違うかもしれません。
また、X, Yともに縮小の際の候補4ピクセルの優先順位も調べる必要があります。
2022-09-11 21:46:42
CMOSの件だけでも長くなる可能性があるかと思ったのでスレッド作りました。YSSCSICD.SYS開発時、津軽開発時に調べたメモに残ってるのが、
CMOS RAM
起動デバイス
[3182H] 起動デバイス種類が (Floppy:1 Harddisk:2)
[3184H] 起動デバイスユニット番号
MX ROMの逆アセンブルでも確認。2020/05/20参照。
臨時起動デバイス
[3C28H]
MX ROMの逆アセンブルによると、パッドAボタンを押して起動すると08H (AL=08,AH=00 に分解されてCD-ROM), Bボタンで 02H (AL=02,AH=00に分解されてFD0)
シングルドライブモード(多分)
[328CH] 0:解除 1:シングルドライブモード -> [33CEH]がこのバイトを含むチェックサムになってるみたい
ドライブレターをどうやったら割り当てられるのか調べてます。
2020-10-01 23:31:01
Zoomミーティング中暇だったので(不良研究員)調べました。comp_romのソースではCMOSの後半にチェックサムがあるということですが、どうもドライブレターとかシングルドライブモードが書いてある領域は、33CEHを使ってチェックサムが変わらないように調節しているようです。そういえば津軽初期のころは、なんとかシングルドライブモードの意味を解明して津軽初回起動時のCMOSの初期化はSYSROMにさせてホスト側でシングルドライブモードを解除させようと思ってたけど、このチェックサムの意味がわからなくて断念したんだよな。今ならわかる気がする。
ちなみに、ドライブレターの割り当てですが、割り当て後、31D0~31DAに「富士通」が書き込まれます。が、これは多分いつも一定だと思います。(たまたま昨日パーティションテーブルを解析しててこれと同じ文字列をチェックしていたのでわかった。すごい偶然。)
IO8:[31D0] 95 <- SJISで「富士通」
IO8:[31D2] 78
IO8:[31D4] 8E
IO8:[31D6] 6D
IO8:[31D8] 92
IO8:[31DA] CA
それで、ドライブレター割り当てですが、以下のようになっているようです。33CEHはシングルドライブモードの変更でも値が変わって、それ以外が増加した分減らして全体のサムが変わらないように調節しているように見えます。
ということで、これをもとにHD Image用ブートローダーにCMOS設定機能を追加してみます! 実現すれば津軽またはUNZ上で作ったHDイメージとSCSI仮想化ツールだけあればCMOSが死んだ状態から起動可能まで持っていけるはずです!
。。。。今日と明日はミーティングが山のようにあるんだよな。さすがにミーティング中にMASMプログラミングはできんから週末の作業だな。
IO8:[31DC] 00 <- 多分Aドライブ
IO8:[31DE] 00
IO8:[31E0] 00 <- 多分Bドライブ
IO8:[31E2] 01
IO8:[31E4] 05 <- 多分Cドライブ
IO8:[31E6] 00
IO8:[31E8] 02 <- ここが変わった (割り当て前FF)
IO8:[31EA] 00 <- ここが変わった (割り当て前FF) 上位4ビットがSCSI ID, 下位4ビットがパーティションぽい
IO8:[31EC] FF
IO8:[31EE] FF
IO8:[31F0] FF
IO8:[31F2] FF
IO8:[31F4] FF
IO8:[31F6] FF
IO8:[31F8] FF
IO8:[31FA] FF
IO8:[31FC] FF
IO8:[31FE] FF
IO8:[3200] FF
IO8:[3202] FF
IO8:[3204] FF
IO8:[3206] FF
IO8:[3208] FF
IO8:[320A] FF
IO8:[320C] FF
IO8:[320E] FF
IO8:[3210] FF
IO8:[3212] FF
IO8:[3214] FF
IO8:[3216] FF
IO8:[3218] FF <- 多分Pドライブ
IO8:[321A] FF
IO8:[33CE] 45 <- ここも変わった。↑で増えた分減ってるっぽい。多分チェックサム一定化調整。
2020-10-02 00:32:27
随分と前のことですが、モデル2のブートロムを追っかけたことが有って、その時に作成した使用CMOSの資料が有りました。
何分素人が逆アセして目で追いながら作成した資料ですので、間違っている部分も多いとは思いますが役に立てばと思い此処に書き込んでみます。
3180 ?(bit0をチェックしている)
3182 ?
3184 ?(3182とセットで使用 3184→AH,3182→AL)
318E ?(ジャンプテーブル?のベース)disk_command_04
3190 ?(上記テーブルで使用? 3198まで?)
3192 ?
3194 ?
3196 ?
3198 ?
319A ?(読んだあと、and al,0CFh xor cl,al jzと続く)
319C SS(現在のSS:SP)
319E SS
31A0 SP
31A2 SP
31A4 SI
31A6 SI
31A8 SP(ローカルSP)
31AA SP
31AC ?
31AE ?
31B0 ?
31B2 ?(起動時にクリアされる)
31B8 ?(起動時にクリアされる)
31BE ?
31CC ?
3A50~3A5A ?
3A64 ?SP(割り込み処理で使用)
3A66 ?SP
3A68 ?SS
3A6A ?SS
3A6C ?(MasterPIC IMR)
3A6E ?(SlavePIC IMR)
3A70 ?(割り込み要因レジスタの値)
3A98 ?
3B50 ?
3B60~3B6E CD_CMOS_PARA
3B70 CD_CMOS_DATA0
3B72 CD_CMOS_DATA1
3B74 CD_CMOS_DATA2
3B76 ?
3B78 CD-CMOS_DATA3
3B7A ?
3B7C ?
3B7E ?
3C22 ?
3C24 起動時のDX
3C26 起動時のDX
3FC6 ?
3FC8 ?
2020-10-02 11:09:53
ああ、ごめんなさい。
上の資料は元々モデル2で逆アセしてたのですが、途中でHCになったので混在している可能性が有ります。
2020-10-02 11:11:43
たまにはこっちにも書いてみます(?)
TownsOSや起動時の処理に影響するCMOSの内容を、既知の物も含め2点あげておきます。
3C1A 起動時メモリ診断モード(0=通常モード、1=簡略化モード) 3代目あたりから有効
3AD8 各種フラグ (bit7が1の場合、高解像度モードモードON) ハイレゾ機で有効(とはいっても起動時に参照するわけではない)
2020-11-07 12:31:39
SCSIのPhaseのMESSAGE_INとSTATUSの順を入れ替えたら、とりあえずSCSIのエラーは出なくなりました。
が、HIMEM.SYSインストール中に割り込みハンドラを破壊という現象が起きていて原因を調査中です。
なお、デバッガで BRKON INT 21 AH=3D としておくとfile openで止まるので、pri cst するとどのファイルを開くとこかわかるようになってます。
2020-07-28 12:59:54
VERR/VERWありがとうございます。VERRを通過して、CLTS(0Fh 06h)で死亡しました。T-OSはなぜタスク機能を使ってるのか……。
お盆あんまり関係ないんですよね。まとまった時間取れれば集中してドライバ書いてたいのですが。
2020-08-14 21:33:10
CLTS実装ありがとうございます。TBIOSLD.SYSとTOWNS.SYSを組み込んだ状態で起動するようになりました。
ですが、COCO で forrbios.nsd を組み込むとコードでない場所(V86モード)を実行して止まるようです。
(COCOを組み込まなくても適当なEXPを起動してると同じようなところで停止。同条件でEMM386を組み込まない場合は問題なし。)
なんとなく根が深そうなので、お時間あるときに見ていただけら嬉しいです。
2020-08-15 15:15:40
あらぬ場所にジャンプしてしまう現象は、考えられる可能性として高いのは、
(1) Exceptionを正しく出してない。
(2) Exceptionの出し方が正しくない。
(3) Task Gateを使ってジャンプしている。
(4) CPUコアに未発見のエラーがある。
と、このぐらいだと思います。多分、(1)だと思うんですね。なんとか環境を作って調べられないか検討してみます。
2020-08-16 02:51:32
>>40
TOWNS-OS on DOS6環境を作るには、DOS6をインストールしたHDD区画に対して、TOWNS-OS V2.1L40以降のシステムCDを起動して、アイコンから新規インストール先として指定すれば、DOS6上にTOWNS-OSがインストールされます。
これで128MB超えのHDD区画もバッチリ認識……じゃなかった。これで上に書いた問題も再現します(V2.1L50にて確認)。
2020-08-17 18:16:55
了解しました!詰まったら、多分実家から回収してきたFM Townsシステムセットアップガイドを見ながらなんとかできると思います。(一応共著者に名前入ってるけどDOS6の部分は全部武井先生が書いた)。やってみます!
2020-08-19 05:36:29
状況再現しました。クラッシュは↓ですね?
3FF8:000014E1 FFFF
この直前がIRETDで、NT=1となっているので、どうやらTask Returnというのを実装しなくてはならないらしいです。戻ってくるアドレス自体は正しいのですが、素直にStack ReturnsしてしまうとVMフラグをクリアしてしまって、3FF8をセレクタと解釈してとんでもないリニアアドレスだと思っているようです。
想像なのですが、ここはRUN386の中のようで、このTask Returnした先でVMフラグをクリアして3FF8:000014E1に戻してRUN386に続きをさせるということではないかと見ています。
どのぐらい簡単か難しいかまだわからないので、ちょっと勉強してみます。
2020-08-19 08:45:30
うーん、もはやどれを信じていいのかわからない。i486 Programmer's Reference ManualのPsuedo Codeによると、
(* Protected mode *)
IF VM=1
THEN #GP(0)
ELSE
IF NT=1
THEN GOTO TASK-RETURN
と、あるものの、下の説明では、
#GP(0) fault if the IOPL is less than 3, to permit emulation
しかし、VM86モードのIOPLは3のはずだから、'less than'にはあたらない。ので、Pseudo Codeとテキストの解説が矛盾してます。結構こういう誤記なのか手抜きなのかわからない表記多いんですよね。
ここの記述→では、https://www.felixcloutier.com/x86/iret:iretd
IF(EFLAGS.VM=1)
THEN GOTO RETURN-FROM-VIRTUAL-8086-MODE;
ELSE GOTO PROTECTED-MODE;
RETURN-FROM-VIRTUAL-8086-MODE:
(*Processor is in virtual-8086 mode when IRET is executed and stays in virtual-8086 mode*)
とあり、その説明では普通にNTフラグにかかわらずStack ReturnするがVMビットは影響を受けない。とのこと。しかし、そんなことはi486 Programmer's Reference Manualを見る限りまったく書いてません。POPFDではそういう記述があるんですけどね。VMフラグそのたいくつかのフラグはPOPFDによって変化しないそうです。
それで、Task Returnを調べたところ、TSSにReturn先のTRが書いてなければならないことになってますが、EMM386環境ではタスクはひとつしかなくて、ほかのタスクにリターンしたくてもそもそも戻り先タスクが存在しなさそうです。
一番都合のいい解釈は、VM86モード下のIRETではVMフラグが変わらない以外は基本的に普通のIRETと一緒、とする説なので、そのようにしてみたところ、DOS6上でTowns MENUが起動しました。例によって現在ctestを流しているので、全部通ったらソースをPUSHしますね。
2020-08-19 09:44:41
>44 山川機長さん
もうある意味解決しているのかもしれませんが、INTELのia32_arh_dev_man_vol2a_i.pdfの該当個所を見てみると、
RETURN-FROM-VIRTUAL-8086-MODE:
(* Processor is in virtual-8086 mode when IRET is executed and stays in virtual-8086mode *)
IF IOPL=3 (* Virtual mode: PE=1, VM=1, IOPL=3 *)
THEN IF OperandSize = 32
THEN
IF top 12 bytes of stack not within stack limits THEN #SS(0); FI;
IF instruction pointer not within code segment limits THEN #GP(0); FI;
EIP ← Pop();
CS ← Pop(); (* 32-bit pop, high-order 16 bits discarded *)
EFLAGS ← Pop();
(*VM,IOPL,VIP,and VIF EFLAGS bits are not modified by pop *)
とあります。
2020-09-02 14:39:35
そうですね。とりあえずDOS6を走らすレベルでは解決しましたが、ありがとうございます!一応、i486 Programmer's Reference Manualというのを参考にしていて、Intelの公式出版物のようなのですが、エラーが多いです。Intel公式のSoftware Development Manual (多分ia32_arch_dev_man_vol2a_i.pdfがそれかな?) を参考にする方が良い、と、とある知り合いの方から教えていただいたので今後はそのようにしようかと思ってます。
2020-09-03 05:33:45