Resuelto el misterio de "La máquina alucinante"

Si por algo se caracteriza el Spectrum es por su gran variedad de periféricos (clásicos y modernos)

Moderador: Sir Cilve Sinclair

Responder
Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Resuelto el misterio de "La máquina alucinante"

Mensaje por mcleod_ideafix » Mar Ago 05, 2008 11:01 am

Comienzo desde el principio: hace unos días compré a Alfonso Borro un interface Abaco Phoenix III, un copiador fabricado en España en el año 86-87. Buscando información de dicho aparato, encontré que aparece como "no preservado" en la página de hardware de José Leandro, así que me decidí a colaborar aportando información sobre él. Esta es la placa:

Imagen

Como se puede ver, hay dos integrados con la serigrafía borrada. Un poco de hacer rompecabezas en papel y consultar datasheets, me dio los nombres de los dos intregrados: un 74LS00 (el de arriba) y un 74LS260 (el de abajo).

Así, el esquemático correspondiente, resultó ser éste:

Imagen

Es un diseño interesante, ya que usa muy pocos componentes, no usa RAM estática como hacen otros copiadores, y además incluye un sistema muy original para lograr una señal de NMI limpia, y además controlable por software, sin necesidad de monoestables ni de filtros antirrebotes. El sistema "enclava" la condición de NMI bajo en el momento en que detecta que se ha pulsado el botón, y deja NMI bajo hasta que por software (escribiendo cualquier valor al puerto DFh) se deshabilita (se pone a nivel alto) dicha señal, desactivándose automáticamente la interfaz. Lo original del caso es que esto se consigue usando sólamente circuitos combinacionales (con las realimentaciones apropiadas, claro está): no hay latches ni biestables de ningún tipo.

La sorpresa llegó cuando lo enchufé para probarlo. Lo hice en un 128K de Investrónica, y cuando pulsé el botón de NMI, apareció esto:

Imagen

Inmediatamente recordé que yo había visto esto antes. No tardé demasiado en darme cuenta de que se correspondía con esta otra imagen, sacada del artículo "La máquina alucinante", de Julio Medina.

Imagen

La diferencia (no se observa en la foto por ser una TV de blanco y negro) es que en el Phoenix las rayas son amarillas y negras. Quizás el diseñador de la máquina alucinante tuvo un ramalazo patriótico :D

Pero esa parece ser la única diferencia: el comportamiento de la rutina de NMI es idéntico al descrito por Julio en su artículo.

Por último, en cierto párrafo del mismo se lee:
Julio Medina escribió:José Manuel desensambló las rutinas de la eprom y se preguntó, por si alguien sabia algo, nadie pudo decir si la rutina inteligente (pues hace un checksum y solo guarda a cinta lo necesario), pertenecía a algún copión o era parte de las rutinas de volcado a cinta de algún interface. Es muy probable que esta rutina esté fuertemente inspirada en alguna otra previamente realizada, pero como parece única, hubo que buscarle un nombre, a no ser que salga su creador y nos diese mas datos, cosa que desearíamos pasara algún día.


Bueno, pues creo que el misterio está resuelto. Puede que la máquina alucinante fuera una prueba de ingeniería para el propio Abaco Phoenix, o bien que el ingeniero que diseñó esta interface fuera quien diseñó después esta modificación, o puede que un tercero cogiera el contenido de la EPROM del Phoenix y los incorporara a esta ROM modificada.
Web: ZX Projects | Twitter: @zxprojects

zx4ever
rst 0
Mensajes: 31
Registrado: Jue May 17, 2007 11:49 pm
Ubicación: Madrid

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por zx4ever » Mar Ago 05, 2008 6:27 pm

Misterio resuelto, eres un genio de la electonica, y sobre todo el relacionar el copiador este con el reportage de "la maquina aluciante". Al final resulto ser un ZX normal y corriente con copiador incorporado.

Salu2

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por radastan » Mar Ago 05, 2008 6:30 pm

El comportamiento es el mismo, pero viendo los bytes se observa que la rutina es bien distinta.
¿Hay alguna diferencia entre las dos rutinas o hacen exactamente lo mismo?
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Jose Manuel
Sabreman
Mensajes: 459
Registrado: Mar Abr 17, 2007 1:25 pm
Ubicación: Madrid
Contactar:

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por Jose Manuel » Mar Ago 05, 2008 7:05 pm

