サウンド

サウンド周りのハードウェア構成

 MZ-700のサウンド出力は、8253のチャネル0からの矩形波出力のみです。894.88625kHzのクロック入力をチャネル0で分周したものがそのまま出力されます。通常は、チャネル0をモード3に設定し、デューティ比50%の単音ビープ音出力として使います。

 チャネル0のGATE入力をメモリマップドI/O 0E008h のビット0から制御することができます。サウンド出力を使用するときはここに1を出力しておきます。

サウンド出力

 440Hz(ラの音)を出力するなら、894886.25 / 440 ≒ 2034 = 07F2h を分周比としてチャネル0のカウンタにセットします。
 音を出力すると出っぱなしになるので、適当なところで止めなければなりません。GATEをLにするか、モードセットの後にカウンタ値を書かずにおくことで、出力がH固定になり、サウンド出力が止まります。

        ;
        ; 初期化
        ;
        LD    A, 1
        LD    (0E008h), A   ; GATE = H

        LD    HL, 0E007h    ; 8253 コントロールポート
        LD    (HL), 36h     ; チャネル0, モード3, 下位バイト→上位バイトの順にカウンタを設定        

        ;
        ; サウンド出力
        ;
        LD    HL, 0E004h    ; 8253 チャネル0
        LD    (HL), 0F2h    ; チャネル0のカウント値の下位バイトを設定
        LD    (HL), 007h    ; チャネル0のカウント値の上位バイトを設定

        (音の長さ分のウェイト)

        ;
        ; サウンド停止
        ;
        XOR   A
        LD    (0E008h), A   ; GATE = L

モードセット後の初期値を利用した1ビットPCM

 8253のチャネルにモードセットを行うと、カウント値がセットされるまでは固定の初期値を出力し続けます。これを利用すると、サウンド出力のH/Lを直接CPUから制御することができます。H/Lを高速に切り替えることで、1ビットPCM再生が可能です。
モード初期値
0 L
1-5H

 オーディオカセットテープを1ビットPCMで再生するサンプルです。プログラムを実行後、データレコーダにテープを入れてPLAYボタンを押すと再生します。

        LD    HL, 0E002H    ; 8255 ポートC
        LD    DE, 0E007H    ; 8253 コントロールポート
        LD    C, 20h        ; チャネル0, モード0, 上位バイトのみカウンタを設定(ダミー)        

 L1:    LD    A, (HL)       ; データレコーダから1ビット入力
        AND   C
        RRCA
        RRCA                ; 1ならモード4, 0ならモード0
        OR    C
        LD    (DE), A       ; 8253 チャネル0 モード設定 (1ビットPCM出力)
        JP    L1

モード0を利用したPWM再生

 8253のモード0は、セットされたカウント数のLを出力し、その後Hを出力、再びカウント値がセットされるまでHを出力し続ける、という動作を行います。そのため、カウント値を正確な周期で更新することができれば、PWM出力として使用することができます。
戻る