[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
      zurckgelieferte 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]