Vistas de página en total

jueves, 9 de enero de 2014

EMULADOR 8051 (2/12) (DUMP )

   Después de las Vacacionesde navidad voy a seguir con el programa de emulación del 8051, sobre la tarjeta puesta en entradas anteriores.
   
  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.