例題2.1 LEDを点灯するプログラム


LED(ポート5のbit0に接続されている)を点灯するプログラムを使って,LEDを点灯させてみましょう. このプログラムではプログラム作成の基本的な流れとH8にプログラムを書き込むまでの流れを学習します.

;             LEDON.SRC    (c)yas@E-SYS Lab.
;**********************************
;*        LED点灯プログラム       *
;**********************************
;
;------CPUの指定-------
;H8には色々なCPU機種が存在します.
;ここではどの機種のCPUを使用するかを宣言します.
          .CPU      300HA
;
;----シンボルの定義------
;H8内部ではすべてアドレスで処理されます.
;しかし,毎回アドレスを打ち込んでいると面倒臭いし,間違えます.
;ここではそのアドレスに名前を付けるショートカット作業を行っています.
;今回はマザーボード右下のLEDのついているポート5を使用するので
;ポート5データレジスタ(ポート5の入出力データが入る場所)にP5DRと名前をつけます.
;また,ポート5のbit0にもLED1と名前を付けます.
;.sectionではセクションの名称,性格,プログラムの開始番地を宣言します.
;
P5DR      .EQU      H'FFFFCA                  ;ポート5データレジスタ
LED1      .BEQU     0,P5DR                    ;ポート5のbit0をLED1で表す
;
          .SECTION  ROM,CODE,LOCATE=H'000100  ;セクションの宣言
;
;-----I/Oの初期設定----
;ここではH8の持っているポートを何にどのように使用するかを設定します.
;今回はマザーボード右下についているLEDを出力としたいのでポート5を出力に設定しています.
;また、スタックポインタとはプログラム進行上の退避場所です.
;ここでは詳しく説明しません.興味がある人は参考書等で学習してください.
;
INIT:     MOV.L     #H'FFFF10,ER7             ;スタックポインタの設定
          MOV.B     #H'FF,R0L                 ;ポート5を出力に設定するため
          MOV.B     R0L,@H'FFFFC8             ;ポート5DDRにH'FFを書き込む
;
;----MAINルーチン-----
;これより先がプログラムのメインとなる場所です.
;今回はLEDを点灯するだけのプログラムです.
;
;流れの説明
;まず,LED1を点灯する.次にLOOPラベルのところへジャンプする(無限ループ).
;
LEDON:    BSET    LED1                        ;LED1を点灯する
LOOP:     JMP     @LOOP                       ;ここでループする
;
          .END

例題 2.1の説明

  • 9行目:CPUの指定.H8用アセンブラでは,プログラムの冒頭で,どの機種のCPUを使うかを記述しなければなりません.これは,H8シリーズとして他のCPU機種にも共通のアセンブラが使えるようになっているためです.
  • 20〜21行目:シンボルの定義.アセンブラプログラムではプログラムを書き込むメモリの番地を絶えず意識しなければなりません.しかし,16進数で番地を書くことは間違いやすいため,プログラムの中に出てくる”番地”を”シンボル”として文字列に置き換えています.ここでは,H'FFFFCAと書く代わりにシンボルとしてP5DRと書いてもよいように,プログラムの初めに定義しています.このシンボルはそれが何を目的とする番地であるか分かりやすいような記号で表します.ポート5のデータレジスタのことなのでP5DRとしています.また,ポート5のbit0をLED1で定義しています.
  • 23行目:セクションの宣言.文章の章のようにプログラムの各章の初めにその章の名称,性格,開始番地などを宣言する記述を行います.このセクションは名称がROM,中身がCODE(プログラム),先頭をH'000100番地にしなさいという指示をしています.
  • 31〜33行目:初期設定.16行でスタックポインタにH'FFFF10を書き込んでいます.スタックポインタはサブルーチンなどから復帰する戻り番地,使用中のレジスタの内容を一時保管したりするためのRAM領域を指定するレジスタです.17,18行でポート5を出力に設定しています.入出力の設定はデータディレクションレジスタに制御コードを書き込むことで行います.入力に設定したいのなら0を,出力に設定したいなら1を書き込みます.ここではポート5を使用するため,P5DDR(ポート5データディレクションレジスタ)に制御コードを書き込みます.付録からP5DDRの番地はH'FFFFC8であることが分かります.その番地に,LEDを点灯させるために出力ビットに設定したいので1を書き込みます.ここでは,16進数のFFを書き込んでいます.これは2進数で表すと11111111と表せます.この様にすることで,ポート5の8個のビットに1を書き込んでいます.
  • 42〜43行目:メインルーチン.点灯させるところに1を書き込みます.1つのビットを1にセットするときはBSET(BitSET)を使います.“BSET LED1”でLED1に1をセットしています.具体的には,LED1はP5DR(ポート5データレジスタ)のbit0なのでP5DRのbit0に1をセットしています.これによりLED1を点灯させます. LOOPで無限ループになっているので,電源を切ったりしない限り,この動作を続けます.

セミコロンから右に書かれた文字はコメントとして扱われます.

.CPU

CPUの指定です.

.EQU

シンボルの定義をします.

.BEQU

Bit単位でシンボルの定義をします.

.SECTION

セクションの宣言をします.文章の章のようにプログラムの各章の初めにその章の名称,性格,開始番地などを宣言する記述をします.プログラムをいくつかのセクションと呼ばれる管理単位に分割できるようになっていて,このセクションは名称が ROM,中身がCODE(プログラム)としています.また,このプログラムでは,これ以降のプログラムはH'000100番地を先頭にしなさいという指示をしています.

Ex) .SECTION ROM,CODE,LOCATE=H'000100 ;セクションの宣言をします。

.END

プログラムの終わりを示します.必ず付けて下さい.

今回新たに使われたニモニック

MOV

MOVe

ソースオペランドの内容をデスティネーションオペランドに書き込みます

Ex) MOV.L #H'FFF10,ER7 ;#H'FFF10をER7に書き込みます

BSET

BitSET

デスディネーションオペランドの指定された 1bitを「1」にセットします

Ex) LEDON: BSET LED1 ;LED1を「1」にセット

JMP

JuMP

指定した実行アドレスにジャンプします

Ex) JMP @LEDON ;LEDONラベルへジャンプ

BSET

デスティネーションオペランドの指定された 1bitを「1」にビットセットします

Ex) BSET LED1 ;LED1を1にセットします


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