Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 479 → Rev 1022

/shark/trunk/drivers/fb/gdvesa.c
48,164 → 48,164
 
#define NMODES 13
static struct gmode allmodes[NMODES] = {
{640, 400, 640, 8, 0x4100},
{640, 480, 640, 8, 0x4101},
{800, 600, 800, 8, 0x4103},
{1024, 768, 1024, 8, 0x4105},
{640, 480, 1280, 15, 0x4110},
{800, 600, 1600, 15, 0x4113},
{1024, 768, 2048, 15, 0x4116},
{640, 480, 1280, 16, 0x4111},
{800, 600, 1600, 16, 0x4114},
{1024, 768, 2048, 16, 0x4117},
{640, 480, 1920, 24, 0x4112},
{800, 600, 2400, 24, 0x4115},
{1024, 768, 3072, 24, 0x4118}
{640, 400, 640, 8, 0x4100},
{640, 480, 640, 8, 0x4101},
{800, 600, 800, 8, 0x4103},
{1024, 768, 1024, 8, 0x4105},
{640, 480, 1280, 15, 0x4110},
{800, 600, 1600, 15, 0x4113},
{1024, 768, 2048, 15, 0x4116},
{640, 480, 1280, 16, 0x4111},
{800, 600, 1600, 16, 0x4114},
{1024, 768, 2048, 16, 0x4117},
{640, 480, 1920, 24, 0x4112},
{800, 600, 2400, 24, 0x4115},
{1024, 768, 3072, 24, 0x4118}
};
 
