preliminary windowed resolution (640x480 for the moment)

This commit is contained in:
Romain Dolbeau 2022-09-17 14:44:26 +02:00
parent ce88b7c264
commit 06637bbd5d
11 changed files with 603 additions and 326 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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 */

View File

@ -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:

View File

@ -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:

View File

@ -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 {

View File

@ -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)

View File

@ -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),
}),
),
),