CC51B - Arquitectura de Computadores : Tarea #4
El ZX Spectrum 48K
por Denis Fuenzalida

( Introducción / Lenguaje de Máquina / Interrupciones / Memoria / Canales / Punto Flotante )


Canales y Streams

Introducción

El Spectrum tiene un sistema sorprendentemente moderno de I/O, si consideramos el año en que fue construido. De cualquier forma, lo más sorprendente es que de hecho, el manual de usuario del Spectrum apenas menciona lo que es posible de hacer.

El I/O en el Spectrum está basado en canales y streams. Debido a que el Spectrum típico tenía un rango limitado de dispositivos de I/O, entonces tiene sentido que tuviera diferentes comandos para cada dispositivo de I/O. Por ejemplo, PRINT se usa para mandar output a pantalla, mientras que LPRINT se usa para mandar output a la impresora.

Los dispositivos extra provistos por la Interface 1 (microdrives, RS232-C, y red), redujeron lo práctico de continuar creando nuevos comandos, aunque se hizo en el caso de los microdrives.

Los Streams y Canales corresponden intuitivamente a los ports de I/O por software y hardware, respectivamente. Así un Stream debe ser pensar tan solo con un conjunto de datos yendo o viniendo de un periférico y un canal debe ser asociado con un periférico, como la impresora. En el Spectrum, los canales están enumerados del 0 al 15, y sus operaciones básicas son el leer y escribir datos.

La sentencia BASIC: INPUT #s; <input-list> leerá datos del stream s, con s entre 0 y 15, entre las variables especificadas en la lista de inputs posibles. Inversamente, en BASIC, la sentencia PRINT #s <print-list> escribirá en el stream s. En general, ambas instrucciones (INPUT # y PRINT #) pueden ser usadas en las misma forma que sus contrapartes INPUT y PRINT.

En particular, toda las formas complejas de una sentencia PRINT pueden ser usadas de la misma forma en una sentencia PRINT #. El caso de los datos enviados a un stream, es exactamente el mismo en el que los datos pueden ser mandados a la pantalla con PRINT. La sentencia INPUT # es visiblemente más compleja, dado que puede leer y escribir datos, como en ``INPUT "Cual es tu nombre? "; A$ ´´. En efecto, cada stream tiene en realidad 2 componentes, un steam de entrada y uno de salida.

Abrir y Cerrar

¿ Cómo saber que números de streams están asociados con cuál canal ?

Antes de usar un stream, este debe ser abierto via OPEN. El abrir un stream sirve para 2 propósitos: Asocia el stream dado con un trozo particular de Hardware (el canal), y realmente señala el dispositivo relevante que va a ser usado. Los streams pueden abrirse en BASIC usando la sintaxis OPEN #s, c , donde 's' es el número del stream que está siendo abierto y c es un string especificando el canal asociado al stream. Después de este comando, todo lo que sea enviado por el stream 's' irá a dar al canal especificado. Es posible abrir varios streams hacia el mismo dispositivo, pero solo un canal puede ser asociado con solo un stream.

Un Spectrum sin expandir soporta 4 canales: "K" para el canal del teclado, "S" para la pantalla, "P" para la impresora y "R", que es un canal interno para mandar datos al buffer de edición de comandos. En la práctica el único canal que tenía tanto entrada como salida de los anteriores es el teclado. En la primera expansión que se hizo, los siguientes canales se abrían en el booteo del Spectrum: 0->K", 1->K", 2->"S", 3->"P". Con esto el comando LPRINT es en realidad una alternativa a escribir PRINT #3. El canal "R" no puede ser abierto desde el intérprete de BASIC. Es posible redefinir los canales estándar, así OPEN #2,"P" causará que la salida que normalmente se mandaría a la pantalla sea redireccionada a la impresora.