home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / CPUTYP12.ZIP / CPU586P6.ASM next >
Assembly Source File  |  1995-03-29  |  10KB  |  315 lines

  1. ; CPUTYPE.INC/CPU586P6.ASM CPU/FPU Generation Detection v1.2e for
  2. ; CPU: 8086/80186, 80286, 80386, 80486, 80586 Pentium, 80686 P6 and higher(!)
  3. ; FPU: 8087, 80287, 80387, 80487, and higher (see 1.) and 2.))
  4. ;
  5. ; 1995 by XMAS coding (Dominik Freche, address see below)
  6. ;
  7. ; 1. How to determine CPU type
  8. ; 2. How to determine FPU type
  9. ; 3. !!!!! THIS SOURCECODE IS FREEWARE !!!!!
  10. ; 4. Including routines in high level languages (Pascal,C,C++,etc);
  11. ; 5. Address
  12. ; 6. Sourcecode of program
  13. ; Program to determine CPU (Central Processing Unit) type
  14. ; and FPU (Floating Point Unit(=math coprocessor)) type
  15. ; for all computer generations of the IBM standard,
  16. ; except pocket calculators like some earlier Personal Computers, so
  17. ; NOTE : the program does not differ between 8086/8088/80186/80188 and
  18. ; V20/V30-clones.
  19. ; Each release defines some new features. THIS PROGRAM HELPS TO
  20. ; TAKE ADVANTAGE OF IT. The following table contains the features of
  21. ; each new generation.
  22. ;  80286 Protected mode, hardware-multitasking, addressing of
  23. ;        max. 16 MB of memory
  24. ;  80386 32-Bit instructions, addressing of max. 4 GB (GigaByte) of memory,
  25. ;        Virtual86 mode (V86 - each task runs on an virtual 8086 processor;
  26. ;        EMM driver, OS2 and Win'95 use this)
  27. ;  80486 Internal coprocessor
  28. ;  80586 System Management mode (SMM - a "Standby"-mode, an
  29. ;        "Internal green PC"), very high performance
  30. ;  80686 Strongly high performance ("Pentium double speed"),
  31. ;        ??? (other features are secret)
  32. ; 1.)
  33. ; How to determine the CPU(=main processor) type
  34. ; Each Generation defines some new flags. If a specific flag is
  35. ; set and the flag is not defined, the processor clears
  36. ; this flag to 0.
  37. ; Besides, the Pentium defines a new instruction to determine
  38. ; the type. If the ID-Bit in EFLAGS is set to 1 and EAX contains 1,
  39. ; the 80586-instruction "CPUID" returns a 5 in EAX for 80586, a 6
  40. ; for 80686 and so on. NOTE : even some newer i80486 (manufactured
  41. ; after may 1994) support the instruction "CPUID", so it is necessary
  42. ; to execute this instruction if the ID-Bit in EFLEGS can be set to 1.
  43. ; Intel will include this instruction in each processor after
  44. ; the i80486, so even following generations can be determined.
  45. ; 2.)
  46. ; How to determine the FPU(=math coprocessor) type
  47. ; Executing the coprocessor-instruction "FNINIT", the CPU-status word
  48. ; will be cleared and the CPU-control word will be updated
  49. ; (the program restores the old status word and control word after executing
  50. ; the initialization for compatibility). By comparing some flags in the
  51. ; CPU-control word the existence of a FPU can be determined. Determining the
  52. ; generation of coprocessor is quite simple. A CPU type after 80386 has got
  53. ; an internal math coprocessor for standard, except some 80486SX do not
  54. ; (SX=Single, no coprocessor - DX=Double, coprocessor exists),
  55. ; but an external 80487 does not exist (the 80487 is an 80486 with internal
  56. ; coprocessor). That means, if an 80486 or higher is detected and a FPU
  57. ; does exist, an internal 80487 or higher is installed. Other FPU
  58. ; generations (80387,80287,8087) are external coprocessors.
  59. ; For these coprocessors the program determines the FPU type because it is
  60. ; possible to combine different CPU and FPU types (e.g. 80386 and 80287).
  61. ; The program uses different execution results of the same instructions on
  62. ; different coprocessors to determine FPU type.
  63. ; 3.)
  64. ; If you believe this program to be useful, it can be copied freely !
  65. ; This sourcecode cannot be sold !
  66. ; !!!!! THIS SOURCECODE IS FREEWARE !!!!!
  67. ; 4.)
  68. ; For including the routines to determine CPU/FPU type in a high level
  69. ; language (like Pascal,C,C++,etc), just see CPUTYPE.INC.
  70. ; 5.)
  71. ; If you have got any problems or if you want to contact me, do not hesitate,
  72. ; please write to the following address :
  73. ;   Dominik Freche
  74. ;   Vondernstrasse 45
  75. ;   45357 Essen
  76. ;   Germany, Europe
  77. ; or email to :
  78. ;   heckenb@mi.uni-erlangen.de (Frank Heckenbach)
  79. ; since I do not have email access. Frank will forward your mails asap,
  80. ; but sometimes it may take up to some weeks (esp. during holidays ;-)
  81. ;
  82. ; Dominik Freche, Mar 26 1995
  83. ; ---------------------------------------------------------------
  84. ; Next release of CPU586P6.ASM will feature
  85. ;  - Determining CPU/FPU type
  86. ;  - Determining CPU frequency and FPU frequency in Mhz
  87. ;  - CPU speed (Hi/Lo frequency)
  88. ; ---------------------------------------------------------------
  89. ; 6.) Program :
  90.         LOCALS  @@
  91.  
  92. CPUID   EQU     DB 0FH,0A2H     ;80586 Instruction to determine CPU type
  93.  
  94. SSeg    SEGMENT STACK
  95.   SStack        DB  64 DUP (0)
  96. SSeg    ENDS
  97.  
  98. DSeg    SEGMENT
  99.   Cpu8086    DB  "8086/8088/80186/80188$"
  100.   Cpu80286   DB  "80286$"
  101.   Cpu80386   DB  "80386$"
  102.   Cpu80486   DB  "80486$"
  103.   Cpu80586   DB  "80586 Pentium$"
  104.   Cpu80686   DB  "80686 P6$"
  105.   Cpu80x86   DB  "80786 or higher$"
  106.   FpuNone    DB  "None$"
  107.   Fpu8087    DB  "8087$"
  108.   Fpu80287   DB  "80287$"
  109.   Fpu80387   DB  "80387$"
  110.   Fpu80487   DB  "80487 (Internal)$"
  111.   FpuInteg   DB  "Internal$"
  112.  
  113.  
  114.   PrnMsg01   DB  "CPU Generation Detection",13,10,"$"
  115.   PrnMsg02   DB  "1995 by XMAS coding (Dominik Freche)",13,10,"$"
  116.   PrnMsg03   DB  "!!!!! THIS SOURCECODE IS FREEWARE !!!!!",13,10,"$"
  117.   PrnMsg04   DB  13,10,"CPU Type $"
  118.   PrnMsg05   DB  13,10,"FPU Type $"
  119.   PrnMsg06   DB  13,10,"CPU586P6.ASM v1.2e",13,10,"$"
  120.   PrnMsg07   DB  13,10,"$"
  121.  
  122.   Temp       DW  0FFFFH
  123.   FEnv       DW  7 DUP (0)
  124. DSeg    ENDS
  125.  
  126. CSeg    SEGMENT
  127.         ASSUME CS:CSeg,DS:DSeg,SS:SSeg
  128.  
  129.         .8086
  130.  
  131. CPUType PROC    ;>AX CpuType (1=86,2=286,3=386,4=486,5=586,6=686,etc.)
  132.         MOV     AX,1
  133.         PUSHF
  134.         POP     BX
  135.         AND     BH,0FH
  136.         PUSH    BX
  137.         POPF
  138.         PUSHF
  139.         POP     CX
  140.         AND     CH,0F0H
  141.         CMP     CH,0F0H
  142.         JE      @@1                     ;8086 or below 80286
  143.         INC     AX
  144.         OR      BH,0F0H
  145.         PUSH    BX
  146.         POPF
  147.         PUSHF
  148.         POP     CX
  149.         AND     CH,0F0H
  150.         JE      @@1                     ;80286
  151.         .386
  152.         INC     AX
  153.         MOV     EBX,ESP
  154.         AND     ESP,0FFFCH
  155.         PUSHFD
  156.         POP     EDX
  157.         MOV     ECX,EDX
  158.         XOR     EDX,000040000H
  159.         PUSH    EDX
  160.         POPFD
  161.         PUSHFD
  162.         POP     EDX
  163.         PUSH    ECX
  164.         POPFD
  165.         XOR     EDX,ECX
  166.         AND     EDX,000040000H          ;Test Alignment Check Bit
  167.         MOV     ESP,EBX
  168.         JZ      @@1                     ;80386
  169.         ;.486
  170.         INC     AX
  171.         PUSHFD
  172.         POP     EDX
  173.         MOV     ECX,EDX
  174.         XOR     EDX,000200000H
  175.         PUSH    EDX
  176.         POPFD
  177.         PUSHFD
  178.         POP     EDX
  179.         PUSH    ECX
  180.         POPFD
  181.         XOR     EDX,ECX                 ;Test ID Bit
  182.         JZ      @@1                     ;80486
  183.         MOV     EAX,1
  184.         ;.586 or higher, CPUID returns Cpu Generation Number in AX Bits 8-11
  185.         CPUID
  186.         AND     AH,0FH
  187.         SHR     AX,8
  188.         .8086
  189.         .8087
  190. @@1:    RET
  191. CPUType ENDP
  192.  
  193. FPUType PROC    ;>AX FpuType (0=None (SX),1=87,2=287,3=387,
  194.                 ;4=487,5=586 or higher (FPU always internal))
  195.         FNSTENV FEnv
  196.         FNINIT
  197.         FNSTSW  Temp
  198.         CMP     BYTE PTR Temp,0
  199.         JNE     @@1
  200.         FNSTCW  Temp
  201.         CMP     BYTE PTR [Temp+1],3
  202.         JNE     @@1
  203.         FLDENV  FEnv                    ;FPU exists
  204.         CALL    CPUType                 ;Determine CPU type
  205.         CMP     AX,4                    ;Test CPU(in AX)>=80486
  206.         JAE     @@2                     ;CPU=80486,FPU exists=80487 (Internal)
  207.                                         ;CPU>=80586,FPU=Internal
  208.         MOV     AX,3
  209.         FLD1
  210.         FLDZ
  211.         FDIVP   ST(1),ST
  212.         FLD     ST(0)
  213.         FCHS
  214.         FCOMPP
  215.         FSTSW   Temp
  216.         FWAIT
  217.         TEST    Temp,100H
  218.         JNZ     @@2                     ;80387
  219.         DEC     AX
  220.         FLD1
  221. @@0:    FISTP   Temp
  222.         FSTENV  FEnv
  223.         MOV     BX,CS
  224.         SHL     BX,1
  225.         SHL     BX,1
  226.         SHL     BX,1
  227.         SHL     BX,1
  228.         ADD     BX,OFFSET @@0
  229.         INC     BX
  230.         FWAIT
  231.         CMP     BX,[FEnv+6]
  232.         JE      @@2                     ;80287
  233.         DEC     AX                      ;8087
  234.         RET
  235. @@1:    XOR     AX,AX                   ;None
  236. @@2:    RET
  237. FPUType ENDP
  238.  
  239. ; Main Program
  240.  
  241. CSegEntry:
  242.         MOV     AX,DSeg
  243.         MOV     DS,AX
  244.         LEA     DX,PrnMsg01
  245.         CALL    Write
  246.         LEA     DX,PrnMsg02
  247.         CALL    Write
  248.         LEA     DX,PrnMsg03
  249.         CALL    Write
  250.         LEA     DX,PrnMsg04
  251.         CALL    Write
  252.  
  253.         CALL    CPUType
  254.  
  255.         CMP     AX,1            ;Choose string and load offset
  256.         JNE     @@1
  257.         LEA     DX,Cpu8086
  258. @@1:    CMP     AX,2
  259.         JNE     @@2
  260.         LEA     DX,Cpu80286
  261. @@2:    CMP     AX,3
  262.         JNE     @@3
  263.         LEA     DX,Cpu80386
  264. @@3:    CMP     AX,4
  265.         JNE     @@4
  266.         LEA     DX,Cpu80486
  267. @@4:    CMP     AX,5
  268.         JNE     @@5
  269.         LEA     DX,Cpu80586
  270. @@5:    CMP     AX,6
  271.         JNE     @@6
  272.         LEA     DX,Cpu80686
  273. @@6:    CMP     AX,7
  274.         JNAE    @@7
  275.         LEA     DX,Cpu80x86
  276. @@7:    CALL    Write           ;Write CPU type
  277.         LEA     DX,PrnMsg05
  278.         CALL    Write
  279.  
  280.         CALL    FPUType
  281.  
  282.         OR      AX,AX
  283.         JNE     @@8
  284.         LEA     DX,FpuNone
  285. @@8:
  286.         CMP     AX,1
  287.         JNE     @@9
  288.         LEA     DX,Fpu8087
  289. @@9:    CMP     AX,2
  290.         JNE     @@10
  291.         LEA     DX,Fpu80287
  292. @@10:   CMP     AX,3
  293.         JNE     @@11
  294.         LEA     DX,Fpu80387
  295. @@11:   CMP     AX,4
  296.         JNE     @@12
  297.         LEA     DX,Fpu80487
  298. @@12:   CMP     AX,5
  299.         JNAE    @@13
  300.         LEA     DX,FpuInteg
  301. @@13:   CALL    Write           ;Write FPU type
  302.         LEA     DX,PrnMsg07     ;CR/LF
  303.         CALL    Write
  304.         LEA     DX,PrnMsg06     ;Version
  305.         CALL    Write
  306.  
  307.         MOV     AX,4C00H
  308.         INT     21H
  309. Write:  MOV     AX,0900H
  310.         INT     21H
  311.         RET
  312.  
  313. CSeg    ENDS
  314.  
  315.         END     CSegEntry