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

El expediente X que nadie pidió
eNigma
La cuadratura del píxel
Portando desde Spectrum
Inexorable

Últimos comentarios

Habi
NoSupoResolverLaFuncion
Edu
Habi
EnriqueGG

Calendario

No hay fechas.

Categorías

Chorradas
Paranoias
Posts lúcidos
Tecnoesoterismo
Yuyus

Cenas de Abj

Abj debe 7 cenas.

Frase célebre

Zarith: ¬__¬ te mataré tantas veces que parecerá un asesinato en serie

Otro ciclo

Habi - 28/07/2011 23:59:59 - Yuyus

4


Habi's way

Habi - 18/07/2011 23:48:16 - Tecnoesoterismo

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:

  1. Sólo se modifican dos bytes, uno para la comprobación del sector y otro para compensar la suma del programa.
  2. Tengo unos CRCs de ambos firmwares.
  3. Tengo sendos sectores de arranque.
  4. Mi 9º sentido (el de ingeniero inverso) me dice que no necesito más.

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í.

4


Destroy Everything You Touch

Habi - 13/07/2011 13:48:45 - Chorradas

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.

2


Externalizando el PCW

Habi - 06/07/2011 13:37:37 - Tecnoesoterismo

Finalmente he decido publicar el emulador. Esto es debido a cuatro razones:

  1. Sólo existe otro emulador, el cual se centra más en ampliar artificialmente las máquinas emuladas que en hacer una emulación exacta.
  2. Esta comunidad es mucho más reducida que la de Spectrum. Por lo tanto, en media recibiré menos amenazas. Más tolerable, por tanto.
  3. La emulación es semi decente. Tiempos, sonido, etc.
  4. [RESERVADA PARA FUTUROS USOS].

Así que ahí va el link:

http://www.habisoft.com/pcw

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.

  1. El disco consta de sus 40 pistas normales, no hay información extra en ese sentido. Todo el juego se halla contenido en una cara.
  2. Las pistas 0-2 son estándar, 9 sectores de 512 bytes, interleave de 2.
  3. De la pista 3 en adelante (inclusive) los sectores son de 1024 bytes, 5 por pista, con ordenación secuencial. Eso nos da unos 512 bytes extra por pista con respecto a un formato estándar.
  4. No hay sectores débiles, información entre la pista, corte laser ni nada avanzado. Es una protección simplemente geométrica y bastante simple.

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.

12


Más mierda, más wasabi

Habi - 20/06/2011 23:19:06 - Yuyus

No le llegan ni a la suela del zapato al picor de los guisantes aquellos, pero...

0


Emulando

Habi - 18/06/2011 19:04:16 - Tecnoesoterismo

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. :/

7


N-ésima cagada

Habi - 11/06/2011 1:25:29 - Yuyus

Por aquí tenemos la costumbre de terminar todos los refranes en "patada en la boca". En este caso tenemos: En casa del herrero, patada en la boca.

Bien. Todo comenzó cuando me pregunté cuán rápido podría ser el puerto paralelo de un ordenador moderno (integrado en su controlador IO y accedido a través de LPC) con respecto a uno clásico.

Así que me bajé un driver de acceso a puertos, el cual venía hasta con un componente escrito para Delphi. Vale, escribo un programa que accede 1M de veces a algún puerto y calcula la frecuencia. Y en el caso de $378 me da más de 80Mhz en escritura, y más de 75Mhz en lectura. Wow.

Al principio no me lo creí, pues el LPC debe dar un ancho de banda comparable al ISA. Pero después de ver que todo me iba bien decidí, erróneamente, aceptarlo; a saber cómo integran las cosas hoy en día, lo mismo colgaba del puente sur directamente.

Con eso puedo adaptar una unidad de disco y controlar todos los aspectos desde el PC, sin usar controladora ni nada; eso pensé, pues estaba haciendo un proyecto similar a través de USB y esto me simplificaba mucho. Así que me dispuse a ello:

Para acelerar, pasé de usar el componente y llamé directamente a las funciones del driver desde mi programa. Se hacen algunas funciones básicas (como dirección, paso, …), otras intermedias (como Index, Seek), y a probar.

Conecto, le hago los primeros tests, y… ¡perfecto! Descubro que la señal IDX no se apaga inmediatamente, sino que se mantiene un rato (arreglo fácil) y el resto (control del motor, cabezales, densidad, lectura, escritura, etc.) van perfectos. Puedo, en efecto, leer las magnetizaciones y decodificar todo con el PC, pudiendo por tanto leer discos de Amiga, C64, etc.

Así que me dedico a almacenar valores, temporizados con QueryPerformanceCounter y es entonces cuando descubro con horror que captura muchos menos de los que debería. Haciendo pruebas veo que las lecturas al puerto son mucho más lentas de lo que esperaba, algo más de 350Khz (bastante superior a un puerto paralelo normal, pero yo necesito al menos un par de Mhz para lo que quiero; y muy por debajo del ISA, ¿nos frena el integrado en este caso?).

Y es que no basta con crear el componente de acceso a puertos; además hace falta llamar a un método para su inicialización interna, que no se llama desde su constructor. Una vez llamado, los resultados son los mismos.

