[Back to HARDWARE SWAG index]  [Back to Main SWAG index]  [Original]

>     Hi!  I was wondering.. does anyone have any TP codes to find
 > out what type
 > of machine (ie. XT, 286, 386, 486, Pentium, etc) that the user
 > is running?
 > The type of coding (Inline Assembly or BASM).. I don't care..
 > just make sure
 > that it is usable by Turbo Pascal 6.0 =8)  Thanks!

{
  GetCPU                             Byte
  ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  Ermittelt den arbeitenden CPU-Typ.  Der
  zur�ckgelieferte Code entspricht:

     0 - Intel 8088
     1 - Intel 8086
     2 - NEC V20
     3 - NEC V30
     4 - Intel 80188
     5 - Intel 80186
     6 - Intel 80286 (or Harris or... whatever)
     7 - Intel 80386 (or AMD or Cyrix (?) or... whatever)
     8 - Intel 80486 (or AMD or Cyrix (?) or... ;))
     9 - Intel Pentium (still looking forward for clones... ;))
}
Function GetCPU: Byte; Assembler;
Const processor: Byte= $FF;
Asm
    mov  al, processor
    cmp  al, 0FFh
    jne  @get_out
    pushf
    xor  bx,bx
    push bx
    popf
    pushf
    pop  bx
    and  bx,0F000h
    cmp  bx,0F000h
    je   @no286
    mov  bx,07000h
    push bx
    popf
    pushf
    pop  bx
    and  bx,07000h
    jne  @test486
    mov  dl,6
    jmp  @end
@test486:
    mov  dl,7
    xor  si,si
    mov  ax,cs
{$IFDEF DPMI}
    add  ax,SelectorInc
{$ENDIF}
    mov  es,ax
    mov  byte ptr es:[@queue486+11], 46h     { 46h == "INC SI" }
@queue486:
    nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop
    or   si,si
    jnz  @end
    inc  dl
    db   66h ; pushf      { pushfd }
    db   66h ; pushf      { pushfd }
    db   66h ; pop  ax    { pop eax }
    db   66h ; mov  cx,ax { mov ecx,eax }
    db   66h,35h
    db   00h,00h,20h,00h  { xor eax,(1 shl 21) (Pentium ID flag) }
    db   66h ; push ax    { push eax }
    db   66h ; popf       { popfd }
    db   66h ; pushf      { pushfd }
    db   66h ; pop  ax    { pop eax }
    db   66h,25h
    db   00h,00h,20h,00h  { and eax,(1 shl 21) }
    db   66h,81h,0E1h
    db   00h,00h,20h,00h  { and ecx,(1 shl 21) }
    db   66h ; cmp ax,cx  { cmp eax,ecx }
    je   @is486
    inc  dl
@is486:
    db   66h ; popf       { popfd }
    jmp  @end
@no286:
    mov  dl,5
    mov  al,0FFh
    mov  cl,21h
    shr  al,cl
    jnz  @testdatabus
    mov  dl,2
    sti
    xor  si,si
    mov  cx,0FFFFh
{$IFDEF DPMI}
    push es
    push ds
    pop  es
{$ENDIF}
    rep  seges lodsb      { == rep lods byte ptr es:[si] }
{$IFDEF DPMI}
    pop  es
{$ENDIF}
    or   cx,cx
    jz   @testdatabus
    mov  dl,1
@testdatabus:
    push cs
{$IFDEF DPMI}
    pop  ax
    add  ax,SelectorInc
    mov  es,ax
{$ELSE}
    pop  es
{$ENDIF}
    xor  bx,bx
    std
    mov  al,90h
    mov  cx,3
    call @ip2di
    cli
    rep  stosb
    cld
    nop; nop; nop
    inc  bx
    nop
    sti
    or   bx,bx
    jz   @end      { v20 or 8086 or 80186 }
    cmp  dl,1
    je   @its8088
    cmp  dl,2
    je   @itsV30
    cmp  dl,5
    jne  @end
    mov  dl,4
    jmp  @end
@its8088:
    xor  dl,dl
    jmp  @end
@itsV30:
    mov  dl,3
    jmp  @end
@ip2di:
    pop  di
    push di
    add  di,9
    retn
@end:
    popf
    mov  al,dl
    mov  processor,al
@get_out:
End;

[Back to HARDWARE SWAG index]  [Back to Main SWAG index]  [Original]