This is from the Oh Ficial VESA pdf.

Wintendo asm example function required as asm by Borkland P-C to achieve
"direct" bank-switching.

...................................................................



public 	_sexbxdx	
.MODEL	SMALL				; not to mention deformed
.CODE
set_struc struc 
	dw	?			; old BP
	dd	?			; ret far addy
p_bx	dw	?			; bx value
p_dx	dw	?
set_struc ends

_sexbxdx	proc far		; far out, dude. MUST.
	push bp
	mov bp, sp
	mov bx, [bp]+p_bx		;  C can't do these two I guess
	mov dx, [bp]+p_dx		
	pop bp
	ret
_sexbxdx endp
END


....................................................................
	
		
Now some C hi-lites

......................................................................

#ifdef DIRECT_BANKING

extern far setbxdx(int,int);

# endif

struct 
{
	char	VESASignature[4];
	short	VESAVersion	;
	char far * OEMStringPtr ; 	/* far here is quad yeah?  */
	long	Capabilities	;
	unsigned far * VideoModePtr	;
	short	totalMemory	;
	char	spam[padding]	;
} VBEInfoBlock ;


struct {
	unsigned short	ModeAttributes	;
	unsigned char	WinAAttributes	;
	unsigned char   WinBAttributes  ;
	unsigned short	WinGranularity	;	in K
	unsigned short	WinSize	;		in K
	unsigned short	WinASegment	;
	unsigned short	WinBSegment	;
	void (far * WinFuncPtr)(void)	;
	unsigned short BytesPerScanLine	;
	unsigned short XResolution	;
	unsigned short YResolution	;
	unsigned char	XCharSize	;
	unsigned char 	YCharSize	;
	unsigned char 	NumberOfPlanes	;
	unsigned char 	BitsPerPixel	;
	unsigned char 	NumberOfBanks	;
	unsigned char 	MemoryModel	;
	unsigned char  	BankSize	;
	unsigned char 	NumberOfImagePages	;
	unsigned char 	reserved1	;
	unsigned char 	RedMaskSize	;
	unsigned char 	RedFieldPosition	;
	unsigned char 	GreenMaskSize	;
	unsigned char 	GreenFieldPosition	;
	unsigned char 	BlueMaskSize	;
	unsigned char 	BlueFieldPosition	;
	unsigned char 	reservedMaskSize	;
	unsigned char 	reservedFieldPosition	;
	unsigned char 	DirectColorModeInfo	;
	pad256[]	;
} ModeInfoBlock



typedef enum {
memPL = 3 ; memPK = 4, memRGB = 6, memYUV = 7 , } memModes	;


char	mystr[256];
char	*getstr();
int	xres, yres	;
int 	bytesperline;
int curBank	;
unsigned int bankShift;
int oldMode;
char far *screenPtr;		/* begin screen mem */
void (far *bankSwitch)(void);



/*
VESA int 0x10 basic function AX values...

	0x4f00				get that top data structure
	0x4f01				get the ModeInfo struct
	0x4f02				setVBEMode  (from what? The struct?)
	0x4f03				get    "

BUT, There's MORE!

*/

void setBank(int bank){
	union REGS	in, out	;	/* Borland INT wrapper crap? */
	if bank == curBank ) return ;
	curBank = bank	;
	bank <<= BankShift	;
#idef DIRECT_BANKING
	setbxdx(0,bank);
	bankSwitch();		
	setbxdx(1,bank);
	bankSwitch();		
#else
	in.x.ax	= 0xf405; in.x.bx = 0 ; in.x.dx = bank ;
	int86(0x10, &in, &out ;
	in.x.ax	= 0xf405; in.x.bx = 1 ; in.x.dx = bank ;
	int86(0x10, &in, &out ;
#endif
}

