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

lunes, 10 de febrero de 2014

EMULADOR 8051 (11/12) (TRANSMIT)

    Si hicimos la recogida del programa que traceabamos en el Emulador, será porque pudimos subir el programa al emulador. Pero para esto necesitamos otra rutina.
    Esta es la rutina de transmisión. En este caso al revés que en el anterior, se recogerá los datos de un fichero .bin y se enviarán a la memoria del procesador.
    Al igual que en el caso  anterior el nombre del fichero lo dará el programa principal y esta rutina lo abrirá. Si en este proceso resulta un error, abrirá una ventana emergente indicando el error.
     Si todo va bien leerá el fichero completo y enviará los datos a la memoria del sistema.


TRANSMIT.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 48iocent.mac
include mouse.mac
include io.mac
include window.mac
INCLUDE 8051.MAC
.model compact,pascal

         public TRANSM
         
.data
        extrn file:byte
        extrn m_Ventana:byte
hand1 dw 0
nada db 0
err_ab db "No se puede Abrir Fichero",0
dato dw 0,0
ends

.code
        extrn guarda:near
transm proc near uses cx bx
        mov cx,3
 abrir:
        open file,_R,hand1
        jnc bueno
        loop abrir
        getwindow  m_ventana,10,10,12,37
        window 10,10,12,37,nada
        gotoxy 11,11
        printf err_ab
        getch al
        putwindow m_ventana,10,10,12,37
        ret
bueno:

        mov dx,0
 otro:
        read hand1,1,dato               ;lee dato
        cmp ax,0
        jz fin
        mov bx,offset dato
        mov cx,1
        call guarda
        jmp otro
fin:
        cmp hand1,0
        jz no_cerrar
        close hand1
no_cerrar:
fin_fin:
         ret

transm endp

end transm

sábado, 8 de febrero de 2014

EMULADOR 8051 (10/12) (RECIVE)

      Siguiendo el formato del blog, vamos a seguir subiendo de nivel en la estructura del programa del emulador.
      Apoyándonos en las funciones que ya he puesto, hoy declaro la función "Recive", que permitirá recoger el programa de memoria del emulador y guardarlo en el disco duro en un fichero.
    Como nombre del fichero usará una variable externa que será declarada y modificada por el entorno hombre máquina principal, el "main" del programa.
    Por lo tanto este procedimiento simplemente intenta abrir el fichero. Si se produce un error, abre una ventana emergente y muestra el error. Si todo va bien, lee la memoria hasta la dirección de fin de programa y lo guarda en el fichero.

     Como se ve la función es muy sencilla de entender gracias a que está apoyada en todas las librerías ya implementadas. Incluidas las de gestión de ventanas.




RECIVE.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 48iocent.mac
include mouse.mac
include io.mac
include window.mac
INCLUDE 8051.MAC

        public reciv

.model compact,pascal


.data
        extrn file:byte
        extrn m_Ventana:byte
        extrn dir_fin:word
hand1 dw 0
nada db 0
err_ab db "No se puede Abrir Fichero",0
dato db 0


.code
        extrn lee:near
reciv proc near 
 abrir:
        open file,_W,hand1
        jnc bueno
        creat file,_Archivo,hand1
        jnc bueno
        getwindow  m_ventana,10,10,12,37
        window 10,10,12,37,nada
        gotoxy 11,11
        printf err_ab
        getch al
        putwindow m_ventana,10,10,12,37
        ret
bueno:

        mov dx,0
otro:
        call lee
        mov byte ptr dato,al
        write hand1,1,dato               ;escrive dato
        cmp dx,dir_fin
        jz fin
        inc dx
        jmp otro
fin:
        cmp hand1,0
        jz no_cerrar
        close hand1
no_cerrar:
fin_fin:
       ret

reciv endp

miércoles, 5 de febrero de 2014