¡Buen trabajo Miguel Angel!!!!!!

¿Te importaría incorporar esta información a la página de Jose Leandro?, así tendríamos otro interface documentado. Los de Abaco se están haciendo rogar.

En cuanto a comparar las rutinas del Phoenix y de la Máquina Alucinante, ¿podrías publicar la primera en algún sitio? o incluso algo mejor, hacer una backup de la eprom.

Muchas gracias, un saludote, J.M:
El Trastero del Spectrum
http://trastero.speccy.org/

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por mcleod_ideafix » Mar Ago 05, 2008 7:14 pm

Jose Manuel escribió:¿Te importaría incorporar esta información a la página de Jose Leandro?


Ya le mandé un ZIP esta mañana con toda la información que he recopilado, incluyendo el volcado de la ROM del Phoenix III, a la misma vez que ponía este post. Ayer mismo avisé por e-mail a Julio Medina para decirle esto mismo. Aun no he recibido respuesta de ninguno de los dos.

Respondiendo a Radastan: tendría que desensamblar y mirar instrucción a instrucción, pero según la descripción que Julio Medina da de la rutina, la que yo he visto del Phoenix comienza de la misma forma: pone la pila en la misma dirección de la pantalla, copia 32 bytes desde la ROM hacia la pantalla, etc. Voy a coger el IDA Pro y mirarlo en cuanto tenga un momento.

Ten en cuenta que este que tengo es un Phoenix III, fabricado en 1987. Es posible que la rutina de la "máquina alucinante" corresponda al primer Phoenix, el que se desarrolló en 1986, el mismo año que consta en la ROM de la susodicha máquina. Creo que el Phoenix III se diferencia del primero en que éste permite ser usado con máquinas de 128K (cuestión de comprobarlo). También ten en cuenta que la captura de pantalla que has visto corresponde precisamente a un 128K y no a un 48K como el de la "máquina alucinante". Intentaré hacer pruebas, pero con un 48K a ver si la "basurilla" en pantalla es la misma o no.
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por mcleod_ideafix » Mar Ago 05, 2008 7:18 pm

radastan escribió:viendo los bytes se observa que la rutina es bien distinta.

OJO! que el stack también está en la memoria de pantalla, y el momento en el que yo la capturo puede no tener nada que ver con el momento en que se capturó la pantalla en el artículo de Julio. Puedes estar viendo diferencias precisamente en la zona en la que hay guardados datos de pila.
Web: ZX Projects | Twitter: @zxprojects

Jose Manuel
Sabreman
Mensajes: 459
Registrado: Mar Abr 17, 2007 1:25 pm
Ubicación: Madrid
Contactar:

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por Jose Manuel » Mar Ago 05, 2008 9:13 pm

mcleod_ideafix escribió:
Es posible que la rutina de la "máquina alucinante" corresponda al primer Phoenix, el que se desarrolló en 1986, el mismo año que consta en la ROM de la susodicha máquina.


Pues si, coinciden las fechas, es lo mas probable. En la rom está la rutina por si la quieres comparar:
(yo no puedo porque no tengo la tuya)
http://trastero.speccy.org/cosas/JL/Int ... zx1986.rom

Excelente trabajo, como los que siempre haces, te felicito.

Un saludote, J.M:
El Trastero del Spectrum
http://trastero.speccy.org/

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por mcleod_ideafix » Mar Ago 05, 2008 11:09 pm

Jose Manuel escribió:En la rom está la rutina por si la quieres comparar:

OK! Ahora pasaré la ROM por el IDA Pro. De momento, he hecho lo propio con la ROM del Phoenix III (aunque la EPROM es de 16K, está muy poco ocupada, casi todo es FFh). Aquí están los resultados:

La ROM del Abaco Phoenix III.
El desensamble de la misma, con algunos comentarios.
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por mcleod_ideafix » Mié Ago 06, 2008 1:35 am

Y ahora, algunas comparativas (MA es "Máquina Alucinante"):

La rutina a la que se salta cuando ocurre una NMI (primeras instrucciones)

ROM del Phoenix:

Código: Seleccionar todo

