Vistas de página en total

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


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.