Finalmente, ya estaba pensando abandonar el prototipo en placa de agujeros y volver a mi diseño original con PIC e interfaz USB 2.0 cuando me he dado cuenta de algo: la contención es realmente similar en otros puertos em los que no debiera serlo; es decir, es consecuencia del overhead de los cambios a modo núcleo, IO, etc. Ayh. Usando otro método en un SO de 32 bits logro más de 750Khz, y lo mismo bajo Linux con ioperm / iopl. Ayh ayh. En cualquier caso insuficiente, gracias a esta arquitectura chapucera.

4


Teaser

Habi - 05/06/2011 23:07:55 - Chorradas

Llevo tiempo sin publicar nada. Así que, aunque no me gustan los teasers, ahí van un par de dos proyectos distintos...

3


Arte aviar

Habi - 19/05/2011 20:59:40 - Yuyus

Bolsipoio vomitón sobre pseudocroma glauco:
 
Y de regalo:
 

5


Dragon Bore

Habi - 18/05/2011 22:08:36 - Chorradas

Hace poco, buscando algo entre mi colección de CDs originales, me encontré con un añejo juego: Dragon Lore: the legend begins (1994), publicado como parte de una colección de juegos en CD-ROM de Planeta DeAgostini en 1996.

El juego ha envejecido bastante mal; a pesar de ser un pseudo-3D con gráficos renderizados éstos son VGA estándar (320x200x256) en vez de la SVGA ya típica por esas fechas (640x480x256 como p.ej The 7th guest que es del año anterior o Myst también del 94).

El pseudomovimiento de los personajes es lo peor: dentro del juego son sprites 2D estirados malamente en la pantalla, y en las animaciones 3D renderizadas es patético, a saber qué se fumaron los ¿animadores?

Pero lo peor es la interfaz de usuario, es indescriptible lo incómodo de tener que usar los dos botones del ratón y de forma distinta para cada cosa, y sobre todo el tener el mismo atajo para hablar con alguien Y para atacarle; ideal para hacer amigos. Además el juego cuenta con un desarrollo absolutamente lineal y extremadamente simple.

Sin embargo, los paisajes están muy trabajados (al contrario que los personajes), y la música es decente. Y para la época supongo que era un buen juego, con el que bastaba ver la intro para quedarte embobado.

En cualquier caso, decidí desempolvarlo, jugarlo un poco y mirarlo por dentro (desempaquetándolo previamente). Y así es como descubrí varias cosas. Como que la edición de Planeta no es la original.

Supongo que habrá una edición original en castellano, porque por dentro existen recursos para inglés, francés, español y alemán en los textos cortos y largos, así como soporte de una demo. En la edición de planeta están los textos en inglés y francés, y no hay español; sólo han traducido los textos cortos de descripción para el inventario (en SmallENG.bin) sobre el propio idioma inglés y también la interfaz en el ejecutable (Tales.exe).

Por eso esta versión NO tiene subtítulos. A cambio tiene un doblaje realmente malo al castellano latinoamericano basado en una peor traducción. Y como marca de la casa, Planeta usaba una imagen de CD con mayor tamaño que el de grabación, para que diese errores de lectura si se intentaba copiar.

Así que ayer mirando por internet, localicé y bajé la última versión en inglés, la Gold. Para empezar, el intérprete no es mismo: pasamos de un programa de algo más de 100KB escrito en ensamblador (requiere casi 600KB, pero funciona en mi viejo XT) a uno hecho en Watcom C de casi de 2MB (necesita esa memoria, y un 386; y al contrario que el primero, no tiene una caché variable XMS / EMS).

Desgraciadamente han cambiado más cosas y no puede sustituirse tal cual sin más, porque con éste nuevo SÍ funciona la canción del inicio en DosBox y automáticamente pone su velocidad (por estar en modo protegido). Internamente han agrupado los archivos de de zona (.kf, .vue, .zon y .bit) en uno solo (.kfg), han añadido sincronización en la voz (.pls) y una nueva revisión del formato .hnm. Y algunos cambios menores, como música ambiente, mejor menú, cursor de espada en vez de Werner dando vueltas, pequeñas animaciones extra, animaciones sin reborde negro, etc. Y por fin botones separados para hablar y atacar.

A cambio han quitado muchos sonidos que por otro lado son innecesarios; por ejemplo, no hacen falta 32 sonidos de esquivar (WOOSHxx.VOC), los 10 de la Gold sobran. Y además con la nueva versión (HNM4) de los archivos .hnm ocurre que la versión Gold al final ocupa algo menos que la de Planeta.

Otra cosa que me llamó la atención en ambas versiones han sido los parcheos: para inutilizar archivos del empaquetamiento machacan el nombre a “xxxxxxxx.xxx” y así no tener que reempaquetar 600MB de datos. Y curiosamente que en la Gold utilizan un modo X para el video (con unas rutinas realmente lentas, necesitarás un 386 decente o mejor un 486) para un juego que no lo puede aprovechar pues no hay scrolls (framebuffer mayor) ni se usa un segundo buffer (página) de video.

Por todo lo demás son casi idénticas. Algunas diferencias mínimas de cara al usuario, como:

   

 

   

¿Por qué he perdido tiempo con todo esto? No sé, pero no ha estado mal.

2


Reglas del 10:
10 últimos   10 después   10 antes   10 primeros