home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_01_05 / 1n05022a < prev    next >
Text File  |  1990-08-31  |  3KB  |  144 lines

  1.  
  2. .***************** PROGRAM SECTION START ******************
  3. ;
  4. ; CHECK THE PROCESSOR TYPE!
  5. ;
  6. ;
  7. ; 0 = 8088
  8. ; 1 = 8086
  9. ; 2 = NEC V20
  10. ; 3 = NEC V30
  11. ; 4 = 80188
  12. ; 5 = 80186
  13. ; 6 = 80386
  14. ; 7 = 80286
  15. ;
  16.         PUBLIC  CHIPTYPE
  17.  
  18. CSEG    SEGMENT PARA PUBLIC 'CODE'
  19.         ASSUME  DS:CSEG,CS:CSEG
  20. CHIPTYPE PROC   NEAR
  21. ;
  22. ; This routine will take the CPU type and store it
  23. ; at the address placed on the stack.
  24. ; The routine is setup to work hand in hand with
  25. ; TURBO PASCAL 4.0 & up.
  26. ;
  27. PARM1   EQU     6       ;SEG
  28. PARM2   EQU     4       ;DISP
  29.         PUSH    BP
  30.         MOV     BP,SP
  31.  
  32.         PUSH    ES
  33.         PUSH    DS
  34. LCPU:
  35.         MOV     BX,6
  36.         PUSH    SP
  37.         POP     AX
  38.         CMP     AX,SP
  39.         JNZ     TST88V
  40. ;
  41. ; THE 286 & 386 CPU PUSHES THE VALUE OF THE SP BEFORE DECREMENTING SP
  42. ; THE PRE-286 CPU PUSHES THE SP AFTER DECREMENTING SP
  43. ;
  44. ;
  45. ;
  46. ; 286 or 386 ?
  47. ;
  48.         PUSHF
  49.         XOR     AX,AX
  50.         MOV     AX,0F000H
  51.         PUSH    AX
  52.         POPF
  53.         PUSHF
  54.         POP     AX
  55.         AND     AX,0F000H
  56.         JNZ     YES386
  57.         POPF
  58.         JMP     TSTQUE
  59. ;
  60. ; Definitely 386 because the upper 4 bits of the FLAGS operate
  61. ; differently on a 386
  62. ;
  63. YES386:  POPF
  64.         MOV     BX,66H
  65.         JMP     IS286
  66. ;
  67. ; 8088 or NEC V series chip?
  68. ;
  69. TST88V: MOV     BX,4
  70.         MOV     CL,21H
  71.         MOV     AL,0FFH  ;Can I shift a lot?
  72.         SHL     AL,CL
  73.         JNZ     TSTQUE   ;If so then NOT a 80188 or 80186
  74.         MOV     BX,2     ;otherwise could be V20, V30, 8088 or 8086
  75.         CALL    ISVSERIES ;If CX=0 then either V20 or V30
  76.         JCXZ    TSTQUE
  77.         MOV     BX,0     ;Has to be 8088 or 8086
  78. TSTQUE: CALL    BIGQUE   ;If pre-fetch QUE BIG then must be V30 or 86
  79.         JCXZ    IS286
  80.         OR      BX,1
  81. IS286:  CMP     BX,6     ;If 286 type then force to 7
  82.         JNZ     L286
  83.         MOV     BX,7
  84. L286:   AND     BX,07H
  85.         STI
  86.         MOV     DS,[BP+PARM1]
  87.         MOV     SI,[BP+PARM2]
  88.         MOV     DS:[SI],BX
  89.         POP     DS
  90.         POP     ES
  91.         MOV     SP,BP
  92.         POP     BP
  93.         RET     4               ;POP PARMS OFF STACK
  94. CHIPTYPE ENDP
  95. BIGCUE  PROC    NEAR
  96. ;
  97. ; CHECK FOR 8086 OR 80186
  98. ;
  99. ; TESTS THE PROCESSOR'S PRE-FETCH QUEUE
  100. ;
  101.         PUSH    CS
  102.         POP     DS
  103.         PUSH    CS
  104.         POP     ES
  105.         STD
  106.         CALL    $+3
  107.         POP     DI
  108.         ADD     DI,OFFSET PATCH-$+1
  109.         MOV     AL,BYTE PTR CS:[DI-1]
  110.         CLI
  111.         MOV     CX,3
  112.         REPZ    STOSB
  113.         CLD
  114.         NOP
  115.         NOP
  116.         NOP
  117.         INC     CX
  118. CHKPNT: STI
  119. PATCH:  STI
  120.         MOV     BYTE PTR DS:[DI+1],41H
  121.         RET
  122. BIGCUE  ENDP
  123. ISVSERIES PROC    NEAR
  124. ;
  125. ; COULD RETURN CX<>0 BECAUSE OF SEGMENT PREFIX IF NOT A 386 V20 OR V30
  126. ;
  127. ; IF NOT A V20 OR V30 AN INTERRUPT WILL CAUSE THE INSTRUCTION
  128. ;    NOT COMPLETE THUS YIELDING CX<>0
  129. ;
  130. ;
  131.         MOV     CX,0FFFFH
  132.         STI                     ;ENABLE INTERRUPTS
  133.         PUSH    AX
  134.         PUSH    SI
  135.         DB      0F3H,026H,0ACH  ;REP ES:LODSB
  136.         POP     SI
  137.         POP     AX
  138.         RET
  139. ISVSERIES ENDP
  140. CSEG    ENDS
  141.         END
  142. .***************** PROGRAM SECTION END ******************
  143.  
  144.