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; |
} |