home *** CD-ROM | disk | FTP | other *** search
- ; hi_color flag is not being set yet by tseng or ATI
-
- include model.h
-
- ;
- ; VGAKIT Version 4.1
- ;
- ; Copyright 1988,89,90,91 John Bridges
- ; Free for use in commercial, shareware or freeware applications
- ;
- ; BANKS.ASM
- ;
- .data
-
- OSEG equ DS: ;segment override for variable access
-
- bankadr dw ?
- if @Codesize
- bankseg dw ?
- endif
-
- public curbk
-
- curbk dw ?
-
- public vga512,vga1024
-
- vga512 dw ?
- vga1024 dw ?
-
- public cirrus,everex,paradise,tseng,trident,t8900
- public ativga,aheada,aheadb,oaktech,video7
- public chipstech,tseng4,genoa,ncr,compaq,vesa,hi_color
- public ati_extended ;ati extended reg. location
-
- cirrus dw ?
- everex dw ?
- paradise dw ?
- tseng dw ?
- trident dw ?
- t8900 dw ?
- ativga dw ?
- aheada dw ?
- aheadb dw ?
- oaktech dw ?
- hi_color dw ? ; flag to indicate hi_color exists
- video7 dw ?
- chipstech dw ?
- tseng4 dw ?
- genoa dw ?
- ncr dw ?
- compaq dw ?
- vesa dw ?
-
- first dw ? ;flag so whichvga() is only called once
- retval dw ? ;first return value from whichvga()
- ati_extended dw ? ;ati extended reg. location
-
- vgainfo label word
- vesaid db 'VESA' ; 4 signature bytes
- vesaver dw ? ; VESA version number
- oemstr dd ? ; Pointer to OEM string
- capabil db 4 dup (?) ; Capabilities of the video environment
- modelst dd ? ; Pointer to supported Super VGA modes
-
- vesashift db 0 ; number of bits to shift bank number left
-
- .code
-
- public newbank
- public whichvga
- public forcevga
-
- newbank proc ;bank number is in AX
- cli
- mov OSEG[curbk],ax
- if @Codesize
- jmp dword ptr OSEG[bankadr]
- else
- jmp word ptr OSEG[bankadr]
- endif
-
-
- _tseng: ;Tseng
- push ax
- push dx
- and al,7
- mov ah,al
- shl al,1
- shl al,1
- shl al,1
- or al,ah
- or al,01000000b
- mov dx,3cdh
- out dx,al
- sti
- pop dx
- pop ax
- ret
-
-
-
- _tseng4: ;Tseng 4000 series
- push ax
- push dx
- mov ah,al
- mov dx,3bfh ;Enable access to extended registers
- mov al,3
- out dx,al
- mov dl,0d8h
- mov al,0a0h
- out dx,al
- and ah,15
- mov al,ah
- shl al,1
- shl al,1
- shl al,1
- shl al,1
- or al,ah
- mov dl,0cdh
- out dx,al
- sti
- pop dx
- pop ax
- ret
-
-
- _trident: ;Trident
- push ax
- push dx
- mov dx,3ceh ;set pagesize to 64k
- mov al,6
- out dx,al
- inc dl
- in al,dx
- dec dl
- or al,4
- mov ah,al
- mov al,6
- out dx,ax
-
- mov dl,0c4h ;switch to BPS mode
- mov al,0bh
- out dx,al
- inc dl
- in al,dx
- dec dl
-
- mov ah,byte ptr OSEG[curbk]
- xor ah,2
- mov dx,3c4h
- mov al,0eh
- out dx,ax
- sti
- pop dx
- pop ax
- ret
-
-
- _video7: ;Video 7
- push ax
- push dx
- push cx
- and ax,15
- mov ch,al
- mov dx,3c4h
- mov ax,0ea06h
- out dx,ax
- mov ah,ch
- and ah,1
- mov al,0f9h
- out dx,ax
- mov al,ch
- and al,1100b
- mov ah,al
- shr ah,1
- shr ah,1
- or ah,al
- mov al,0f6h
- out dx,al
- inc dx
- in al,dx
- dec dx
- and al,not 1111b
- or ah,al
- mov al,0f6h
- out dx,ax
- mov ah,ch
- mov cl,4
- shl ah,cl
- and ah,100000b
- mov dl,0cch
- in al,dx
- mov dl,0c2h
- and al,not 100000b
- or al,ah
- out dx,al
- sti
- pop cx
- pop dx
- pop ax
- ret
-
-
- _paradise: ;Paradise
- push ax
- push dx
- mov dx,3ceh
- mov ax,50fh ;turn off write protect on VGA registers
- out dx,ax
- mov ah,byte ptr OSEG[curbk]
- shl ah,1 ;change 64k bank number into 4k bank number
- shl ah,1
- shl ah,1
- shl ah,1
- mov al,9
- out dx,ax
- sti
- pop dx
- pop ax
- ret
-
-
- _chipstech: ;Chips & Tech
- push ax
- push dx
- mov dx,46e8h ;place chip in setup mode
- mov ax,1eh
- out dx,ax
- mov dx,103h ;enable extended registers
- mov ax,0080h
- out dx,ax
- mov dx,46e8h ;bring chip out of setup mode
- mov ax,0eh
- out dx,ax
- mov ah,byte ptr OSEG[curbk]
- shl ah,1 ;change 64k bank number into 16k bank number
- shl ah,1
- mov al,10h
- mov dx,3d6h
- out dx,ax
- sti
- pop dx
- pop ax
- ret
-
-
- _ativga: ;ATI VGA Wonder
- push ax
- push dx
- ; mov dx,1ceh this line hardcoded a changed value (Eric)
- mov dx, [ati_extended]
- mov ah,al
- mov al,0b2h
- out dx,al
- inc dl
- in al,dx
- shl ah,1
- and al,0e1h
- or ah,al
- mov al,0b2h
- dec dl
- out dx,ax
- sti
- pop dx
- pop ax
- ret
-
-
- _everex: ;Everex
- push ax
- push dx
- push cx
- mov cl,al
- mov dx,3c4h
- mov al,8
- out dx,al
- inc dl
- in al,dx
- dec dl
- shl al,1
- shr cl,1
- rcr al,1
- mov ah,al
- mov al,8
- out dx,ax
- mov dl,0cch
- in al,dx
- mov dl,0c2h
- and al,0dfh
- shr cl,1
- jc nob2
- or al,20h
- nob2: out dx,al
- sti
- pop cx
- pop dx
- pop ax
- ret
-
-
- _aheada: ;Ahead Systems Ver A
- push ax
- push dx
- push cx
- mov ch,al
- mov dx,3ceh ;Enable extended registers
- mov ax,200fh
- out dx,ax
- mov dl,0cch ;bit 0
- in al,dx
- mov dl,0c2h
- and al,11011111b
- shr ch,1
- jnc skpa
- or al,00100000b
- skpa: out dx,al
- mov dl,0cfh ;bits 1,2,3
- mov al,0
- out dx,al
- inc dx
- in al,dx
- dec dx
- and al,11111000b
- or al,ch
- mov ah,al
- mov al,0
- out dx,ax
- sti
- pop cx
- pop dx
- pop ax
- ret
-
-
- _aheadb: ;Ahead Systems Ver A
- push ax
- push dx
- push cx
- mov ch,al
- mov dx,3ceh ;Enable extended registers
- mov ax,200fh
- out dx,ax
- mov ah,ch
- mov cl,4
- shl ah,cl
- or ah,ch
- mov al,0dh
- out dx,ax
- sti
- pop cx
- pop dx
- pop ax
- ret
-
-
- _oaktech: ;Oak Technology Inc OTI-067
- push ax
- push dx
- and al,15
- mov ah,al
- shl al,1
- shl al,1
- shl al,1
- shl al,1
- or ah,al
- mov al,11h
- mov dx,3deh
- out dx,ax
- sti
- pop dx
- pop ax
- ret
-
- _genoa: ;GENOA GVGA
- push ax
- push dx
- mov ah,al
- shl al,1
- shl al,1
- shl al,1
- or ah,al
- mov al,6
- or ah,40h
- mov dx,3c4h
- out dx,ax
- sti
- pop dx
- pop ax
- ret
-
- _ncr: ;NCR 77C22E
- push ax
- push dx
- shl al,1 ;change 64k bank number into 16k bank number
- shl al,1
- mov ah,al
- mov al,18h
- mov dx,3c4h
- out dx,ax
- mov ax,19h
- out dx,ax
- sti
- pop dx
- pop ax
- ret
-
- _compaq: ;Compaq
- push ax
- push dx
- mov dx,3ceh
- mov ax,50fh ;unlock extended registers
- out dx,ax
- mov ah,byte ptr OSEG[curbk]
- shl ah,1 ;change 64k bank number into 4k bank number
- shl ah,1
- shl ah,1
- shl ah,1
- mov al,45h
- out dx,ax
- sti
- pop dx
- pop ax
- ret
-
- _vesa: ;Vesa SVGA interface
- push ax
- push bx
- push cx
- push dx
- mov cl,[vesashift]
- shl ax,cl
- mov dx,ax
- xor bx,bx
- mov ax,4f05h
- int 10h
- sti
- pop dx
- pop cx
- pop bx
- pop ax
- ret
-
- _nobank:
- sti
- ret
-
- newbank endp
-
- bkadr macro func
- mov [func],1
- mov [bankadr],offset _&func
- if @Codesize
- mov [bankseg],seg _&func
- endif
- endm
-
- nojmp macro
- local lbl
- jmp lbl
- lbl:
- endm
-
-
- forcevga proc vid_card:word ;force video card to one type
-
- mov [bankadr],offset _nobank ; default for Cirrus???
- if @Codesize
- mov [bankseg],seg _nobank
- endif
-
- mov ax, [vid_card]
- cmp ax, 15
- jnz no_vesa
- bkadr vesa
- ; mov [vga512],1
- ; mov [vga1024],1
- jmp finish
-
- no_vesa:
- cmp ax, 1 ; ati
- jz also_ati
-
- cmp ax, 16 ; ati hi_color ?
- jnz no_ati
- ; mov [vga1024],1 ; hi_color has 1 meg
- also_ati: ; ie hop into here if ati hi color
- bkadr ativga
- ; mov [vga512],1 ; forcing 512k may not exist
- jmp finish
-
- no_ati: ;Test for Everex
- cmp ax, 3
- jnz no_ev
- bkadr everex
- ; mov [vga512],1
- jmp finish
-
- no_ev: ;Test for Compaq
- cmp ax, 14
- jnz no_cp
- bkadr compaq
- ; mov [vga512],1
- jmp finish
-
- no_cp: ;Test for NCR 77C22E
- cmp ax, 6
- jnz non_cr
- bkadr ncr
- ; mov [vga512],1
- jmp finish
-
- non_cr: ;Test for Trident
- cmp ax, 8
- jnz try_8900
- bkadr trident
- ; mov [vga512], 1
- jmp finish
-
- try_8900: ; test Trident 8900 assume 1 Meg
- cmp ax, 9
- jnz no_tri
- bkadr trident
- ; mov [vga1024],1
- jmp finish
-
- no_tri: ;Test for Video 7
- cmp ax, 12
- jnz nov_7
- bkadr video7
- ; mov [vga1024],1
- jmp finish
-
- nov_7: ;Test for GENOA GVGA
- cmp ax, 5
- jnz no_ci
- bkadr genoa
- ; mov [vga512],1
- jmp finish
-
- no_ci: ;Test for Paradise
- cmp ax, 7
- jnz no_pd
- bkadr paradise
- ; mov [vga512],1
- jmp finish
-
- no_pd: ;Test for Chips & Tech
- cmp ax, 2
- jnz no_ct
- bkadr chipstech
- ; mov [vga512],1
- jmp finish
-
- no_ct:
- cmp ax, 10
- jnz t4_mem
- bkadr tseng
- ; mov [vga512],1
- jmp finish
-
- t4_mem: ;Tseng 4000 memory detect 1meg
- cmp ax, 17 ; check for hi color mode
- jz t4hi ; not much to do since this does not use bank switching routine
-
- cmp ax, 11
- jnz no_ts
- t4hi:
- ; mov [vga1024],1 ;full meg with eight 256kx4 RAMs
- bkadr tseng4
- jmp finish
-
- no_ts:
- cmp ax, 1
- jnz no_ab
- bkadr aheada
- ; mov [vga512],1
- jmp finish
-
- ;verb: ; can't force ahead b yet
- ; cmp ax,
- ; bkadr aheadb
- ; mov [vga512],1
- ; jmp short finish
-
- no_ab: ;Test for Oak Technology
- cmp ax, 4
- jnz no_gn
- bkadr oaktech
- ; mov [vga512],1
- jmp finish
-
- no_gn: ;Test for Cirrus
-
-
- finish:
- mov ax, 1 ; always return 1 in retval ie card svga = 1
- mov [retval],ax
- ret
- forcevga endp
-
-
-
- whichvga proc uses si di
- local vesabuf[256]:byte
-
- cmp [first],'FI'
- jnz gotest
- mov ax,[retval]
- ret
- gotest: mov [bankadr],offset _nobank
- if @Codesize
- mov [bankseg],seg _nobank
- endif
- xor ax,ax
- mov [curbk],ax
- mov [vga512],ax
- mov [vga1024],ax
- mov [cirrus],ax
- mov [everex],ax
- mov [paradise],ax
- mov [tseng],ax
- mov [trident],ax
- mov [t8900],ax
- mov [ativga],ax
- mov [aheada],ax
- mov [aheadb],ax
- mov [oaktech],ax
- mov [video7],ax
- mov [chipstech],ax
- mov [tseng4],ax
- mov [genoa],ax
- mov [ncr],ax
- mov [compaq],ax
- mov [vesa],ax
- mov [first],'FI'
-
- mov ax,ss
- mov es,ax
- lea di,vesabuf[0]
- mov ax,4f00h
- int 10h
- cmp ax,4fh
- jnz novesa
- lea si,vesabuf[0]
- mov di,offset vgainfo
- mov ax,ds
- mov es,ax
- push ds
- mov ax,ss
- mov ds,ax
- mov cx,7
- cld
- rep movsw
- pop ds
- bkadr vesa
- mov [vga512],1
- mov [vga1024],1
- jmp fini
-
- novesa: mov si,1
- mov ax,0c000h
- mov es,ax
- cmp word ptr es:[40h],'13' ;ATI Signiture on the Video BIOS
- jnz noati
- bkadr ativga
-
- mov ax, 0c000h ; find the location of the ATI extended reg
- mov es, ax
- mov bx, 10h
- mov dx, es:[bx] ; fetch the extended reg value
- mov [ati_extended], dx
-
- cli
- mov dx,1ceh
- mov al,0bbh
- out dx,al
- inc dl
- in al,dx
- sti
- and al,20h
- jz no512
- mov [vga512],1
- no512:
- jmp fini
-
- noati: mov ax,7000h ;Test for Everex
- xor bx,bx
- cld
- int 10h
- cmp al,70h
- jnz noev
- bkadr everex
- and ch,11000000b ;how much memory on board
- jz skp
- mov [vga512],1
- skp: ;fall through for Everex boards using Trident or Tseng4000
-
- noev: mov ax,0bf03h ;Test for Compaq
- xor bx,bx
- mov cx,bx
- int 10h
- cmp ax,0bf03h
- jnz nocp
- test cl,40h ;is 640x480x256 available?
- jz nocp
- bkadr compaq
- mov [vga512],1
- jmp fini
-
- nocp: mov dx,3c4h ;Test for NCR 77C22E
- mov ax,0ff05h
- call _isport2
- jnz noncr
- mov ax,5 ;Disable extended registers
- out dx,ax
- mov ax,0ff10h ;Try to write to extended register 10
- call _isport2 ;If it writes then not NCR
- jz noncr
- mov ax,105h ;Enable extended registers
- out dx,ax
- mov ax,0ff10h
- call _isport2
- jnz noncr ;If it does NOT write then not NCR
- bkadr ncr
- mov [vga512],1
- jmp fini
-
- noncr: mov dx,3c4h ;Test for Trident
- mov al,0bh
- out dx,al
- inc dl
- in al,dx
- cmp al,06h
- ja notri
- cmp al,2
- jb notri
- bkadr trident
- cmp al,3
- jb no89
- mov [t8900],1
- mov dx,3d5h
- mov al,1fh
- out dx,al
- inc dx
- in al,dx
- and al,3
- cmp al,1
- jb notmem
- mov [vga512],1
- je notmem
- mov [vga1024],1
- notmem: jmp fini
-
- no89: mov [vga512],1
- jmp fini
-
- notri: mov ax,6f00h ;Test for Video 7
- xor bx,bx
- cld
- int 10h
- cmp bx,'V7'
- jnz nov7
- bkadr video7
- mov ax,6f07h
- cld
- int 10h
- and ah,7fh
- cmp ah,1
- jbe skp2
- mov [vga512],1
- skp2: cmp ah,3
- jbe skp3
- mov [vga1024],1
- skp3: jmp fini
-
- nov7: mov dx,3d4h ;Test for GENOA GVGA
- mov ax,032eh ;check for Herchi Register
- call _isport2
- jnz nogn
- mov dx,3c4h ;check for memory segment register
- mov ax,3f06h
- call _isport2
- jnz nogn
- bkadr genoa
- mov [vga512],1
- jmp fini
-
- nogn: call _cirrus ;Test for Cirrus
- cmp [cirrus],0
- je noci
- jmp fini
-
- noci: mov dx,3ceh ;Test for Paradise
- mov al,9 ;check Bank switch register
- out dx,al
- inc dx
- in al,dx
- dec dx
- or al,al
- jnz nopd
-
- mov ax,50fh ;turn off write protect on VGA registers
- out dx,ax
- mov dx,offset _pdrsub
- mov cx,1
- call _chkbk
- jc nopd ;if bank 0 and 1 same not paradise
- bkadr paradise
- mov dx,3ceh
- mov al,0bh ;512k detect from Bob Berry
- out dx,al
- inc dx
- in al,dx
- test al,80h ;if top bit set then 512k
- jz nop512
- mov [vga512],1
- nop512: jmp fini
-
- nopd: mov ax,5f00h ;Test for Chips & Tech
- xor bx,bx
- cld
- int 10h
- cmp al,5fh
- jnz noct
- bkadr chipstech
- cmp bh,1
- jb skp4
- mov [vga512],1
- skp4: jmp fini
-
- noct: mov ch,0
- mov dx,3d4h ;check for Tseng 4000 series
- mov ax,0f33h
- call _isport2
- jnz not4
- mov ch,1
-
- mov dx,3bfh ;Enable access to extended registers
- mov al,3
- out dx,al
- mov dx,3d8h
- mov al,0a0h
- out dx,al
- jmp short yes4
-
- not4: mov dx,3d4h ;Test for Tseng 3000 or 4000
- mov ax,1f25h ;is the Overflow High register there?
- call _isport2
- jnz nots
- mov al,03fh ;bottom six bits only
- jmp short yes3
- yes4: mov al,0ffh
- yes3: mov dx,3cdh ;test bank switch register
- call _isport1
- jnz nots
- bkadr tseng
- cmp ch,0
- jnz t4mem
- mov [vga512],1
- jmp fini
-
- t4mem: mov dx,3d4h ;Tseng 4000 memory detect 1meg
- mov al,37h
- out dx,al
- inc dx
- in al,dx
- test al,1000b ;if using 64kx4 RAMs then no more than 256k
- jz nomem
- and al,3
- cmp al,1 ;if 8 bit wide bus then only two 256kx4 RAMs
- jbe nomem
- mov [vga512],1
- cmp al,2 ;if 16 bit wide bus then four 256kx4 RAMs
- je nomem
- mov [vga1024],1 ;full meg with eight 256kx4 RAMs
- nomem: bkadr tseng4
- jmp short fini
-
- nots:
- mov dx,3ceh ;Test for Above A or B chipsets
- mov ax,200fh
- out dx,ax
- inc dx
- nojmp
- in al,dx
- cmp al,21h
- jz verb
- cmp al,20h
- jnz noab
- bkadr aheada
- mov [vga512],1
- jmp short fini
-
- verb: bkadr aheadb
- mov [vga512],1
- jmp short fini
-
- noab: mov dx,3deh ;Test for Oak Technology
- mov ax,0ff11h ;look for bank switch register
- call _isport2
- jnz nooak
- bkadr oaktech
- mov al,0dh
- out dx,al
- inc dx
- nojmp
- in al,dx
- test al,80h
- jz no4ram
- mov [vga512],1
- no4ram: jmp short fini
-
- nooak: mov si,0
-
- fini: mov ax,si
- mov [retval],ax
- ret
- whichvga endp
-
-
- _cirrus proc near
- mov dx,3d4h ; assume 3dx addressing
- mov al,0ch ; screen a start address hi
- out dx,al ; select index
- inc dx ; point to data
- mov ah,al ; save index in ah
- in al,dx ; get screen a start address hi
- xchg ah,al ; swap index and data
- push ax ; save old value
- push dx ; save crtc address
- xor al,al ; clear crc
- out dx,al ; and out to the crtc
-
- mov al,1fh ; Eagle ID register
- dec dx ; back to index
- out dx,al ; select index
- inc dx ; point to data
- in al,dx ; read the id register
- mov bh,al ; and save it in bh
-
- mov cl,4 ; nibble swap rotate count
- mov dx,3c4h ; sequencer/extensions
- mov bl,6 ; extensions enable register
-
- ror bh,cl ; compute extensions disable value
- mov ax,bx ; extensions disable
- out dx,ax ; disable extensions
- inc dx ; point to data
- in al,dx ; read enable flag
- or al,al ; disabled ?
- jnz exit ; nope, not an cirrus
-
- ror bh,cl ; compute extensions enable value
- dec dx ; point to index
- mov ax,bx ; extensions enable
- out dx,ax ; enable extensions
- inc dx ; point to data
- in al,dx ; read enable flag
- cmp al,1 ; enabled ?
- jne exit ; nope, not an cirrus
- mov [cirrus],1
- mov [bankadr],offset _nobank
- if @Codesize
- mov [bankseg],seg _nobank
- endif
- exit: pop dx ; restore crtc address
- dec dx ; point to index
- pop ax ; recover crc index and data
- out dx,ax ; restore crc value
- ret
- _cirrus endp
-
- _chkbk proc near ;bank switch check routine
- mov di,0b800h
- mov es,di
- xor di,di
- mov bx,1234h
- call _gochk
- jnz badchk
- mov bx,4321h
- call _gochk
- jnz badchk
- clc
- ret
- badchk: stc
- ret
- _chkbk endp
-
- _gochk proc near
- push si
- mov si,bx
-
- mov al,cl
- call dx
- xchg bl,es:[di]
- mov al,ch
- call dx
- xchg bh,es:[di]
-
- xchg si,bx
-
- mov al,cl
- call dx
- xor bl,es:[di]
- mov al,ch
- call dx
- xor bh,es:[di]
-
- xchg si,bx
-
- mov al,ch
- call dx
- mov es:[di],bh
- mov al,cl
- call dx
- mov es:[di],bl
-
- mov al,0
- call dx
- or si,si
- pop si
- ret
- _gochk endp
-
-
- _pdrsub proc near ;Paradise
- push dx
- mov ah,al
- mov dx,3ceh
- mov al,9
- out dx,ax
- pop dx
- ret
- _pdrsub endp
-
-
- _isport2 proc near
- push bx
- mov bx,ax
- out dx,al
- mov ah,al
- inc dx
- in al,dx
- dec dx
- xchg al,ah
- push ax
- mov ax,bx
- out dx,ax
- out dx,al
- mov ah,al
- inc dx
- in al,dx
- dec dx
- and al,bh
- cmp al,bh
- jnz noport
- mov al,ah
- mov ah,0
- out dx,ax
- out dx,al
- mov ah,al
- inc dx
- in al,dx
- dec dx
- and al,bh
- cmp al,0
- noport: pop ax
- out dx,ax
- pop bx
- ret
- _isport2 endp
-
- _isport1 proc near
- mov ah,al
- in al,dx
- push ax
- mov al,ah
- out dx,al
- in al,dx
- and al,ah
- cmp al,ah
- jnz noport2
- mov al,0
- out dx,al
- in al,dx
- and al,ah
- cmp al,0
- noport2: pop ax
- out dx,al
- ret
- _isport1 endp
-
- end
-
-