| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
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'
`fanfsm.inc'
; 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] | [ ? ] |
init_fanfsm サブルーチン名
init_<名前>fsm
入力
出力
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
fanfsm サブルーチン名
<名前>fsm
入力
出力
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
get_fanstate サブルーチン名
get_<名前>state
入力
出力
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |