让你的程序能自动启动UCDOS

Author: 王宏风 Date: 1997-01-01

  当前不少中文软件都没有自动启动中文系统如UCDOS的功能。笔者有一次无意中运行了一个中文教学软件,谁知里面的提示全是中文,所有的中文在西文环境下成了乱七八糟的字符。我尝试了许多方法想退出,均未奏效。更遗憾的是,此程序还不允许中断。无奈只好重新开机。
  为此,我设计了不少方案,其中最简洁的办法编制下面这个过程文件autorunucdos,并在自己文件的开始处调用这个过程文件,如:
  uses dos;
  procedure autorunucdos;
  begin
  swapvectors;
  exec(’c:\command.com’;’/c RD16’);                                   {装字模}
  swapvectors;swapvectors;
  exec(’c:\command.com’;’/c KNL’);                                    {装UCDOS}
  swapvectors;
  end;
  当然,此过程文件有一个很大的缺点,它不会判断当前是否已处在中文环境下,因此每次都要将UCDOS重新装一次,浪费了用户的时间。并且当UCDOS启动失败,它也不会采取别的措施,仍直接进入软件。
  比较完善的处理方法是先测试是否已在中文环境下,测试函数如下:
  function check-in-ucdos:boolean;
  var p:pointer;
  sg:word absolute $0000:$0042;
  {INT 10段}
  os:word absolute $0000:$0040;
  {INT 10偏移}
  i:integer;
  b:byte;
  begin
  b:=0;
  for i:=0 to 12 do
  begin
  p:=ptr(sg,os+i);
  b:=b xor byte(p^);
  end;
  if (b=4)     {UCDOS 1.0}
  or (b=5)     {HDOS}
  or (b=170)   {UCDOS 2.01、EGA方式}
  or (b=69)    {UCDOS 2.01、VGA方式}
  or (b=26)    {DOS 4.03}
  or (b=70)    {CCDOS 4.0}
  then check-in-ucdos:=true;
  else check-in-ucdos:=false;
  end;
  下面是一个完整的能自动测试并自动启动UCDOS的过程autorunucdos2:
  procedure autorunucdos2 {自动启动UCDOS的改进型}
  begin
  if not check-in-ucdos then autorunucdos;
  if not check-in-ucdos then     如果启动UCDOS失败
  begin
  write in (’run ucdos error!’);
  halt(0);
  end;
  end;
  值得注意的是,此过程文件也必须在你的程序开始处调用,以免出现内存不足而调用失败。在C语言编的软件也可调用。