loc_0101:            ; CODE XREF: ROM:0066j
      ld   (411Eh), sp
      ld   sp, 411Eh
      push   af
      push   bc
      push   de
      push   hl
      push   ix
      push   iy
      exx
      ex   af, af'
      push   af
      push   bc
      push   de
      push   hl
      ld   hl, 24Eh
      ld   de, 4000h
      ld   bc, 20h   ; ' '
      ldir
      ld   de, 4100h
      ld   bc, 4
      ldir
      ld   de, 4200h
      ld   bc, 0Eh
      ldir
      ld   (4001h), sp
      ld   a, r
      ld   (4008h), a
      ld   a, i
      ld   (4004h), a
      jp   pe, loc_0146    ; Salto según IFF1/IFF2
      ld   d, 0F3h   ; 'ó'   ; Opcode de DI
      jr   loc_0148
; ---------------------------------------------------------------------------

loc_0146:            ; CODE XREF: ROM:013Fj
      ld   d, 0FBh   ; '-'   ; Opcode de EI


ROM de la MA:

Código: Seleccionar todo

loc_3870:            ; CODE XREF: ROM:0066j
      ld   (411Eh), sp
      ld   sp, 411Eh
      push   af
      push   bc
      push   de
      push   hl
      push   ix
      push   iy
      exx
      ex   af, af'
      push   af
      push   bc
      push   de
      push   hl
      ld   hl, 3ACEh
      ld   de, 4000h
      ld   bc, 20h   ; ' '
      ldir
      ld   de, 4100h
      ld   bc, 4
      ldir
      ld   (4001h), sp
      ld   a, r
      ld   (4008h), a
      ld   a, i
      ld   (4004h), a
      jp   pe, loc_38AD
      ld   d, 0F3h   ; 'ó'
      jr   loc_38AF
; ---------------------------------------------------------------------------

loc_38AD:            ; CODE XREF: ROM:38A6j
      ld   d, 0FBh   ; '-'


A partir de aquí hay variaciones: me refiero, por ejemplo, a la forma en la que detecta cada ROM el modo de interrupción actual del procesador.
La ROM del Phoenix III usa un método directo: cambia el vector I para que apunte a una rutina de su propia ROM y chequea si se ejecuta esa rutina, o bien la rutina en la posición 0038. La rutina de "IM 2" de la ROM la sitúa en 003C:

Código: Seleccionar todo

      xor   a
      ld   i, a      ; Ponemos el vector I a   0, con lo que la direcci¢n de
               ; la supuesta rutina de   interrupción IM   2 estará en la
               ; palabra de 16   bits apuntada por 00FF,   que es 003C.
      ei
      halt         ; Habilitamos interrupciones y esperamos a que se produzca una.
      di
      ld   (4101h), de   ; Según   estuviéramos en   IM 1 o IM 2, se   ejecutará la rutina
               ; en 0038 o en 003C, y el valor   de E será distinto en cada caso.
               ; Recordemos que D contenía el código de operación DI o   EI según
               ; estuvieran deshabilitadas las   interrupciones enmascarables al
               ; interrumpir el programa, o no.
; ---------------------------------------------------------------------------
                org     0038h           ; Rutina de interrupci¢n para el caso IM 1
      ld   e, 56h          ; Junto con EDh, esto es el opcode de IM 1
      reti
; ---------------------------------------------------------------------------
                org     003Ch           ; Rutina de interrupci¢n para el caso IM 2
      ld   e, 5Eh          ; Junto con EDh, esto es el opcode de IM 2
      reti
; ---------------------------------------------------------------------------


Sin embargo, la ROM de la MA no tiene tanto espacio como para implementar una rutina de interrupción, así que usa un método más heurístico: mira el valor de I, y si es mayor que 3Fh (el valor por defecto en el Spectrum), entonces asume que la máquina está en IM 2, en otro caso, asume que I no se ha tocado, y por tanto está en IM 1. En cualquiera de los dos casos, modifica el valor de E con los mismos valores que el método "Phoenix".

Código: Seleccionar todo

      ld   a, i
      ld   (4004h), a
      jp   pe, loc_38AD
      ld   d, 0F3h   ; 'ó'
      jr   loc_38AF
; ---------------------------------------------------------------------------

loc_38AD:            ; CODE XREF: ROM:38A6j
      ld   d, 0FBh   ; '-'

loc_38AF:            ; CODE XREF: ROM:38ABj
      cp   3Fh ; '?'
      jr   nz, loc_38BB
      ld   e, 56h ; 'V'

loc_38B5:            ; CODE XREF: ROM:38BDj
      ld   (4101h), de
      jr   loc_38BF
