Recuperar gráfico de pantalla tras la carga

Moderador: Fundadores

Avatar de Usuario
Bubu
Demonio segundo orden
Demonio segundo orden
Mensajes: 1125
Registrado: 02 May 2013, 20:35

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por Bubu »

Te pongo cómo sería para cargar 3 pantallas, tú lo extiendes ya a más (hasta 6 como máximo):

Código: Seleccionar todo

10 LOAD "" CODE 24000, 6912
20 LOAD "" CODE 30912, 6912
30 LOAD "" CODE 37824, 6912
... etc ...
100 RESTORE 110: FOR N=0 to 11: READ A: POKE 23900+N, A: NEXT N
110 DATA 17, 0, 64, 33, 0, 0, 1, 0, 27, 237, 176, 201
120 LET K$=INKEY$: IF K$="" THEN GOTO 120
210 IF K$="1" THEN LET A=192: LET B=93
220 IF K$="2" THEN LET A=192: LET B=120
230 IF K$="3" THEN LET A=192: LET B=147
... etc ...
300 POKE 23904, A: POKE 23905, B
310 RANDOMIZE USR 23900
320 GOTO 120
Básicamente (nunca mejor dicho, jiji) lo que se hace es cargar primero las N pantallas y almacenarlas en direcciones diferentes. La rutina del código máquina es lamisma, pero según la tecla que pulses se modifica dicha rutina para que mustre la pantalla que hay en una dirección u otra. Con la tecla 1 se muestra la pantalla que se cargó primero, y así respestivaménete.
Si algo funciona... no lo toques. ¡¡Pero ni de coña!!
Avatar de Usuario
Fermars
Demonio segundo orden
Demonio segundo orden
Mensajes: 1195
Registrado: 20 Feb 2014, 16:58
Ubicación: El Escorial
Been thanked: 3 times

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por Fermars »

Bubu escribió:Efestivaménete lo de LOAD "" CODE 40000 lo omití queriendo pa ver si tú te dabas cuén, AJAJAJJA

(qué va, se me olvidó, vaya, AJJAjaJAJAAJ, enhorabuena por descubrirlo, eso sisnifica que sabes de qué va todo esto :-) )
No se programar, pero estoy acostumbrado a ver código y programas de todo tipo (C++, PHP,...) y generalmente se leerlo e interpretarlo más o menos. No se exactamente qué hace el bucle FOR NEXT que has puesto y tampoco se qué hace el comando RESTORE o el READ, aunque para eso está el maravilloso manual del ZX Spectrum (que nunca llegué a leer ;-) je jejeje.)

Intentaré el código que me has dejado (gracias!) mañana, que hoy se me ha hecho tarde.
De todas formas, como me pica el gusanillo intento entender por qué la línea 310 llama únicamente a la dirección 23900, cuando lo que se pretende es llamar a esa y otras direcciones cada vez. Me esperaba una variable en esa línea no una dirección fija...

Saludos.
Fernando
Avatar de Usuario
elfoscuro
Demonio segundo orden
Demonio segundo orden
Mensajes: 1825
Registrado: 01 Abr 2013, 22:00
Been thanked: 25 times

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por elfoscuro »

Fermars escribió: En las páginas de MH habla de que incluso haciendo NEW la pantalla permanece, aunque en este caso a mi no me funciona, pero bueno, esto no es problema.

Saludos.
A ver, el problema que tienes ahí es que no haces CLEAR. Si todo lo estás cargando (pantallas y código máquina) a partir de la dirección 40000, pon al principio del todo CLEAR 39999.

NEW lo que hace es borrar todo hasta la dirección apuntada por CLEAR, que si no lo has usado en tu programa apunta la dirección 65536-168 (el tope de la memoria menos los 168 bytes de los 21 UDG). Si tú haces CLEAR creas una "zona protegida".

En general es buena idea crear esa zona, porque te puede pasar que metas las pantallas a partir de la 25000, y el BASIC conforme vayas ampliando el programa, machaque parte de los datos, al llegar más allá de la 25000. Si pones CLEAR 24999, el BASIC no podrá "invadir" esa zona y el Spectrum te dará un error de falta de memoria.

Si te fijas en los listados de MH que contienen bloques de datos (aparte de los UDG, como por ejemplo, un nuevo juego de caracteres, o rutinas en código máquina) siempre contienen casi como primera instrucción del programa, un CLEAR. Es por esta razón, para crear la "memoria protegida" al BASIC.

