Aquí definimos
todas las variables globales, y la pantalla principal. La rutina principal es
MENU.
Esta es la entrada desde el sistema
operativo. Esta es la que dibuja la pantalla principal con los menús arriba y
la que espera la pulsación del ratón dentro de estos para comenzar a abrir las
diferentes ventanas.
Por lo tanto,
analizará la pulsación del ratón sobre las diferentes áreas de pantalla e
irá llamando a la gestión correspondiente.
Una vez elegida una
opción esta es marcada mediante una bandera y a partir de ahí se llama a
una subrutina de gestión de esta nueva ventana.
control_dump- Gestiona la
ventana de DUMP, y llama al refesco DUMP con la posición inicial de memoria
correspondiente. Por lo tanto esta función se encarga de gestionar la barra de
desplazamiento derecha y gestionar las pulsaciones dentro de la ventana, de
forma que permitirá la modificación de un dato
control_des - Igual que la anterior, permitirá
gestionar la barra de desplazamiento derecha del listado de programa, y
gestionar el puntero de inicio de desensamblado del listado.
Gestion_menu
- Esta rutina gestiona las
pulsaciones sobe el área de menú para realizar las llamadas a las ventanas
emergentes correspondientes que desplieguen los menús emergentes y permitan la
realización de las acciones asociadas. Es programa genera menús desplegables al
estilo windows. Para gestionar todas las ventanas de forma simultánea, lo que
se hace es montar banderas asociadas a cada menú o ventana activada,
Actualiza_accion- Función auxiliar que actualiza
la acción de cada pulsación. Esta función será la encargada de gestionar las
ejecuciones y presentaciones de todos los menús que ayan sido activados por
la función gestion_menu.
Gestion_ventanas -Al igual que el caso anterior de los
menús esta función se encarga de gestionar las pulsaciones del ratón dentro de
cada ventana y realizar las oportunas acciones. Cuando una ventana haya sido
activada por la gesitón_menu, la bandera que se haya activado permitirá que
dentro de esta función se realice un tes de posición del ratón que irá llamando
al refresco de la pantalla correspondiente y permitirá realizar la acción
asociada a las barras de desplazamiento de esa ventana.
SCVM.ASM
; Copyright (C) 2013 José Ángel Moneo Fernández ; This program is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; You should have received a copy of the GNU General Public License ; along with this program. If not, see <http://www.gnu.org/licenses/
include main.mac
include stdio.mac
include mouse.mac
include window.mac
include 48iocent.mac
include string.mac
INCLUDE 8051.MAC
;ventanas
Fichero equ 1
Monitores equ 2
EJecucion equ 4
PRuptura equ 8
Salir equ 16
;CONTROL
PASO EQU 1
MANUAL EQU 2
TRACE EQU 4
EXT EQU 16
CONTINUO EQU 8
ANIMATE EQU 32
.model compact,pascal
.stack 512
.data
public retardo
public File
public dir_base
public des_base
public vez
public vrfs
public vez_sec
public velocida
public freg
public vez_reg
public m_ventana
public dir_fin
public prn_ini
public prn_fin
public nombrelst
extrn mostrada:word
extrn control:byte
extrn Brk_gotol:byte
extrn Brk_goto:word
extrn Dir_cur:word
retardo dw 1000
mens2 db "Memoria",0
mens3 db "Buses",0
mens4 db "Secuencia",0
mens5 db "Abrir",0
mens6 db "Salvar",0
mens7 db "Renombrar",0
mens8 db "Listado",0
mM1 db "Paso",0
mM2 db "Animado ",0
mM3 db "Continuo ",0
mM4 db "Velocidad",0
mM5 db "Reset",0
mM6 db "Nuevo IP",0
mM7 db "Registros",0
mM8 db "Hasta..",0
mM9 db "Externo",0
mip db "IP",0
ejecu db "Ejecucion",0
mTra1 db "+ BRK",0
mTra2 db "- BRK",0
mTra3 db "Ver BRK",0
nada db 0
ped_fichero db "¿Nombre del fichero?",0
ped_n_nombre db "¿Nuevo nombre del fichero",0
ped_dir_ini db "¿Direccion inicial?",0
ped_dir_fin db "¿Direccion final?",0
veloci db "¿Velocidad?",0
Pantalla label byte
DB '╔══════════════════════Control Microprocesador═════════════════════════════════╗'
DB '║ Fichero Monitores Ejecucion Trace Salir ║'
DB '║ ║'
DB '║ ║'
DB '║ ║'
DB '║ ║'
DB '║ ███████ ██████ █ █ ██ ██ ║'
DB '║ █ █ █ █ █ █ █ █ ║'
DB '║ ███████ █ █ █ █ █ █ ║'
DB '║ █ █ █ █ █ █ ║'
DB '║ █ █ █ █ █ █ ║'
DB '║ ███████ ██████ ██ █ █ ║'
DB '║ ║'
DB '║ ║'
DB '║ Sistema de Control y Verificacion de Microprocesador ║'
DB '║ Familia 8051 ║'
DB '║ Por : ║'
DB '║ ║'
DB '║ Jose Angel Moneo Fernandez ║'
DB '║ ║'
DB '║ ║'
DB '║ ║'
DB '║ ║'
DB '╚══════════════════════════════════════════════════════════════════════════════╝'
DB 0
ficheros db "*.bin",0
listamenu db "",0
ped_file db 20,0
nombre db 20 dup (0)
file db 25 dup (0)
extension db ".bin",0
nombrelst db 25 dup (0)
extlst db ".lst",0
raton dw 0
Ventanas dw 0,0
fdump db 0
fsec db 0
feje db 0
freg db 0
prnBRK db 0
dir_base dw 0,0
des_base dw 0,0
mem_vent db 11*11*2 dup (0)
vent_en_memo dw 0
m_ventana db 3*30*2 dup (0)
vez db 0
vrfs db 0
vez_sec db 0
vez_reg db 0
toca db 0
fs db 0
fin db 0
ciz db 0
cde db 0
borraa db " ",0
mbrk db "direcc.",0
velocida dw 1,0
dw 1,1
dato dw 0,0
Salto db 02
dir_salto db 0,0
IP dw 0
Dir_ini dw 0
dir_fin dw 0,0
Datos_ini db 0,0,0
prn_ini dw 0,0
prn_fin dw 0,0
.code
extrn buses:near
extrn transm:near
extrn dump:near
extrn secuencia:near
extrn ejecuta:near
extrn prn_reg:near
extrn masBRK:near
extrn Dma_off:near
extrn menosBRK:near
extrn prn_brk:near
extrn _reset:near
extrn conf_int:near
extrn conf_ext:near
extrn Guarda:near
extrn Toma:near
extrn _trace:near
extrn reciv:near
extrn mod_dato:near
extrn listado:near
menu proc far
main ; inicia
setcursor off
resmouse
mouse on
putmouse 8,8
call Dma_off
call _Reset
inicio:
mov vez,0
mov vez_sec,0
mov vez_reg,0
mov vrfs,0
cmp ventanas,Ejecucion
jz esper1
mouse off
gotoxy 0,0
printf pantalla
gotoxy 50,0
printf file
mov vent_en_memo,0
mouse on
esper1:
cmp fsec,1
jnz esper2
call secuencia
mov vez_sec,1
esper2:
cmp prnBRK,1
jnz espera
call prn_BRK
espera:
cmp ventanas,Ejecucion
jnz espe1
call ejecuta
espe1:
cmp fdump,1
jnz esper
xor toca,1
cmp toca,1
jnz esper
call dump
mov vez,1
esper:
getmouse ;comprueba el estado del raton
cmp ax,1
jnz actual ;si no se ha pulsado se espera
cmp ax,raton ;si se pulso se verifica si ha sido un
mov raton,ax ;flanco de subida
jnz seleccion ;si es asi se selecciona la opcion deseada
actual:
mov raton,ax
call actualiza_accion
jmp espera
seleccion:
getmousey ;comprueba las posiciones del raton
cmp ax,1*8 ;y si estan dentro del margen deseado se
jne ventanal
call gestion_menu
jmp espera
Ventanal:
call Gestion_ventanas
cmp ventanas,Ejecucion
jz no_eliminar
mov vent_en_memo,0
mov ventanas,0
no_eliminar:
cmp fdump,1
jnz ndump
call control_dump
ndump:
cmp fsec,1
jnz nfsec
call control_des
nfsec:
s_ini:
jmp inicio
menu endp
control_dump proc near
getmousex
cmp ax,78*8
je c_d_s0
jmp f_control
c_d_s0:
getmousey
cmp ax,12*8
jne c_d_1
cmp dir_base,16
jna c_d_s1
sub dir_base,16
mov vrfs,0
ret
c_d_s1:
mov dir_base,0
mov vrfs,0
ret
c_d_1:
cmp ax,13*8
jne c_d_2
cmp dir_base,16*8
jna c_d_s1
sub dir_base,16*8
mov vrfs,0
ret
c_d_2:
cmp ax,21*8
jne c_d_3
add dir_base,16*8
mov vrfs,0
ret
c_d_3:
cmp ax,22*8
jne barra
add dir_base,16
mov vrfs,0
ret
barra:
cmp ax,14*8
jb f_control
cmp ax,20*8
ja f_control
no_vale:
getwindow m_ventana,10,35,12,45
window 10,35,12,45,mbrk
gotoxy 36,11
scanf dato,@h
putwindow m_ventana,10,35,12,45
mov ax,dato
cmp ax,0fff0h
ja no_vale
mov dir_base,ax
mov dato,0
mov vrfs,0
f_control:
ret
control_dump endp
control_des proc near
getmousex
cmp ax,24*8
je d_d_s0
jmp f_dontrol
d_d_s0:
getmousey
cmp ax,5*8
jne d_d_1
cmp mostrada,1
jna d_d_s1
dec mostrada
ret
d_d_s1:
mov mostrada,0
ret
d_d_1:
cmp ax,6*8
jne d_d_2
cmp mostrada,13
jna d_d_s1
sub mostrada,13
ret
d_d_2:
cmp ax,19*8
jne d_d_3
add mostrada,13
ret
d_d_3:
cmp ax,20*8
jne f_barra
inc mostrada
ret
f_barra:
cmp ax,5*8
jb f_dontrol
cmp ax,18*8
ja f_dontrol
no_vale1:
getwindow m_ventana,10,10,12,20
window 10,10,12,20,mbrk
gotoxy 11,11
scanf dato,@h
putwindow m_ventana,10,10,12,20
mov ax,dato
cmp ax,0fff0h
ja no_vale1
mov des_base,ax
mov dato,0
mov mostrada,0
f_dontrol:
ret
control_des endp
Gestion_menu proc near
getmousex ;compuebo segun ventana activa
sub ax,5*8
cmp ax,7*8
jnb a_monitor
mov ventanas,Fichero
mov vrfs,0
ret
a_monitor:
getmousex
sub ax,21*8
cmp ax,9*8
jnb a_editor
mov ventanas,Monitores
ret
a_editor:
getmousex
sub ax,39*8
cmp ax,6*8
jnb a_Enlace
and ventanas,Ejecucion
xor ventanas,Ejecucion
ret
a_enlace:
getmousex
sub ax,54*8
cmp ax,6*8
jnb a_fuera
mov ventanas,PRuptura
mov vrfs,0
ret
a_fuera:
getmousex
sub ax,68*8
cmp ax,5*8
jb fuera
ret
fuera:
mouse off
setcursor on
exit 0
Gestion_menu endp
Actualiza_accion proc near
cmp ventanas,Monitores
jz v_moni
jmp s1
V_moni:
cmp vent_en_memo,Monitores
jnz pres_monitores
ret
pres_monitores:
cmp vent_en_memo,0
jz lee_vent1
putwindow mem_vent,fs,ciz,fin,cde
lee_vent1:
mov fs,2
mov ciz,21
mov fin,7
mov cde,31
mov vent_en_memo,Monitores
getwindow mem_vent,2,21,7,31
window 2,21,7,31,nada
gotoxy 22,3
printf mens2
gotoxy 22,4
printf mens3
gotoxy 22,5
printf mens4
ret
s1:
cmp ventanas,Fichero
jz v_Fich
jmp s2
V_Fich:
cmp vent_en_memo,Fichero
jnz pres_Fichero
ret
pres_Fichero:
cmp vent_en_memo,0
jz lee_vent2
putwindow mem_vent,fs,ciz,fin,cde
lee_vent2:
mov fs,2
mov ciz,5
mov fin,7
mov cde,16
mov vent_en_memo,Fichero
getwindow mem_vent,2,5,7,16
window 2,5,7,16,nada
gotoxy 6,3
printf mens5
gotoxy 6,4
printf mens6
gotoxy 6,5
printf mens7
gotoxy 6,6
printf mens8
ret
s2:
cmp ventanas,Ejecucion
jz v_Eje
jmp s3
V_Eje:
cmp vent_en_memo,Ejecucion
jnz pres_Ejecucion
ret
pres_Ejecucion:
cmp vent_en_memo,0
jz lee_vent3
putwindow mem_vent,fs,ciz,fin,cde
lee_vent3:
mov control,0
mov freg,0
mov fs,2
mov ciz,40
mov fin,12
mov cde,50
mov vent_en_memo,Ejecucion
getwindow mem_vent,2,40,12,50
window 2,40,12,50,Ejecu
gotoxy 41,3
printf mM1
gotoxy 41,4
printf mM2
gotoxy 41,5
printf mM3
gotoxy 41,6
printf mM4
gotoxy 41,7
printf mM5
gotoxy 41,8
printf mM6
gotoxy 41,9
printf mM7
gotoxy 41,10
printf mM8
ret
s3:
cmp ventanas,Pruptura
jz v_Trac
jmp s4
V_Trac:
cmp vent_en_memo,Pruptura
jnz pTac
ret
pTac:
cmp vent_en_memo,0
jz lee_vent4
putwindow mem_vent,fs,ciz,fin,cde
lee_vent4:
mov fs,2
mov ciz,55
mov fin,6
mov cde,65
mov vent_en_memo,Pruptura
getwindow mem_vent,2,55,6,65
window 2,55,6,65,nada
gotoxy 56,3
printf mTra1
gotoxy 56,4
printf mTra2
gotoxy 56,5
printf mTra3
mov vrfs,0
ret
s4:
cmp vent_en_memo,0
jz s_actual
putwindow mem_vent,fs,ciz,fin,cde
mov vent_en_memo,0
s_actual:
ret
Actualiza_accion endp
Gestion_ventanas proc near
cmp fdump,1
jnz las_demas
call mod_dato
las_demas:
cmp ventanas,Monitores
jnz g1
getmousex
sub ax,22*8 ;se encuentra dentro de la ventana Monitores
cmp ax,8*8
jnb g1
getmousey
cmp ax,4*8 ; se ha seleccionado Buses
jnz gm1
call buses
ret
gm1: cmp ax,3*8
jnz gm2
xor fdump,1
ret
gm2: cmp ax,5*8
jnz gm3
xor fsec,1
mov vrfs,0
ret
gm3:
nm:
nmm:
ret
g1:
cmp ventanas,Fichero
jz afichero
jmp g2
afichero:
getmousex
sub ax,5*8 ;se encuentra dentro de la ventana Monitores
cmp ax,8*8
jnb nm
getmousey
cmp ax,3*8 ; se ha seleccionado Abrir
jz scs2
mov vrfs,0
jmp gf1
scs2:
getwindow m_ventana,10,10,12,37
window 10,10,12,37,ped_fichero
gotoxy 11,11
scanf ped_file
putwindow m_ventana,10,10,12,37
cmp nombre,0
jnz hayfichero
windir 6,10,ficheros,file
strlen file
mov cx,ax
sub cx,4
strcut nombre,0,cx,file
jmp short no_hay
hayfichero:
strcat file,nombre,extension
no_hay:
cmp file,0
jz notrans
call transm
notrans:
ret
gf1: cmp ax,4*8 ; se ha seleccionado salvar
jnz gf2
getwindow m_ventana,10,10,12,37
window 10,10,12,37,ped_dir_fin
gotoxy 11,11
scanf dir_fin,@h
putwindow m_ventana,10,10,12,37
call Reciv
mov vrfs,0
ret
gf2:
cmp ax,5*8
jnz gf3
getwindow m_ventana,10,10,12,37
window 10,10,12,37,ped_n_nombre
gotoxy 11,11
scanf ped_file
putwindow m_ventana,10,10,12,37
strcat file,nombre,extension
ret
gf3:
cmp ax,6*8
jz scs1
jmp nf
scs1:
getwindow m_ventana,10,10,12,37
window 10,10,12,37,ped_dir_ini
gotoxy 11,11
scanf prn_ini,@h
putwindow m_ventana,10,10,12,37
getwindow m_ventana,10,10,12,37
window 10,10,12,37,ped_dir_fin
gotoxy 11,11
scanf prn_fin,@h
putwindow m_ventana,10,10,12,37
strcat nombrelst,NOMBRE,extlst
call listado
nf:
ret
g2:
cmp ventanas,Ejecucion
jz aejecucion
jmp g3
aejecucion:
getmousex
sub ax,40*8
jb s
cmp ax,10*8
jb s0
s:
ret
s0:
getmousey
cmp ax,3*8
jnz sss1
or CONTROL,PASO
or Control,Animate
wincolor 11,41,11,49,NORMAL
mov vrfs,0
ret
sss1:
cmp ax,4*8
jz ssD1
JMP SS1
SSD1:
xor control,Animate
mouse off
wincolor 5,41,5,49,normal
test Control,Animate
jz sss2
or Control,Continuo
and Control,not Paso
wincolor 4,41,4,49,inverso
wincolor 11,41,11,49,NORMAL
mouse on
mov vrfs,0
ret
sss2:
wincolor 4,41,4,49,normal
wincolor 11,41,11,49,NORMAL
mov Control,0
mouse on
mov vrfs,0
ret
ss1:
cmp ax,5*8
jz ssD4
JMP SS4
SSD4:
mouse off
wincolor 4,41,4,49,normal
test CONTROL,ANIMATE
jz contv
and control,not Animate
and CONTROL,not CONTINUO
contv:
xor CONTROL,CONTINUO
and CONTROL,not PASO
test CONTROL,CONTINUO
jnz ss2
wincolor 11,41,11,49,NORMAL
wincolor 5,41,5,49,normal
mouse on
mov vrfs,0
ret
ss2:
wincolor 11,41,11,49,NORMAL
wincolor 5,41,5,49,inverso
mouse on
mov vrfs,0
ret
ss4:
cmp ax,6*8
jz n_velo
jmp ss5
n_velo:
setcursor on
de_nuevo:
getwindow m_ventana,6,34,8,44
window 6,34,8,44,veloci
gotoxy 35,7
printf borraa
gotoxy 35,7
scanf velocida
cmp velocida,200
ja de_nuevo
mov ax,velocida
mov velocida+4,ax
mov velocida+6,ax
setcursor off
putwindow m_ventana,6,34,8,44
mov vrfs,0
ret
ss5:
cmp ax,7*8
jnz ss6
call _reset
mov des_base,0
call secuencia
mov vrfs,0
ret
ss6:
cmp ax,8*8
jz nuev_ip
jmp SS7
nuev_ip:
getwindow m_ventana,16,34,18,44
window 16,34,18,44,mip
gotoxy 35,17
scanf IP,@h
putwindow m_ventana,16,34,18,44
mov ax,IP
mov bx,offset dir_salto
mov dir_salto,ah
mov Dir_salto+1,al
mov ax,dir_cur
mov dir_ini,ax
mov dx,ax
mov bx,offset Datos_ini
mov cx,3
call Toma
mov dx,dir_ini
mov bx,offset salto
mov cx,3
call Guarda
mov cx,24
Call _Trace
mov dx,dir_ini
mov bx,offset datos_ini
mov cx,3
call guarda
mov ax,dir_cur
mov des_base,ax
call secuencia
mov vrfs,0
ret
SS7:
cmp ax,9*8
jnz ss8
xor freg,1
mouse off
cmp freg,0
jnz reg1
wincolor 9,41,9,49,normal
mouse on
mov vrfs,0
ret
reg1:
wincolor 9,41,9,49,inverso
mouse on
mov vrfs,0
ret
ss8:
cmp ax,10*8
jnz ss9
getwindow m_ventana,6,34,8,44
window 6,34,8,44,MBRK
gotoxy 35,7
scanf Dato,@h
mov ax,dato
mov BRk_goto,ax
putwindow m_ventana,6,34,8,44
mov Brk_gotol,1
or CONTROL,CONTINUO
and CONTROL,not PASO
mov vrfs,0
ret
ss9:
mov vrfs,0
ret
g3:
cmp ventanas,PRuptura
jnz g4
getmousex
sub ax,56*8 ;se encuentra dentro de la ventana Trace
cmp ax,8*8
jnb g4
getmousey
cmp ax,3*8 ; se ha seleccionado + BRK
jnz gT1
call masBRK
mov vrfs,0
ret
gT1: cmp ax,4*8
jnz gT2
Call menosBRK
ret
gT2: cmp ax,5*8
jnz g4
xor prnBRK,1
mov vrfs,0
ret
gt3: mov prnBRK,0
g4:
mov vrfs,0
ret
mov vrfs,0
ret
Gestion_ventanas endp
end menu
No hay comentarios:
Publicar un comentario
Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.