; ---------------------------------------------------------------------------

loc_38BB:            ; CODE XREF: ROM:38B1j
      ld   e, 5Eh ; '^'
      jr   loc_38B5
; ---------------------------------------------------------------------------

loc_38BF:            ; CODE XREF: ROM:38B9j


Por último, la grabación en sí de los bloques, en la MA se puede ver, por el código, el típico patrón de carga de IX, DE, A para el flag y llamada a la rutina SAVE. Según esto, se ve que se graban dos bloques normales (con cabecera) que se corresponden con un cargador BASIC y una rutina en código máquina, seguidos de tres bloques sin cabecera. El primero es fijo y va desde el inicio de la pantalla (4000h), hasta la posición 63FFh. El segundo bloque es variable, y se ha calculado antes, con una rutina que busca un trozo de memoria que no tenga bytes a 0 dentro del rango 6400h a F9FFh. Por último, se graba un pequeño bloque que ocupa desde FA00h hasta el final de la memoria, en FFFFh

Código: Seleccionar todo

      ld   ix, 3AF2h
      ld   de, 11h
      xor   a
      call   sub_3B14
      pop   de
      push   de
      ld   a, e
      add   a, e
      add   a, e
      sla   a
      ld   e, a
      ld   ix, 3BA1h
      add   ix, de
      ld   de, 14h
      ld   a, 0FFh
      call   sub_3B14
      ld   ix, 3B03h
      ld   de, 11h
      xor   a
      call   sub_3B14
      ld   ix, 3BFDh
      ld   de, 103h
      ld   a, 0FFh
      call   sub_3B14
      pop   bc
      add   iy, bc
      ld   ix, 4000h
      ld   de, 2400h
      ld   a, 0FFh
      call   sub_3B14
      ld   ix, (4200h)
      ld   de, (4104h)
      ld   a, 0FFh
      call   sub_3B14
      ld   iy, 3B91h
      ld   ix, 0FA00h
      ld   de, 600h
      ld   a, 0FFh
      call   sub_3B14
      jp   loc_38F2


En la ROM del Phoenix vemos una rutina prácticamente idéntica a la de MA, si bien tiene un ligero cambio: en el segundo bloque sin cabecera, el comienzo siempre es la dirección 6400h. Da la impresión (ahora lo veremos) de que la rutina de la ROM de la MA busca el primer byte no nulo desde la posición F9FFh hacia atrás, y después desde la posición 6400h hacia adelante, y sólo graba el trozo de memoria comprendido entre ambos bytes, en cambio, la ROM del Phoenix sólo busca un extremo: desde la posición F9FFh hacia atrás, y asume que desde la posición 6400h en adelante, hay datos válidos.

Código: Seleccionar todo

loc_01BB:            ; CODE XREF: sub_02B3-10Cj
               ; sub_02B3-106j ...
      ld   b, 0
      push   bc
      ld   iy, 335h
      ld   ix, 280h
      ld   de, 11h
      xor   a
      call   sub_02B3
      pop   de
      push   de
      ld   a, e
      add   a, e
      add   a, e
      add   a, a
      ld   e, a
      ld   ix, 341h
      add   ix, de
      ld   de, 14h
      ld   a, 0FFh
      call   sub_02B3

loc_01E2:            ; CODE XREF: sub_02B3-68j
      ld   ix, 291h
      ld   de, 11h
      xor   a
      call   sub_02B3
      ld   ix, 385h
      ld   de, 162h
      ld   a, 0FFh
      call   sub_02B3
      pop   bc
      add   iy, bc
      ld   ix, 4000h
      ld   de, 2400h
      ld   a, 0FFh
      call   sub_02B3
      ld   ix, 6400h
      ld   de, (4104h)
      ld   a, 0FFh
      call   sub_02B3
      ld   iy, 335h
      ld   ix, 0FA00h
      ld   de, 600h
      ld   a, 0FFh
      call   sub_02B3

loc_0225:            ; CODE XREF: sub_02B3+72j
      ld   de, (4101h)
      jp   loc_0148


En efecto, la ROM de la MA se esmera un poco más que la ROM del Phoenix en buscar el trozo de memoria válido que hay que guardar. Aquí lo busca:

Código: Seleccionar todo

loc_38BF:            ; CODE XREF: ROM:38B9j
      ld   de, 60E0h
      ld   hl, 6400h

