Program EnableCyrix;

{Test for CYRIX CPU first}

procedure enable_cyrix_cpuid;
assembler;
asm
   cli
   {Get Cyrix reg c3h}
   mov   al,0xc3
   out   $22,al
   in    al,$23
   {Enable config access}
   mov   cl,al
   mov   bl,al
   and   bl,0xf
   or    bl,0x10
   {Set Cyrix reg c3h}
   mov   al,0xc3
   out   0x22,al
   mov   al,bl
   out   0x23,al 
   {Get Cyrix reg e8}
   mov   al,0xe8
   out   0x22,al
   in    al,0x23
   {Set "CPUID" bit}
   or    al,0x80
   mov   bl,al
   {Set Cyrix reg e8}
   mov   al,0xe8
   out   0x22,al
   mov   al,bl
   out   0x23,al  
   {Get Cyrix reg fe}
   mov   al,0xfe
   out   0x22,al
   in    al,0x23
   {Is CPU a 6x86(L)?}
   and   al,0xf0
   cmp   al,0x30
   jne   @not6x86
   {Get Cyrix reg e9}
   mov   al,0xe9
   out   0x22,al
   in    al,0x23
   {Fix 6x86 SLOP bug}
   and   al,0xfd
   mov   bl,al
   {Set Cyrix reg e9}
   mov   al,0xe9
   out   0x22,al
   mov   al,bl
   out   0x23,al
   @not6x86:
   {Set Cyrix reg c3}
   mov   al,0xc3
   out   0x22,al  
   mov   al,cl
   out   0x23,al
   sti
end ['eax','ebx','ecx','edx'];

begin
   writeln('Enabling...');
   enable_cyrix_cpuid;
   writeln('Enabled.');
end.