目次

コンバータ作成

 ラダー図の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
目次

inserted by FC2 system