Multi (windoboxed) resolution support

This commit is contained in:
Romain Dolbeau 2022-09-18 09:10:04 +02:00
parent 9e2caed442
commit 1aed1ad89b
6 changed files with 212 additions and 255 deletions

View File

@ -82,14 +82,19 @@ struct MyGammaTbl {
char gFormulaData[3][256]; /*data for formulas followed by gamma values*/
};
#define nativeVidMode ((unsigned char)0x80)
/* alternate resolution in 0x81...0x8f */
#define diskResource ((unsigned char)0x90)
struct NuBusFPGADriverGlobals {
AuxDCEPtr dce; // unused
SlotIntQElement *siqel;
//unsigned char shadowClut[768];
unsigned short curMode; /* mode include depth in <= 7.1 ROM-based mode */
unsigned short curDepth; /* depth separate from mode in >= 7.5 driver-based mode */
unsigned short hres; /* HW max */
unsigned short vres; /* HW max */
unsigned short hres[16]; /* HW max in 0 */
unsigned short vres[16]; /* HW max in 0 */
unsigned char maxMode;
unsigned char curMode; /* mode ; this is resolution (which can't be changed in 7.1 except via reboot ?) */
unsigned char curDepth; /* depth */
char gray;
char irqen;
char slot;

View File

@ -93,9 +93,9 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
case cscReset:
{
VDPageInfo *vPInfo = (VDPageInfo *)*(long *)pb->csParam;
dStore->curMode = firstVidMode;
dStore->curMode = nativeVidMode;
dStore->curDepth = kDepthMode1; /* 8-bit */
vPInfo->csMode = firstVidMode;
vPInfo->csMode = nativeVidMode;
vPInfo->csPage = 0;
vPInfo->csBaseAddr = 0;
ret = noErr;
@ -237,7 +237,7 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
const UInt32 a32 = dce->dCtlDevBase;
UInt32 a32_l0, a32_l1;
UInt32 a32_4p0, a32_4p1;
const uint32_t wb = dStore->hres >> idx;
const uint32_t wb = dStore->hres[0] >> idx;
unsigned short j, i;
if (vPInfo->csPage != 0)
@ -249,7 +249,7 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
/* grey the screen */
a32_l0 = a32;
a32_l1 = a32 + wb;
for (j = 0 ; j < dStore->vres ; j+= 2) {
for (j = 0 ; j < dStore->vres[0] ; j+= 2) {
a32_4p0 = a32_l0;
a32_4p1 = a32_l1;
for (i = 0 ; i < wb ; i += 4) {
@ -264,18 +264,18 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
} else {
/* testing */
a32_l0 = a32;
a32_l1 = a32 + dStore->hres*4;
for (j = 0 ; j < dStore->vres ; j+= 2) {
a32_l1 = a32 + dStore->hres[0]*4;
for (j = 0 ; j < dStore->vres[0] ; j+= 2) {
a32_4p0 = a32_l0;
a32_4p1 = a32_l1;
for (i = 0 ; i < dStore->hres ; i ++ ) {
for (i = 0 ; i < dStore->hres[0] ; i ++ ) {
*((UInt32*)a32_4p0) = (i&0xFF);//(i&0xFF) | (i&0xFF)<<8 | (i&0xff)<<24;
*((UInt32*)a32_4p1) = (i&0xFF)<<16;//(i&0xFF) | (i&0xFF)<<8 | (i&0xff)<<24;
a32_4p0 += 4;
a32_4p1 += 4;
}
a32_l0 += 2*dStore->hres*4;
a32_l1 += 2*dStore->hres*4;
a32_l0 += 2*dStore->hres[0]*4;
a32_l1 += 2*dStore->hres[0]*4;
}
}
#else
@ -286,17 +286,8 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
const UInt32 fgcolor = 0; // FIXME: per-depth?
struct goblin_accel_regs* accel_le = (struct goblin_accel_regs*)(dce->dCtlDevBase+GOBOFB_ACCEL_LE);
WAIT_FOR_HW_LE(accel_le);
switch (dStore->curMode) {
default:
case firstVidMode:
accel_le->reg_width = dStore->hres; // pixels
accel_le->reg_height = dStore->vres;
break;
case secondVidMode:
accel_le->reg_width = 640; // pixels
accel_le->reg_height = 480;
break;
}
accel_le->reg_width = dStore->hres[dStore->curMode - nativeVidMode]; // pixels
accel_le->reg_height = dStore->vres[dStore->curMode - nativeVidMode];
accel_le->reg_bitblt_dst_x = 0; // pixels
accel_le->reg_bitblt_dst_y = 0;
accel_le->reg_dst_ptr = 0;
@ -333,18 +324,11 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
break;
case cscSetDefaultMode: /* 9 */
{
{ /* fixme: NVRAM */
VDDefMode *vddefm = (VDDefMode *)*(long *)pb->csParam;
switch (vddefm->csID) {
case firstVidMode:
break;
case secondVidMode:
break;
default:
if ((((UInt8)vddefm->csID) < nativeVidMode) ||
(((UInt8)vddefm->csID) > dStore->maxMode))
return paramErr;
}
ret = noErr;
}
break;
@ -360,7 +344,7 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
}
unsigned short i;
for (i = firstVidMode ; i <= secondVidMode ; i++) {
for (i = nativeVidMode ; i <= dStore->maxMode ; i++) {
// disable spurious resources, enable only the right one
SpBlock spb;
spb.spParamData = (i != vdswitch->csData ? 1 : 0); /* disable/enable */
@ -375,51 +359,41 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
/* write_reg(dce, GOBOFB_DEBUG, vdswitch->csMode); */
/* write_reg(dce, GOBOFB_DEBUG, vdswitch->csData); */
SwapMMUMode ( &busMode );
switch (vdswitch->csData) {
case firstVidMode: {
/* write_reg(dce, GOBOFB_VIDEOCTRL, 0); */
write_reg(dce, GOBOFB_HRES_START, 0);
write_reg(dce, GOBOFB_VRES_START, 0);
write_reg(dce, GOBOFB_HRES_END, __builtin_bswap32(dStore->hres)); // fixme: endianess (along with HW)
write_reg(dce, GOBOFB_VRES_END, __builtin_bswap32(dStore->vres)); // fixme: endianess (along with HW)
/* write_reg(dce, GOBOFB_VIDEOCTRL, 1); */
} break;
case secondVidMode: {
unsigned int ho = ((dStore->hres - 640) / 2);
unsigned int vo = ((dStore->vres - 480) / 2);
if (vdswitch->csData != dStore->curMode) {
UInt8 id = ((UInt8)vdswitch->csData) - nativeVidMode;
unsigned int ho = ((dStore->hres[0] - dStore->hres[id]) / 2);
unsigned int vo = ((dStore->vres[0] - dStore->vres[id]) / 2);
/* write_reg(dce, GOBOFB_VIDEOCTRL, 0); */
write_reg(dce, GOBOFB_HRES_START, __builtin_bswap32(ho));
write_reg(dce, GOBOFB_VRES_START, __builtin_bswap32(vo));
write_reg(dce, GOBOFB_HRES_END, __builtin_bswap32(ho + 640));
write_reg(dce, GOBOFB_VRES_END, __builtin_bswap32(vo + 480));
write_reg(dce, GOBOFB_HRES_END, __builtin_bswap32(ho + dStore->hres[id]));
write_reg(dce, GOBOFB_VRES_END, __builtin_bswap32(vo + dStore->vres[id]));
/* write_reg(dce, GOBOFB_VIDEOCTRL, 1); */
} break;
default:
SwapMMUMode ( &busMode );
return paramErr;
}
switch (vdswitch->csMode) {
case kDepthMode1:
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_8BIT);
break;
case kDepthMode2:
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_4BIT);
break;
case kDepthMode3:
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_2BIT);
break;
case kDepthMode4:
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_1BIT);
break;
case kDepthMode5:
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_24BIT);
break;
case kDepthMode6:
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_15BIT);
break;
default:
SwapMMUMode ( &busMode );
return paramErr;
if (vdswitch->csMode != dStore->curDepth) {
switch (vdswitch->csMode) {
case kDepthMode1:
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_8BIT);
break;
case kDepthMode2:
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_4BIT);
break;
case kDepthMode3:
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_2BIT);
break;
case kDepthMode4:
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_1BIT);
break;
case kDepthMode5:
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_24BIT);
break;
case kDepthMode6:
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_15BIT);
break;
default:
SwapMMUMode ( &busMode );
return paramErr;
}
}
dStore->curMode = vdswitch->csData;
dStore->curDepth = vdswitch->csMode;
@ -434,38 +408,25 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
#if 1
{
VDSwitchInfoRec *vdswitch = *(VDSwitchInfoRec **)(long *)pb->csParam;
switch (vdswitch->csMode) { // checkme: really mode?
case firstVidMode:
break;
case secondVidMode:
break;
case thirdVidMode:
if ((((UInt8)vdswitch->csData) < nativeVidMode) ||
(((UInt8)vdswitch->csData) > dStore->maxMode))
return paramErr;
switch (vdswitch->csMode) {
case kDepthMode1:
break;
case fourthVidMode:
break;
case fifthVidMode:
break;
case sixthVidMode:
break;
default:
return paramErr;
}
switch (vdswitch->csData) { // checkme: really mode?
case firstVidMode:
break;
case secondVidMode:
break;
case thirdVidMode:
break;
case fourthVidMode:
break;
case fifthVidMode:
break;
case sixthVidMode:
break;
default:
return paramErr;
}
case kDepthMode2:
break;
case kDepthMode3:
break;
case kDepthMode4:
break;
case kDepthMode5:
break;
case kDepthMode6:
break;
default:
return paramErr;
}
if (vdswitch->csPage != 0)
return paramErr;
vdswitch->csBaseAddr = 0;

View File

@ -1,5 +1,7 @@
#include "NuBusFPGADrvr.h"
#include "ROMDefs.h"
OSErr cNuBusFPGAOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
{
OSErr ret = noErr;
@ -33,8 +35,8 @@ OSErr cNuBusFPGAOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
(*dStoreHdl)->slot = dce->dCtlSlot;
/* Get the HW setting for native resolution */
(*dStoreHdl)->hres = __builtin_bswap32((unsigned int)read_reg(dce, GOBOFB_HRES)); // fixme: endianness
(*dStoreHdl)->vres = __builtin_bswap32((unsigned int)read_reg(dce, GOBOFB_VRES)); // fixme: endianness
(*dStoreHdl)->hres[0] = __builtin_bswap32((unsigned int)read_reg(dce, GOBOFB_HRES)); // fixme: endianness
(*dStoreHdl)->vres[0] = __builtin_bswap32((unsigned int)read_reg(dce, GOBOFB_VRES)); // fixme: endianness
SlotIntQElement *siqel = (SlotIntQElement *)NewPtrSysClear(sizeof(SlotIntQElement));
if (siqel == NULL) {
@ -50,9 +52,77 @@ OSErr cNuBusFPGAOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
siqel->sqParm = (long)dce->dCtlDevBase;
(*dStoreHdl)->siqel = siqel;
(*dStoreHdl)->curMode = firstVidMode;
(*dStoreHdl)->curMode = nativeVidMode;
(*dStoreHdl)->curDepth = kDepthMode1;
{
OSErr err = noErr;
SpBlock spb;
UInt8 max = nativeVidMode;
spb.spParamData = 1<<fall|1<<foneslot;
spb.spCategory = catDisplay;
spb.spCType = typeVideo;
spb.spDrvrSW = drSwApple;
spb.spDrvrHW = 0xBEEF;
spb.spTBMask = 0; /* match everything above */
spb.spSlot = dce->dCtlSlot;
spb.spID = nativeVidMode;
spb.spExtDev = 0;
err = SGetTypeSRsrc(&spb);
while ((err == noErr) &&
(spb.spSlot == dce->dCtlSlot) &&
(((UInt8)spb.spID) > (UInt8)0x80) &&
(((UInt8)spb.spID) < (UInt8)0x90)) {
/* write_reg(dce, GOBOFB_DEBUG, 0xBEEF0020); */
/* write_reg(dce, GOBOFB_DEBUG, spb.spID); */
/* write_reg(dce, GOBOFB_DEBUG, err); */
if (((UInt8)spb.spID) == max) // should not happen
err = smNoMoresRsrcs;
if (((UInt8)spb.spID) > max)
max = spb.spID;
err = SGetTypeSRsrc(&spb);
}
(*dStoreHdl)->maxMode = max;
}
/* write_reg(dce, GOBOFB_DEBUG, 0xBEEF0000); */
/* write_reg(dce, GOBOFB_DEBUG, (*dStoreHdl)->maxMode); */
{
OSErr err = noErr;
SpBlock spb;
/* check for resolution */
UInt8 id;
for (id = nativeVidMode; id <= (*dStoreHdl)->maxMode ; id ++) {
/* try every resource, enabled or not */
spb.spParamData = 1<<fall; /* wants disabled */
spb.spCategory = catDisplay;
spb.spCType = typeVideo;
spb.spDrvrSW = drSwApple;
spb.spDrvrHW = 0xBEEF;
spb.spTBMask = 0;
spb.spSlot = dce->dCtlSlot;
spb.spID = id;
spb.spExtDev = 0;
err = SGetSRsrc(&spb);
if (err == noErr) {
spb.spID = kDepthMode1;
err = SFindStruct(&spb); /* that will give us the Parms block ... */
if (err == noErr) {
/* take the Parms pointer, add the offset to the Modes block and then skip the block size at the beginning to get the structure pointer ... */
const unsigned long offset = *(unsigned long*)spb.spsPointer & 0x00FFFFFF;
VPBlockPtr vpblock = (VPBlockPtr)(spb.spsPointer + offset + sizeof(long));
UInt8 idx = id - nativeVidMode;
(*dStoreHdl)->hres[idx] = vpblock->vpBounds.right;
(*dStoreHdl)->vres[idx] = vpblock->vpBounds.bottom;
}
}
}
}
linearGamma(*dStoreHdl);
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_8BIT);

View File

@ -70,24 +70,10 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
case cscGetPageCnt: /* 4 == cscGetPages */
{
VDPageInfo *vPInfo = (VDPageInfo *)*(long *)pb->csParam;
switch (vPInfo->csMode) {
case firstVidMode:
break;
case secondVidMode:
break;
case thirdVidMode:
break;
case fourthVidMode:
break;
case fifthVidMode:
break;
case sixthVidMode:
break;
default:
if ((((UInt8)vPInfo->csMode) < nativeVidMode) ||
(((UInt8)vPInfo->csMode) > dStore->maxMode))
return paramErr;
}
vPInfo->csPage = 0;
ret = noErr;
}
asm volatile(".word 0xfe16\n");
ret = noErr;
@ -128,8 +114,9 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
break;
case cscGetDefaultMode: /* 9 */
{ /* obsolete in PCI, not called >= 7.5 */
/* fixme for 7.1: store in NVRAM */
VDDefMode *vddefm = (VDDefMode *)*(long *)pb->csParam;
vddefm->csID = firstVidMode;
vddefm->csID = nativeVidMode;
ret = noErr;
}
break;
@ -168,28 +155,24 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
case cscGetModeTiming: /* 0xd */
{
VDTimingInfoRec *vdtim = *(VDTimingInfoRec **)(long *)pb->csParam;
if ((vdtim->csTimingMode != firstVidMode) &&
(vdtim->csTimingMode != secondVidMode) &&
(vdtim->csTimingMode != kDisplayModeIDFindFirstResolution) &&
(vdtim->csTimingMode != kDisplayModeIDCurrent))
return paramErr;
if (((((UInt8)vdtim->csTimingMode) < nativeVidMode) ||
(((UInt8)vdtim->csTimingMode) > dStore->maxMode)) &&
(vdtim->csTimingMode != kDisplayModeIDFindFirstResolution) &&
(vdtim->csTimingMode != kDisplayModeIDCurrent))
return paramErr;
unsigned int mode = vdtim->csTimingMode;
if (mode == kDisplayModeIDFindFirstResolution)
mode = firstVidMode;
mode = nativeVidMode;
if (mode == kDisplayModeIDCurrent)
mode = dStore->curMode;
/* write_reg(dce, GOBOFB_DEBUG, 0xBEEF0022); */
/* write_reg(dce, GOBOFB_DEBUG, (unsigned int)vdtim->csTimingMode); */
/* write_reg(dce, GOBOFB_DEBUG, (unsigned int)mode); */
switch (mode) {
case firstVidMode:
case nativeVidMode:
vdtim->csTimingFormat = kDeclROMtables;
vdtim->csTimingData = 0;
vdtim->csTimingFlags = 1<<kModeValid | 1<<kModeSafe | 1<<kModeDefault;
break;
case secondVidMode:
default:
vdtim->csTimingFormat = kDeclROMtables;//kDetailedTimingFormat;
vdtim->csTimingData = 0;
vdtim->csTimingFlags = 1<<kModeValid | 1<<kModeSafe;
@ -210,10 +193,10 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
break;
case cscGetPreferredConfiguration: /* 0x10 */
{
{ /* fixme: NVRAM */
VDSwitchInfoRec *vdswitch = *(VDSwitchInfoRec **)(long *)pb->csParam;
vdswitch->csMode = kDepthMode1; //dStore->curDepth; /* fixme: prefered not current / default */
vdswitch->csData = firstVidMode; //dStore->curMode;
vdswitch->csData = nativeVidMode; //dStore->curMode;
ret = noErr;
}
break;
@ -223,44 +206,33 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
VDResolutionInfoRec *vdres = *(VDResolutionInfoRec **)(long *)pb->csParam;
switch (vdres->csPreviousDisplayModeID)
{
case firstVidMode:
vdres->csDisplayModeID = secondVidMode;
vdres->csHorizontalPixels = 640;
vdres->csVerticalLines = 480;
vdres->csRefreshRate = 60 << 16; /* Fixed 16+16 */
vdres->csMaxDepthMode = kDepthMode6;
break;
case secondVidMode:
vdres->csDisplayModeID = kDisplayModeIDNoMoreResolutions;
vdres->csHorizontalPixels = dStore->hres;
vdres->csVerticalLines = dStore->vres;
vdres->csRefreshRate = 60 << 16; /* Fixed 16+16 */
default:
if ((((UInt8)vdres->csPreviousDisplayModeID) < nativeVidMode) ||
(((UInt8)vdres->csPreviousDisplayModeID) > dStore->maxMode))
return paramErr;
if (((UInt8)vdres->csPreviousDisplayModeID) == dStore->maxMode)
vdres->csDisplayModeID = kDisplayModeIDNoMoreResolutions;
else
vdres->csDisplayModeID = ((UInt8)vdres->csPreviousDisplayModeID) + 1;
vdres->csHorizontalPixels = dStore->hres[((UInt8)vdres->csDisplayModeID) - nativeVidMode];
vdres->csVerticalLines = dStore->vres[((UInt8)vdres->csDisplayModeID) - nativeVidMode];
vdres->csRefreshRate = 60 << 16; /* Fixed(Point) 16+16 */
vdres->csMaxDepthMode = kDepthMode6;
break;
case kDisplayModeIDFindFirstResolution:
vdres->csDisplayModeID = firstVidMode;
vdres->csHorizontalPixels = dStore->hres; // ?
vdres->csVerticalLines = dStore->vres; // ?
vdres->csRefreshRate = 60 << 16; /* Fixed 16+16 */
vdres->csDisplayModeID = nativeVidMode;
vdres->csHorizontalPixels = dStore->hres[0];
vdres->csVerticalLines = dStore->vres[0];
vdres->csRefreshRate = 60 << 16; /* Fixed(Point) 16+16 */
vdres->csMaxDepthMode = kDepthMode6;
break;
case kDisplayModeIDCurrent:
vdres->csDisplayModeID = dStore->curMode;
switch (dStore->curMode) {
case firstVidMode:
vdres->csHorizontalPixels = dStore->hres; // ?
vdres->csVerticalLines = dStore->vres; // ?
break;
case secondVidMode:
vdres->csHorizontalPixels = 640; // ?
vdres->csVerticalLines = 480; // ?
break;
}
vdres->csRefreshRate = 60 << 16; /* Fixed 16+16 */
vdres->csHorizontalPixels = dStore->hres[dStore->curMode - nativeVidMode];
vdres->csVerticalLines = dStore->vres[dStore->curMode - nativeVidMode];
vdres->csRefreshRate = 60 << 16; /* Fixed(Point) 16+16 */
vdres->csMaxDepthMode = kDepthMode6;
break;
default:
return paramErr;
}
ret = noErr;
}
@ -269,8 +241,8 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
case cscGetVideoParameters: /* 0x12 */
{
VDVideoParametersInfoRec *vdparam = *(VDVideoParametersInfoRec **)(long *)pb->csParam;
if ((vdparam->csDisplayModeID != firstVidMode) && /* native */
(vdparam->csDisplayModeID != secondVidMode) && /* 640 x 480 */
if (((((UInt8)vdparam->csDisplayModeID) < nativeVidMode) ||
(((UInt8)vdparam->csDisplayModeID) > dStore->maxMode)) &&
(vdparam->csDisplayModeID != kDisplayModeIDFindFirstResolution) &&
(vdparam->csDisplayModeID != kDisplayModeIDCurrent))
return paramErr;
@ -285,9 +257,9 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
/* write_reg(dce, GOBOFB_DEBUG, (unsigned int)vdparam->csDisplayModeID); */
/* write_reg(dce, GOBOFB_DEBUG, (unsigned int)vdparam->csDepthMode); */
VPBlock* vpblock = vdparam->csVPBlockPtr;
unsigned int mode = vdparam->csDisplayModeID;
unsigned char mode = vdparam->csDisplayModeID;
if (mode == kDisplayModeIDFindFirstResolution)
mode = firstVidMode;
mode = nativeVidMode;
if (mode == kDisplayModeIDCurrent)
mode = dStore->curMode;
/* basically the same as the EBVParms ? */
@ -295,17 +267,8 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
vpblock->vpBaseOffset = 0;
vpblock->vpBounds.left = 0;
vpblock->vpBounds.top = 0;
switch (mode) {
default:
case firstVidMode:
vpblock->vpBounds.right = dStore->hres;
vpblock->vpBounds.bottom = dStore->vres;
break;
case secondVidMode:
vpblock->vpBounds.right = 640;
vpblock->vpBounds.bottom = 480;
break;
}
vpblock->vpBounds.right = dStore->hres[mode - nativeVidMode];
vpblock->vpBounds.bottom = dStore->vres[mode - nativeVidMode];
vpblock->vpVersion = 0;
vpblock->vpPackType = 0;
vpblock->vpPackSize = 0;

View File

@ -1,6 +1,7 @@
#include "NuBusFPGADrvr.h"
#include <Traps.h>
#include <ROMDefs.h>
#define PRIM_WRITEREG(reg, val) \
*((volatile UInt32*)(a32+GOBOFB_BASE+reg)) = (UInt32)val
@ -47,16 +48,34 @@ UInt32 Primary(SEBlock* seblock) {
SwapMMUMode ( &busMode ); // restore
#if 1
{ // disable spurious entries
{ // disable non-default entries
SpBlock spb;
spb.spParamData = 1; /* disable */
spb.spSlot = seblock->seSlot;
spb.spID = 0x81; // 640x480 entries; fixme
spb.spExtDev = 0;
SetSRsrcState(&spb);
err = noErr;
do {
spb.spParamData = 1<<foneslot|1<<fnext;
spb.spCategory = catDisplay;
spb.spCType = typeVideo;
spb.spDrvrSW = drSwApple;
spb.spDrvrHW = 0xBEEF;
spb.spTBMask = 0; /* match everything above */
spb.spSlot = seblock->seSlot;
spb.spID = nativeVidMode; /* skip over the 'good' one; we can reset as SNextTypeSRsrc skips disabled */
spb.spExtDev = 0;
err = SNextTypeSRsrc(&spb);
if ((err == noErr) &&
(spb.spSlot == seblock->seSlot) &&
(((UInt8)spb.spID) > (UInt8)nativeVidMode) &&
(((UInt8)spb.spID) < (UInt8)diskResource)) {
spb.spParamData = 1; /* disable */
spb.spSlot = seblock->seSlot;
spb.spExtDev = 0;
SetSRsrcState(&spb);
/* PRIM_WRITEREG(GOBOFB_DEBUG, 0xBEEF000F); */
/* PRIM_WRITEREG(GOBOFB_DEBUG, spb.spID); */
}
} while (err == noErr);
}
#endif
#if 0

View File

@ -3,74 +3,13 @@
#include <string.h>
#include <stdint.h>
#if 0
ALIGN 2
_HiRes8Modes:
OSLstEntry mVidParams,_HRV8Parms /* offset to vid parameters */
DatLstEntry mPageCnt,Pages8s /* number of video pages */
DatLstEntry mDevType,clutType /* device type */
.long EndOfList /* end of list */
_HRV8Parms:
.long _EndHRV8Parms-_HRV8Parms /* physical block size */
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
.word RB8s /* physRowBytes ; vpRowBytes */
.word defmBounds_Ts,defmBounds_Ls,defmBounds_Bs,defmBounds_Rs /* vpBounds */
.word defVersion /* bmVersion ; vpVersion */
.word 0 /* packType not used ; vpPackType */
.long 0 /* packSize not used ; vpPackSize */
.long defmHRes /* bmHRes */
.long defmVRes /* bmVRes */
.word ChunkyIndexed /* bmPixelType */
.word 8 /* bmPixelSize */
.word 1 /* bmCmpCount */
.word 8 /* bmCmpSize */
.long defmPlaneBytes /* bmPlaneBytes */
_EndHRV8Parms:
ALIGN 2
_sRsrc_GoboFB:
OSLstEntry sRsrcType,_GoboFBType /* video type descriptor */
OSLstEntry sRsrcName,_GoboFBName /* offset to driver name string */
OSLstEntry sRsrcDrvrDir,_GoboFBDrvrDir /* offset to driver directory */
DatLstEntry sRsrcFlags,6 /* force 32 bits mode & open */
DatLstEntry sRsrcHWDevId,1 /* hardware device ID */
OSLstEntry MinorBaseOS,_MinorBase /* offset to frame buffer array */
OSLstEntry MinorLength,_MinorLength /* offset to frame buffer length */
/* OSLstEntry sGammaDir,_GammaDirS /* directory for 640x480 monitor */
/* Parameters */
OSLstEntry firstVidMode,_HiRes8Modes /* offset to 8 Bit Mode parms */
OSLstEntry secondVidMode,_HiRes4Modes /* offset to 4 Bit Mode parms */
OSLstEntry thirdVidMode,_HiRes2Modes /* offset to 2 Bit Mode parms */
OSLstEntry fourthVidMode,_HiRes1Modes /* offset to 1 Bit Mode parms */
OSLstEntry fifthVidMode,_HiRes24Modes /* offset to 24/32 Bit Mode parms */
OSLstEntry sixthVidMode,_HiRes15Modes /* offset to 15/16 Bit Mode parms */
.long EndOfList /* end of list */
ALIGN 2
_VModeName:
OSLstEntry sRsrc_GoboFB, _ScreenNameGoboFBHiRes
OSLstEntry sRsrc_GoboFB_13, _ScreenNameGoboFB13
DatLstEntry endOfList, 0
ALIGN 2
_ScreenNameGoboFBHiRes:
.long _ScreenNameGoboFBHiResEnd - _ScreenNameGoboFBHiRes
.word 0
.string "GoblinFB Native\0"
_ScreenNameGoboFBHiResEnd:
#endif
struct one_res {
const unsigned short hres;
const unsigned short vres;
};
#define NUM_RES 16
#if 0
#if 1
static struct one_res res_db[NUM_RES] = {
{ 1920, 1080 },
{ 1680, 1050 }, // should be unsuitable