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.