Blog | Archivo | Contacto | Administración |
Intentaré ser poco matemático, que se me asustan los lectores.
Existe un método de construcción de fractales llamado IFS, basado en el hecho de que una aplicación contractiva tiene un punto fijo (atractor por tanto). Supongamos que trabajamos en R2 y que nuestras aplicaciones serán transformaciones afines de la forma:
Lógicamente si a, b, c y d son menores que 1 en valor absoluto, entonces es contractiva.
Generalizando: si tenemos n transformaciones así y les asociamos una probabilidad pi (con i entre 1 y n) a cada una tenemos el llamado “juego del caos”, en donde partiendo de un punto vamos transformándolo aleatoriamente según la regla que le corresponda. Y por la autosimilitud (puntos fijos) del sistema tenemos una bonita fractal. También representaremos cada aplicación en una línea para ahorrar (y para no tener que usar tensores).
Ejemplos:
- - -
Bien. Para una de las asignaturas de libre configuración de la carrera (teoría del caos) hice un programa de fractales con varios módulos, entre ellos uno IFS. Entre otras cosas. La verdad es que las prácticas fueron una sobrada en todos los sentidos; por ejemplo, incluí ésta fractal IFS con mi nombre:
El truco es fácil: dibujamos un rectángulo en un papel, y calculamos las transformaciones que lo llevan a cada uno de los palotes que conforman cada letra; además, se puede distribuir la probabilidad en función del área de cada palote, para que el relleno de puntos sea más uniforme. En los fractales anteriores el degradado de negro a color representa la densidad de puntos en esa zona.
- - - - -
Años después, cuando terminé la carrera y para celebrarlo, decidí darle una vuelta de tuerca. Una de nuestras coñas era que al unir una colección de puntos cualquiera siempre aparecía la cara de Goofy.
Así que... cogemos una imagen de Goofy (mapa de bits 256x256 representando a [0, 1]2) y por cada pixel que pertenezca a su cara escribimos la línea de la aplicación correspondiente.
Lógicamente ai=di=1/256, bi=ci=0, ei=xi/256, fi=1-yi/256, y pi=1/n para i de 1 a n (n en este caso es 10.098, el número total de píxeles y por tanto filas de la matriz) y xi e yi son la columna y fila respectivamente del pixel en cuestión en su mapa de bits correspondiente.
En cualquier caso, ésta y no otra es la historia de la fractal de la cara de Goofy.
...
[ Celebrémoslo. ]
Regalo Nº 1: Pack de Sega Master System (uno, con la ranura de tarjetas, etc.).
Regalo Nº 2: Sega Mega Drive (uno, con el puerto EXT, audio bueno, etc.).
En principio era la Web, y la Web se hallaba desnuda y fea, con páginas en Times New Roman sobre fondo blanco. Y alguien dijo: creemos GeoCities para que la gente se cree páginas mierden con gifis animados a punta pala y colores chillones. Y GeoShitties fue creado.
Pero otro alguien dijo: pa chulo yo, pues haré un sistema de animación vectorial con scripting, para que la gente haga cositas dinámicas y de paso se nos quejen los Linuxeros y Maqueros del futuro. Y así nació el Flash.
Y es del Flash que hablaremos, o mejor dicho de algunos de los jueguecitos que se han hecho con él, pues realmente y en verdad os digo queridos hermanos que hay auténticas joyas; no hablaré de los que ya he citado anteriormente, como Seiklus o "You have to burn the rope". Ahí va una docenita.
Empecemos por un género muy adecuado a la plataforma: aventuras gráficas; podemos hallar algunas antiguas como La piedra de Anamara, de misterio con su puntito de terror. Si preferís algo más apacible, podéis probar Trader of Stories. Y por supuesto, hay clásicos del tema como Samorost (con su segunda parte, Machinarium, ...).
Personalmente me gustan las cosas experimentales. Simuladores extraños como The Majesty of Colors, cuasipoesías como Today I die (una mina este Daniel Benmergui) o cosas indefinidas como Coil.
A medio camino nos encontramos con algo tipo exploración de ambiente. Juegos como Small Worlds, Don’t Look Back (del autor de VVVVVV) o Grey.
¿Queréis algo más clásico? El original y adictivo Infectonator World Dominator, El simpático Haunt the House o el remake en flash del cásico Death Worm: Effing Worms.
Uf, ya vale de jugar por hoy.
Aquí viene otro de mis análisis, en este caso hardware: un Sprinter para PCW (una placa aceleradora para PCW, no me refiero al clon ruso de Spectrum).
Pero primero hablemos un poco del PCW: tiene un reloj de 32Mhz, el cual se divide hasta los 4Mhz para el Z80. Además, internamente tiene dos bancos de memoria dinámica, refrescada y decodificada a través del Gate Array.
Es decir, el G.A. se encarga de todo, pero a cambio nos penaliza con un único acceso cada 4 ciclos de procesador (es decir cada microsegundo, igual que el CPC). Eso nos deja una velocidad efectiva reducida de como unos 3,3 Mhz en media. Sin embargo, no hay contención por acceder al G.A. vía I/O, pero eso es otra historia.
Supongamos que ponemos un Z80 a 8Mhz con su señal de reloj correspondiente así sin más; ¿qué ocurriría?
Pues ocurriría que desde su punto de vista podemos hacer 2 accesos SEGUIDOS a memoria cada 8 ciclos. La clave está en la palabra "seguidos", por si no lo he remarcado lo suficiente: eso es algo que no ocurre en el Z80. Es decir, el Gate Array nos frenaría hasta dejarnos a la misma velocidad efectiva que teníamos originalmente.
Para que no se duerma la gente, ahí va una foto del Sprinter:
Como bien podéis ver, tenemos un Z0840008PSC (Z80 a 8Mhz, el doble que el original) por el centro, un banco de memoria en la parte superior (a base de 256K x 4) hasta 1,5MB (512KB instaladas en este caso) y en la esquina inferior derecha una bonita memoria estática de 128KB (TC551001PL).
Atención al detalle del puente usando hilo esmaltado de cobre. Los dos cables que salen (amarillo y negro) van a parar a las señales de 32Mhz (32 = 4 (frecuencia original, cogida del zócalo) * 8 (frecuencia del Sprinter)) y /MDIS (deshabilita el acceso a la RAM interna) respectivamente en el bus.
El Sprinter mapea su memoria a continuación de la instalada en el sistema (512KB en este caso, dando un total de 1MB de los 2MB máximos que admite de forma estándar), en la cual no hay contención pues está gestionada por el propio Sprinter. Sin embargo, tanto el CP/M como el TPA se encuentran en las 128KB inferiores (junto con la memoria de video y el mapeo del teclado).
Y esa es la función de la memoria estática anteriormente mencionada: una shadow RAM. Cuando se lee de las 128KB inferiores (exceptuando el teclado) se lee de esta memoria y no accede a la principal. Cuando se escribe, va a parar a ambas. Con esta chapucilla, la velocidad se ve incrementada.
Hay software mal programado en el que esto genera incompatibilidades de sincronización (por no usar las interrupciones del G.A.) e incluso totales (por los ciclos que tenemos antes de una interrupción). Pero en general, va muy bien.
Y por completitud, ahí va la cara de pistas:
* Ningún animal, Sprinter ni Espinete fue dañado durante la elaboración de este artículo. Gracias a Jaime por prestármelo. En caso de duda, consulte a su farmacéutico.
Como algunos de los que leen este blog sabrán, hay dos firmwares distintos para el Amstrad PCW: uno para los modelos con impresora matricial y otro para los de margarita (9512 y 9512+). Y que sus discos de arranque son incompatibles entre sí por usar una suma de comprobación en arranque del primer sector.
El primer firmware puede encontrarse listado, desensamblado y comentado en esta dirección. Del segundo no hay ni rastro, sólo esta conversación. Así que tenemos dos opciones: escribir un mail a alguien con quien me estoy escribiendo y que tiene TODOS los modelos de PCW y que me diga la diferencia usando el programa ahí especificado (de hecho, esa persona participa en esa conversación) o deducirlo a partir de:
Bien. Sabiendo que sólo es necesario un cambio de un byte para lograr el arranque, y sabiendo que la suma del sector de arranque pasa de ser congruente con $FF (-1) a serlo con 1 módulo 256, lo que pide el cuerpo es el cambio en la dirección $80 de memoria, de Inc A a Dec A ($3C -> $3D).
Al incrementar en 1 la suma y sabiendo que sólo nos queda un byte por modificar, sabemos que tenemos que tocar ese otro byte restando 1 módulo 256 (ese gran número, tan importante en la informática e incluso en este blog).
Por otro lado, hagamos un CRC-16 del firmware que sí tenemos; de ahí deducimos (probando) que es un CRC-16 con el polinomio del CCITT (no el de IBM) en forma MSB curiosamente. En cualquier caso ya está calibrada nuestra prueba.
Finalmente, teniendo en cuenta que el programa son sólo 256 bytes, aplicaremos fuerza bruta; sólo hay 255 candidatos a los que restar 1 y lanzar el algoritmo de CRC hasta que dé una solución. Y la da, y es única, y todo lo anterior es congruente. La solución simplemente toca una constante tonta de un retardo, nada esencial (en $2E, de $21 a $20).
Es curioso. Hubiese sido más fácil enviar ese email, pero extrañamente esto es, desde luego, más rápido. Al menos para mí.
No sé si alguien se ha preguntado alguna vez cómo empezó HabiSoft. Algunos de los que se pasan por aquí seguro recordarán:
Que en breve tuvo su sección secreta de programación:
Pero acabaron apareciendo varios proyectos, así que los recopilé con una interfaz extraña y contraseñas:
Un par de esos proyectos:
Y finalmente otra interfaz de entrada a HabiSoft que duró poco tiempo; hasta tenía una aventura conversacional mierdera integrada:
Cómo pasa el tiempo.
Finalmente he decido publicar el emulador. Esto es debido a cuatro razones:
Así que ahí va el link:
Y de regalo, mini-artículo sobre la protección (?) de los juegos de Opera:
Parte 1: Formato físico
Archivos analizados: Coleccion_Opera_Vol1.dsk, dy.dsk (Goody), Sol_Negro.dsk, corsarios.DSK, Gonzalezz.dsk, ... Todos imágenes de originales, sin cracks.
En conjunto, ganamos 18.944 Bytes / Cara y ofuscamos el juego (sólo se puede leer un directorio que contiene únicamente el EMS de arranque).
Parte 2: Software
No hay mucho que contar, la verdad. El sector de arranque es estándar, busca "????????.EMS" (GOODY.EMS, p.ej.) y lo carga (primer loader). En el directorio puede verse que han utilizado el disco de arranque del CP/M como base:
Una vez cargado, salta a $0000, de ahí a $0100 (se ve que por comodidad usan archivos COM como base) y empieza el segundo loader; inicializa memoria, video, y hace la carga de la pantalla de presentación y el juego (rutina en $0193, cargando siempre sobre el banco 1); a continuación se ejecuta tal cual (salto mediante, por la paginación, hasta $F000 y de ahí a $0100 (otra vez COM)). No hay encriptación o verificación alguna, sólo carga de sectores de 1024 bytes.
Conclusión: protección realmente simple. Además, puede volcarse la memoria y hacerse un .COM del juego en cuestión completamente desprotegido.
No le llegan ni a la suela del zapato al picor de los guisantes aquellos, pero...
Vamos a explicar el otro teaser, pero antes algo de historia sobre mis emuladores. ¿Por qué? Porque lo digo yo:
Es.Pectrum
Emulador de ZX Spectrum. Modelos oficiales, clones rusos, ciclos de bus, ULA exacta, contenciones, RZX, BetaDisk, disco 3”, MultiFace, Disciple, +D, GunStick, LightGun, Interface I y II, ...
PC-Cito
Empezó como un intento de emulador de XT, acabó siendo 386 + 387, con VGA (mal emulada) y las BIOS del Bochs.
PCW.es
Y finalmente, ahora sabéis por qué tenía destripado ese PCW, y la clase de experimentos que estoy haciendo. De momento arranca LocoScript y CP/M, pero no el BatMan. Vida esta. :/