Ya estamos listos para crear las funciones de control de la tarjera de 48 E/S. Esta librería la asociaremos a la general o crearemos una nueva para nuestro hard.
Dado que las funciones
van asociadas al puerto paralelo, y dado que solo existe uno normalmente en los
ordenadores, no defino dos puertos y trabajo directamente con el lpt1. Por eso
en el programa trabajo directamente con las direcciones del puerto centronics,
ya que crear variables y asignarlas a diferentes direcciones, creo que resulta
un trabajo innecesario, dado el uso que haremos de las funciones.
48IOCENT.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/
;CONTROL DE ACCIONES SOBRE LOS 8255
;ESTAS VARIABLES MUEVEN ELAS SEÑALES DE CONTROL
;DE LOS BUFER Y LATCH DE LA TARJETA PARA ABRIR
;PASO A LOS DATOS DENTRO ENTRE EL CENTRONICS Y
;LOS PUERTOS DE LOS 8255
RDL EQU 0010b ;LECTURA DE NIBLE BAJO
RDH EQU 0100B ;LECTURA DEL NIBLE ALTO
WR EQU 0001B ;ESCRITURA
ENDIR EQU 1000B ;DIRECCIONAMIENTO
.model compact,pascal
.code
public _inpio
public _outpio
;lee un dato del puero 8255 indicado y lo devuelve en al
_inpio proc near uses bx cx dx,PUERTO
push PUERTO ;Selecciona el puerto indicado
call _selecreg
add sp,2
mov al,RDH ;Activa la orden RDh lectura parte alta
out dx,al
mov bx,379h
xchg bx,dx
in al,dx ;lee el pueto 379h
shl al,1 ; sube 1 bit lo leido para dejarlo como parte
and al,0f0h
mov ch,al ;alta
xchg bx,dx
mov al,RDL ;activa la orden RDl lectura parte baja
out dx,al
xchg bx,dx
in al,dx ;lee el puerto 379h y toma la parte baja
mov bl,al
mov cl,3
shr bl,cl ;traslada los bit abajo para posicionarlos
and bl,0fh ;elimina la posible basura
or ch,bl ;une lo leido a lo leido anteriormente
mov al,ch ;pasa el resulatado a al
ret
_inpio endp
;envío un dato del puero 8255 indicado
_outpio proc near uses bx cx dx,PUERTO,DATO:byte
push PUERTO ;Selecciona el puerto indicado
call _selecreg
add sp,2
mov dx,378h ;lanzo el numero
mov al,DATO
out dx,al
mov dx,37ah
mov al,WR ;indico WR
out dx,al
xor al,al ;desactivo WR
out dx,al
ret
_outpio endp
;selecciona un registro interno de la targeta
; ESTA FUNCIÓN ES INTERNA A ESTA LIBRERÍA Y PERMITE
; ESCRIBIR LA DICRECIÓN DEL PUERTO ACTIVADA, PARA QUE
; SE GUARDE EN EL REGISTRO DE DIRECCIONES
; INTERNO DE LA TARJETA 48IOCENT
_selecreg proc near uses dx bx,puerto:byte ;registro indicado en pila
mov dx,37ah ;elijo puerto de control del centronics
mov al,ENDIR
out dx,al ;activo lach de direccion y desactivo resto
mov bx,378h
xchg bx,dx
mov al,puerto
out dx,al ;lanzo la direccion indicada
xchg dx,bx
xor al,al
out dx,al ;deselecciono el lach de direccion
ret
_selecreg 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.