Recuperar gráfico de pantalla tras la carga

Moderador: Fundadores

Responder
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

Recuperar gráfico de pantalla tras la carga

Mensaje por Fermars »

Hola a todos, siempre he tenido la duda, a ver si me lo podéis resolver.
Si cargamos un gráfico de un juego (con carga normal) con LOAD""CODE o SCREEN$ (no se muy bien la diferencia, lo que se es que carga), al terminar y mostrar el típico 0 OK, 10:1 o similar, tenemos el gráfico en pantalla pero si pulsamos una tecla desaparece. Pero ¿realmente desaparece de la memoria?¿No podemos volver a mostrarlo y/o imprimirlo aunque no se muestre? Quizá se pueda llamar a la parte de la memoria donde se supone que se ha guardado y mostrarlo o imprimirlo pero sinceramente no se si es posible. Gracias!
Fernando
Avatar de Usuario
flopping
Fundador
Fundador
Mensajes: 9973
Registrado: 29 Mar 2013, 15:26
Ubicación: Valencia
Been thanked: 124 times
Contactar:

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por flopping »

No se puede y te explico el por que, cuando cargas una pantalla con load""screen$, esta se empieza a carga en una posicion conocida, que es donde vemos lo que el ordenador esta haciendo, esa es la memoria de visualizacion, si te das cuenta, la pantalla se va viendo conforme se carga y al acabar de cargarse, se queda en esa memoria, pero en el momento que algo se ejecuta, como un mensaje de fin de carga, o pulsar teclas para hacer cualquier cosa, se produce un borrado de esa memoria de visualizacion, para poder mostrar lo nuevo que estamos haciendo o escribiendo, por lo que esa pantalla cargada se ha borrado.

Ahora bien, si la pantalla la cargas con load""code, indicando una direccion y la longitud, por ejemplo load"" code 25000,6198 , no veras cargar nada, ya que esas posiciones de memoria estan fuera de la memoria de visualizacion, luego podras volver a salvar esa pantalla que si que esta en memoria y no se ha borrado, con la instruccion save""code 25000,6198, si haces load""code 16384, 6198 es lo mismo que hacer load""screen$, ya que la memoria de visualizacion empieza en 16384 y llega hasta 6198 bytes mas alla, o sea 22582, mas o menos, aunque ahora mismo no recuerdo exactamente los valores, pero no se iran mucho mas.

En conclusion, si quieres cargar una pantalla y grabarla acto seguido, sin que se borre nada por mensajes, puedes hacer lo siguiente, load""screen$;save""screen$, esto salvaria la pantalla una vez cargada, quiza(seguro) necesites un tiempo para cambiar de cinta o asi, por lo que habria que poner una pausa entre medio, load""screen$;pause 10;save""screen$, bueno, creo que mas o menos te he explicado el concepto, ¿no se si te ha quedado claro?.

Resumiendo, todo lo que se meta en memoria de pantalla, sera borrado cuando se ejecute algo que se tenga que ver en pantalla, y para conservarlo, hay que meterlo en memoria normal y no e pantalla, evidentemente, no hay que sobreescribir en esa memoria, si no, ......... jajajajaja.....
No me hago responsable de mis post pues estan escritos bajo la influencia del alcohol y drogas psicotropicas, por la esquizofrenia paranoide.
(C) 1982-2024, 42 años de ZX Spectrum.
http://www.va-de-retro.com/ un foro "diferente".

Mi juego, que puedes descargar desde aqui
Avatar de Usuario
elfoscuro
Demonio segundo orden
Demonio segundo orden
Mensajes: 1831
Registrado: 01 Abr 2013, 22:00
Been thanked: 26 times

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por elfoscuro »

Añadir a lo que dice Flopping que la memoria de pantalla son 6912 bytes ;-)

Mírate este link:

http://microhobby.speccy.cz/mhf/048/MH048_28.jpg
http://microhobby.speccy.cz/mhf/048/MH048_29.jpg

Aquí explican un poco el tema.

LOAD""SCREEN$ es una abreviación de LOAD""CODE 16384,6912. Si la pantalla se grabó con SAVE"NOMBRE"SCREEN$, al hacer LOAD""CODE, verás la pantalla, pero eso no siempre funciona. El porqué es sencillo: la gente usaba para editar pantallas programas más o menos complejos, al estilo PAINT de Windows, y que guardaban la pantalla en direcciones más altas de la RAM precisamente para no perderla. Si un programa tenía la pantalla guardada en la dirección 40000 de la RAM, al hacer SAVE "NOMBRE" CODE 40000,6912, grabaría una pantalla que se cargaría perfectamente con LOAD""SCREEN$, pero no con LOAD""CODE, ya que CODE, si no pones nada, usa los datos del SAVE, mientras que SCREEN$ ignora esos datos y usa siempre 16384,6912.

En el artículo que te he puesto, lo que se hace es cargar la pantalla en la memoria "de datos" y no en la de video. Luego usa un pequeñó programa en código máquina, que viene a ser el equivalente a:

10 FOR f=0 TO 6911: POKE 16384+F,PEEK 58456+f:NEXT F

Sólo que muuuucho más rápido al ser código ensamblador.

Leete las dos páginas de la microhobby y te aclarará cosas sobre el spectrum.

Que gran revista era la Microhobby, ¡leche!

Un saludo.
Fin de impresión
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 »

elfoscuro escribió:
Que gran revista era la Microhobby, ¡leche!
Cierto, porque era "La Revista". Ahí esperando todas las semanas a que llegara el miércoles para correr a los carrillos a comprarla, jejeje

