2014年04月16日

メモリチェックまで

np2をPC-286の設定にしてITFを出力させたものをFlashに書いたところ、
無事にメモリチェック画面まで表示させることが出来ました。
当然、np2のITFなので互換ITFになります。
どのように判定しているのかは分かりませんが、拡張メモリも768kBまで
メモリカウントしているようです。

点滅しているカーソルはまだ座標や表示有無をハード的に固定しているためです。

ただ、その後、これもまたnp2でパッチを当てた(np2は実機BIOSに
パッチを当てて使用するようです)BIOSも吐き出させてFlashに焼いたところ、
SMSW AXという命令で異常動作を始めるようでN88(86)は起動しませんでした。
SMSW AXというのは聞き覚えの無い命令ですが、どうやら286から追加された命令
らしく、その前にシステムポートのSHUT0を立て、その後に
IOポートの00f0に00を書いている(CPUを286等に切り替えてリセット)為、
286以降のCPUでしか動作しないということでしょう。
僕の手持ちのBIOSでは80186相当のZetのプロセッサでは動かせない、
ということでしょうか。
posted by プー at 02:46| Comment(14) | Zet/98 | 更新情報をチェックする
この記事へのコメント
VX/286ともに286が前提ですから、V30だけのVMモードで試してみては?
(ダメでしたっけ?)

SMSW AXは現在のモードをAXに代入するものです(286新設)。
286の場合はリアルモードかプロテクトモードかしかありません。
286の命令一覧を参照下さい
zsmith.co/intel.html
hp.vector.co.jp/authors/VA003988/asm.htm
Posted by かかっくん at 2014年04月17日 05:27
SMSW AX以降の内容にもよりますが、nopでつぶして様子を見るという
のはいかがでしょう?
ちなみにプロテクトモードの実装はnp2には最小限の機能しかなかった
ような...
Posted by かかっくん at 2014年04月18日 01:17
smswの後は286でリセットするようになっているようです。
smswに入る前にシステム領域0000:0480から
cpu種を読み出しているのですが、このアドレスを
biosやitfが初期化していない為sdramの初期値で
386以降と判断され、この処理に入っているようです。
Posted by プー at 2014年04月18日 14:14
追試しようとITFを取り出していますが、うまくいかないようです。
NP2でMKBIOSを使うとSOUND.ROMかBIOS.ROMを書き出したあとに
リセットがかかります。
デバッガでポートを操作してROMをBIOSからITFに切り替えただけでも
リセットされます。

どのようにやりましたか?
Posted by かかっくん at 2014年04月22日 22:42
ITFやBIOSの吐き出しにはエミュレータ自体を
改造して行っています。
np2はsourceが有るので。
bios/bios.cでbiosやitf含むメモリ初期化を
している様ですが、その後でforループとfputcで
ファイルに書き出しています。
(x11版なので他のバージョンだとディレクトリ構成が
違うかもしれません)
Posted by プー at 2014年04月23日 01:53
なるほど、NP2で書き出すのではなくNP(改)に書き出させるんですか
やってみます。

BIOSの書き出しだけなら労さずともできるのですが。

ついでに、T98-Nextの互換BIOSでNP2をブートできました。
T98Nは486なので逆はできてもコレはダメだろうと思っていましたが、
変な命令は使っていないようです。

T98NもITFの書き出しはダメでした。止まるだけでリセットは
かかりませんが。
Posted by かかっくん at 2014年04月24日 14:26
fd80セグメントは実機biosを使う場合でもnp2では自前の
コードに書き換えているようです。
この部分に機種依存コードや初期化ルーチン、
システムコールが書かれているようで、
色々な機種の実機biosでも動作させられるように
なっていますので他のエミュレータの互換biosでも
動作させられるのでしょう。

np2はシステム領域(の一部)はエミュレーション
上のcpuからではなく、エミュレータ自体が初期化
しているようで、cpu種やディップスイッチ
設定によってエミュレータがシステム領域の
値を設定しているようなのでこの部分はitfに
機能追加しないとfpga版では正常に動作しない
様です。また、一部ioの初期化もエミュレータ自体が
行っているのでこれも追加が必要なようです。
(お陰様でソースが付いているのでそれ程
大変では無さそうですが、binからcのソースに
変換するDOSプログラムソースコードも付いていますが
ansiに合致していないのかlinuxやcygwinでは
コンパイルが通らないしx64環境ではタダでは
DOSコードは走らないので作り直す必要が
ありそうです)
Posted by プー at 2014年04月25日 11:54
> fd80セグメントは実機biosを使う場合でもnp2では自前の
> コードに書き換えているようです。
> この部分に機種依存コードや初期化ルーチン、
> システムコールが書かれているようで、
> 色々な機種の実機biosでも動作させられるように
> なっていますので他のエミュレータの互換biosでも
> 動作させられるのでしょう。

でしょうね。
T98Nの互換BIOSはスカスカで、ほとんどがIRET(CFh)で埋まって
います。次はNP2をT98Nの互換BIOSで起動してGETBIOSしてみます。