EMULADOR 8051 (9/12) (EJECUTA)

    Como ya se ha visto como ejecutar el programa en la rutina BUSES, ahora podemos crear la rutina del menú de ejecución. Esta rutina permitirá ejecutar el programa en varios modos:
    PASO - Avanza un paso   
   Modos de trabajo
        TRACE - ejecuta una  instrucción cada vez que se pulse paso
       CONTINUO- Ejecuta mediante reloj controlado por pc de forma continua el programa. No hay visualización de registros
      EXTER - ejecuta a velocidad de reloj externo. No hay visualización de registros
    ANIMATE - ejecuta de forma continua el programa mediante pulsos del PC, mostrando en cada paso el estado de los registros, memoria y refrescando el listado de instrucciones


   
   A demás en este módulo están las funciones para añadir, eliminar y presentar los puntos de interrupción. Estos puntos podrán ser programados, para detener el programa en ellos cuando se ejecuten en modo continuo y anímate.


    Como se puede ver en el programa esta función llama a interpreta.  Al igual que la anterior función, en modo continuo, anímate y paso a paso, necesita conocer el número de pulsos de reloj de cada instrucción para ejecutarla al completo.

EJECUTA.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 48iocent.mac
include mouse.mac
include 8051.mac
INCLUDE WINDOW.MAC

.model compact,pascal

        public ejecuta
        public masBrk
        public menosBrk
        public prn_brk

;CONTROL
PASO EQU 1
MANUAL EQU 2
TRACE EQU 4
CONTINUO EQU 8
EXTER EQU 16
ANIMATE EQU 32


.data
extrn m_ventana:byte
extrn control:byte
extrn des_base:word
extrn mostrada:word
extrn vez_sec:byte
extrn vez_reg:byte
extrn freg:byte
extrn velocida:word
public brk_gotol
public brk_goto
public tabla_brk
public Dir_cur

Dir_cur dw 0
brk_gotol db 0
brk_goto dw 0
tabla_brk db 20 dup (0,0,0)
dato dw 0,0
direccion dw 0,0
borra db "    ",0
stop db 0
mBrk db "Direcc.",0
mlista db "Lista BRK",0
TablaLlena db "Tabla de punteros llena",0
nada db 0
x db 0
y db 0
ends

.code


        extrn secuencia:near
        extrn prn_reg:near
        extrn conf_int:near
        extrn _trace:near
        extrn Interpreta:near

ejecuta proc near
        call conf_int

        test CONTROL,CONTINUO
        jNz c1
        JMP C
c1:
        test control,Paso
        jz c2
        jmp c
c2:
        dec velocida+4
        jz c3
        jmp b
c3:
        mov ax,velocida
        mov velocida+4,ax
        dec velocida+6
        jnz b
        mov ax,velocida
        mov velocida+6,ax
        cmp stop,1
        jz Brk_off
        mov dx,Dir_cur
        cmp brk_gotol,1
        jnz otro_punto
        cmp brk_goto,dx
        jz no_paso
otro_punto:
        mov cx,20
        mov bx,offset tabla_brk
busca:
        cmp byte ptr [bx],1
        jnz no_brk
        cmp [bx+1],dx
        jz no_paso
no_brk:
       add bx,3
        loop busca
brk_off:
        mov stop,0
        or CONTROL,PASO
        ret
no_paso:
        mov stop,1
        mov brk_gotol,0
        and CONTROL, not CONTINUO
        and CONTROL, NOT ANIMATE
        jmp muestra
b:
        ret
c:
        test CONTROL,PASO
        jz nopaso
nofinpaso:
        mov dx,Dir_cur
        call interpreta
        dec dx
        mov bx,ax
        mov cl,[bx+1]
        xor ch,ch
        call _trace
        test CONTROL,ANIMATE
        JZ NOPASO
muestra:
        cmp freg,1
        jnz noregistro
        call prn_reg
        mov vez_reg,1
noregistro:
        mov cx,Dir_cur
        mov des_base,cx
        mov mostrada,0
        call secuencia
        mov vez_sec,1
nopaso:
        ret
ejecuta endp
masBrk proc near
        getwindow m_ventana,6,34,8,44
        window 6,34,8,44,MBRK
        gotoxy 35,7
        scanf Dato,@h
        putwindow m_ventana,6,34,8,44
        mov cx,20
        mov bx,offset Tabla_BRK
Busca1:
        cmp byte ptr [bx],0
        jz libre
        add bx,3
        loop Busca1
        getwindow  m_ventana,10,10,12,37
        window 10,10,12,37,nada
        gotoxy 11,11
        printf TablaLlena
        getch al
        putwindow m_ventana,10,10,12,37
        ret
