Contributor: MICHAL SZOKOLO
{> 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 dx7 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:[6ドルc]
 @1:
 cmp ax,es:[6ドルc]
 je @1
 mov ax,es:[6ドルc]
 @2:
 mov di,0
 mov si,di
 mov cx,block
 db $f3,66,ドル$a5 {rep movsd}
 inc bx
 cmp ax,es:[6ドルc]
 je @2
 pop ds
 mov r1,bx
 mov bx,0
 push ds
 mov ds,Seg0040
 mov ax,es:[6ドルc]
 @3:
 cmp ax,es:[6ドルc]
 je @3
 mov ax,es:[6ドルc]
 @4:
 mov di,0
 mov si,di
 mov cx,block*2
 rep movsw
 inc bx
 cmp ax,es:[6ドルc]
 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;


AltStyle によって変換されたページ (->オリジナル) /