ちなみに、BASICを使わなければBIOSはF8-FF(32K)だけでも動くよう
で、DOSでその部分をつぶしてUMBにしても正常に動作します。
隠し機能でROM BASICを使用しない設定にするとE8-F7にRAMが出る
ようにしておくと幸せかも

> np2はシステム領域(の一部)はエミュレーション
> 上のcpuからではなく、エミュレータ自体が初期化
> しているようで、cpu種やディップスイッチ
> 設定によってエミュレータがシステム領域の
> 値を設定しているようなのでこの部分はitfに
> 機能追加しないとfpga版では正常に動作しない
> 様です。また、一部ioの初期化もエミュレータ自体が
> 行っているのでこれも追加が必要なようです。

本来はITFがすべき処理ですが、処理を速くするためでしょう。
初期化済みの方が起動が早くなるので。
今ではホストCPUが充分に速くなったのであまり問題になりませんが、
開発初期の頃は286/10エミュレートが精一杯だった(特に林檎版など
異CPU用)ので。

> (お陰様でソースが付いているのでそれ程
> 大変では無さそうですが、binからcのソースに
> 変換するDOSプログラムソースコードも付いていますが
> ansiに合致していないのかlinuxやcygwinでは
> コンパイルが通らないしx64環境ではタダでは
> DOSコードは走らないので作り直す必要が
> ありそうです)

ANSIに合致していないというよりVC++がヘンテコなんです。
昔のMS-Cからそうでした。
当時は私用でLSI-CやTurboCを使っていて、窓では今でもその流れで
BC++を使っていますが、やはりVC++のままのソースではビルドでき
ません。まぁ多少の方言はありますが、ここまでヘンなのも...

仕事で窓用プログラムを組む事もありますが、Lin上でクロス開発を
しているので苦労が多いです。
窓でセルフならもっと楽でしょうけど、こんなにセキュリティに
問題があるOSを開発に使いたくありませんし。
さすがにバグ出しは互換性問題とかが出ては仕事にならないので
Wineではなく窓ですが。
Lin/BSDならいいのか?というと最近のOpenSSLのような事もありま
したし。
組み込みはターゲットにOSを載せない事が多いので最初からアセン
ブリがほとんどですが。

x64 PCでDOSプログラムを動かす方法はいくつかあります。

・LinでVMやPCエミュレータを使いDOSを動かす
 VMWareやOracle VM VirtualBoxがあります
 仕事で前者を、私用で後者を使っています。
 www.vmware.com/jp
 https://www.virtualbox.org/
・窓でVTDOSやDOSBox・MS-DOS Playerを使う
 VMを使う手もあります
・x64としてではなくx86(i386)として直接DOSを動かす

DOS自体はHDDのユーティリティなどに入っているので、CD/DVD-R(W)
に焼きます。キー配列が違うのでご注意(US)。
HGST(DFT/Feature tool)のPC DOSはライセンスが微妙なので、
Seagate(SeaTools)のFreeDOSやMaxtor(PowerMAX)のDR-DOSがいいで
しょう。小容量のUSBメモリをFAT16で初期化して目的のファイルを
容れます。VMならUSBメモリの代わりに仮想FDなどでもできます。
イメージファイルはベタイメージならLinでもマウントできます。

64bit用のブートローダでは16/32bitのOSは動きませんのでご注意。
32bit用のブートローダは各ディストリビューションの32bit用パッ
ケージに入っていると思います。インストールしなくても取り出せる
でしょう。
Posted by かかっくん at 2014年04月27日 00:16
DOS用プログラム自体はファイル関係をansi用に
書き換え、linuxでコンパイル出来るように改造しました。
ですが、zipに入っているファイルのファイル名が全て大文字だったりmakefileがDOS用に書かれていたりするので
ファイル名を変えたり手動でアセンブルかけたりするのが
必要なようです。
また、BIOSはnasmで、ITFはmasmで書いてある様で、
nasmはlinuxに有りますがmasmは無いのでITFも
nasmでアセンブル出来るように書き直した方が
完全にフリー環境で開発が出来、公開後も手離れが
良いでしょうからnasm用に修正しようと思います。
Posted by プー at 2014年04月28日 14:11
メモリ空間は基本的に全てsdramに割り当て、vramや
bios等はマップに上乗せする様な書き方をしている為
空き部分には基本的にramが現れるのですが(umbのように使える筈)、
umbとして使用するにはDOSにどの範囲が使用可能か
登録・教える手段が必要です。
実機であればemm386等の仕事ですが、登録だけ、というのは
どの様に行うのでしょうか。
Posted by プー at 2014年04月28日 20:27
VectorにEMUMBというドライバがあります。F改はV30なのでEMM386等は使えない
ので、コレで登録しています。386以降(NP21/T98N)ならEMM386等との併用(RAMが
ない部分をマッピングする)もできます。
RAMの範囲はセグメントで指定し、サイズはパラグラフ単位になります。
www.vector.co.jp/soft/dos/hardware/se010042.html

DOS3.3でDOSカーネルをUMBに移動できます。内部バージョンに依存するようです。
入っているDH.COMでUMBにドライバを登録したりTSRをロードしたりできます。
DH.COMは機種やDOSに依存せずPCやNTVDM(後者のみ)でも動きます。
www.vector.co.jp/soft/dos/hardware/se001731.html

