[Back to HARDWARE SWAG index] [Back to Main SWAG index] [Original]
{
> I only have TASM 2.2 or something and can't get to to compile CPUID and
> don't know the opcodes to code it with a couple of DB statements in
> Pascal's BASM...
DB $F,$A2
EAX must be set to 0 or 1 to request 2 modes of CPUID. Try looking in
Interrupt List for more info...
> Oh, and finally, I notice CPUID is being INCLUDED in the latest mask of
[...]
> As CPUID is accepted as being the pentium detector code, some software out
> there may be getting it wrong! CPUID does (correctly) report a 4 for
> family type (logical as a pentium reports 5) but even so, I didn't know
> intel had started doing this!
> Oh, and checking for ability to toggle the appropriate bit in eflags to
> test for CPUID ability works too...
A lot of software recognizes Pentium only by this bit...
> Finally, if you know any way to identify a 386DX from a 386SX, please let
> me know!
By timing memory transfers. 386sx and 486slc have 16 bit access while 386dx
and 486dlc do 32 bits at a time. Below is my procedure, mostly BASM :-( It may
get wrong if there are interrupts occuring while test.
}
function dx386 : boolean;
{
Checks whether CPU is 386SX or DX. This is done by timing memory transfers:
- on SX, there is very small difference between 32 bit moves and double
16 bit moves, because SX does them 16 bit at a time anyway
- on DX, dbl 16 bit moves are slower than 32 bit ones, because it does them
at 32 bits anyway, so half of them is misaligned (requiring two movs).
On SX, mov32/2*mov16 gives about 1.0-1.1 (with loop/timer int overhead)
On DX, mov32/2*mov16 gives about 1.5 (ditto)
}
label
notest;
const
r1 : word = 1;
r2 : word = 1;
ratio : byte = 1;
const
block = $1000;
dx : byte = 7; {value is stored to avoid multiple runs of (slow) test
code}begin
if processor<7 then exit; {must be 386 or better}
if dx<>7 then goto notest;
asm
in al,$21
sti
push ax
mov al,$FE
out $21,al
push ds
mov bx,0
mov es,Seg0040
mov ds,Seg0040
mov ax,es:[$6c]
@1:
cmp ax,es:[$6c]
je @1
mov ax,es:[$6c]
@2:
mov di,0
mov si,di
mov cx,block
db $f3,$66,$a5 {rep movsd}
inc bx
cmp ax,es:[$6c]
je @2
pop ds
mov r1,bx
mov bx,0
push ds
mov ds,Seg0040
mov ax,es:[$6c]
@3:
cmp ax,es:[$6c]
je @3
mov ax,es:[$6c]
@4:
mov di,0
mov si,di
mov cx,block*2
rep movsw
inc bx
cmp ax,es:[$6c]
je @4
pop ds
pop ax
out $21,al
mov r2,bx
end;
ratio:=10*r1 div r2;
dx:=ord(ratio>=13);
{ writeln('r=',ratio,' t1=',r1,' t2=',r2);}
notest:
dx386:=(dx=1);
end;
[Back to HARDWARE SWAG index] [Back to Main SWAG index] [Original]