Blog | Archivo | Contacto | Administración |
33 34 20 33 31 20 32 30 20 33 33 20 33 31 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 34 20 32 30 20 33 33 20 33 38 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 31 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 37 20 32 30 20 33 33 20 33 33 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 32 20 32 30 20 33 33 20 33 30 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 37 20 32 30 20 33 33 20 33 30 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 39 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 33 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 31 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 34 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 34 20 33 36 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 32 20 32 30 20 33 33 20 33 31 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 32 20 32 30 20 33 33 20 33 30 20 32 30 20 33 32 20 33 30 20 32 30 20
33 34 20 33 31 20 32 30 20 33 33 20 33 31 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 34 20 32 30 20 33 33 20 33 39 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 34 20 33 35 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 34 20 33 36 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 33 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 35 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 34 20 33 35 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 37 20 32 30 20 33 33 20 33 34 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 35 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 32 20 32 30 20 33 33 20 33 31 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 30 20 32 30 20 33 34 20 33 34 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 30 20 32 30 20 33 34 20 33 31 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 30 20 32 30 20 33 34 20 33 34 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 30 20 32 30 20 33 34 20 33 31 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 35 20 32 30 20 33 33 20 33 33 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 39 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 37 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 37 20 32 30 20 33 33 20 33 35 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 35 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 32 20 32 30 20 33 33 20 33 30 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 32 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 37 20 32 30 20 33 33 20 33 35 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 37 20 32 30 20 33 33 20 33 33 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 33 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 31 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 34 20 33 35 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 34 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 34 20 33 36 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 32 20 32 30 20 33 34 20 33 33 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 32 20 32 30 20 33 33 20 33 30 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 38 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 31 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 37 20 32 30 20 33 33 20 33 39 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 32 20 32 30 20 33 33 20 33 30 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 34 20 33 34 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 39 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 34 20 33 33 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 35 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 37 20 32 30 20 33 33 20 33 33 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 32 20 32 30 20 33 33 20 33 30 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 34 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 35 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 32 20 32 30 20 33 33 20 33 30 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 37 20 32 30 20 33 33 20 33 30 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 37 20 32 30 20 33 33 20 33 32 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 35 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 34 20 33 34 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 33 20 33 39 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 36 20 32 30 20 33 34 20 33 36 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 37 20 32 30 20 33 33 20 33 33 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 32 20 32 30 20 33 33 20 33 30 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 33 20 32 30 20 33 34 20 33 31 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 37 20 32 30 20 33 33 20 33 30 20 32 30 20 33 32 20 33 30 20 32 30 20
33 33 20 33 32 20 32 30 20 33 34 20 33 35
Queridos Reyes Magos:
Este año me he portado relativamente bien. Y ese es el problema. Quiero que para este año me concedáis un único deseo: quiero ser un cabronazo.
Me explicaré: aprovechando este final de año para reflexionar, me he dado cuenta de que en la mayoría de los casos he sido bueno con los demás pero algunas veces los demás no lo han sido conmigo. He transigido, he hecho deberes que no eran míos, he esperado y en general ayudado a la gente, pero no al revés. Hace cinco años estaría pensando como ahorcarles con sus propias tripas, pero ahora me dan pena.
Y ese es el problema, me dan pena. Me estoy convirtiendo en una puta nenaza como Jesús (ya se que tampoco os cae muy bien, sólo le regalasteis cosas una vez y encima de todo a 100; salvo los 2g de oro, que no daban ni para pipas, por otro lado). Es por eso que quiero ser un cabronazo egoísta, y si puede ser también me pido ser misógino e hipócrita, que son dos palabras que me gustan como suenan.
Felices fies... digo... ¡que os jodan! (tengo que ir practicando).
P(t): El grabador ese de PICs tan majo ya me lo compro yo, que en cosas tecnológicas no soléis atinar; aunque aun guardo con cariño ese Navy Moves para Spectrum.
Me apunto a la moda de blogs chapados por tiempo indefinido.
Teorema: Finde de mierda.
Demostración:
Viernes: Se acabó lo que se daba. :(
Sábado : Cumpleaños familiar en Seseña... si no fuese por la propia cumpleañera P, me hubiese abierto las venas con un langostino. :6
Domingo y Lunes: Sutto *Y* muette. Con su velatorio, funeral y trabajo a tiempo parcial de Call-Center. :S
Moraleja: Cervicales jodías... again...
Merlín se preparó para salir. Se lo tomó con calma; el tiempo no significa lo mismo para alguien que puede manipularlo a su antojo. Se puso finalmente su capa de crin de unicornio y el amuleto de Kr´noor. Podría haber ido a su destino atajando por otros planos o creando un portal, pero decidió ir andando. Eso sí, a la velocidad de la oscuridad, que como todo mago sabe, es más rápida que la de la luz; en cuanto la luz se va la oscuridad YA está.
-
Despertó, como cada noche, con los ojos abiertos; hacía rato que el sol se había escondido. Se levantó, como cada noche, y como cada noche se dio su baño con agua hirviendo, con esencias y con perfumes. Se vistió impecablemente, y sin apenas esfuerzo dio de un salto de algo más de tres metros que le situó en la ventana de arriba de su loft, situado en el ático. Desde ahí arriba se veía toda la ciudad. Quizás se alimentase un poco de sangre fresca antes de acudir a su cita. Como cada noche.
-
"Mierda, no llego", dijo Roger. "Puta mierda de basura Klingon... Debería haberme comprado cuando pude aquel X-Wing de segunda mano..." volvió a decir mientras manipulaba los mandos para trasladar la energía de los escudos hacia los motores. "Aguantarán," pensó, "y cuando esté lo suficientemente cerca la gravedad y el rayo tractor harán el resto". Fijó el rumbo en el ordenador de a bordo, saltó al hiperespacio y se fue a dormir un rato hasta que llegase a la reunión.
-
Allí estaban todos: El hada, el mago, el vampiro, el astronauta, el hombre lobo, el científico loco, el superhéroe, el periodista, el cultista loco, el detective, la momia y los demás.
Todos acudieron a su cita, nadie quería faltar a su partida mensual de rol. Jugaban a que estaban en un mundo sin magia, pero con una "ciencia" muy básica. Jugaban a ser consultores, informáticos, seguratas, señoras de la limpieza... Pero esta vez el master les guardaba una sorpresa.
"El jefe os reúne a todos," dijo, "y os dice que vuestra empresa ha sido comprada por Microsoft, y que habrá un reajuste de plantilla...", y con estas palabras empezó la más difícil de todas la crónicas...
Cuando H no es de Habi, proclamo: ¡he vuelto!
Nació porque no tenía otra cosa que hacer, fue feliz mientras el tiempo y las autoridades lo permitieron.
Y se vistió de todo lo malo; sueños rotos, el ropaje de los ángeles caídos.
Pero renació, cual tamagotchi de sus propios excrementos. Sintió lo bueno, y la luz.
Y la luz le daba señales y calor.
Entendió sin comprender. Era lo que era.
Y así fue por siempre.
-
Se ha vuelto demasiado simple (será por el IDA, que es la caña para código muerto). No mencionaré el Cube Media Player porque hablé de él hace poco en su propio post.
Así que diré que hace algún tiempo encontré en The Underdogs el Knight Time. Es un juego antiguo y raro, de Titus. Uno de los dos primeros juegos para PC que tuve y el primero con gráficos decentes (aunque mi ordenador era XT tenía SVGA).
El juego eran dos discos de 5 1/4; por lo incómodo de cambiar entre ellos y de su propio tamaño, puse ambos en uno de 3 1/2, pero como estaba protegido siempre miraban al principio en la unidad de 5 1/4 para buscar la protección.
Por aquel entonces no fui capaz de desprotegerlo. Usaba trucos como desviar las interrupciones 1 y 3 y las usaba para sus propias rutinas, con lo que no había nada que hacer con el Debug o el D86 (que nadie diga nada del Soft-Ice, eso es para 386 mínimo). Tampoco funcionaban los desprotectores de la época, sería que tenía una versión distinta, en cualquier caso era la que estaba en Underdogs.
Con más años de experiencia, mejores herramientas y un morbo rozando lo frikiesco (o un frikismo rozando lo morboso, según se mire) lo abrí. Y fue relativamente simple, pues una vez hacía todas las comprobaciones de protección la decisión de si había o no protección se tomaba en un solo punto. Cambié el salto condicional y funcionó, menos de 15 minutos. Además determiné que estaba programado con un compilador de C raro (ni MSC ni TC o BC) con rutinas en Asm. Localicé las de teclado, gráficas, joystick, etc.
Otro ejemplo, el Marranos en Guerra, juego antiguo que no instala en núcleos de NT, pero que me gusta; después de engañar al instalador para que lo instalase en XP el juego funciona, pero al salir inutiliza el teclado y el ratón en las ventanas que hubiese abiertas antes que él, incluyendo el escritorio.
Menos de dos minutos (el record hasta ahora): veo en importaciones EnableWindow y EnumerateWindows, hago referencias cruzadas y veo que desde la misma función, la cual se encarga de quitar o devolver input a todas las ventanas menos ella misma (supongo que para no molestar, pues casca el juego si sale de pantalla completa). Parcheo el salto condicional de esa función para minimizar los cambios (sólo cambian 6 bits en un byte) y el juego va perfecto. Se ve que al final no la llama por alguna razón (casque silencioso).
El último ha sido un juego de DOS que adquirí hace poco en su versión registrada y que me encantaba de crío, el Moraff’s World. Volví a jugar a él y todo iba bien, hasta que fui a enfrentarme con el enemigo especial del nivel 16. No aparecía por ninguna parte, y en el mapa me decía que fuera al este cuando estaba ya en el borde este de la mazmorra.
Este caso fue bastante más complejo, pues he estado dos días con el IDA. He localizado como va todo el tema gráfico, la magia, la forma de las estructuras de datos usadas en el programa, los enemigos, el mapa,... hasta que al final he visto como es el formato de los juegos grabados, a imagen y semejanza de las estructuras en memoria.
Así que en el juego grabado en ese nivel, archivo 40.dun (4 por el personaje, 0 porque es el nivel por defecto; los 1-7 son las mazmorras en sí mismas, 32 niveles por cada uno), y saltando los 3 primeros bytes se encuentran los descriptores de enemigos de ese nivel, 6 bytes por cada uno, siendo el primero el del enemigo que buscaba, ese Shadow Dragon King. Y en efecto, el primer byte, la coordenada X era 88 cuando la mazmorra tenía 78 como máximo; parcheé a 76, y al cargar estaba a dos casillas al oeste de mí, así que pude enfrentarme, vencerle y obtener la bonificación +25 para mi Long Sword.
Además descubrí analizando todo el juego ¡que se pueden hacer trampas! Si se pulsa Alt.gr. + 1 te da 10 de vida por la patilla, si lo dejas pulsado no para de subir, aun por encima de la vida máxima del personaje.
¡Atención! Este post contiene material de teoría de compiladores explícito. Si no se considera preparado, no lo lea (o sí, y suelte algunas de estas frases en sus reuniones de amigos y quede como un... friki).
Hoy voy a hablar del lenguaje ese que inventé y el cual tengo a medio implementar.
Lo primero que tengo que decir es que el código está organizado lógicamente en espacios de nombres anidados. El código fuente viene en archivos, los cuales no tienen necesariamente una correspondencia con esos espacios de nombres. Cada módulo puede tener varios (obligatoriamente debe contener al menos uno), y un mismo módulo puede estar definido en varios archivos (basta con usar el mismo nombre del espacio de nombres, el contenido se mezcla).
El compilador incluye también un intérprete pues, bajo ciertas condiciones, una función puede ser marcada para ser ejecutada en tiempo de compilación, y de esa manera generar código para ser compilado utilizando la potencia expresiva del propio lenguaje, y haciendo obsoleto el concepto de procesador de macros.
Cualquier convención de llamada de funciones, uso de registros, inclusión inline, y en general directivas de compilación no se pondrán como pragmas de preprocesadores, casos especiales de comentarios o palabras reservadas del lenguaje. Sencillamente serán etiquetas con valores dentro del propio código, como si las propias funciones fueran objetos en un lenguaje de objetos sin herencia.
El lenguaje es en sí mismo imperativo, pero con notación funcional y considerando como funciones todos los elementos sintácticos (lo cual es MUY útil en el caso de los IF para el tema de asignaciones). Permite anidar funciones, y tiene orientación a objetos con herencia simple e interfaces (ortogonales entre sí, claro). El nivel semántico queda definido por el sangrado (libre) del código, así no se necesitan delimitadores sintácticos a la { } o palabras reservadas del tipo Begin - End.
Tiene un sistema de tipos estricto y fuerte, con
La sintaxis a nivel externo es muy simple y matemática:
NameSpace Fulanito
Suma: Integer * Integer -> Integer
Suma(x, y)=
Resultado: Integer
Resultado = x + y
Return Resultado
Por ejemplo; para desambiguar una variable que contenga una función de una declaración de función, hacemos un tipo único agrupado: (Integer * Integer -> Integer) en vez de la declaración de Suma. De igual manera, (Integer * Integer) -> Integer nos define una función que sólo tiene un parámetro, una tupla de dos valores enteros.
La compilación se hace en dos pasadas, pues se pueden usar variables y funciones definidas fuera de orden; el compilador mantiene todo en su base de datos de memoria, eliminando la necesidad de código objeto. Las librerías estáticas se enlazan en su forma de código intermedio, para así poder aplicar optimizaciones avanzadas al programa en conjunto (y de nuevo, no requerir código objeto propiamente dicho, sino una base de datos de espacios de nombres nativa al compilador).
De acuerdo, esto usa bastante memoria y enlentece el compilado, pero genera aplicaciones mucho más eficientes.
Finalmente, después de hacer las optimizaciones buenas, se traduce a la plataforma y se hacen las típicas optimizaciones de registros y mirilla típicas de la plataforma y a correr.
Si alguien ha entendido algo, ¿algún comentario?