Saludos.
Imagen
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 »

Gracias por las respuestas. Pensaba que nadie había respondido porque estaba esperando un email de confirmación pero no recibí nada (la casilla de recibir respuestas está marcada en el foro), así que no se que pasa.
Bueno, entré para ver qué pasaba y he visto que habéis contestado con todo lujo de detalles, muchas gracias.

No obstante quería aclarar que mi intención no es grabar la pantalla en cinta, lo que ha dicho flopping de cargar y guardar acto seguido lo he hecho muchas veces. Me ha quedao claro que todo lo que sea cargar en memoria de pantalla, lo siguiente que haya que mostrar lo machaca, eso está claro y es lógico. Lo que yo quería saber es si puedo cargar una pantalla (aunque no se muestre) en alguna dirección de memoria y aunque siga trabajando con el Spectrum, mientras no machaque ese área nuevamente, ¿podría visualizarla en cualquier momento con algún programa? Es algo así como guardar la pantalla en un área temporal y cuando quiera verla, "llamarla" con algún comando. Esto es pura curiosidad, no es que tenga ningún proyecto ni nada parecido porque soy nulo en código máquina y en todo lo relativo a la teoría del funcionamiento interno Spectrum.
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 »

No existe ningún.comando ni instrucción nativos para hacer lo que quieres, para conseguirlo tendrias que hacer una rutina en Basic o código máquina tal y como te han indicado.
Imagen
Avatar de Usuario
elfoscuro
Demonio segundo orden
Demonio segundo orden
Mensajes: 1831
Registrado: 01 Abr 2013, 22:00
Been thanked: 26 times

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por elfoscuro »

Fermars escribió:Gracias por las respuestas. Pensaba que nadie había respondido porque estaba esperando un email de confirmación pero no recibí nada (la casilla de recibir respuestas está marcada en el foro), así que no se que pasa.
Bueno, entré para ver qué pasaba y he visto que habéis contestado con todo lujo de detalles, muchas gracias.

No obstante quería aclarar que mi intención no es grabar la pantalla en cinta, lo que ha dicho flopping de cargar y guardar acto seguido lo he hecho muchas veces. Me ha quedao claro que todo lo que sea cargar en memoria de pantalla, lo siguiente que haya que mostrar lo machaca, eso está claro y es lógico. Lo que yo quería saber es si puedo cargar una pantalla (aunque no se muestre) en alguna dirección de memoria y aunque siga trabajando con el Spectrum, mientras no machaque ese área nuevamente, ¿podría visualizarla en cualquier momento con algún programa? Es algo así como guardar la pantalla en un área temporal y cuando quiera verla, "llamarla" con algún comando. Esto es pura curiosidad, no es que tenga ningún proyecto ni nada parecido porque soy nulo en código máquina y en todo lo relativo a la teoría del funcionamiento interno Spectrum.
Si que se puede. Te remito a los links que he puesto, dónde explican exactamente eso ;-)

En resumen:

1.- Cargas la pantalla en una dirección diferente a la 16384 (digamos la memoria de video).
2.- Con un bucle pasas byte a byte la pantalla desde dónde la tengas a la 16384.

Esto, si lo pruebas, verás que es lento de narices, por lo que en el artículo meten código máquina. Es una rutina de 10-15 bytes, que hace el movimiento instantaneamente con la instrucción LDIR.

Pero lee el artículo. Microhobby siempre explicaba las cosas de forma que se entiendan perfectamente.

Un saludo.
Fin de impresión
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 »

Exactamente, para hacer esto hay que apoyarse en alguna rutina de programación, como la que ha escrito elfoscuro en Basic, pero como esto sería demasiado lento, es obligatorio escribir unas pocas lineas en ensamblador que es lo que explica el articulo de MH.
Imagen
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 »

Tampoco habría que escribir nada en ensamblador, sino que podría estar todo en BASIC (poniendo los DATA's del ensamblado correspondientes, claro):

Código: Seleccionar todo

10 LOAD "" CODE 30000, 6912
20 RESTORE 30: FOR N=0 to 11: READ A: POKE 40000+N, A: NEXT N
30 DATA 17, 0, 64, 33, 64, 156, 1, 0, 27, 237, 176, 201
40 RANDOMIZE USR 40000
50 PAUSE 0
Explico el código: La línea 10 carga del cassette la pantalla en la memoria 30000. La línea 20 crea el visualizador de la pantalla. La línea 30 contiene el código z80 de ese visualizador. La línea 40 ejecuta el visualizador. La línea 50 espera la pulsación de una tecla, para que mientras puedas ver la pantalla a pantalla completa, jiji.

Ejecutando ese pequeño pogramita en BASIC la pantalla se cargará casi instantáneamente y a pantalla completa. Y además, si la borras, la podrás volver a visualizar escribiendo solamente:

Código: Seleccionar todo

RANDOMIZE USR 40000
Si algo funciona... no lo toques. ¡¡Pero ni de coña!!
Avatar de Usuario
elfoscuro
Demonio segundo orden
Demonio segundo orden
Mensajes: 1831
Registrado: 01 Abr 2013, 22:00
Been thanked: 26 times

Re: Recuperar gráfico de pantalla tras la carga

Mensaje por elfoscuro »

Bubu... si te miras el enlace que he puesto, verás que la rutina del LDIR que has puesto es la misma que hay allí...

¿Qué te crees que hay en la línea DATA que has puesto? ;-)

Un saludo.
Fin de impresión
Responder

Volver a “Sinclair”