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