Ya he puesto el código de desensamblado. Es decir el código de la rutina que será capaz de interpretar el programa en código máquina para presentarlo en pantalla.
El emulador tambén tendrá que ser capaz de presentar en pantalla los datos de la memoria y modificarlos si es preciso. Para ello deberemos de crar una ventana de "DUMP".
Por ello voy a exponer en esta entrada del blog la rutina que será capaz de realizar este proceso.
Como vereis está soportada sobre todas las rutinas que he ido colocando en el blog, las cuales me permiten crear un entrono de ventanas sobre MS-DOS.
Como el programa ya está analizado y se donde quiero llegar, en el blog como veis no empiezo de arriba hacia abajo. De una análisis del proceso hacia una descomposición. Lo voy haciendo al revés. Voy colocando los procesos ya descompuestos, de abajo a arriba hasta que lleguemos al proceso final.
Esto lo hago por falta de tiempo. El programa ya está hecho, y su análisis se hizo en su día. Por ello me resulta más cómodo ir colocando las rutinas que hacen cada parte, de forma que puedan servir como ejemplo de uso de algunas funciones, e ir subiendo el proceso apoyandome en lo que ya he expuesto.
Así también creo un poco de expectativa de lo que seré capaz de hacer....creo.
Por ello, voy a ir resolviendo las partes fundamentales que hará falta usar desde el hard, que ya ha sido expuesto, pasando por las librerías de control, que ya han sido colocadas, las funciones básicas, que estoy poniendo; para terminar con el entorno de menús y control de ventanas.
Dado que no he comenzado con el análisis previo de la aplicación que estoy montando en el blog, pero si supongo que puede interesar saber que es todo esto. Voy a incluir el manual de uso. Con él queda claro lo que se podrá hacer, como funcionará y como será el programa final.
MANUAL EMULADOR 8051
En este caso definiremos dos funciones: DUMP y MOD_DATO.
Dump - Esta subrrutina realiza la presentación en ventana de un area de la memoria del sistema. El area mostrada estádefinida por el tamaño de la ventana. Los datos se mostrarán en 10 filas de 16 datos en hexadecimal. la posición de esta ventana, es fija y está definida en este programa, pues cuando se analizo el interface ya se asignó una zona para cada area.
MOD_DATO - Esta subrutina permitirá modificar un dato de la memoria del sistema. Será llamada por el entrorno principal cuando se pulse el ratón. En el momento que se haga una pusación del ratón en el programa principal se llamará a todos las rutinas auxiliares de las ventanas de foma consecutiva. Si una asiste a la solicitud es que el ratón estaba dentro de su área. Es por esa razón por la que el programa primero analiza la posición del ratón, si no está en su area sale, permitiendo el análisis al siguiente módulo.
Esto se hizo para tener los módulos independientes, de forma que el area de asignación del ratón estuviera en el mismo módulo que el area de asignacion de ventanas. Podría haberse hecho mediante constantes, o variables, pero debido a que no necesitaba mover las ventanas de sitio, y a que las constantes me obligaría a recompilar todo cada vez que modificase algo, decidí hacerlo de esta forma.
No es la más elegante para reubicar, pero es la más simple para independizar. Una vez realizada una rutina, esta no será influida por errores de compilación o de variables durante el desarrollo del resto.
Si alguien quiere realizar variables, para reubicar las ventanas..... ahí tiene el código.
DUMP.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 window.mac
INCLUDE 8051.MAC
public DUMP
public mod_dato
.model compact,pascal
.data
; datos externos definidos como variables globales en el módulo principal
extrn dir_base:word ;dirección de memoria incial mostrada en ventana
extrn vez:byte
extrn vrfs:byte
extrn m_ventana:byte
extrn CONTROL:BYTE
nada db 0
dato dw 0,0
dire dw 0,0
x db 0
y db 0
borra_dir db " ",0
borra_dat db " ",0
mdato db "Valor",0
dir_mod dw 0
buffer db 10*16 dup (0)
.code
; funciones externas
DUMP proc near
cmp vez,1
je noventana
draw_win 12,25,22,78,nada
gotoxy 78,12
putchar ' '
gotoxy 78,22
putchar ' '
gotoxy 78,13
putchar ' '
gotoxy 78,21
putchar ' '
mov cl,14
barra:
gotoxy 78,cl
putchar '¦'
inc cl
cmp cl,21
jnz barra
noventana:
mov x,31
mov y,13
mov bx,dir_base
cmp vrfs,1
jz ya_prn
gotoxy 26,13
puts borra_dir
gotoxy 26,13
printf dir_base,@h
ya_prn:
mov si,offset buffer
otro:
mov dx,bx
lee
mov dl,al
cmp vrfs,0
jz prn_todo
cmp [si],dl
jz no_prn_dato
prn_todo:
mov byte ptr dato,dl
gotoxy x,y
puts borra_dat
gotoxy x,y
printf dato,@h
no_prn_dato:
mov [si],dl
inc si
add x,3
inc bx
mov ax,bx
sub ax,dir_base
mov dx,ax
and dx,0fh
mov cl,4
shr ax,cl
cmp ax,9 ;numero de lineas
jz fin
cmp dx,0 ;linea completada
jnz linea
inc y
mov x,31
cmp vrfs,1
jz linea
gotoxy 26,y
puts borra_dir
gotoxy 26,y
mov dire,bx
printf dire,@h
linea:
jmp otro
fin:
mov vrfs,1
mouse on
ret
DUMP endp
mod_dato proc near
mov dato,0
getmousexy 13,9,31,47 ;verifica si el ratón está dentro de la ventana de datos
cmp al,0ffh
jne nwnumero
no_modi:
mov dato,0
ret
nwnumero:
push ax ;almaceno provisionalmente la posición del ratón
;abre una ventana popup para pedir el dato
getwindow 10,35,12,45,m_ventana,
draw_win 10,35,12,45,mdato
gotoxy 36,11
scanf dato,@h ; pide el dato
putwindow 10,35,12,45,m_ventana
cmp dato,0ffh
ja nwnumero ; si dato no es correcto repite la pregunta
pop ax
mov dx,ax ;guardo la posición en dx
mov ah,0 ;os quedmaos con la y que está en al
mov bl,16 ;16 datos por fila
mul bl ;byte de desplazamineto inicial de la fila
add ax,dir_base ;dirección del primer dato mostrado en ventana
push ax ;guardo la dirección inicial de la fila de datos seleccionada
mov dh,dl ;cogemos la posición x en la ventana
mov bl,3 ;Convertimos a posicion de la matrid de columnas (3 caracteres por entrada)
div bl
and ax,0fh
mov dir_mod,ax ;lo almacenamos en dirección de memoria a modificar
pop ax ; recuperamos la dirección base de la fila mostrada
add dir_mod,ax ;Componemos la direccion completa
mov dx,dir_mod
mov bx,offset dato
mov cx,1
guarda
ret
mod_dato endp
end DUMP
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.