|
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.
![]() |
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 |
![]() |
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 |
![]() |
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:
- dirección es la posición de memoria relativa a la dirección del segmento actual, establecida por DEF SEG (dirección es un entero: 0-65.535)
- valor es el byte (0-255) que se lee de la memoria.
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 |
![]() |
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 |