PC-98エミュを語ろう17 [無断転載禁止]©2ch.net

1名無しさん@お腹いっぱい。2017/07/14(金) 14:17:41.66ID:VdrgAP0f0
NEC PC-98シリーズは過去のものとなりましたが、
その膨大な遺産を活用できるPC-98エミュレータは非常に便利な存在です。
そんなPC-98エミュレータについて語りましょう。

■Windows用PC-98エミュレータ
Anex86
ttp://homepage2.nifty.com/ans/
T98-Next
ttp://www.geocities.jp/t98next/
Neko Project II
ttp://www.yui.ne.jp/np2/
ttp://retropc.net/yui/

■前スレ
PC-98エミュを語ろう16
http://egg.2ch.net/test/read.cgi/software/1482812256/

165名無しさん@お腹いっぱい。2017/08/27(日) 17:42:45.86ID:XYds7vYv0
HDDの隅で、
ystealth 0.92とysdinfoと言う物を見つけた。

しかし、ドキュメントを消してしまっていて、
使い方がわからない。

166名無しさん@お腹いっぱい。2017/08/27(日) 19:33:10.95ID:3myOjgeg0
>165

なんかどっかで見かけたファイル名だけどなんだか解らない...

167名無しさん@お腹いっぱい。2017/08/27(日) 19:42:31.61ID:74LKAM0z0
ROM EMS

168名無しさん@お腹いっぱい。2017/08/27(日) 20:34:33.28ID:lk74Z15X0
>>165-166
ググったらアッサリ見つかったよ。→ http://mai.privatelink.org/old/98dos.html
これは一度も使った事がないな。

169名無しさん@お腹いっぱい。2017/08/27(日) 21:11:45.40ID:1cmof/dl0
>>164
これはどういう使い道があるんや

170名無しさん@お腹いっぱい。2017/08/27(日) 22:11:42.01ID:axhj2H8h0
26K/86ボードが載っていない98で、OPNをつかいたい
という用途だな。

86ボード調達するほうが楽だよ。

171名無しさん@お腹いっぱい。2017/08/27(日) 23:09:25.84ID:XYds7vYv0
そうですか。

実機では、
 ・SNC サウンドオーケストラ(26K互換ボード)
 ・wavestar + ちいさなMIDIボード
だったから、ystealthを入手だけして使っていなかったのかも。

172名無しさん@お腹いっぱい。2017/08/28(月) 01:55:09.92ID:vdHocwc80
ySTEALTHの話題とNEKO BUSの話題がごっちゃになってるぞw
これだけじゃあれなので手元にあったySTEALTHのドキュメントあげとく。
https://pastebin.com/50yzweZQ

173名無しさん@お腹いっぱい。2017/08/28(月) 08:55:11.13ID:tjjFFnI30
>>169
おそらくRE:birthを所持している前提で98にも転用したいという用途だろう
あと86ボードではオミットされているADPCM機能も付加されているらしい
>>170のとおり後から音源付けたいからという理由でこれを選ぶ選択はないと思う
86ボードをオクで手に入れるよりも割高になってしまうし、部品のハンダ付けも自分でやる必要がある

174名無しさん@お腹いっぱい。2017/08/28(月) 12:20:37.41ID:+1J9ZGHN0
>そして、PC-98ゲーマーを悩ませたSSG音量問題も RE:birth YM2608モジュールなら自由自在!
>26互換音源登場から32年、遂に解決します。
SSG音量問題って何?音量が小さいって事?
98はDSから使ってるけどメーカー出荷状態がデフォルトだと思ってた。

175名無しさん@お腹いっぱい。2017/08/28(月) 17:03:34.21ID:Dm8ojSFt0
>>174
音源が内蔵タイプと外付けボードでSSGの音量が違う問題じゃないかな
一部のゲームで起動時に音源が内蔵か外付けか聞いてくるでしょ

176名無しさん@お腹いっぱい。2017/08/28(月) 18:49:53.12ID:Z3uuhnpE0
>>172

