USART / とにかく何かを送信する / 送信完了割り込みを使う

今度は、データレジスタエンプティ割り込みではなく送信完了割り込みを使ってみる。とりあえず何かを送信し終えない限り送信完了フラグが立たない。テキストにサンプルが載っていないので多分あまり一般的な方法ではない。
f:id:ti-nspire:20200529064747p:plain:w500

; スタックポインタの初期化マクロ
.MACRO INITSTACK
    LDI R20, HIGH(RAMEND)
    OUT SPH, R20
    LDI R20, LOW(RAMEND)
    OUT SPL, R20
.ENDMACRO

; 割り込みベクターテーブルを侵さないようにするため、マイコンのリセット後はただちに別の番地へ飛ぶことにする。
.ORG 0
    JMP MAIN

; 送信完了割り込みがかかると制御が0x28番地に飛んでくるので、そこからさらに別の番地へ飛んで何かを実行する。
.ORG UTXCaddr ; 0x28
    JMP UTXC_INT_HANDLER

.ORG 0x100
MAIN:
    INITSTACK

    ; トランスミッターを有効化して、送信完了割り込みを有効化して、
    LDI R16, 1 << TXEN0 | 1 << TXCIE0
    STS UCSR0B, R16

    ; 8N1 (8ビットデータ、パリティなし、1ストップビット)にして、 
    LDI R16, 1 << UCSZ01 | 1 << UCSZ00 ; CSZはCharacter Size。
    STS UCSR0C, R16

    ; ボーレートを9600にして、
    LDI R16, 51 ; == 8MHz/(16*9600)-1
    STS UBRR0L, R16 ; BRはBaud Rate。

    ; グローバル割り込みを有効化して、
    SEI

    ; とりあえず何かを送信して、とりあえず送信完了割り込みをかけて、
    LDI R26, 0
    STS UDR0, R26

LOOP:
    RJMP LOOP

UTXC_INT_HANDLER:
    ; 1文字を送信する。
    LDI R26, 'a'
    STS UDR0, R26
    RETI