# Lenguaje de 8 bits
#===================================inicio
#===================================variables
set velocidad 1000
set instr 1
set pila 1
set x 0
set y 0
set z 0
set nz 1
#===================================global
# .f genera el fondo
# .f.p muestra la pila
frame .f -background green
frame .f.a -background green
frame .f.p -background green
frame .f.d -background green
label .f.cabeza -text "J. Rafel R. Ochoa" -width 14 -anchor w
pack .f.cabeza -side bottom
#===================================Nombre del archivo
frame .f.a.arch \
-background green
label .f.a.arch.nombre \
-text "Nombre de archivo: " \
-width 18 -height 1 \
-bg blue
entry .f.a.arch.arch -width 20 -textvariable archivo
pack .f.a.arch.nombre .f.a.arch.arch -side left
#===================================Video
frame .f.a.video \
-background green
label .f.a.video.cabeza \
-text "Rx \n\n Ry \n\n Rz \n\n\n NZ \n\n PC" \
-width 5 -height 10 \
-bg blue
button .f.a.video.fast \
-width 2 -height 1 \
-text "+" \
-borderwidth 2 \
-relief sunken \
-bg green \
-command { veloc mas }
button .f.a.video.slow \
-width 2 -height 1 \
-text "-" \
-borderwidth 2 \
-relief sunken \
-bg green \
-command { veloc menos }
pack .f.a.video.fast .f.a.video.slow -sid left
pack .f.a.video.cabeza -side left
button .f.a.video.x \
-textvariable x \
-width 10 -height 1 \
-bg green
button .f.a.video.y \
-textvariable y \
-width 10 -height 1 \
-bg green
button .f.a.video.z \
-width 10 -height 1 \
-textvariable z \
-bg green
button .f.a.video.nz \
-width 10 -height 1 \
-textvariable nz \
-bg green
button .f.a.video.pc \
-width 10 -height 1 \
-textvariable instr \
-borderwidth 2 \
-relief sunken \
-bg green \
-command { pc }
pack .f.a.video.x .f.a.video.y .f.a.video.z .f.a.video.nz .f.a.video.pc -side top
#===================================Control
frame .f.a.control
button .f.a.control.sig \
-width 7 -height 1 \
-text "Ejecuta" \
-borderwidth 2 \
-relief sunken \
-bg red \
-command { sig }
button .f.a.control.auto \
-width 7 -height 1 \
-text "Automatico" \
-borderwidth 2 \
-relief sunken \
-bg red \
-command { automatico }
button .f.a.control.fin \
-width 7 -height 1 \
-text "Salir" \
-borderwidth 2 \
-relief sunken \
-bg red \
-command { destroy .f }
button .f.a.control.cargar \
-width 30 -height 1 \
-text "CARGAR ARCHIVO" \
-bg red \
-borderwidth 0 \
-command { arch }
pack .f.a.control.auto .f.a.control.sig .f.a.control.cargar .f.a.control.fin -side left
#===================================pila
frame .f.p.pila1
frame .f.p.pila2
label .f.p.cabeza -text "PILA" -width 5 -anchor w
pack .f.p.cabeza -side top
for { set k 1 } { $k < 11 } { incr k } {
button .f.p.pila1.p$k \
-width 5 -height 1 \
-textvariable p$k \
-bg green
pack .f.p.pila1.p$k -side top
}
for { set k 11 } { $k < 21 } { incr k } {
button .f.p.pila2.p$k \
-width 5 -height 1 \
-textvariable p$k \
-bg green
pack .f.p.pila2.p$k -side top
}
#===================================datos
frame .f.d.datos1
frame .f.d.datos2
label .f.d.cabeza -text "DATOS" \
-width 5 -anchor w \
-bg blue
pack .f.d.cabeza -side top
for { set k 1 } { $k < 11 } { incr k } {
button .f.d.datos1.d$k \
-width 5 -height 1 \
-textvariable d$k \
-bg green
pack .f.d.datos1.d$k -side top
}
for { set k 11 } { $k < 21 } { incr k } {
button .f.d.datos2.d$k \
-width 5 -height 1 \
-textvariable d$k \
-bg green
pack .f.d.datos2.d$k -side top
}
#===================================union
pack .f.a.arch .f.a.video .f.a.control -side top
pack .f.p.pila2 .f.p.pila1 -side right
pack .f.d.datos1 .f.d.datos2 -side left
pack .f.d .f.a .f.p -side left
pack .f -side left
#===================================procs
proc arch {} {
global d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11
global d12 d13 d14 d15 d16 d17 d18 d19 d20
global p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11
global p12 p13 p14 p15 p16 p17 p18 p19 p20
global x y z nz pila instr archivo
for { set k 1 } { $k < 21 } { incr k } {
set d$k " "
}
for { set k 1 } { $k < 21 } { incr k } {
set p$k " "
}
set nombre [open $archivo "r"]
set k 1
while {![eof $nombre]} {
gets $nombre d$k
incr k
}
close $nombre
set instr 1
set pila 1
set nz 1
set x 0
set y 0
set z 0
}
proc sig {} {
global x y z nz instr pila
global d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11
global d12 d13 d14 d15 d16 d17 d18 d19 d20
global p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11
global p12 p13 p14 p15 p16 p17 p18 p19 p20
switch $instr {
1 { set linea $d1 } 2 { set linea $d2 }
3 { set linea $d3 } 4 { set linea $d4 }
5 { set linea $d5 } 6 { set linea $d6 }
7 { set linea $d7 } 8 { set linea $d8 }
9 { set linea $d9 } 10 { set linea $d10 }
11 { set linea $d11 } 12 { set linea $d12 }
13 { set linea $d13 } 14 { set linea $d14 }
15 { set linea $d15 } 16 { set linea $d16 }
17 { set linea $d17 } 18 { set linea $d18 }
19 { set linea $d19 } 20 { set linea $d20 }
}
set comando [lindex $linea 0]
set registro [lindex $linea 1]
set valor [lindex $linea 2]
if { $registro == "x" } { set a $x }
if { $registro == "y" } { set a $y }
if { $registro == "z" } { set a $z }
if { $comando == "store" } {
set $registro $valor
incr instr
}
if { $comando == "mul" } {
if { $valor == "x" } { set b $x }
if { $valor == "y" } { set b $y }
if { $valor == "z" } { set b $z }
set $registro [expr $a*$b]
incr instr
}
if { $comando == "dec" } {
incr $registro -1
incr instr
}
if { $comando == "cmp" } {
if { $a == $valor } { set nz 0 }
if { $a != $valor } { set nz 1 }
incr instr
}
if { $comando == "jp" } {
if { $nz != 0 } { set instr $valor }
if { $nz == 0 } { incr instr }
}
if { $comando == "halt" } { }
if { $comando == "push" } {
set p$pila $a
incr pila
incr instr
}
if { $comando == "jsbr" } {
set p$pila [expr $instr+1]
incr pila
set instr $registro
}
if { $comando == "rsbr" } {
set a [expr $pila-1]
switch $a {
1 { set instr $p1 } 2 { set instr $p2 }
3 { set instr $p3 } 4 { set instr $p4 }
5 { set instr $p5 } 6 { set instr $p6 }
7 { set instr $p7 } 8 { set instr $p8 }
9 { set instr $p9 } 10 { set instr $p10 }
11 { set instr $p11 } 12 { set instr $p12 }
13 { set instr $p13 } 14 { set instr $p14 }
15 { set instr $p15 } 16 { set instr $p16 }
17 { set instr $p17 } 18 { set instr $p18 }
19 { set instr $p19 } 20 { set instr $p20 }
}
set p$a " "
incr pila -1
}
if { $comando == "pop" } {
set a [expr $pila-1]
switch $a {
1 { set $registro $p1 } 2 { set $registro $p2 }
3 { set $registro $p3 } 4 { set $registro $p4 }
5 { set $registro $p5 } 6 { set $registro $p6 }
7 { set $registro $p7 } 8 { set $registro $p8 }
9 { set $registro $p9 } 10 { set $registro $p10 }
11 { set instr $p11 } 12 { set instr $p12 }
13 { set instr $p13 } 14 { set instr $p14 }
15 { set instr $p15 } 16 { set instr $p16 }
17 { set instr $p17 } 18 { set instr $p18 }
19 { set instr $p19 } 20 { set instr $p20 }
}
set p$a " "
incr pila -1
incr instr
}
}
proc pc {} {
global instr
incr instr
if { $instr > 20 } { set instr 1 }
}
proc automatico {} {
global instr
while { $instr < 21 } {
sig
retardo
}
}
proc retardo {} {
global velocidad
set limite [expr $velocidad + 1]
while { $velocidad < $limite } {
incr velocidad
}
}
proc veloc { velo } {
global velocidad
switch $velo {
"mas" { if { $velocidad < 3000 } {
set velocidad [expr $velocidad + 100]
}
}
"menos" { if { $velocidad != 0 } {
set velocidad [expr $velocidad - 100]
}
}
}
}