tunozemichanの日記 / tunozemichan's diary

SORD社のコンピューターM68やM68MXの解析についての備忘録です。This blog is a memorandum about the analysis of SORD's computers M68 and M68MX.

SORD M68のI/Oマップ

現時点で判明したSORD M68のI/Oマップを記載します。

 

フロッピーディスクの制御に関するもの(MB8877A)

 

FDCコマンド/ステータスレジスタ:0xC8

FDCトラックレジスタ:0xC9

FDCセクタレジスタ:0xCA

FDCデータレジスタ:0xCB

Z80DMAのI/Oアドレス:0xCC

FDDコントロールI/Oポート:0xCD

 

シリアル通信の制御に関するもの(Z80SIO)

 

SIOAのデータレジスタ 0xF8

SIOAのコントロールレジスタ 0xF9

SIOBのデータレジスタ 0xFA

SIOBのコントロールレジスタ 0xFB

 

カンター/タイマーの制御に関するもの(Z80CTC)

 

CTC_A

チャンネル0 : 0xFC

チャンネル1 : 0xFD

チャンネル2 : 0xFE

チャンネル3 : 0xFF

 

CTC_B

チャンネル0 : 0xD8

チャンネル1 : 0xD9

チャンネル2 : 0xDA

チャンネル3 : 0xDB

 

 

SORD M68でFDDからZ80 BASICを動かす。

SORD M68のFDD周りの解析が進み、そろそろ大きなプログラムも動かせそうだったので、今回はZ80 BASICを動かしてみました。

手順は以下の通りです。

  1. BOOT ROMがディスク1、トラック0、サイド0、セクタ1~8にあるローダーを0H番地を先頭に展開し、0Hへジャンプ。
  2. ローダーは自分自身をメモリの高位(今回はE000H)へ移動し、そこにジャンプ。
  3. 移動後、ローダーはZ80 BASICが記録されているトラック2、サイド0、セクタ1~26からサイド1、セクタ1~4までを読み込み、0H番地を先頭に展開し、0Hへジャンプ。

f:id:tunozemichan:20220206203036p:plain

Z80 BASICが起動している様子

ascii.basは5分00秒でした。

f:id:tunozemichan:20220206204228p:plain

ascii.bas実行画面

SORD M68、Z80FDDなどほとんどわからない状態から初めて、ここまでこれたことが嬉しいです。次は、実装されているのにZ80の何処に繋がっているのかわからないAM9511Aの探索とCP/M-80を動かしたいです。

 

SORD M68でFDDからZ80 BASICを動かす。

SORD M68のFDD周りの解析が進み、そろそろ大きなプログラムも動かせそうだったので、今回はZ80 BASICを動かしてみました。

手順は以下の通りです。

  1. BOOT ROMがディスク1、トラック0、サイド0、セクタ1~8にあるローダーを0H番地を先頭に展開し、0Hへジャンプ。
  2. ローダーは自分自身をメモリの高位(今回はE000H)へ移動し、そこにジャンプ。
  3. 移動後、ローダーはZ80 BASICが記録されているトラック2、サイド0、セクタ1~26からサイド1、セクタ1~4までを読み込み、0H番地を先頭に展開し、0Hへジャンプ。

f:id:tunozemichan:20220206203036p:plain

Z80 BASICが起動している様子

ascii.basは5分00秒でした。

f:id:tunozemichan:20220206204228p:plain

ascii.bas実行画面

SORD M68、Z80FDDなどほとんどわからない状態から初めて、ここまでこれたことが嬉しいです。次はCP/M-80を動かしたいですね。

 

SORD M68のFDDサイド番号の指定方法が判明

 

導入という与太話

 

倍密度記録のセクタを読めるようになったので、CP/Mなど大きなプログラムをロードできる可能性が出てきました。しかし、その為にはディスクの裏側(Side1)も読めなくてはなりません。

 

FDDのシステムは、前回も触れましたがFDD、FDC、VFOです。FDCはあくまでフロッピーディスクのデータを扱うことに集中しているため、その他の主にメカニカルなFDDの制御はCPU(厳密にはそこにつながったPIO)に任せています。

CPUは、ドライブセレクト、モーターON、単密度/倍密度切り替え、そして、記録面読み取り切り替えを行います。これに加えて、高密度記録(2HD)があるマシンではこの切り替えも行う場合があるようです。

 

