==== Disk System Infomation ==== Date 1998/05/28 By goroh Mail goroh_kun@geocities.co.jp 1. はじめに このドキュメントでは次のことについて説明する。 ・ディスクの各ブロックの構成 ・BIOSで発生するエラーの解説 ・各ポートの説明 ・エミュレータでの対応方法、 2. ディスクの構成 ディスクシステムは複数のブロックと呼ばれるデータの固まりによって構成されている。 ブロックは先頭に1バイトのブロックIDをもっていて、これがブロックの種類を表わしている。 2-1. DISK Header Block (BlockID=1) ディスクの属性を格納するブロック ディスクヘッダーの例(デッドゾーンの場合) ADDRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ---------------------------------------------------------------------------- 00000000 01 2A 4E 49 4E 54 45 4E 44 4F 2D 48 56 43 2A 01 .*NINTENDO-HVC*. 00000010 47 46 4A 45 00 00 00 01 00 F2 FF FF FF FF FF 62 GFJE............ 00000020 02 27 49 61 00 00 02 00 4C 02 03 00 62 02 27 FF .'Ia....L...b.'. 00000030 FF FF FF FF 00 00 FF 02 -- -- -- -- -- -- -- -- ........ バイト構成 ------------------------------------------------------------ (size 1byte) #$01 BlockID (size 14byte) *NINTENDO-HVC* ファミコンディスク認識用データ (size 1byte) メーカー識別番号 (size 4byte) ゲーム識別ID (size 1byte) ゲームバージョン番号 (size 1byte) ディスクの面番号(0:side-A 1:side-B) (size 1byte) ディスク付加番号1 (size 1byte) ディスク付加番号2 (size 1byte) ディスク付加番号3 (size 1byte) $08に格納される (size 30byte) 予約領域(DiskBIOSでは使用されない) ------------------------------------------------------------ 2-2. File Amount Block (BlockID=2) ディスク内にあるファイルの数を格納するブロック ブロックの構成例(デッドゾーンの場合) ADDRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ---------------------------------------------------------------------------- 00000000 02 08 -- -- -- -- -- -- -- -- -- -- -- -- -- -- .. バイト構成 ------------------------------------------------------------ (size 1byte) #$02 BlockID (size 1byte) ファイル数 $06に格納される ------------------------------------------------------------ 2-3. File Header Block (BlockID=3) ファイルの属性を格納するブロック ブロックの構成例(デッドゾーンの場合) ADDRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ---------------------------------------------------------------------------- 00000000 03 00 00 4B 59 4F 44 41 4B 55 2D 00 28 E0 00 02 ...KYODAKU-..... バイト構成 (size 1byte) #$03 BlockID (size 1byte) ファイル番号(DiskBIOSはこのデータを使用しない) (size 1byte) ファイル番号2(DiskBIOSはこのデータを使用しない) (size 8byte) ファイル名(DiskBIOSはこのデータを使用しない) (size 2byte) ファイル格納場所 (size 2byte) ファイルサイズ (size 1byte) ファイルの種類 (0:データ 1:キャラクタデータ 2:ネームテーブルデータ) (DiskBIOSは1,2の区別をしない) 2-4. File Data Block (BlockID=4) ファイルのデータを格納するブロック (size 1byte) #$04 BlockID (size -----) ファイルデータ 3.各ブロックの配置 ディスクヘッダブロック ファイル数ブロックブロック ------ ファイル数の数だけ繰り返し --------- ファイルヘッダブロック ファイルデータブロック ------------------------------------------- 4.ディスクのエラー ERR.01 ディスクカードがない ERR.02 ディスクユニットの電源が足りない ERR.03 ディスクカードのツメが折れている ERR.04 メーカIDが違う ERR.05 ゲーム名が違う ERR.06 バージョン番号が違う ERR.07 A,B SIDE ERR.07 サイド番号が違う ERR.08 ディスク番号1が違う(新・鬼ヶ島などで使用) ERR.09 ディスク番号2が違う ERR.10 ディスク番号3が違う ERR.20 許認画面のデータが異なる ERR.21 ディスクヘッダブロックの一部(*NINTENDO-HVC*)が違う ERR.22 ディスクヘッダブロック識別番号#$01が読み取れない ERR.23 ファイル数保存用ブロック識別番号#$02が読み取れない ERR.24 ファイルヘッダブロック識別番号#$03が読み取れない ERR.25 ファイルデータブロック識別番号#$04が読み取れない ERR.26 ディスクカードに正しくSAVEできない ERR.27 ブロック終了マークが見つからない ERR.28,ERR.29 ディスクユニットと同期が取れない ERR.30 ディスクカードにSAVEできる残りの部分が無い。 ERR.31 ディスクカードのデータ数が実際と合わない。 5. DISK SYSTEMの制御 4020 -W Timer IRQ Control Register 0 4021 -W Timer IRQ Control Register 1 4022 -W Timer IRQ Control Register 2 bit ------I- I 1:割り込み機能有効 0:割り込み機能無効 4023 -W Timer IRQ Control Register 3 現在解析中 ディスクの割り込み設定 4024 -W Port Output 4025 -W Control Register Input 4bit目: Mirror (VRAM A10) 0:LHLH 1:LLHH タイミング図 < 読み込みの場合 > A init B motor_on C read_start_mark D IRQ_ENABLE E read_end_mark *1. readdata, 4030's 6bit = 0 *2. readdata, 4030's 5bit = 0 | A | B | C | D || E | 8bit |___|______|___|---||------___| 7bit |___|______|---|---||------___| 6bit |---|------|---|---||---------| 5bit |___|______|___|___||___---___| 3bit |---|------|---|---||---------| 2bit |---|---___|___|___||_________| 1bit |___|------|---|---||------___| 備考 | | | | || 1 2 | < 書き込みの場合 > A init B motor_on C write_start_mark & start write D IRQ_enable E write_end_mark *1. delay, writedata #$00 *2. writedata #$80 *3. writedata, 4030's 6bit = 0 *4. delay | A | B | C | D || E | 8bit |___|______|______|---||------___| 7bit |___|______|___---|---||------___| 6bit |---|------|------|---||---------| 5bit |___|______|______|___||___---___| 3bit |---|------|______|___||______---| 2bit |---|---___|______|___||_________| 1bit |___|------|------|---||------___| Note | | | 1 | 2 || 3 4 | 4026 -W ExPort Output ラムカードの背後のシャッターの中にある拡張端子の 出力に使用する。 4030 R- Disk Status Register 0 -A-B---- ディスクのデータなどのDISKコントローラ内部の情報 割り込みの発生原因をこのレジスタから調べることができる。 各ブロックを呼び込んだ後にAやBが1の場合はエラーになる A: Data Exist 0:Yes 1:No B: Block Mark Exist 0:Yes 1:No C: Timer IRQ Occer 0:Yes 1:No 4031 R- Port Input ディスクから転送されるデータ データが確定したときに割り込みが発生するので、割り込みルーチン内で このアドレスの読み込みを行う。 4032 R- Disk Status Register 1 -----PSD ディスクユニットの情報 D media flag 0: Disk inserted 1: Disk not inserted S ready flag 0: Disk Ready 1: Disk Not Ready P protect flag 0: Write UnProtected 1: Write Protected 4033 ExPort Input B------- B: Disk Battely low 0: OK 1: LOW 4040-407F Wave Data bit --ffffff $4089の8bit目が1のときだけ変更が有効になる ディスクシステムの音源はPM音源で、各位相における変調データを このアドレスに書き込む. データ量から分周率は1/0x40であることがわかる。 4080 Volume Control register bit TFffffff T: Volume Control Type 0:FadeIn,FadeOut 1:Immediate T=1 のとき F:ignore ffffff: Volume 0:min(no sound)..3f:max T=0 のとき F: FadeIn/FadeOut 0:FadeOut 1:FadeIn ffffff: FadeIn/FadeOut Speed 0:fast .. 3f:slow 考察 ピアノやストリングスの音のように、音量が変化するものを$4080の bit7を利用して表現できる 4082 Frequence Control registere(LOW) bit ffffffff: frequence lower 8bit 4083 Frequence Control registere(High) bit E---ffff E: if 1, Sound output disable ffff: frequence higher 4bit 考察 O4 A の音が f=0x400になる つまり、周波数の単位は 0x400/ 440 = 2.3272727.. Hz となる。 たとえば、O3 Cの音は131Hzなので O3 C = 131 * 2.32727.. = 304.8727272.. この音を出力するにはf=305を指定すればよい 4084 LFO Control register bit TFffffff T: Efector Control Type 0:FadeIn,FadeOut 1:Immediate T=1 のとき F: ignore ffffff: Efector の かかり具合 T=0 のとき F: Efect FadeIn/FadeOut 0:FadeOut 1:FadeIn ffffff: FadeIn/FadeOut Speed 0:fast .. 3f:slow 4085 Efector State Control register 4084の機能を使用するときのLFOのOFFSET値を指定する。 単位は (f/0x20)で、 現在のLFOデータのアドレスOFFSETのアドレスとする。 0x00-0x5fまでがプラス方向のオフセットで0x60-0x7fまでがマイナス方向の オフセットになる。 bit -vvvvvvv 0x00: +(f/0x20) * 0x00 = 0 0x10: +(f/0x20) * 0x10 = +f x 0.5 0x20: +(f/0x20) * 0x20 = +f x 1.0 0x30: +(f/0x20) * 0x30 = +f x 1.5 0x40: +(f/0x20) * 0x40 = +f x 2.0 0x50: +(f/0x20) * 0x50 = +f x 2.5 ---------------- 0x60: -(f/0x20) * 0x20 = -f 0x61: -(f/0x20) * 0x1F 0x62: -(f/0x20) * 0x1E 0x64: -(f/0x20) * 0x1C 0x68: -(f/0x20) * 0x18 = -f x 0.75 0x70: -(f/0x20) * 0x10 = -f x 0.5 4086 Efector Speed Control register(Low) 4087 Efector Speed COntrol register(High) RSssssss R: 4088の設定変更用スイッチ 0:変更しない 1:変更する S: Max Speed ssssss: Efector Speed 4088 ----ffff 音階の時間的変化量の設定 32回の書き込みで1セット 単位は (f/0x10) 0: 0 1: +1 2: +2 3: +3 4: 0 5: -3 6: -2 7: -1 64段階の変調が可能(正48,負16) 考察 $4084のLFO機能が有効になっているときは、 $4082,$4083で設定した周波数fと $4085,$4088によって 最終的に出力される周波数が決定する. 4089 R-----vv R: 4040-407Fの設定変更用スイッチ 0:変更しない 1:変更する 1にすると、サウンドは鳴り止む. vv: efector 408A ??? 解析中 6. ケーブルの仕様 ディスクユニットケーブル /~~~~~~~~~~~~\ | 1 3 5 7 9 B| | 2 4 6 8 A C| +------------+ 1:VCC 2:out MOTOR ON $4025の3bit 3:GND 4:out READ $4025の2bit 5:in Sense Boltage $4033の8bit モータをまわしたときに電源の様子が分かる。 6:in Read Data[9] $4031 8:in Write Protect $4032の3bit 9:in MediaSet $4032の1bit A:out Write DATA $4024 B:out WRITE $4025の1bit C:in Ready $4032の2bit 拡張ケーブル /~~~~~~~~~~\ | 1 3 5 7 9| | 2 4 6 8 A| +----------+ 1:GND 2:VCC 3:in $4033の1bit out $4026の1bit 4:in $4033の2bit out $4026の2bit 5:in $4033の3bit out $4026の3bit 6:in $4033の4bit out $4026の4bit 7:in $4033の5bit out $4026の5bit 8:in $4033の6bit out $4026の6bit 9:in $4033の7bit out $4026の7bit A:NC 7.エミュレータへの対応方法 ・$6000-$DFFFをラムにすること ・ディスクの現在のデータの位置を示すポインタを用意すること ・$4025のタイミング図を参考にして、$4025の8bit目が1になったときに一定間隔でIRQを発生 するとともに、ディスクの現在のデータのポインタをインクリメントすること ・現在のポインタにあるデータを$4031に出力すること ・$4025のタイミング図を参考にして、各ブロックの最後のデータの読み書きは無効にすること (こうしたほうが、FDSファイルに対応しやすい。) ・$4025の2bit目を1にしたときにディスクのポインタを初期化(最初に戻す)こと。 ・$4030の読み込み時は常にエラーが発生しない値を返すこと。 ・$4033の8bit目は常に0にすること 7. 最後に まだ、ドキュメントが書き途中のこともあり分かりづらい個所があると思います。 不明な点はメールをください。 また、現在ディスクの読み書きができるまでに解析できていて、今後ディスクの書き換え システムを公表する予定です。