Canales Extendidos del +3e

Se ha ampliado el sistema de flujos y canales del +3e y ahora es posible abrir flujos a canales distintos de los tres canales estándar usando el comando OPEN #

La sintaxis del comando OPEN # junto con otros nuevos comandos de flujos y canales se muestra en la sección de comandos del +3e; aquí se examinarán los canales propiamente dichos y cómo pueden ser utilizados.

__________________________________________________________________

Canales de fichero

Se pueden abrir flujos a cualquier fichero +3DOS (en disquete o disco duro) en uno de los tres diferentes modos de acceso: entrada (usando el canal "I>"), salida (usando el canal "O>") y actualización (usando el canal "U>"). Si no se da ningún especificador de canal, entonces se asume que el nombre de canal será del tipo de un fichero de modo entrada, así que es posible omitir "I>" (esto no funcionará si el nombre del fichero sólo tiene un carácter de longitud).

En los modos de entrada y actualización el fichero debe existir previamente u ocurrirá un error. En modo salida, el fichero es borrado si existe previamente y se creará un nuevo fichero. Una vez el fichero es abierto, puede escribirse en él (si es abierto en modo entrada o actualización) o leer de él (si es abierto en modo salida o actualización). Debido a la existencia de un buffer de fichero, es esencial cerrar con CLOSE # cualquier canal de fichero antes de acabar, ya que de otro modo se pueden perder datos.