libre:  mov byte ptr [bx],1
        mov ax,dato
        mov [bx+1],ax
        ret
masBrk endp
menosBrk proc near
        getwindow m_ventana,6,34,8,44
        window 6,34,8,44,MBRK
        gotoxy 35,7
        scanf Dato,@h
        putwindow m_ventana,6,34,8,44
        mov cx,20
        mov bx,offset Tabla_BRK
Busca2:
        cmp byte ptr [bx],0
        jz otro
        mov ax,[bx+1]
        cmp ax,dato
        jnz otro
        mov byte ptr [bx],0
otro:
        add bx,3
        loop Busca2
        ret
menosBrk endp
prn_brk proc near
        window 6,34,17,45,mLista
        mov x,35
        mov y,7
        mov bx,offset Tabla_brk
        mov cx,20
sigui:
        cmp byte ptr [bx],0
        jz sigue
        gotoxy x,y
        mov ax,[bx+1]
        mov dato,ax
        printf dato,@h
        inc y
        cmp y,17
        jnz sigue
        mov y,7
        mov x,41
sigue:
        add bx,3
        loop sigui
        ret
prn_brk endp

end ejecuta


lunes, 3 de febrero de 2014

EMULADOR 8051 (8/12) (TEST BUSES)

   Hemos visto como leer la memoria de la placa prototipo, como leer el programa e interpretarlo, como ver el valor de los registros. Pero todo esto solo se podrá hacer si la placa prototipo está correctamente diseñada y cableada. Por ello algo importante que debe tener el emulador es una forma de testear el prototipo.

   En realidad, en cualquier prototipo, lo primero que habrá que hacer con el emulador es testear la placa. A partir de ahí podremos introducir un programa y ejecutarlo, pero nunca antes de disponer de hard bien montado.
    Esta rutina, como parte del emulador permite la ejecución directa del micro en tres modos, y aprovechar esto para visualizar el estado de los buses de control y datos:
     Manual - los pulsos de reloj se mandan mediante el ratón. Ejecuta microinstrucción a microinstrucción para ver el accionamiento de cada señal de bus.
    Paso a paso- Ejecuta instrucción a instrucción.
   Continuo- Ejecuta de forma continua el programa, pero controlado por el PC, de forma que entre cada instrucción lee el estado de los buses y los presenta en pantalla. La velocidad de ejecución, por lo tanto, no será la real.
   Control Externo.- Da paso al cristal del reloj de la placa, de forma que el programa funciona a frecuencia real.

    Como se puede ver en el programa esta función llama a interpreta. No es para ver el formato de la instrucción, sino para conocer sus ciclos de reloj.



BUSES.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 48iocent.mac
include mouse.mac

include 8051.mac

.model compact,pascal


;CONTROL
PASO EQU 1
MANUAL EQU 2
TRACE EQU 4
CONTINUO EQU 8
EXTER EQU 16

led macro puerto,senal
   local fuera
        mov al,' '
        test Puerto,senal
        jz fuera
        mov al,' '
fuera:
        putchar al
endm


.data
extrn Dir_cur:word
public control
public Dato
Pantalla label byte
DB '╔═══════════════════════════ Monitor 8051══════════════════════════════════════╗'
DB '║                                                                              ║'
DB '║     Nivel alto                                                             ║'
DB '║    ╔══════════════════╗     ╔═════════════════╗                              ║'
DB '║    ║   Interrupciones ║     ║    Control Bus  ║                              ║'
DB '║    ╠══════════════════╣     ╠═════════════════╣                              ║'
DB '║    ║    /INT0         ║     ║       /WR       ║                              ║'
DB '║    ║    /INT1         ║     ║       /RD       ║                              ║'
DB '║    ║                  ║     ║       ALE       ║                              ║'
DB '║    ║    RESET         ║     ║       /PSEN     ║                              ║'
DB '║    ╚══════════════════╝     ╚═════════════════╝                              ║'
DB '║                                                                              ║'
DB '║       DIRECCION       DATO                                                   ║'
DB '║       ┌───────┐  ┌─────┬─────┐                                               ║'
DB '║       │       │  │     │     │                                               ║'
DB '║       └───────┘  └─────┴─────┘                                               ║'
DB '║                                                                              ║'
DB '║      Paso              Velocidad  1                                          ║'
DB '║                                                                              ║'
DB '║      Manual            Control externo                                       ║'
DB '║      Trace                                                                   ║'
DB '║      Continuo          Salir                                                 ║'
DB '║                                                                              ║'
DB '╚══════════════════════════════════════════════════════════════════════════════╝'
DB 0




