Pregunta sobre carga de pantalla Spectrum

Responder
Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Pregunta sobre carga de pantalla Spectrum

Mensaje por yombo » 28 Nov 2016, 18:50

Hola,

Esta es una pregunta genérica de Spectrum, en su modo gráfico normal.

Quiero hacer un programa en que se cargue primero la pantalla de carga y luego el código, y que la pantalla se conserve. Pero se imprime el "bytes: code" al inicio de la carga del código, machacando esa parte de la pantalla. Me gustaría saber cómo se puede evitar esto, si se puede.

Este es el cargador:

Código: Seleccionar todo

10 CLEAR VAL "32767": LOAD "" SCREEN$ : LOAD "" CODE : RANDOMIZE USR VAL "32768"

Avatar de Usuario
antoniovillena
Mensajes: 2621
Registrado: 27 Sep 2015, 20:41

Re: Pregunta sobre carga de pantalla Spectrum

Mensaje por antoniovillena » 28 Nov 2016, 18:55

Hay un poke para eso, pero no sé cuál es. Yo suelo usar cargadores en ensamblador que no muestran nada por pantalla y son muy sencillos.

Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: Pregunta sobre carga de pantalla Spectrum

Mensaje por yombo » 28 Nov 2016, 19:02

Ok, gracias.

Creo que optaré por tener la pantalla embebida en el código y mostrarla en cuanto se ejecute éste.

Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: Pregunta sobre carga de pantalla Spectrum

Mensaje por yombo » 28 Nov 2016, 19:05

Oh! He encontrado el poke que decías, es éste:

Código: Seleccionar todo

POKE 23739,111
Más sencillo así ;-)

Zup
Mensajes: 112
Registrado: 16 Sep 2016, 20:22

Re: Pregunta sobre carga de pantalla Spectrum

Mensaje por Zup » 28 Nov 2016, 19:15

¡Cuidado!

Ese POKE modifica la rutina de impresión (no exactamente) y provoca que luego no se puedan imprimir textos en pantalla, a menos que:
- Restaures el valor original.
- Hagas un CLEAR (que restaurará todo a su valor y borrará la pantalla).
- No utilices las rutinas de la ROM para imprimir los textos.

Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: Pregunta sobre carga de pantalla Spectrum

Mensaje por yombo » 28 Nov 2016, 20:23

Ok, gracias, lo tendré en cuenta. No necesito imprimir con rutinas de rom.

thEpOpE
Mensajes: 41
Registrado: 10 Oct 2016, 21:35

Re: Pregunta sobre carga de pantalla Spectrum

Mensaje por thEpOpE » 04 Dic 2016, 20:41

Ese pone modifica la rutina del canal de salida en pantalla a una dirección que contiene la instrucción RET, con lo que la rutina de impresión no hará nada. Como te han dicho es necesario preservar el valor de esa variable del sistema. Un truco que se usaba a veces era usar un nombre de programa con caracteres especiales al inicio, de tal modo que el nombre se emprime encima de "Programa:" y "Bytes:". Se pueden añadir caracteres de retorno de carro, de tabulador, de control AT, de color, etc...

Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: Pregunta sobre carga de pantalla Spectrum

Mensaje por yombo » 04 Dic 2016, 22:21

Pues es curioso, porque aún usando el poke, he podido imprimir cadenas de debug. O sea que o bien z88dk reinicializa el stream, o bien está usando rutina propias. Ni idea :P

thEpOpE
Mensajes: 41
Registrado: 10 Oct 2016, 21:35

Re: Pregunta sobre carga de pantalla Spectrum

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$

Avatar de Usuario
yombo
Mensajes: 487
Registrado: 05 Oct 2015, 14:10

Re: Pregunta sobre carga de pantalla Spectrum

Mensaje por yombo » 05 Dic 2016, 00:51

Gracias por el otro truco, pero no me hará falta, con el poke es suficiente y puedo seguir imprimiendo.

Responder