home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 21 / CD_ASCQ_21_040595.iso / dos / prg / c / xlib612 / source / xdetect.asm < prev    next >
Assembly Source File  |  1994-07-15  |  8KB  |  267 lines

  1. ;-----------------------------------------------------------------------
  2. ; MODULE XDETECT
  3. ;
  4. ; Hardware detection module
  5. ;
  6. ; Compile with Tasm.
  7. ; C callable.
  8. ;
  9. ;
  10. ; ****** XLIB - Mode X graphics library                ****************
  11. ; ******                                               ****************
  12. ; ****** Written By Themie Gouthas                     ****************
  13. ;
  14. ; egg@dstos3.dsto.gov.au
  15. ; teg@bart.dsto.gov.au
  16. ;-----------------------------------------------------------------------
  17. LOCALS
  18. .286
  19.  
  20. include model.inc
  21. include xdetect.inc
  22.  
  23.     .data
  24.  
  25. _MouseButtonCount dw 0
  26. _MouseVersion     dw 0
  27. _MouseType        db 0
  28. _MouseIRQ         db 0
  29.  
  30. i86       equ 0
  31. i186      equ 1
  32. i286      equ 2
  33. i386sx    equ 3
  34. i386dx    equ 4
  35. i486      equ 5
  36.  
  37.  
  38. NONE      equ 0
  39. MDA       equ 1
  40. CGA       equ 2
  41. EGAMono   equ 3
  42. EGAColor  equ 4
  43. VGAMono   equ 5
  44. VGAColor  equ 6
  45. MCGAMono  equ 7
  46. MCGAColor equ 8
  47.  
  48. PS2_CARDS db  0,1,2,2,4,3,2,5,6,2,8,7,8
  49.  
  50.     .code
  51.  
  52. ;-----------------------------------------------------------------------
  53. ; PC Graphics detection routine. Returns graphics card type
  54. ;
  55. ; C callable as:
  56. ;    unsigned int x_graphics_card();
  57. ;
  58. ;
  59.  
  60. _x_graphics_card proc 
  61.     push bp                  ; Preserve caller's stack frame
  62.     mov  bp,sp
  63.     mov  ax,1A00h            ; Try calling VGA Identity Adapter function
  64.     int  10h
  65.     cmp  al,1Ah              ; Do we have PS/2 video bios ?
  66.     jne  @@not_PS2           ; No!
  67.  
  68.     cmp  bl,0Ch              ; bl > 0Ch => CGA hardware
  69.     jg   @@is_CGA            ; Jump if we have CGA
  70.     xor  bh,bh
  71.     xor  ah,ah
  72.     mov  al,cs:PS2_CARDS[bx] ; Load ax from PS/2 hardware table
  73.     jmp  short @@done        ; return ax
  74. @@is_CGA:
  75.     mov  ax,CGA              ; Have detected CGA, return id
  76.     jmp  short @@done
  77. @@not_PS2:                       ; OK We don't have PS/2 Video bios
  78.     mov  ah,12h              ; Set alternate function service
  79.     mov  bx,10h              ; Set to return EGA information
  80.     int  10h                 ; call video service
  81.     cmp  bx,10h              ; Is EGA there ?
  82.     je   @@simple_adapter    ; Nop!
  83.     mov  ah,12h              ; Since we have EGA bios, get details
  84.     mov  bl,10h
  85.     int  10h
  86.     or   bh,bh               ; Do we have colour EGA ?
  87.     jz   @@ega_color         ; Yes
  88.     mov  ax,EGAMono          ; Otherwise we have Mono EGA
  89.     jmp  short @@done
  90. @@ega_color:
  91.     mov  ax,EGAColor         ; Have detected EGA Color, return id
  92.     jmp  short @@done
  93. @@simple_adapter:
  94.     int  11h                 ; Lets try equipment determination service
  95.     and  al,30h
  96.     shr  al,4
  97.     xor  ah,ah
  98.     or   al,al               ; Do we have any graphics card at all ?
  99.     jz   @@done              ; No ? This is a stupid machine!
  100.     cmp  al,3                ; Do We have a Mono adapter
  101.     jne  @@is_CGA            ; No
  102.     mov  ax,MDA              ; Have detected MDA, return id
  103. @@done:
  104.     pop  bp                  ;restore caller's stack frame
  105.     ret
  106. _x_graphics_card endp
  107.  
  108.  
  109. ;-----------------------------------------------------------------------
  110. ; PC Processor detection routine
  111. ;
  112. ; C callable as:
  113. ;    unsigned int x_processor();
  114. ;
  115. ;
  116. _x_processor proc 
  117.     push bp
  118.     mov  bp,sp
  119.     pushf                    ; Save flags
  120.     xor  ax,ax         ; Clear AX
  121.     push ax                  ; Push it on the stack
  122.     popf                     ; Zero the flags
  123.     pushf                    ; Try to zero bits 12-15
  124.     pop  ax                  ; Recover flags
  125.         and  ax,0F000h           ; If bits 12-15 are 1 => i86 or i286
  126.         cmp  ax,0F000h
  127.         jne  @@1
  128.  
  129.         push cx                  ; save CX
  130.         mov  ax,0FFFFh           ; Set all AX bits
  131.         mov  cl,33               ; Will shift once on 80186
  132.         shl  ax,cl               ; or 33 x on 8086
  133.         pop  cx
  134.         mov  ax,i186
  135.         jnz  @@done
  136.         mov  ax,i86              ; 0 => 8086/8088
  137.         jmp  short @@done
  138.  
  139. @@1:
  140.         mov  ax,07000h           ; Try to set bits 12-14
  141.         push ax
  142.         popf
  143.         pushf
  144.         pop  ax
  145.         and  ax,07000h           ; If bits 12-14 are 0 => i286
  146.         mov  ax,i286
  147.         jz   @@done
  148.  
  149.         ;; 386/486 resolution code taken from WHATCPU.ASM by
  150.         ;; Dave M. Walker
  151.  
  152.  
  153.         P386
  154.         mov  eax,cr0
  155.         mov  ebx,eax                 ;Original CR0 into EBX
  156.         or   al,10h                  ;Set bit
  157.         mov  cr0,eax                 ;Store it
  158.         mov  eax,cr0                 ;Read it back
  159.         mov  cr0,ebx                 ;Restore CR0
  160.         test al,10h                  ;Did it set?
  161.         mov  ax,i386sx
  162.         jz   @@done                  ;Jump if 386SX
  163.  
  164.        ;*** Test AC bit in EFLAGS (386DX won't change)
  165.         mov     ecx,esp                 ;Original ESP in ECX
  166.         pushfd                          ;Original EFLAGS in EBX
  167.         pop     ebx
  168.         and     esp,not 3               ;Align stack to prevent 486
  169.                                         ;  fault when AC is flipped
  170.         mov     eax,ebx                 ;EFLAGS => EAX
  171.         xor     eax,40000h              ;Flip AC flag
  172.         push    eax                     ;Store it
  173.         popfd
  174.         pushfd                          ;Read it back
  175.         pop     eax
  176.         push    ebx                     ;Restore EFLAGS
  177.         popfd
  178.         mov     esp,ecx                 ;Restore ESP
  179.         cmp     eax,ebx                 ;Compare old/new AC bits
  180.         mov     ax,i386dx
  181.         je      @@done
  182. is_486:                                 ;Until the Pentium appears...
  183.         mov   ax,i486
  184. @@done:
  185.     popf
  186.         .286
  187.     pop  bp
  188.     ret
  189. _x_processor endp
  190.  
  191. .8086
  192. ;-----------------------------------------------------------------------
  193. ; PC Numeric coprocessor detection routine
  194. ;
  195. ; C callable as:
  196. ;    unsigned int x_coprocessor();
  197. ;
  198. ;  Based on an article in PC Tech Journal, Aug 87 by Ted Forgeron
  199. ;
  200. ;  Returns 1 if coprocessor found, zero otherwise
  201.  
  202. _x_coprocessor   proc
  203. ARG     control:word=StkSize
  204.     push   bp
  205.     mov    bp,sp
  206.     sub    sp,StkSize
  207.  
  208.     fninit                          ; try to initialize the copro.
  209.     mov    [control],0              ; clear control word variable
  210.         fnstcw control                  ; put control word in memory
  211.     mov    ax,[control]             ;
  212.     cmp    ah,03h                   ; do we have a coprocessor ?
  213.     je     @@HaveCopro              ; jump if yes!
  214.     xor    ax,ax                    ; return 0 since nothing found
  215.     jmp    short @@done
  216. @@HaveCopro:
  217.     mov    ax,1
  218. @@done:
  219.     mov    sp,bp
  220.     pop    bp
  221.     ret
  222. _x_coprocessor   endp
  223.  
  224.  
  225. ;-----------------------------------------------------------------------
  226. ; PC Mouse Driver detection routine
  227. ;
  228. ; C callable as:
  229. ;    unsigned int x_mousedriver();
  230. ;
  231. ;
  232. ;  Returns 1 if mouse driver found, zero otherwise
  233. _x_mousedriver proc
  234.            push bp
  235.            mov  bp,sp
  236.            mov  ax,3533h        ; Get int 33 interrupt vector
  237.            int  21h             ; Call dos
  238.            xor  cx,cx           ; Clear "found" flag
  239.            mov  ax,es           ; Is the vector null (ES==0 && BX==0) ?
  240.            or   bx,ax
  241.            jz   @@NoMouseDriver ; Yes! No mouse driver installed - Jump
  242.  
  243.            ; Just make absolutely sure the vector points to the mouse
  244.            ; driver (just in case)
  245.  
  246.            xor  ax,ax           ; FUNC 0: Mouse Initialization
  247.            int   33h
  248.            or    ax,ax          ; Do we have an installed mouse driver ?
  249.            jz    @@NoMouseDriver; No ?
  250.            mov   [_MouseButtonCount],bx
  251.  
  252.            mov   ax,24h
  253.            int   33h
  254.            mov   [_MouseVersion],bx
  255.            mov   [_MouseType],ch
  256.            mov   [_MouseIRQ],cl
  257.  
  258.            mov  cx,1            ; Yes! set flag
  259.  
  260. @@NoMouseDriver:
  261.            mov  ax,cx           ; Return "found" flag
  262.            pop  bp
  263.            ret
  264. _x_mousedriver endp
  265.  
  266.  
  267. end