preliminary windowed resolution (640x480 for the moment)
This commit is contained in:
parent
ce88b7c264
commit
06637bbd5d
|
@ -34,11 +34,18 @@
|
|||
#define GOBOFB_DEBUG 0x1c
|
||||
//#define GOBOFB_CURSOR_LUT 0x20
|
||||
//#define GOBOFB_CURSOR_XY 0x24
|
||||
#define GOBOFB_HRES 0x40
|
||||
#define GOBOFB_VRES 0x44
|
||||
#define GOBOFB_HRES_START 0x48
|
||||
#define GOBOFB_VRES_START 0x4C
|
||||
#define GOBOFB_HRES_END 0x50
|
||||
#define GOBOFB_VRES_END 0x54
|
||||
//#define GOBOFB_MASK_BASE 0x80
|
||||
//#define GOBOFB_BITS_BASE 0x100
|
||||
|
||||
#define GOBOFB_INTR_VBL 0x1
|
||||
|
||||
// for GOBOFB_MODE
|
||||
#define GOBOFB_MODE_1BIT 0x0
|
||||
#define GOBOFB_MODE_2BIT 0x1
|
||||
#define GOBOFB_MODE_4BIT 0x2
|
||||
|
@ -62,7 +69,7 @@ struct goblin_accel_regs {
|
|||
u_int32_t reg_bitblt_dst_y;
|
||||
u_int32_t reg_src_stride; // 12
|
||||
u_int32_t reg_dst_stride;
|
||||
u_int32_t reg_src_ptr; // 12
|
||||
u_int32_t reg_src_ptr; // 14
|
||||
u_int32_t reg_dst_ptr;
|
||||
};
|
||||
|
||||
|
@ -92,6 +99,7 @@ struct NuBusFPGADriverGlobals {
|
|||
unsigned short curDepth; /* depth separate from mode in >= 7.5 driver-based mode */
|
||||
char gray;
|
||||
char irqen;
|
||||
char slot;
|
||||
struct MyGammaTbl gamma;
|
||||
};
|
||||
typedef struct NuBusFPGADriverGlobals NuBusFPGADriverGlobals;
|
||||
|
|
|
@ -1,28 +1,5 @@
|
|||
#include "NuBusFPGADrvr.h"
|
||||
|
||||
#if 0
|
||||
typedef struct AuxDCE {
|
||||
Ptr dCtlDriver; /* pointer or handle to driver */
|
||||
short dCtlFlags; /* flags */
|
||||
QHdr dCtlQHdr; /* I/O queue header */
|
||||
long dCtlPosition; /* current R/W byte position */
|
||||
Handle dCtlStorage; /* handle to private storage */
|
||||
short dCtlRefNum; /* driver reference number */
|
||||
long dCtlCurTicks; /* used internally */
|
||||
GrafPtr dCtlWindow; /* pointer to driverâs window */
|
||||
short dCtlDelay; /* ticks between periodic actions */
|
||||
short dCtlEMask; /* desk accessory event mask */
|
||||
short dCtlMenu; /* desk accessory menu ID */
|
||||
char dCtlSlot; /* slot */
|
||||
char dCtlSlotId; /* sResource directory ID */
|
||||
long dCtlDevBase; /* slot device base address */
|
||||
Ptr dCtlOwner; /* reserved; must be 0 */
|
||||
char dCtlExtDev; /* external device ID */
|
||||
char fillByte; /* reserved */
|
||||
} AuxDCE;
|
||||
typedef AuxDCE *AuxDCEPtr, **AuxDCEHandle;
|
||||
#endif
|
||||
|
||||
void linearGamma(NuBusFPGADriverGlobalsPtr dStore) {
|
||||
int i;
|
||||
dStore->gamma.gVersion = 0;
|
||||
|
@ -133,46 +110,32 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
VDPageInfo *vPInfo = (VDPageInfo *)*(long *)pb->csParam;
|
||||
if (vPInfo->csPage != 0)
|
||||
return paramErr;
|
||||
SwapMMUMode ( &busMode );
|
||||
switch (vPInfo->csMode) {
|
||||
case firstVidMode:
|
||||
dStore->curMode = firstVidMode;
|
||||
SwapMMUMode ( &busMode );
|
||||
case kDepthMode1:
|
||||
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_8BIT);
|
||||
SwapMMUMode ( &busMode );
|
||||
break;
|
||||
case secondVidMode:
|
||||
dStore->curMode = secondVidMode;
|
||||
SwapMMUMode ( &busMode );
|
||||
case kDepthMode2:
|
||||
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_4BIT);
|
||||
SwapMMUMode ( &busMode );
|
||||
break;
|
||||
case thirdVidMode:
|
||||
dStore->curMode = thirdVidMode;
|
||||
SwapMMUMode ( &busMode );
|
||||
case kDepthMode3:
|
||||
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_2BIT);
|
||||
SwapMMUMode ( &busMode );
|
||||
break;
|
||||
case fourthVidMode:
|
||||
dStore->curMode = fourthVidMode;
|
||||
SwapMMUMode ( &busMode );
|
||||
case kDepthMode4:
|
||||
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_1BIT);
|
||||
SwapMMUMode ( &busMode );
|
||||
break;
|
||||
case fifthVidMode:
|
||||
dStore->curMode = fifthVidMode;
|
||||
SwapMMUMode ( &busMode );
|
||||
case kDepthMode5:
|
||||
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_24BIT);
|
||||
SwapMMUMode ( &busMode );
|
||||
break;
|
||||
case sixthVidMode:
|
||||
dStore->curMode = sixthVidMode;
|
||||
SwapMMUMode ( &busMode );
|
||||
case kDepthMode6:
|
||||
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_15BIT);
|
||||
SwapMMUMode ( &busMode );
|
||||
break;
|
||||
default:
|
||||
SwapMMUMode ( &busMode );
|
||||
return paramErr;
|
||||
}
|
||||
dStore->curDepth = vPInfo->csMode;
|
||||
SwapMMUMode ( &busMode );
|
||||
vPInfo->csBaseAddr = 0;
|
||||
ret = noErr;
|
||||
}
|
||||
|
@ -319,11 +282,21 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
|
||||
#define WAIT_FOR_HW_LE(accel_le) \
|
||||
while (accel_le->reg_status & (1<<WORK_IN_PROGRESS_BIT))
|
||||
|
||||
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);
|
||||
accel_le->reg_width = HRES; // pixels
|
||||
accel_le->reg_height = VRES;
|
||||
switch (dStore->curMode) {
|
||||
default:
|
||||
case firstVidMode:
|
||||
accel_le->reg_width = HRES; // pixels
|
||||
accel_le->reg_height = VRES;
|
||||
break;
|
||||
case secondVidMode:
|
||||
accel_le->reg_width = 640; // pixels
|
||||
accel_le->reg_height = 480;
|
||||
break;
|
||||
}
|
||||
accel_le->reg_bitblt_dst_x = 0; // pixels
|
||||
accel_le->reg_bitblt_dst_y = 0;
|
||||
accel_le->reg_dst_ptr = 0;
|
||||
|
@ -362,22 +335,16 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
case cscSetDefaultMode: /* 9 */
|
||||
{
|
||||
VDDefMode *vddefm = (VDDefMode *)*(long *)pb->csParam;
|
||||
switch (vddefm->csID) { // checkme: really mode?
|
||||
|
||||
switch (vddefm->csID) {
|
||||
case firstVidMode:
|
||||
break;
|
||||
case secondVidMode:
|
||||
break;
|
||||
case thirdVidMode:
|
||||
break;
|
||||
case fourthVidMode:
|
||||
break;
|
||||
case fifthVidMode:
|
||||
break;
|
||||
case sixthVidMode:
|
||||
break;
|
||||
default:
|
||||
return paramErr;
|
||||
}
|
||||
}
|
||||
|
||||
ret = noErr;
|
||||
}
|
||||
break;
|
||||
|
@ -387,40 +354,76 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
VDSwitchInfoRec *vdswitch = *(VDSwitchInfoRec **)(long *)pb->csParam;
|
||||
if (vdswitch->csPage != 0)
|
||||
return paramErr;
|
||||
if ((vdswitch->csData == dStore->curMode) &&
|
||||
(vdswitch->csMode == dStore->curDepth)) {
|
||||
return noErr;
|
||||
}
|
||||
|
||||
unsigned short i;
|
||||
for (i = firstVidMode ; i <= secondVidMode ; i++) {
|
||||
// disable spurious resources, enable only the right one
|
||||
SpBlock spb;
|
||||
spb.spParamData = (i != vdswitch->csData ? 1 : 0); /* disable/enable */
|
||||
spb.spSlot = dStore->slot;
|
||||
spb.spID = i;
|
||||
spb.spExtDev = 0;
|
||||
SetSRsrcState(&spb);
|
||||
}
|
||||
dce->dCtlSlotId = vdswitch->csData; // where is that explained ? cscSwitchMode is not in DCDMF3, and you should'nt do that anymore says PDCD...
|
||||
|
||||
/* write_reg(dce, GOBOFB_DEBUG, 0xBEEF0021); */
|
||||
/* write_reg(dce, GOBOFB_DEBUG, vdswitch->csMode); */
|
||||
/* write_reg(dce, GOBOFB_DEBUG, vdswitch->csData); */
|
||||
SwapMMUMode ( &busMode );
|
||||
switch (vdswitch->csData) {
|
||||
case kDepthMode1:
|
||||
SwapMMUMode ( &busMode );
|
||||
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_8BIT);
|
||||
SwapMMUMode ( &busMode );
|
||||
break;
|
||||
case kDepthMode2:
|
||||
SwapMMUMode ( &busMode );
|
||||
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_4BIT);
|
||||
SwapMMUMode ( &busMode );
|
||||
break;
|
||||
case kDepthMode3:
|
||||
SwapMMUMode ( &busMode );
|
||||
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_2BIT);
|
||||
SwapMMUMode ( &busMode );
|
||||
break;
|
||||
case kDepthMode4:
|
||||
SwapMMUMode ( &busMode );
|
||||
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_1BIT);
|
||||
SwapMMUMode ( &busMode );
|
||||
break;
|
||||
case kDepthMode5:
|
||||
SwapMMUMode ( &busMode );
|
||||
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_24BIT);
|
||||
SwapMMUMode ( &busMode );
|
||||
break;
|
||||
case kDepthMode6:
|
||||
SwapMMUMode ( &busMode );
|
||||
write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_15BIT);
|
||||
SwapMMUMode ( &busMode );
|
||||
break;
|
||||
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(HRES)); // fixme: endianess (along with HW)
|
||||
write_reg(dce, GOBOFB_VRES_END, __builtin_bswap32(VRES)); // fixme: endianess (along with HW)
|
||||
/* write_reg(dce, GOBOFB_VIDEOCTRL, 1); */
|
||||
} break;
|
||||
case secondVidMode: {
|
||||
unsigned int ho = ((HRES - 640) / 2);
|
||||
unsigned int vo = ((VRES - 480) / 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_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;
|
||||
}
|
||||
dStore->curMode = vdswitch->csData;
|
||||
dStore->curDepth = vdswitch->csMode;
|
||||
SwapMMUMode ( &busMode );
|
||||
vdswitch->csBaseAddr = 0;
|
||||
ret = noErr;
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ OSErr cNuBusFPGAOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
|
||||
(*dStoreHdl)->gray = 0;
|
||||
(*dStoreHdl)->irqen = 0;
|
||||
(*dStoreHdl)->slot = dce->dCtlSlot;
|
||||
|
||||
SlotIntQElement *siqel = (SlotIntQElement *)NewPtrSysClear(sizeof(SlotIntQElement));
|
||||
if (siqel == NULL) {
|
||||
|
@ -44,6 +45,9 @@ OSErr cNuBusFPGAOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
siqel->sqAddr = sqAddr;
|
||||
siqel->sqParm = (long)dce->dCtlDevBase;
|
||||
(*dStoreHdl)->siqel = siqel;
|
||||
|
||||
(*dStoreHdl)->curMode = firstVidMode;
|
||||
(*dStoreHdl)->curDepth = kDepthMode1;
|
||||
|
||||
linearGamma(*dStoreHdl);
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
case cscGetMode: /* 2 */
|
||||
{
|
||||
VDPageInfo *vPInfo = (VDPageInfo *)*(long *)pb->csParam;
|
||||
vPInfo->csMode = dStore->curMode; /* checkme: PCI says depth, 7.5+ doesn't call anyway? */
|
||||
vPInfo->csMode = dStore->curDepth; /* checkme: PCI says depth, 7.5+ doesn't call anyway? */
|
||||
vPInfo->csPage = 0;
|
||||
vPInfo->csBaseAddr = 0;
|
||||
ret = noErr;
|
||||
|
@ -137,6 +137,9 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
case cscGetCurMode: /* 0xa */
|
||||
{
|
||||
VDSwitchInfoRec *vdswitch = *(VDSwitchInfoRec **)(long *)pb->csParam;
|
||||
/* write_reg(dce, GOBOFB_DEBUG, 0xBEEF0022); */
|
||||
/* write_reg(dce, GOBOFB_DEBUG, (unsigned int)dStore->curDepth); */
|
||||
/* write_reg(dce, GOBOFB_DEBUG, (unsigned int)dStore->curMode); */
|
||||
vdswitch->csMode = dStore->curDepth;
|
||||
vdswitch->csData = dStore->curMode;
|
||||
vdswitch->csPage = 0;
|
||||
|
@ -156,7 +159,7 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
vdconn->csDisplayType = kGenericLCD;
|
||||
vdconn->csConnectTaggedType = 0;
|
||||
vdconn->csConnectTaggedData = 0;
|
||||
vdconn->csConnectFlags = (1<<kTaggingInfoNonStandard) | (1<<kIsMonoDev) | (1<<kAllModesSafe) | (1<<kAllModesValid);
|
||||
vdconn->csConnectFlags = (1<<kTaggingInfoNonStandard) | (1<<kAllModesSafe) | (1<<kAllModesValid);
|
||||
vdconn->csDisplayComponent = 0;
|
||||
ret = noErr;
|
||||
}
|
||||
|
@ -165,14 +168,34 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
case cscGetModeTiming: /* 0xd */
|
||||
{
|
||||
VDTimingInfoRec *vdtim = *(VDTimingInfoRec **)(long *)pb->csParam;
|
||||
ret = noErr;
|
||||
if ((vdtim->csTimingMode != firstVidMode) &&
|
||||
(vdtim->csTimingMode != secondVidMode) &&
|
||||
(vdtim->csTimingMode != kDisplayModeIDFindFirstResolution) &&
|
||||
(vdtim->csTimingMode != kDisplayModeIDCurrent))
|
||||
return paramErr;
|
||||
vdtim->csTimingFormat = kDeclROMtables;
|
||||
vdtim->csTimingData = 0;
|
||||
vdtim->csTimingFlags = kModeDefault;
|
||||
unsigned int mode = vdtim->csTimingMode;
|
||||
if (mode == kDisplayModeIDFindFirstResolution)
|
||||
mode = firstVidMode;
|
||||
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:
|
||||
vdtim->csTimingFormat = kDeclROMtables;
|
||||
vdtim->csTimingData = 0;
|
||||
vdtim->csTimingFlags = 1<<kModeValid | 1<<kModeSafe | 1<<kModeDefault;
|
||||
break;
|
||||
case secondVidMode:
|
||||
vdtim->csTimingFormat = kDeclROMtables;//kDetailedTimingFormat;
|
||||
vdtim->csTimingData = 0;
|
||||
vdtim->csTimingFlags = 1<<kModeValid | 1<<kModeSafe;
|
||||
break;
|
||||
}
|
||||
ret = noErr;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -198,20 +221,42 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
case cscGetNextResolution: /* 0x11 */
|
||||
{
|
||||
VDResolutionInfoRec *vdres = *(VDResolutionInfoRec **)(long *)pb->csParam;
|
||||
vdres->csHorizontalPixels = HRES;
|
||||
vdres->csVerticalLines = VRES;
|
||||
vdres->csRefreshRate = 60 << 16; /* Fixed 16+16 */
|
||||
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 = HRES;
|
||||
vdres->csVerticalLines = VRES;
|
||||
vdres->csRefreshRate = 60 << 16; /* Fixed 16+16 */
|
||||
vdres->csMaxDepthMode = kDepthMode6;
|
||||
break;
|
||||
case kDisplayModeIDFindFirstResolution:
|
||||
vdres->csDisplayModeID = firstVidMode;
|
||||
vdres->csHorizontalPixels = HRES; // ?
|
||||
vdres->csVerticalLines = VRES; // ?
|
||||
vdres->csRefreshRate = 60 << 16; /* Fixed 16+16 */
|
||||
vdres->csMaxDepthMode = kDepthMode6;
|
||||
break;
|
||||
case kDisplayModeIDCurrent:
|
||||
vdres->csDisplayModeID = firstVidMode;
|
||||
vdres->csDisplayModeID = dStore->curMode;
|
||||
switch (dStore->curMode) {
|
||||
case firstVidMode:
|
||||
vdres->csHorizontalPixels = HRES; // ?
|
||||
vdres->csVerticalLines = VRES; // ?
|
||||
break;
|
||||
case secondVidMode:
|
||||
vdres->csHorizontalPixels = 640; // ?
|
||||
vdres->csVerticalLines = 480; // ?
|
||||
break;
|
||||
}
|
||||
vdres->csRefreshRate = 60 << 16; /* Fixed 16+16 */
|
||||
vdres->csMaxDepthMode = kDepthMode6;
|
||||
break;
|
||||
default:
|
||||
|
@ -224,7 +269,8 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
case cscGetVideoParameters: /* 0x12 */
|
||||
{
|
||||
VDVideoParametersInfoRec *vdparam = *(VDVideoParametersInfoRec **)(long *)pb->csParam;
|
||||
if ((vdparam->csDisplayModeID != firstVidMode) &&
|
||||
if ((vdparam->csDisplayModeID != firstVidMode) && /* native */
|
||||
(vdparam->csDisplayModeID != secondVidMode) && /* 640 x 480 */
|
||||
(vdparam->csDisplayModeID != kDisplayModeIDFindFirstResolution) &&
|
||||
(vdparam->csDisplayModeID != kDisplayModeIDCurrent))
|
||||
return paramErr;
|
||||
|
@ -235,14 +281,31 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
(vdparam->csDepthMode != kDepthMode5) &&
|
||||
(vdparam->csDepthMode != kDepthMode6))
|
||||
return paramErr;
|
||||
/* write_reg(dce, GOBOFB_DEBUG, 0xBEEF0022); */
|
||||
/* 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;
|
||||
if (mode == kDisplayModeIDFindFirstResolution)
|
||||
mode = firstVidMode;
|
||||
if (mode == kDisplayModeIDCurrent)
|
||||
mode = dStore->curMode;
|
||||
/* basically the same as the EBVParms ? */
|
||||
vdparam->csPageCount = 0;
|
||||
vpblock->vpBaseOffset = 0;
|
||||
vpblock->vpBounds.left = 0;
|
||||
vpblock->vpBounds.top = 0;
|
||||
vpblock->vpBounds.right = HRES;
|
||||
vpblock->vpBounds.bottom = VRES;
|
||||
switch (mode) {
|
||||
default:
|
||||
case firstVidMode:
|
||||
vpblock->vpBounds.right = HRES;
|
||||
vpblock->vpBounds.bottom = VRES;
|
||||
break;
|
||||
case secondVidMode:
|
||||
vpblock->vpBounds.right = 640;
|
||||
vpblock->vpBounds.bottom = 480;
|
||||
break;
|
||||
}
|
||||
vpblock->vpVersion = 0;
|
||||
vpblock->vpPackType = 0;
|
||||
vpblock->vpPackSize = 0;
|
||||
|
@ -250,37 +313,37 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
|||
vpblock->vpVRes = 0x480000;
|
||||
vpblock->vpPixelType = chunky; // checkme?
|
||||
if (vdparam->csDepthMode == kDepthMode1) {
|
||||
vpblock->vpRowBytes = HRES;
|
||||
vpblock->vpRowBytes = vpblock->vpBounds.right;
|
||||
vdparam->csDeviceType = clutType;
|
||||
vpblock->vpPixelSize = 8;
|
||||
vpblock->vpCmpCount = 1;
|
||||
vpblock->vpCmpSize = 8;
|
||||
} else if (vdparam->csDepthMode == kDepthMode2) {
|
||||
vpblock->vpRowBytes = HRES/2;
|
||||
vpblock->vpRowBytes = vpblock->vpBounds.right/2;
|
||||
vdparam->csDeviceType = clutType;
|
||||
vpblock->vpPixelSize = 4;
|
||||
vpblock->vpCmpCount = 1;
|
||||
vpblock->vpCmpSize = 4;
|
||||
} else if (vdparam->csDepthMode == kDepthMode3) {
|
||||
vpblock->vpRowBytes = HRES/4;
|
||||
vpblock->vpRowBytes = vpblock->vpBounds.right/4;
|
||||
vdparam->csDeviceType = clutType;
|
||||
vpblock->vpPixelSize = 2;
|
||||
vpblock->vpCmpCount = 1;
|
||||
vpblock->vpCmpSize = 2;
|
||||
} else if (vdparam->csDepthMode == kDepthMode4) {
|
||||
vpblock->vpRowBytes = HRES/8;
|
||||
vpblock->vpRowBytes = vpblock->vpBounds.right/8;
|
||||
vdparam->csDeviceType = clutType;
|
||||
vpblock->vpPixelSize = 1;
|
||||
vpblock->vpCmpCount = 1;
|
||||
vpblock->vpCmpSize = 1;
|
||||
} else if (vdparam->csDepthMode == kDepthMode5) {
|
||||
vpblock->vpRowBytes = HRES*4;
|
||||
vpblock->vpRowBytes = vpblock->vpBounds.right*4;
|
||||
vdparam->csDeviceType = directType;
|
||||
vpblock->vpPixelSize = 32;
|
||||
vpblock->vpCmpCount = 3;
|
||||
vpblock->vpCmpSize = 8;
|
||||
} else if (vdparam->csDepthMode == kDepthMode6) {
|
||||
vpblock->vpRowBytes = HRES*2;
|
||||
vpblock->vpRowBytes = vpblock->vpBounds.right*2;
|
||||
vdparam->csDeviceType = directType;
|
||||
vpblock->vpPixelSize = 16;
|
||||
vpblock->vpCmpCount = 3;
|
||||
|
|
|
@ -41,6 +41,17 @@ UInt32 Primary(SEBlock* seblock) {
|
|||
}
|
||||
|
||||
SwapMMUMode ( &busMode ); // restore
|
||||
|
||||
#if 1
|
||||
{ // disable spurious entries
|
||||
SpBlock spb;
|
||||
spb.spParamData = 1; /* disable */
|
||||
spb.spSlot = seblock->seSlot;
|
||||
spb.spID = 0x81; // 640x480 entries; fixme
|
||||
spb.spExtDev = 0;
|
||||
SetSRsrcState(&spb);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
|
||||
|
|
|
@ -8,12 +8,15 @@
|
|||
|
||||
sRsrc_Board = 1 /* board sResource (>0 & <128) */
|
||||
sRsrc_GoboFB = 0x80 /* functional sResources */
|
||||
sRsrc_RAMDsk = 0x81 /* functional sResources */
|
||||
sRsrc_GoboFB_13 = 0x81 /* functional sResources */
|
||||
sRsrc_RAMDsk = 0x90 /* functional sResources */
|
||||
sRsrc_GoboFB_HiRes = 0x80 /* functional sResources */
|
||||
|
||||
_sRsrcDir:
|
||||
OSLstEntry sRsrc_Board,_sRsrc_Board /* board sRsrc List */
|
||||
OSLstEntry sRsrc_GoboFB,_sRsrc_GoboFB /* video sRsrc List */
|
||||
OSLstEntry sRsrc_RAMDsk,_sRsrc_RAMDsk /* video sRsrc List */
|
||||
OSLstEntry sRsrc_GoboFB_13,_sRsrc_GoboFB_13 /* video sRsrc List */
|
||||
/* OSLstEntry sRsrc_RAMDsk,_sRsrc_RAMDsk /* video sRsrc List */
|
||||
.long EndOfList
|
||||
|
||||
_sRsrc_Board:
|
||||
|
@ -23,7 +26,7 @@ _sRsrc_Board:
|
|||
OSLstEntry primaryInit,_sPInitRec /* offset to PrimaryInit exec blk */
|
||||
OSLstEntry vendorInfo,_VendorInfo /* offset to vendor info record */
|
||||
OSLstEntry secondaryInit,_sSInitRec /* offset to SecondaryInit block */
|
||||
OSLstEntry sRsrcVidNames, _VModeName
|
||||
OSLstEntry sRsrcVidNames, _VModeName /* video name directory */
|
||||
.long EndOfList
|
||||
|
||||
_BoardType:
|
||||
|
@ -76,15 +79,23 @@ _Date:
|
|||
ALIGN 2
|
||||
|
||||
_VModeName:
|
||||
OSLstEntry sRsrc_GoboFB, _ScreenNameGoboFB
|
||||
DatLstEntry endOfList, 0
|
||||
OSLstEntry sRsrc_GoboFB, _ScreenNameGoboFBHiRes
|
||||
OSLstEntry sRsrc_GoboFB_13, _ScreenNameGoboFB13
|
||||
DatLstEntry endOfList, 0
|
||||
|
||||
ALIGN 2
|
||||
_ScreenNameGoboFB:
|
||||
.long _ScreenNameGoboFBEnd - _ScreenNameGoboFB
|
||||
_ScreenNameGoboFBHiRes:
|
||||
.long _ScreenNameGoboFBHiResEnd - _ScreenNameGoboFBHiRes
|
||||
.word 0
|
||||
.string "GoblinFB Native\0"
|
||||
_ScreenNameGoboFBEnd:
|
||||
_ScreenNameGoboFBHiResEnd:
|
||||
|
||||
ALIGN 2
|
||||
_ScreenNameGoboFB13:
|
||||
.long _ScreenNameGoboFB13End - _ScreenNameGoboFB13
|
||||
.word 0
|
||||
.string "GoblinFB 640x480WB\0"
|
||||
_ScreenNameGoboFB13End:
|
||||
|
||||
ALIGN 2
|
||||
_sRsrc_GoboFB:
|
||||
|
@ -102,9 +113,29 @@ _sRsrc_GoboFB:
|
|||
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 1516 Bit Mode parms */
|
||||
OSLstEntry sixthVidMode,_HiRes15Modes /* offset to 15/16 Bit Mode parms */
|
||||
.long EndOfList /* end of list */
|
||||
|
||||
ALIGN 2
|
||||
_sRsrc_GoboFB_13:
|
||||
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,_M13_8Modes /* offset to 8 Bit Mode parms */
|
||||
OSLstEntry secondVidMode,_M13_4Modes /* offset to 4 Bit Mode parms */
|
||||
OSLstEntry thirdVidMode,_M13_2Modes /* offset to 2 Bit Mode parms */
|
||||
OSLstEntry fourthVidMode,_M13_1Modes /* offset to 1 Bit Mode parms */
|
||||
OSLstEntry fifthVidMode,_M13_24Modes /* offset to 24/32 Bit Mode parms */
|
||||
OSLstEntry sixthVidMode,_M13_15Modes /* offset to 15/16 Bit Mode parms */
|
||||
.long EndOfList /* end of list */
|
||||
|
||||
|
||||
ALIGN 2
|
||||
_GoboFBType:
|
||||
.short catDisplay /* <Category> */
|
||||
|
@ -132,172 +163,10 @@ _GoboFBDrvrMacOS68020:
|
|||
.text
|
||||
_GoboFBEnd020Drvr:
|
||||
|
||||
/* ALIGN 2 */
|
||||
/* _GammaDirS: */
|
||||
/* OSLstEntry 128,_SmallGamma */
|
||||
/* .long EndOfList */
|
||||
/* _SmallGamma: */
|
||||
/* .long _EndSmallGamma-_SmallGamma */
|
||||
/* .short SGammaResID */
|
||||
/* .string "Small Gamma" /* Monitors name */
|
||||
/* ALIGN 2 */
|
||||
/* .short 0x0000 /* gVersion */
|
||||
/* .short DrHwNuBusFPGA /* gType */
|
||||
/* .short 0x0000 /* gFormulaSize */
|
||||
/* .short 0x0001 /* gChanCnt */
|
||||
/* .short 0x0100 /* gDataCnt */
|
||||
/* .short 0x0008 /* gChanWidth */
|
||||
/* .long 0x0005090B,0x0E101315,0x17191B1D,0x1E202224
|
||||
.long 0x2527282A,0x2C2D2F30,0x31333436,0x37383A3B
|
||||
.long 0x3C3E3F40,0x42434445,0x4748494A,0x4B4D4E4F
|
||||
.long 0x50515254,0x55565758,0x595A5B5C,0x5E5F6061
|
||||
.long 0x62636465,0x66676869,0x6A6B6C6D,0x6E6F7071
|
||||
.long 0x72737475,0x76777879,0x7A7B7C7D,0x7E7F8081
|
||||
.long 0x81828384,0x85868788,0x898A8B8C,0x8C8D8E8F
|
||||
.long 0x90919293,0x94959596,0x9798999A,0x9B9B9C9D
|
||||
.long 0x9E9FA0A1,0xA1A2A3A4,0xA5A6A6A7,0xA8A9AAAB
|
||||
.long 0xABACADAE,0xAFB0B0B1,0xB2B3B4B4,0xB5B6B7B8
|
||||
.long 0xB8B9BABB,0xBCBCBDBE,0xBFC0C0C1,0xC2C3C3C4
|
||||
.long 0xC5C6C7C7,0xC8C9CACA,0xCBCCCDCD,0xCECFD0D0
|
||||
.long 0xD1D2D3D3,0xD4D5D6D6,0xD7D8D9D9,0xDADBDCDC
|
||||
.long 0xDDDEDFDF,0xE0E1E1E2,0xE3E4E4E5,0xE6E7E7E8
|
||||
.long 0xE9B9EAEB,0xECECEDEE,0xEEEFF0F1,0xF1F2F3F3
|
||||
.long 0xF4F5F5F6,0xF7F8F8F9,0xFAFAFBFC,0xFCFDFEFF */
|
||||
/* _EndSmallGamma: */
|
||||
|
||||
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
|
||||
_HiRes4Modes:
|
||||
OSLstEntry mVidParams,_HRV4Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages4s /* number of video pages */
|
||||
DatLstEntry mDevType,clutType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_HRV4Parms:
|
||||
.long _EndHRV4Parms-_HRV4Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word RB4s /* 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 4 /* bmPixelSize */
|
||||
.word 1 /* bmCmpCount */
|
||||
.word 4 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_EndHRV4Parms:
|
||||
ALIGN 2
|
||||
_HiRes2Modes:
|
||||
OSLstEntry mVidParams,_HRV2Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages2s /* number of video pages */
|
||||
DatLstEntry mDevType,clutType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_HRV2Parms:
|
||||
.long _EndHRV2Parms-_HRV2Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word RB2s /* 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 2 /* bmPixelSize */
|
||||
.word 1 /* bmCmpCount */
|
||||
.word 2 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_EndHRV2Parms:
|
||||
ALIGN 2
|
||||
_HiRes1Modes:
|
||||
OSLstEntry mVidParams,_HRV1Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages1s /* number of video pages */
|
||||
DatLstEntry mDevType,clutType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_HRV1Parms:
|
||||
.long _EndHRV1Parms-_HRV1Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word RB1s /* 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 1 /* bmPixelSize */
|
||||
.word 1 /* bmCmpCount */
|
||||
.word 1 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_EndHRV1Parms:
|
||||
ALIGN 2
|
||||
_HiRes24Modes:
|
||||
OSLstEntry mVidParams,_HRV24Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages24s /* number of video pages */
|
||||
DatLstEntry mDevType,directType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_HRV24Parms:
|
||||
.long _EndHRV24Parms-_HRV24Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word RB24s /* 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 ChunkyDirect /* bmPixelType */
|
||||
.word 32 /* bmPixelSize */
|
||||
.word 3 /* bmCmpCount */
|
||||
.word 8 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_EndHRV24Parms:
|
||||
ALIGN 2
|
||||
_HiRes15Modes:
|
||||
OSLstEntry mVidParams,_HRV15Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages15s /* number of video pages */
|
||||
DatLstEntry mDevType,directType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_HRV15Parms:
|
||||
.long _EndHRV15Parms-_HRV15Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word RB15s /* 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 ChunkyDirect /* bmPixelType */
|
||||
.word 16 /* bmPixelSize */
|
||||
.word 3 /* bmCmpCount */
|
||||
.word 5 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_EndHRV15Parms:
|
||||
|
||||
.include "vid_decl_rom_hires.s"
|
||||
|
||||
.include "vid_decl_rom_13.s"
|
||||
|
||||
ALIGN 2
|
||||
_sRsrc_RAMDsk:
|
||||
OSLstEntry sRsrcType,_RAMDskType /* video type descriptor */
|
||||
|
|
|
@ -0,0 +1,133 @@
|
|||
|
||||
ALIGN 2
|
||||
_M13_8Modes:
|
||||
OSLstEntry mVidParams,_M13_V8Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages8s /* number of video pages */
|
||||
DatLstEntry mDevType,clutType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_M13_V8Parms:
|
||||
.long _End_M13_V8Parms-_M13_V8Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word 640 /* physRowBytes ; vpRowBytes */
|
||||
.word defmBounds_Ts,defmBounds_Ls,480,640 /* 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 */
|
||||
_End_M13_V8Parms:
|
||||
ALIGN 2
|
||||
_M13_4Modes:
|
||||
OSLstEntry mVidParams,_M13_V4Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages4s /* number of video pages */
|
||||
DatLstEntry mDevType,clutType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_M13_V4Parms:
|
||||
.long _End_M13_V4Parms-_M13_V4Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word 320 /* physRowBytes ; vpRowBytes */
|
||||
.word defmBounds_Ts,defmBounds_Ls,480,640 /* 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 4 /* bmPixelSize */
|
||||
.word 1 /* bmCmpCount */
|
||||
.word 4 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_End_M13_V4Parms:
|
||||
ALIGN 2
|
||||
_M13_2Modes:
|
||||
OSLstEntry mVidParams,_M13_V2Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages2s /* number of video pages */
|
||||
DatLstEntry mDevType,clutType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_M13_V2Parms:
|
||||
.long _End_M13_V2Parms-_M13_V2Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word 160 /* physRowBytes ; vpRowBytes */
|
||||
.word defmBounds_Ts,defmBounds_Ls,480,640 /* 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 2 /* bmPixelSize */
|
||||
.word 1 /* bmCmpCount */
|
||||
.word 2 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_End_M13_V2Parms:
|
||||
ALIGN 2
|
||||
_M13_1Modes:
|
||||
OSLstEntry mVidParams,_M13_V1Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages1s /* number of video pages */
|
||||
DatLstEntry mDevType,clutType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_M13_V1Parms:
|
||||
.long _End_M13_V1Parms-_M13_V1Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word 80 /* physRowBytes ; vpRowBytes */
|
||||
.word defmBounds_Ts,defmBounds_Ls,480,640 /* 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 1 /* bmPixelSize */
|
||||
.word 1 /* bmCmpCount */
|
||||
.word 1 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_End_M13_V1Parms:
|
||||
ALIGN 2
|
||||
_M13_24Modes:
|
||||
OSLstEntry mVidParams,_M13_V24Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages24s /* number of video pages */
|
||||
DatLstEntry mDevType,directType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_M13_V24Parms:
|
||||
.long _End_M13_V24Parms-_M13_V24Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word 2560 /* physRowBytes ; vpRowBytes */
|
||||
.word defmBounds_Ts,defmBounds_Ls,480,640 /* vpBounds */
|
||||
.word defVersion /* bmVersion ; vpVersion */
|
||||
.word 0 /* packType not used ; vpPackType */
|
||||
.long 0 /* packSize not used ; vpPackSize */
|
||||
.long defmHRes /* bmHRes */
|
||||
.long defmVRes /* bmVRes */
|
||||
.word ChunkyDirect /* bmPixelType */
|
||||
.word 32 /* bmPixelSize */
|
||||
.word 3 /* bmCmpCount */
|
||||
.word 8 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_End_M13_V24Parms:
|
||||
ALIGN 2
|
||||
_M13_15Modes:
|
||||
OSLstEntry mVidParams,_M13_V15Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages15s /* number of video pages */
|
||||
DatLstEntry mDevType,directType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_M13_V15Parms:
|
||||
.long _End_M13_V15Parms-_M13_V15Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word 1280 /* physRowBytes ; vpRowBytes */
|
||||
.word defmBounds_Ts,defmBounds_Ls,480,640 /* vpBounds */
|
||||
.word defVersion /* bmVersion ; vpVersion */
|
||||
.word 0 /* packType not used ; vpPackType */
|
||||
.long 0 /* packSize not used ; vpPackSize */
|
||||
.long defmHRes /* bmHRes */
|
||||
.long defmVRes /* bmVRes */
|
||||
.word ChunkyDirect /* bmPixelType */
|
||||
.word 16 /* bmPixelSize */
|
||||
.word 3 /* bmCmpCount */
|
||||
.word 5 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_End_M13_V15Parms:
|
|
@ -0,0 +1,133 @@
|
|||
|
||||
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
|
||||
_HiRes4Modes:
|
||||
OSLstEntry mVidParams,_HRV4Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages4s /* number of video pages */
|
||||
DatLstEntry mDevType,clutType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_HRV4Parms:
|
||||
.long _EndHRV4Parms-_HRV4Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word RB4s /* 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 4 /* bmPixelSize */
|
||||
.word 1 /* bmCmpCount */
|
||||
.word 4 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_EndHRV4Parms:
|
||||
ALIGN 2
|
||||
_HiRes2Modes:
|
||||
OSLstEntry mVidParams,_HRV2Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages2s /* number of video pages */
|
||||
DatLstEntry mDevType,clutType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_HRV2Parms:
|
||||
.long _EndHRV2Parms-_HRV2Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word RB2s /* 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 2 /* bmPixelSize */
|
||||
.word 1 /* bmCmpCount */
|
||||
.word 2 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_EndHRV2Parms:
|
||||
ALIGN 2
|
||||
_HiRes1Modes:
|
||||
OSLstEntry mVidParams,_HRV1Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages1s /* number of video pages */
|
||||
DatLstEntry mDevType,clutType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_HRV1Parms:
|
||||
.long _EndHRV1Parms-_HRV1Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word RB1s /* 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 1 /* bmPixelSize */
|
||||
.word 1 /* bmCmpCount */
|
||||
.word 1 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_EndHRV1Parms:
|
||||
ALIGN 2
|
||||
_HiRes24Modes:
|
||||
OSLstEntry mVidParams,_HRV24Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages24s /* number of video pages */
|
||||
DatLstEntry mDevType,directType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_HRV24Parms:
|
||||
.long _EndHRV24Parms-_HRV24Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word RB24s /* 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 ChunkyDirect /* bmPixelType */
|
||||
.word 32 /* bmPixelSize */
|
||||
.word 3 /* bmCmpCount */
|
||||
.word 8 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_EndHRV24Parms:
|
||||
ALIGN 2
|
||||
_HiRes15Modes:
|
||||
OSLstEntry mVidParams,_HRV15Parms /* offset to vid parameters */
|
||||
DatLstEntry mPageCnt,Pages15s /* number of video pages */
|
||||
DatLstEntry mDevType,directType /* device type */
|
||||
.long EndOfList /* end of list */
|
||||
_HRV15Parms:
|
||||
.long _EndHRV15Parms-_HRV15Parms /* physical block size */
|
||||
.long defmBaseOffset /* QuickDraw base offset ; vpBaseOffset */
|
||||
.word RB15s /* 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 ChunkyDirect /* bmPixelType */
|
||||
.word 16 /* bmPixelSize */
|
||||
.word 3 /* bmCmpCount */
|
||||
.word 5 /* bmCmpSize */
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_EndHRV15Parms:
|
|
@ -97,14 +97,17 @@ typedef volatile unsigned int u_int32_t;
|
|||
#define FUN_DONE (1<<FUN_DONE_BIT)
|
||||
|
||||
struct goblin_bt_regs {
|
||||
u_int32_t mode;
|
||||
u_int32_t mode; /* 0x0 */
|
||||
u_int32_t vbl_mask;
|
||||
u_int32_t videoctrl;
|
||||
u_int32_t intr_clear;
|
||||
u_int32_t reset;
|
||||
u_int32_t reset; /* 0x10 */
|
||||
u_int32_t lut_addr;
|
||||
u_int32_t lut;
|
||||
u_int32_t debug;
|
||||
u_int32_t cursor_lut; /* 0x20 */
|
||||
u_int32_t cursor_xy; /* 0x24 */
|
||||
/* ... : 7 resv then 6 vres/hres for windowboxed resolution */
|
||||
};
|
||||
|
||||
enum goblin_bt_mode {
|
||||
|
|
|
@ -57,6 +57,11 @@ class FBVideoTimingGenerator(Module, AutoCSR):
|
|||
self._vsync_end = CSRStorage(vbits, vt["v_active"] + vt["v_sync_offset"] + vt["v_sync_width"])
|
||||
self._vscan = CSRStorage(vbits, vt["v_active"] + vt["v_blanking"])
|
||||
|
||||
self._hres_start = Signal(hbits, reset = 0)
|
||||
self._hres_end = Signal(hbits, reset = vt["h_active"])
|
||||
self._vres_start = Signal(hbits, reset = 0)
|
||||
self._vres_end = Signal(hbits, reset = vt["v_active"])
|
||||
|
||||
# Video Timing Source
|
||||
if (hwcursor):
|
||||
self.source = source = stream.Endpoint(video_timing_hwcursor_layout)
|
||||
|
@ -91,6 +96,15 @@ class FBVideoTimingGenerator(Module, AutoCSR):
|
|||
self.specials += MultiReg(self._vsync_end.storage, vsync_end)
|
||||
self.specials += MultiReg(self._vscan.storage, vscan)
|
||||
|
||||
self.hres_start = hres_start = Signal(hbits)
|
||||
self.hres_end = hres_end = Signal(hbits)
|
||||
self.vres_start = vres_start = Signal(vbits)
|
||||
self.vres_end = vres_end = Signal(vbits)
|
||||
self.specials += MultiReg(self._hres_start, hres_start)
|
||||
self.specials += MultiReg(self._hres_end, hres_end)
|
||||
self.specials += MultiReg(self._vres_start, vres_start)
|
||||
self.specials += MultiReg(self._vres_end, vres_end)
|
||||
|
||||
# Generate timings.
|
||||
hactive = Signal()
|
||||
vactive = Signal()
|
||||
|
@ -116,8 +130,8 @@ class FBVideoTimingGenerator(Module, AutoCSR):
|
|||
# Increment HCount.
|
||||
NextValue(source.hcount, source.hcount + 1),
|
||||
# Generate HActive / HSync.
|
||||
If(source.hcount == 0, NextValue(hactive, 1)), # Start of HActive.
|
||||
If(source.hcount == hres, NextValue(hactive, 0)), # End of HActive.
|
||||
If(source.hcount == hres_start, NextValue(hactive, 1)), # Start of HActive.
|
||||
If(source.hcount == hres_end, NextValue(hactive, 0)), # End of HActive.
|
||||
If(source.hcount == hsync_start, NextValue(source.hsync, 1)), # Start of HSync.
|
||||
If(source.hcount == hsync_end, NextValue(source.hsync, 0)), # End of HSync.
|
||||
# End of HScan.
|
||||
|
@ -127,8 +141,8 @@ class FBVideoTimingGenerator(Module, AutoCSR):
|
|||
# Increment VCount.
|
||||
NextValue(source.vcount, source.vcount + 1),
|
||||
# Generate VActive / VSync.
|
||||
If(source.vcount == 0, NextValue(vactive, 1)), # Start of VActive.
|
||||
If(source.vcount == vres, NextValue(vactive, 0)), # End of HActive.
|
||||
If(source.vcount == vres_start, NextValue(vactive, 1)), # Start of VActive.
|
||||
If(source.vcount == vres_end, NextValue(vactive, 0)), # End of HActive.
|
||||
If(source.vcount == vsync_start, NextValue(source.vsync, 1)), # Start of VSync.
|
||||
If(source.vcount == vsync_end, NextValue(source.vsync, 0)), # End of VSync.
|
||||
# End of VScan.
|
||||
|
@ -141,10 +155,19 @@ class FBVideoTimingGenerator(Module, AutoCSR):
|
|||
)
|
||||
|
||||
|
||||
# fixme: likely more efficient to have two bits (X, Y) to check if we're in the area, rather than two compare...
|
||||
# could also handle the offsets w/o two subtractions
|
||||
# but how to deal with changing value ??? copy them at the beginning of frame ?
|
||||
if (hwcursor):
|
||||
self.sync += source.hwcursor.eq((source.hcount >= _hwcursor_x) &
|
||||
(source.hcount < (_hwcursor_x+32)) &
|
||||
(source.vcount >= _hwcursor_y) &
|
||||
(source.vcount < (_hwcursor_y+32)))
|
||||
self.sync += source.hwcursorx.eq(_hwcursor_x - source.hcount)
|
||||
self.sync += source.hwcursory.eq(_hwcursor_y - source.vcount)
|
||||
h_offset = Signal(hbits)
|
||||
v_offset = Signal(vbits)
|
||||
self.comb += [
|
||||
h_offset.eq(source.hcount - hres_start),
|
||||
v_offset.eq(source.vcount - vres_start),
|
||||
]
|
||||
self.sync += source.hwcursor.eq((h_offset >= _hwcursor_x) &
|
||||
(h_offset < (_hwcursor_x+32)) &
|
||||
(v_offset >= _hwcursor_y) &
|
||||
(v_offset < (_hwcursor_y+32)))
|
||||
self.sync += source.hwcursorx.eq(_hwcursor_x - h_offset)
|
||||
self.sync += source.hwcursory.eq(_hwcursor_y - v_offset)
|
||||
|
|
|
@ -46,7 +46,7 @@ class VideoFrameBufferMultiDepth(Module, AutoCSR):
|
|||
|
||||
vga_sync = getattr(self.sync, clock_domain)
|
||||
|
||||
npixels = hres * vres
|
||||
npixels = hres * vres # default to max
|
||||
|
||||
# if 0, 32-bits mode
|
||||
# should only be changed while in reset
|
||||
|
@ -144,9 +144,6 @@ class VideoFrameBufferMultiDepth(Module, AutoCSR):
|
|||
fifo_depth = fifo_depth//(dram_port.data_width//8),
|
||||
default_base = base,
|
||||
default_length = npixels)
|
||||
##self.submodules.fb_dma = ResetInserter()(self._fb_dma)
|
||||
##self.fb_dma_reset = Signal(reset = 0)
|
||||
##self.comb += self.fb_dma.reset.eq(self.fb_dma_reset)
|
||||
|
||||
# If DRAM Data Width > 8-bit and Video clock is faster than sys_clk:
|
||||
# actually always use that case to simplify the design
|
||||
|
@ -424,8 +421,6 @@ class goblin(Module, AutoCSR):
|
|||
endian = endian,
|
||||
)
|
||||
setattr(self.submodules, name, vfb)
|
||||
##dma_reset = Signal(reset = 0)
|
||||
##self.comb += self.video_framebuffer.fb_dma_reset.eq(dma_reset)
|
||||
|
||||
# Connect Video Timing Generator to Video FrameBuffer.
|
||||
self.comb += vtg.source.connect(vfb.vtg_sink)
|
||||
|
@ -446,6 +441,8 @@ class goblin(Module, AutoCSR):
|
|||
if (hwcursor):
|
||||
hwcursor_x = Signal(12)
|
||||
hwcursor_y = Signal(12)
|
||||
# HW cursor lut in reg 0x20
|
||||
# HW cursor XY in reg 0x24
|
||||
self.comb += vtg.hwcursor_x.eq(hwcursor_x)
|
||||
self.comb += vtg.hwcursor_y.eq(hwcursor_y)
|
||||
handle_hwcursor = [ NextValue(hwcursor_x, bus.dat_w[16:28]), # FIXME: endianess
|
||||
|
@ -455,15 +452,20 @@ class goblin(Module, AutoCSR):
|
|||
handle_hwcursor = [ ]
|
||||
|
||||
# current cmap logic for the goblin, similar to the cg6, minus the HW cursor
|
||||
|
||||
bt_mode = Signal(8, reset = 0x3) # bit depth is 2^x ; 0x10 is direct mode (32 bits)
|
||||
bt_addr = Signal(8, reset = 0)
|
||||
bt_cmap_state = Signal(2, reset = 0)
|
||||
m_vbl_disable = Signal(reset = 1)
|
||||
bt_mode = Signal(8, reset = 0x3) # bit depth is 2^x ; 0x10 is direct mode (32 bits) # reg 0x0
|
||||
bt_addr = Signal(8, reset = 0) # reg 0x14 ; lut itself in reg 0x18
|
||||
bt_cmap_state = Signal(2, reset = 0)
|
||||
m_vbl_disable = Signal(reset = 1) # reg 0x4
|
||||
|
||||
videoctrl = Signal()
|
||||
# for sub-resolution
|
||||
hres_start = Signal(hbits, reset = 0)
|
||||
hres_end = Signal(hbits, reset = hres)
|
||||
vres_start = Signal(vbits, reset = 0)
|
||||
vres_end = Signal(vbits, reset = vres)
|
||||
|
||||
videoctrl = Signal() # reg 0x8
|
||||
|
||||
vbl_signal = Signal(reset = 0)
|
||||
vbl_signal = Signal(reset = 0) # reg 0xC
|
||||
self.comb += irq_line.eq(~vbl_signal | m_vbl_disable) # active low
|
||||
|
||||
if (endian == "big"):
|
||||
|
@ -490,7 +492,7 @@ class goblin(Module, AutoCSR):
|
|||
0x2: [ NextValue(videoctrl, bus.dat_w[low_bit]), ],
|
||||
# clear irq
|
||||
0x3: [ NextValue(vbl_signal, 0), ],
|
||||
# 0x4: rest in SW
|
||||
# 0x4: reset in SW
|
||||
# gobofb_lut_addr
|
||||
0x5: [ NextValue(bt_addr, bus.dat_w[low_byte]),
|
||||
NextValue(bt_cmap_state, 0),
|
||||
|
@ -522,8 +524,15 @@ class goblin(Module, AutoCSR):
|
|||
],
|
||||
# hw cursor x/y
|
||||
0x9: [ *handle_hwcursor ],
|
||||
# resolution handling
|
||||
# 0x10: hres (r/o)
|
||||
# 0x11: vres (r/o)
|
||||
0x12: [ NextValue(hres_start, bus.dat_w), ], # hres_start
|
||||
0x13: [ NextValue(vres_start, bus.dat_w), ], # vres_start
|
||||
0x14: [ NextValue(hres_end, bus.dat_w), ], # hres_end
|
||||
0x15: [ NextValue(vres_end, bus.dat_w), ], # vres_end
|
||||
}),
|
||||
Case(bus.adr[5:18], {
|
||||
Case(bus.adr[5:18], { # mask and bits in registers from 0x80 and 0x100
|
||||
"default": [], # fixme: hwcursor for 0x1/0x2
|
||||
0x1 : [ upd_overlay_fifo.we.eq(1), # 1*32 = 32..63 / 0x20..0x3F
|
||||
upd_overlay_fifo.din.eq(Cat(Signal(1, reset = 0), 31-bus.adr[0:5], bus.dat_w)) # FIXME: endianess
|
||||
|
@ -539,6 +548,12 @@ class goblin(Module, AutoCSR):
|
|||
0x0: [ NextValue(bus.dat_r[low_byte], bt_mode), ],
|
||||
0x2: [ NextValue(bus.dat_r[low_byte], videoctrl), ],
|
||||
"default": [ NextValue(bus.dat_r, 0xDEADBEEF)],
|
||||
0x10: [ NextValue(bus.dat_r, hres), ], # hres (r/o) # FIXME: endianess
|
||||
0x11: [ NextValue(bus.dat_r, vres), ], # vres (r/o) # FIXME: endianess
|
||||
0x12: [ NextValue(bus.dat_r, hres_start), ], # hres_start # FIXME: endianess
|
||||
0x13: [ NextValue(bus.dat_r, vres_start), ], # vres_start # FIXME: endianess
|
||||
0x14: [ NextValue(bus.dat_r, hres_end), ], # hres_end # FIXME: endianess
|
||||
0x15: [ NextValue(bus.dat_r, vres_end), ], # vres_end # FIXME: endianess
|
||||
}),
|
||||
NextValue(bus.ack, 1),
|
||||
).Else(
|
||||
|
@ -546,12 +561,22 @@ class goblin(Module, AutoCSR):
|
|||
),
|
||||
)
|
||||
# mode switch logic
|
||||
npixels = hres * vres
|
||||
#npixels = hres * vres
|
||||
npixels = Signal(hbits + vbits +1, reset = (hres * vres))
|
||||
old_bt_mode = Signal(8) # different from bt_mode
|
||||
in_reset = Signal()
|
||||
post_reset_ctr = Signal(3)
|
||||
previous_videoctrl = Signal()
|
||||
|
||||
old_vres_end = Signal(vbits, reset = vres)
|
||||
|
||||
hwidth = Signal(hbits)
|
||||
vheight = Signal(vbits)
|
||||
self.sync += [
|
||||
hwidth.eq(hres_end - hres_start),
|
||||
vheight.eq(vres_end - vres_start),
|
||||
npixels.eq(hwidth * vheight),
|
||||
]
|
||||
if (truecolor):
|
||||
handle_truecolor_bit = [ self.video_framebuffer.use_indexed.eq(~bt_mode[4:5]) ]
|
||||
else:
|
||||
|
@ -559,33 +584,35 @@ class goblin(Module, AutoCSR):
|
|||
|
||||
# this has grown complicated and should be a FSM...
|
||||
self.sync += [ old_bt_mode.eq(bt_mode),
|
||||
If(old_bt_mode != bt_mode,
|
||||
old_vres_end.eq(vres_end),
|
||||
If((old_bt_mode != bt_mode) | (old_vres_end != vres_end),
|
||||
in_reset.eq(1),
|
||||
videoctrl.eq(0), # start a disabling cycle, or stay disabled
|
||||
previous_videoctrl.eq(videoctrl), # preserve old state for restoration later
|
||||
),
|
||||
If(in_reset & ~vtg_enable, # we asked for a reset and by now, the VTG has been turned off (or was off) so we reset the DMA and change the parameters
|
||||
##dma_reset.eq(1), # hpefully this will clear the FIFO as well
|
||||
self.video_framebuffer.indexed_mode.eq(bt_mode[0:2]), # & ~(Replicate(bt_mode[4:5], 2))
|
||||
If(in_reset & ~vtg_enable, # we asked for a reset and by now, the VTG has been turned off (or was off)
|
||||
self.video_framebuffer.indexed_mode.eq(bt_mode[0:2]),
|
||||
*handle_truecolor_bit,
|
||||
in_reset.eq(0),
|
||||
post_reset_ctr.eq(7),
|
||||
# reconfigure the VTG
|
||||
vtg._hres_start.eq(hres_start),
|
||||
vtg._hres_end.eq( hres_end),
|
||||
vtg._vres_start.eq(vres_start),
|
||||
vtg._vres_end.eq( vres_end),
|
||||
),
|
||||
##If(post_reset_ctr == 5, # take DMA out of reset
|
||||
## dma_reset.eq(0),
|
||||
##),
|
||||
If(post_reset_ctr == 4, # now reconfigure the DMA
|
||||
If(bt_mode[4:5],
|
||||
Case(bt_mode[0:2], { # fixme: truecolor
|
||||
0x0: self.video_framebuffer.fb_dma.length.eq(npixels * 4),
|
||||
0x1: self.video_framebuffer.fb_dma.length.eq(npixels * 2),
|
||||
Case(bt_mode[0:2], {
|
||||
0x0: self.video_framebuffer.fb_dma.length.eq(npixels << 2),
|
||||
0x1: self.video_framebuffer.fb_dma.length.eq(npixels << 1),
|
||||
}),
|
||||
).Else(
|
||||
Case(bt_mode[0:2], {
|
||||
3: self.video_framebuffer.fb_dma.length.eq(npixels ),
|
||||
2: self.video_framebuffer.fb_dma.length.eq(npixels//2),
|
||||
1: self.video_framebuffer.fb_dma.length.eq(npixels//4),
|
||||
0: self.video_framebuffer.fb_dma.length.eq(npixels//8),
|
||||
3: self.video_framebuffer.fb_dma.length.eq(npixels ),
|
||||
2: self.video_framebuffer.fb_dma.length.eq(npixels >> 1),
|
||||
1: self.video_framebuffer.fb_dma.length.eq(npixels >> 2),
|
||||
0: self.video_framebuffer.fb_dma.length.eq(npixels >> 3),
|
||||
}),
|
||||
),
|
||||
),
|
||||
|
|
Loading…
Reference in New Issue