例題3.3 音を出力 -> 待機 -> 消音


音が出力されその後1秒たつと消音するプログラムを書いてみましょう.
ここでは,初めてサブルーチンが出てきます.サブルーチンへのジャンプの仕方,戻り方を学習します.ちなみに,22,25,26行でfor文と同じ作業をしています.
;              BEEP2.SRC      (c)yas@E-SYS Lab.

;********************************************
;*      時間制御BEEP音発生プログラム    *
;********************************************
;
;------CPUの指定-------
        .CPU    300HA
;

;----シンボルの定義------
;今回はポートBのみを使います.

PBDR    .EQU    H'FFFFD6       ;ポートBデータレジスタ
        .SECTION       ROM,CODE,LOCATE=H'000100       ;セクションの宣言

;-----I/Oの初期設定----
;ポートBを出力に設定しています.
;ポートBのデータディレクションレジスタに書き込んでいます.

INIT:   MOV.L   #H'FFFF10,ER7  ;スタックポインタの設定
        MOV.B   #H'FF,R0L      ;ポートBを出力に設定するため
        MOV.B   R0L,@H'FFFFD4  ;ポートBDDRにH'FFを書き込む

;----MAINルーチン-----
;このプログラムの流れは,
;1:R0Lに00000001を書き込む
;2:回数を設定する
;3:R0Lの中身をポートBに出力する
;4:待機する
;5:R0Lの1bit目を反転する
;6:残り回数を1回減らす
;7:残り回数が0でないならば3:へと飛ぶ(ループ)
;となります.
;待機する時間の長さにより音程が変わります.

        MOV.B   #B'00000001,R0L ;R0Lに1を書き込む
        MOV.W   #H'0100,R5

START:  MOV.B   R0L,@PBDR      ;R0Lの内容をポートBに出力する
        JSR     @TIME00 ;待機
        BNOT    #0,R0L         ;R0Lのbit0を反転する
        (_____) #1,R5          ;残り回数から1引く
        BNE     START          ;残り回数がまだあればSTARTにジャンプする

LOOP:   JMP     @LOOP          ;無限ループ 

;----タイマサブルーチン------
TIME00: MOV.W   #H'1000,R6     ;タイマ
TIME01: SUB.W   #1,R6          ;R6にH'1000を書き込み1ずつ減算
        BNE     TIME01         ;0になるまで減算を繰り返す
        (___)                  ;元のルーチンに戻る

                  .END 

課題 3.3の説明

  • 7行目 :CPUの指定をしています.
  • 10行目 :シンボルの定義をしています.ポートBデータレジスタをPBDRと表しました.
  • 12行目 :セクションの宣言をしています.
  • 15〜17行目 :初期設定,スタックポインタにH'FFF10を書き込んでいます.ポートBを出力に設定しています.PBDDR(ポートBデータディレクションレジスタ)に所定の制御コードを書き込みます.付録からPBDDRの番地はH'FFFFD4であることが分かります.出力ビットに設定したいので,その番地に1を書き込みます.
  • 20〜28行目 :R0Lに00000001を書き込みます.R5に回数を設定します.R0Lの中身をポートBに出力します.約1秒後R0Lのbit0を反転します.残り回数を1回減らします.残り回数が0でなければSTARTにジャンプします.P5DR(ポート5データレジスタ)のbit0を0にクリアします.
  • 31〜34行目 :WAITのサブルーチンです.H'200000から値を1ずつ引いていき,ゼロになるまでこの作業を繰り返します.この作業でWAITとなり,値がゼロになったらメインルーチンに戻ります.
     MOV.B #B'00000001,R0L ;R0Lに1を書き込む
      MOV.W #H'0100,R5
START: MOV.B R0L,@PBDR ;R0Lの内容をポートBに出力する
      JSR @TIME00 ;待機
      BNOT #0,R0L ;R0Lの1bit目を反転する
      SUB.W #1,R5 ;残り回数から1引く
      BNE START ;残り回数がまだあればSTARTにジャンプする

プログラムの上記の部分はfor文とよく似ています.for文は初期値から目標値まで繰り返すループです.
このプログラムでは,20,21行で初期値をR5に設定しています.そして,25行でR5から1を引き26行でfor文を続けるかどうかの条件を書いています.

課題: できた人は音程を変えてみよう.また,鳴っている時間を変えてみよう.
SOUNDをON/OFFするプログラムを作成して下さい.



[山口研究室] <back | index | next >