loc_38C5:            ; CODE XREF: ROM:38CEj
      ld   a, (hl)
      cp   0
      jr   nz, loc_38D0
      inc   hl
      dec   de
      ld   a, d
      or   e
      jr   nz, loc_38C5

loc_38D0:            ; CODE XREF: ROM:38C8j
      ld   (4200h), hl
      ld   de, 0F9FFh
      ex   de, hl
      sbc   hl, de
      ld   de, 0F9FFh
      ex   de, hl

loc_38DD:            ; CODE XREF: ROM:38E6j
      ld   a, (hl)
      cp   0
      jr   nz, loc_38E8
      dec   hl
      dec   de
      ld   a, d
      or   e
      jr   nz, loc_38DD

loc_38E8:            ; CODE XREF: ROM:38E0j
      ld   de, (4200h)
      sbc   hl, de
      inc   hl
      ld   (4104h), hl

loc_38F2:            ; CODE XREF: ROM:39BAj
      di
      ld   sp, 4220h


En cambio, la ROM del Phoenix, se limita a buscar el primer byte no nulo desde el final al principio:

Código: Seleccionar todo

loc_0185:            ; CODE XREF: sub_02B3-125j
      xor   a
      cp   (hl)
      jr   nz, loc_0190
      dec   hl
      ld   a, h
      xor   65h ; 'e'
      or   l
      jr   nz, loc_0185   ; Busca   la dirección m s alta en memoria que no   contenga un 0,
               ; desde   F9FFh hasta como mínimo, 6500h.

loc_0190:            ; CODE XREF: sub_02B3-12Cj
      ld   de, 6400h
      xor   a
      sbc   hl, de
      inc   hl
      ld   (4104h), hl
      ld   sp, 4220h


Esto último es significativo, ya que hay muchísimo más espacio en la ROM del Phoenix que en la de la MA, para implementar una búsqueda un poco más concienzuda de lo que se ha hecho. Sin embargo, la ROM de la MA lo hace, y la del Phoenix no. ¿Por qué? ¿Estamos ante un verdadero maestro del hacking que le hizo ingeniería inversa al Phoenix (os recuerdo que tiene dos circuitos integrados con la serigrafía borrada, y aunque el contenido de la EPROM se entiende perfectamente aún sin saber qué hacen esos integrados, el uso del puerto DFh debería escamar un poco a quien viera el contenido de esa EPROM), desensambló la rutina de la EPROM, la mejoró un poco, y la incrustró en la ROM de un Spectrum? ¿O es el mismo autor del Phoenix, quien uso su propia rutina en su propia modificación del Spectrum? ¿Fue la "máquina alucinante" un ensayo de ingeniería para lo que iba a ser el futuro Abaco Phoenix?

Os recuerdo que según me consta en la documentación del interface que tengo, éste es el modelo Phoenix III, fabricado en Febrero de 1987 (adquirido por Alfonso Borro un mes más tarde. Él, de hecho, conoció al hijo del creador del Phoenix) y esta modificación se supone que se ha hecho.... ¡antes que el Phoenix III, en 1986!, el mismo año en que salió la primera versión del Abaco Phoenix.
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por radastan » Mié Ago 06, 2008 8:04 am

Joder, ahora si que estoy intrigado, a mi también me resulta chocante que un hacker mejore una versión BETA y encima sea mucho mejor el resultado que el que posteriormente se cormecializó... aunque también puede tener cierta lógica. Quizás la ROM Phoenix no es tan concienzuda en exprimir el bloque a volcar, pero así siempre comienza en la misma dirección y es más transparente de cara al usuario (el load"" code siempre empezaría en el mismo sitio). Incluso el programa cargador sería más sencillo, ya que sería universal, mientras que con la MA el volcado debería incluir la dirección de inicio en un bloque anterior (dos bloques de carga, uno con los datos del volcado y otra con el volcado) y el programa de carga actuar en consecuencia.

Creo que el método del Phoenix es más práctico.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por mcleod_ideafix » Mié Ago 06, 2008 11:04 am

radastan escribió:así siempre comienza en la misma dirección y es más transparente de cara al usuario (el load"" code siempre empezaría en el mismo sitio). Incluso el programa cargador sería más sencillo, ya que sería universal, mientras que con la MA el volcado debería incluir la dirección de inicio en un bloque anterior (dos bloques de carga, uno con los datos del volcado y otra con el volcado) y el programa de carga actuar en consecuencia.


