Vistas de página en total

jueves, 13 de febrero de 2014

EMULADOR 8051 (12/12) (MENU)

       Hoy acabo con el programa del emulador 8051. Para ello presento el programa principal. El que genera el exe.
       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.