EMSをXMS(EMB)として使えます(シェアウェア)。
www.vector.co.jp/soft/dos/hardware/se009690.html

CONFIG.SYSで外部コマンドやTSRをロードできます。起動中に画面を消去したり
キー入力したいときなどに使えます。
www.vector.co.jp/soft/dos/util/se001116.html
www.vector.co.jp/soft/dos/util/se001117.html

おまけ
www.vector.co.jp/soft/dos/hardware/se007535.html
Posted by かかっくん at 2014年04月29日 08:37
かかっくん さん、なかなか良いソフトを多数紹介していただいて
ありがとうございます。
EMUMBはずばり期待していたソフトのようです。また、EMSをXMSとして利用できる EMS2XMS も
Zet/98で使ったら便利そうです。

DE0のSDRAMは8MBあり、現時点で(まだ動いた訳ではなくソースの話ですが)
4MBはEMSに割り当てるように書いています。(SDRAMは4つのバンクに分かれており、EMSに
2バンク割り当て)
80(1)86のアドレス範囲1MBに対し、8倍もの容量を持っているため、空きを放置しても
勿体無いのでEMSに割り当てるか、8000~9FFFセグメントのウィンドウに出せる
プロテクト?メモリのどちらにした方が有効活用できるかと考えていましたが
EMSにした方が有効に使えそうですね。
現在、ROM用領域(BIOS等をFlashから読み出してコピーを置く)がバンク0、
主メモリ(1MB)とG-VRAMがバンク1、EMSにバンク2と3を割り当てていますが
バンク0もバンク1も空きがかなりありますので隙間無く埋めればROM、主メモリ、G-VRAMも
全部バンク0に収めることが出来ると思います。
そうすれば3バンク、6MBをEMSに割り当てられるのでEMS/XMS対応ソフトも
大容量を扱えるようになりますね。
Posted by プー at 2014年04月29日 19:32
> EMUMBはずばり期待していたソフトのようです。また、EMSをXMSとして利用できる EMS2XMS も
> Zet/98で使ったら便利そうです。

EMS2XMSはシェアウェアですので念のため。

> 80(1)86のアドレス範囲1MBに対し、8倍もの容量を持っているため、空きを放置しても
> 勿体無いのでEMSに割り当てるか、8000~9FFFセグメントのウィンドウに出せる
> プロテクト?メモリのどちらにした方が有効活用できるかと考えていましたが
> EMSにした方が有効に使えそうですね。

ぃぇ同じ80-9Fに出すバンクメモリ(BMS)にもできた方がいいですよ。
実際はXMSは80-9Fに出してアクセスするソフトはありましたが、他には少なかった
のでその方式では8086/V30ではほとんど使い物になりません(対応機種が限られる
ため)でしたが、バンクメモリはかなりのソフトが対応しました。

ポート00ECh(0~FFh)でバンクを指定します。以前の説明の通り、バンク0はメイン
メモリです。リセット時は必ず0にします。
普段はドライバがバンクを戻すので気にする必要はありません。
バンク1~255の内容は初期化しません。これによりリセット時もRAMディスクの
内容が残ります。
BMSが有効な場合はDIP-SW 3-6と無関係にメインメモリを512Kにすると実装が
楽でしょう。

> バンク0もバンク1も空きがかなりありますので隙間無く埋めればROM、主メモリ、G-VRAMも
> 全部バンク0に収めることが出来ると思います。
> そうすれば3バンク、6MBをEMSに割り当てられるのでEMS/XMS対応ソフトも
> 大容量を扱えるようになりますね。

6MをBMS-EMSで0-0(両方未使用)/0-6/6-0/3-3にすると設定が2bitで済み良さ
そうです。

あとはEMSのポートですが、UNDOCにあるのはNEC純正EMSボードの場合で普及
しませんでした。I-O(00E8h~00EBh)もBUFFALO(当時MELCO、xxEEh~xxEFh)も
別のポートでした。プログラマブルにするといいでしょう。
Posted by かかっくん at 2014年05月01日 05:59
286以降ではプロテクトメモリがリアル
モード時でもアクセス可能な8000-9fffにも
割り当て可能だとundocumentedからは
読み取ったのですが、bmsとプロテクトメモリ
で切り替え可能なcバスメモリボードが
有ったとネットに有りましたので
全く互換性の無い物なのでしょうか。
それとも、286以降ではプロテクトメモリ設定で、
それ以前はバンクメモリ設定で使うという
事なのでしょうか。

バンクメモリとemsの切替は、バンク単位の方が
回路が簡単になるので、プロテクトメモリ容量を
0,2,4,6MBで切り替えて、残りをバンクメモリに
充てるのが簡単ではないかと思います。
(両方無効にする設定は特に無くても良いかと。
バンクメモリも同じsdramの一部なので
そのアドレスだけウェイトが増えるわけでもない)
Posted by プー at 2014年05月06日 02:56
コメントを書く
コチラをクリックしてください