Dudas sobre memoria contenida

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Dudas sobre memoria contenida

Mensaje por zup » Vie Abr 03, 2015 12:24 pm

Estaba trabajando un poco sobre el cargador de Ranarama (al parecer el juego de moda del momento) y Deflektor, y me han entrado dudas de principiante sobre el comportamiento de la memoria contenida.

- De entrada... ¿por qué todo el mundo la llama memoria contenida? El término en inglés sería más bien memoria "en disputa" o, mucho mejor, memoria arbitrada.

- Si no lo he entendido mal, afecta a memoria y puertos por debajo de 32768 (en los 48k, en los 128k va diferente). La causa es que la ULA necesita acceder a esta zona (para generar la pantalla), y que tiene prioridad sobre la CPU. ¿Afecta a toda la memoria por debajo de 32768 o solo a la zona 16384~32768?

- El efecto es que deja la CPU colgada hasta que la ULA accede a la memoria, "alargando" artificialmente algunas instrucciones. Por eso, los bucles temporizados no deben estar en esta zona. ¿Afecta esto de alguna manera al registro R?

La historia viene un poco de los juegos que están cifrados y utilizan R para descifrarse, y de los juegos que necesitan tener R en un valor concreto. ¿Se pueden colocar estas rutinas libremente en memoria contenida o deben ir en memoria no contenida obligatoriamente?
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

Avatar de Usuario
Metalbrain
Freddy Hardest
Mensajes: 592
Registrado: Lun May 07, 2007 8:17 am
Ubicación: Sevilla
Contactar:

Re: Dudas sobre memoria contenida

Mensaje por Metalbrain » Sab Abr 04, 2015 1:41 am

- Yo suelo llamarla "en contienda". Es posible que me lo pegara na_th_an.
- 16384 ~ 32767 (en 48k). La ROM no está en contienda.
- Que yo sepa no afecta al registro R. Dicho registro se incrementa normalmente una vez con cada instrucción o prefijo, y aunque las instrucciones tarden más estados en ejecutarse debido a las pausas por la ULA, eso no hace que R se incremente más veces.
SevenuP se escribe con u minúscula y P mayúscula.

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Dudas sobre memoria contenida

Mensaje por zup » Sab Abr 04, 2015 10:04 am

Vale, entonces R no se ve afectado y puedo dejarlo alegremente en cualquier sitio (con las interrupciones deshabilitadas, claro).

Mirando los mapas "alternativos" de memoria de un +3, entiendo que ninguno lo emula correctamente (en todos la RAM que emula la ROM está en memoria contenida). El menos conflictivo debería ser el 4-5-6-3, pero aún así las páginas 4 y 6 son contenidas cuando no deberían. En el resto, 0-1-2-3 es inutilizable para emular (no hay memoria de pantalla), mientras que 4-5-6-7 tiene TODA la memoria contenida y 4-7-6-3 usa la pantalla alternativa.

Me pregunto cómo no se les ocurrió a los de Amstrad dejar algún modo que sí imitara bien este aspecto del 48k...
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

zx81
Freddy Hardest
Mensajes: 619
Registrado: Vie Dic 28, 2007 2:14 pm
Ubicación: Valencia
Contactar:

Re: Dudas sobre memoria contenida

Mensaje por zx81 » Sab Abr 04, 2015 12:15 pm

Lo de memoria arbitrada suena bien pero mucho más sofisticado de lo que usa realmente el Spectrum... :D

Todos los modelos, excepto los +2a/+3 utilizan el método burro de quitarle el reloj a la CPU, sin usar el método civilizado de usar la señal WAIT. Tampoco distinguen entre acceso a memoria y a I/O, con lo que aplican la contienda siempre, cosa que el +2a/+3 solo aplica la contienda a la memoria. Los tiempos varían entre grupos de modelos: 48k, 128/+2 y +2a/+3.

Como te ha dicho Metalbrain, en principio solo afecta a las direcciones 16384-32767, pero en los 128k tienes dos páginas posibles para coger la memoria de vídeo y eso hace que haya más memoria en contienda de lo normal. Además, tienen dos bancos de 64K y tú aplicas la contienda al banco, no a la página. Nada de esto afecta al registro R.

