;------------------------------------------------------------------------
;     Identifizierung von Video Adaptern                      release 1.0
;     Copyright (c) Ingo Eickmann, 1989                          09/01/89
;------------------------------------------------------------------------
      PAGE   65,80
      TITLE  Identify

code  segment word public 'CODE'
      assume cs:code
;------------------------------------------------------------------------
;                                       Identifizierung von Videoadaptern
public Identify                       ; Rckgabe: AH: prim„rer Adapter
;                                                 AL: sekund„rer Adapter
;------------------------------------------------------------------------
Identify proc far
        mov  ax,1A00h
        int  10h                      ; PS/2 Video Display Combination
        cmp  al,1Ah                   ; PS/2 ?
        je   Active                   ;   Ja ->
        mov  ah,12h
        mov  bl,10h
        int  10h                      ; EGA Video Subsystem Configuration
        cmp  bl,10h                   ; EGA vorhanden ?
        mov  bx,0
        je   TestCGA                  ;   Nein ->
        mov  al,cl
        shr  al,1                     ; DIP-Schalterstellung umrechnen
        cmp  al,3
        jl   EGA1
        sub  al,3
EGA1:   mov  bh,2
        jz   TestMDA                  ;   EGA als CGA ->
        shl  bh,1
        cmp  al,1
        je   TestMDA                  ;   EGA als EGA ->
        mov  bh,5                     ; EGA als monochromer Adapter
        call CGA                      ; CGA vorhanden ?
        jnc  Active                   ;   Nein ->
        mov  bl,2
        jmp  Active
TestCGA:
        call CGA                      ; CGA vorhanden ?
        jnc  TestMDA                  ;   Nein ->
        mov  bh,2
TestMDA:
        call MDA                      ; MDA vorhanden ?
        jnc  Active                   ;   Nein ->
        mov  bl,1
        or   bh,bh
        jnz  Active
        xchg bh,bl
Active:
        or   bl,bl                    ; Adapter 2 gefunden ?
        jz   TestHerc                 ;   Nein ->
        push bx
        mov  ah,0Fh
        int  10h                      ; Return current Video Status
        pop  bx
        and  al,7
        cmp  bh,1                     ; Adapter 1 MDA oder EGAMono ?
        je   Mono
        cmp  bh,5
        jne  NotMono                  ;   Nein ->
Mono:   cmp  al,7                     ; Mono Mode ?
        je   TestHerc                 ;   Ja -> Reihenfolge stimmt
        jmp  Tausch
NotMono:                              ; Adapter 1 ist Color
        cmp  al,7                     ; Mono Mode ?
        jne  TestHerc                 ;   Nein -> Reihenfolge stimmt
Tausch: xchg bh,bl                    ; Adapter 1 <-> Adapter 2
TestHerc:
        cmp  bh,1                     ; Adapter 1 = MDA ?
        jne  Herc1                    ;   Nein ->
        call Herc                     ; Ist monochromer Adapter Hercules ?
        jnc  Raus                     ;   Nein ->
        mov  bh,64                    ; Hercules Display Combination Code
Herc1:  cmp  bl,1                     ; Adapter 2 = MDA ?
        jne  Raus                     ;   Nein ->
        call Herc                     ; Ist monochromer Adapter Hercules ?
        jnc  Raus                     ;   Nein ->
        mov  bl,64                    ; Hercules Display Combination Code
Raus:   mov  ax,bx
        ret
Identify endp

;------------------------------------------------------------------------
; CGA: Carry gesetzt, wenn 6845 einer CGA gefunden
;------------------------------------------------------------------------
CGA proc near
        mov  dx,3D4h                  ; CRT Controller Adresse bei CGA
        call Test6845                 ; 6845 vorhanden ?
        ret
CGA endp

;------------------------------------------------------------------------
; MDA: Carry gesetzt, wenn 6845 eines MDA gefunden
;------------------------------------------------------------------------
MDA proc near
        mov  dx,3B4h                  ; CRT Controller Adresse bei MDA
        call Test6845                 ; 6845 vorhanden ?
        ret
MDA endp

;------------------------------------------------------------------------
; Herc: Carry gesetzt, wenn monochromer Adapter als Hercules erkannt
;------------------------------------------------------------------------
Herc proc near
        mov  dx,3BAh                  ; CRTC Status Register
        in   al,dx                    ; Bit 7: Vertical Synchronisation
        and  al,10000000b             ;        (etwa alle 20 msec)
        mov  ah,al
        xor  cx,cx
Lop:    in   al,dx                    ; Warteschleife bis zur n„chsten
        and  al,10000000b             ; Žnderung
        cmp  ah,al
        loope Lop
        clc
        je   NoHerc                   ;   keine Žnderung des Bits ->
        cmc                           ; Žnderung war da: Hercules
NoHerc: ret
Herc endp

;------------------------------------------------------------------------
; Test6845: Carry gesetzt, wenn 6845 an Port [dx] erkannt
;------------------------------------------------------------------------
Test6845 proc near
        mov  ax,01F0Eh                ; Cursor Start Position
        out  dx,al
        inc  dx
        in   al,dx                    ; alten Inhalt retten
        xchg ah,al
        out  dx,al                    ; neuen Wert schreiben
        mov  cx,100
        loop $
        in   al,dx                    ; neuen Wert wieder auslesen
        xchg ah,al
        out  dx,al                    ; alten Inhalt zurckschreiben
        cmp  ah,01Fh
        clc
        jne  No6845                   ; war ein CRTC Register vorhanden ?
        cmc                           ;   -> Ja: Carry setzen
No6845: ret
Test6845 endp

code ends
     end
