#include <objgfx40/objgfx40.h>
#include <objgfx40/defpal.inc>
#include <sde/ogDisplay_UbixOS.h>
extern "C" {
#include <lib/string.h>
#include <ubixos/schedule.h>
#include <lib/bioscall.h>
#include <vmm/paging.h>
#include <sys/video.h>
#include <sys/io.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) {
pages[0] = pages[1] = NULL;
activePage = visualPage = 0;
pal = new ogRGBA8[256];
attributes = new ogAttributes();
VESAInfo = (ogVESAInfo *)0x11000;
modeInfo = (ogModeInfo *)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) {
VESAInfo->VBESignature[0] = 'V'; // First off initialize the structure.
VESAInfo->VBESignature[1] = 'B';
VESAInfo->VBESignature[2] = 'E';
VESAInfo->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 ((VESAInfo==NULL) || (VESAInfo->videoModePtr==NULL)) return 0;
if (modeInfo == NULL) return 0;
for (mode = 0x100; mode < 0x1FF; mode++) {
getModeInfo(mode);
if ((modeInfo->xRes >= _xRes) && (modeInfo->yRes >= _yRes) &&
(modeInfo->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;
bytesPerPix = 1;
redFieldPosition = 0;
greenFieldPosition = 0;
blueFieldPosition = 0;
alphaFieldPosition = 0;
redShifter = 0;
greenShifter = 0;
blueShifter = 0;
alphaFieldPosition = 0;
// UBU, THIS IS NULL BECAUSE WE DON'T EVER USE 320x200x256c!
// THIS COMMENT WILL COME BACK TO BITE YOU ON THE ASS
buffer = NULL;
} else {
buffer = NULL;
mode |= 0x4000; // attempt lfb
getModeInfo(mode);
if (modeInfo->physBasePtr == 0) return;
buffer = (void *)modeInfo->physBasePtr;
size = modeInfo->yRes*modeInfo->bytesPerLine;
xRes = modeInfo->bytesPerLine;
yRes = modeInfo->yRes;
maxX = modeInfo->xRes-1;
maxY = yRes-1;
BPP = modeInfo->bitsPerPixel;
bytesPerPix = (BPP + 7) >> 3;
redFieldPosition = modeInfo->redFieldPosition;
greenFieldPosition = modeInfo->greenFieldPosition;
blueFieldPosition = modeInfo->blueFieldPosition;
alphaFieldPosition = modeInfo->alphaFieldPosition;
if (bytesPerPix == 4) {
modeInfo->alphaMaskSize = 8;
while ((alphaFieldPosition == redFieldPosition) ||
(alphaFieldPosition == greenFieldPosition) ||
(alphaFieldPosition == blueFieldPosition))
alphaFieldPosition += 8;
} // if
redShifter = 8-modeInfo->redMaskSize;
greenShifter = 8-modeInfo->greenMaskSize;
blueShifter = 8-modeInfo->blueMaskSize;
alphaShifter = 8-modeInfo->alphaMaskSize;
if (modeInfo->alphaMaskSize != 0)
alphaMasker = ~(OG_MASKS[modeInfo->alphaMaskSize] << alphaFieldPosition);
else
alphaMasker = ~0;
} // else not mode 0x13
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;
initVESAMode(mode);
ogSetAntiAliasing(BPP > 8);
if (pal == NULL) pal = new ogRGBA8[256];
ogSetPalette(DEFAULT_PALETTE);
if (bytesPerPix == 1) {
pixFmtID = 0x08080808;
} else {
pixFmtID = (redFieldPosition) |
(greenFieldPosition << 8) |
(blueFieldPosition << 16) |
(alphaFieldPosition << 24);
} // else
printOff = 0;
for (i = 0x0; i < ((size)/4096); i++) {
vmmRemapPage(modeInfo->physBasePtr + (i * 0x1000),
modeInfo->physBasePtr + (i * 0x1000));
} // for i
return;
} // ogDisplay_UbixOS::SetMode
void ogDisplay_UbixOS::SetPal(void) {
if (bytesPerPix != 1) return;
outportb(0x3c8,0);
for (uInt32 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) {
ogSetLastError(ogNoAliasing);
return false;
} // ogDisplay_UbixOS::Alias
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) {
ogSetLastError(ogNoCloning);
return false;
} // ogDisplay_UbixOS::Clone
void
ogDisplay_UbixOS::ogCopyPal(ogSurface& SrcObject) {
ogSurface::ogCopyPal(SrcObject);
SetPal();
return;
} // ogDisplay_UbixOS::ogCopyPal
bool
ogDisplay_UbixOS::ogLoadPalette(const char *palfile) {
bool result;
if ((result = ogSurface::LoadPalette(palfile))==true) SetPal();
return result;
} // ogDisplay_UbixOS::ogLoadPalette
void
ogDisplay_UbixOS::ogSetPalette(uInt8 colour, uInt8 red, uInt8 green, uInt8 b
lue) {
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::SetPalette
void
ogDisplay_UbixOS::SetPalette(uInt8 colour, uInt8 red, uInt8 green,
uInt8 blue, uInt8 alpha) {
if (pal == NULL) return;
ogSurface::ogSetPalette(colour, red, green, blue, alpha);
outportb(0x3c8, colour);
outportb(0x3c9, red >> 2);
outportb(0x3c9, green >> 2);
outportb(0x3c9, blue >> 2);
return;
} // ogDisplay_UbixOS::ogSetPalette
ogDisplay_UbixOS::~ogDisplay_UbixOS(void) {
delete attributes;
delete [] pal;
//mji delete VESAInfo;
//mji delete modeInfo;
return;
} // ogDisplay_UbixOS::~ogDisplay_UbixOS