629 lines
13 KiB
NASM
629 lines
13 KiB
NASM
;----------------------------------------------------------------------------
|
|
; 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 <dword ptr[eax]>
|
|
BankSize textequ <dword ptr[eax+4]>
|
|
BankOver textequ <dword ptr[eax+8]>
|
|
NonStdVESA textequ <byte ptr[eax+12]>
|
|
BankShift textequ <byte ptr[eax+13]>
|
|
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; ██▀▀▀ █▀▀▀▀ █▀▀▀█ █▀▀▀▀ █▀▀▀▀ ██▄ █ █▄ ▄█ █▀▀▀█ █▀▀▀▄ █▀▀▀▀
|
|
; ▀▀▀▀█ ██ ██▀█▀ ██▀▀ ██▀▀ ██▀██ ██▀ █ ██ █ ██ █ ██▀▀
|
|
; ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
|
|
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
|