La gracia del asunto es que el manual del 128k especifica que la memoria en contienda son las páginas 4 a 7 pero resulta que no, las páginas en contienda son todas las impares (1,3,5,7) y las pares (0,2,4,6) no la tienen. Entonces llegó Amstrad a diseñar el +3 y se leyó la documentación (cosa que debió hacer con el +2, pero se ve que solo hizo una revisión muy menor del diseño) y implementó lo que decía el manual: libres de contienda de 0 a la 3 y en contienda de la 4 a la 7. Las ROM de todos los modelos no sufren contienda.

Lo que no sé es qué quieres decir con Mirando los mapas "alternativos" de memoria de un +3, entiendo que ninguno lo emula correctamente. Los modos all-ram se pensaron para poder usar CP/M. El modo que pone las páginas 4,5,6,7 supongo que es la consecuencia de implementar el modo 0,1,2,3. Dejando de lado el modo 4,5,6,7 los otros tres tienen una cosa en común muy útil: tener la página 3 en 0xC000-0xFFFF que, además, no sufre contienda. En CP/M los programas empiezan en 0x100 de modo que supongo que el propio CP/M se pone en la página 3. Además hay otro detalle que quizá se te escape: no es necesario que la página en 0x4000-0x7FFF corresponda a la página 5 para que la ULA saque de ahí los datos a representar.

Eso permitiría a CP/M tener siempre paginado el conjunto 0-3 y, en la rutina de impresión en pantalla, conmutar a 4,5,6,3 o 4,7,6,3 (dependerá de la pantalla escogida en ese momento), actualizar la memoria de vídeo y volver al modo 0-3.

El +3 en modo 48k pone en 0x000-0x3FFF la ROM3, que corresponde más o menos a la ROM del 48k, de modo que esa zona no está en contienda. Lo que no puede emular es el funcionamiento del bus flotante (bien hecho en el +3) o la contienda en la I/O, así que algunos juegos no funcionarán bien por eso, casi todos debido al bus flotante más que a la I/O. Sí hay algunos juegos que no funcionan exactamente igual en los 128/+2 que en los +2a/+3 debido a esas diferencias. Por ejemplo, la música de Tarzán se escucha con distinto tempo debido, supongo, a que la rutina de reproducción está muy calibrada y no contaba con que en el +3 se ejecutará más deprisa. Hay alguno más afectado, como el Robocop 3 (si consigues que en tu +2 no se resetee) y creo que el Cabal también tenía algún problema similar.

En las protecciones, usaban el registro R para descifrar alguna parte de la rutina, así que era muy complicado depurarlas porque en cuanto pusieras un breakpoint, adiós al contenido correcto del registro R.
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.

Emulador JSpeccy
ZXBaremulator

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Dudas sobre memoria contenida

Mensaje por zup » Sab Abr 04, 2015 12:56 pm

zx81 escribió:Lo que no sé es qué quieres decir con Mirando los mapas "alternativos" de memoria de un +3, entiendo que ninguno lo emula correctamente. Los modos all-ram se pensaron para poder usar CP/M.
Entiendo que la prioridad de Amstrad era poner un modo CP/M (¿y no ponerle un modo de 80 caracteres/línea?). A lo que me refería es a utilizar los modos all-ram para emular un 48k con una ROM concreta. Por ejemplo, poner en la página 0x0000~0x3FFFF la ROM de OpenSE y probar su comportamiento sin tener que tostarla (o la del Jetpac y hacer una especie de emulador de IF2). El problema es que la ROM emulada no está contenida, lo que debería causar algún problema al cargar/salvar cosas en, por ejemplo, OpenSE y Shadow of the Unicorn.
zx81 escribió:En las protecciones, usaban el registro R para descifrar alguna parte de la rutina, así que era muy complicado depurarlas porque en cuanto pusieras un breakpoint, adiós al contenido correcto del registro R.
A menos que uses ZX Spin ;) En cualquier caso suelo pasar por alto las rutinas que descifran cosas (salto al momento en que los datos ya están descifrados en memoria), pero algunos juegos establecen R al principio del programa y eso sí que es interesante.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

