jepalza escribió:mcleod_ideafix escribió:La verdad es que me divierto más buscando estas cosas que jugando al juego en sí, pero ahora por lo menos podré verlo entero y disfrutarlo, en lugar de frustrarme
Ya "semos" dos. Nunca he publicado trucos o "pokes", pero es algo que hago mucho, por que, como tú bien dices, soy un torpe en los juegos.![]()
(no solo busco trucos a juegos, tambien a algunas cosillas de productividad, como un editor de textos del año de la polka, del 91,antiguo shareware, que me encanta, pero "estaba" limitado a solo 30 salvados de ficheros)
También se pueden usar estas técnicas "para el bien". Hace ya casi 8 años, en es.comp.sistemas.sinclair salió el tema de que el software que acompaña al sistema de desarrollo cruzado P.D.S. tenía una "protección" por la cual el editor no arrancaba si no estaba presente el hardware en el bus ISA.
Resulta que tal protección no lo era, sino que era un fallo de programación: un salto que debería haber sido a otro sitio se ensambló incorrectamente (me recordó al "fallo" de la rutina NMI de la ROM del Spectrum). Total, que con el DEBUG de MS-DOS seguí la traza del programa, averigüé dónde estaba el bloqueo del programa y lo parcheé. Ahora el editor del PDS puede arrancar aunque no tengas pinchada la tarjeta ISA.
https://groups.google.com/d/msg/es.comp ... e0sDrL-tIJ
Código: Seleccionar todo
Yo con el DEBUG de MSDOS "detodalavida", he conseguido averiguar esto:
En determinado punto del programa, después de marearte redirigiendo la
interrupción 01 un par de veces, inutilizando así cualquier intento de
ejecución paso a paso con un debugger de modo real (el debug trabaja
así), me encuentro con una llamada a una rutina, que entre otras cosas,
redirige la interrupción de breakpoint (la 03), inicializa el contador 0
del 8254, y redirige las interrupciones 8 y 9 (esta última, la de
teclado) a rutinas propias suyas.
Después eso está lo más interesante: según el esquemático, los puertos
usados en el PC están del rango 300h - 31Fh, así que el programa se pone
a escribir valores en puertos dentro de ese rango, concretamente en los
puertos 306h, 302h y 304h. Cada OUT está seguido de 3 saltos para "hacer
tiempo" al bus ISA que es muy lento.
El último OUT es el interesante: mete el valor 8Bh en el puerto 302h, y
después de los 3 saltitos, hace un IN a ese mismo puerto y mira si el
valor leido es 8Bh. Si es así, sigue el programa. Si no...
... DEBERIA VOLVER A HACER IN A ESE PUERTO PARA SEGUIR CHEQUEANDO PERO....
... NO LO HACEEEEEEEEEEE!!!
Miren, miren:
1E6A:6BB9 EC IN AL,DX
1E6A:6BBA 3C8B CMP AL,8B
1E6A:6BBC 75FC JNZ 6BBA
Esto parece ser un fallo: el JNZ debería haberse hecho a 6BB9, y no a
6BBA. Ni que decir tiene que si el primer "IN" no da el valor esperado
(8Bh), jamás lo dará!
Esta es la parte de rutina que hace estos IN y OUT's a la tarjeta, con
el IN dichoso al final:
1E6A:6B87 BA0603 MOV DX,0306
1E6A:6B8A B098 MOV AL,98
1E6A:6B8C EE OUT DX,AL
1E6A:6B8D EB00 JMP 6B8F
1E6A:6B8F EB00 JMP 6B91
1E6A:6B91 EB00 JMP 6B93
1E6A:6B93 B202 MOV DL,02
1E6A:6B95 B0FF MOV AL,FF
1E6A:6B97 EE OUT DX,AL
1E6A:6B98 EB00 JMP 6B9A
1E6A:6B9A EB00 JMP 6B9C
1E6A:6B9C EB00 JMP 6B9E
1E6A:6B9E B204 MOV DL,04
1E6A:6BA0 EE OUT DX,AL
1E6A:6BA1 EB00 JMP 6BA3
1E6A:6BA3 EB00 JMP 6BA5
1E6A:6BA5 EB00 JMP 6BA7
1E6A:6BA7 B08B MOV AL,8B
1E6A:6BA9 B202 MOV DL,02
1E6A:6BAB EE OUT DX,AL
1E6A:6BAC EB00 JMP 6BAE
1E6A:6BAE EB00 JMP 6BB0
1E6A:6BB0 EB00 JMP 6BB2
1E6A:6BB2 803E801701 CMP BYTE PTR [1780],01
1E6A:6BB7 7411 JZ 6BCA
1E6A:6BB9 EC IN AL,DX
1E6A:6BBA 3C8B CMP AL,8B
1E6A:6BBC 75FC JNZ 6BBA
1E6A:6BBE EB00 JMP 6BC0
Bueno, pues lo que he probado es a cambiar ese JNZ 6BBA por 2 NOP's
monísimos, y lo que he conseguido es que me salga la ventana del editor,
con el cursor en rojo, y el teclado parece que responde, aunque de ahí
no he pasado...
Para conseguir esto, coged vuestro editor de ficheros binarios favorito,
y desplazarse hasta el offset 17CBCh : a partir de ahí, cambiad la
secuencia "75 FC" por "90 90" y grabad el resultado.