まず、外付けFDD と、P6 との接続ですが、PC-8001/8801 と同じように、8255 を介して接続されています。
8255 の先は、PC-8031 などの賢いFDDは Z80 が搭載されているんですが、PC-6031 などは、8049 が搭載されています。そのため P6系では、88系などのような、FDD に搭載されているCPUを使う命令がありません。
SD6031/SD6031WIF は 8255 はありませんが、その代わりをAVRが行っています。大体PC-6031 と同じような感じです。
上の図で分かるように、(ATNを除いて)左右の 8255 への接続が同じようになっています。このため、左右の8255 の制御を同じような手順で処理しています。
P6側→外付けFDD と送信する場合、P6側:送信処理、外付けFDD側:受信処理となります。
逆に、P6側←外付けFDD と送信する場合、P6側:受信処理、外付けFDD側:送信処理となります。
この時、P6側の受信処理と、外付けFDD側の受信処理は、基本的に同じ手順になります。送信処理に関しても同様です。
具体的な手順は以下の通りです。
通常のデータ送信/受信(1バイト)
上の手順を P6 で行う場合は、P6 or インタフェースカードに搭載されている 8255 を制御する必要があります。
P6 の場合、8255 のモード0という状態で、入出力を行います。使用する I/O ポートは以下の通りです。
0xB1:bit2 = 1 を設定すると、外部FDDにアクセスが可能(66/66SR のみ)。
0xD0:8255 の port-A
0xD1:8255 の port-B
0xD2:8255 の port-C
0xD3:8255 の 制御
通常の外部FDDで使う状態は、
モード0
port-A = 入力
port-B = 出力
port-C 3-0 = 入力
port-C 7-4 = 出力
です。
この設定をするためには、OUT &HB1,&HF7 として、外部FDD に切り替えた後に OUT &HD3,&H91 とします(初期化のようなものなので最初だけでよい)。
66/66SR 以外は、OUT &HB1,&HF7 は必要ないんですが、あった方が他の機種に持っていった時のトラブルが回避できます。
port-A/B は、直接ポート0xD0/D1 に対して入出力すれば、データが入出力できます。
port-C も、直接ポート0xD2 に対して入出力できますが、ポート0xD3を使って1ビット単位の出力も可能です。
ポート0xD3 に、1000BBBP を出力します。BBB には出力するport-C のビット、P には、0にするか1にするかを出力します。例えば、port-C のビット6(DAC)を1にするには、OUT &HD3,&H8D、ビット7(ATN)を0にするには、OUT &HD3,&HE0 とします。
上の通常のデータ送信/受信(1バイト)を P6 で組んだ場合は、次のようになります。
通常データの送信(1バイト)
通常データの受信(1バイト)
外部FDD からの信号が変化するのを待っている箇所に関しては、タイムアウトの処理などを入れた方がいいでしょう。
上の処理は、通常のデータ送信/受信でしたが、コマンドに関しては別の処理を使います。
コマンドデータ送信/受信(1バイト)
通常のデータ送信/受信の前に、ATN の制御が入るだけです。
P6 で組んだ場合は次のようになります。
コマンドの送信(1バイト)
コマンドは、P6側から外部FDDにのみ出力しますので、P6側で受信する事はありません。
通常のデータ送信/受信(1バイト)と、コマンドデータ送信/受信だけで、一通りの制御が可能になります。例えば、INITIALIZE コマンドだと、コマンド送信で0x00 を送信して完了します。COMMAND STATUS だと、コマンド送信で0x06 を送信、その後、データ受信を1回だけ実行します。
通常のデータ送信/受信には、1バイト以外に2バイトと4バイトがあります。これは送受信を高速にするために拡張されている手順になります。まずは2バイトのデータ送信/受信です。
通常のデータ送信/受信(2バイト)
2バイトの送受信は、ほぼ1バイトと同じ手順でデータを2回出力しています。
P6 で組んだ場合は次のようになります。
通常データの送信(2バイト)
通常データの受信(2バイト)
4バイトの送信/受信に関しては、SD6031/SD6031WIF のオリジナルです。
通常のデータ送信/受信(4バイト)
4バイトの送受信は、基本の手順は2バイトの送受信と同じで、port-A、port-B の方向を同じ方向に変えています。そのため、2倍の4バイトの送受信を可能にしています。また、さらに高速化のために256バイト送受信を1つの単位にしています。2バイト同時に送信/受信しますが、先に送受信されるのは、出力が port-B、入力が port-A です。
P6 で組んだ場合は次のようになります。
通常データの送信(4バイト)
通常データの受信(4バイト)
2バイト送信/受信と構成が違うのは、INR/OUTR を使って高速化を図っているためです。