zx81
Freddy Hardest
Mensajes: 619
Registrado: Vie Dic 28, 2007 2:14 pm
Ubicación: Valencia
Contactar:

Re: Dudas sobre memoria contenida

Mensaje por zx81 » Sab Abr 04, 2015 1:08 pm

No era posible poner un modo de 80 columnas para CP/M sin complicar el diseño y correr riesgo de incompatibiilidades. Yo usé el CP/M en mi +3 y, la verdad, nunca me pareció funcional al 100% porque eso de ver la pantalla en dos partes era un coñazo.
zup escribió:
zx81 escribió:En las protecciones, usaban el registro R para descifrar alguna parte de la rutina, así que era muy complicado depurarlas porque en cuanto pusieras un breakpoint, adiós al contenido correcto del registro R.
A menos que uses ZX Spin ;) En cualquier caso suelo pasar por alto las rutinas que descifran cosas (salto al momento en que los datos ya están descifrados en memoria), pero algunos juegos establecen R al principio del programa y eso sí que es interesante.
Es que eso de usar un emulador es ya es una técnica muy moderna, que no existía en la época. El mérito no es desproteger un programa en un emulador, con todo controlado, sino hacerlo sobre la máquina original, con las herramientas de la época.... :P
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.

Emulador JSpeccy
ZXBaremulator

curioso1100
Herbert
Mensajes: 60
Registrado: Mar May 08, 2007 8:41 am

Re: Dudas sobre memoria contenida

Mensaje por curioso1100 » Jue Abr 09, 2015 8:47 pm

El mérito no es desproteger un programa en un emulador, con todo controlado, sino hacerlo sobre la máquina original, con las herramientas de la época.... :P
Yo en su día hacía algo un poco "burro" y tedioso pero me servía (sobre todo teniendo en cuenta que no solía caber a la vez en memoria el MONS junto con la rutina a desproteger, o bien, si por casualidad cabía era la propia rutina que estaba estudiando la que se encargaba de "machacar" el desensamblador.... digo que lo que hacía es justo en el punto concreto del código en donde quería saber cuanto valía el registro R (o cualquiera de los otros) , añadía "a pelo" (con POKES a mano) un trozito de programa (quice o veinte bytes que prácticamente ya me sabía de memoria) en ensamblador que almacenaban el valor de R (o el que fuese) en algún lugar de la RAM, y luego, tras fijar los registros IX, BC, A y creo recordar que el bit de acarreo grababa a cinta (saltando a Hx04C2 de la ROM) ese trozo de RAM que contenia el valor de R (o los registros que fuesen)... luego dejaba que se reseteara el Spectrum sin más y seguidamente cargaba desde la cinta los bytes que había salvado... así obtenía el valor de cualquier registro que quisiese conocer en cualquier punto del código.

Efectivamente, a fecha de hoy no haría eso ni por dinero, pero bueno, estamos hablando de hace más de 30 años :D

Me costó muchísimo, pero cuando conseguí "desproteger" el Knight Lore y su famoso "SpeedLock" de esa forma, aún hoy recuerdo la sensación que sentí de que me mereció la pena :twisted:

zup
Freddy Hardest
Mensajes: 666
Registrado: Vie Ago 15, 2008 2:43 pm

Re: Dudas sobre memoria contenida

Mensaje por zup » Vie Abr 10, 2015 10:51 am

A día de hoy los speedlock son algo más sencillos. Solo hay que esperar a que empiece a cargar, parar el emulador y poner un breakpoint cuando IY=23610.

Casi siempre funciona y te deja justo después de cargar, durante la rutina que inicializa registros para el juego. A veces tienes que anotar algún valor para tu cargador, a veces solo tienes que encontrar el jp al código del juego.
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start...

curioso1100
Herbert
Mensajes: 60
Registrado: Mar May 08, 2007 8:41 am

Re: Dudas sobre memoria contenida

Mensaje por curioso1100 » Sab Abr 11, 2015 8:20 pm

Solo hay que esperar a que empiece a cargar, parar el emulador y poner un breakpoint cuando IY=23610
Pues claro que si :) , lo que pasaba antes -o al menos es lo que más recuerdo- es que las rutinas cargadoras te "machacaban" todo lo que tú intentabas hacer... no te dejaban cargar ningún desensamblador pues borraban todo el resto de memoria que no necesitaban ("destrozando" por supuesto todas las variables del sistema) y con el tema de usar el registro R se complicaba un montón saber que valor usaban para "desenmascarar" el código... recuerdo que solían hacer un XOR entre el registro R y los valores de la memoria (¡y no una sola vez!) hasta que la rutina de carga quedaba desenmascarada y ya se ponía a cargar... como antes decía zx81, desde luego no es lo mismo ahora con los emuladores que antes :twisted: pero eso no quiere decir que lo de antes fuese mejor :)

