mirror of
https://github.com/rdolbeau/NuBusFPGA.git
synced 2024-05-27 22:48:30 +00:00
Multi (windoboxed) resolution support
This commit is contained in:
parent
9e2caed442
commit
1aed1ad89b
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user