;---------------------------------------------------------------------------- ; INITSVGA.ASM 386 ; (c) Adeline 1993 ;---------------------------------------------------------------------------- .386p jumps .model FLAT, SYSCALL ;---------------------------------------------------------------------------- .code PUBLIC driver_start driver_start dd OFFSET ListFuncs IFDEF REALTEK db 'Realtek RTG 3105' ENDIF IFDEF OAK db 'OAK OTI 067/077' ENDIF IFDEF NCR db 'NCR 77C22' ENDIF IFDEF COMPAQ db 'Compaq QVision/AVGA' ENDIF IFDEF TSENG db 'Tseng Lab ET 3000/4000' ENDIF IFDEF PARADISE db 'Paradise/Western Digital' ENDIF IFDEF GENOA db 'Genoa' ENDIF IFDEF S3 db 'S3' ENDIF IFDEF CIRRUS db 'Cirrus Logic' ENDIF IFDEF TRIDENT db 'Trident' ENDIF IFDEF ATI db 'ATI' ENDIF db ' Super VGA Driver, Version 1.00,', 13, 10 db 'Copyright (c) Adeline Software International 1994, All Rights Reserved.', 13, 10, 10, 0 Scanline textequ BankSize textequ BankOver textequ NonStdVESA textequ BankShift textequ ;*══════════════════════════════════════════════════════════════════════════* ; ██▀▀▀ █▀▀▀▀ █▀▀▀█ █▀▀▀▀ █▀▀▀▀ ██▄ █ █▄ ▄█ █▀▀▀█ █▀▀▀▄ █▀▀▀▀ ; ▀▀▀▀█ ██ ██▀█▀ ██▀▀ ██▀▀ ██▀██ ██▀ █ ██ █ ██ █ ██▀▀ ; ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀ ;*══════════════════════════════════════════════════════════════════════════* ;*──────────────────────────────────────────────────────────────────────────* ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ifdef REALTEK ListFuncs dd offset InitMode dd offset NewBank dd 0 ;---------------------------------------------------------------------------- NewBank proc mov dx, 3D7h out dx, al ret NewBank endp ;---------------------------------------------------------------------------- InitMode proc mov ax, 26h int 10h ret InitMode endp ;---------------------------------------------------------------------------- endif ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ifdef OAK ListFuncs dd offset InitMode dd offset NewBank dd 0 ;---------------------------------------------------------------------------- NewBank proc mov ah, al shl al, 4 or ah, al mov dx, 3DEh mov al, 11h out dx, ax ret NewBank endp ;---------------------------------------------------------------------------- InitMode proc mov ax, 53h int 10h ret InitMode endp ;---------------------------------------------------------------------------- endif ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ifdef NCR ListFuncs dd offset InitMode dd offset NewBank dd 0 ;---------------------------------------------------------------------------- NewBank proc shl ax, 10 mov al, 18h mov dx, 03C4h out dx, ax ret NewBank endp ;---------------------------------------------------------------------------- InitMode proc mov ax, 5Fh int 10h ret InitMode endp ;---------------------------------------------------------------------------- endif ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ifdef COMPAQ ListFuncs dd offset InitMode dd offset NewBank dd 0 ;---------------------------------------------------------------------------- NewBank proc shl ax, 12 mov al, 45h mov dx, 03CEh out dx, ax ret NewBank endp ;---------------------------------------------------------------------------- InitMode proc mov ScanLine, 1024 mov NonStdVESA, 1 mov ax, 32h int 10h mov dx, 03CEh mov ax, 050Fh out dx, ax ; unlock extended regs ret InitMode endp ;---------------------------------------------------------------------------- endif ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ifdef TSENG ListFuncs dd offset InitMode dd offset NewBank dd 0 ;---------------------------------------------------------------------------- NewBank proc ; ET3000, Should work ; on the ET4000 also ; as long as we don't ; read the screen... mov dx, 03CDh or al, 40h out dx, al ret NewBank endp ;---------------------------------------------------------------------------- InitMode proc ; ET3000/ET4000 mov ax, 2Eh ; Basculer Mode Video int 10h ; Tseng 640*480*256 mov dx, 3BFh ; Enable access to extended registers mov al, 3 ; for ET4000 out dx, al mov dl, 0D8h mov al, 0A0h out dx, al ret InitMode endp ;---------------------------------------------------------------------------- endif ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ifdef PARADISE ListFuncs dd offset InitMode dd offset NewBank dd 0 ;---------------------------------------------------------------------------- NewBank proc ; Western Digital / ; Paradise mov dx, 03CEh shl ax, 12 ; 4K banks mov al, 09h out dx, ax ret NewBank endp ;---------------------------------------------------------------------------- InitMode proc mov ax, 5Fh ; Basculer Mode Video int 10h ; WD/Paradise 640*480*256 mov dx, 03CEh mov al, 0Fh out dx, al inc dx ; 3CFh in al, dx and al, 11101000b or al, 00000101b out dx, al dec dx ; 3CEh mov al, 0Bh out dx, al inc dx ; 3CFh in al, dx and al, 11110111b out dx, al mov dl, 0C4h ; 3C4h mov al, 11h out dx, al inc dx ; 3C5h in al, dx and al, 01111111b out dx, al ret InitMode endp ;---------------------------------------------------------------------------- endif ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ifdef GENOA ListFuncs dd offset InitMode dd offset NewBank dd 0 ;---------------------------------------------------------------------------- NewBank proc ; Genoa (not old ET3000 model) mov dx, 03C4h mov ah, al shl ah, 3 or ah, al or ah, 40h mov al, 06h out dx, ax ret NewBank endp ;---------------------------------------------------------------------------- InitMode proc ; Genoa (not old ET3000 model) mov ax, 5Ch ; Basculer Mode Video int 10h ; Genoa 640*480*256 ret InitMode endp ;---------------------------------------------------------------------------- endif ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ifdef S3 ListFuncs dd 0 dd offset NewBank dd offset Enable ;---------------------------------------------------------------------------- NewBank proc mov dx, 3d4h ; Switch banks mov ah, al mov al, 35h out dx, ax ret NewBank endp ;---------------------------------------------------------------------------- Enable proc mov dx, 3d4h ; Enable extended registers mov al, 38h out dx, al inc dx mov al, 48h out dx, al dec dx ; Enable write to bank registers mov al, 31h out dx, al inc dx mov al, 89h in al, dx mov ah, al dec dx mov al, 31h out dx, al inc dx mov al, ah or al, 9 out dx, al ret Enable endp ;---------------------------------------------------------------------------- endif ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ifdef CIRRUS ListFuncs dd 0 dd offset NewBank dd offset Enable ;---------------------------------------------------------------------------- NewBank proc mov dx, 03CEh shl ax, 12 mov al, 09h out dx, ax dec al out dx, al ret NewBank endp ;---------------------------------------------------------------------------- Enable proc comment @ mov dx, 03D4h ; 3D4h mov al, 0Ch ; Screen A start addr Hi out dx, al inc dx ; 3D5h in al, dx mov cl, al ; cl = start addr xor al, al out dx, al ; write 0 to gain ; access to Eagle ID dec dx ; 3D4h mov al, 1Fh ; Eagle ID reg out dx, al inc dx ; 3D5h in al, dx ; get Eagle ID mov ah, al ; ah = Eagle ID mov dl, 0C4h ; 3C4h mov al, 06h ; extension register mov ah, 12h ; should not be there out dx, ax ; write Eagle ID to ; enable extended regs ; Used to be 12h... mov dl, 0D4h ; 3D4h mov al, 0Ch ; Screen A start addr Hi mov ah, cl ; old start addr out dx, ax ; write old value @ mov dx, 3c4h mov ax, 1206h out dx, ax ret Enable endp ;---------------------------------------------------------------------------- endif ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ifdef TRIDENT ListFuncs dd offset InitMode dd offset NewBank dd 0 ;---------------------------------------------------------------------------- NewBank proc mov dx, 3C4h xor al, 2 ; (strange chip design) mov ah, al mov al, 0Eh out dx, ax ret NewBank endp ;---------------------------------------------------------------------------- InitMode proc mov ax, 5Dh ; Basculer Mode Video int 10h ; Trident 640*480*256 mov dx, 3CEh ; set pagesize to 64k mov al, 6 out dx, al inc dx in al, dx or al, 4 mov ah, al mov al, 6 dec dx out dx, ax mov dl, 0C4h ; switch to BPS mode mov al, 0Bh out dx, al inc dx in al, dx ret InitMode endp ;---------------------------------------------------------------------------- endif ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- ifdef ATI ListFuncs dd offset InitMode dd offset NewBank dd 0 comment @ ;---------------------------------------------------------------------------- NewBank proc shl ax, 9 mov dx, 1CEh mov al, 0B2h out dx, al inc dx in al, dx and al, 0E1h or ah, al mov al, 0B2h dec dx out dx, ax ret NewBank endp ;---------------------------------------------------------------------------- InitMode proc mov ax, 62h ; Basculer Mode Video int 10h ; ATI 640*480*256 ret InitMode endp ;---------------------------------------------------------------------------- @ NewBank proc shl ax, 9 extended_reg equ $+4 mov dx, 1CEh mov al, 0B2h out dx, al inc dx in al, dx and al, 0E1h or ah, al mov al, 0B2h dec dx out dx, ax ret NewBank endp ;---------------------------------------------------------------------------- InitMode proc mov ax, 62h ; Basculer Mode Video int 10h ; ATI 640*480*256 mov ax, [0C0010h] mov word ptr[extended_reg], ax ret InitMode endp ;---------------------------------------------------------------------------- endif ;---------------------------------------------------------------------------- ;---------------------------------------------------------------------------- End