Contributor: JORT BLOEM

{
>>> Well, I have it now: the program was compiled in G+ mode (enable
>>> 286-instructions) and it therefore bombed on an 8088 or 8086
>>> machine. Too bad it didn't do so graciously with a proper error.

I've thrown together this little unit here - if your program or unit uses
$G+, just add this as the FIRST! unit in the USES clause. It is called
_286.PAS:
}

(*
  Programs compiled with {$G} compiler directive enabled do not
  check the processor at runtime to determine whether it is
  286-compatible. Trying to execute 80286 instructions on an 8086
  or an 8088 will lock up the computer. This program checks
  for the presence of a 286-compatible chip at runtime.

  Put this unit as the FIRST in the USES clause.
*)

Unit _286;

Interface

Implementation

function Is286Able : Boolean; assembler;
asm
  PUSHF
  POP     BX
  AND     BX,0FFFH
  PUSH    BX
  POPF
  PUSHF
  POP     BX
  AND     BX,0F000H
  CMP     BX,0F000H
  MOV     AX,0
  JZ      @@1
  MOV     AX,1
 @@1:
end;

begin
  if not Is286Able then
  begin
    Writeln('Need an 80286-compatible system to run this program');
    Halt(1);
   end;
end.

{--------------------- CUT HERE ------------------}

{
 This can be put in individual units, just make sure it is the FIRST
 unit in the USES clause, eg

  Uses
    _286,
    Crt,
    Dos,
    KeyTTT5;
}