例題2.5 BILNKER2


LED1,3,5,7が点灯後1秒たつとLED1,3,5,7が消灯しLED2,4,6,8が点灯し,LED2,4,6,8が消灯します.この繰り返しをするプログラムを書きます.8連LEDはポートBに接続されています.
;        BLINKER2.SRC            (c)yas@E-SYS Lab.
;******************************************
;*       LED点滅プログラム(PORT B)        *
;******************************************
;
;------CPUの指定-------
        .CPU      300HA
;
;----シンボルの定義------
;今回は8連LEDを使用するので,
;ポート5ではなくポートBのみを使います.
;ポート5とポート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に10101010を書き込む
;2:R0Lの中身をポートB(8連LED)に出力する
;3:1秒間待機する
;4:R0Lの中身を反転する
;5: 2:へと飛ぶ(ループ)
;となります.
;前回までとは異なり,LED8個分を一度に書き込んでいます.
;そして今回は反転命令を使うことによりR0Lを,
;10101010⇔01010101
;のように操作しています.
;
        MOV.B     #B'10101010,R0L           ;R0Lに10101010を書き込む
START:  MOV.B     R0L,@PBDR                 ;R0Lの内容をポートBに出力する
        JSR       @TIME00                   ;約1秒間待機
        NOT.B     (___)                     ;R0Lのbitを反転する
        JMP       @(_____)                  ;STARTにジャンプする
;
;----タイマサブルーチン------
TIME00: MOV.L     #(________),ER6           ;約1秒間のタイマ
TIME01: SUB.L     #1,ER6                    ;ER6にH'280000を書き込み1ずつ減算
        BNE       TIME01                    ;0になるまで減算を繰り返す
        RTS                                 ;元のルーチンに戻る
;
        .END

課題 2.5の説明

  • 7行目:CPUの指定
  • 13行目:シンボルの定義をしています.ポートBデータレジスタをPBDRと表しました.
  • 15行目:セクションの宣言をしています.このセクションは名称がROM,中身がCODE(プログラム),H'000100番地を先頭にしなさいという指示をしています.
  • 21〜23行目:初期設定,スタックポインタにH'FFF10を書き込んでいます.ポートBを出力に設定しています.PBDDRに制御コードを書き込みます.付録からPBDDRの番地はそれぞれH'FFFFD4であることが分かりますから,その番地に,出力ビットに設定したいのでH'FFを書き込みます.
  • 38〜42行目:R0Lレジスタに10101010をいれ,ポートBのDRにコピーをしています.8連LEDの1,3,5,7個目が点灯します.次に,TIMEルーチンにジャンプし約1秒のWAIT後,MAINルーチンに戻ります.NOTによりR0Lのビットを反転して01010101とします.すると,8連LEDの2,4,6,8個目が点灯します.その後,TIMEルーチンにとび約1秒のWAIT後MAINルーチンに戻り,STARTにジャンプします.
  • 45〜48行目:WAITのためのルーチンです.H'280000から1ずつ減算していき0になったらルーチンを出ます.

今回新たに使ったニモニック

NOT

:デスティネーションオペランドの 1の補数をとり,結果をデスティネーションオペランドに格納します.

Ex) NOT.B R0L ;R0レジスタの下位8bitのbitに対して,bitが0ならば1を,1ならば0をいれる

課題

LEDが順番に点灯するプログラムを作りましょう.

ヒント: これを繰り返すことによって,「ナイトライダー」ができます。試してみますか?

 


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