This is from Nori, author of Famtasia (which has FDS sound) ******************************************** Warning! Japanese Shift-JS encoding follows. ******************************************** *DiskSystem 1. QuickDiskのフォーマット形式  ディスク上のデータは、下表に ヲすように、ブロック単位で記録 されており、ブロックの初め フ バイトは、ブロック識別子として 識別され、それによりデータ キが決定している。ブロックの 初め と最後には、ブロック開始マーク A終了マークが記録され、開始マーク として$80、終了マークは 記録したデータのCRC値(?)が2バイト L録され、データ整合性のチェック として用いられているが、 エミュレータ上では特に意識 オなくてもよい。 ディスクレイアウト GAP 無記録期間 Block Start Mark ($80) ブロックの開始を ヲす(FDSでは未記録) Block ID (VOL Label=$01) ボリュームラベル ブロック Data (55 Bytes) Block End Mark (2Bytes) チェック用(FDSでは未 記録) GAP Block Start Mark ($80) Block ID (File Amount=$02) ファイル数ブロッ N Data (1 Bytes) Block End Mark (2Bytes) GAP Block Start Mark ($80) Block ID (File Header=$03) ファイルヘッダブロ bク Data (15 Bytes) Block End Mark (2Bytes) GAP Block Start Mark ($80) Block ID (File Data=$04) ファイルデータブロ bク Data データ長は、ヘッダ ナ指定した長さ Block End Mark (2Bytes) GAP Block Start Mark ($80) Block ID (File Header=$03) ファイルヘッダブロ bク : : : 1.1 各ブロックの詳細 << Volume Label Block >>  このブロックはディスクのサイ h、ゲーム名などが記録される SIZE 内容 1 $01 14 FC Disk String "**NINTENDO-HVC**" 1 Manufacture Code GameBoy等で使われる識別コード と同じ(?) 4 Game Name Code 1 Game Version Number 1 Side Number 0: Side-A 1: Side-B 1 Disk Number 1 Err.9 (Ext Disk Indicate No) 1 Err.10 (Ext Disk Indicate No) 1 Boot Read File Code 起動時に読み取るファイル ッ別コードを指定する。 ここで指定されたコード以 コのファイルが起動時にロードさ れる。 5 Unknown 3 Manufacture Permit Date(???) メーカー認可日(?) BCD符号で記録。年号は昭和(+1925 ) 10 Unknown 3 Created Date BCD符号で記録。年号は昭和(+1925 ) 9 Unknown << File Amount Block >>  このブロックはディスクに記録 ウれているファイル数が記録さ 黷驕Bこのブロックの情報は、 起動時にしかチェックしておら ず、このファイル数以上のファ Cルが存在している事が る ため、 エミュレータ上では、この数は 無視して扱う。 SIZE 内容 1 $02 1 File Amouts << File Header Block >>  このブロックは次に続くFile Data Blockのヘッダ情報として記録され る。ディスクシステムでは、 ディスクデータの読み取りを、フ @イル識別コードを介して行われ る。この処理は、BIOSが行うの ナ エミュレータでは、ファイル長の み意識すればよい。 SIZE 内容 1 $03 1 File Number ここには、ファイルのSEQ番号が 振られているが、チェックは行 れていない 1 File Indicate Code (ファイル識別コード) ディスクリードのファンクショ 塔Rール時に指定される識別子 8 File Name 2 File Address ロード時に格納するアドレス 2 File Size 1 Kind of File 0:Program(PRAM) 1:Character(CRAM) 2:Name table(VRAM) 格納先を示す << File Data Block >>  実際のデータが記録されてい 驛uロック。 SIZE 内容 1 $04 -- ディスクデータ 1.2. FDS Format  FDSファイルフォーマットには実は 2種類 ります。1つは、Famtasia Ver4以前で使用されていた FDSファイル形式、もう1つはFanWen氏 によるエミュレータfwNesで使用さ 黷トいるFDSファイル 形式が ります。前者は、ディ Xクサイド毎に1つのファイルを使 pするのに対し、後者は1つの ゲームで、1ファイルになるよう にしています。後者のFDSファイ ルは、下記ヘッダ情報(16バイト) に続いて、1節で説明したディ スクレイアウトのうち、ブロックID ニデータが記録されています。 (ブロックスタートマーク、エンドマー クは記録されません) SIZE 内容 4 識別子"FDS^Z" 1 ディスク枚数 11 Reserved=0 ディスクのデータは1枚につき、6550 0バイト固定です。 2. Disk I/O Register Adr Mask $4020 (Write) XXXXXXXX Timer Interrupt lower byte タイマー割り込みの下位サイク 拠lを設定する。設定を有効に するには$4022のD1を1とする。 $4021 (Write) XXXXXXXX Timer Interrupt higher byte タイマー割り込み値の上 位サイクル値を設定する。 $4022 (Write) ??????T? Timer Interrupt Control T:タイマーカウント開始で1 一度割り込みが起こると、再 x1を書き込まないと割り込み は発生しない $4023 (Write) ??????SD 2C33 I/O Control S:Sound I/O 0:Disable 1:Enable D:Disk I/O 0:Disable 1:Enable $4024 (Write) XXXXXXXX QD Write Data $4023.D0=1, $4025.D2=0, $4030.D7=1の時 ノ書き込み可能 $4025 (Write) IS1BMRTD Disk I/O Control I:Interrupt Transfer 0:割り込みを使用せず ]送する 1:ディスク読み書き可能なタイミ 塔Oで割り込みを発生させる S:Read/Write Start モータを回転させ読み書き可 \な状態になれば1をセットする ただし、次のブロックを読む スめにはGAP期間中にいったん0 を セットし、再び1をセット キる必要が る。 1:Unknown Always 1 B:Block end mark Read/Write ブロック終了マークの読 ン込み/書き込み時1をセットす M:Miroring 0:LHLH 1:LLHH R:Read/Write Mode 0:書き込み処理 1:読み出し処理 T:Transfer Reset 転送タイミングを初期状 態に設定するとき1 D:Drive Motor Control 0:モータ停止 1:モータ作動 $4026 (Write) BXXXXXXX External Connector Output Data B:BATTERY SENCE端子とWired OR 常に1を設定しないと バッテリーエラーが発生する XXXXXXX:RAMアダプタ背面の拡張 [子出力データ 入力を行いたいとき ヘ全てのビットを1にすること $4030 (Read) IE?B??TD Disk I/O Status I:Disk Data Read/Write Enable ディスクが読み書き可 \な状態になったとき1 E:End of Head ヘッドが最内周へ到達 オたとき1 B:Block end mark Exist ブロック終了マークが見 ツからない場合1 T:Disk I/O Interrupt(???) 2C33内で割り込み発生 オたとき1??? D:Timer Interrupt Timer割り込みが発生し スとき1 $4031 (Read) XXXXXXXX QD Read Data $4023.D0=1, $4025.D2=1, $4030.D7=1の時 ノ読み出し可能 $4032 (Read) ?1???PRS QD Status P:Write Protect 0:書き込み可 1:書込み禁止(ツメ折れ ADiskEject) R:Drive Ready 0:Drive Ready(モーターを稼動し 、読み書き初期処理を 行ってからヘッドが最 燻へ到達、或いはDiskEjectす るまで) 1:Drive Not Ready S:Card Set 0:カード挿入 1:カードEJECT $4033 (Read) BXXXXXXX Enternal Connector Input Data/Battery Sence B:Battery Sence 1:通常 0:電圧低下 XXXXXXX:背面端子入力データ 3. エミュレータ上でのディスク読 ン書き手順 エミュレータを開発するに当た っては、下記のステップにそっ トいけば、わかってくると思 「ます。 (実機とは制御が異なります ェ...) レジスタ数が多く、複雑そうに みえますが、読み書きは基 {的にBIOSでしか行わないので 完璧にエミュレーションする K要は りません。(試行錯誤し て、読めればOK(笑)) ポイントは、$4025レジスタの制御の みうまくやって げれば何 ニかなります。 <<BIOSからQDを起動す 驍ワで>> ($4025/$4030/$4031/$4032/$4033をエミュレート ) ・$4025は、D4,D0は無視で可 ・$4030は、常に$80 ・$4031は、$4025.D2=1の時にデータを返 す。それ以外は0でも、直前の fータでも可 ・$4032は、とり えずD0のみエミ レート、それ以外は0 ・$4033は、常に0 ・割込み周期は100clock毎に発生 ウせる ・割込み禁止($4025D7=0)時には、転 欄r中でもIRQを禁止する ・ブロック開始/終了マークは意識 オなくてよい(FDSフォーマットの読 み出し時) ・各ブロックの読み出しは、$4025の D6を0->1で開始する  注意:ブロック長を超える読 み出しは、無視する エミュレータ上でのディスクロー h (詳細なタイミングチャートが知り たい場合は、Goroh氏のドキュメ 塔gを参照してください) 1) FDSファイルポインタ初期化  $4025 D1=1でファイルポインタ位置を 初期化 2) VOL ラベルロード開始  $4025 D6=0->1でVOLラベルロード開始  $4025 D7=1で約100クロック毎にIRQを発生 ウせ、ファイルオフセット位置をイ 塔Nリメントする  再度、$4025 D6=0->1されるまで、VOLラベルのロ ードを続け、データ長を超えた 鼾、ダミーデータを送る(何でも よい)  転送完了すると、一旦 $4025 D7=0 ウれるので、IRQを禁止する 3) ファイル数ロード開始  $4025 D6=0->1でファイル数ロード開始  2)と同様 4) ファイルヘッダロード開始  2)と同様 5) ファイルデータロード開始  2)と同様  次のファイルを読む場合、4) ノ戻る ※エラー発生時や、他のデータ 読むときに$4025 D1=1されるので、その時にす ラて初期化する <<QDへの書き込み>> ファイルへの書き込みは該当 uロックまで、データを読み捨て た と、該当ブロックから$4025 D2=0にする事によって 書き込まれます。読み捨て 舶ェは上記の通りとし、$4025 D2=0されたときのエミュレータ フ対処を記載します。 ・$4031はダミーデータを返す ・$4024は$4025.D2=0の時以外は無視 ・ブロック最初の書き込みは uロックスタートマーク($80)が記録され るので、これは無視する。(FDS tァイルには記録しない) ・ とは、読み取り時に$4031が 使われていた代わりに、$4024が 使われるだけで同じ。 <<特殊ゲームへの対応>> ・ディスクの読み書きを独自に 行っていたり、ディスクイジェク g管理を完璧にチェックしてい 驛\フトに対応するため、  残りのレジスタをインプリメ 塔gする必要が ります。(特に $4032) 4. 拡張Sound概要 *サウンドの発振周波数は、下記 フ式で与えられます。 [発振周波数][Hz] = [設定周波数]*2 7/64 5.Disk I/O Register Adr Mask $4040- $407F (Read) (Write) --XXXXXX Wave Data ・$4089のD7が1の時だけ設 閧ェ有効 ・1周期の波形を設定 キる ・波形の0レベルは0x20 $4080 (Write) VFXXXXXX Volume Control V:Volume Setting 0:Fade-in/out 1:Volume Setting F:Fade-in.out Setting 0:Fade-in 1:Fade-out 注意:Vが0の時のみ有 XXXXXX:Fade-in/out speed or Volume Value Fade-in/out speed 0(Fast)<--->3f(Slow) Volume 0(Min/off)<--->3f(Max) ・Fade-in/outは$408AのD8が1にな チた時点で開始する $4081 ???????? Unknown $4082 (Write) XXXXXXXX Lower Frequence ・下位の基本周波数を ン定する ・書き換わると発振周 波数はSweepタイマに関わらず、  同時に変化する ・書き込みにより、$4085 設定周波数はリセット $4083 (Write) ????XXXX Upper Frequence ・上位4ビットの基本周 g数を設定する ・書き換わると発振周 波数はSweepタイマに関わらず、  同時に変化する ・書き込みにより、$4085 設定周波数はリセット $4084 (Write) MMTTTTTT Sweep Control 1 (Sweep Mode/Speed setting) MM:Sweep Mode Setting 00:Increase Frequence TTTTTT:Increase Speed Setting 0:$4085設定値に即時に設 定する 1(Fast)<--->3f(Slow)   ・指定した速度で、$4085設定 波数へ周波数を上昇させる   ・注意:$4085設定値が$4082/3基本周 波数より小さくなっ    た場合、一旦周波数が0xfff ノなった と、再び0から    周波数を再設定 キる 01:Decrease Frequence TTTTTT:Decrease Speed Setting 0:($4085設定値)/2に即時に 設定する 1(Fast)<--->3f(Slow) ・指定した速度で、($408 5設定周波数)/2になるよう    周波数を下降させ る   ・注意:$4085設定値が$4082/3基本周 波数より大きくなっ    た場合、一旦周波数が0に なった と、再び0xfffから    周波数を再設定 キる 10/11:Proportional Frequence TTTTTT:Proportional Frequence Setting 0:$4082/3基本周波数 <--> 3f:$4085 ン定周波数 0:即時反映   1(Slow)<--->3f(fast)   ・指定時間経過後、 范癆z分した周波数をセットす   ・00/01と違い、設定値 が反映される速度の設定が逆 B ・$4085の周波数設定だけではな く、ここで設定したタイマが  経過した後、$4086/$4087/$4088 ナ設定したLFO値が  設定される。つまり、$4086-8で 高速に周波数を変化させる  設定を行っても、こ フレジスタの時間が経過しない と、  音は鳴らない。(内部 的にはカウントされている) $4085 (Write) ?XXXXXXX Sweep Control2 (Sweep Frequence setting) ・現在詳細解析中 data&=0x7f; if( data < 0x60){ iSweepFreq = (int)( ((DWORD)iBaseFreq*data)>> 5); iSweepFreq += iBaseFreq; }else{ data=((~data)&0x1f)+1; iSweepFreq = -1*(int) ((DWORD)iBaseFreq*data)>> 5); iSweepFreq += iBaseFreq; } $4086 (Write) XXXXXXXX LFO Speed Setting(Low) ・$4088で設定した周波数 時間変化の速度を設定する  値が大きいほど速い ・ここで設定するの ヘ内部的な速度で り、  実際に出力されるタイミング ヘ、$4084の設定に依存する。 ・値が0のとき、$4087のD7が 1のとき、LFOは無効 $4087 (Write) SXXXXXXX LFO Speed Setting(High) S:$4088 Write 0:Disable 1:Enable XXXXXXX:LFO Speed (High) $4088 (Write) -----fff LFO Modulation Frequence setting fff:Moduration data:0 1 2 3 4 5 6 7 freq:0+1+2+3 0-3-2-1 ・$4087のD7が1の時のみ設 濶ツ能 ・32バイト分のバッファが り、周波数の変調を設定で ォる ・$4084/$4087のアクセスにより ポインタは初期化される $4089 (Write) W?????VV Sound Control Register 1 W:Wave data setting 0:Disable 1:Enable and Sound off VV:Reverb Level(?) ・設定により音量が マ化する(調査中) $408A (Write) E??????? Sound Control Register 2 E:Envelope setting 0:Disable 1:Fade-in/out Enable