投げ技炸裂
2018-05-07


;==========================================================
PART$ LED_CONTROL
;----------------------------------------------------------
blink_timer:    .blkw    1
blink_limit:    .blkw    1
;==========================================================
    ; コンディション定義
    CONDITION$_DEFINE C_LED_OFF      ;[消灯中]
    CONDITION$_DEFINE C_LED_ON       ;[点灯中]
    CONDITION$_DEFINE C_LED_BLINK    ;[点滅中]
    ; ステータス定義
    STATE$_DEFINE LED_STATIC_OFF     ; 消灯<[消灯中]
    STATE$_DEFINE LED_OFF_DELAY      ; 消灯遅延<[消灯中]
    STATE$_DEFINE LED_STATIC_ON      ; 点灯<[点灯中]
    STATE$_DEFINE LED_BLINK_OFF      ; 点滅(OFF)<[点滅中]
    STATE$_DEFINE LED_BLINK_ON       ; 点滅(ON)<[点滅中]

    ;=======================================
    ;[消灯中]
    ;=======================================
    CONDITION$ C_LED_OFF
    _ON
        TRANS LED_STATIC_ON      ; → 点灯<[点灯中]
    _UNIQUE
        TRANS LED_BLINK_ON       ; → 点滅(ON)<[点滅中]
    _END

    ;-----------------------------------
    ; 消灯<[消灯中]
    ;-----------------------------------
    STATE$ LED_STATIC_OFF, C_LED_OFF
        [ LED_PORT_BIT ] = OFF
    _END

    ;-----------------------------------
    ; 消灯遅延<[消灯中]
    ;-----------------------------------
    STATE$ LED_OFF_DELAY, C_LED_OFF
    _TIMER
        TRANS LED_STATIC_OFF    ; → 消灯<[消灯中]
    _END

    ;=======================================
    ;[点灯中]
    ;=======================================
    CONDITION$ C_LED_ON
    _OFF
        TRANS LED_STATIC_OFF    ; → 消灯<[消灯中]
    _UNIQUE
        TRANS LED_BLINK_OFF     ; → 点滅(OFF)<[点滅中]
    _END

    ;-----------------------------------
    ; 点灯<[点灯中]
    ;-----------------------------------
    STATE$ LED_STATIC_ON, C_LED_ON
        [ LED_PORT_BIT ] = ON
    _END

    ;=======================================
    ;[点滅中]
    ;=======================================
    CONDITION$ C_LED_BLINK
    _OFF
        NOP
        TRANS LED_OFF_DELAY        ; → 消灯遅延<[消灯中]
    _ON
        TRANS LED_STATIC_ON        ; → 点灯<[点灯中]
    _END

    ;-----------------------------------
    ; 点滅(OFF)<[点滅中]
    ;-----------------------------------
    STATE$ LED_BLINK_OFF, C_LED_BLINK
        [ LED_PORT_BIT ] = OFF
        [ blink_timer ].w = [ blink_limit ].w
    _TIMER
        TRANS LED_BLINK_ON    ; → 点滅(ON)<[点滅中]
    _END

    ;-----------------------------------
    ; 点滅(ON)<[点滅中]
    ;-----------------------------------
    STATE$ LED_BLINK_ON, C_LED_BLINK
        [ LED_PORT_BIT ] = ON
        [ blink_timer ].w = [ blink_limit ].w
    _TIMER
        TRANS LED_BLINK_OFF   ; → 点滅(OFF)<[点滅中]
    _END

;==========================================================
_TIMER
    if [ blink_timer ].w > [ PARAMETER ].w
        [ blink_timer ].w = [ blink_timer ].w - [ PARAMETER ].w
    else    ; タイムアップ
      [ blink_timer ].w = 0  ; blink_limit が割り切れないときの保険
        THROW    ; おもむろに _TIMER を投げる
    endif
_INIT
    [ blink_limit ].w = 1000
_SET
    [ blink_limit ].w = [ PARAMETER ].w
;----------------------------------------------------------
_END
;==========================================================

そう、投げるコマンドは "THROW" です。
このおかげでタイマー更新処理をまとめることができ、コードがスッキリします。

ただ、哀しいことにここまでやってもコードサイズはほとんど変わらなかったりします。
アセンブラなので元々効率がいいんですよね。

そんなこんなで

ようやくミドルウェア部分が出来上がってきましたが、まだ一つ重要な仕組みができていないのと、マイコン周辺機能処理の見直し、LCDなどの周辺機器ドライバやシリアル通信機能などなど、やることが山積みで、またしばらく更新が滞ってしまうかもしれません。

では、今回はこの辺で。


戻る
[プログラミング]
[構造化アセンブラ]
[R8C]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット