#PROGRAMA QUE REPRESENTA UN LENGUAJE ENSAMBLADOR # #ELABORADO POR RAFAEL RODRIGUEZ OCHOA # # 12 DE JUNIO DE 1997 catch {destroy .a} catch {destroy .b} frame .a set renglon 0 set fin_programa 0 set n 0 set bandera 1 global data a b fileid fileName frame .a.b #frame del nombre del archivo frame .a.b.c #frame del nombre del archivo y del text widget label .a.b.c.label -text "Nombre del archivo:" -relief sunken -bg PapayaWhip\ -width 17 -anchor w entry .a.b.c.entry -width 20 -textvariable fileName button .a.b.c.button -text "Cargar" \ -command { textLoadFile .a.b.c.text $fileName if { [array exists memoria] } { unset memoria } if { [file readable $fileName] } { set fileid [open $fileName "r"] } bell set a 0 set b 0 set boton 0 set i 1 set cont 0 while { $i == 1 } { gets $fileid data set memoria($cont) $data if {$data == ""} { set i 0 } incr cont } } -fg yellow -bg firebrick pack .a.b.c.label .a.b.c.entry -side left pack .a.b.c.button -side left -pady 5 -padx 10 bind .a.b.c.entry <Return> " textLoadFile .a.b.text \$fileName focus .a.string.entry " focus .a.b.c.entry -bg Blue3 -fg green4 -relief raised text .a.b.c.text -yscrollcommand ".a.b.c.scroll set" \ -setgrid true -height 5 -width 20 scrollbar .a.b.c.scroll -command ".a.b.c.text yview" pack .a.b.label -side top pack .a.b.c.scroll -side right -fill y pack .a.b.c.text -expand yes -fill both pack .a.b -side top pack .a.b.c -side top frame .a.d foreach i { f2 f3 f4 f5 } { frame .a.d.$i -bd 2 entry .a.d.$i.entry -relief sunken -width 30 label .a.d.$i.label pack .a.d.$i.entry -side right pack .a.d.$i.label -side left } .a.d.f2.label config -text Entrada: -bg royalblue -fg black -relief ridge .a.d.f5.label config -text Pila: -fg black -bg yellow -relief ridge .a.d.f3.label config -text Salida: -bg red -fg white -relief ridge pack .a.d.f3 .a.d.f4 .a.d.f5 .a.d.f2 -side bottom -fill x label .a.d.desp -text "Velocidad de despliegue del programa:" \ -width 33 -anchor w -relief raised -bg SteelBlue pack .a.d.desp -side left entry .nada -width 0 -textvariable continua pack .nada -command { avanza_auto } proc avanza_auto { } { global fin_programa continua if { $fin_programa == 0 } then { avanza_instruccion } after 100 { set continua "" } tkwait variable continua unset continua after 1000 avanza_auto } set boton 0 button .a.d.mas -text "Manual" -fg blue -bg green \ -command { avanza_instruccion } proc avanza_instruccion { } { global data boton memoria a b set data $memoria($boton) .a.d.f2.entry delete 0 end .a.d.f3.entry delete 0 end .a.d.f2.entry insert 0 [sin_direccion $data] if { $a > 0 } { .a.d.f5.entry delete 0 end .a.d.f5.entry insert 0 $a } if { $a == 0 } { .a.d.f5.entry delete 0 end } if { $b > 0 } { .a.d.f4.entry delete 0 end .a.d.f4.entry insert 0 $b } if { $b == 0 } { .a.d.f4.entry delete 0 end } instruccion $data incr boton } pack .a.d.mas .a.d.auto -side left pack .a.d -side left pack .a -side left #FIN DEL PROGRAMA PRINCIPAL #====================================================================== proc textLoadFile {w file} { set f [open $file] $w delete 1.0 end while {![eof $f]} { $w insert end [read $f 10000] } close $f } proc instruccion {renglon} { global accion donde cuanto a b boton bandera fileid set comando [split $renglon] set direccion [lindex $comando 0] set accion [lindex $comando 1] set donde [lindex $comando 2] set cuanto [lindex $comando 3] switch $accion { mover {set $donde $cuanto return } sumar { set variable [ letra $donde ] set $variable [expr $a+$b] return } multiplicar { set variable [ letra $donde ] set $variable [expr $a*$b] return } restar { set variable [ letra $donde ] if { $variable == "a" } { set $variable [expr $a-$b] } if { $variable == "b" } { set $variable [expr $b-$a] } return } dividir { set variable [ letra $donde ] if { $variable == "a" } { set $variable [expr $a/$b] } if { $variable == "b" } { set $variable [expr $b/$a] } return } decrementar { set variable [letra $donde] set $variable [expr $[subst $variable]-1] return } comparar { if { $a == $cuanto } { set bandera 0 } if { $b == $cuanto } { set bandera 0 } return } saltar { if { $bandera == 1 } { set boton [expr $donde - 1] return $boton } } imprimir { if { $donde == "a" } { .a.d.f3.entry insert 0 $a return } if { $donde == "b" } { .a.d.f3.entry insert 0 $b return } } alto { global fin_programa set fin_programa 1 .a.d.f3.entry insert 0 "Programa terminado" bell bell return } } } #envia la instruccion quitando la direccion proc sin_direccion { con_direccion } { set no_dir [split $con_direccion] set no_direccion [lindex $no_dir 1] append no_direccion " [lindex $no_dir 2]" " [lindex $no_dir 3]" return $no_direccion } #Verifica que variable es. proc letra { donde } { if { $donde == "a" } { return a } if { $donde == "b" } { return b } }