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, , 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, mov ScreenWidth,ax cCall GetDeviceCaps, mov ScreenHeight,ax cCall GetDeviceCaps, push ax cCall GetDeviceCaps, 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,0100h 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, 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, 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, , <> 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, , <> 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 ; removed for build 190! 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