おおおおぉぉぉ

ありがとうございます

177名無しさん@お腹いっぱい。2017/08/30(水) 00:32:07.92ID:P+ewdpZ/0
某氏の98ソフトDBが約6k件登録されてるって事で見てみたら
同一タイトルの5.25"、3.5"、CD-ROMが別レコードになっててorz
※手持ちDB(リスト)はPC-98x1Gamelistベースに未記載(or 未確認)で
 確認できたものを追加とか途中までFD版とCD版を分離したモノ(約4k件)
その後ソフトハウス+タイトルでユニークしてみたら
 某氏DB > PC-98x1Gamelist
になって「おおぅ」とは思ったものの、これ半手動で統合とか考えるとorz
※某氏約4k件、PC-98x1Gamelist約3.8k件

178名無しさん@お腹いっぱい。2017/09/02(土) 18:15:53.30ID:tWpj7cyh0



179名無しさん@お腹いっぱい。2017/09/05(火) 23:40:51.04ID:bf789ie10




1801432017/09/10(日) 22:50:47.11ID:Gt03NgvE0
>> 162
ソース構成よくわからないのでデバッガで追ってみる。

x86版np21w_r34にERCACHE.EXEを組み込んで落ちるところを確認。

np21w+0x67210 の OUT DX,AX 処理の中で
変数 np21w+0xA09F94 は 1
変数 np21w+0xA09F96 は 1
そこから np21w+0x2B550 の関数を呼びに行って
そのあと cpu_stack_push_check からの SS_EXCEPTION を2回流して triple fault になってる模様。

np21wの仮想86モード遷移の管理が一部正しくないような雰囲気ですが、
OUT DX,AX の処理がソースのどこにあるかわからず、変数の意味がわかりませぬ...

実機では、I/Oトラップの一般保護違反→仮想86モニタに飛ぶ→処理して帰る な部分なので
仮想86モニタに遷移せずスタックフォールトに判断されてる理屈が不明。

181名無しさん@お腹いっぱい。2017/09/11(月) 20:24:55.93ID:4N63lD/F0
>>143
>>180
ソースを少し調べてみたので報告。コンパイルできるようなら以下の変更箇所確認して試してみるとよいかも。
それと、少し古いソース(np21w-0.86-rev26beta)で調べたので行数は違うかもです。
修正箇所はia32/cpu_mem.cの220行目からの関数cpu_stack_push_check内の229、230行目
start = sp - len;
limit = is32bit ? 0xffffffff : 0x0000ffff;

sp = (sp - 1) & (SEG_IS_32BIT(sdp) ? 0xffffffff : 0x0000ffff);
start = (sp - len) & (SEG_IS_32BIT(sdp) ? 0xffffffff : 0x0000ffff);
limit = sdp->u.seg.g ? 0xffffffff : 0x0000ffff;

に変更。SEG_IS_32BIT(sdp)のところは、意味的にはis32bitの方がよいのかも?(計算上は同じです)
一応変更の根拠としては、
まず検証環境として、config.sysに以下を追加

device=a:\ERCACHE.EXE /HM /M=A5-A7,D0-D3 /HSB-

これで、修正前のnp21wでtriple faultが発生するのを確認。
この状況でこの関数に入ってくるとき、sp=0x0000、len=0x0028になっており、修正前だとstartが0xffffffd8になって、
その後の(start > sp)の条件に引っかかってしまいます。
しかし、スタックのプッシュ処理は最初に格納するサイズ分減算し、そこからサイズ分書き込むので、
実際にはアドレス0x0000に書き込まれることはなくそういう意味では保護範囲のチェックとしては必ずしも適切ではないといえます。
ということで、変数spを実際に値が書かれる最終アドレスに書き換えてその上でアドレス判定をするように変更しています。

ついでに、limitの上限値の判定がセグメントディスクリプタのD/Bビットと見受けたので、Gビットに変更しています。
これについては関連して他の場所も直した方がよいのでは?と思うところがいくつかあったのですが、
十分に検証できていないのでそのままにしています。

