|
|
¿Por
qué ocurre?
Existen ciertas instrucciones del
Clipper que necesitan que transcurran una cierta
cantidad de ciclos de reloj para ejecutar la
siguiente. Las instrucciones para ejecutarse
necesitan una cierta cantidad (T) de ciclos de
reloj del procesador. De esta manera si
ejecutamos una instrucción una cantidad (N) de
veces, entonces consumimos N x T ciclos de reloj.
Esta es la idea de la rutina WAIT, utilizada por
el Clipper para generar los tiempos de espera.
Esta rutina realmente no fue muy bien ideada, ya
que es como hacer FOR i=1 TO 100;NEXT.
De hecho esa esta es la parte de la rutina que
realiza la espera :¿Quien
recuera el PC-MAN en modo texto? Funcionaba
barbaro en la 286, pero imposible de jugarlo en
una 486, al primer casillero que te movías, ya
te habían comido.
Por
qué digo que la rutina no fue bien ideada,
porque cada nueva generación de procesadores,
además de aumentar la velocidad de procesamiento
(Mhz), disminuye la cantidad de ciclos necesarios
para ejecutar una instrucción. Por lo tanto N x
T resulta ser más chico y ya no alcanza para
esperar el tiempo necesario.
Soluciones:
Teniendo en cuenta (N x T):
1) Aumentar (N), o sea, la cantidad de veces que
se ejecuta la instrucción. (Aumentar el FOR)
2) Aumentar (T), o sea, el tiempo que tarda en
ejecutarse. (Agregar instrucciones dentro del
FOR)
Teniendo en cuenta el análisis de los
procesadores y pensando en el futuro:
3) Tomar como parámetro de espera algo más
constante e independiente de la velocidad del
procesador y de sus características. El reloj
interno de la computadora es un perfecto
parámetro.
Aplicando
las soluciones:
Para agregar a las compilaciones:
La solución 2 es la utilizada por __WAIT_4.OBJ y
por una variante de este que encontré en un
programa durante el estudio.
La solución 3 es la utilizada por __WAIT_B.OBJ,
creo que es la mejor opción porque no depende
del microprocesador. Creo que esta solución va a
servir hasta en los procesadores de 1Ghz.
Para solucionar aplicaciones sin tener los
fuentes:
La solución 1 es la única posible, porque
no necesita agregar código y no precisa ningún
descompilador.
La
solución a los sistemas que producen este error,
es tan sencilla como ejecutar un programa.
De todas maneras se debe realizar una copia de
seguridad del sistema a reparar.
El programa fué probado en sistemas compilados
con Clipper 5.2, 5.2c, Clipper 5.3b, CA-Tools
3.0b.
Con los enlazadores RT-Link, Blinker 2.x, 3.x,
4.x, Blinker 1.0 y Exospace de Clipper 5.3.
Las pruebas no fueron exhaustivas, pero repararon
el problema en todos los casos.
No
es compatible con ejecutables comprimidos con
Blinker ni con ningun otro compresor.
No repara ejecutables que funcionen con .PLL, y
tampoco repara los .PLL.
Debido a que el programa busca una cadena
determinada, podría llegar a confundir alguna
rutina que contenga esa misma cadena, pero creo
que sería un caso muy raro, ya que la cadena a
buscar contine 12 bytes.
|