EMU8051.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 io.mac
include 48iocent.mac
include 8051.mac
PASO EQU 1
public _Dma_on
public _Dma_off
public _lee
public _reset
public _trace
public _Guarda
public _Toma
extrn des_base:word
extrn Dir_cur:word
extrn CONTROL:word
.model compact,pascal
.data
dir dw 0
paro db "Microprocesador Parado",0
.code
_Dma_on proc near
pioconfig p0,PSALIDA
ret
_Dma_on endp
_Dma_off proc near
pioconfig P1,PA PB PCL PCH
pioconfig P0,PSALIDA
outpio p0,BUSRQPC_ON
ret
_Dma_off endp
;lectura zona programa
_leeinst proc uses bx cx dx
Dma_on
pioconfig P1,PCL
outpio P1,WR_ON
outpio P1,RD_ON
outpio P1,ALE_ON
outpio P1,PSEN_ON
outpio PA1,dl
pioconfig P1,PA PCL
outpio PB1,dh
outpio P1,WR_ON
outpio P1,RD_ON
outpio P1,PSEN_OFF ;LA LECTURA SE HACE CON RD=1 Y PSEN=0 POR SER PROGRAMA
inpio al,PA1
push ax
outpio P1,RD_ON
Dma_off
pop ax
ret
_leeinst endp
;lectura un dato de area de datos
;dir =dirección de lectura en ram del prototipo
;devuelve el dato en al
_lee proc near uses bx cx dx,dir
mov dx,dir
Dma_on
pioconfig P1,PCL
outpio P1,WR_ON
outpio P1,RD_ON ;PSEN=1 POR SER LECTURA DE DATOS
outpio P1,ALE_ON
outpio P1,PSEN_ON
outpio PA1,dl
pioconfig P1,PA PCL
outpio PB1,dh
outpio P1,WR_ON
outpio P1,PSEN_ON
inpio al,PA1
push ax
outpio P1,RD_ON
Dma_off
pop ax
ret
_lee endp
;Guarda de zona de datos
; dir =dirección de volcado en ram del prototipo
; dirección =puntero a los datos a volcar
; long =cantidad de datos
_Guarda proc uses bx dx,dir,dato,long
mov dx,dir
mov bx,dato
mov cx,long
Dma_on
pioconfig P1,PCL
outpio P1,WR_ON
outpio P1,RD_ON ;PSEN=1 POR SER LECTURA DE DATOS
outpio P1,PSEN_ON
Guard:
outpio P1,ALE_ON
outpio PA1,dl
outpio PB1,dh
outpio P1,ALE_OFF
outpio PA1,[bx]
outpio P1,WR_OFF
outpio P1,WR_ON
inc bx
inc dx
loop guard
Dma_off
ret
_guarda endp
;toma una zona de datos
;lee una zona de memoria
; dir =dirección de volcado en ram del prototipo
; dirección =puntero a los datos a volcar
; long =cantidad de datos
_Toma proc uses bx dx,dir,datos,long
mov dx,dir
mov bx,dato
mov cx,long
Dma_on
Tom:
lee dx,bx,cx
mov [bx],al
inc bx
inc dx
loop Tom
Dma_off
ret
_Toma endp
;ejecuta una instruciión
;en pulsos se pasará el numero de pulsos de reloj de la instrucción
_trace proc uses cx dx, pulsos
pioconfig P1,PCL
outpio P1,WR_ON
outpio P1,RD_ON ;PSEN=1 POR SER LECTURA DE DATOS
outpio P1,PSEN_ON
outpio P1,ALE_ON
mov dx,Dir_cur
outpio PA1,dl
outpio P1,ALE_OFF
Dma_off
mov cx,pulsos
dec cx
buc:
outpio P0,CLK_ON
outpio P0,CLK_OFF
loop buc
busca_ale:
inpio dl,PC1
test dl,ALE
jnz falta
test dl,PSEN
jnz final
falta:
inpio dl,PA1
inpio dh,PB1
mov Dir,dx
outpio P0,CLK_ON
outpio P0,CLK_OFF
jmp short busca_ale
final: mov dx,dir
mov Dir_cur,dx
and CONTROL, not PASO
ret
_trace endp
;resetea el programa
_reset proc uses cx
mov Dir_cur,0
pioconfig P0,PA PB
outpio P0,EXTERNO_OFF
outpio p0,BUSRQPC_ON
pioconfig P1,PA PB PCH
outpio P1,RESET_ON
outpio P1,INT0_ON
outpio P1,INT1_ON
mov cx,12
bucr:
outpio P0,CLK_ON
outpio P0,CLK_OFF
loop bucr
outpio P1,RESET_OFF
mov cx,12
call _trace
pioconfig P1,PA PB PCH PCL
mov des_base,0
ret
_reset endp
end
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.