182名無しさん@お腹いっぱい。2017/09/12(火) 16:36:18.20ID:cjrbzZj+0
cpu_mem.c
cpu_stack_push_check()の終わりのあたり。

if ((len > sdp->u.seg.limit) /* len check */
|| (start > sp) /* wrap check */
|| (sp > sdp->u.seg.limit + 1)) { /* [1] */
goto exc;
}



if (sdp->u.seg.limit != 0xFFFFFFFF) {
if ((len > sdp->u.seg.limit) /* len check */
|| (start > sp) /* wrap check */
|| (sp > sdp->u.seg.limit + 1)) { /* [1] */
goto exc;
}
} else {
if (start > sp) /* wrap check */
goto exc;
}

とやると、triple faultしない何かが出来上がったよ。
TLBからキャッシュを引こうとして?グルグルループしちゃうけど。

>>181 をこっちの別件triple faultで試してみたけど、改善しなかった。

1831812017/09/12(火) 21:02:25.46ID:b9fFTbG00
>>143
>>180
すみません。一点訂正です。
limit = sdp->u.seg.g ? 0xffffffff : 0x0000ffff;
これは間違いで、もともとの
limit = is32bit ? 0xffffffff : 0x0000ffff;
のままで正しかったです。
セグメントディスクリプタの理解が不十分でした。失礼しました