Bueno, son bloques que se cargan sin cabacera, así que en realidad no aparecen en el cargador BASIC. Ese cargador, lo único que carga es un pequeño bloque de código máquina a partir de la dirección 64000. La cosa funciona así (en la MA):

- La ROM graba tres bloques sin cabecera: el primero desde 4000h hasta 63FFh. Aquí se incluye la pantalla, y dentro de ella, en las posiciones 4200h y 4104h están los valores de inicio y longitud del bloque variable. El segundo es el de inicio y longitud variables, y el tercero se cargará en la posición FA00h, hasta el final de la memoria. Este tercer bloque tendrá que cargarse una vez que la ejecución haya sido derivada desde el cargador de la dirección 64000 hasta una segunda parte del mismo, ubicada en la pantalla.

- Durante la carga del programa, el BASIC carga este pequeño cargador que se ubicará en la posición 64000 (FA00h):

Código: Seleccionar todo

loc_3C13:            ; CODE XREF: ROM:3C01j   ROM:3C07j ...
      ld   sp, 0FFFFh
      ld   a, 0FFh
      scf
      ld   ix, 4000h
      ld   de, 2400h
      call   0FA48h
      ld   a, 0FFh
      scf
      ld   ix, (4200h)
      ld   de, (4104h)
      call   0FA48h
      ld   sp, 4220h
      ld   a, 0FFh
      scf
      ld   ix, 0FA00h
      ld   de, 600h
      ld   hl, 4000h
      push   hl
      jp   loc_556


En FA48h está la rutina cargadora turbo. Fíjate que de los tres bloques sin cabecera, dos se cargan con esta rutina, y el tercero se carga con la rutina de la ROM. El segundo de ellos es el que se carga usando como parámetros los que se guardaron en la pantalla durante la grabación, y que han sido restaurados precisamente en la primera carga. Justo antes de eso, se mete la dirección 4000h en pila para que cuando se vuelva de la carga, se salte directamente a esa dirección donde se encuentra el resto del cargador, que restaura todo el estado del procesador y reanuda la ejecución.

La ROM del Phoenix hace algo casi idéntico, pero en la segunda carga sin cabecera, sólo coge la información de la longitud, guardada, al igual que en la ROM de la MA, en la posición 4104h. La dirección de inicio la fija en 6400h.

Código: Seleccionar todo

loc_039B:            ; CODE XREF: ROM:0389j
      ld   sp, 0FFFFh
      ld   a, 0FFh
      ld   ix, 4000h
      ld   de, 2400h
      call   0FA46h
      ld   a, 0FFh
      ld   ix, 6400h
      ld   de, (4104h)
      call   0FA46h
      ld   sp, 4220h
      ld   a, 0FFh
      scf
      ld   ix, 0FA00h
      ld   de, 600h
      ld   hl, 4000h
      push   hl
      jp   0FB57h


El salto a la dirección FB57h lo hace porque allí hay una pequeña rutina que comienza igual que la rutina de carga del Spectrum, pero con el detalle de se salta la instrucción en la que se mete en pila el valor 053F (el punto común de retorno de la rutina de LOAD). Una vez hecho eso, salta a la ROM del Spectrum, justo a la instrucción que hay detrás del PUSH HL donde debería guardarse ese valor.

Un último detalle: fíjate en las direcciones de inicio de la rutina cargadora turbo. En la ROM de la MA comienza en la dirección FA48h, y en la del Phoenix, dos bytes antes, en la dirección FA46h. En ambos casos, sendas direcciones corresponden al código que se ubicará en memoria justo después del código que estás viendo. Una de las rutinas es un poco más corta que la otra y eso hace que la rutina turbo comience antes. Esto me da pie a pensar que el autor de la ROM de la MA tenía acceso al código fuente, al menos de la rutina cargadora, y al modificarla y volverla a ensamblar, modificó la dirección de comienzo de la rutina turbo. Alguien que esté parcheando el código binario... ¿se hubiera molestado en hacer eso?

En resumen: que el cargador de la ROM de la MA es tan universal como el del Phoenix, y la única diferencia sustancial es que en el caso de la MA se recogen dos parámetros de la memoria de pantalla para cargar el segundo bloque, y en el Phoenix, se recoge uno (la longitud) y se deja fijo el otro (la dirección de inicio).
Web: ZX Projects | Twitter: @zxprojects

Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por Gandulf » Mié Ago 06, 2008 1:59 pm