int vbe_check_status (WORD vbe_function_result)
{
if (vbe_function_result != 0x004f) {
switch (vbe_function_result) {
case 0x014f : return -1; /* VBE Generic error */
case 0x024f : return -2; /* Hardware incompatibility error */
case 0x034f : return -3; /* Unvalid function requested */
default : return -4; /* Unknown error */
if (vbe_function_result != 0x004f) {
switch (vbe_function_result) {
case 0x014f : return -1; /* VBE Generic error */
case 0x024f : return -2; /* Hardware incompatibility error */
case 0x034f : return -3; /* Unvalid function requested */
default : return -4; /* Unknown error */
}
}
}
return 1;
return 1;
}
 
int vbe_modenum(WORD x, WORD y, BYTE depth)
{
int mode, i;
mode = -1;
for (i = 0; i < NMODES; i++) {
if ((depth == allmodes[i].bpp) && (x == allmodes[i].xdim) && (y == allmodes[i].ydim)) {
mode = allmodes[i].modenum;
}
}
return mode;
}
int mode, i;
 
void vbe_restore_vga(void) {
mode = -1;
 
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
for (i = 0; i < NMODES; i++) {
if ((depth == allmodes[i].bpp) && (x == allmodes[i].xdim) && (y == allmodes[i].ydim)) {
mode = allmodes[i].modenum;
}
}
 
return mode;
}
 
void vbe_restore_vga(void)
{
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
#ifndef VM86
BYTE p1,p2;
BYTE p1,p2;
#endif
inregs.x.ax = 0x03;
 
inregs.x.ax = 0x03;
#ifndef VM86
p1 = inp(0x21);
p2 = inp(0xA1);
outp(0x21,0xFF);
outp(0xA1,0xFF);
X_callBIOS(0x10, &inregs, &outregs, &sregs);
outp(0x21,p1);
outp(0xA1,p2);
p1 = inp(0x21);
p2 = inp(0xA1);
outp(0x21,0xFF);
outp(0xA1,0xFF);
X_callBIOS(0x10, &inregs, &outregs, &sregs);
outp(0x21,p1);
outp(0xA1,p2);
#else
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
#endif
 
}
 
int vbe_getinfo(void)
{
X_REGS16 inregs, outregs; /* registri normali */
X_SREGS16 sregs; /* registri estesi */
LIN_ADDR DOSaddr;
DWORD linearaddr;
X_REGS16 inregs, outregs; /* registri normali */
X_SREGS16 sregs; /* registri estesi */
LIN_ADDR DOSaddr;
DWORD linearaddr;
#ifndef VM86
BYTE p1, p2;
BYTE p1, p2;
#endif
 
/* Allochiamo mem per il nostro blocco */
if ((DOSaddr = DOS_alloc(sizeof(VbeInfoBlock))) == 0) {
/* set_text_mode ();*/
return -1;
} else {
/* linearaddr = appl2linear(DOSaddr);*/
linearaddr = (DWORD) DOSaddr;
/* Allochiamo mem per il nostro blocco */
if ((DOSaddr = DOS_alloc(sizeof(VbeInfoBlock))) == 0) {
/* set_text_mode ();*/
return -1;
} else {
/*linearaddr = appl2linear(DOSaddr);*/
linearaddr = (DWORD) DOSaddr;
 
/* 0x00 = Get Vbe2.0 Info */
inregs.x.ax = 0x4f00;
/* Indirizzo reale del nostro blocco */
inregs.x.di = linearaddr & 0x000F;
sregs.es = ((linearaddr & 0xFFFF0) >> 4);
sregs.ds = ((linearaddr & 0xFFFF0) >> 4);
/* 0x00 = Get Vbe2.0 Info */
inregs.x.ax = 0x4f00;
/* Indirizzo reale del nostro blocco */
inregs.x.di = linearaddr & 0x000F;
sregs.es = ((linearaddr & 0xFFFF0) >> 4);
sregs.ds = ((linearaddr & 0xFFFF0) >> 4);
 
/* Settiamo il VbeSignature correttamente */
VbeInfo.VbeSignature[0] = 'V';
VbeInfo.VbeSignature[1] = 'B';
VbeInfo.VbeSignature[2] = 'E';
VbeInfo.VbeSignature[3] = '2';
/* Settiamo il VbeSignature correttamente */
VbeInfo.VbeSignature[0] = 'V';
VbeInfo.VbeSignature[1] = 'B';
VbeInfo.VbeSignature[2] = 'E';
VbeInfo.VbeSignature[3] = '2';
 
memcpy((void *)linearaddr, &VbeInfo, sizeof(VbeInfo));
memcpy((void *)linearaddr, &VbeInfo, sizeof(VbeInfo));
 
#ifndef VM86
p1 = inp(0x21);
p2 = inp(0xA1);
outp(0x21,0xFF);
outp(0xA1,0xFF);
X_callBIOS(0x10, &inregs, &outregs, &sregs);
outp(0x21,p1);
outp(0xA1,p2);
p1 = inp(0x21);
p2 = inp(0xA1);
outp(0x21,0xFF);
outp(0xA1,0xFF);
X_callBIOS(0x10, &inregs, &outregs, &sregs);
outp(0x21,p1);
outp(0xA1,p2);
#else
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
#endif
if (vbe_check_status(outregs.x.ax) < 0)
return -1;
memcpy(&VbeInfo, (void *)linearaddr, sizeof(VbeInfo));
return 0;
}
if (vbe_check_status(outregs.x.ax) < 0)
return -1;
memcpy(&VbeInfo, (void *)linearaddr, sizeof(VbeInfo));
 
return 0;
}
}
 
void vbe_showmodes(void)
{
short int modec;
WORD list;
LIN_ADDR VideoModeaddr;
short int modec;
WORD list;
LIN_ADDR VideoModeaddr;
 
list=0;
VideoModeaddr = (LIN_ADDR)((VbeInfo.SupportedModesSegment<<4) + VbeInfo.SupportedModesOffset);
list=0;
VideoModeaddr = (LIN_ADDR)((VbeInfo.SupportedModesSegment<<4) + VbeInfo.SupportedModesOffset);
 
cprintf ("\nList of modes supported:\n");
do {
memcpy(&modec, VideoModeaddr, 2);
VideoModeaddr += 2;
if (modec != -1) cprintf (" %s ", VideoModeNames[modec - 0x100]);
list++;
if (list % 2 == 0) cprintf ("\n");
} while ((modec != -1) && (list < 40));
cprintf ("\nList of modes supported:\n");
do {
memcpy(&modec, VideoModeaddr, 2);
VideoModeaddr += 2;
if (modec != -1) cprintf (" %s ", VideoModeNames[modec - 0x100]);
list++;
if (list % 2 == 0) cprintf ("\n");
} while ((modec != -1) && (list < 40));
 
cprintf ("\nToal modes supported: %d", list);
cprintf ("\nToal modes supported: %d", list);
}
 
DWORD vbe_getmodeinfo(ModeInfoBlock *ModeInfo, WORD Vbe_Mode)
{
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
LIN_ADDR dosaddr;
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
LIN_ADDR dosaddr;
#ifndef VM86
BYTE p1, p2;
BYTE p1, p2;
#endif
 
if ((dosaddr = DOS_alloc(sizeof(ModeInfoBlock))) == 0) {
return(-1);
}
if ((dosaddr = DOS_alloc(sizeof(ModeInfoBlock))) == 0) {
return(-1);
}
 
/* 0x01 = Get Vbe Mode Info */
inregs.x.ax = 0x4f01;
inregs.x.cx = Vbe_Mode;
/* 0x01 = Get Vbe Mode Info */
inregs.x.ax = 0x4f01;
inregs.x.cx = Vbe_Mode;
 
inregs.x.di = (DWORD)dosaddr & 0x000F;
sregs.es = (((DWORD)dosaddr & 0xFFFF0) >> 4);
sregs.ds = (((DWORD)dosaddr & 0xFFFF0) >> 4);
inregs.x.di = (DWORD)dosaddr & 0x000F;
sregs.es = (((DWORD)dosaddr & 0xFFFF0) >> 4);
sregs.ds = (((DWORD)dosaddr & 0xFFFF0) >> 4);
 
#ifndef VM86
p1 = inp(0x21);
218,36 → 218,36
#else
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
#endif
if (vbe_check_status (outregs.x.ax) < 0) {
return -1;
}
if (vbe_check_status (outregs.x.ax) < 0) {
return -1;
}
 
memcpy(ModeInfo, dosaddr, sizeof(ModeInfoBlock));
memcpy(ModeInfo, dosaddr, sizeof(ModeInfoBlock));
 
vbe_screen = ModeInfo->PhysBasePtr;
if(vbe_screen == -1) {
return -1;
}
return vbe_screen;
vbe_screen = ModeInfo->PhysBasePtr;
if(vbe_screen == -1) {
return -1;
}
return vbe_screen;
}
 
DWORD vbe_getflb(void)
{
return vbe_screen;
return vbe_screen;
}
 
int vbe_setmode (WORD Vbe_Mode)
{
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
#ifndef VM86
BYTE p1, p2;
BYTE p1, p2;
#endif
 
memset (&inregs, 0, sizeof(inregs));
/* Set Vesa Vbe mode */
inregs.x.ax = 0x4f02;
inregs.x.bx = Vbe_Mode;
memset (&inregs, 0, sizeof(inregs));
/* Set Vesa Vbe mode */
inregs.x.ax = 0x4f02;
inregs.x.bx = Vbe_Mode;
#ifndef VM86
p1 = inp(0x21);
p2 = inp(0xA1);
259,31 → 259,29
#else
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
#endif
 
return 1; //vbe_check_status (outregs.x.ax);
 
return 1; //vbe_check_status (outregs.x.ax);
}
 
WORD vbe_getbpr(ModeInfoBlock *ModeInfo)
{
return ModeInfo->BytesPerScanLine;
return ModeInfo->BytesPerScanLine;
}
 
int vbe_setbank(ModeInfoBlock *ModeInfo, BYTE bank)
{
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
X_REGS16 inregs, outregs;
X_SREGS16 sregs;
#ifndef VM86
BYTE p1, p2;
BYTE p1, p2;
#endif
 
memset (&inregs, 0, sizeof(inregs));
memset (&sregs, 0, sizeof(sregs));
/* Set Window */
inregs.x.ax = 0x4f05;
inregs.h.bh = 0x00;
inregs.h.bl = 0x00;
inregs.x.dx = (64 / ModeInfo->WinGranularity) * bank;
memset (&inregs, 0, sizeof(inregs));
memset (&sregs, 0, sizeof(sregs));
/* Set Window */
inregs.x.ax = 0x4f05;
inregs.h.bh = 0x00;
inregs.h.bl = 0x00;
inregs.x.dx = (64 / ModeInfo->WinGranularity) * bank;
#ifndef VM86
p1 = inp(0x21);
p2 = inp(0xA1);
295,10 → 293,10
#else
vm86_callBIOS(0x10, &inregs, &outregs, &sregs);
#endif
return vbe_check_status (outregs.x.ax);
return vbe_check_status (outregs.x.ax);
}
 
DWORD vbe_getmem(void)
{
return (VbeInfo.TotalMemory<<6) * 1024;
return (VbeInfo.TotalMemory<<6) * 1024;
}