{{include unfinished_page}} ,{t},{BSIZE:1 0|SIZE:100%} ,{BSIZE:0}←[[1章 MSX-MIDIとは]] ,{BSIZE:0|RIGHT}[[3章 割り込み]] →  MSX-MIDIは、内蔵と外付けによって、ハードウェア構成やアクセス方法が異なります。以下では、MSX-MIDIのハードウェア構成について説明します。  なお、タイマー用ICとして8253または8254を使用しますが、以下では「8253」と表記します。 !!2.1 ブロック図  MSX-MIDIのハードウェアは以下のような構成になっています。 {{svg 図4.1 MSX-MIDIのブロック図.svg,,size:740x470}} '''図4.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インターフェイスは使用できません。 ,{t},{BSIZE:1 0|SIZE:100%} ,{BSIZE:0}←[[1章 MSX-MIDIとは]] ,{BSIZE:0|RIGHT}[[3章 割り込み]] →