目次
前
次
コンバータ作成
ラダー図の1行を表現する命令を定義したので
文字列からEEPROMに格納する16ビットコードを
生成するコンバータを作成します。
論理動作を確認するため、AWKを使ったコンバータを
最初に作成します。
AWKを使うと、DOS、Windows、UNIXのどの環境でも動く
マルチプラットホームのコンバータができます。
コンバータソースコード
AWKは、パターン認識+アクションで処理を記述します。
C言語のif文と同じ要領で記述できます。
C言語で扱いにくい文字列処理を、簡便に記述できます。
「命令コード+ビット番号」か「命令コード」のパターン
を判断して、16ビットコードを生成します。
判断は、次のように記述します。
{
if ( $1 == "END" ) { }
if ( $1 == "OUT" ) { }
if ( $1 == "LD" ) { }
if ( $1 == "LDN" ) { }
if ( $1 == "AND" ) { }
if ( $1 == "ANDN" ) { }
if ( $1 == "OR" ) { }
if ( $1 == "ORN" ) { }
if ( $1 == "ANDB" ) { }
if ( $1 == "ORB" ) { }
if ( $1 == "SETC" ) { }
if ( $1 == "INC" ) { }
if ( $1 == "DEC" ) { }
if ( $1 == "SETT" ) { }
if ( $1 == "COND" ) { }
if ( $1 == "JUMP" ) { }
if ( $1 == "JMPZ" ) { }
}
命令コードを保存するための変数を用意します。
AWKは、インタプリタなので変数宣言は不要です。
{
if ( $1 == "END" ) { code = 0 }
if ( $1 == "OUT" ) { code = 1 }
if ( $1 == "LD" ) { code = 2 }
if ( $1 == "LDN" ) { code = 3 }
if ( $1 == "AND" ) { code = 4 }
if ( $1 == "ANDN" ) { code = 5 }
if ( $1 == "OR" ) { code = 6 }
if ( $1 == "ORN" ) { code = 7 }
if ( $1 == "ANDB" ) { code = 8 }
if ( $1 == "ORB" ) { code = 9 }
if ( $1 == "SETC" ) { code = 10 }
if ( $1 == "INC" ) { code = 11 }
if ( $1 == "DEC" ) { code = 12 }
if ( $1 == "SETT" ) { code = 13 }
if ( $1 == "COND" ) { code = 14 }
if ( $1 == "JUMP" ) { code = 15 }
if ( $1 == "JMPZ" ) { code = 15 }
}
16ビットコードを生成します。
{
if ( $1 == "END" ) {
code = 0
result = code * 4096
}
if ( $1 == "OUT" ) {
code = 1
result = code * 4096 + $2
}
if ( $1 == "LD" ) {
code = 2
result = code * 4096 + $2
}
if ( $1 == "LDN" ) {
code = 3
result = code * 4096 + $2
}
if ( $1 == "AND" ) {
code = 4
result = code * 4096 + $2
}
if ( $1 == "ANDN" ) {
code = 5
result = code * 4096 + $2
}
if ( $1 == "OR" ) {
code = 6
result = code * 4096 + $2
}
if ( $1 == "ORN" ) {
code = 7
result = code * 4096 + $2
}
if ( $1 == "ANDB" ) {
code = 8
result = code * 4096 + $2
}
if ( $1 == "ORB" ) {
code = 9
result = code * 4096 + $2
}
if ( $1 == "SETC" ) {
code = 10
if ( $2 == "C000" ) { target = 0 }
if ( $2 == "C001" ) { target = 1 }
if ( $2 == "C002" ) { target = 2 }
if ( $2 == "C003" ) { target = 3 }
if ( $2 == "C004" ) { target = 4 }
if ( $2 == "C005" ) { target = 5 }
if ( $2 == "C006" ) { target = 6 }
if ( $2 == "C007" ) { target = 7 }
if ( $2 == "C100" ) { target = 8 }
if ( $2 == "C101" ) { target = 9 }
if ( $2 == "C102" ) { target = 10 }
if ( $2 == "C103" ) { target = 11 }
if ( $2 == "C104" ) { target = 12 }
if ( $2 == "C105" ) { target = 13 }
if ( $2 == "C106" ) { target = 14 }
if ( $2 == "C107" ) { target = 15 }
result = code * 4096 + target * 256 + ($3 / 16) * 16 + ($3 % 16)
}
if ( $1 == "INC" ) {
code = 11
if ( $2 == "C000" ) { target = 0 }
if ( $2 == "C001" ) { target = 1 }
if ( $2 == "C002" ) { target = 2 }
if ( $2 == "C003" ) { target = 3 }
if ( $2 == "C004" ) { target = 4 }
if ( $2 == "C005" ) { target = 5 }
if ( $2 == "C006" ) { target = 6 }
if ( $2 == "C007" ) { target = 7 }
if ( $2 == "C100" ) { target = 8 }
if ( $2 == "C101" ) { target = 9 }
if ( $2 == "C102" ) { target = 10 }
if ( $2 == "C103" ) { target = 11 }
if ( $2 == "C104" ) { target = 12 }
if ( $2 == "C105" ) { target = 13 }
if ( $2 == "C106" ) { target = 14 }
if ( $2 == "C107" ) { target = 15 }
result = code * 4096 + target * 256
}
if ( $1 == "DEC" ) {
code = 12
if ( $2 == "C000" ) { target = 0 }
if ( $2 == "C001" ) { target = 1 }
if ( $2 == "C002" ) { target = 2 }
if ( $2 == "C003" ) { target = 3 }
if ( $2 == "C004" ) { target = 4 }
if ( $2 == "C005" ) { target = 5 }
if ( $2 == "C006" ) { target = 6 }
if ( $2 == "C007" ) { target = 7 }
if ( $2 == "C100" ) { target = 8 }
if ( $2 == "C101" ) { target = 9 }
if ( $2 == "C102" ) { target = 10 }
if ( $2 == "C103" ) { target = 11 }
if ( $2 == "C104" ) { target = 12 }
if ( $2 == "C105" ) { target = 13 }
if ( $2 == "C106" ) { target = 14 }
if ( $2 == "C107" ) { target = 15 }
result = code * 4096 + target * 256
}
if ( $1 == "SETT" ) {
code = 13
if ( $2 == "T000" ) { target = 0 }
if ( $2 == "T001" ) { target = 1 }
if ( $2 == "T002" ) { target = 2 }
if ( $2 == "T003" ) { target = 3 }
if ( $2 == "T004" ) { target = 4 }
if ( $2 == "T005" ) { target = 5 }
if ( $2 == "T006" ) { target = 6 }
if ( $2 == "T007" ) { target = 7 }
if ( $2 == "T100" ) { target = 8 }
if ( $2 == "T101" ) { target = 9 }
if ( $2 == "T102" ) { target = 10 }
if ( $2 == "T103" ) { target = 11 }
if ( $2 == "T104" ) { target = 12 }
if ( $2 == "T105" ) { target = 13 }
if ( $2 == "T106" ) { target = 14 }
if ( $2 == "T107" ) { target = 15 }
result = code * 4096 + target * 256 + ($3 / 16) * 16 + ($3 % 16)
}
if ( $1 == "COND" ) {
code = 14
if ( $2 == "T000" ) { target = 0 }
if ( $2 == "T001" ) { target = 1 }
if ( $2 == "T002" ) { target = 2 }
if ( $2 == "T003" ) { target = 3 }
if ( $2 == "T004" ) { target = 4 }
if ( $2 == "T005" ) { target = 5 }
if ( $2 == "T006" ) { target = 6 }
if ( $2 == "T007" ) { target = 7 }
if ( $2 == "T100" ) { target = 8 }
if ( $2 == "T101" ) { target = 9 }
if ( $2 == "T102" ) { target = 10 }
if ( $2 == "T103" ) { target = 11 }
if ( $2 == "T104" ) { target = 12 }
if ( $2 == "T105" ) { target = 13 }
if ( $2 == "T106" ) { target = 14 }
if ( $2 == "T107" ) { target = 15 }
result = code * 4096 + target * 256 + ($3 / 16) * 16 + ($3 % 16)
}
if ( $1 == "JUMP" || $1 == "JMPZ" ) {
code = 15
residue = ($3 / 256) % 4
if ( $1 == "JMPZ" ) {
residue = residue + 4
}
result = code * 4096 + residue * 256 + ($3 / 16) * 16 + ($3 % 16)
}
printf("%04x\n",result)
}
ファイル名をaconv.awkとします。
使い方は、DOS、Windowsでは次のように指定します。
c:>jgawk -f aconv.awk tst0.txt > tstr0.txt{enter}
jgawkは、GNU版の日本語AWKを意味します。
Vector、窓の杜等でフリーウエアとして入手できます。
UNIXでは、次のように指定します。
home$~ awk -f aconv.awk tst0.txt > tstr0.txt{enter}
I/Oリダイレクトで、変換結果をファイルに保存して
おけば、再利用可能になります。
動作テスト
aconv.awkの動作が正しいか確認しておきます。
ラダー図の行ごとの命令
tst0.txtに1行ごとに、命令を入力します。
LD 0
ANDN 1
LDN 2
OR 3
ORB
LD 4
AND 5
OUT 9
SETC C000 10
SETC C001 11
SETC C002 12
SETC C003 13
SETC C004 14
SETC C005 15
SETC C006 16
SETC C007 17
SETC C100 100
SETC C101 101
SETC C102 102
SETC C103 103
SETC C104 104
SETC C105 105
SETC C106 106
SETC C107 107
INC C000
DEC C000
INC C001
DEC C001
INC C002
DEC C002
INC C003
DEC C003
INC C004
DEC C004
INC C005
DEC C005
INC C006
DEC C006
INC C007
DEC C007
INC C100
DEC C100
INC C101
DEC C101
INC C102
DEC C102
INC C103
DEC C103
INC C104
DEC C104
INC C105
DEC C105
INC C106
DEC C106
INC C107
DEC C107
SETT T000 10
SETT T001 11
SETT T002 12
SETT T003 13
SETT T004 14
SETT T005 15
SETT T006 16
SETT T007 17
SETT T100 100
SETT T101 101
SETT T102 102
SETT T103 103
SETT T104 104
SETT T105 105
SETT T106 106
SETT T107 107
COND T000
COND T001
COND T002
COND T003
COND T004
COND T005
COND T006
COND T007
COND T100
COND T101
COND T102
COND T103
COND T104
COND T105
COND T106
COND T107
JUMP NC 100
JUMP Z 900
JUMP NC 1000
END
期待値作成
命令だけでは、変換が正しいのか判断できないので
期待値を2進と16進で付け加えておきます。
LD 0 0010_0000_0000_0000 2000
ANDN 1 0101_0000_0000_0000 5000
LDN 2 0011_0000_0000_0000 3000
OR 3 0110_0000_0000_0000 6000
ORB 1001_0000_0000_0000 9000
LD 4 0010_0000_0000_0000 2000
AND 5 0100_0000_0000_0000 4000
OUT 9 0001_0000_0000_0000 1000
SETC C000 10 1010_0000_0000_1010 a00a
SETC C001 11 1010_0001_0000_1011 a10b
SETC C002 12 1010_0010_0000_1100 a20c
SETC C003 13 1010_0011_0000_1101 a30d
SETC C004 14 1010_0100_0000_1110 a40e
SETC C005 15 1010_0101_0000_1111 a50f
SETC C006 16 1010_0110_0001_0000 a610
SETC C007 17 1010_0111_0001_0001 a711
SETC C100 10 1010_1000_0000_1010 a80a
SETC C101 11 1010_1001_0000_1011 a90b
SETC C102 12 1010_1010_0000_1100 aa0c
SETC C103 13 1010_1011_0000_1101 ab0d
SETC C104 14 1010_1100_0000_1110 ac0e
SETC C105 15 1010_1101_0000_1111 ad0f
SETC C106 16 1010_1110_0001_0000 ae10
SETC C107 17 1010_1111_0001_0001 af11
INC C000 1011_0000_0000_0000 b000
DEC C000 1100_0000_0000_0000 c000
INC C001 1011_0001_0000_0000 b100
DEC C001 1100_0001_0000_0000 c100
INC C002 1011_0010_0000_0000 b200
DEC C002 1100_0010_0000_0000 c200
INC C003 1011_0011_0000_0000 b300
DEC C003 1100_0011_0000_0000 c300
INC C004 1011_0100_0000_0000 b400
DEC C004 1100_0100_0000_0000 c400
INC C005 1011_0101_0000_0000 b500
DEC C005 1100_0101_0000_0000 c500
INC C006 1011_0110_0000_0000 b600
DEC C006 1100_0110_0000_0000 c600
INC C007 1011_0111_0000_0000 b700
DEC C007 1100_0111_0000_0000 c700
INC C100 1011_1000_0000_0000 b800
DEC C100 1100_1000_0000_0000 c800
INC C101 1011_1001_0000_0000 b900
DEC C101 1100_1001_0000_0000 c900
INC C102 1011_1010_0000_0000 ba00
DEC C102 1100_1010_0000_0000 ca00
INC C103 1011_1011_0000_0000 bb00
DEC C103 1100_1011_0000_0000 cb00
INC C104 1011_1100_0000_0000 bc00
DEC C104 1100_1100_0000_0000 cc00
INC C105 1011_1101_0000_0000 bd00
DEC C105 1100_1101_0000_0000 cd00
INC C106 1011_1110_0000_0000 be00
DEC C106 1100_1110_0000_0000 ce00
INC C107 1011_1111_0000_0000 bf00
DEC C107 1100_1111_0000_0000 cf00
SETT T000 10 1101_0000_0000_1010 d00a
SETT T001 11 1101_0001_0000_1011 d10b
SETT T002 12 1101_0010_0000_1100 d20c
SETT T003 13 1101_0011_0000_1101 d30d
SETT T004 14 1101_0100_0000_1110 d40e
SETT T005 15 1101_0101_0000_1111 d50f
SETT T006 16 1101_0110_0001_0000 d610
SETT T007 17 1101_0111_0001_0001 d711
SETT T100 100 1101_1000_0110_0100 d864
SETT T101 101 1101_1001_0110_0101 d965
SETT T102 102 1101_1010_0110_0110 da66
SETT T103 103 1101_1011_0110_0111 db67
SETT T104 104 1101_1100_0110_1000 dc68
SETT T105 105 1101_1101_0110_1001 dd69
SETT T106 106 1101_1110_0110_1010 de6a
SETT T107 107 1101_1111_0110_1011 df6b
COND T000 200 1110_0000_1100_1000 e0c8
COND T001 201 1110_0001_1100_1001 e1c9
COND T002 202 1110_0010_1100_1010 e2ca
COND T003 203 1110_0011_1100_1011 e3cb
COND T004 204 1110_0100_1100_1100 e4cc
COND T005 205 1110_0101_1100_1101 e5cd
COND T006 206 1110_0110_1100_1110 e6ce
COND T007 207 1110_0111_1100_1111 e7cf
COND T100 200 1110_1000_1100_1000 e8c8
COND T101 201 1110_1001_1100_1001 e9c9
COND T102 202 1110_1010_1100_1010 eaca
COND T103 203 1110_1011_1100_1011 ebcb
COND T104 204 1110_1100_1100_1100 eccc
COND T105 205 1110_1101_1100_1101 edcd
COND T106 206 1110_1110_1100_1110 eece
COND T107 207 1110_1111_1100_1111 efcf
JUMP NC 100 1111_0000_0110_0100 f064
JUMP Z 900 1111_0111_1000_0100 f784
JUMP NZ 1000 1111_1011_1110_1000 fbe8
END 0000_0000_0000_0000 0000
16進数値だけを取出し、期待値だけの
ファイルを作成しておきます。
2000
5000
3000
6000
9000
2000
4000
1000
a00a
a10b
a20c
a30d
a40e
a50f
a610
a711
a80a
a90b
aa0c
ab0d
ac0e
ad0f
ae10
af11
b000
c000
b100
c100
b200
c200
b300
c300
b400
c400
b500
c500
b600
c600
b700
c700
b800
c800
b900
c900
ba00
ca00
bb00
cb00
bc00
cc00
bd00
cd00
be00
ce00
bf00
cf00
d00a
d10b
d20c
d30d
d40e
d50f
d610
d711
d864
d965
da66
db67
dc68
dd69
de6a
df6b
e0c8
e1c9
e2ca
e3cb
e4cc
e5cd
e6ce
e7cf
e8c8
e9c9
eaca
ebcb
eccc
edcd
eece
efcf
f064
f784
fbe8
0000
変換ファイル作成
コンバータで、命令を変換したファイルを作成します。
2000
5000
3000
6000
9000
2000
4000
1000
a00a
a10b
a20c
a30d
a40e
a50f
a610
a711
a80a
a90b
aa0c
ab0d
ac0e
ad0f
ae10
af11
b000
c000
b100
c100
b200
c200
b300
c300
b400
c400
b500
c500
b600
c600
b700
c700
b800
c800
b900
c900
ba00
ca00
bb00
cb00
bc00
cc00
bd00
cd00
be00
ce00
bf00
cf00
d00a
d10b
d20c
d30d
d40e
d50f
d610
d711
d864
d965
da66
db67
dc68
dd69
de6a
df6b
e0c8
e1c9
e2ca
e3cb
e4cc
e5cd
e6ce
e7cf
e8c8
e9c9
eaca
ebcb
eccc
edcd
eece
efcf
f064
f784
fbe8
0000
比較
OSのもつビルトインコマンドで、2ファイルを比較します。
WindowsのDOS窓であれば、「fc」を使います。
異なるところがなければ、コンバータは完成です。
Tcl/Tkスクリプト
AWKの他に、GUIを使いたいので、Tcl/Tkでスクリプトを作成しました。
AWK同様、テキストファイルの内容を16進数4けたのコードに変換します。
ファイル名は、aconv.tclとしました。
ソースコードは、以下。
#!/usr/local/bin/wish
wm title . "Mnemonic converter"
set fd_in ""
set fd_out ""
set fname "untitled"
set fnamex "untitled"
#######################################
# make table
#######################################
set larray(0) "END"
set larray(1) "OUT"
set larray(2) "LD"
set larray(3) "LDN"
set larray(4) "AND"
set larray(5) "ANDN"
set larray(6) "OR"
set larray(7) "ORN"
set larray(8) "ANDB"
set larray(9) "ORB"
set larray(10) "SETC"
set larray(11) "INC"
set larray(12) "DEC"
set larray(13) "SETT"
set larray(14) "COND"
set larray(15) "JUMP"
set larray(16) "JMPZ"
set nmonic(END) 0
set nmonic(OUT) 1
set nmonic(LD) 2
set nmonic(LDN) 3
set nmonic(AND) 4
set nmonic(ANDN) 5
set nmonic(OR) 6
set nmonic(ORN) 7
set nmonic(ANDB) 8
set nmonic(ORB) 9
set nmonic(SETC) 10
set nmonic(INC) 11
set nmonic(DEC) 12
set nmonic(SETT) 13
set nmonic(COND) 14
set nmonic(JUMP) 15
set nmonic(JMPZ) 15
#######################
# add menu on TopLevel
#######################
. configure -menu .mnuTop
menu .mnuTop
#######################
# menu Top level
#######################
.mnuTop add cascade -label File -underline 0 -menu .mnuTop.file
menu .mnuTop.file -tearoff no
#######################
# add sub menu "Load"
#######################
.mnuTop.file add command -label "MakeCode" -command {MakeCode}
#######################
# add sub menu "Quit"
#######################
.mnuTop.file add command -label "Quit" -command {exit}
#######################
# label objects
#######################
label .lblFname -textvariable fname
label .lblFnamex -textvariable fnamex
#######################
# show GUI
#######################
pack .lblFname
pack .lblFnamex
#######################
# procedure
#######################
proc MakeCode {} {
global nmonic fname fnamex fd_in fd_out
# get File Name
set theFileName [tk_getOpenFile -filetypes {{"text file" {.txt}}}]
# generate file name
set fname [split $theFileName '/']
set fname [lindex $fname end]
#tk_messageBox -type ok -message $fname
set fnamex "x$fname"
# open
set fd_in [open $theFileName "r"]
set fd_out [open $fnamex "w"]
# read context
while { [gets $fd_in sbuf] >= 0 } {
# get length
set len [llength $sbuf]
# convert
set dath 0
set datl 0
set opcode [lindex $sbuf 0]
if { $len == 2 } {
set operand [lindex $sbuf 1]
set datu [format "%x" [expr [expr $operand / 256] / 4]]
set dath [format "%x" [expr $operand / 16]]
set datl [format "%x" [expr $operand % 16]]
set tmp $datu
} else {
set operand [lindex $sbuf 2]
set datu [format "%x" [expr [expr $operand / 256] / 4]+4]
set dath [format "%x" [expr $operand / 16]]
set datl [format "%x" [expr $operand % 16]]
set tmp $datu
}
# show
puts $fd_out "$nmonic($opcode)$tmp$dath$datl"
puts "$nmonic($opcode)$tmp$dath$datl"
}
# close
close $fd_in
close $fd_out
}
簡易ニモニック入力スクリプト
ニモニック入力を短時間で実現できるように
Tcl/Tkでスクリプトを作成しました。
オペコードとオペランドのスピンボックスの
右にある▲か▼をクリックし、ニモニックを
選びます。
希望のニモニックが表示されたなら、Generateボタン
で確定します。よければ、Appendボタンをクリック
して入力します。
間違いや修正したいときには、再度ニモニックを表示
して、同じ操作をします。
Appendボタンをクリックするたびに
LineNumberが+1されていきます。
すべてのニモニックを入力したならば
File→SaveCodeとクリックします。
ファイル名指定ページが開きます。
ファイル名を入力後、「保存(S)」をクリック
して、テキストファイルとして保存します。
保存が終わると、ファイル名を表示します。
終了するには、右上のxをクリックするか
File→Quitをクリックします。
Tcl/Tkのソースコードは、以下です。
#!/usr/local/bin/wish
wm title . "Mnemonic converter"
set fd_out ""
set fname "untitled"
set Linenumber "1"
set codex ""
#######################################
# make table
#######################################
set larray(0) "END"
set larray(1) "OUT"
set larray(2) "LD"
set larray(3) "LDN"
set larray(4) "AND"
set larray(5) "ANDN"
set larray(6) "OR"
set larray(7) "ORN"
set larray(8) "ANDB"
set larray(9) "ORB"
set larray(10) "SETC"
set larray(11) "INC"
set larray(12) "DEC"
set larray(13) "SETT"
set larray(14) "COND"
set larray(15) "JUMP"
set larray(16) "X000"
set larray(17) "X001"
set larray(18) "X002"
set larray(19) "X003"
set larray(20) "X004"
set larray(21) "X005"
set larray(22) "X006"
set larray(23) "X007"
set larray(24) "X100"
set larray(25) "X101"
set larray(26) "X102"
set larray(27) "X103"
set larray(28) "X104"
set larray(29) "X105"
set larray(30) "X106"
set larray(31) "X107"
set larray(32) "Y000"
set larray(33) "Y001"
set larray(34) "Y002"
set larray(35) "Y003"
set larray(36) "Y004"
set larray(37) "Y005"
set larray(38) "Y006"
set larray(39) "Y007"
set larray(40) "Y100"
set larray(41) "Y101"
set larray(42) "Y102"
set larray(43) "Y103"
set larray(44) "Y104"
set larray(45) "Y105"
set larray(46) "Y106"
set larray(47) "Y107"
set larray(48) "M000"
set larray(49) "M001"
set larray(50) "M002"
set larray(51) "M003"
set larray(52) "M004"
set larray(53) "M005"
set larray(54) "M006"
set larray(55) "M007"
set larray(56) "M100"
set larray(57) "M101"
set larray(58) "M102"
set larray(59) "M103"
set larray(60) "M104"
set larray(61) "M105"
set larray(62) "M106"
set larray(63) "M107"
set larray(64) "C000"
set larray(65) "C001"
set larray(66) "C002"
set larray(67) "C003"
set larray(68) "C004"
set larray(69) "C005"
set larray(70) "C006"
set larray(71) "C007"
set larray(72) "C100"
set larray(73) "C101"
set larray(74) "C102"
set larray(75) "C103"
set larray(76) "C104"
set larray(77) "C105"
set larray(78) "C106"
set larray(79) "C107"
set larray(80) "T000"
set larray(81) "T001"
set larray(82) "T002"
set larray(83) "T003"
set larray(84) "T004"
set larray(85) "T005"
set larray(86) "T006"
set larray(87) "T007"
set larray(88) "T100"
set larray(89) "T101"
set larray(90) "T102"
set larray(91) "T103"
set larray(92) "T104"
set larray(93) "T105"
set larray(94) "T106"
set larray(95) "T107"
set larray(96) "JMPZ"
# make spinbox items
set larrayoperate ""
for {set i 2} {$i < 16} {incr i} {
set larrayoperate "$larrayoperate $larray($i)"
}
set larrayoperate "$larrayoperate $larray(1) $larray(0)"
set larrayoperand ""
for {set i 16} {$i < 97} {incr i} {
set larrayoperand "$larrayoperand $larray($i)"
}
#######################
# add menu on TopLevel
#######################
. configure -menu .mnuTop
menu .mnuTop
#######################
# menu Top level
#######################
.mnuTop add cascade -label File -underline 0 -menu .mnuTop.file
menu .mnuTop.file -tearoff no
#######################
# add sub menu "Load"
#######################
.mnuTop.file add command -label "SaveCode" -command {SaveCode}
#######################
# add sub menu "Quit"
#######################
.mnuTop.file add command -label "Quit" -command {exit}
#######################
# label objects
#######################
label .lblFname -textvariable fname
label .lblLinenumber -text "Line Number"
label .lblLinenumberX -textvariable Linenumber
label .lblOperate -text "Operate"
label .lblOperand -text "Operand"
label .lblCodex -textvariable codex -width 14
#######################
# listbox objects
#######################
listbox .lstCodex -width 16
#######################
# spin box objects
#######################
spinbox .sbxOperate -value $larrayoperate -state readonly -width 6
spinbox .sbxOperand -value $larrayoperand -state readonly -width 6
#######################
# buttun
#######################
button .btnGenerate -text "Generate" -command {GenerateCode}
button .btnAppend -text "Append" -command {AppendCode}
button .btnClear -text "Clear" -command {ClearCode}
#######################
# procedure
#######################
proc SaveCode {} {
global nmonic fname fd_out
# get File Name
set theFileName [tk_getSaveFile -filetypes {{"text file" {.txt}}}]
# generate file name
set fname [split $theFileName '/']
set fname [lindex $fname end]
set fnamex "$fname.txt"
set fname $fnamex
# open
set fd_out [open $fnamex "w"]
# write context
set last [.lstCodex index end]
for {set i 0} {$i < $last} {incr i} {
puts $fd_out [.lstCodex get $i]
}
# close
close $fd_out
}
proc GenerateCode {} {
global codex
# clear
set tmp ""
# get operate
set tmp [.sbxOperate get]
# get operand
if { $tmp == "END" } {
set codex $tmp
} else {
if { $tmp == "ANDB" } {
set codex $tmp
} else {
if { $tmp == "ORB" } {
set codex $tmp
} else {
set tmp "$tmp [.sbxOperand get]"
set codex $tmp
}
}
}
}
proc AppendCode {} {
global codex Linenumber
# clear
set tmp ""
# get line number
set tmp "$tmp [format "%04d" $Linenumber]"
# get operate
set tmp "$tmp $codex"
# store
.lstCodex insert end $tmp
#
set Linenumber [incr Linenumber]
}
proc ClearCode {} {
global codex Linenumber
set codex ""
.lstCodex delete 0 end
set Linenumber "1"
}
#######################
# place objects
#######################
grid .lblFname -column 0 -row 0
grid .lblLinenumber -column 0 -row 2
grid .lblOperate -column 1 -row 2
grid .lblOperand -column 2 -row 2
grid .lblLinenumberX -column 0 -row 3
grid .sbxOperate -column 1 -row 3
grid .sbxOperand -column 2 -row 3
grid .lblCodex -column 1 -row 4
grid .btnGenerate -column 2 -row 4
grid .lstCodex -column 1 -row 5
grid .btnAppend -column 2 -row 5
grid .btnClear -column 2 -row 6
目次
前
次