組み合わせであれば、CP/Mバイナリ互換・MS-DOSファイルシステム互換OS(PC-88の
C-DOSIIのようなもの)が作れる事が判りました。『何を今さら』感ありますが。
まずP6+PC-80S31ですが、これはPC-88の場合とほぼ同様です。PC-80S31でプログラムを
実行して、セクタ長を自由(1D/2Dでは4KB(N=5)が限度)にしたり、4バイト転送コマンドを実装
する事も可能です。
次にP66内蔵FDDの場合、PC-98のようにFDC直結ですからやりようによってはトラック内
MFM/FM混在などの変態フォーマットも実現できるでしょう。
ついでに、P6+PC-8831-MW(PC-88M内蔵FDD相当、2HD対応)ではFDD側でプログラムを
実行しなくてもセクタ長512バイト・1KBを直接扱えます(コマンドでセクタ長を指定可能、
自動認識ではないので読めるモードに切り替える必要あり。2KB以上はコマンドでは不可、
要プログラム)。
PC-88でもBIOSのルーチンは使わないのがセオリーのようです。
ちなみに、DOSファイルシステム互換といっても実際のフォーマットはトラック0セクタ1が
256バイトになっている変則です。C-DOSIIの場合はセクタ1はDOS互換用の512バイトのと
起動用の256バイト(セクタ9の後)の両方があります。起動時は512バイトのセクタは無視する
ので256バイトの方がロードされます。起動後は256バイトの方は無視されます。
Oh!PCあたりに載ったIDOS88の場合は、セクタ1は素直に256バイトのものだけです。
MS-DOSからは両方とも正常にアクセスできます。
それにしても、R/Wコマンドで片面か両面か、DかDDかを意識せずに使えるのは便利
ですね。1DしかないPC-6031/32・PC-8031/32(元祖)には無縁ですが。
ところで、mkIISR+PC-80S31の場合、2Dを1DDの代用として使っても、ディスクには
ちゃんと2Dとして書き込まれますか?それともサイド1に奇数シリンダが書き込まれて
『専用』になりますか?
蛇足 PC-8031のCPUについて各処でもめているようですが(ここではないのが幸いです)、
想像するにPC-8031はPC-6031同様に8049なのではないかと
PC-8031-2W(2D)からμPD780になってプログラムが実行できるようになったような気が...
>>ちゃんと2Dとして書き込まれますか?それともサイド1に奇数シリンダが書き込まれて
>>『専用』になりますか?
ちゃんと2Dになると思いますが...何を気にしているのかが私にはよく分かりません。
>>それともサイド1に奇数シリンダが書き込まれて
ヘッド1に奇数トラックが書き込まれます...よね?
PC-8031 の話は、持っている人が分解してみれば済む話ですね(^^;
C H R Nの値の問題です。
トラック番号をシリンダとサイドに分離するのはPC-80S31側なので問題ないとは思います
が、もしサイド1が奇数シリンダ・サイド0になっていたら通常のコマンドではシークエラー
になり(シリンダ番号が異なるため)アクセスできなくなってしまいます。
実際に使えているので杞憂だとは思いますが...
外付けドライブの場合、指定できるのはトラック番号のみです。
どのシリンダ、ヘッドに、何バイト長で書き込むかは、全部外付けドライブ側のプログラムによります。
mk2SR+PC-80S31 の場合は、起動直後にSET MODE コマンドを発行します。それを受けて、PC-80S31 は2Dとして動作します。
mk2SR+PC-6031SRの場合も、SET MODE を発行し、それを受けてPC-6031SR は1DDとして動作します。
mk2SR+PC-6031 の場合も、SET MODE を発行しますが、エラー(タイムアウト)になるので、mk2SR内部では、1Dモードとして動作します。
mk2SR 側は、単にトラック数が0〜35なのか、0〜79なのかを切り替えているだけです。
ちなみに、PC-6601SR+I/Fカード+外付けドライブでも同様の動作をします。ただし、内蔵ドライブの設定が、外付けドライブの設定に引きずられます(^^;
自分で試してみれば明白なのは確かですが、あいにくmkIISRの入手性は良くないので...
不動品の66も運良く手に入ったようなものですし...mkIIは結構出玉があるようですが。
とにかく杞憂のようで良かったです。
まぁ当方の『歌えるmkII』で試せるのは1D(1DD/2Dはプログラム要)だけなので、まずは
1Dからやってみます。
ところで、1枚のディスクで多機種に使える(P6・6031・8031除)起動ディスクを考えてみます。
/sbeach/archives/11125234.html
> 0xF900〜0xF902 が "SYS" ならば、0xF903 をCALLする。
> "SYS"以外の場合は、BASICの選択画面になる。
> "SYS" 文字列がある場合は、0xF903 から独自のプログラムが走る事になる。
> "SYS"の時、ドライブを1Dにして、66-BASICへ移行(上記66のオート起動を実行する)
> "RXR"の時、ドライブ状態はそのままで、66-BASICへ移行(上記66のオート起動を実行する)
> "IPL"の時、0xC003 をCALLする。
> "SYS"、"RXR"、"IPL"以外の時、BASICの選択画面になる。
> CP/M や独自でフロッピーインタフェースをプログラムしている場合は、上記の限りではありません。
より、SRでIDが'SYS' 'RXR'の場合、CALL先はC003hとF903hのどちらでしょう?
↑の文脈からはどちらにも取れそうですが...
ディスクは1D/2D兼用フォーマットで512バイト・8セクタとします。2D(/2DD(/MSX 1DD))の
DOSフォーマットは1クラスタ2セクタ(1KB)のためトラック毎のセクタ数は偶数の必要がある
ためです(1Dは8セクタ・9セクタともに1クラスタ1セクタです)。
トラック0セクタ1は256バイトだけにします。起動すると実行用FD(バックアップではなく)を
作るプログラムが走ります。
SRはせっかくの1DDですが、1Dとの兼用はできないので1Dで使います。
データディスクは問題なく1DDが使えます。
まぁこんな変態フォーマットにしなくても、起動ディスクだけは256/16にする手もありますが。
という仕様を検討中です。
0 IPL (side 0)
1,2 FAT 1 (side 0)
3,4 FAT 2 (side 0)
5-7 ¥ (side 0)
16-23 cluster 4-7 (side 0)
32-39 cluster 12-15 (side 0)
... ...
624-631 cluster 308-311(side 0)
8-11 ¥ cont (side 1)
12-15 cluster 2,3 (side 1)
24-31 cluster 8-11 (side 1)
... ...
632-639 cluster 312-315(side 1)
ファイルの配置を工夫すれば、1Dドライブから一部のファイルがアクセスできます。
次にPC-88との兼用ですが、88のロードアドレスはC000hで、実行も同じくC000hからですが、
'SYS' 'RXR' 'IPL'とも実行時はほぼ無害なコードになるので問題なさそうです。
問題はP6と88の機種判別ですが、ワークエリアとかROMの内容とか、I/Oとかで良さそうな
判別法は...
LD D,E ;F900 53 S
LD E,C ;F901 59 Y
LD D,E ;F902 53 S
LD D,D ;C000 52 R
LD E,B ;C001 58 X
LD D,D ;C002 52 R
LD C,C ;C000 49 I
LD D,B ;C001 50 P
LD C,H ;C002 4C L
実際には、88にはC-DOSIIがあるので、88ではOSとして動作するものではなく起動デモ
だけにする予定です。
それでも、BASIC上で動作するDOSとのファイルコンバータのが実用的でしょうね
追伸 ↑の通り音声合成機を入手したので音声合成のサンプルを試してみました。
その件についてはその項で
P6・6031・8031除
↓
P6・6031/SR・8031除
6031SRもプログラマブルでないので不可です
>>より、SRでIDが'SYS' 'RXR'の場合、CALL先はC003hとF903hのどちらでしょう?
>>↑の文脈からはどちらにも取れそうですが...
F903h をCALL です。
SRでIDが'SYS' 'RXR'の場合、mk2/66 と同じ動作をしますので、F903h をCALL になります。
という事は'SYS' 'RXR'(F900h)と'IPL'(C000h)でロードアドレスも変わるワケですね。
でも、
> ドライブ番号1のトラック#0、セクタ#1(先頭セクタ)の256バイトを0xC000〜0xC0FFにロードする。
> 0xC000〜0xC002 の内容により、以下の処理を行う。
ともあるので、一旦C000hにロードしてから'SYS' 'RXR'の場合F900h(F903h)にコピーしてから
F903hをCALLするのでしょうか?
それとも、F903h〜は予めデータ(プログラム)があって、そこをCALLするのでしょうか?
F900hにロードするmkII/66コンパチの動作なので、前者だと思いますが。
>>> 0xC000〜0xC002 の内容により、以下の処理を行う。
>>
>>ともあるので、一旦C000hにロードしてから'SYS' 'RXR'の場合F900h(F903h)にコピーしてから
>>F903hをCALLするのでしょうか?
>>それとも、F903h〜は予めデータ(プログラム)があって、そこをCALLするのでしょうか?
>>F900hにロードするmkII/66コンパチの動作なので、前者だと思いますが。
詳しく書くと(6001mk2SR/66SRの場合)、
1)トラック#0セクタ#1の内容を、0xC000〜0xC0FF にロードする
2)0xC000〜0xC002 の内容により、以下の処理を行う
2−1)"IPL" の場合、CALL 0xC003 を実行する
2−2)"RXR" の場合、0xFFFF に 0x01 を書き込み、N66-BASIC を起動する
2−3)"SYS" の場合、ドライブを1Dモードに変更してから、0xFFFF に 0x01 を書き込み、N66-BASIC を起動する
上記2−2)、2−3)は、具体的にはROMのバンクを変更して、JP 0x0000 としています。N66-BASIC のコールドスタートですね。
3)N66-BASIC に移ってから、トラック#0セクタ#1の内容を、0xF900〜0xF9FF にロードして、0xFFFF が 0x00 でない場合は、0xF903 をコールする。
です。
内容がコピーされるのではなく、2度ロードする事になります。
N66SR-BASIC と、N66-BASIC の2つのROMが存在しているため、ややこしい事になっています。
> 内容がコピーされるのではなく、2度ロードする事になります。
> N66SR-BASIC と、N66-BASIC の2つのROMが存在しているため、ややこしい事になっています。
正解は『どちらでもない』でしたか
ROMをN66に切り替えてから改めてロードし直すワケですね。
PC-88より面倒だ...88の場合はロードアドレスがPC-80と同じなので、N-BASICもROMだけ
切り替えてそのまま続行のようですが。
ところで、1DDですが、C H R Nを適宜書き換える事によりPC-98のエミュレータで2Dとして
マウントできました。SR用のFM音源の音楽集のイメージで試しました。
どうやらBASICでの扱いは管理情報の位置なども同一のようです。
まぁ論理トラック番号が同じですから同じでもおかしくないのですが。
5インチ1DDがない(要6031SR+5"2DD FDD)以上、これ以上の追究はできそうもないので
これを結論としておきます。
OSの件ですが、P6でのCP/Mの実用性を考えても?なので、ファイルコンバータにシフト
しようと思います。多機種での起動デモだけはやるつもりです。
愚痴
D88で片面への拡張はせずに両面イメージのままサイド1をデータなしにしてほしかった
ですね。D88の仕様上ファイルサイズは同じになるので。
P6エミュとSMCエミュのどちらが先に片面D88を実装したか謎ですが、片面と両面を明確に
区別する必要があったんでしょうかねぇ?
ところで
> D88で片面への拡張はせずに両面イメージのままサイド1をデータなしにしてほしかった
の部分は1DDittのことを仰ってるのでしょうか。
あれは厳密にはD88を拡張した別物かと。
> 片面と両面を明確に区別する必要があったんでしょうかねぇ?
現在のD88の仕様だと「純粋な1DD」と「裏面アンフォーマットの2DD」の区別がつきません。そもそも片面メディアは想定していないようなので仕方ないんですが,メディア情報の保存という観点から区別ができたほうがよいように思います。本家D88で取り込んでいただくのが一番なんですけどねー
> 最後の1文から察するに異機種共通の起動ディスクを作るとか?
最初はそのつもりでした。P6/P66とPC-88で起動するP6用DOSファイルシステム・
CP/Mバイナリ互換OSの予定でした。
しかし、P6でのCP/Mの需要はほとんどない事と、88にはC-DOSIIがあるので新規にOSは
不要との結論に達したためファイルコンバータにシフトし、多機種対応はデモだけにした
次第です。最初は欲張ってPC-98まで対応させよう(デモのみ)と思いましたが、
256バイトに機種判別ルーチンを詰め込みきれないので...
80系・86系ともに他者の動作を阻害しないようにするのはかなり大変です。
'SYS' 'RXR' 'IPL'は平気なようですが。
PUSH BX ;1FC0:0000 53 S
POP CX ;1FC0:0001 59 Y
PUSH BX ;1FC0:0002 53 S
PUSH DX ;1FC0:0000 52 R
POP AX ;1FC0:0001 58 X
PUSH DX ;1FC0:0002 52 R
DEC CX ;1FC0:0000 49 I
PUSH AX ;1FC0:0001 50 P
DEC SP ;1FC0:0002 4C L
これを踏まえて
;P6系のID(1D) 80系・86系ともあまり害のないコード
LD D,E ;F900 - PUSH BX ;1FC0:0000 53 S
LD E,C ;F901 - POP CX ;1FC0:0001 59 Y
LD D,E ;F902 - PUSH BX ;1FC0:0002 53 S
;PC-98(86系)はジャンプする。80系ではあまり害なし
EX DE,HL ;F903 - JMP short ;1FC0:0003 EB
LD A,A ;F904 - $+7Fh ;1FC0:0004 7F
;P6/P66とPC-88の判別
...
;88はジャンプ
;P6(およびP66外付けFDD)とP66(内蔵FDD)の判別
...
;P6/P66起動ルーチン
...
;88用ルーチン
...
;1FC0:0083 98用ルーチン
...
88/98用ルーチンをサイド1に追い出すとしても(この時点で起動ディスクのDOS互換は
半ばあきらめています。さらなる変態フォーマットで対応できますが)、ローダはこの
セクタに置く必要があります。
まだまだ調査不足ですが、98ではインデックス(ID)に近い側のセクタ1をロードするなら
512バイトの側に98用、256バイト側にP6/88用のコードを入れるという手があるかも
知れませんが、タイミングによってどちらが読まれるか判らないならこの手も使えません。
ちなみに、C-DOSIIではDOSフォーマットなら何でも読めるワケではなく、
・512/9の2D(360K 256バイトのトラック0セクタ1の有無は不問)
・512/9の2DD(720K)
・1KB/8の2HD(1.2M)
の3種です。どうやらBPB決め打ちのようで、8セクタ(320K/640K)とか2HC(512/15)
とかはダメです。2HCはともかく8セクタは使えてほしかったですが。
>> D88で片面への拡張はせずに両面イメージのままサイド1をデータなしにしてほしかった
> の部分は1DDittのことを仰ってるのでしょうか。
> あれは厳密にはD88を拡張した別物かと。
その通りです(だと思います)。
> 現在のD88の仕様だと「純粋な1DD」と「裏面アンフォーマットの2DD」の区別がつきません。そもそも片面メディアは想定していないようなので仕方ないんですが,メディア情報の保存という観点から区別ができたほうがよいように思います。本家D88で取り込んでいただくのが一番なんですけどねー
実際にはプロテクト等の偽情報もあるので、読み込んでみないと両者の区別はつかないと
思います。
この区別をつける必要があるか?は別として、片面と両面でトラックマップの位置だけは
合わせてほしかった(片面は1トラックおき)です。片面フラグは+1Bhの or 40h(1D 40h/
1DD 50h)か or 80h(1D 80h/1DD 90h)あたりが良かったと思います。
ところで、NDittで1D/2Dを読み込む際に1D/2D FDDを使用する(1ステップ)オプションも
つけていただければ、と思います。
-1 - Using 1D/2D(360KB) drive
-2 - Using 2DD/2HD drive (default) とか表示すれば良いでしょう。
あと、-5 - 5inch drive は何のためにあるのでしょうか?
まず散々C-DOSIIとしましたが、CDOS-IIが正しいです。
あと、CDOS-IIでは2DD/8(640K)も使えました。使えないのは2D/8(320K)でした。
もしこれを当時実現していたら...
>1D/2D FDDを使用する(1ステップ)オプション
2HDドライブ前提で考えていたので気が付きませんでした。
機会をみて検討します。
>あと、-5 - 5inch drive は何のためにあるのでしょうか?
5インチドライブはデータ転送レートが3.5インチとは異なるので,それを指示するためのオプションです。確か。既に記憶が曖昧に(^^;
> もしこれを当時実現していたら...
これ自体は金を産むモノではないのでビジネスにはならなそうですが、同人や趣味では
面白そうです。
> 5インチドライブはデータ転送レートが3.5インチとは異なるので,それを指示するためのオプションです。確か。既に記憶が曖昧に(^^;
あっそうか、自分でも指摘していた5インチ2DDモードでの360rpm/300kbpsの設定ですね。
逆に1D/2D FDDは5インチでも3.5インチでも300rpm/250kbpsなので指定しないよう注意が
必要ですね。
-1 - Using 1D/2D(360KB) drive
-2 - Using 3.5inch 2DD/2HD drive (default)
-5 - 5inch drive → -5 - Using 5inch 2DD/2HD drive が良さそうです。
どのFDDかはBIOSによりワークエリアに書き込まれたような気がしますが、果たして
Win32/64下から参照できるか...?
MZ、X1、X68k、FM-8/7、FM-11、FM-16βなど(これでも2社の一部機種にすぎません)
キリがないので...
NECでもN52等オフコン系には容量的に対応しきれません。文字を表示する程度はしたい
のですが、2Dの容量では98だけで精一杯と思います。
結局全機種で文字表示するだけのデモになりそうな予感がします。
8086にはjmp short(EB **)の他にjmp near(E9 ** **)とjmp far(EA ** ** @@ @@)があります
(386以降にはもっとある)が、jmp nearはE9がJP(HL)、jmp farはEA ** **がJP PE,** **
なので都合が悪いので使いません。後者はともに絶対番地へのジャンプ(Z80は条件付き)
なので、うまく使えば良いかも知れませんが。jmpにはセグメントプレフィクスは効かない
ようです。
jmp farは完全絶対番地の他にセグメント参照もほしかった気がしますが。pop CSも186で
すぐに廃止ですし。
> もしこれを当時実現していたら...
忘れていましたが、当時やれるとしたら起動デモだけだったような気がします。
なぜならOSにするには外付けにPC-80S31(またはPC-8831-MW等の上位機)を使用する
必要があり、セクタ長を変更できないPC-6031では使えないからです。
当時実機ベースではPC-6031が大勢だったでしょうし(それ以前にカセットベースが大勢で
しょうけど)
皆様とても詳しいようですので教えてください。
PC-88のC-DOS2の起動ディスクフォーマットはトラック0のセクタサイズが
セクタ毎に異なっているようですが、uPD765Aに対してどのように操作すれば
このような複雑なフォーマットを作ることが出来るのでしょうか。
FPGAでPC-8801mk2SR相当の物を目指して作っているのですが、
FDCもRTLで記述し通常のフォーマットであれば
読み書き普通に出来るようになったのですが(ドライブ・メディアは入手性の良いAT用の3.5"(1.44M)です)
C-DOS2もDittやNDittで書いた物から起動可能なのですが、
C-DOS2から起動ディスクを作ることが出来ません。(データディスクはフォーマット可能)
uPD765A相当のRTLはformatコマンド受付後、インデックスを待って
プリアンプル・セクタを書いた後、
次のインデックスが来るまでポストアンプル(GAP4)を書いて終わる
という一通りの動作を自動で行うように記述しました。
これでは途中でセクタ数を変えたり、途中までだけ別のセクタ数で
上書きしたり等は出来ないと思うのですが
C-DOS2での起動ディスク作成はどのように行っているのでしょうか。
WRITE ID コマンドで、フォーマットするときに
1バイト目:0 MF 0 0 1 1 0 1
2バイト目:x x x x x HD US1 US0
3バイト目:N(セクタ内のデータ長)
4バイト目:SC(トラック内のセクタ数)
5バイト目:GPL(GAP3の長さ)
6バイト目:D(データ領域に書き込むデータパターン)
7バイト目:C (1セクタ目のシリンダ番号)
8バイト目:H (1セクタ目のヘッダ番号)
9バイト目:R (1セクタ目のセクタ番号)
10バイト目:N (1セクタ目のセクタ長)
11バイト目:C (1セクタ目のシリンダ番号)
12バイト目:H (1セクタ目のヘッダ番号)
13バイト目:R (1セクタ目のセクタ番号)
14バイト目:N (1セクタ目のセクタ長)
:
とuPD765A に出力すると思いますが、3バイト目のNと、10、14、・・・のNの値を変えることで実現できるのではないかと思います。
例えば、MF=1 の時に、3バイト目のNを0x03にすると、セクタ長が1024バイトになり、そのトラックは1セクタ1024バイトにフォーマット(というか場所の確保)をされます。
この状態で、10バイト目のNを0x02、14バイト目のNを0x01にすると、1セクタ目は512バイト、2セクタ目は256バイトになるかと思います。
フォーマットした後に読み込む時は、CHRNの情報のみでセクタ長を決めるので、こういう動作になります。
...合ってるかな?
手持ちのuPD765Aのデータシートはデータ部の読み書きデータに
関しては何も記述が無いので、Read*DataやWrite*Dataは読み書きする
データを入出力(DMAモード時はDMA転送)するとして、
WriteIDは最初の6byteだけ書けばあとは勝手に(Rだけインクリメントして)
書き続け、SC回書いたらGAP4をINDEXが来るまで書けばいいと
勝手に解釈してそのようにRTL記述していました。
(つまり、トラックフォーマット中は一切割り込みやDMA発生せず
完了時のみ割り込み発生)
たしかにセクタ毎にCHRN値を決められれば変則フォーマットも作れますね。
納得です。毎回毎回ありがとうございます。
でも、BASICでもC-DOS2でもformat自体はエラーも発生せずちゃんと
出来るという事はEXM(MSRのbit5)='1'の状態で割り込みが一度も
発生しなくてもフォーマットが完了したと判断されるプログラムに
なっているということなのですね。
変更したところ、確かにC-DOS2の起動ディスクが作られるようになりました。
ついでに他の上位互換FDCのデータシートも探したところ、日立の
HD63265のデータシートにはちゃんとCHRNをセクタ毎に書き込むと
書いてありました。
ありがとうございました。