mz-80K カウンタ 8253
8253(使用ポート 0E004H〜0E008H) カウンタ8253を使用してサウンド出力、タイマー割込みを行います 0E004H:8253 C0 モード2、レート・ジェネレータ 2MHz(LS74のクロック) 0E005H:8253 C1 モード2、レート・ジェネレータ 31.25kHz 0E006H:8253 C2 モード0、ターミナル・カウンタ C1のOUT1 0E007H:8253 CW 0E008H:8253のC0の制御 d7:未使用 d6: 〃 d5: 〃 d4: 〃 d3: 〃 d2: 〃 d1: 〃 d0:テンポ用NE555のステータスビット (入力) MUSIC 1=Start、0=Stop(出力) 割り込み mz−80Kからmz−1500はモード1を使用し リセット時は割り込みは禁止になっています(mz−700以降はモード2も使用可) /INTは8253のC2のOUT2=1、 または拡張端子からの割り込み要求があれば0038Hへリスタートします 0038Hは01038Hにフックされているので01038Hにジャンプします 本体の8253と外部からの割り込みの区別がつかない為 ユーザがこの事を把握しておく必要があります mz−80Kでは8253のカウンタを止めるには 3E B0 LD A,0B0H 32 07 E0 LD (0E007H),A mz−1200以降は8253の割り込みを8255のPC2=0で禁止になります /NMIはmz−80Kでは使用出来ません <タイマー割り込み> C1のクロックは 31.25KHz(mz−700以降は15.7KHz) C2はクロックはC1のOUT1になります つまり2つのカウンタが連動して 最終的には/INTが掛かるようになります 流れはC1でカウント、 設定したC1でC2がカウント 設定したC2で/INTがかかります モニタ、BASICではC1は1秒ごとにC2をカウント C2は12時間ごとに/INTがかかるようにして am/pmの切り替えの為に設定されています また、マシーンランゲージでBコマンドで使用しています
サウンドの設定 C0のモード2のクロックは2MHz(mz−700以降はモード3の 895KHz) ここで分周比を設定します ポート0E008Hのd0出力がサウンドのオン/オフ制御を行います またここのポートは機種によって空きのポートが使用されています <分周比の設定> SP−1002内では002AEHが880Hzのサウンド出力になっています このルーチンではカウンタ#0に分周比00471Hを一定時間出力して止めます カウンタ#0へ分周比の設定は0E004Hに分周比下位、分周比上位の順に書き込みます またSP−1002ルーチンでは分周比データ000FFH〜00000Hでは 音を鳴らさないようになっています カウンタ#0のクロックは2000000Hz(2MHz)なので 880Hzの音を鳴らす場合の計算は 2000000Hz÷(880Hz*2)=1136.3636... 少数第1を四捨五入して1136で16進数に変換すると00470Hになります ただしSP−1002では0471Hで設定しています これは分周比の設定が整数と高い音ほどずれが大きくなる為の補正だと思われます カウンタ#0はLS74で1/2の周波数でサウンド出力されるので2倍の設定になります mz−700以降はアンプに出力なので設定方法が異なります SP−1002内の基準となる分周比データ ・―――――――――――――――――・ |音名| 周波数 | 分周比 | |――+――――――――+―――――| |C |523.25Hz|0777H|00271H〜00288H |D |587.33Hz|06A7H| 音名(アスキー)、分周比下位、分周比上位 |E |659.26Hz|05EDH| |F |698.46Hz|0598H| |G |783.99Hz|04FCH| |A |880.00Hz|0471H| |B |987.77Hz|03F5H| |R | − |0000H| |−−+−−−−−−−−+−−−−−| |C#|554.37Hz|070CH|00289H〜002A1H |D#|622.25Hz|0647H| 音名(アスキー)、分周比下位、分周比上位 |E#| − |0598H| |F#|739.99Hz|0548H| |G#|830.61Hz|04B4H| |A#|932.33Hz|0431H| |B#| − |03BBH| 1オクターブを下げる時は |R | − |0000H| 分周比データを2倍にする ・―――――――――――――――――・ <音の発生> 分周比を設定出来たら8253 GATE0のコントロール(出力)を行います 0E008H d0=1 音を鳴らす 0 音を止める <音の中止> ポート0E007Hの8253 CWに034Hを書き込むか ポート0E008Hのd0=0にする <リズム> 一定時間のタイミングをとる為にカウンタIC NE555を使用 0E008H d0を読むことでNE555の状態を知る事が出来ます リズムは使用せずソフトウェアディレイで時間稼ぎをする事も出来ます また本体内のボリュームでリズムの速度調整可 RYTHM[002C8H]では B=ウェイト数を入力パラメータとしてB回分リズムをとります 1.BREAKチェック(押されていればエラー終了Cf=1、RET) 2.0E008 d0が1−>0になるまで待つ 3.Bレジスタが0になるまで2から3のループ 4.Cf=0、RET(正常終了) タイマの設定 SP−50x0では時計機能として制御します また時計機能の代わりに他のリアルタイム割り込みとしても使用可 時計機能の動き C1は 31.25kHzをクロックとして1秒になったら C2をカウント、C2値が12時間( 43200秒)になったら /INTを発生(am/pmの切換え) C1の設定 ポート0E007Hの8253 CWに074Hを書き込む C2の設定 ポート0E007Hの8253 CWに0B0Hを書き込む C2のカウンタリード ポート0E007Hの8253 CWに080Hを書き込む ポート0E006Hを2回読む(C2値 下位、上位の順)
mz−80Kのコーナへ Home へ戻る