Habi Hablóg
Declaro:
XML válidoXHTML válido800x600 +
RSS válidoCSS válidoNavegador digno
  Blog   Archivo   Contacto   Administración  

Acerca de

Matemático, informático, aficionado a la electrónica, friki... y otras cosas que no vienen a cuento ni pasan los filtros de palabras.

¿Queríais un blog? Ahí va.

Red antisocial

¡Me van a volver loca! 2.0
La Fragata Portuguesa

Z
¡Me van a volver loca!

Últimos posts

Crackeo preservativo
Restaurando ROMs
Una cosa lleva a la otra
Desbloqueando logros
Teclado en el PCW

Últimos comentarios

genocho
Victor Cortes Abad
Habi
Enrique
Dandare

Calendario

No hay fechas.

Categorías

Chorradas
Paranoias
Posts lúcidos
Tecnoesoterismo
Yuyus

Cenas de Abj

Abj debe 7 cenas.

Frase célebre

Habi dice: Un exe renombrado a .mp3 sonaría mejor!

Portando abadías

Habi - 05/09/2012 13:28:46 - Tecnoesoterismo

Como ya he contado por otro lado, mi idea era partir de la versión original, la de CPC 6128, e intentar adaptarla a PCW haciendo la menor cantidad posible de cambios.

Teniendo en cuenta que un PCW tiene un mejor sistema de paginación de memoria, que puedo derivar el sonido a la interfaz Dk’tronics (mismo integrado) y que tengo formas de hacer que la memoria de vídeo me entre en menos de 16KBs, me surgió la pregunta: ¿y si uso el propio binario y parcheo encima?

Así pues comienzo extrayendo los datos de las pistas del disco original, dividiéndolas en páginas y reordenando los bytes (pues carga de arriba abajo, curiosamente). Hacemos un archivo para cada página y podemos continuar.

Análisis:

Aunque existe un desensamblado (Vigasoco) no me resulta útil pues no es re-ensamblable y es un tanto incompleto; así que me hago el mío propio con el IDA.

Puede verse claramente que el juego es un prototipo, no una versión pulida. Por ejemplo, la página 4 entera es un debugger (decido eliminarla y aprovecharla para mi cargador y las rutinas "externas" que sean necesarias), hay un montón de rutinas de depuración anuladas, código redundante y algunas rutinas sin optimización alguna.

Supongo que le meterían prisa al autor, o bien no le dejaron terminarlo. En cualquier caso, juega a mi favor pues eso me da más espacio para meter mis parches.

Infraestructura:

Lo primero es montarnos un entorno de desarrollo adecuado. Utilizo UltraEdit con un resaltado de sintaxis para ensamblador de Z80 para la edición, y archivos de proceso por lotes para automatizar todo.

Para ello, creo una imagen de disco cruda (.img) con los datos introducidos tal cual de forma secuencial; corto en 3 partes (inicio, datos, fin) de tal forma que con un Copy /b podemos montar todo con los datos correspondientes y su .bat correspondiente. Y otro .bat para lanzar el emulador arrancado y con el disco metido.

El código se ensambla con Pasmo, empezamos con un Org en su dirección correspondiente, un IncBin para cargar el código original y a partir de ahí tranquilamente con Org podemos poner el parche correspondiente donde queramos, comprobar espacio libre con If $>..., etc.

Cargador:

Me decido a hacer un .ems como Ópera, además de ser más estándar en un PCW. Éste agrupa las páginas 3 (vídeo, en este caso pantalla de carga) y 4 (en vez del debugger tengo mi código de carga y rutinas de acceso al disco a nivel de ficheros que serán además aprovechadas para grabar partidas).

El cargador inicializa cosas como el vídeo, mueve la pantalla de presentación a la memoria de vídeo, carga cada página en su sitio y salta al código del juego. No tiene mucho más que contar.

Memoria:

El juego utiliza normalmente la configuración 0 (0-1-2-3) y ocasionalmente el resto de las páginas en el marco 1, los modos 4-7 (0-x-2-3) lo cual nos simplifica el tema. Basta localizar los:

Ld     Bc, $7FCx

Out    (C), C

Y cambiarlos por una secuencia que haga lo propio y ocupe lo mismo; es decir:

