Vistas de página en total

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


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.