SORD M68のFDDは両面ディスク用です。とは言え、FDCからすれば表面(Side0)だろうが、裏面(Side1)だろうがデータという観点では関係ありません。なので、FDCにはこれを識別する信号はありません(MB8877Aの場合、ユーザーが自発的に裏面を読んでいることを知らせる必要はあります。)一方、両面ドライブは表と裏は重要で、読み取りヘッドが二つあり、切り替えは「Side one select」信号(32ピン)で行います。

 

ローダーを読む

 

今回は、BOOT ROMを読んでも分かりません。なぜなら、SORD M68のBOOT ROMはトラック1、Side0の1~8セクタを読むだけだからです。裏面(Side1)を読む必要がないので切り替えるコードはありません。

そこで、FDOSのトラック1サイド0セクタ1~8、CP/M-68Kのトラック1サイド0セクタ1~8を読みました。両者でコードが違うため、片方で行き詰っても、他方を見ると解決することが多く、両方読むのは二度手間に見えますが、実際には最適、最短の方法です。

 

結論から言うと、I/Oアドレス0xcdの第5ビットがSide切り替えです。Highにすると裏面(Side1)が指定されます。

 

結果

 

I/Oアドレス0xcdを便宜上、FDCコントロールポートと呼ぶと、3つのことが分かりました。

・第6ビット:記録密度切り替え(単密度は1、倍密度は0)

・第5ビット:読込面(Side)切り替え(Side0は0、Side1は1)

・第3ビット:Not Readyへの遷移。In USE?

 

最後の情報はこれまで触れませんでしたが、0xcdに0x8を書くと、FDD(エミュレータ)のランプが消えて、FDCのステータスがNot Readyになり、何の操作も受け付けなくなる為、判明しました。

 

これでフロッピーディスクの全てのデータにアクセスできるようになりました。

 

が、テストコードがうまく動きません。現在原因を究明中です。

 

SORD M68のフロッピーディスクコントロールについて(その2)DMAを使う方法

今回もわりと日記的です。

 

結論から言うとDMAを使って、倍密度記録をデータの取りこぼしなくメモリにコピーできました。苦労したので、以下愚痴です。

 

迷走した話

 

前回、4MHzのZ80の処理能力の限界を知りました。SORD M68には当時のハイエンドマシン(約80万円)ですので、ダイレクトメモリアクセスコントローラー(DMAC)としてZ80DMAを搭載しています。

Z80DMAの諸元については、WEBで色々見つかりますが、かなり高機能なこともあり複雑です。ここでもおすすめの読本は、「試験に出るX1」になります。非常にわかりやすく1級の資料です。

今更ですが、DMAの機能はCPUからバスを奪い、周辺I/Oやメモリ(今回の場合はFDC)との間で直接データのやり取りをすることです。これによりCPUで処理するよりも速くデータの流れをコントロールできます。

SORD M68では、搭載している5.25インチFDDの倍密度記録の読み書きにDMAが使われています。

BOOT ROMを逆アセンブルすると、DMACのI/Oアドレスが複数あったりして混乱しますが、FDCにリードコマンドを発行する直前のDMAコマンドチェーンの宛先アドレスである(0xCC)をDMACのI/Oアドレスだと推定しました。こんなコマンドチェーンをまず定義しています。

 

C3,BB,01,BF,6D,C3,FF,00,2C,10,8D,00,00,9A,CF,87

 

ハマりポイントが複数ありますが、まず、C3の後ろの3つのコマンドはこれだけだと意味がないと思われます。何のために入れているのか不明です。6Dから先が重要です。

ここでハマったのはC3が二回出現しているところです。C3はDMAコマンドでは「DMAのリセット」なのですが、2回リセットしてる?と意味不明な動作に焦りますが、ポートAを定義するコマンドである6Dの直後にあり、これはポートAのアドレスでした(コマンド6Dは、ポートAがI/Oであることを指定しているので、これはI/Oアドレスであることが分かる)。どのDMAでもそうですが、DMAは各チャンネルにポートAとBを持っていて、A、B間の動作を定義して動作させます。それが解決すると、今度はI/Oアドレス0xC3はFDCのデータレジスタではないという問題が出ます(これはFDCのアドレスが判明するまで混乱の元凶でした)。しかし、これもリードコマンドの数行前に、0xC3を0xCBに書き換えているコードがあるのです。なので実際には、以下のコマンドチェーンがDMAに送られます。

 

C3,BB,01,BF,6D,CB,FF,00,2C,10,8D,00,00,9A,CF,87

 

