#include <objgfx/objgfx30.h>
#include <objgfx/defpal.inc>
#include <sde/ogDisplay_UbixOS.h>
#include <lib/string.h>
#include <ubixos/schedule.h>
extern "C" {
#include <lib/bioscall.h>
#include <vmm/paging.h>
#include <sys/video.h>
}
/*
*
* ogDisplay methods
*
*/
void initVESAMode(uInt16 mode) {
kprintf("Pre-initVESAMode\n");
biosCall(0x10,0x4F02,mode,0x0,0x0,0x0,0x0,0x0,0x0);
kprintf("Post-initVESAMode\n");
return;
}
ogDisplay_UbixOS::ogDisplay_UbixOS(void) {
VESARec = (ogVESA_Rec *)0x11000;
modeRec = (ogMode_Rec *)0x11200;
getVESAInfo();
return;
} // ogDisplay_UbixOS::ogDisplay_UbixOS
void ogDisplay_UbixOS::getModeInfo(uInt16 mode) {
kprintf("Pre-getModeInfo\n");
biosCall(0x10,0x4F01,0x0,mode,0x0,0x0,0x0,0x1120,0x0);
kprintf("Post-getModeInfo\n");
return;
} // ogDisplay_UbixOS::getModeInfo
void ogDisplay_UbixOS::getVESAInfo(void) {
VESARec->VBESignature[0] = 'V'; // First off initialize the structure.
VESARec->VBESignature[1] = 'B';
VESARec->VBESignature[2] = 'E';
VESARec->VBESignature[3] = '2';
kprintf("Pre-getVESAInfo\n");
biosCall(0x10,0x4F00,0x0,0x0,0x0,0x0,0x0,0x1100,0x0);
kprintf("Post-getVESAInfo\n");
return;
} // ogDisplay_UbixOS::getVESAInfo
uInt16 ogDisplay_UbixOS::findMode(uInt32 _xRes, uInt32 _yRes, uInt32 _BPP) {
uInt16 mode;
if ((_xRes==320) && (_yRes==200) && (_BPP==8)) return 0x13;
if ((VESARec==NULL) || (VESARec->VideoModePtr==NULL)) return 0;
if (modeRec==NULL) return 0;
for (mode = 0x100; mode < 0x1FF; mode++) {
getModeInfo(mode);
if ((modeRec->xRes>=_xRes) && (modeRec->yRes>=_yRes) &&
(modeRec->BitsPerPixel==_BPP))
return mode;
}
return 0;
} // ogDisplay_UbixOS::findMode
void ogDisplay_UbixOS::setMode(uInt16 mode) {
uInt32 size = 0x0, count = 0x0, i = 0x0;
if (mode==0x13) {
xRes = 320;
yRes = 200;
maxX = 319;
maxY = 199;
BPP = 8;
redFieldPosition = 0;
greenFieldPosition = 0;
blueFieldPosition = 0;
alphaFieldPosition = 0;
redShifter = 0;
greenShifter = 0;
blueShifter = 0;
alphaFieldPosition = 0;
} else {
mode |= 0x4000; // attempt lfb
getModeInfo(mode);
if (modeRec->physBasePtr == 0) return;
buffer = (void *)modeRec->physBasePtr;
size = modeRec->yRes*modeRec->BytesPerLine;
xRes = modeRec->BytesPerLine;
yRes = modeRec->yRes;
maxX = modeRec->xRes-1;
maxY = yRes-1;
redFieldPosition = modeRec->RedFieldPosition;
greenFieldPosition = modeRec->GreenFieldPosition;
blueFieldPosition = modeRec->BlueFieldPosition;
redShifter = 8-modeRec->RedMaskSize;
greenShifter = 8-modeRec->GreenMaskSize;
blueShifter = 8-modeRec->BlueMaskSize;
BPP = modeRec->BitsPerPixel;
}
owner = this;
dataState = ogALIASING;
if ((lineOfs!=NULL) && (lSize!=0)) delete [] lineOfs;
lSize = yRes*sizeof(uInt32);
lineOfs = new uInt32[yRes];;
if (lineOfs == NULL) return;
lineOfs[0] = 0;
for (count=1; count<yRes; count++)
lineOfs[count] = lineOfs[count-1]+xRes;
if (pal==NULL) pal = new ogRGBA[256];
kmemcpy(pal, DEFAULT_PALETTE, sizeof(ogRGBA)*256);
printfOff = 0;
antiAlias=(BPP>8);
if (BPP==8) setPal();
initVESAMode(mode);
for (i=0x0;i<((size)/4096);i++) {
remapPage(modeRec->physBasePtr + (i * 0x1000),modeRec->physBasePtr + (i * 0x1000));
}
return;
} // ogDisplay_UbixOS::setMode
void ogDisplay_UbixOS::setPal(void) {
uInt32 c;
if (BPP!=8) return;
// outportb(0x3c8,0);
for (c=0; c<256; c++) {
// outportb(0x3c9,pal[c].red >> 2);
// outportb(0x3c9,pal[c].green >> 2);
// outportb(0x3c9,pal[c].blue >> 2);
} // for
return;
} // ogDisplay_UbixOS::setPal
bool
ogDisplay_UbixOS::ogAlias(ogSurface& SrcObject, uInt32 x1, uInt32 y1, uInt32 x2, uInt32 y2) {
return false;
} // ogDisplay_UbixOS::ogAlias
bool
ogDisplay_UbixOS::ogCreate(uInt32 _xRes, uInt32 _yRes,ogPixelFmt _pixFormat) {
uInt16 mode;
mode = 0x111;
setMode(mode);
/*
mode = findMode(_xRes, _yRes, _pixFormat.BPP);
if ((mode == 0) && ((_pixFormat.BPP==24) || (_pixFormat.BPP==32))) {
if (_pixFormat.BPP==24) _pixFormat.BPP=32; else _pixFormat.BPP=24;
mode=findMode(_xRes,_yRes,_pixFormat.BPP);
} // if
if (mode!=0) setMode(mode);
*/
return (mode!=0);
} // ogDisplay_UbixOS::ogCreate
bool
ogDisplay_UbixOS::ogClone(ogSurface& SrcObject) {
return false;
} // ogDisplay_UbixOS::ogClone
void
ogDisplay_UbixOS::ogCopyPal(ogSurface& SrcObject) {
ogSurface::ogCopyPal(SrcObject);
setPal();
return;
} // ogDisplay_UbixOS::ogCopyPal
bool
ogDisplay_UbixOS::ogLoadPal(const char *palfile) {
bool result;
if ((result = ogSurface::ogLoadPal(palfile))==true) setPal();
return result;
} // ogDisplay_UbixOS::ogLoadPal
void
ogDisplay_UbixOS::ogSetRGBPalette(uInt8 colour, uInt8 red, uInt8 green, uInt8 blue) {
if (pal==NULL) return;
ogSurface::ogSetRGBPalette(colour,red,green,blue);
// outportb(0x3c8,colour);
// outportb(0x3c9,red >> 2);
// outportb(0x3c9,green >> 2);
// outportb(0x3c9,blue >> 2);
return;
} // ogDisplay_UbixOS::ogSetRGBPalette
ogDisplay_UbixOS::~ogDisplay_UbixOS(void) {
//mji delete VESARec;
//mji delete modeRec;
return;
} // ogDisplay_UbixOS::~ogDisplay_UbixOS