Un saludo.
Fin de impresión
Avatar de Usuario
Fermars
Demonio segundo orden
Demonio segundo orden
Mensajes: 1195
Registrado: 20 Feb 2014, 16:58
Ubicación: El Escorial
Been thanked: 3 times

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por Fermars »

Bubu escribió:Te pongo cómo sería para cargar 3 pantallas, tú lo extiendes ya a más (hasta 6 como máximo):

Código: Seleccionar todo

10 LOAD "" CODE 24000, 6912
20 LOAD "" CODE 30912, 6912
30 LOAD "" CODE 37824, 6912
... etc ...
100 RESTORE 110: FOR N=0 to 11: READ A: POKE 23900+N, A: NEXT N
110 DATA 17, 0, 64, 33, 0, 0, 1, 0, 27, 237, 176, 201
120 LET K$=INKEY$: IF K$="" THEN GOTO 120
210 IF K$="1" THEN LET A=192: LET B=93
220 IF K$="2" THEN LET A=192: LET B=120
230 IF K$="3" THEN LET A=192: LET B=147
... etc ...
300 POKE 23904, A: POKE 23905, B
310 RANDOMIZE USR 23900
320 GOTO 120
Básicamente (nunca mejor dicho, jiji) lo que se hace es cargar primero las N pantallas y almacenarlas en direcciones diferentes. La rutina del código máquina es lamisma, pero según la tecla que pulses se modifica dicha rutina para que mustre la pantalla que hay en una dirección u otra. Con la tecla 1 se muestra la pantalla que se cargó primero, y así respestivaménete.
Hola Bubu, tras cargar las 3 pantallas me da un error de "Integer out of range 100:4". Comentas que la rutina de código máquina es la misma, pero los valores de DATA del primer listado no son iguales. Si dejo los mismos valores que antes, entonces me da un Out of memory 100:3 (o algo así). Tampoco estoy seguro que los POKES tengan las direcciones bien definidas ¿podrías echarle un vistazo?
Fernando
Avatar de Usuario
elfoscuro
Demonio segundo orden
Demonio segundo orden
Mensajes: 1825
Registrado: 01 Abr 2013, 22:00
Been thanked: 25 times

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por elfoscuro »

Revisa la línea 110. Seguro que te has comido una coma (un clásico copiando listados MicroHobby ;-) ).

Por cierto, prueba este listado:

Código: Seleccionar todo

1 CLEAR 23899
2 LET BASE=24000: LET PANTALLAS=3
3 FOR N=0 TO PANTALLAS-1
10 LOAD "" CODE BASE+6912*N,6912
20 NEXT N

100 RESTORE 110: FOR N=0 to 11: READ A: POKE 23900+N, A: NEXT N
110 DATA 17, 0, 64, 33, 0, 0, 1, 0, 27, 237, 176, 201

120 LET TECLA=CODE INKEY$-48:IF TECLA<1 OR TECLA>PANTALLAS THEN GO TO 120

300 POKE 23904, BASE-INT((BASE+6912*(TECLA-1))/256)*256
305 POKE 23905, INT((BASE+6912*(TECLA-1))/256)
310 RANDOMIZE USR 23900

320 GOTO 120
Y dime si te funciona. Lo he escrito en el notepad y no lo he probado, pero debería funcionar. Si quieres cargar más pantallas (hasta 6) debes cambiar el valor de PANTALLAS en la línea 2.

He intentado hacerlo lo más genérico posible, para que no tengas que cambiar nada más que eso. Si quieres cargar directamente una pantalla, sólo has de calcular cuando valen A y B, cambiando BASE por el valor que te devuelva BASE+6912*N (siendo la BASE en esta fórmula 24000, es decir 24000+6912*(PANTALLA-1)). Ejemplo:


120 LET BASE=24000*6912*1: CARGA SEGUNDA PANTALLA
300 POKE 23904, BASE-INT((BASE/256)*256
305 POKE 23905, INT(BASE/256)
310 RANDOMIZE USR 23900


Esto si lo quieres meter en algún programa. Recuerda que también necesitarías la carga del código máquina, líneas 100 y 110.

Un saludo.
Fin de impresión
Avatar de Usuario
elfoscuro
Demonio segundo orden
Demonio segundo orden
Mensajes: 1825
Registrado: 01 Abr 2013, 22:00
Been thanked: 25 times

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por elfoscuro »

Por cierto... haciendome un poco de publi ;-)

Si quieres el listado de la rutina de compresión de pantallas que te puse más arriba, puedes bajarlo de mi página:

http://kyenter.speccy.org/principl.php? ... evista=208

