逆向工程为旧计算机编写的延迟函数

时间:2014-03-26 14:51:53

标签: io delay reverse-engineering pascal turbo-pascal

我正在尝试移植一些我所交给的旧Pascal代码,其目的是控制数字I / O卡,并且我遇到了涉及等待功能的障碍。无论何时发送信号,程序员都会做这样的事情

[Set the port status]
LoopDelay([a long integer])
[Set the next port status]
LoopDelay([next long integer])  
etc.

LoopDelay看起来像这样:

procedure loopdelay(looping:longint);
var
  counter,count : longint;
begin
  for counter:=1 to looping do
    inc(count);
end {loopdelay};

在我看来,他根据处理器速度做了一些数学计算,并计算了他需要迭代循环等待一定时间的次数。我怎样才能知道等待的时间长短?

其他信息: 处理器是80年代末/ 90年代初486(根据维基百科在20和66 MHz之间)。计算机运行DOS或早期Windows,代码使用Turbo Pascal 7编译。传递给loopdelay的两个常量是1266和6328。

我应该很快就会访问这台机器,所以希望我能够找到确切的处理器。理想情况下,我想要一个可以插入时钟速度的公式。

2 个答案:

答案 0 :(得分:0)

使用实际的pascal实现,您可以使用延迟过程,不需要延迟循环。但延迟应该多久?我可以想到四种方法来获取这些信息。

  1. 最终,您可以找到卡片的文档或其中列出必要延迟的部分。

  2. 你可以找到一台旧PC并测量一个计数非常大的延迟循环。

  3. 您反汇编循环延迟程序,查找486手册并计算循环手动的时间。

  4. 尝试并错误并添加一个良好的安全边际。

答案 1 :(得分:0)

循环延迟是我过去几次遇到的事情。他们看起来像是不好的编程习惯。我使用旧的DOS终止和保持驻留状态将其重写为中断例程,或者将其插入由实时时钟读取和比较触发的事件循环。这可能是您可以改进代码的地方。