/*-
* Copyright (c) 2002-2018 The UbixOS Project.
* All rights reserved.
*
* This was developed by Christopher W. Olsen for the UbixOS Project.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met:
*
* 1) Redistributions of source code must retain the above copyright notice, this list of
* conditions, the following disclaimer and the list of authors.
* 2) Redistributions in binary form must reproduce the above copyright notice, this list of
* conditions, the following disclaimer and the list of authors in the documentation and/or
* other materials provided with the distribution.
* 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to
* endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <objgfx40/objgfx40.h>
#include <objgfx40/defpal.inc>
#include <sde/ogDisplay_UbixOS.h>
extern "C" {
#include <lib/bioscall.h>
#include <vmm/vmm.h>
#include <vmm/paging.h>
#include <lib/kprintf.h>
#include <sys/io.h>
#include <string.h>
#include <ubixos/sched.h>
#include <ubixos/kpanic.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 + 4095);
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
printOff = 0;
for (i = 0x0; i < ((size) / 4096); i++) {
if ((vmm_remapPage(modeInfo->physBasePtr + (i * 0x1000), modeInfo->physBasePtr + (i * 0x1000), KERNEL_PAGE_DEFAULT, -2, 0)) == 0x0)
kpanic("Error: vmm_remapPage failed\n");
} // for i
owner = this;
dataState = ogAliasing;
initVESAMode(mode);
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 (1 == bytesPerPix) {
pixFmtID = 0x08080808;
}
else {
pixFmtID = (redFieldPosition) | (greenFieldPosition << 8) | (blueFieldPosition << 16) | (alphaFieldPosition << 24);
} // else
ogSetAntiAliasing(BPP > 8);
if (pal == NULL)
pal = new ogRGBA8[256];
ogSetPalette(DEFAULT_PALETTE);
return;
} // ogDisplay_UbixOS::SetMode
void ogDisplay_UbixOS::ogSetPalette(const ogRGBA8 newPal[256]) {
ogSurface::ogSetPalette(newPal);
SetPal();
return;
} // ogDisplay_UbixOS::ogSetPalette
void ogDisplay_UbixOS::SetPal(void) {
if (bytesPerPix != 1)
return;
outportByte(0x3c8, 0);
for (uInt32 c = 0; c < 256; c++) {
outportByte(0x3c9, pal[c].red >> 2);
outportByte(0x3c9, pal[c].green >> 2);
outportByte(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::ogAlias
bool ogDisplay_UbixOS::ogCreate(uInt32 _xRes, uInt32 _yRes, ogPixelFmt _pixFormat) {
uInt16 mode;
mode = 0x114; // was 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::ogClone
void ogDisplay_UbixOS::ogCopyPalette(ogSurface& SrcObject) {
ogSurface::ogCopyPalette(SrcObject);
SetPal();
return;
} // ogDisplay_UbixOS::ogCopyPalette
bool ogDisplay_UbixOS::ogLoadPalette(const char *palfile) {
bool result;
if ((result = ogSurface::ogLoadPalette(palfile)) == true)
SetPal();
return result;
} // ogDisplay_UbixOS::ogLoadPalette
void ogDisplay_UbixOS::ogSetPalette(uInt8 colour, uInt8 red, uInt8 green, uInt8 blue) {
if (pal == NULL)
return;
ogSurface::ogSetPalette(colour, red, green, blue);
outportByte(0x3c8, colour);
outportByte(0x3c9, red >> 2);
outportByte(0x3c9, green >> 2);
outportByte(0x3c9, blue >> 2);
return;
} // ogDisplay_UbixOS::ogSetPalette
void ogDisplay_UbixOS::ogSetPalette(uInt8 colour, uInt8 red, uInt8 green, uInt8 blue, uInt8 alpha) {
if (pal == NULL)
return;
ogSurface::ogSetPalette(colour, red, green, blue, alpha);
outportByte(0x3c8, colour);
outportByte(0x3c9, red >> 2);
outportByte(0x3c9, green >> 2);
outportByte(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
/***
END
***/