Manejo de los puertos hardware y acceso a memoria

 

 

Introducción

Para intercambiar información con dispositivos exteriores, el computador utiliza los puertos de entrada y salida (E/S). Estos puertos se caracterizan por la dirección que tienen asignada en el mapa de memoria, y es posible la comunicación con los mismos enviando o recogiendo bytes a/en dicha dirección. Así, nos centraremos ahora en las funciones de acceso a los puertos hardware que proporciona Qbasic.

Al igual que en determinadas circunstancias es preciso comunicarse con dispositivos externos, también es necesario intercambiar información con el propio PC. Ello se realiza con frecuencia leyendo y escribiendo valores en/a determinadas posiciones de la memoria del mismo. Por ejemplo, podemos conocer el estado en el que se encuentra el teclado del PC sin más que acceder al valor almacenado en el segmento 0x40, offset 0x17 de la memoria. Con él podemos discernir si la tecla "bloq mayús" está pulsada o no, si la tecla "Alt" está pulsada o no, etc. Asimismo, podemos recoger información del hardware actualmente instalado en el PC y, entre otras cosas, determinar en qué direcciones de E/S se hallan los puertos hardware mencionados en el párrafo anterior. Así existen en QBasic algunas funciones que proporcionan acceso a la memoria.

Volver al principio de página

 

Acceso a los puertos hardware

viñeta

Lectura del puerto

Para recoger información procedente de un puerto hardware (lectura del puerto), Qbasic proporciona la funciñon INP. Esta función devuelve un byte leído del puerto (hardware) de E/S.

Esta función se utiliza de la siguiente manera:

valor% = INP(puerto_dir)

donde:

puerto_dir es la dirección (valor entero: 0-65.535) que identifica el puerto hardware de la cual se quiere leer y valor% y es una variable entera en la que se almacena el byte leído (0-255).

En el siguiente ejemplo vamos a obtener un byte del puerto paralelo (bidireccional) instalado en el PC (en la dirección de E/S 378h):%

' Lee un byte del puerto paralelo
	DIM valor AS INTEGER
	DIM puerto AS INTEGER: puerto = &H378	' dirección del puerto paralelo

	valor = INP(puerto)
	PRINT "El byte leído del puerto "; puerto; " es "; valor
END

Volver a Acceso a los puertos hardware

viñeta

Escritura en el puerto

Para enviar información a un puerto hardware (escritura en el puerto), Qbasic proporciona la función OUT. Esta función envía un byte a un puerto (hardware) de E/S.

La sintaxis de la función es:

OUT puerto_dir%, valor%

donde:

En el siguiente ejemplo vamos a enviar la letra C al primer puerto paralelo bidireccional instalado en el PC (en la dirección de E/S 378h):

' Envía un carácter al puerto paralelo
	DIM valor AS INTEGR
	DIM puerto AS INTEGER: puerto = &H378	' dirección del puerto paralelo

	valor = ASC("C")	' valor contiene el código ASCII de la letra C (el entero: 67)

	OUT puerto, valor
	PRINT "Valor "; valor; " enviado al puerto "; puerto
END

Volver al principio de página

 

Acceso a la memoria

viñeta

Lectura de la memoria

Para leer la información almacenada en la memoria, QBasic proporciona la función PEEK. Ésta devuelve el valor de byte almacenado en la posición de memoria designada por segmento:offset (direccionamiento segmentado de la memoria).

Esta función se declaran de la siguiente manera:

valor% = PEEK(dirección%)

donde:

NOTA: DEF SEG establece el segmento de memoria sobre el que se realizará la operación de lectura (un valor entre 0 y 65.535). Por ejemplo DEF SEG = 0.

Como ejemplo, veamos cómo se determina cuántos puertos paralelo se hallan instalados en un PC, y qué direcciones de E/S tienen asignadas. Para ello, es preciso leer en la posición de memoria 408h una tabla de 3 palabras de 16 bits (2 bytes) que contienen las direcciones de los puertos paralelo presentes en el sistema:

' Determina los puertos paralelo instalados en el PC y sus direcciones

	DEF SEG = 0		' selecciona el segmento de memoria 0
  
	FOR puerto% = 0 TO 2	' número de puerto paralelo: 0 (LPT1), 1 (LPT2), 2 (LPT3)

		' dirección del puerto
		dir% = PEEK(&H408 + puerto% * 2) + 256 * PEEK(&H408 + puerto% * 2 + 1)
		IF dir% = 0 THEN
			PRINT "No hay puerto asignado a LPT"; puerto% + 1
		ELSE
			PRINT "La direcci¢n de LPT"; puerto% + 1; " es "; dir%
		END IF

	NEXT puerto%
END

Volver a Acceso a la memoria

viñeta

Escritura en la memoria

Para almacenar un dato en la posición de memoria designada por segmento:offset, QBasic proporciona la función POKE. Ésta almacena un carácter (1 byte).

La sintaxis de la función es:

POKE dirección%, valor%

donde:

Como ejemplo, veamos cómo se fuerza por software la activación de "Bloq Mayús". Para ello hay que cambiar el bit 6 de la posición 417h, lugar de las variables de la BIOS donde residen los banderines de estado del teclado:

' Cambia el estado de Bloq Mayús

	DEF SEG = 0

	Estado% = PEEK(&H417)		' Lee el estado del teclado
	POKE &H417, (Estado% XOR &H40)	' Cambia el estado del Bloq Mayús, bit 6
END

Volver al principio de página

volver a Inicio