Por si te atreves. Leyendo el artículo parece bastante sencillo. Imagino que cuando termine la compresión, te dará cúanto ocupa en total, y tendrías que ir guardando esos datos para ir "metiendo" una pantalla detrás de otra en RAM.

Un saludo.
Fin de impresión
Avatar de Usuario
Bubu
Demonio segundo orden
Demonio segundo orden
Mensajes: 1125
Registrado: 02 May 2013, 20:35

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por Bubu »

Fermars escribió: Hola Bubu, tras cargar las 3 pantallas me da un error de "Integer out of range 100:4"
Tiene que ser que no has separado con una coma algo. Chequea que tengas 12 números separados por coma.
Si algo funciona... no lo toques. ¡¡Pero ni de coña!!
Avatar de Usuario
Fermars
Demonio segundo orden
Demonio segundo orden
Mensajes: 1195
Registrado: 20 Feb 2014, 16:58
Ubicación: El Escorial
Been thanked: 3 times

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por Fermars »

elfoscuro escribió:Revisa la línea 110. Seguro que te has comido una coma (un clásico copiando listados MicroHobby ;-) ).

Por cierto, prueba este listado:

Código: Seleccionar todo

1 CLEAR 23899
2 LET BASE=24000: LET PANTALLAS=3
3 FOR N=0 TO PANTALLAS-1
10 LOAD "" CODE BASE+6912*N,6912
20 NEXT N

100 RESTORE 110: FOR N=0 to 11: READ A: POKE 23900+N, A: NEXT N
110 DATA 17, 0, 64, 33, 0, 0, 1, 0, 27, 237, 176, 201

120 LET TECLA=CODE INKEY$-48:IF TECLA<1 OR TECLA>PANTALLAS THEN GO TO 120

300 POKE 23904, BASE-INT((BASE+6912*(TECLA-1))/256)*256
305 POKE 23905, INT((BASE+6912*(TECLA-1))/256)
310 RANDOMIZE USR 23900

320 GOTO 120
Y dime si te funciona. Lo he escrito en el notepad y no lo he probado, pero debería funcionar. Si quieres cargar más pantallas (hasta 6) debes cambiar el valor de PANTALLAS en la línea 2.
......
Hola elfoscuro, gracias por los listados y los consejos. Que no parezca que no hago ni caso a las respuestas que ponéis por aquí pero es que ando bien chungo de tiempo. El caso es que a ratos he pasado el listado en Spectaculator (eprom de 48K),no me he podido sentar delante del Spectrum real, lo he repasado bien y al ejecutarlo me da "M RAMTOP NO GOOD 1:1.". Aunque me hubiera equivocado en algo, el programa no pasa de la línea 3 al principio, así que el Clear por alguna razón no se ejecuta. En fin, borro la línea 1 y tiro pa lante. Cargo la primera pantalla del primer juego (flight simulator de psion) para que quede almacenada y tras la carga me da un "Variable not found 20:1" y al volver al listado me encuentro esto:

Imagen

A partir de ahí no puedo seguir.
De verdad espero no estarme equivocando al teclear el listado, no quiero parecer un paquetón!
Fernando
Avatar de Usuario
Sinclair
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3101
Registrado: 04 Jul 2013, 23:42

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por Sinclair »

Utiliza como base un valor distinto a 24000 ya que el programa al escribir los Datas está machacando la zona de memoria donde el mismo se almacena y de ahí que se corrompa y te de un error el interprete.
Imagen
Avatar de Usuario
elfoscuro
Demonio segundo orden
Demonio segundo orden
Mensajes: 1825
Registrado: 01 Abr 2013, 22:00
Been thanked: 25 times

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por elfoscuro »

Exacto, me estaba temiendo algo así... estamos jugando con una dirección muy baja de la RAM, y casi no cabe (bueno, sin casi ;-) ) el listado BASIC.

Puedes hacer dos cosas:

- Cambiar todos los números por valores de cadena. Esto sería cambiar todos los números por VAL "número" (ejemplo: 34 por VAL "34").
- Reducir una pantalla (tendrías maximo 5 en lugar de 6), por lo que podrías cambiar el CLEAR 23999 por CLEAR 25999 y BASE=24000 por BASE=26000.

Cualquiera de las dos opciones serviría, aunque no tengo claro que podamos ahorra el espacio de BASIC suficiente (pero lo puedes intentar). La segunda opción es ir a lo seguro, incluso puedes cambiar el CLEAR y BASE por valores más cercanos a 30000 si quieres.

Un saludo.
Fin de impresión
Responder

Volver a “Sinclair”