jzx
Nonamed
Mensajes: 1047
Registrado: Lun Feb 08, 2010 8:19 pm

Re: Dudas sobre memoria contenida

Mensaje por jzx » Lun Abr 13, 2015 7:35 pm

Respecto a la contención y a las rutinas de carga rápida, no les debería afectar la contención de los puertos?. No será tan grave como la de la memoria, pero con las rutinas más rápidas como las de cargandoleches por ejemplo, no afecta?.
zx81 escribió:No era posible poner un modo de 80 columnas para CP/M sin complicar el diseño y correr riesgo de incompatibiilidades. Yo usé el CP/M en mi +3 y, la verdad, nunca me pareció funcional al 100% porque eso de ver la pantalla en dos partes era un coñazo.
Realmente yo no llegué a usar el cpm en el spectrum, aunque sí en otros aparatos (incluso el wordstar :D ) y lo de la pantalla partida en dos (o tres? ) partes creo que sería insufrible. Ahora bien, creo que perdieron la oportunidad de poner un modo de 512 pixels de ancho, que hubiera dado para 80 columnas decentes, seguramente muy lento, pero mejor que lo que hicieron, y no sería tan incompatible, ya que el TS2068 ya lo tenía, y no dejaba de ser un spectrum anterior. Y también hubiera estado bien para aventuras conversacionales, para programar (basic, ensamblador...). Puede que fuera para no hacerse la competencia al cpc, pero para eso no hacía falta que hubieran sacado el cpm.

speccy
Sabreman
Mensajes: 353
Registrado: Jue Sep 06, 2007 4:20 pm

Re: Dudas sobre memoria contenida

Mensaje por speccy » Jue Abr 23, 2015 1:35 am

Yo estuve usando un tiempo el +2A como procesador de textos con el Tasword +2, y trabajaba a pantalla partida... Y la verdad, no era tan dificil. Luego me pasé al QL con el Quill y el Xchange y aunque veía la pantalla completa, el procesador no era tan versátil como el de Tasman.

Los apuntes de unas cuantas asignaturas aún están en casettes y disquettes...

Avatar de Usuario
programandala.net
Manic Miner
Mensajes: 210
Registrado: Mié Ago 04, 2010 9:20 pm
Ubicación: España
Contactar:

Re: Dudas sobre memoria contenida

Mensaje por programandala.net » Lun May 11, 2015 9:18 pm

zup escribió: ¿por qué todo el mundo la llama memoria contenida? El término en inglés sería más bien memoria "en disputa" o, mucho mejor, memoria arbitrada.
Porque desgraciadamente la mayoría de la gente usa la palabra que más se parece, por su aspecto, al término inglés, sin pararse a pensar en el significado original. Así, durante años se propagó el error de decir «programa propietario», que parece que por fin se está corrigiendo con «programa privativo». Otro caso muy claro, y quizá sin solución, es «librería», que debería ser «biblioteca».

«Memoria contenida» es el típico error de traducir «a ojo» sin pensar.

El significado original puede expresarse con «disputada», o mejor, como dices, «arbitrada», o incluso simplemente el más genérico «compartida».
Marcos Cruz (programandala.net)

speccy
Sabreman
Mensajes: 353
Registrado: Jue Sep 06, 2007 4:20 pm

Re: Dudas sobre memoria contenida

Mensaje por speccy » Vie May 15, 2015 2:09 am

Tenemos que recordar los tiempos en los que los linotipistas de Hobby Press cambiaban los listados y ponian IMPUT porque siembre se pone M delante de P y de B...

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 10 invitados