※ ※ このページは書きかけです。以下の可能性があります。 ※ ・誤字、脱字等のチェックをおこなっていません。 ※ ・テキスト、表などフォーマットがされていない。 ※ ・画像が抜けている。 ※
MSX-MIDIは、内蔵と外付けによって、ハードウェア構成やアクセス方法が異なります。以下では、MSX-MIDIのハードウェア構成について説明します。
なお、タイマー用ICとして8253または8254を使用しますが、以下では「8253」と表記します。
2.1 ブロック図
MSX-MIDIのハードウェアは以下のような構成になっています。
2.2 内蔵MIDIインターフェース
本体に内蔵されたMSX-MIDIインターフェイスのI/Oポートは、次のように割り当てられています。
・8251インターフェイス 0E8H、0E9H番地
| b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | ||
| OE8H | (Read) | RXD7 | RXD6 | RXD5 | RXD4 | RXD3 | RXD2 | RXD1 | RXD0 |
| (Write) | TXD7 | TXD6 | TXD5 | TXD4 | TXD3 | TXD2 | TXD1 | TXD0 |
| RXD7〜RXDO 8251 | 受信データ |
| TXD7〜TXDO 8251 | 送信データ |
| b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | ||
| OE9H | (Read) | DSR | BRK | FE | OE | PE | EMPT | RRDY | TRDY |
| DSR | 8253 | タイマー割り込みフラグ | (1=割り込み発生) |
| BRK | 8251 | ブレークコード検出 | (1=検出) |
| FE | 8251 | フレームエラーフラグ | (1=エラー発生) |
| OE | 8251 | オーバーランエラーフラグ | (1=エラー発生) |
| PE | 8251 | パリティエラーフラグ | (1=パリティエラー発生) |
| EMPT | 8251 | 送信バッファステータス | (1=送信バッファ空) |
| RRDY | 8251 | 受信バッファステータス | (1=データ有り) |
| TRDY | 8251 | 送信ステータス | (1=送信可能) |
| 0E9H | (Write) | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
| モード | S2 | S1 | EP | PEN | L2 | L1 | B2 | B2 | |
| コマンド | EH | IR | RIE | ER | SBRK | RE | TIE | TEN |
| EH | 通常0に設定します | |
| IR | 通常0に設定します | |
| RIE | MIDI IN割り込み許可 | (1=許可、0=禁止) |
| ER | エラーリセット | (1=エラーフラッグのリセット) |
| (0=ノー・オペレーション) | ||
| SBRK | 通常0に設定します | |
| RE | MIDI IN受信イネーブル | (1=許可、0=禁止) |
| TIE | 8253タイマー(カウンタ#2) | (1=許可、0=禁止) |
| 割り込み許可 | ||
| TEN | MIDI OUT送信イネーブル | (1=許可、0=禁止) |
8251のコマンド・モードレジスタの書き込み回復時間は、最大16クロック(3.579545MHz)必要です。8251の初期化など、連続してコマンド・モードレジスタに書き込みをする際は、ウエイトを入れて下さい。
8251はI/Oポートの0E9Hに00H、00H、00H、40Hを書き込むと、リセットされます。モードに誤った値を設定すると、MIDIとして機能しなくなるので、リセット後は必ず特定の値を設定します。詳細は、添付のサンプルプログラム(「THRU.MAC」)を参照して下さい。
・8253 OUT2端子の信号のラッチ(0EAH、0EBH番地)
| b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | ||
| 0EAH | (Write) | - | - | - | - | - | - | - | - |
0EAH番地のデータリードは無効 0EBH番地は0EAH番地のイメージ
8253のカウンタ#2からの割り込みは、0EAH番地への任意のデータ書き込みによって解除されます。
・8253インターフェイス(0ECH〜0EFH番地)
| b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | ||
| 0ECH | (R/W) | CT07 | CT06 | CT05 | CT04 | CT03 | CT02 | CT01 | CT00 |
| 0EDH | (R/W) | CT17 | CT16 | CT15 | CT14 | CT13 | CT12 | CT11 | CT10 |
| 0EEH | (R/W) | CT27 | CT26 | CT25 | CT24 | CT23 | CT22 | CT21 | CT20 |
| 0EFH | (Read) | - | - | - | - | - | - | - | - |
| (Write) | SC1 | SC0 | RW1 | RW0 | M2 | M1 | M0 | BCD |
| CT07〜CT00 | カウンタ#0 |
| CT17〜CT10 | カウンタ#1 |
| CT27〜CT20 | カウンタ#2 |
| SC1、SC0 | カウンタ選択、コマンド選択 |
| RW1、RW0 | カウンタリードライトモード |
| M2、M1、M0 | カウンタモード |
| BCD | バイナリ、BCDカウント選択 |
各カウンタの機能は次のようになっています。
─ カウンタ#0
8251のボーレートジェネレータとして使われます。CLK端子には4MHzのクロック信号が入力されています。8251に対しては、ボーレートクロックとして500KHzを送信する(8分周する)ように設定しなければなりません。モードは3(方形波N分周モード)で使用します。
─ カウンタ#1
汎用のカウンタとして使うことができます。CLK端子にはカウンタ#2の出力が入力されています。
─ カウンタ#2
CPUへの周期的な割り込みに使用されます(BASICでは5ミリ秒間隔の割り込みとして使用される)。通常、モード2(N分周モード)で使用します。OUT2端子がLOWになると、ラッチ回路を通してCPUに割り込みを発生します。CLK端子には4MHzのクロックが入力されます。
2.3 外付けMIDIインターフェイス
外付けのMSX-MIDIインターフェイスは、110ポートの0E2Hに値を設定することによって、I/Oポートのアドレスが変わります。
・MIDIインターフェイスの設定(0E2H、0EAH番地)
| b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | ||
| 0E2H | (Write) | EN | - | - | - | - | - | - | E8 |
| EN | MIDIインターフェイスの使用許可、禁止 | (0=許可、1=禁止) |
| 初期値は1。 | ||
| E8 | 8251アドレス設定 | (1=0E0H、0E1H番地) |
| 初期値は1。 | (0=0E8H、0E9H番地) |
E8ビットを0に設定すると、外付けカートリッジのMIDIインターフェイスのI/Oポートは、0E2Hから0EAHに変わり、内蔵MIDIインターフェイスとコンパチブルになります。また、8251のI/Oアドレスは、0E8Hと0E9Hになります。
E8ビットを1に設定すると、8251インターフェイスは0E0H、0E1H番地になり、カートリッジのI/Oの0ECH〜0EFHへのアクセスは禁止されます。また、8253のタイマー割り込みも禁止されます。
・8251インターフェイス(0E0H、0E1H番地)
(E8ビットが1の場合)
| b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | |||
| 0E0H | (Read) | RXD7 | RXD6 | RXD5 | RXD4 | RXD3 | RXD2 | RXD1 | RXD0 | |
| (Write) | TXD7 | TXD6 | TXD5 | TXD4 | TXD3 | TXD2 | TXD1 | TXD0 |
| RXD7〜RXD0 | 8251 | 受信データ |
| TXD7〜TXD0 | 8251 | 受信データ |
| b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | ||
| 0E1H | (Read) | DSR | BRK | FE | OE | PE | EMPT | RRDY | TRDY |
| b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | ||
| 0E0H | (Read) | RXD7 | RXD6 | RXD5 | RXD4 | RXD3 | RXD2 | RXD1 | RXD0 |
| (Write) | TXD7 | TXD6 | TXD5 | TXD4 | TXD3 | TXD2 | TXD1 | TXD0 |
| DSR | 8253 | タイマー割り込みフラグ | (1=割り込み発生) |
| BRK | 8251 | ブレークコード検出 | (1=検出) |
| FE | 8251 | フレームエラーフラグ | (1=エラー発生) |
| OE | 8251 | オーバーランエラーフラグ | (1=エラー発生) |
| PE | 8251 | パリティエラーフラグ | (1=パリティエラー発生) |
| EMPT | 8251 | 送信バッファステータス | (1=送信バッファ空) |
| RRDY | 8251 | 受信バッファステータス | (1=データ有り) |
| TRDY | 8251 | 送信ステータス | (1=送信可能) |
| 0E1H | (Write) | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
| モード | S2 | S1 | EP | PEN | L2 | L1 | B2 | B1 | |
| コマンド | EH | IR | RIE | ER | SBRK | RE | TIE | TEN |
| EH | 通常0に設定します | |
| IR | 通常0に設定します | |
| RIE | MIDI IN割り込み許可 | (1=許可、0=禁止) |
| ER | エラーリセット | (1=エラーフラグのリセット) |
| (0=ノー・オペレーション) | ||
| SBRK | 通常0に設定します | |
| RE | MIDI IN受信イネーブル | (1=許可、0=禁止) |
| TIE | 8253タイマー(カウンタ#2) | (1=許可、0=禁止) |
| 割り込み許可 | ||
| TEN | MIDI OUT送信イネーブル | (1=許可、0=禁止) |
2.4 内蔵タイプと外付けタイプとの見分け方
MAIN ROMの002EH番地のビット0が1の場合は、MSX-MIDIは内蔵されています。
MAIN ROMのバージョン番号(【002DH】)が03H以上の機種では、外付けカートリッジでMSX-MIDIの機能を使うことができます。
内蔵タイプと外付けタイプとでは、フックが異なっています。この違いはアプリケーションを作成する上で重要です。フックについては、3.2「フック」と4章「アプリケーション開発の注意」を参照して下さい。
内蔵タイプと外付けタイプとを判別するにはMSX-MIDIのROMの4018H番地からの文字列を調べます。
表4.1 MSX-MIDIの判別用文字列
| アドレス | 内蔵 | 外付け |
| 4018H | 41H(A) | ??H(?) |
| 4019H | 50H(P) | ??H(?) |
| 401AH | 52H(R) | ??H(?) |
| 401BH | 4CH(L) | ??H(?) |
| 401CH | 4FH(O) | 4DH(M) |
| 401DH | 50H(P) | 49H(I) |
| 401EH | 4CH(L) | 44H(D) |
| 401FH | 4CH(L) | 49H(I) |
外付けカートリッジでは、4018Hからの4バイトはメーカーごとに異なる任意のデータになります。401CHからのデータは「MIDI」となっています。
2.5 MIDIインターフェイスの有無の判別方法
MIDIインターフェイスの有無は、次のように判別します。
1. MAIN ROMの002EH番地のビット0が1の場合、MIDIインターフェイスは内蔵されています。
2. MAIN ROMのバージョン番号(002DH)が03H以上の場合、401CH〜401FHに次の内容を持つスロットを探します。
DB "MIDI"
もしあれば、外付けカートリッジが実装されています。
3. 以上のことにあてはまらない場合、MIDIインターフェイスは存在しないので、MIDI機能は使用できません。
4. ROMのバージョン番号(002DH)が02H以下の場合、MIDIインターフェイスは使用できません。