diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr.h b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr.h index abbf3b6..45c52a6 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr.h +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr.h @@ -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; diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c index e355966..2969d53 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c @@ -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; diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_OpenClose.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_OpenClose.c index d783978..d3720a6 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_OpenClose.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_OpenClose.c @@ -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<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<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); diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c index 700d84a..82f508d 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c @@ -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<csTimingFormat = kDeclROMtables;//kDetailedTimingFormat; vdtim->csTimingData = 0; vdtim->csTimingFlags = 1<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; diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGAPrimaryInit_Primary.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGAPrimaryInit_Primary.c index 255d31b..707c59e 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGAPrimaryInit_Primary.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGAPrimaryInit_Primary.c @@ -1,6 +1,7 @@ #include "NuBusFPGADrvr.h" #include +#include #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<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 diff --git a/nubus-to-ztex-gateware/DeclROM/gen_mode.c b/nubus-to-ztex-gateware/DeclROM/gen_mode.c index e502c22..bb26471 100644 --- a/nubus-to-ztex-gateware/DeclROM/gen_mode.c +++ b/nubus-to-ztex-gateware/DeclROM/gen_mode.c @@ -3,74 +3,13 @@ #include #include -#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