2010年10月31日日曜日

H8マイコン-その1

H8マイコンで点滅回路の作成
十何年ぶりかにマイコンをいじる
アセンブラも忘れてしまっていたが、書籍を見ながらなんとか書いて見る。
単純なローテーションロジック。

ソース##
;8個のLEDを点滅させる

;H8/300 NOMAL MODE,16BIT ADDR
.CPU 300HN

;ハードリセット時にH'0からスタート
.SECTION VECTOR,DATA,LOCATE=H'0

;メインプログラムをRESETからスタート
.DATA.L RESET

;SECTION命令でPROG,CODE領域を初期化。
;3664の使用可能ROMアドレスはH'0034からH'7FFFまで。
;今回はH'0034に指定
.SECTION PROG,CODE,LOCATE=H'34


;==================================
;===================================
;アドレスの初期化
;アドレスH'FF80をSTACKとして宣言
STACK: .EQU H'FF80
;アドレスH'FFEBをPCR8(ポート8のI/O状態指定)として宣言
PCR8: .EQU H'FFEB
;アドレスH'FFDBをPDR8(ポート8のI/Oデータ)として宣言
PDR8: .EQU H'FFDB
;===================================


RESET:
;リセット直後にMOV.L命令でSPを初期化
MOV.L #STACK,SP

;MOV.B命令で#255(10進の255:2進で11111111)をレジスタR0Lに
MOV.B #255,R0L

;MOV.B命令でR0Lの値をPCR8(ポート8の入出力レジスタ)に移動
MOV.B R0L,@PCR8

ONRIGHT:
MOV.B #254,R0L
MOV.B R0L,@PDR8

STARTSET:
MOV.L #H'40000,ER1
;レジスタR1の値から#1(10進の1)だけ減算し、ER1へ転送
ONLOOP:
SUB.L #1,ER1

;ER1の値によりCCRのZフラグが「0」であれば、ラベルONLOOPへジャンプ
BNE ONLOOP

;R0Lのビットを右へシフトローテート
ROTR.B R0L
;R0Lの値をポート8に移動
MOV.B R0L,@PDR8
;無条件に「STARTSET」ラベルへ移動
BRA STARTSET

.END
##

なんとか成功。
さて、これから思い描いているものをどうやって作ろうか。