Compilation of various source - chips
; Calling convention:
;
; Int chips (void);
;
; Returns:
;
; Tucked away neatly in your AX ….
;
; You get back 8x if an 8088/8086
; 18x if an 80186/80188
; 28x if an 80286
; 38x if an 80386
; 20x for a NEC V20/V30
; AND
; Xx0 if NO NDP is found
; Xx1 if an 8087
; Xx2 if an 80287
; Xx3 for an 80387
;
; OR …..
;
;>>> A return of 280 means you got an 80286 machine with no NDP, < <<
;>>> 383 means you have an 80386/80387 rig to work with, and a < <<
;>>> Return of 81 sez that you have 8088/8086 CPU with an 8087. < <<
;>>> A 200 tells you that you got an NEC V20/V30 without an NDP. < <<
;>>> ETC., Etc., Etc. < <<
;
; NOTE:
;
; There are lotsa ways of handling the way this function returns
; It''s data. For my purposes, I have elected this one because
; It requires only int arithmetic on the caller''s end to extract
; All the info I need from the return value. I think that I''m
; Well enough''commented''in the following code so that you will
; Be able to tinker and Putz until you find the best return tech-
; Nique for Ur purposes without having to reinvent the wheel.
;
;>>>> Please see TEST.C, enclosed in this. ARC. < <<<
;
; REFERENCES:
;
; _chips Is made up of two PROC''s, cpu_type and ndp_type.
;
; Cpu_type is based on uncopyrighted, published logic by
; Clif (that''s the way he spells it) Purkiser of Intel -
; Santa Clara.
;
; Ndp_type is adopted from Ted Forgeron''s article in PC
; Tech Journal, Aug''87 p43.
;
; In the event of subsequent republication of this function,
; Please carry forward reference to these two gentlemen as
; Original authors.
;
; Copr. 1987 Pat Shea - Psi! (That Copr. Is on there cuz my
; Lawyer sez I should, but feel
; Free to hack away!!! Pats.)
;
; Update: 1/1/88 - changed this code slightly so that it is
; Compilable using MASM 5.0, and the test.c
; File using MSC 5.0.
. MODEL SMALL
. CODE
PUBLIC _chips
_chips PROC
control dw 0; control word needed for the NDP test
push BP; save where Ur at
mov BP, SP; going in …..
push DI
push SI
push CX; not really needed for MSC but kinda
; Nice to do cuz someone else might
; Want to use the function and we do
; Use CX later on
call cpu_type; find out what kinda CPU you got and
; And save it in DX for future reference
call ndp_type; check for math coprocessor (NDP) type
; And hold that result in AX
add AX, DX; add the two results together and hold
;''Em in AX for Ur return to the caller
pop CX; put things back the way that you
??????? pop??? SI???????????? ;?? found ''em when you started this
??????? pop??? DI???????????? ;?? little drill off…..
??????? pop??? BP
????????????????????????????? ; AND
??????? ret?????????????????? ; go back to where you came from….
????????????????????????????? ;?? ( ===>? the calling program )
????????????????????????????? ;?? with Ur results sittin'' in AX !!
_chips???????? endp
cpu_type?????? PROC
??????? pushf???????????????? ; pump Ur flags register onto the stack
??????? xor??? DX,DX????????? ; blow out Ur DX and AX to start off
??????? xor??? AX,AX????????? ;?? with a clean slate
??????? push?? AX???????????? ; put AX on the stack
??????? popf????????????????? ; bring it back in Ur flags
??????? pushf???????????????? ; try to set bits 12 thru 15 to a zero
??????? pop??? AX???????????? ; get back Ur flags word in AX
??????? and??? AX, 0f000h???? ; if bits 12 thru 15 are set then you got
??????? cmp??? AX, 0f000h???? ;?? an Intel 8018x or a 808x or maybe even
??????? jz???? dig??????????? ;?? a NEC V20/V30 bin log svn tmp - gotta look more…
; OTHERWISE….
;?? Here''s the BIG one…. ''tells the difference between an 80286 and
;?? an 80386 !!
??????? mov??? AX, 07000h???? ; try to set FLAG bits 12 thru 14
????????????????????????????? ;?? - NT, IOPL
??????? push?? AX???????????? ; put it onto the stack
??????? popf????????????????? ;?? and try to pump 07000H into Ur flags
??????? pushf???????????????? ; push Ur flags, again
??????? pop??? AX???????????? ;?? and bring back AX for a compare
??????? and??? AX,07000h????? ; if Ur bits 12 thru 14 are set
??????? jnz??? got386???????? ;?? then Ur workin'' with an 80386
??????? mov??? DX, 0280?????? ; save 280 in DX cuz it''s an 80286
??????? jmp??? SHORT CPUbye?? ;?? and bail out
got386: mov??? DX, 0380?????? ; save 380 in DX cuz it''s an Intel 80386
??????? jmp??? SHORT CPUbye?? ;?? and bail out
; here''s we try to figger out whether it''s an 80188/80186, an 8088/8086
;?? or an NEC V20/V30 - ''couple of slick tricks from Clif Purkiser…..
dig:??? mov??? AX, 0ffffh???? ; load up AX
??????? mov??? CL, 33???????? ; HERE''s the FIRST TRICK…. this will
????????????????????????????? ;?? shift everything 33 times if it''s
????????????????????????????? ;?? 8088/8086, or once for a 80188/80186!
??????? shl??? AX, CL???????? ; on a shift of 33, all bits get zeroed
??????? jz???? digmor???????? ;?? out so if anything is left ON it''s
????????????????????????????? ;?? gotta be an 80188/80186
??????? mov??? DX,0180??????? ; save 180 in DX cuz it''s an 80188/80186
??????? jmp??? SHORT CPUbye?? ;?? and bail out
digmor: xor??? AL,AL????????? ; clean out AL to set ZF
??????? mov??? AL,40h???????? ; ANOTHER TRICK…. mul on an NEC duz NOT
??????? mul??? AL???????????? ;?? effect the zero flag BUT on an Intel
??????? jz???? gotNEC???????? ;?? 8088/8086, the zero flag gets thrown
??????? mov??? DX,0080??????? ; 80 into DX cuz it''s an Intel 8088/8086
??????? jmp??? SHORT CPUbye?? ;?? and bail out
gotNEC: mov??? DX,0200??????? ; it''s an NEC V20/V30 so save 200 in DX
CPUbye: popf????????????????? ; putchur flags back to where they were
??????? ret?????????????????? ;?? and go back to where you came from
????????????????????????????? ;?? (i.e., ===>? _chips) with the CPU type
????????????????????????????? ;?? tucked away in DX for future reference
cpu_type?????? endp
; Check for an NDP.
;
; >>>>NOTE:? If you are using an MASM version < 5.0, don''t forget to
; use the /R option or you will bomb cuz of the coprocessor instruc-
; tions.? /R is not needed for version 5.0.<<<<<<<<<<<<<<<<<<<<<<<<<
ndp_type?????? PROC
do_we:? fninit????????????????????????? ; try to initialize the NDP
??????? mov??? byte ptr control+1,0???? ; clear memory byte
??????? fnstcw control????????????????? ; put control word in memory
??????? mov??? AH,byte ptr control+1??? ; iff AH is 03h, you got
??????? cmp??? AH,03h?????????????????? ;?? an NDP on board !!
??????? je???? chk_87?????????????????? ; found somethin'', keep goin''
??????? xor??? AX,AX??????????????????? ; clean out AX to show a zero
??????? jmp??? SHORT NDPbye???????????? ;?? return (i.e., no NDP)
; ''got an 8087 ??
chk_87: and??? control,NOT 0080h??????? ; turn ON interrupts (IEM = 0)
??????? fldcw? control????????????????? ; load control word
??????? fdisi?????????????????????????? ; turn OFF interrupts (IEM = 1)
??????? fstcw? control????????????????? ; store control word
??????? test?? control,0080h??????????? ; iff IEM=1, 8087
??????? jz???? chk287?????????????????? ; ''guess not!? March on….
??????? mov??? AX,0001????????????????? ; set up for a 1 return to
??????? jmp??? SHORT NDPbye???????????? ;?? show an 8087 is on board
; if not…. would you believe an 80287 maybe ??
chk287: finit???????????????? ; set default infinity mode
??????? fld1????????????????? ; make infinity
??????? fldz????????????????? ;?? by dividing
??????? fdiv????????????????? ;?? 1 by zero !!
??????? fld??? st???????????? ; now make a
??????? fchs????????????????? ;?? negative infinity
??????? fcompp??????????????? ; compare Ur two infinities
??????? fstsw? control??????? ; iff, for 8087 or 80287
??????? fwait???????????????? ; sit tight ''til status word is put away
??????? mov??? AX,control???? ; getchur control word
??????? sahf????????????????? ; putchur AH into flags
??????? jnz??? got387???????? ; NO GOOD…. march on !!
??????? mov??? AX,0002??????? ; gotta be a 80287 cuz we already tested
??????? jmp??? SHORT NDPbye?? ;?? for an 8087
; We KNOW that there is an NDP on board otherwise we would have bailed
; out after ''do_we''.? It isn''t an 8087 or an 80287 or we wouldn''t have
; gotten this far.? It''s gotta be an 80387 !!
got387: mov??? AX,0003??????? ; call it an 80387 and return 3
NDPbye: ret?????????????????? ; and go back where you came from
????????????????????????????? ;?? (i.e., ===>? _chips) carrying the NDP
????????????????????????????? ;?? type in Ur AX register
ndp_type?????? endp
_text?? ends
end
????:
The Massive Open-source Can Not Be Stopped
Evaluate OFFICE Suites And Tools
Merry CD-R DVD-Audio MP3 to OGG Backup
