1173 lines
30 KiB
NASM
1173 lines
30 KiB
NASM
page ,132
|
|
;-----------------------------Module-Header-----------------------------;
|
|
; Module Name: VFLAT.ASM
|
|
;
|
|
; module for doing direct video access under windows.
|
|
;
|
|
; we will talk to VflatD to get the linear address of the video buffer.
|
|
;
|
|
; we MUST not use these API in the background, how do we do this?
|
|
;
|
|
; we support the following modes: (same as SVGA256...)
|
|
;
|
|
; VRAM II 640x480x8bpp
|
|
; VRAM II 720x512x8bpp
|
|
; VRAM II 800x600x8bpp
|
|
; VRAM II 1024x768x8bpp
|
|
;
|
|
; V7 VGA 640x480x8bpp
|
|
; V7 VGA 720x512x8bpp
|
|
; V7 VGA 800x600x8bpp
|
|
; V7 VGA 1024x768x8bpp
|
|
;
|
|
; WD VGA 640x480x8bpp
|
|
; WD VGA 800x600x8bpp
|
|
; WD VGA 1024x768x8bpp
|
|
; WD VGA 640x480x16bpp
|
|
; WD VGA 800x600x16bpp
|
|
;
|
|
; Trident 640x480x8bpp
|
|
; Trident 800x600x8bpp
|
|
; Trident 1024x768x8bpp
|
|
;
|
|
; Oak 640x480x8bpp
|
|
; Oak 800x600x8bpp
|
|
; Oak 1024x768x8bpp
|
|
;
|
|
; ATI 640x480x8bpp
|
|
; ATI 800x600x8bpp
|
|
; ATI 1024x768x8bpp
|
|
; ATI 640x480x24bpp
|
|
;
|
|
; Compaq AVGA 640x480x8bpp
|
|
;
|
|
; Compaq QVision 640x480x8bpp
|
|
; Compaq QVision 800x600x8bpp
|
|
; Compaq QVision 1024x768x8bpp
|
|
;
|
|
; Compaq QVision 640x480x16bpp
|
|
; Compaq QVision 800x600x16bpp
|
|
; Compaq QVision 1024x768x16bpp
|
|
;
|
|
; Tseng ET4000 640x480x8bpp
|
|
; Tseng ET4000 800x600x8bpp
|
|
; Tseng ET4000 1024x768x8bpp
|
|
; Tseng ET4000 640x480x16bpp
|
|
; Tseng ET4000 800x600x16bpp
|
|
;
|
|
; Everex 640x480x8bpp
|
|
; Everex 800x600x8bpp
|
|
; Everex 1024x768x8bpp
|
|
;
|
|
; Cirrus 542x 640x480x8bpp
|
|
; Cirrus 542x 800x600x8bpp
|
|
; Cirrus 542x 1024x768x8bpp
|
|
;
|
|
; Cirrus 6420 640x480x8bpp
|
|
; Cirrus 6420 800x600x8bpp
|
|
; Cirrus 6420 1024x768x8bpp
|
|
;
|
|
; Created: 03-20-90
|
|
; Author: Todd Laney [ToddLa]
|
|
;
|
|
; Copyright (c) 1984-1994 Microsoft Corporation
|
|
;
|
|
; Public Functions:
|
|
;
|
|
; VFlatInit()
|
|
;
|
|
; Public Data:
|
|
;
|
|
; General Description:
|
|
;
|
|
; Restrictions:
|
|
;
|
|
;-----------------------------------------------------------------------;
|
|
|
|
?PLM = 1
|
|
?WIN = 0
|
|
.386
|
|
.xlist
|
|
include cmacros.inc
|
|
include windows.inc
|
|
WIN31=1
|
|
include VflatD.inc
|
|
.list
|
|
|
|
externFP GetDC
|
|
externFP ReleaseDC
|
|
externFP GetDeviceCaps
|
|
externFP OutputDebugString
|
|
externFP WriteProfileString
|
|
|
|
externA __C000h
|
|
externA __A000h
|
|
|
|
sBegin Data
|
|
|
|
ScreenMode dw 0 ; current mode (index)
|
|
VflatD_Proc dd 0 ; VflatD entry point
|
|
|
|
bank_save dw 0 ; saved bank...
|
|
|
|
sEnd Data
|
|
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
|
|
ifdef DEBUG
|
|
DPF macro text
|
|
local string, string_end
|
|
jmp short string_end
|
|
string label byte
|
|
db "&text&",13,10,0
|
|
string_end label byte
|
|
pusha
|
|
push es
|
|
push cs
|
|
push offset string
|
|
call OutputDebugString
|
|
pop es
|
|
popa
|
|
endm
|
|
else
|
|
DPF macro text
|
|
endm
|
|
endif
|
|
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
|
|
ifndef SEGNAME
|
|
SEGNAME equ <_TEXT>
|
|
endif
|
|
|
|
createSeg %SEGNAME, CodeSeg, word, public, CODE
|
|
|
|
sBegin CodeSeg
|
|
.386p
|
|
assumes cs,CodeSeg
|
|
assumes ds,Data
|
|
assumes es,nothing
|
|
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
|
|
ifdef DEBUG
|
|
szDebug db "Debug", 0
|
|
szDrawDib db "DrawDib", 0
|
|
szDetect db "detect", 0
|
|
szDetectDVA db "DetectDVA: ", 0
|
|
szNone db "None", 0
|
|
endif
|
|
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
|
|
ModeInfo STRUC
|
|
|
|
ModeNext dw ?
|
|
ModeDetect dw ?
|
|
ModeNum dw ?
|
|
ModeWidth dw ?
|
|
ModeHeight dw ?
|
|
ModeDepth dw ?
|
|
ModeSetBank dw ?
|
|
ModeGetBank dw ?
|
|
ModeSetBank32 dw ?
|
|
ModeSetBank32Size dw ?
|
|
ModeName db ?
|
|
|
|
ModeInfo ENDS
|
|
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
|
|
Mode macro y, n, w, h, b, x, name
|
|
local l1,l2
|
|
l1:
|
|
dw l2 - l1
|
|
dw Detect&y, n, w, h, b, SetBank&x, GetBank&x, SetBank32&x, SetBank32&x&Size
|
|
|
|
ifdef DEBUG
|
|
db name
|
|
db 0
|
|
endif
|
|
|
|
l2:
|
|
endm
|
|
|
|
ModeInfoTable label byte
|
|
|
|
Mode VRAM, 67h, 640, 480, 8, VRAM, "VRAM II 640x480x8bpp"
|
|
Mode VRAM, 68h, 720, 512, 8, VRAM, "VRAM II 720x512x8bpp"
|
|
Mode VRAM, 69h, 800, 600, 8, VRAM, "VRAM II 800x600x8bpp"
|
|
Mode VRAM, 6Ah, 1024,768, 8, VRAM, "VRAM II 1024x768x8bpp"
|
|
|
|
Mode V7, 67h, 640, 480, 8, V7, "V7 VGA 640x480x8bpp"
|
|
Mode V7, 68h, 720, 512, 8, V7, "V7 VGA 720x512x8bpp"
|
|
Mode V7, 69h, 800, 600, 8, V7, "V7 VGA 800x600x8bpp"
|
|
Mode V7, 6Ah, 1024,768, 8, V7, "V7 VGA 1024x768x8bpp"
|
|
|
|
Mode WD, 5Fh, 640, 480, 8, WD, "WD VGA 640x480x8bpp"
|
|
Mode WD, 5Ch, 800, 600, 8, WD, "WD VGA 800x600x8bpp"
|
|
Mode WD, 60h, 1024,768, 8, WD, "WD VGA 1024x768x8bpp"
|
|
Mode WD, 64h, 640, 480,16, WD, "WD VGA 640x480x16bpp"
|
|
Mode WD, 65h, 800, 600,16, WD, "WD VGA 800x600x16bpp"
|
|
|
|
Mode Trident, 5Dh, 640, 480, 8, Trident, "Trident 640x480x8bpp"
|
|
Mode Trident, 5Eh, 800, 600, 8, Trident, "Trident 800x600x8bpp"
|
|
Mode Trident, 62h, 1024,768, 8, Trident, "Trident 1024x768x8bpp"
|
|
|
|
Mode Oak, 53h, 640, 480, 8, Oak, "Oak 640x480x8bpp"
|
|
Mode Oak, 54h, 800, 600, 8, Oak, "Oak 800x600x8bpp"
|
|
Mode Oak, 59h, 1024,768, 8, Oak, "Oak 1024x768x8bpp"
|
|
|
|
Mode ATI, 12h, 640, 480, 8, ATI, "ATI 640x480x8bpp"
|
|
Mode ATI, 12h, 800, 600, 8, ATI, "ATI 800x600x8bpp"
|
|
Mode ATI, 12h, 1024,768, 8, ATI, "ATI 1024x768x8bpp"
|
|
Mode ATI, 12h, 2048,1024,8, ATI, "ATI 2048x1024x8bpp"
|
|
|
|
Mode ATI, 12h, 640, 480,16, ATI, "ATI 640x480x16bpp"
|
|
Mode ATI, 12h, 800, 600,16, ATI, "ATI 800x600x16bpp"
|
|
Mode ATI, 12h, 1024,768,16, ATI, "ATI 1024x768x16bpp"
|
|
Mode ATI, 12h, 2048,1024,16,ATI, "ATI 2048x1024x16bpp"
|
|
|
|
Mode ATI, 12h, 640, 480,24, ATI, "ATI 640x480x24bpp"
|
|
Mode ATI, 12h, 800, 600,24, ATI, "ATI 800x600x24bpp"
|
|
Mode ATI, 12h, 1024,768,24, ATI, "ATI 1024x768x24bpp"
|
|
Mode ATI, 12h, 2048,1024,24,ATI, "ATI 2048x1024x24bpp"
|
|
|
|
Mode ATI, 62h, 640, 480, 8, ATI, "ATI 640x480x8bpp"
|
|
Mode ATI, 63h, 800, 600, 8, ATI, "ATI 800x600x8bpp"
|
|
Mode ATI, 64h, 1024,768, 8, ATI, "ATI 1024x768x8bpp"
|
|
Mode ATI, 75h, 640, 480,24, ATI, "ATI 640x480x24bpp"
|
|
|
|
Mode Compaq,2Eh, 640, 480, 8, Compaq, "Compaq AVGA 640x480x8bpp"
|
|
Mode Compaq,12h, 640, 480, 8, Compaq, "Compaq AVGA 640x480x8bpp"
|
|
|
|
Mode Compaq,06h, 640, 480, 8, Compaq, "Compaq QVision 640x480x8bpp"
|
|
Mode Compaq,06h, 800, 600, 8, Compaq, "Compaq QVision 800x600x8bpp"
|
|
Mode Compaq,06h, 1024,768, 8, Compaq, "Compaq QVision 1024x768x8bpp"
|
|
|
|
Mode Compaq,06h, 640, 480, 16, Compaq, "Compaq QVision 640x480x16bpp"
|
|
Mode Compaq,06h, 800, 600, 16, Compaq, "Compaq QVision 800x600x16bpp"
|
|
Mode Compaq,06h, 1024,768, 16, Compaq, "Compaq QVision 1024x768x16bpp"
|
|
|
|
Mode Tseng, 2Eh, 640, 480, 8, Tseng, "Tseng ET4000 640x480x8bpp"
|
|
Mode Tseng, 30h, 800, 600, 8, Tseng, "Tseng ET4000 800x600x8bpp"
|
|
Mode Tseng, 38h, 1024,768, 8, Tseng, "Tseng ET4000 1024x768x8bpp"
|
|
Mode Tseng, 2Eh, 640, 480,16, Tseng, "Tseng ET4000 640x480x16bpp"
|
|
Mode Tseng, 30h, 800, 600,16, Tseng, "Tseng ET4000 800x600x16bpp"
|
|
|
|
Mode Everex, 2Eh, 640, 480, 8, Tseng, "Everex 640x480x8bpp"
|
|
Mode Everex, 30h, 800, 600, 8, Tseng, "Everex 800x600x8bpp"
|
|
Mode Everex, 38h, 1024,768, 8, Tseng, "Everex 1024x768x8bpp"
|
|
|
|
; Until we get a detect routine for Cirrus, we won't include these.
|
|
|
|
;Mode C542x, 5Fh, 640, 480, 8, C542x, "C542x 640x480x8bpp"
|
|
;Mode C542x, 5Ch, 800, 600, 8, C542x, "C542x 800x600x8bpp"
|
|
;Mode C542x, 60h, 1024,768, 8, C542x, "C542x 1024x768x8bpp"
|
|
|
|
;Mode C6420, 2Eh, 640, 480, 8, C6420, "C6420 640x480x8bpp"
|
|
;Mode C6420, 30h, 800, 600, 8, C6420, "C6420 800x600x8bpp"
|
|
;Mode C6420, 38h, 1024,768, 8, C6420, "C6420 1024x768x8bpp"
|
|
|
|
ModeInfoTableEnd label byte
|
|
|
|
;-----------------------------------------------------------------------;
|
|
;-----------------------------------------------------------------------;
|
|
|
|
szTseng: db "Tseng", 0
|
|
szOAK: db " OAK", 0
|
|
szTrident: db "TRIDENT", 0
|
|
szEverex: db "Everex", 0
|
|
szParadise: db "PARADISE", 0
|
|
szWD: db "WESTERN DIGITAL", 0
|
|
szWeitek: db "WEITEK",0
|
|
szViper: db "VIPER VLB",0
|
|
|
|
;---------------------------Public-Routine------------------------------;
|
|
; VFlatInit
|
|
;
|
|
; initialize for a banked display
|
|
;
|
|
; Returns:
|
|
; C if error
|
|
; NC if success
|
|
;-----------------------------------------------------------------------;
|
|
assumes ds,Data
|
|
assumes es,nothing
|
|
|
|
cProc VFlatInit, <NEAR, PASCAL, PUBLIC>, <si,di,ds>
|
|
localW hdc
|
|
localW ScreenWidth
|
|
localW ScreenHeight
|
|
localW ScreenDepth
|
|
localW BiosMode
|
|
cBegin
|
|
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
; get a display DC and get resolution info
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
cCall GetDC, <0>
|
|
mov hdc,ax
|
|
|
|
cCall GetDeviceCaps, <hdc,HORZRES>
|
|
mov ScreenWidth,ax
|
|
|
|
cCall GetDeviceCaps, <hdc,VERTRES>
|
|
mov ScreenHeight,ax
|
|
|
|
cCall GetDeviceCaps, <hdc,BITSPIXEL>
|
|
push ax
|
|
cCall GetDeviceCaps, <hdc,PLANES>
|
|
pop dx
|
|
mul dx
|
|
mov ScreenDepth,ax
|
|
|
|
cCall ReleaseDC, <0, hdc>
|
|
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
; scan our mode table
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
|
|
mov ax, 6F04h ;Get V7 mode
|
|
int 10h
|
|
cmp al,04h
|
|
jne short @f
|
|
mov ax,0F00h ;Call BIOS to get mode back.
|
|
int 10h ;al = mode we are in.
|
|
@@: xor ah,ah
|
|
mov BiosMode,ax
|
|
|
|
lea bx,ModeInfoTable
|
|
|
|
mode_search:
|
|
mov ax,BiosMode
|
|
cmp cs:[bx].ModeNum,ax
|
|
jne short mode_search_next
|
|
|
|
mov ax,ScreenWidth
|
|
cmp cs:[bx].ModeWidth,ax
|
|
jne short mode_search_next
|
|
|
|
mov ax,ScreenHeight
|
|
cmp cs:[bx].ModeHeight,ax
|
|
jne short mode_search_next
|
|
|
|
mov ax,ScreenDepth
|
|
cmp cs:[bx].ModeDepth,ax
|
|
jne short mode_search_next
|
|
|
|
push bx
|
|
call cs:[bx].ModeDetect
|
|
pop bx
|
|
or ax,ax
|
|
jnz short mode_search_found
|
|
errn$ mode_search_next
|
|
|
|
mode_search_next:
|
|
add bx,cs:[bx].ModeNext
|
|
cmp bx,offset ModeInfoTableEnd
|
|
jl mode_search
|
|
jge mode_search_fail
|
|
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
mode_search_found:
|
|
mov ScreenMode,bx ; save this for later.
|
|
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
; this is a banked display, we need to talk to VflatD in order for
|
|
; anything to work.
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
xor di,di
|
|
mov es,di
|
|
mov ax,1684h
|
|
mov bx,VflatD_Windows_ID
|
|
int 2fh ;returns with es:di-->VFlatD Entry point
|
|
mov word ptr [VflatD_Proc][0],di
|
|
mov word ptr [VflatD_Proc][2],es
|
|
mov ax,es
|
|
or ax,di
|
|
jne short mode_search_vflat
|
|
|
|
xor di,di
|
|
mov es,di
|
|
mov ax,1684h
|
|
mov bx,VflatD_Chicago_ID
|
|
int 2fh ;returns with es:di-->VFlatD Entry point
|
|
mov word ptr [VflatD_Proc][0],di
|
|
mov word ptr [VflatD_Proc][2],es
|
|
mov ax,es
|
|
or ax,di
|
|
jz short mode_search_fail
|
|
|
|
mode_search_vflat:
|
|
xor ax,ax
|
|
mov dx,VflatD_Get_Version
|
|
call [VflatD_Proc]
|
|
cmp ax,VflatD_Version
|
|
jb short mode_search_fail
|
|
|
|
;
|
|
; estimate the required framebuffer memory
|
|
;
|
|
mov ax,ScreenDepth ; bitdepth
|
|
mul ScreenWidth ; * width = bit width
|
|
shr ax,3 ; / 8 = width bytes
|
|
add ax,1024-1 ; round up to nearest K
|
|
and ax,not (1024-1) ; now we have scan width
|
|
mul ScreenHeight ; * number of scans = total bytes
|
|
add ax,0FFFFh ; round up to nearest MB
|
|
adc dx,0000Fh
|
|
and dx,0FFF0h
|
|
shl dx,4 ; convert to 4K pages.
|
|
mov ax,dx
|
|
|
|
mov dx,VflatD_Get_Sel ; get selector
|
|
;;;;;;;;mov ax,512 ; size in pages of video memory?
|
|
mov bx,ScreenMode
|
|
mov cx,cs:[bx].ModeSetBank32Size; size of bank code.
|
|
mov di,cs:[bx].ModeSetBank32 ; point es:di to bank code.
|
|
push cs
|
|
pop es
|
|
call [VflatD_Proc] ; let VflatD init things.
|
|
jc short mode_search_fail
|
|
or ax,ax
|
|
jz short mode_search_fail
|
|
|
|
errn$ mode_search_ok
|
|
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
mode_search_ok:
|
|
|
|
ifdef DEBUG
|
|
pusha
|
|
mov bx,ScreenMode
|
|
lea ax,[bx].ModeName
|
|
lea bx,szDrawDib
|
|
lea cx,szDetect
|
|
|
|
cCall WriteProfileString, <cs,bx, cs,cx, cs,ax>
|
|
popa
|
|
endif
|
|
mov dx, ax
|
|
xor ax, ax
|
|
jmp short mode_search_exit
|
|
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
mode_search_fail:
|
|
ifdef DEBUG
|
|
pusha
|
|
lea ax,szDrawDib
|
|
lea bx,szDetect
|
|
lea cx,szNone
|
|
cCall WriteProfileString, <cs,ax, cs,bx, cs,cx>
|
|
popa
|
|
endif
|
|
xor ax,ax
|
|
mov dx,ax
|
|
mov ScreenMode,ax
|
|
mov word ptr [VflatD_Proc][0],ax
|
|
mov word ptr [VflatD_Proc][2],ax
|
|
errn$ mode_search_exit
|
|
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
|
|
mode_search_exit:
|
|
|
|
cEnd
|
|
|
|
;---------------------------Public-Routine------------------------------;
|
|
; VFlatBegin - start direct frame buffer access
|
|
;
|
|
; Returns:
|
|
; Wed 04-Jan-1993 13:45:58 -by- Todd Laney [ToddLa]
|
|
; Created.
|
|
;-----------------------------------------------------------------------;
|
|
assumes ds,Data
|
|
assumes es,nothing
|
|
|
|
cProc VFlatBegin, <NEAR, PUBLIC>, <>
|
|
cBegin
|
|
mov bx, ScreenMode
|
|
or bx, bx
|
|
jz short BeginExit
|
|
|
|
%out is CLI/STI needed?
|
|
;;;;;;;;cli
|
|
call cs:[bx].ModeGetBank
|
|
xchg bank_save,ax
|
|
mov dx,ax
|
|
call cs:[bx].ModeSetBank
|
|
;;;;;;;;sti
|
|
BeginExit:
|
|
cEnd
|
|
|
|
;---------------------------Public-Routine------------------------------;
|
|
; VFlatEnd - end direct frame buffer access
|
|
;
|
|
; Returns:
|
|
; Wed 04-Jan-1993 13:45:58 -by- Todd Laney [ToddLa]
|
|
; Created.
|
|
;-----------------------------------------------------------------------;
|
|
assumes ds,Data
|
|
assumes es,nothing
|
|
|
|
cProc VFlatEnd, <NEAR, PUBLIC>, <>
|
|
cBegin
|
|
mov bx, ScreenMode
|
|
or bx, bx
|
|
jz short EndExit
|
|
|
|
%out is CLI/STI needed?
|
|
;;;;;;;;cli
|
|
call cs:[bx].ModeGetBank
|
|
xchg bank_save,ax
|
|
mov dx,ax
|
|
call cs:[bx].ModeSetBank
|
|
;;;;;;;;sti
|
|
EndExit:
|
|
cEnd
|
|
|
|
;---------------------------Public-Routine------------------------------;
|
|
; ScanROM - scan the video bios ROM looking for a string
|
|
;
|
|
; Entry:
|
|
; cs:ax - string to look for.
|
|
;
|
|
; Returns:
|
|
; Wed 04-Jan-1993 13:45:58 -by- Todd Laney [ToddLa]
|
|
; Created.
|
|
;-----------------------------------------------------------------------;
|
|
assumes ds,Data
|
|
assumes es,nothing
|
|
|
|
ScanROM proc near
|
|
push si
|
|
mov si,ax
|
|
|
|
mov ax,__C000h
|
|
mov es,ax
|
|
|
|
xor bx,bx ; start at zero
|
|
mov cx,512 ; search first 512 bytes.
|
|
|
|
mov dx,si
|
|
scan_start:
|
|
mov si,dx
|
|
mov al,cs:[si]
|
|
scan_cmp:
|
|
cmp byte ptr es:[bx], al
|
|
je short scan_found
|
|
inc bx
|
|
loop scan_start
|
|
xor ax,ax
|
|
pop si
|
|
ret
|
|
|
|
scan_next:
|
|
inc bx
|
|
loop scan_cmp
|
|
xor ax,ax
|
|
pop si
|
|
ret
|
|
|
|
scan_found:
|
|
inc si
|
|
mov al,cs:[si]
|
|
or al,al
|
|
jnz scan_next
|
|
inc ax
|
|
pop si
|
|
ret
|
|
|
|
ScanROM endp
|
|
|
|
;----------------------------------------------------------------------------
|
|
; BANK SWITCH TEMPLATES
|
|
; Each template is given to vflatd.386 which copies it inline in to the
|
|
; page fault handling code.
|
|
; NOTE: This code runs at ring 0 in a USE32 code segment, so be carefull!!!
|
|
; ALL REGISTERS MUST BE PRESERVED (except for dx)
|
|
;----------------------------------------------------------------------------
|
|
|
|
;****************************************************************************
|
|
; V7
|
|
;****************************************************************************
|
|
|
|
DetectV7 proc near
|
|
|
|
mov ax,6f00h ;Test for Video 7
|
|
xor bx,bx
|
|
cld
|
|
int 10h
|
|
xor ax,ax
|
|
cmp bx,'V7'
|
|
jne short @f
|
|
inc ax
|
|
@@: ret
|
|
|
|
DetectV7 endp
|
|
|
|
SetBank32V7 label byte
|
|
push ax
|
|
push bx
|
|
|
|
mov bl,al
|
|
and bl,1 ; BL = extended page select
|
|
|
|
mov ah,al
|
|
and ah,2
|
|
shl ah,4 ; AH = page select bit
|
|
|
|
and al,00ch
|
|
mov bh,al
|
|
shr al,2
|
|
or bh,al ; BH = 256K bank select
|
|
|
|
db 66h,0bah,0cch,03h ;mov dx, 3CCh
|
|
in al,dx ; Get Miscellaneous Output Register
|
|
and al,not 20h ; Clear page select bit
|
|
or al,ah ; Set page select bit (maybe)
|
|
mov dl,0c2h ; Write Miscellaneous Output Register
|
|
out dx,al
|
|
|
|
mov dl,0c4h ; Sequencer
|
|
mov al,0f9h ; Extended page select register
|
|
mov ah,bl ; Extended page select value
|
|
out dx,eax ; out dx,ax
|
|
|
|
mov al,0f6h ; 256K bank select
|
|
out dx,al
|
|
inc dx ; Point to data
|
|
in al,dx
|
|
and al,0f0h ; Clear out bank select banks
|
|
or al,bh ; Set bank select banks (maybe)
|
|
out dx,al
|
|
pop bx
|
|
pop ax
|
|
SetBank32V7Size = $ - SetBank32V7
|
|
|
|
SetBankV7 proc near
|
|
mov bl,dl
|
|
and bl,1 ; BL = extended page select
|
|
|
|
mov ah,dl
|
|
and ah,2
|
|
shl ah,4 ; AH = page select bit
|
|
|
|
and dl,00ch
|
|
mov bh,dl
|
|
shr dl,2
|
|
or bh,dl ; BH = 256K bank select
|
|
|
|
mov dx,03cch
|
|
in al,dx ; Get Miscellaneous Output Register
|
|
and al,not 20h ; Clear page select bit
|
|
or al,ah ; Set page select bit (maybe)
|
|
mov dl,0c2h ; Write Miscellaneous Output Register
|
|
out dx,al
|
|
|
|
mov dl,0c4h ; Sequencer
|
|
mov al,0f9h ; Extended page select register
|
|
mov ah,bl ; Extended page select value
|
|
out dx,ax
|
|
|
|
mov al,0f6h ; 256K bank select
|
|
out dx,al
|
|
inc dx ; Point to data
|
|
in al,dx
|
|
and al,0f0h ; Clear out bank select banks
|
|
or al,bh ; Set bank select banks (maybe)
|
|
out dx,al
|
|
ret
|
|
SetBankV7 endp
|
|
|
|
GetBankV7 proc near
|
|
mov dx,3cch
|
|
in al,dx
|
|
and al,20h ; page select bit
|
|
shr al,4
|
|
mov ah,al
|
|
|
|
mov dx,3C4h
|
|
mov al,0f9h
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
and al,1
|
|
or ah,al
|
|
|
|
dec dx
|
|
mov al,0F6h
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
and al,0ch
|
|
or al,ah
|
|
xor ah,ah
|
|
ret
|
|
GetBankV7 endp
|
|
|
|
;****************************************************************************
|
|
; V7 II
|
|
;****************************************************************************
|
|
|
|
DetectVRAM proc near
|
|
if 0 ; ack!
|
|
call DetectV7
|
|
or ax,ax
|
|
jz short novram
|
|
|
|
mov dx,03C4H
|
|
mov al,08FH
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
mov ah,al
|
|
|
|
dec dx
|
|
mov al,08EH
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
|
|
cmp ax,07151H ;VRAMII rev B id
|
|
je short isvram
|
|
cmp ax,07152H ;VRAMII rev C and D id
|
|
je short isvram
|
|
; cmp ax,07760H ;HT216 rev B and C
|
|
; je short isvram
|
|
; cmp ax,07763H ;HT216 rev B, C, and D
|
|
; je short isvram
|
|
; cmp ax,07764H ;HT216 rev E
|
|
; je short isvram
|
|
endif
|
|
novram:
|
|
xor ax,ax
|
|
ret
|
|
isvram:
|
|
mov ax,1
|
|
ret
|
|
|
|
DetectVRAM endp
|
|
|
|
SetBank32VRAM label byte
|
|
push ax ;push eax
|
|
shl dl,4
|
|
mov ah,dl
|
|
db 66h,0bah,0c4h,03h ; mov dx, 3C4h
|
|
mov al,0e8h
|
|
out dx,eax ; out dx,ax
|
|
pop ax ; pop eax
|
|
SetBank32VRAMSize = $ - SetBank32VRAM
|
|
|
|
SetBankVRAM proc near
|
|
shl dl,4
|
|
mov ah,dl
|
|
mov dx,03c4h
|
|
mov al,0e8h
|
|
out dx,ax
|
|
ret
|
|
SetBankVRAM endp
|
|
|
|
GetBankVRAM proc near
|
|
mov dx,3c4h
|
|
mov al,0e8h
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
shr al,4
|
|
ret
|
|
GetBankVRAM endp
|
|
|
|
;****************************************************************************
|
|
; ATI
|
|
;****************************************************************************
|
|
|
|
public DetectATI
|
|
DetectATI proc near
|
|
mov ax,__C000h ;ATI VGA detect (largely from ATI example code)
|
|
mov es,ax
|
|
xor ax,ax
|
|
cmp word ptr es:[40h],'13' ;ATI Signiture on the Video BIOS
|
|
jne short @f
|
|
inc ax
|
|
@@: ret
|
|
DetectATI endp
|
|
|
|
SetBank32ATI label byte
|
|
push ax
|
|
mov ah,al
|
|
shl ah,1
|
|
mov al,0B2h
|
|
db 66h,0bah,0ceh,01h ;mov dx, 1CEh
|
|
out dx,eax
|
|
pop ax
|
|
SetBank32ATISize = $ - SetBank32ATI
|
|
|
|
SetBankATI proc near
|
|
mov ah,dl
|
|
shl ah,1
|
|
mov al,0b2h ;Page select register index
|
|
mov dx,1ceh ;
|
|
out dx,ax ;
|
|
ret
|
|
SetBankATI endp
|
|
|
|
GetBankATI proc near
|
|
mov dx,1ceh
|
|
mov al,0b2h
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
shr al,1
|
|
ret
|
|
GetBankATI endp
|
|
|
|
;****************************************************************************
|
|
; OAK
|
|
;****************************************************************************
|
|
|
|
DetectOAK proc near
|
|
|
|
lea ax,szOAK
|
|
jmp ScanROM
|
|
|
|
DetectOAK endp
|
|
|
|
SetBank32Oak label byte
|
|
push ax
|
|
mov ah,al
|
|
shl al,4
|
|
or ah,al
|
|
db 66h,0bah,0deh,03h ;mov dx, 3DEh
|
|
mov al,11h
|
|
out dx,eax
|
|
pop ax
|
|
SetBank32OakSize = $ - SetBank32Oak
|
|
|
|
SetBankOAK proc near
|
|
mov al,dl
|
|
mov ah,al
|
|
shl al,4
|
|
or ah,al
|
|
mov dx,3deh
|
|
mov al,11h
|
|
out dx,ax
|
|
ret
|
|
SetBankOAK endp
|
|
|
|
GetBankOAK proc near
|
|
mov dx,3deh
|
|
mov al,11h
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
and al,0Fh
|
|
ret
|
|
GetBankOAK endp
|
|
|
|
;****************************************************************************
|
|
; Everex
|
|
;****************************************************************************
|
|
|
|
DetectEverex proc near
|
|
|
|
lea ax,szEverex
|
|
jmp ScanROM
|
|
|
|
DetectEverex endp
|
|
|
|
;****************************************************************************
|
|
; Tseng
|
|
;****************************************************************************
|
|
|
|
DetectTseng proc near
|
|
|
|
lea ax,szTseng
|
|
jmp ScanROM
|
|
|
|
DetectTseng endp
|
|
|
|
SetBank32Tseng label byte
|
|
mov dx, ax ;mov edx,eax
|
|
shl al, 4
|
|
or al, dl
|
|
db 66h,0bah,0cdh,03h ;mov dx, 3CDh
|
|
out dx, al
|
|
shr al, 4 ;shr al,4
|
|
SetBank32TsengSize = $ - SetBank32Tseng
|
|
|
|
SetBankTseng proc near
|
|
and al,0fh
|
|
mov al,dl
|
|
mov ah,al
|
|
shl al,4
|
|
or al,ah
|
|
mov dx,3cdh
|
|
out dx,al
|
|
ret
|
|
SetBankTseng endp
|
|
|
|
GetBankTseng proc near
|
|
mov dx,3cdh
|
|
in al,dx
|
|
shr al, 4 ;shr al,4
|
|
ret
|
|
GetBankTseng endp
|
|
|
|
;****************************************************************************
|
|
; WD
|
|
;****************************************************************************
|
|
|
|
DetectWD proc near
|
|
|
|
lea ax,szWD
|
|
call ScanROM
|
|
or ax,ax
|
|
jz short @f
|
|
ret
|
|
|
|
@@: lea ax,szParadise
|
|
jmp ScanROM
|
|
|
|
DetectWD endp
|
|
|
|
SetBank32WD label byte
|
|
push ax
|
|
mov ah,al ;ah = bank number
|
|
mov al,9 ;select the primary "bank adder" reg
|
|
shl ah,4
|
|
db 66h,0bah,0ceh,03h ;mov dx, 3CEh
|
|
out dx,eax ;out dx,ax (write 3cf:09, desired bank)
|
|
pop ax
|
|
SetBank32WDSize = $ - SetBank32WD
|
|
|
|
SetBankWD proc near
|
|
mov al,9 ;select the primary "bank adder" reg
|
|
mov ah,dl
|
|
shl ah,4
|
|
mov dx,3ceh
|
|
out dx,ax ;write 3cf:09, desired bank
|
|
ret
|
|
SetBankWD endp
|
|
|
|
GetBankWD proc near
|
|
mov dx,3ceh
|
|
mov al,9
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
shr al,4
|
|
ret
|
|
GetBankWD endp
|
|
|
|
;****************************************************************************
|
|
; Weitek
|
|
;****************************************************************************
|
|
|
|
DetectWeitek proc near
|
|
|
|
lea ax,szWeitek
|
|
jmp ScanROM
|
|
|
|
DetectWeitek endp
|
|
|
|
;****************************************************************************
|
|
; Trident
|
|
;****************************************************************************
|
|
|
|
DetectTrident proc near
|
|
|
|
lea ax,szTrident
|
|
jmp ScanROM
|
|
|
|
DetectTrident endp
|
|
|
|
SetBank32Trident label byte
|
|
push ax
|
|
mov ah,al
|
|
xor ah,2
|
|
mov al,0EH
|
|
db 66h,0bah,0c4h,03h ;mov dx, 3C4h
|
|
out dx,eax
|
|
;; db 66h,0bah,0ceh,03h ;mov dx, 3CEh
|
|
;; out dx,eax ;for 8900c or better only.
|
|
pop ax
|
|
SetBank32TridentSize = $ - SetBank32Trident
|
|
|
|
SetBankTrident proc near
|
|
mov ah,dl
|
|
xor ah,2
|
|
mov al,0EH
|
|
mov dx,3c4h
|
|
out dx,ax
|
|
;; mov dx,3ceh
|
|
;; out dx,ax ;for 8900c or better only.
|
|
ret
|
|
SetBankTrident endp
|
|
|
|
GetBankTrident proc near
|
|
mov dx,3c4h
|
|
mov al,0eh
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
xor al,2
|
|
ret
|
|
GetBankTrident endp
|
|
|
|
;****************************************************************************
|
|
; Compaq
|
|
;****************************************************************************
|
|
|
|
DetectCompaq proc near
|
|
mov ax,__C000h
|
|
mov es,ax
|
|
xor ax,ax
|
|
cmp word ptr es:[2],0E930h
|
|
jne short @f
|
|
inc ax
|
|
@@: ret
|
|
DetectCompaq endp
|
|
|
|
SetBank32Compaq label byte
|
|
push ax
|
|
mov ah,al
|
|
shl ah,4
|
|
mov al,45h
|
|
db 66h,0bah,0ceh,03h ;mov dx, 3CEh
|
|
out dx,eax
|
|
inc al
|
|
add ah,08h
|
|
out dx,eax
|
|
pop ax
|
|
SetBank32CompaqSize = $ - SetBank32Compaq
|
|
|
|
SetBankCompaq proc near
|
|
mov ah,dl
|
|
shl ah,4
|
|
mov dx,03CEh
|
|
mov al,45h
|
|
out dx,ax
|
|
inc al
|
|
add ah,08h
|
|
out dx,ax
|
|
ret
|
|
SetBankCompaq endp
|
|
|
|
GetBankCompaq proc near
|
|
mov dx,03CEh
|
|
mov al,45h
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
shr al,4
|
|
ret
|
|
GetBankCompaq endp
|
|
|
|
;****************************************************************************
|
|
; Cirrus 6420
|
|
;****************************************************************************
|
|
|
|
DetectC6420 proc near
|
|
%out *** need a Detect function for Cirrus 6420
|
|
mov ax,1 ;!!!
|
|
ret
|
|
DetectC6420 endp
|
|
|
|
SetBank32C6420 label byte
|
|
push ax
|
|
mov ah,al
|
|
shl ah,4
|
|
mov al,0eh
|
|
db 66h,0bah,0ceh,03h ;mov dx, 3CEh
|
|
out dx,eax ;
|
|
pop ax
|
|
|
|
SetBank32C6420Size = $ - SetBank32C6420
|
|
|
|
SetBankC6420 proc near
|
|
mov ah,dl
|
|
shl ah,4
|
|
mov al,0eh
|
|
mov dx, 3CEh
|
|
out dx,ax
|
|
ret
|
|
|
|
SetBankC6420 endp
|
|
|
|
GetBankC6420 proc near
|
|
mov dx,03CEh
|
|
mov al,0Eh
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
shr al,4
|
|
ret
|
|
|
|
GetBankC6420 endp
|
|
|
|
;****************************************************************************
|
|
; Cirrus 542x
|
|
;****************************************************************************
|
|
|
|
DetectC542x proc near
|
|
%out *** need a Detect function for Cirrus 542x
|
|
mov ax,1 ;!!!
|
|
ret
|
|
DetectC542x endp
|
|
|
|
SetBank32C542x label byte
|
|
push ax
|
|
mov ah,al
|
|
shl ah,4
|
|
mov al,09h
|
|
db 66h,0bah,0ceh,03h ;mov dx, 3CEh
|
|
out dx,eax
|
|
pop ax
|
|
|
|
SetBank32C542xSize = $ - SetBank32C542x
|
|
|
|
SetBankC542x proc near
|
|
mov ah,dl
|
|
shl ah,4
|
|
mov al,09h
|
|
mov dx,3CEh
|
|
out dx,ax
|
|
ret
|
|
|
|
SetBankC542x endp
|
|
|
|
GetBankC542x proc near
|
|
mov dx,03CEh
|
|
mov al,09h
|
|
out dx,al
|
|
inc dx
|
|
in al,dx
|
|
shr al,4
|
|
ret
|
|
|
|
GetBankC542x endp
|
|
|
|
;****************************************************************************
|
|
; Viper Vesa Local bus
|
|
;****************************************************************************
|
|
|
|
public DetectViper
|
|
DetectViper proc near
|
|
lea ax,szViper
|
|
jmp ScanROM
|
|
DetectViper endp
|
|
|
|
sEnd
|
|
|
|
end
|