@Radastan: hacker mejore una versión BETA y encima sea mucho mejor el resultado

Bueno, la verdad es que la modificación es muy sencilla y realmente sólo se nota la mejora en el resultado si grabas algo que ocupe poca memoria. Para un juego comercial la diferencia sería mínima o directamente despreciable.

En mi opinión pueden ser válidas las dos teorías:

- Alguien que quiso implementar un transfer en el spectrum y miró el phoenix y su rom, y vio ese detalle a mejorar (para desarrolladores, grafistas, etc, que lo usen para guardar el trabajo es realmente útil, ya que se ahorrar guardar toda la memoria de cada vez, no así para el usuario de spectrum estandar que lo usa para copiar juegos o hacer copias de seguridad de los mismos).

- Que sea una beta o el prototipo donde se desarrolló el mismo Phoenix. Quizá incluso uno de los desarrolladores del mismo modificó un spectrum para añadirlo y modificó ese código de la rom porque era un programador y lo usaba para copias de seguridad.
Un saludo,

Gandulf

Avatar de Usuario
Ralphy
Freddy Hardest
Mensajes: 589
Registrado: Dom May 27, 2007 10:58 am
Ubicación: Lo 100 to picha, no tor mundo puehé DKI.

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por Ralphy » Mié Ago 06, 2008 2:37 pm

Qué curioso. Ví la imágen del primer mensaje, y ¿ tendrá algo que ver con esto ?

Imagen
Imagen

Los dos son el mismo juego, tan solo que las rayas (que son más gruesas) alternan cada segundo estos dos colores de las imágenes.

Me quedé con el interrogante puesto que la primera imágen de arriba, la del autor de esta parte del foro, se observan las rayas rojas y amarillas. El resultado de este After burner es el mismo que el famoso Phoenix (9216, 38400 y 1536 bytes respectívamente) exceptuando el bloque "CARGADOR" (64000,354) cuyos datos están dentro del basic (como bytes). Eso mismo ocurre en este otro ejemplo, a diferencia de las rayas que son leves rayitas negras bajo "BORDERs" que van cambiando de valor 7 a 0 cada segundo.

Imagen

Por estas fotografías, parece ser que cada Phoenix tenía su labor.
ADVERTENCIA: Las autoridades spectrumeras advierten que Ralphy desprotege sériamente sus juegos.

En el nombre del anime, del manga, y del espíritu otaku: Imagen ¡¡¡ A ni MÉN !!!

¡¡¡ OTAKUS AL PODER !!!

Jose Manuel
Sabreman
Mensajes: 459
Registrado: Mar Abr 17, 2007 1:25 pm
Ubicación: Madrid
Contactar:

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por Jose Manuel » Jue Ago 07, 2008 6:23 pm

mcleod_ideafix escribió: Esto me da pie a pensar que el autor de la ROM de la MA tenía acceso al código fuente, al menos de la rutina cargadora, y al modificarla y volverla a ensamblar, modificó la dirección de comienzo de la rutina turbo. Alguien que esté parcheando el código binario... ¿se hubiera molestado en hacer eso?


Te vuelvo a felicitar por tu excelente trabajo, y como otros anteriores, muy de investigación.

En cuanto a la relación MA-Phoenix supongo que en aquella época sería muy normal ver cómo trabajaban los interfaces y al querer implementarlo dentro de un Spectrum, lo modificara y mejorara. Bueno, y no hablemos de clonaciones (hay multifaces 3 fabricados por Hard Micro, PDS con las iniciales PdeF, je,je).

Bueno, guardaremos este hilo, muy interesante.

Un saludote, J.M:
El Trastero del Spectrum
http://trastero.speccy.org/

Avatar de Usuario
JULIO
Freddy Hardest
Mensajes: 599
Registrado: Mar May 08, 2007 10:30 am
Ubicación: Castilla La Mancha.

Re: Resuelto el misterio de "La máquina alucinante"

Mensaje por JULIO » Mar Ago 19, 2008 10:30 am

Felicitaciones por analizar la ROM y sacar todas estas conclusiones, podéis con todo.
gracias por dedicar un poco de tiempo al spectrum. :D

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 16 invitados