dato dw 0,0
direccion dw 0,0
CONTROL DB 0
borra db "    ",0
borraa db "      ",0
raton dw 0
velocidad dw 1,0
          dw 1,1

.code

        public buses
        public conf_int
        extrn _reset:near
        extrn interpreta:near
        extrn _trace:near
        extrn Dma_off:near

buses proc near
        mouse off
        clrscr                          ;inicializacion programa
        printf Pantalla
        call Dma_off
        mouse on

present:
        inp cl,PA1              ;lectura de señales AD0-AD7
        inp ch,PB1              ;A8-A15
        inp dl,PC1              ;CONTROL MICRO
        call actualiza          ;actualiza pantalla
        getmouse                ;comprueba el estado del rfaton
        cmp ax,1
        jnz pantal              ;si no se ha pulsado se sigue
        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
pantal:
        mov raton,ax
pantall:
        call conmutador         ;se llama a la subrutina que realiza las
        jmp present             ;acciones de los conmutadores seleccionados

seleccion:                      ;selecciona el comnutador deseado
        getmousex               ;comprueba las posiciones del raton
        sub ax,7*8              ;y si estan dentro del margen deseado se
        jb no
        cmp ax,7*8              ;pone el indicador correspondiente
        jb s0
   no:
        getmousex
        sub ax,25*8
        jb pantall
        cmp ax,5*8
        jnb pantall
        jmp a1
   s0:
        getmousey
        cmp ax,17*8
        jnz s1
        xor CONTROL,PASO
        jmp present
  s1:
        cmp ax,19*8
        jnz s2
        call conf_int
        mov CONTROL,MANUAL
        jmp present
   s2:
        cmp ax,20*8
        jnz s3
        call conf_int
        mov CONTROL,TRACE
        jmp present
    s3:
        cmp ax,21*8
        jnz s6
        call conf_int
        mov CONTROL,CONTINUO
        JMP PRESENT
    s6:
        cmp ax,9*8                      ;RESET
        jnz s4
        call _reset
S4:
        jmp present

    a1:
        getmousey
        cmp ax,21*8
        jnz aa
        jmp fin
    aa:
        cmp ax,19*8
        jnz a2
        call conf_ext
        mov CONTROL,EXTER
        jmp s4
    a2:
        cmp ax,17*8
        jnz s4
        setcursor on
de_nuevo:
        gotoxy 35,17
        printf borraa
        gotoxy 35,17
        scanf velocidad
        cmp velocidad,20
        ja de_nuevo
        mov ax,velocidad
        mov velocidad+4,ax
        mov velocidad+6,ax
        setcursor off
        jmp s4
 fin:
        ret

buses endp
conf_int proc near
        test CONTROL,EXTER
        jz no_conf
        outp p0,BUSRQPC_ON
        outp p0,CLK_OFF
        outp p0,EXTERNO_OFF
  NO_CONF:
        ret
conf_int endp
conf_ext proc near
        outp p0,CLK_ON
        OUTP P0,BUSRQPC_ON
        outp P0,EXTERNO_ON
        ret
conf_ext endp
actualiza proc near
        test dl,ALE
        jnz es_direcc
no_es_direcc:
        test dl,RD
        jz es_dato
        test dl,WR
        jz es_dato
        test dl,PSEN
        jz es_dato
        jmp no_es_dato

es_direcc:
        mov word ptr direccion,cx
        mov Dir_cur,cx
        gotoxy 10,14
        printf borra
        gotoxy 10,14
        printf direccion,@h
        gotoxy 21,14
        printf borra
        gotoxy 26,14
        printf borra
        jmp no_es_dato
es_dato:
        mov byte ptr dato,cl
        gotoxy 21,14
        printf dato,@h
        gotoxy 26,14
        printf byte ptr dato