Ld     Bc, $8yF1

Out    (C), B

Donde y=1 para x=0, y x=y para el resto.

Además habilito en el cargador el modo "original" de paginado del PCW, pues me resulta útil usarlo en las rutinas del pergamino del final.

Interrupciones:

El siguiente problema son las interrupciones; el PCW tiene varias fuentes, y deben ser reconocidas cada una por separado, a su manera; no ocurre automáticamente. Afortunadamente, las de vídeo ocurren a la misma frecuencia.

En nuestro caso tenemos anuladas las de disco (como el CPC) y se nos reduce a intercalar un In A, ($F4) en el lugar apropiado. Y de nuevo en nuestro caso, en la primera llamada desde la rutina principal (tema sonido en $1060) vemos un Di redundante y un Reti que puede ser Ret (además ya hay un Reti en la rutina principal). Ahí ganamos esos dos bytes.

Sonido:

Otra cosa sencillita; basta con cambiar la rutina en $134E por:

Out    ($AA), A

Ld     A, C

Out    ($AB), A

Ret

Vídeo:

Lo primero es eliminar lo relacionado con la paleta; al estar centralizado, basta un Ret en $3F4C. Tenemos que usar dos píxeles por cada uno del modo 1 del CPC (misma memoria de vídeo y mismos gráficos), y los colores deben ser remapeados, pues las paletas usadas no están en orden por luminosidad:

CPC PCW
0 1
1 3 (blanco)
2 2
3 0 (negro)

El juego utiliza 256x192, pensando quizás en ser portado a Spectrum y MSX; de nuevo, algo que nos viene muy bien.

Como seguramente sabréis, el PCW es un tanto particular con el tema vídeo. Tiene un modo fijo 720x256 (PAL, en NTSC son 200) monocromo, y eso no se puede cambiar.

Sin embargo, podemos elegir dónde se encuentra cada fila en memoria gracias a una estructura, llamada roller-ram. Y además, podemos ubicar ésta donde queramos. Sólo hay una pega, y es que cuando se recorre la memoria de vídeo para construir la imagen el puntero de la misma se incrementa en 8 y no en 1, haciendo que pixeles adyacentes no tengan direcciones adyacentes (ahora, para modos de texto o mejor dicho tiles 8x8 alineadas, es genial).

Así que la ubicamos en el espacio del cargador, y hacemos que las 192 primeras líneas apunten a direcciones de la página 3 (igual que el CPC), el resto a una línea en el propio cargador entera a 0. Al arrancar detectamos PAL / NTSC y centramos verticalmente utilizando el puerto $F6.

Para ahorrar memoria de vídeo y que nos entre en una página utilizamos el truco de solapar las líneas:

Vamos a considerar filas de caracteres (8 píxeles) por el incremento astuto del que hablamos antes. Cada una de ellas tiene por tanto el mismo ancho que su tamaño en bytes (720).

Por tanto nos sobran 720-512=208 bytes; sin embargo, no podemos poner 104 por cada lado pues no es divisible entre 16; así que los divido como 96+112 (es importante que por la derecha quede igual o más que por la izquierda, porque vamos a solapar y el lado izquierdo siguiente será el derecho anterior).

De esta forma nos ocupa todo menos de 15KB, importante pues utilizo un par de trozos por el final para meter un par de tablas para optimizar y algo más importante: al final del bloque 3, el PCW mapea el teclado.

Por supuesto, dada la no-adyacencia de la memoria de vídeo tenemos que rehacer TODAS las rutinas gráficas del juego, las que generan tablas para ser usadas por éstas y algunas de las que les pasan parámetros a las anteriores. Por cierto, yo me pregunto: ¿qué se fumaron los ingenieros de Amstrad para decidir que el CPC tuviese entrelazados los bits de los píxeles en modos empaquetados?

Teclado:

Leer el teclado en un CPC es un infierno, hay que darse garbeos por el PPI, el PSG (a través del PPI, de nuevo), etc. En el PCW sin embargo tenemos siempre su estado en una dirección de memoria, un auténtico lujo. Sólo tengo que cambiar la rutina en $32BC por una que emule el trabajo del CPC y luego cambiar las comprobaciones de códigos de teclas donde correspondan; afortunadamente son teclados bastante parecidos.

