文書の過去の版を表示しています。
MZ-700
概要
MZ-800エミュレータでMZ-700のIPLを使う
MZ-700のエミュレータは一時期いくつか存在していたが、気づくと Windows版のいくつかのバイナリだけを残してすっかり消えてしまった。
なので、MZ-800エミュレータを代替品として使用するのが一つの方法であるのかと考えられる。 MZ-800はMZ-700モードを持つ上位互換機であるので、理屈としてはMZ-700のソフトウェアを実行可能である。 但し、正しい作法を守れば、という条件がついている。 単純に、MZ-700のIPLを与えれば動くというものではないので、ここではその作法について説明する。
MZ-800をMZ-700のようになるまで初期化する
MZ-800はMZ-700互換であるが、異なるハードウェアである。 巷では、MZ-700の海外版であるかのように紹介されているが、MZ-700の海外版は海外版として存在している。
MZ-800はMZ-700とMZ-1500の中間的なハードウェア構成であり、SN76489ANがあったり、ビットマップVRAMを持っていたり、PCGがあったりと、かなり異なるハードウェアであるため、正しくMZ-700モードに移行させてやらなければ、1Z-009Aは動作しない。
ここでは、行うべき初期化について説明し、1Z-009Aにパッチを当てて、MZ-800 エミュレータ上で動作させる方法を説明する。
これにあたっては、以下のものを用意する必要がある。
MZ-800エミュレータで1Z-009Aを動作させるためには、IPL.ROMの先頭3バイトを 0xc3,0x00,0xe8 に書き換え、ipl2.rom内の初期化ルーチンを呼び出す形にパッチを当てる必要がある。 パッチを当てたものを iplp.rom とする。
また、フォントについてもMZ-700WINのものをそのままでは使用できず、フォントのビットマップパターンを左右反転させる必要がある。どのような方法でも構わないが、例えば、以下のような ruby のコードを使用すれば変換できる。 変換後のファイルを cgrom.romとする。
#!/usr/bin/env ruby cgrom_rev = [] open('font.rom') do |f| cgrom = f.read.unpack("C*") cgrom.each do |c| i = 128 j = 1 d = 0 while i > 0 do d |= j if c & i != 0 j <<= 1 i >>= 1 end cgrom_rev.push(d) end end open('cgrom.rom','w')do |f| f.write cgrom_rev.pack("C*") end
ファイルが揃ったら、MZ-800エミュレータのメニューからROM→Settings for User Defined…を選んで、Enable User Defined ROMにチェックを入れたら、Seperate ROM Binary Filesを選び、それぞれのROMファイルを指定する。
Applyを押せば、1Z-009Aが起動する。
MZ-800の初期化処理について
MZ-800は電源投入後、またはリセット直後は MZ-800モードで起動するが、その後、MZ-700モードに移行し、CGROMや周辺デバイスの設定を行った後、ディップスイッチの設定を読んで、MZ-800またはMZ-700それぞれのモードに移行する。
MZ-700のROMを使うのであればディップスイッチの如何に関わらずMZ-700モードへと移行し、本来のモニターに制御を戻すようにしてやればいい。
この時、MZ-700とは異なるMZ-800のハードウェアを適切に設定して、適切なポイントへ制御を戻す必要がある。
具体的に問題となる、MZ-700とMZ-800との違いには以下のものがある。
- MZ-800モードとMZ-700モード
- CGROMデータのPCGへの転送処理
- 画面モードの設定と画面クリア
- 8255/8253およびSN76489ANの初期化
MZ-800モードとMZ-700モード
MZ-800はポート0xceに0x08を出力することで、MZ-700モードへと移行する。 このポートはディスプレーモードレジスタにつながっていて、画面モードの設定を行うのだが、0x08を渡すと、メモリーマップがMZ-700相当のものになる。
この時、0x0000~0x0fffと0xe000~0xffffにはROM(0xe000~0x00fはmemory mapped I/O)が割り当てられ、0xd000~0xdfffにはVRAMが割り当てられる。
IPL2.ROMではまずこの処理を行う。
CGROMデータのPCGへの転送処理
MZ-800はMZ-700とは異なり、CG-ROMにCPUからアクセスができる。 また表示に使われるデータはPCGのデータが参照されるため、CG-ROMの内容をPCGに設定する必要がある。
MZ-700モードにあるときに、ポート0xe0から値を読むと、0x1000~0x1fffにCG-ROMが、0xc000~0xcfffにPCGがそれぞれ割り当てられるので、この状態で、CG-ROMの内容をPCGに転送する。
転送が終わったら、ポート0xe1から値を読みだせば再び0x1000~0x1fff, 0xc000~0xcfffにDRAMが割り当てられた状態に戻る。
in a,(0e0h) ld hl,01000h ld de,0c000h ld bc,01000h ldir in a,(0e1h)
これで、MZ-700のCG-ROMデータ4)が表示に使用されるようになった。