[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6. ソース生成

6.1 初期化ルーチン init_fanfsm  初期化ルーチン
6.2 有限状態機械ルーチン fanfsm  有限状態機械ルーチン
6.3 状態獲得ルーチン get_fanstate  状態獲得ルーチン

Windows の MS-DOSプロンプトから実行ファイル`Sttc.exe'を以下のように実行 します。引数で指定した `action.inc' はユーザーが自由に定義したアクション用 のサブルーチンの外部参照したファイルです。

 
> sttc -nfan -iaction.inc state.txt

 
; action.inc
; ユーザー作成インクルードファイル
;  FSM が使用するアクションの extrn 宣言を行う
    extrn    stop_low
    extrn    stop_mid
    extrn    stop_high
    extrn    start_low
    extrn    start_mid
    extrn    start_high

-n
有限状態機械の名前を指定
-i
アクションサブルーチンを外部参照宣言したインクードファイル
state.txt
状態遷移表入力ファイル

この場合、生成されるのは以下の2ファイルです。

`fanfsm.asm'
fanの有限状態機械のアセンブリ言語ソース

`fanfsm.inc'
fanfsm ユーザーのインクルード用。 fanfsm の公開サブルーチンの外部参照宣言や、 状態、イベントの定数定義がしてあります。

 
; fanfsm.asm -------------------------------------------------
    name    n_fanfsm

    $include( action.inc ) 

    public    init_fanfsm
    public    fanfsm
    public    get_fanstate

ds_fanfsm    dseg    saddr
fanstate:    ds    1    ; internal state

cs_fanfsm    cseg    unitp
stt_fan:    ; EV_STOP, EV_LOW, EV_MID, EV_HIGH
    dw    fan_on0at0, fan_on1at0, fan_on2at0, fan_on3at0    ; ST_STOP
    dw    fan_on0at1, fan_on1at1, fan_on2at1, fan_on3at1    ; ST_LOW
    dw    fan_on0at2, fan_on1at2, fan_on2at2, fan_on3at2    ; ST_MID
    dw    fan_on0at3, fan_on1at3, fan_on2at3, fan_on3at3    ; ST_HIGH

init_fanfsm:
    mov    fanstate,#0
    ret

fanfsm:
    xch    a,x
    mov    a,fanstate
    xch    a,x
    clr1   cy
    rolc   a,1
    mov    b,a
    mov    a,#8    ; #8 is offset of one-state.
    mulu   x
    movw   hl,ax
    mov    a,l
    add    a,b
    mov    l,a
    mov    a,h
    addc   a,#0
    mov    h,a
    mov    a,l
    mov    x,a
    mov    a,h
    addw   ax,#stt_fan
    movw   hl,ax
    mov    a,[hl]
    mov    x,a
    mov    a,[hl+1]
    ; alternative subroutine call
    br     ax

get_fanstate:
    mov    a,fanstate
    ret

; state : ST_STOP
; event : EV_STOP
; next state :
fan_on0at0:
    ; not transit
    ; nop
    ret

; state : ST_STOP
; event : EV_LOW
; next state : ST_LOW
fan_on1at0:
    mov    a,#1
    mov    fanstate,a
    call   !start_low
    ret

; state : ST_STOP
; event : EV_MID
; next state : ST_MID
fan_on2at0:
    mov    a,#2
    mov    fanstate,a
    call   !start_mid
    ret

; state : ST_STOP
; event : EV_HIGH
; next state : ST_HIGH
fan_on3at0:
    mov    a,#3
    mov    fanstate,a
    call   !start_high
    ret

; state : ST_LOW
; event : EV_STOP
; next state : ST_STOP
fan_on0at1:
    mov    a,#0
    mov    fanstate,a
    call   !stop_low
    ret

; state : ST_LOW
; event : EV_LOW
; next state :
fan_on1at1:
    ; not transit
    ; nop
    ret

; state : ST_LOW
; event : EV_MID
; next state : ST_MID
fan_on2at1:
    mov    a,#2
    mov    fanstate,a
    call   !stop_low
    call   !start_mid
    ret

; state : ST_LOW
; event : EV_HIGH
; next state : ST_HIGH
fan_on3at1:
    mov    a,#3
    mov    fanstate,a
    call   !stop_low
    call   !start_high
    ret

; state : ST_MID
; event : EV_STOP
; next state : ST_STOP
fan_on0at2:
    mov    a,#0
    mov    fanstate,a
    call   !stop_mid
    ret

; state : ST_MID
; event : EV_LOW
; next state : ST_LOW
fan_on1at2:
    mov    a,#1
    mov    fanstate,a
    call   !stop_mid
    call   !start_low
    ret

; state : ST_MID
; event : EV_MID
; next state :
fan_on2at2:
    ; not transit
    ; nop
    ret

; state : ST_MID
; event : EV_HIGH
; next state : ST_HIGH
fan_on3at2:
    mov    a,#3
    mov    fanstate,a
    call   !stop_mid
    call   !start_high
    ret

; state : ST_HIGH
; event : EV_STOP
; next state : ST_STOP
fan_on0at3:
    mov    a,#0
    mov    fanstate,a
    call   !stop_high
    ret

; state : ST_HIGH
; event : EV_LOW
; next state : ST_LOW
fan_on1at3:
    mov    a,#1
    mov    fanstate,a
    call   !stop_high
    call   !start_low
    ret

; state : ST_HIGH
; event : EV_MID
; next state : ST_MID
fan_on2at3:
    mov    a,#2
    mov    fanstate,a
    call   !stop_high
    call   !start_mid
    ret

; state : ST_HIGH
; event : EV_HIGH
; next state :
fan_on3at3:
    ; not transit
    ; nop
    ret

    end

 
; fanfsm.inc ---------------------------------------
    extrn    init_fanfsm
    extrn    fanfsm
    extrn    get_fanstate

; State Definition
ST_STOP equ    0
ST_LOW  equ    1
ST_MID  equ    2
ST_HIGH equ    3

; Event Definition
EV_STOP equ    0
EV_LOW  equ    1
EV_MID  equ    2
EV_HIGH equ    3

以下に、生成したモジュールの公開サブルーチン3つを説明します。入出力は A レジスタを介して行います。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.1 初期化ルーチン init_fanfsm

有限状態機械を初期化するサブルーチンです。ユーザーは初期化処理時にこ れを一度コールします。
サブルーチン名
init_<名前>fsm
入力
なし
出力
なし


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2 有限状態機械ルーチン fanfsm

有限状態機械の本体です。ユーザーはイベントが発生する度にコールします。
サブルーチン名
<名前>fsm
入力
イベント(1byte)
出力
なし


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.3 状態獲得ルーチン get_fanstate

現在の状態を獲得します。ユーザーは現在の状態を知りたい時にいつでもコ ールできます。
サブルーチン名
get_<名前>state
入力
なし
出力
状態(1byte)


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Kiyoshi Masumoto on June, 15 2001 using texi2html