De paso, le añado los cursores además de A-Z-K-L por comodidad.

Fin:

Por supuesto quedan parches variados: me salto el poner el modo de vídeo, hago mi propia copia de las rutinas del pergamino y su recuperación al final (para que ocupen menos, como siempre que se parchea vamos pillados de espacio), se monta una tercera tabla de transparencia (sprites) y otra con las direcciones de las filas de vídeo para acelerar el juego al final del bloque 3, etc.

¿Fin?:

Escribiendo este artículo, me he dado cuenta de que... ¡no hay versión para 9512 / 9512+! Modifico el cargador para hacerlo universal, separo el sector de arranque y añado las instrucciones para generar las dos imágenes. Arreglado (y subido a la web).


CarlosUrda - 05/09/2012 20:34:09

Genio. He estado leyendo (sinceramente, lo muy poco que he podido entender) la entrada sobre el port de la Abadía a PCW, y me has dejado con la boca abierta. Después de esto no he podido dejar de leer entradas antiguas que tienes en tu blog, ya que no lo conocía. Sólo puedo decir una palabra: Genio. Me has dejado alucinado. Es increíble la capacidad y conocimientos que tienes sobre informática (informática de verdad de la buena, no de lo que la gente entiende por informática). En fin, no podía dejar de halagarte por tu blog. Yo en lo que pueda intentaré esforzarme entender tus comentarios técnicos sobre informática (algo que haré con mucho placer). 
 
Un saludo



kachorro - 08/09/2012 9:01:16

No lo halagues tanto, que se le sube. 
 
Yo para evitarlo simplemente le llamo Dios de vez en cuando.



Habi - 08/09/2012 20:01:38

Ea, ea, ya pasó, de verdad que no es para tanto :D. Gracias en cualquier caso a ambos. 
 
La pena es no haber tenido el suficiente tiempo libre hasta el verano como para haberlo sacado antes. A ver cuándo puedo darle el empujoncito que le falta. 
 
Y respecto al blog, poco de provecho hay en él, me temo.



Diego Vizcaino - 23/10/2012 9:09:05

Al igual que Kachorro y Carlos, me uno a sus felicitaciones. Sencillamente tengo que decir que es un acto genial como los que tienes. Ya te felicité en su día por el tremendo emulador de PCW y ahora debo hacerlo para este juego tan emblemático para todos los ochobiteros. 
Yo lo primero que he hecho ha sido pasar tu versión a mi Amstrad PCW y probarlo en sus propias carnes. ¿Vas a tener en cuenta grabar las situaciones de las partidas en disco (por lo menos yo no he podido encontrar la combinación de teclas?



Habi - 23/10/2012 12:03:33

Gracias, la verdad es que no es para tanto. 
 
El juego está a falta de implementar la grabación de partidas y optimizar el tema gráfico para hacerlo más rápido. 
 
Si lo pruebas en un PCW de verdad, te recomiendo usar una tarjeta de sonido DK'tronics: así podrás disfrutar del sonido y música de la versión CPC. ;)



Diego Vizcaino - 23/10/2012 16:19:40

¿optimizar el tema gráfico?, vamos, no me he terminado el juego en el pcw, pero por lo que he visto, todo se visualiza conforme a lo que se debiera. Genial. 
Respecto a lo del sonido, siento francamente no tener ninguna Dktronics, y aún más lo siento porque no son fáciles de conseguir y si alguna vez aparece alguna, como cuerno de unicornio hay que pagar por ella. Debería conformarme con el speaker interno del PCW o si encontrara alguna clónica... ;D 
He visto los vídeos de su funcionamiento y realmente es asombroso lo que una máquina de escribir con pantalla (que era para lo que la vendían) puede hacer. Al invento, yo le añadiría de serie un pequeño altavocecillo para los que no queremos muchos engorros de altavoces y cables.



Victor - 24/11/2012 19:06:21

Aun no había, visto tú descripción técnica, que es como siempre magistral



cpcbegin - 30/12/2014 0:48:02

Pues me parece un trabajo genial. Enhorabuena.




Post cerrado