1841812017/09/12(火) 23:24:56.81ID:b9fFTbG00
>>180
度々申し訳ない。まだありました。182のレスを読んで気がついたのですが、
spをデクリメントしても他の修正は不要と思っていたのですがそんなことなかったです。
325行目の
|| (sp > sdp->u.seg.limit + 1)) { /* [1] */
はspをデクリメントしているので+1は要らなくなりますね。
こっちの条件は通ってなかったので見落としていました。

1851822017/09/12(火) 23:42:09.61ID:cjrbzZj+0
>>184
乙です。
182も0xFFFFFFFFの分岐は要らなくなり、スッキリしました。

1861432017/09/15(金) 00:26:16.13ID:km0esGyq0
>>184
>>185
ソース情報ありがとうございます。

開発環境は準備中なので、取り急ぎ、情報を元にソースの exc に行かないよう
np21w+0x2BB3F からの5バイトを 90 90 90 90 90 に変更したところ、
ERCACHE.EXEドライバが無事組み込まれました。
ありがとうございました。

でもDOS=HIGH,UMBにすると、例外#5(BOUND CHECK)でERCACHEの仮想86モニタに落ちました。
MELEMM.386でtriple faultになる件も再現しました。

先は長そうです。

187名無しさん@お腹いっぱい。2017/09/16(土) 02:28:50.20ID:Ah+PzKNq0
limit = is32bit ? 0xffffffff : 0x0000ffff;
sp = (sp - 1) & limit;
start = (sp - len) & limit;
でスッキリ

188名無しさん@お腹いっぱい。2017/09/16(土) 03:27:19.98ID:Vgze0ekZ0
あれいつの間にかfmgen版でシムシティ2000が640×480で表示できるようになってる
あざーす

1891432017/09/16(土) 11:17:36.49ID:mnVksUfr0
>>186
長くなかった

毎回デバッガで実行するのが面倒なので、r34(x86) EXEファイルの先頭から0x2AF31からの2バイトを
8B 55 → EB 11
にしてスタック例外を飛ばした版を作り、

ROM領域を眺めてD2,D8をUMBから外したら DOS=HIGH,UMB でも動くようになりました。
お騒がせしました。

残り
・ERCACHE環境でHSBの再起動が効かない
・MEMEMM.386+FDが落ちる件
・開発環境

1901432017/09/16(土) 15:02:33.55ID:mnVksUfr0
>>189
np21wのERCACHE環境でHSBが効かない件

ERCACHEが持ってるIO禁止マップに関係無く、I/OがERCACHEの仮想86モニタに飛んでくるため。
HSBからの OUT FFFEh 協調I/Fが誤って届くので、ERCACHEを残したHSB再起動機能が発動している。

これはパッチでの対処は無理ぽい。

1911432017/09/16(土) 16:37:15.87ID:mnVksUfr0
>>190

ソース見たら check_io でIOMAPを見るコードはありましたが、
HSBのポートFFFEhからのWORDアクセスは誤判定されてGP_EXCEPTIONに。

ファイル+2AA06 72→EB にパッチしてGP_EXCEPTIONに行かないようにしたら、
ERCACHE環境でのHSB再起動は正しく動作するようになりました。

192名無しさん@お腹いっぱい。2017/09/17(日) 02:33:21.82ID:LD62E7ic0
そういや猫のSCSIのHDDってWindowsでも使えるんかな

193名無しさん@お腹いっぱい。2017/09/17(日) 07:17:16.66ID:6Cdmm3A50
GARUDIUSのタイトル画面は実機も下切れるよな

194名無しさん@お腹いっぱい。2017/09/17(日) 08:57:41.21ID:IR5IM/xA0
>193
うるせぇ! こんなのはガルディウスじゃねぇ!グラディウスで充分だ!!

195名無しさん@お腹いっぱい。2017/09/17(日) 15:57:53.69ID:AuNYmM9K0
GARUDIUSググったらほんとにあってワロタw

196名無しさん@お腹いっぱい。2017/09/17(日) 17:22:36.09ID:IR5IM/xA0
ちなみにTATSUJINライクなPC-88用縦スクロールシューティングゲーム「DOUJIN」なら、昔コミケかパソケットのどちらかで買った。
テキストVRAMで描画の大半を行う事により、低解像度ながらオリジナルのアーケード版TATSUJINに匹敵する面白さを実現できた。

あと、俺の記憶が確かならPC-88用のグラディウスやシルフィードは、ディスクアクセス中もBGM再生に限らず
あらゆる動作が途切れない仕様だったはず。

197名無しさん@お腹いっぱい。2017/09/17(日) 17:29:17.66ID:AoAI310W0
にわかは死ね!

198名無しさん@お腹いっぱい。2017/09/17(日) 18:33:03.99ID:kl6YOwFS0
俺、ニカワ

199名無しさん@お腹いっぱい。2017/09/17(日) 19:09:05.94ID:VZx1I0kH0
俺、ニカウ。

200名無しさん@お腹いっぱい。2017/09/17(日) 19:16:28.33ID:kl6YOwFS0
>>199
つまんねえよ、駄洒落糞親父!
罰としてハッピーブッシュマンを98に移植しろ。

201名無しさん@お腹いっぱい。2017/09/17(日) 22:21:11.69ID:Z5zk9i9m0
>>196
Shootarianくらいは出せよ

202名無しさん@お腹いっぱい。2017/09/17(日) 23:24:56.69ID:wz5vuqjS0
PC-88用縦スクロールSTG「Doujin 海賊版」
https://www.youtube.com/watch?v=mbU89pWDR8w

2031432017/09/17(日) 23:28:07.15ID:q2ioCxxX0
やっと開発環境ができました。

>>187
こちらのERCACHE環境でも動きました。
ありがとうございました。

>>191
check_io.c
 if ((port + len - 1) / 8 >= CPU_STAT_IOLIMIT) {
と -1 を追加したらERCACHE環境でもHSB再起動できました。

MELEMM.386+FDはTRACE出せたので眺めるつもり。
入口はCALL_Aw、落ちてる場所はpaging ぽいですが途中が。

204名無しさん@お腹いっぱい。2017/09/18(月) 00:56:32.95ID:sqq5YK380
melemm.386でFDは普通に動いてるけどどうすると例外でるん?
バージョンの違いかね
melemm 5.14
fd 3.13
ちなmelemmはEMSとXMSのみでUMBはemumbx

2051432017/09/18(月) 17:19:23.00ID:6yI4M3gP0
>>204

こちらのFDはv3.12
MELEMM.386 v5.22 +patch +FD v3.12
 /HM があると、triple fault
 /HM が無いと、落ちない
MELEMM.386 v5.36 +patch +FD v3.12
 /HM があると、リセット
 /HM が無いと、落ちない

v5.22の方が調べやすそうです。
既に暴走した後かもしれませんが...

206名無しさん@お腹いっぱい。2017/09/18(月) 18:29:01.25ID:iRJKOthY0
/HM (XMS)でも問題無いのだがFD 3.13ではどう?
ttp://www.vector.co.jp/download/file/dos/util/fh045271.html

2071432017/09/18(月) 19:48:47.94ID:6yI4M3gP0
>>206
MELEMM.386 v5.22 +patch +FD v3.13
 無限ループになりました。

>>205
DOS=HIGH が条件に漏れてました。

VERBOSEが拾いにくいので、直接OutputDebugStringでデバッガに流してみました。
exceptionでログ採ると、triple faultよりだいぶ前に 0040:0000 で無効命令例外が起きてる模様。
アドレスが変なのと、cpu_disasm2str()でコードを出せないので、その前に暴走してるんだと思われます。
MELEMM.386のプロテクトモードコードのどこかを正しく処理できないんだと思います。
triple faultで落ちるときの命令は各種。CALL_Awに限りません。

そういう意味では5.1xから5.20への変更部分に起因してるのかもしれませんね。
昔調べた情報どこに置いたやら...

208名無しさん@お腹いっぱい。2017/09/18(月) 20:37:11.53ID:iRJKOthY0
管理メモリが16MBから64MBに変更された辺りか

2091432017/09/18(月) 23:53:25.86ID:6yI4M3gP0
>>208

EMSUTY BENCH を試すと、物理ページが連続していないと指摘されました。
見ると、CC00 E000 E400 FFFF とか変なことになってました。

ということで、組み込み時点でC000-CFFFにならない理由を調べる必要がありそうです。

2101432017/09/19(火) 00:32:27.27ID:pNETuhBV0
>>209

MELEMM.386 v5.11が発掘されましたが、E000 E400 0000 0400 とか変なのは変わらず。
5.14を持ってたかは記憶無し、v4.78とかはfloppyを探す必要があるのでパス。

v5.36で/SD C000 を指定すると、CC00の1ページだけになり、FDは落ちなくなりました。
FD起因ではなく、GVRAMとかHMAにページフレームが重なってるせいで確定のようです。
なんで重なるのかは引き続き。

211名無しさん@お腹いっぱい。2017/09/19(火) 00:32:40.39ID:gYRjxifv0
melemm.386はオプション付けてやらないとまともに動かないからな
/P C0,C4,C8,CC /HM

212名無しさん@お腹いっぱい。2017/09/19(火) 01:22:28.31ID:u4l+HWb20
>>193
実機でも切れてるっぽいです。(Cx2で確認)

2131432017/09/19(火) 10:11:14.84ID:pNETuhBV0
>>211
v5.36で /P 指定するとC0-CFを確保でき、FD起動しても落ちませんでした。
ありがとうございました。

実機で /P 指定したことないので、指定しなくても通せれば吉。
余裕あれば眺めてみます。

2141432017/09/19(火) 12:32:36.61ID:pNETuhBV0
>>213
WORD単位でページ全域AND取って、0になるページは「何かある」判定されてる模様。

C000-CFFFにFFhを埋めるコードを作ってDX.COMで実行してからMELEMM.386を組み込むと、
/SDや/P指定無くてもC000-CFFFを確保可能になり、FD動かしても落ちませんでした。

np2/21W環境て、RAM無しか、リセット時FFhにできないものでしょうか?

2151432017/09/19(火) 14:58:01.07ID:pNETuhBV0
>>214
mem\memems.c を触って、Cバンク全体を書き込み無視/読み込み0FFh固定 にしたら、
MELEMM.386もうまく組み込まれるようになりました。

この状態でしばらく使ってみます。

新着レスの表示
レスを投稿する