SORD M68は一つしかFDCを持っていないので、わざわざデフォルトのI/Oアドレスを実装していないアドレスに設定しているとは夢にも思いませんでした。それを正しいI/Oアドレスに書き換えるのは、明らかに無駄です。BOOT ROMのDMA周辺コードは不合理な点が多いです。

 

自作のコードでDMA仕様のデータ転送ができた

 

自作コードでは、データのコピー先を、B500にしているので以下のようにコマンドを変更しました。

 

C3,BB,01,BF,6D,CB,FF,00,2C,10,8D,00,B5,9A,CF,87

 

これでFDCのデータレジスタから256バイト(00FF)を、メモリB500にコピーします。実行したのが以下の画面です。

 

f:id:tunozemichan:20220120180437p:plain

問題なくデータを取得できている。

f:id:tunozemichan:20220119192022p:plain

該当セクタのダンプ。これが正しいデータ。

問題ないようです。これでフロッピーディスクから望みの大きさのプログラムを読み込めるようになりました。

 

 

SORD M68のフロッピーディスクコントロールについて(その1)

今回は完全に備忘録です。まとめなどはありません。

基本的にフロッピーディスク(ドライブ)の制御は、フロッピーディスクコントローラー(FDC。SORD M68では、MB8877A)とパラレルI/Oチップ(SORD M68ではZ80PIO)との組み合わせで構成されています(VFOもありますが)。

これまでにSORD M68のFDCの各レジスタアドレスは判明しました。残りはZ80PIOとFDDがどのように接続されているかと言う問題のみですが、これがほとんどノーヒントです。

判明した事実を基に、BOOT ROMから起動してフロッピーディスク上に配置したUniversal Monitorを実行させて、MB8877Aに直接セクタリードをさせるコードを書いたところ、FM記録のトラック0は読み込むことができました。しかし、MFM記録のトラック1以降は読めません。具体的にはシークの時点でIDフィールドが読めないというエラーが出てリード自体が不可能になります。

SORD M68のBOOT ROMは、起動時にMFM記録されているトラック1から2kb分プログラムを読み取ります。FM記録のトラック0は読まないようになっています。つまり運用上、FM記録を読む設定にしておく理由がないのです。BOOT ROMからUniversal Monitorにジャンプした時点で、MFM記録用にセットアップされていると思っていたので、そうでないことに落胆しました。

ちなみに、MB8877Aでは倍密度を読み取る際には\DDENというピンをLOWにする必要があります。これまでの解析でI/Oアドレス0xcdがおそらくZ80PIOと接続されているポートだと推測していました。今回、Universal Monitorから、0xcdに対して値を設定して、オシロでこのピンの挙動を観察しました。

結果、0xcdに対して、0x8→0x44→0x4と入力すると、トラック1以降のセクタを読むことができました。つまり、第6ビットをHIGH→LOWとする必要があることが分かります。しかし、画像にあるようにデータの取りこぼしが起きています。4MHzのZ80でDMAを使わない方法では、360rpmで倍密度記録を読むのは不可能なようです。

 

f:id:tunozemichan:20220119192022p:plain

本来のトラック1セクタ0の内容

f:id:tunozemichan:20220119192122p:plain

自作のセクタリードコードによる結果。読めているが、データを取りこぼしている。

 

【情報更新】SORD M68のBOOT ROM解析(フロッピーディスクコントローラーのI/Oポートアドレス判明)

FDD上にUniversal Monitor(機能限定版)を置くことができたので、実機で動作の確認を行うことができるようになりました。

これにより、FDCの各レジスタアドレス、Z80DMAのI/Oアドレスが判明しました。

FDCの各レジスタはやはり並んでいました。

 

FDCコマンド/ステータスレジスタ:0xc8

FDCトラックレジスタ:0xc9

FDCセクタレジスタ:0xca

FDCデータレジスタ:0xcb

Z80DMAのI/Oアドレス:0xcc

FDCの正常動作に必要なI/Oアドレス:0xcd

 

やはり実機で試せるのは大躍進の必須要素です。当初、0xcdの存在を考慮せずに、コマンドを送っていたのですが全てNot Readyが返ってきて、頭を抱えていました。よくわからないまま、BOOT ROMのコードを真似て、0xcdに0x44を入れてみたところ、Not Readyが消えて、問題なく動作するようになりました。0xcdにはこのほか0x4なども入れられていますが、FDDに関する何かということ以外は、現在不明です。

ともあれ、これでCP/Mの起動に近づきました。