Mensaje
por thEpOpE » 05 Dic 2016, 00:32
El spectrum tiene 4 canales por defecto: K,S,R y P. K es el teclado (las dos líneas inferiores de pantalla). S es la pantalla. R es el espacio de trabajo (a partir del modelo +2A se llama X), y P es el canal de la impresora.
Al reiniciarse el sistema, las variables de sistema se inicializan de tal modo que la variable CHANS (23631) contiene la dirección donde se guardarán los datos de los canales. Inicialmente se sitúan justo después de las variables de sistema, y justo antes de donde se almacena el programa Basic. Inicialmente estos datos están en 23734.
Cada canal tiene 5 bytes: 2 bytes para la dirección de la rutina que gestiona la salida de datos por el canal, 2 bytes para la dirección de la rutina que gestiona la entrada de datos por el canal, y 1 byte que identifica con una letra el canal. El spectrum puede gestionar hastar 16 canales, que se pueden abrir y cerrar con OPEN y CLOSE; y por los que se puede hacer PRINT, INPUT y LIST. Por defecto si no pones canal a PRINT se entiende que va a la pantalla. Por defecto si no pones canal a INPUT se entiende que es por teclado.
Inicialmente las rutinas que se usan para pantalla son:
salida (almacenada en 23739 inicialmente) = 2548 (0x09F4)
entrada (almacenada en 23741 inicialmente) = 5572 (0x15C4)
Estas subrutinas en la ROM se corresponden con: PRINT-OUT, y con REPORT-J
Esta última realmente es una llamada al manejo de errores, imprimiendo un error de "J - Invalid I/O device".
Después de todos los datos de los canales, hay un byte que identifica el final (ya que puede haber más canales abiertos). El identificar de final es 128 (0x80).
Realmente estos datos, en una inicialización, son una copia de lo que hay en rom, a partir de 0x15AF.
El truco del Poke 23739, 111. Hecho después de una inicialización del sistema es más que suficiente, pero habría que asegurarse que no se haya cambiado la variable de sistema CHANS. La idea de ese poke, es que cambiando un solo byte se pueda apuntar a una rutina que no haga PRINT-OUT, sino que apunte a RET. Al poner ahí un 111,a la rutina de salida del canal 'S' (pantalla) apunta a 0x096F, que en distancia es el RET más cercano, y que corresponde al RET de salida de la rutina ME-ENTER. Desde luego es la forma más rápida y más inteligente de "apagar" el comando PRINT.
El otro truco que te digo es prefijar el nombre del programa con caracteres de control.
CHR$ 8 = cursor a la izquierda
CHR$ 6 = coma de PRINT
CHR$ 22 = AT
CHR$ 23 = TAB
Prueba este trozo:
10 CLS: PRINT "prueba:";
20 LET a$=CHR$ 22 + CHR$ 0 +CHR$ 0 + "ayy"+CHR$ 6
30 PRINT a$