[H8マイコン]アセンブラでシリアルポートにHello World

H8マイコンで、シリアル(SCI)でHello Worldを出力するプログラムです。
HEWに付属のアセンブラでコンパイル可能です。

H8でシリアル通信を行うためには決められた手順(プロトコル)でレジスタを操作する必要があります。
プロトコルの詳細については,以下の記事を参考にしてください。
[読書メモ]12ステップで作る組込みOS自作入門: 2ndステップ シリアル通信



;------------------------------------------------------------------------
;   FILE        : HelloWorld.src
;   PROGRAM     : シリアルポートにHello Worldする
;               : プロトコルは"9600bps, 8bit, Parity:None, StopBit:1"
;------------------------------------------------------------------------
        .cpu        300HN
        .export     _main
        .section    P,CODE,ALIGN=2
 
; for H83694f
PMR1    .equ        H'FFE0
 
SMR     .equ        H'FFA8
BRR     .equ        H'FFA9
SCR3    .equ        H'FFAA
TDR     .equ        H'FFAB
SSR     .equ        H'FFAC
RDR     .equ        H'FFAD
 
;------------------------------------------------------
;   メイン処理
;------------------------------------------------------
_main:
        ; シリアルコントローラの初期化
        JSR     @scr_init
 
        ; メッセージの送信
        JSR     @send_message
 
loop:
        BRA     loop
        rts
 
 
 
;------------------------------------------------------
; メッセージをシリアルに送信する
;------------------------------------------------------
send_message:
        ; 出力メッセージの先頭アドレスをセット
        MOV.L   #Msg, ER4
 
send_message_L1:
 
        ;送信可能になるまで待つ(このサブルーチンは結果をR5Lにセットしてくれる...)
        JSR     @is_serial_send_enable  
        CMP     #0, R5L
        BNE     main_L1
 
 
        ; 1byte送信
        MOV.B   @ER4,   R0L
        MOV.B   R0L,   @TDR ; "印字すべき文字=ER4の差し先" とする
 
        BCLR.B  #H'7,   @SSR    ;TDREのフラグを落として(0:not empty)、送信要求する
 
send_message_L2:
        JSR     @is_serial_send_enable  
        CMP     #0, R5L
        BNE     main_L2
 
        ; 表示対象の文字を1文字進める
        INC.L   #1, ER4
        ; ヌル文字まで来てなければ繰り返し
        MOV.B   @ER4, R0L
        CMP.B   #H'00, R0L
        BNE     main_L1
 
        RTS
 
 
;------------------------------------------------------
; シリアルの初期化
;------------------------------------------------------
scr_init:
        BSET.B  #1,     @PMR1
        ;シリアルモードを設定
        MOV.B   #H'00,  R0L
        MOV.B   R0L,    @SCR3
 
        MOV.B   #H'00,  R0L
        MOV.B   R0L,    @SMR    ; All0で 8bit, N, 1になる
 
        MOV.B   #D'64,  R0L
        MOV.B   R0L,    @BRR    ; 通信速度。20MHzの場合は64 (0x40)
 
        ; 通信速度をセット後は、一定期間スリープが必要
        ; 余裕を見て0.1sec待っている
        MOV.L   #D'250000, ER5
L1:     DEC.L   #1, ER5
        NOP
        BNE     L1
 
        BSET.B  #4,     @SCR3   ; RxEnable
        BSET.B  #5,     @SCR3   ; TxEnable
 
        MOV.B   #H'00,  R0L
        MOV.B   R0L,    @SSR
 
        RTS
 
 
;------------------------------------------------------
; シリアルに書き込み可能かチェック
;------------------------------------------------------
is_serial_send_enable:
        MOV.B   @SSR,   R0L
        AND.B   #H'80,  R0L     ; 0x80: SSR.TDRE
        CMP     #H'80,  R0L
        BNE     is_serial_send_enable_L1    ; bitが立ってなければジャンプ
 
        ; 1->EmptyなのでOK
        MOV.B   #0,     R5L
        BRA     is_serial_send_enable_L2
 
is_serial_send_enable_L1:
        ; 0->NG
        MOV.B   #1,     R5L
is_serial_send_enable_L2:
        RTS
 
;出力するメッセージ
Msg:    .sdataz     "Hello world"
 
        .end




4877832394
12ステップで作る組込みOS自作入門

関連記事

コメントを残す

メールアドレスが公開されることはありません。