no_es_dato:
        gotoxy 7,6
        led dl,INT0
        gotoxy 7,7
        led dl,INT1
        gotoxy 7,9
        led dl,RESET
        gotoxy 34,6
        led dl,WR
        gotoxy 34,7
        led dl,RD
        gotoxy 34,8
        led dl,ALE
        gotoxy 34,9
        led dl,PSEN
        gotoxy 4,17
        led CONTROL,PASO
        gotoxy 4,19
        led CONTROL,MANUAL
        gotoxy 4,20
        led CONTROL,TRACE
        gotoxy 4,21
        led CONTROL,CONTINUO
        gotoxy 23,19
        led CONTROL,EXTER
        ret
actualiza endp
conmutador proc near
        test CONTROL,CONTINUO
        jz b1
        dec velocidad+4
        jnz b
        mov ax,velocidad
        mov velocidad+4,ax
        dec velocidad+6
        jnz b
        mov ax,velocidad
        mov velocidad+6,ax
        outp p0,CLK_ON
        outp p0,CLK_OFF

b:      ret
b1:
        test CONTROL,TRACE
        jz b2
        test CONTROL,PASO
        jz b
        mov dx,Dir_cur
        call interpreta
        dec dx
        mov bx,ax
        mov cl,[bx+1]
        xor ch,ch
        call _trace
        gotoxy 21,14
        printf dato,@h
        gotoxy 26,14
        printf byte ptr dato

Pasos:
        ret
b2:
        test CONTROL,MANUAL
        jz b3
        test CONTROL,PASO
        jz b3
        and CONTROL,NOT PASO
        outp P0,CLK_ON
        outp P0,CLK_OFF
b3:     ret
conmutador endp

end buses


sábado, 1 de febrero de 2014

EMULADOR 8051 (7/12) (SECUENCIA)

   Esta función realiza la misma acción que la anterior, pero sobre pantalla.
   Es decir, presenta en pantalla un trozo de la secuencia de programa, dentro de una ventana, con una barra de desplazamiento a la derecha, que permitirá subir y bajar sobre el listado mediante el ratón, al estilo de windows.
   Esta función refresca solo la ventana. La gestión de la barra de desplazamiento y la posición inicial de listado la realizará el programa principal, en su gestión de pantallas y menús.

SECUENCIA.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 window.mac
include 48iocent.mac
include mouse.mac
include stdio.mac
include 8051.mac

.model compact,pascal


         public secuencia



.data
extrn des_base:word
extrn vez_sec:byte
public mostrada
bytes db 1,2,3,2,3,3,2,2,3,3,2,2,2,3,0,0
nada db 0
dire dw 0,0
y db 0
mostrada dw 0
cuenta dw 0
borra db 22 dup (" "),0

        
.code
        
        extrn interpreta:near
        extrn pres_inst:near
        extrn Dma_on:near
        extrn Dma_off:near
        extrn lee:near
secuencia proc near
        call Dma_on
        cmp vez_sec,0
        jz pr
        jmp npr
pr:
        window 5,0,20,23,nada
        gotoxy 24,5
        putchar ' '
        gotoxy 24,20
        putchar ' '
        gotoxy 24,6
        putchar ' '
        gotoxy 24,19
        putchar ' '
        mov cl,7
 barra:
        gotoxy 24,cl
        putchar '░'
        inc cl
        cmp cl,19
        jnz barra
npr:
        mov y,6
        mov dx,des_base
        mov cuenta,0
 otro:
        call interpreta
        dec dx
        mov bx,ax
        mov al,[bx]
        xor bx,bx
        mov bl,al
        add bx,offset bytes
        mov ax,cuenta
        cmp ax,mostrada
        jb n_prn
        mov dire,dx
        gotoxy 1,y
        printf borra
        gotoxy 1,y
        printf dire,@h
        gotoxy 6,y
        call pres_inst
linea:
        cmp y,19
        jz fin
        inc y
        inc cuenta
        jmp otro
n_prn:
        mov al,[bx]
        xor ah,ah
        add dx,ax
        inc cuenta
        jmp otro
fin:
        call Dma_off
        ret

secuencia endp

end secuencia