#9059/9100 ソフトウェア ★タイトル (CQF15666) 96/ 5/12 18:57 (196) 893>EMJシリーズ解析情報【長文】 / えらー15 ★内容  893ヘッダ久しぶりだなぁ…  今回はEMJ相当ボードのI/Oポート情報の改訂版です。もう誰もこんな情報 使わないかもしれませんけど、かまわずアップします。  調査に使ったのはEMJ-4000mkIII,EXJ-4000L,EMJ-16MR,EMJ-4000S(新型)と ESB-8000です。 【EMJメモリ制御】  EMJ制御は、次の3つから構成される   (1)EMSウィンドウ番号の設定   (2)EMSウィンドウセグメントの設定   (3)EMSメモリのマップ/アンマップ  最終目的はマップ/アンマップのため、(1)(2)は適宜省略可能であるが、 マップ/アンマップ前に最低1回は(1)(2)を行って初期化しておくことが 必要になる。 【EMSウィンドウ番号の設定】  EMJは、EMSの各ページを展開するための領域として16KB単位のEMSウィンドウを 8個使うことが出来る。これをウィンドウ番号と呼び、0〜7が用いられる。 out 6xEE,byte ウィンドウ番号(0〜7)  ここで「x」とは論理的なSW1の値のことである。各ボード同じ様に使うには 全ボードに対して同じ設定値でウィンドウを初期化する必要がある。  なお、EMJ-mkII/mkIII/L/R/S(旧型)は8〜15の値をOUTすることもできるが これは0〜7のイメージとなる。 【EMSウィンドウセグメントの設定】  EMSウィンドウにそれぞれセグメントを設定できる。設定は16KB単位でなければ ならない。 out 6xEF,byte セグメントアドレス上位(16KB単位)  通常はC0,C4,C8,CC,D0,D4,D8,DCのいずれかを用いるが、メモリ空間さえ開ければ 80,84,88,8C,90,94,98,9C,E0,E4等も使用可能になる。 【EMSメモリのマップ/アンマップ】  正常に動作させるにはマップ/アンマップの前にウィンドウ番号とセグメントを 設定しておく必要がある。 out 7xEE,word (m0ww0ppp pppppppp)b m:マップするかどうか 1:マップ 0:アンマップ w:ウェイトキャンセルオプションの設定値 EMJ/mkII/mkIII/L/R/S(旧型) 0または2 EMJ-S(新型)         0(2をOUTしても無効) 謎のボード 0または2 その他のEMJ相当品 0または2 p:各EMJでのページ番号 EMJ/mkII/mkIII/L/R/S(旧型) 0〜 511(最大容量 8MB) EMJ-S(新型)         0〜2047(最大容量32MB)                              注:製品は16MBまで 謎のボード 0〜 511(最大容量 8MB) その他のEMJ相当品 0〜 511(最大容量 8MB)  バイトアクセスとワードアクセス、どちらを使っても構わない。  EMSページ番号としてメインメモリ、あるいはバンクメモリやプロテクトメモリに 割り当ててあるページを指定することも出来るが、注意して扱う必要がある。 【EMJ情報取得】  EMJの情報をINポートから得ることが出来る。 in 6xEE:byte (ssssfwww)b s:EMJメモリサイズ EMJ/mkII/mkIII/L/R/S(旧型) 1〜8(単位MB)(最大容量 8MB) EMJ-S(新型)         0〜15(単位MB)(0のとき16MB) 謎のボード 0〜3:2MB 4〜7:4MB 8〜B:6MB C〜F:8MB その他のEMJ相当品 0:512KB 1:1MB 2:2MB 3:1MB 4〜7:4MB 8〜B:6MB C〜F:8MB f:EMJ判別ビット EMJ/mkII/mkIII/L/R/S(旧型) 以前にこのビットにOUTした値 EMJ-S(新型)         1:EMJ-16MS 0:それ以外 謎のボード 常に0 その他のEMJ相当品 常に0 w:一番最後に選択されたEMSウィンドウ番号(0〜7)           電源投入直後は0 in 6xEF:byte (aaaabbbb)b a:SW1の設定値が現れる。(論理値) EMJ/mkII/mkIII/L/R/S(旧型)             EMJ-12M/16Mはボード2分割されている(SW1を2つ消費)             どの値が消費されるかはEMJハードウェアマニュアル参照 EMJ-S(新型)             EMJ-16MSはボード1つになっている(SW1を1つのみ消費) b:SW2の設定値が現れる。         このポートがFFhかどうか調べると実装調査が可能 in 6xEE:word (aaaabbbb ssssxwww)b  バイトアクセスとワードアクセス、どちらを使っても構わない。  EMJ相当品の存在確認は次のように行う if (in byte 6xEF != FFh) EMJ相当品存在...以下の処理継続 out word 7xEE,0 アンマップ ;ウィンドウイメージ8〜15による従来型EMJ振り分け out byte 6xEE,8 in byte 6xEE このときの値を保存 out byte 6xEE,0 in byte 6xEE if (最初x8hで次x0h)...以下の処理は行わない このボードがEMJ/mkII/mkIII/L/R/S(旧型)である 注:x8hでも新型EMJ-16MSがあるので必ず両方チェックすること ;謎のボード振り分け out word 7xEE,1FFh in byte 6xEE if (この値&30h == 30h) out word 7xEE,0 in byte 6xEE if (この値&30h == 30h)...以下の処理は行わない このボードが謎のボードである...知ってる人が居たら98Cまで(^^;) ;新EMJ-S振り分け1 out byte 7xEF,0 in byte 7xEF if (この値&8 != 0)...以下の処理は行わない このボードが新EMJ-Sである      注:実機はここでは新EMJ-Sと判断されない(実機は振り分け2に進む) ;新EMJ-S振り分け2 out byte 7xEF,0FFh in byte 7xEF if (この値&8 == 0)...以下の処理は行わない このボードが新EMJ-Sである ;その他    このボードがその他のEMJ相当品である 【マップ情報取得】  マップの状態をINポートから得ることが出来る。 in 7xEE:word (mawwfppp pppppppp)b m:マップしているかどうか 1:マップ 0:アンマップ 前回OUTした値が返される a:前回このビットにOUTした値 w:ウェイトキャンセルオプションの設定値 EMJ/mkII/mkIII/L/R/S(旧型)   前回OUTした値が返される EMJ-S(新型)   常に00が返される 謎のボード   前回OUTした値が返される? その他のEMJ相当品   前回OUTした値が返される f:新EMJ-S判別 EMJ/mkII/mkIII/L/R/S(旧型)   前回OUTした値が返される EMJ-S(新型)   常に0,あるいは1が返される(固定値) 注:実機は常に0を返している 謎のボード   前回OUTした値が返される その他のEMJ相当品   前回OUTした値が返される p:前回このビットにOUTした値            必ずしもページ番号と対応していないことに注意すること in 7xEE:byte (pppppppp)b in 7xEF:byte (mawwfppp)b  バイトアクセスとワードアクセス、どちらを使っても構わない。 【新EMJ-S使用時の注意事項】  MELWARE v5.36に付属のDRIVER.DOCには、EMJ-16MSを使う場合は必ずv5.20以降の MELEMM.SYSを使うように書かれている。これは新EMJ-16MSがメモリ容量値として0を 返してくるためであり、従来のMELEMM.SYSではこれに対応していない。  しかし、計算してみると新EMJ-Sで計算が正しくなるのは新EMJ-4000Sの場合だけで あり、その他の容量では計算結果が異なるためボードが正しく認識されない。 例えば新EMJ-4000SにEXJ-4000Lを付けて8MBにしても、MELEMM.SYS v5.18では6MBしか 認識されない。  この理由のため、新EMJ-Sは「必ず」MELEMM.SYS v5.20以降を使う必要がある。 【新EMJ-Sと初代EMJ】  上記理由により、新EMJ-Sは外見上は初代EMJと似ているがまったく別のボードと 思われる。 【その他】  EMJを直接操作するソフトがいくつかありますが、新EMJ-Sに対応しているかどうかは 各ソフト作者に御確認ください。必要であればこの情報の転載等を行っていただいて かまいません。 [ 18:43 12.May.'96 (Sun) By *Error15 (J&P:JH332233 VAN:CQF15666 NIF:GCE02626) ]