例題2.3LED 点灯 ->1 秒 -> 消灯
LED(ポート5のbit0)が点灯しその後1秒たつと消灯するプログラムを書いてみましょう. ここでは,初めてサブルーチンが出てきます.サブルーチンへのジャンプの仕方,戻り方を学習します. |
; LEDONOFF.SRC (c)yas@E-SYS Lab. ;********************************** ;* LED点灯/消灯プログラム * ;********************************** ; ;CPUの指定からI/Oの初期設定までは前回までに説明したとおりです. ;わからない場合は課題1,2を見返してください. ; ;------CPUの指定------- .CPU 300HA ; ;----シンボルの定義------ P5DR .EQU H'FFFFCA ;ポート5データレジスタ LED1 .BEQU 0,P5DR ;ポート5のbit0をLED1で表す LED2 .BEQU 1,P5DR ;ポート5のbit1をLED2で表す .SECTION ROM,CODE,LOCATE=H'000100 ;セクションの宣言 ; ;-----I/Oの初期設定---- INIT: MOV.L #H'FFFF10,ER7 ;スタックポインタの設定 MOV.B #H'FF,R0L ;ポート5を出力に設定するため MOV.B R0L,@H'FFFFC8 ;ポート5DDRにH'FFを書き込む ; ;----MAINルーチン----- ;これよりメインです. ;今回はサブルーチンに飛んでいるので注意が必要です. ;プログラムの流れは, ;LED点灯→1秒待つ→LED消灯→LOOPラベルへ飛ぶ(無限ループ) ;となります. ;この1秒待つ部分がサブルーチンです. ;JSR命令でサブルーチンへと飛んで行き, ;サブルーチンが終わるとRTS命令で戻ってきます. ;タイマサブルーチンにあるTIME00ラベルから3行が ;このJSRのところにそのまますっぽり入っていると ;考えてください. ; BSET LED2 LEDON: BSET LED1 ;LED1を点灯する (___) @TIME00 ;1秒間待つ LEDOFF: BCLR LED1 ;LED1を消灯する LOOP: JMP @LOOP ;ここでループする ; ;----タイマサブルーチン------ ;1秒間待つサブルーチンです. ;この部分の流れを説明します. ;メインからJSR命令で飛んできたらまず,汎用レジスタ(ER6:32bit)に ;H'280000を書き込みます. ;次に,ER6から1を減算します. ;ER6が0になったかチェックします(BNE). ;ER6が0でなかったら再び1を減算します. ;ER6が0になったらBNEの次の行,つまりRTS命令が実行され, ;サブルーチンに飛ぶ前の部分に帰ります. ; ;ここではH'280000回(16進数で28000回)減算処理が行われ,その時間が浪費される. ;つまり,この部分でプログラムが一定時間(約1秒)とまるわけです. ; ;また,TIME00以下3行は,C言語で言うところのfor文にあたり, ;ER6レジスタを変数iに置き換えると, ;for( i=H'280000 ; i!=0 ; i-- ) ;に相当します. ; ;約1秒間のタイマ ; TIME00: MOV.L #H'280000,ER6 ;ER6にH'280000を書き込み TIME01: SUB.L #1,(___) ;1ずつ減算 BNE TIME01 ;0になるまで減算を繰り返す (___) ;元のルーチンに戻る ; .END |
課題 2.3の説明
TIME00: MOV.L #H'200000,ER6 ;約1秒間のタイマ TIME01: SUB.L #1,ER6 ;ER6にH'200000を書き込み1ずつ減算 BNE TIME01 ;0になるまで減算を繰り返す RTS ;元のルーチンに戻る プログラムの上記の部分は for文とよく似ています.for文は初期値から設定条件下でプログラムを繰り返すループです.そして,for文は次のように構成されていました. for(式1;式2;式3) {繰り返したいプログラム} for文では,まず式1(初期値),式2(条件)を行い,その次に繰り返したいプログラムを行い,式3を行っていました. 今回のプログラムでは,(式 1)H'200000(初期値)をER6にいれ,それからから1を引き算して(繰り返したいプログラム),ゼロ(式2(条件))になるまで,待ちを続けるループです. |
今回新たに使われたニモニック
JSR | サブルーチンにとびます. RTSで戻ってきます |
SUB | 第2オペランドから第1オペランドの内容を減算し,その結果を第2オペランドに格納します. |
BNE | Zフラグが0なら指定されたところへ,Zフラグが1なら次の命令に進みます. |
RTS | サブルーチンから復帰します |