Los canales de fichero soportan todos los comandos de punteros (RETURN #, GOTO # y DIM #).

Debe tenerse en cuenta que los ficheros de +3DOS siempre se almacenan como un número de "registros" de 128 octetos, de esta forma puede que se lea basura al final del fichero si su longitud no es un múltiplo exacto de 128. Para evitar este problema, se debe escribir algún código o "firma" al final del fichero que se pueda detectar cuando se vuelva a leer. Alternativamente, puedes escribir en el comienzo del fichero la cantidad de octetos o entradas que tiene.

Ejemplos

OPEN #4, "o>prueba.txt"
Crea un fichero llamado "prueba.txt" en la unidad por defecto para leer a través del flujo 4.
OPEN #5, "a:prueba2.txt">
Abre un fichero llamado "prueba2.txt" en la unidad A: para escribir a través del flujo 5.

__________________________________________________________________

Canales de variable

El canal "V>" puede utilizarse para dirigir la salida o la entrada de una variable de cadena, la cual puede ser fácilmente manipulada desde un programa BASIC. Esto te permite (por ejemplo) examinar un catálogo de disco en tu programa BASIC, o hacer una demo auto-ejecutable de un juego (leyendo de una cadena que contiene un conjunto de pulsaciones de teclas).

La cadena especificada debe ser un array de carácteres de dimensión única, suficientemente grande para albergar la máxima cantidad de datos que esperas tener que manejar.

Los canales de variable soportan todos los comandos de punteros.

Ejemplo

Éste es un programa de ejemplo que muestra una lista de asignaciones a una cadena.

    10 DIM a$(1000)
    20 OPEN #8, "V>a$"
    30 CAT #8 ASN
    40 RETURN #8, l
    50 PRINT "Longitud de la asignacion: ";l
    60 PRINT "La lista es:"
    70 PRINT a$( TO l)
    80 CLOSE #8

__________________________________________________________________

Canales de memoria

El canal "M>" puede ser utilizado de forma similar a los canales de variable. Sin embargo, como es una región de memoria fija, es más apropiado para su uso en programas escritos en código máquina.

Ejemplo

Éste es un programa de ejemplo que escribe un catálogo de disco en memoria y luego ejecuta una rutina en código máquina para procesarlo:

    10 CLEAR 29999
    20 OPEN #7, "M>30000,1000"
    30 CAT #7
    40 LET x=USR mirutina
    50 CLOSE #7

__________________________________________________________________

Canales de ventana

Los canales de ventana "W>" son los más complejos de todos los canales extendidos disponibles actualmente en el +3e. Aunque son sólo de salida y no soportan ninguno de los comandos de punteros, son extremadamente flexibles ya que aceptan un gran número de "códigos de control".

Las ventanas están definidas por su línea superior (0-23), columna más a la izquierda (0-31), altura (1-24), anchura (1-32), y opcionalmente el tamaño de los caracteres (3-8) y la dirección del juego de caracteres. Si no se especifica el tamaño de caracteres, se toma 8 por defecto. Si se da una dirección de juego de caracteres ésta es utilizada en lugar de la tipografía predeterminada; esto te permite utilizar bonitas fuentes como las que vienen en programas de dibujo o juegos de aventuras.

Ten en cuenta que el tamaño de los caracteres no influye en la forma en que la ventana es definida, pero sí afecta al número de columnas que tienes disponibles. Por ejemplo, lo siguiente define una ventana del tamaño de la pantalla completa; pero como se ha especificado un tamaño de caracteres de 5, el número de caracteres que pueden imprimirse en la ventana al mismo tiempo es de 24x51:

OPEN #5,"w>0,0,24,32,5"

Cuando se hace PRINT a una ventana, puedes usar la mayoría de las funciones de control que se utilizan con la pantalla normal. Por ejemplo: ' (apóstrofe; comienzo de una nueva línea), , (coma; comienzo de una nueva columna), TAB, AT, INK , PAPER, FLASH, BRIGHT , INVERSE, OVER. De todos estos, tan solo AT se comporta de forma algo distinta: coge 'y' como una linea de pixel y 'x' como una columna de carácter.

Cuando se definen por primera vez, las ventanas están en modo no-justificado, pero luego pueden justificarse a la izquerda, al centro o al completo. Ten en cuenta que en modo justificado no se puede acceder a algunas características y códigos de control, así que tal vez necesites volver al modo no-justificado para poder usarlas.

A continuación sigue una lista completa de códigos de control; estos códigos pueden enviarse a una ventana haciendo PRINT usando la función CHR$. Si un código va precedido de (j) será ignorado si se envía en modo justificado (sin embargo, la configuración será tenida en cuenta; por ejemplo, puedes justificar texto de double anchura , pero debes ponerlo antes de entrar en modo justificado). Si un código va precedido de (e) entonces sólo puede usarse en modo justificado si la característica de "códigos embebidos" ha sido activada; si no, puede tener resultados impredecibles (seguramente esto será corregido en el futuro).

0
Desactivar justificación.
1
Activar justificación.
2
Salvar el contenido actual de la ventana.
3
Restaurar el contenido previamente salvado.
4
Poner cursor arriba a la izquierda.
5
Poner el cursor abajo a la izquierda.
(j) 6
Tabular a la izquierda o al centro de la ventana (PRINT coma).
7
Desplazar ventana.
(j) 8
Mover el cursor hacia la izquierda.
(j) 9
Mover el cursor hacia la derecha.
10
Mover el cursor hacia abajo.
11
Mover el cursor hacia arriba.
(j) 12
Borrar el carácter a la izquierda del cursor.
13
Empezar una nueva línea (PRINT apóstrofe).
14
Limpiar la ventana con los atributos actuales.
15
Pintar la ventana con los atributos actuales.
(e) 16, n
Establecer INK n (0-7).
(e) 17, n
Establecer PAPER n (0-7).
(e) 18, n
Establecer FLASH n (0-1).
(e) 19, n
Establecer BRIGHT n (0-1).
(e) 20, n
Establecer INVERSE n (0-1).
(e) 21, n
Establecer OVER n (0-1).
(j) 22, y, x
Poner el cursor en la línea de pixel 'y', columna de carácter 'x'.
(j) 23, n
TABular a la columna de carácter n.
(e) 24, n
Establecer atributos a n (0-255).
(j) 25, n
Si n=1, los caracteres 165-255 serán impresos como GDUs, con los datos situados al final de los GDU estándar. Si n=0, los caracteres 165-255 seránimpresos como palabras BASIC (el valor por defecto).
(e) 26, n
Rellenar ventana con el octeto n. Afecta a los atributos pero no a la posición del cursor.
(e) 27, n
Rellenar ventana con el carácter n. Afecta a los atributos y a la posición del cursor.
(j) 28, n
Establecer ancho doble (n=1) o normal (n=0).
(e) 29, n
Establecer altura n (0=normal, 1=doble, 2=reducida, 3=doble reducida).
30, n
Establecer el modo de justificación (0=izquierda, 1=centrado, 2=completa).
(j) 31, n
Permitir códigos embebidos en modo justificado si n=1.

Ejemplos

El programa demostración siguiente muestra algunas de las características de los canales de ventana, y es una buena fuente de ejemplos de su uso:

__________________________________________________________________

Volver a la página principal del ZX Spectrum +3e