From 06637bbd5d0cebbfee94f78b26ae22db83cd1209 Mon Sep 17 00:00:00 2001 From: Romain Dolbeau Date: Sat, 17 Sep 2022 14:44:26 +0200 Subject: [PATCH] preliminary windowed resolution (640x480 for the moment) --- .../DeclROM/NuBusFPGADrvr.h | 10 +- .../DeclROM/NuBusFPGADrvr_Ctrl.c | 181 ++++++++------- .../DeclROM/NuBusFPGADrvr_OpenClose.c | 4 + .../DeclROM/NuBusFPGADrvr_Status.c | 101 ++++++-- .../DeclROM/NuBusFPGAPrimaryInit_Primary.c | 11 + nubus-to-ztex-gateware/DeclROM/vid_decl_rom.s | 219 ++++-------------- .../DeclROM/vid_decl_rom_13.s | 133 +++++++++++ .../DeclROM/vid_decl_rom_hires.s | 133 +++++++++++ nubus-to-ztex-gateware/blit_goblin.c | 7 +- nubus-to-ztex-gateware/fb_video.py | 43 +++- nubus-to-ztex-gateware/goblin_fb.py | 87 ++++--- 11 files changed, 603 insertions(+), 326 deletions(-) create mode 100644 nubus-to-ztex-gateware/DeclROM/vid_decl_rom_13.s create mode 100644 nubus-to-ztex-gateware/DeclROM/vid_decl_rom_hires.s diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr.h b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr.h index 795df84..865dc7b 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr.h +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr.h @@ -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; diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c index dc93585..8f42924 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c @@ -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<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; } diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_OpenClose.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_OpenClose.c index 4933408..7f3ffd3 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_OpenClose.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_OpenClose.c @@ -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); diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c index 75a7b20..3b7579e 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c @@ -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<csConnectFlags = (1<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<csTimingFormat = kDeclROMtables;//kDetailedTimingFormat; + vdtim->csTimingData = 0; + vdtim->csTimingFlags = 1<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; diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGAPrimaryInit_Primary.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGAPrimaryInit_Primary.c index c3ade5d..c65fa8a 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGAPrimaryInit_Primary.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGAPrimaryInit_Primary.c @@ -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 diff --git a/nubus-to-ztex-gateware/DeclROM/vid_decl_rom.s b/nubus-to-ztex-gateware/DeclROM/vid_decl_rom.s index 990e353..5d1f093 100644 --- a/nubus-to-ztex-gateware/DeclROM/vid_decl_rom.s +++ b/nubus-to-ztex-gateware/DeclROM/vid_decl_rom.s @@ -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 /* */ @@ -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 */ diff --git a/nubus-to-ztex-gateware/DeclROM/vid_decl_rom_13.s b/nubus-to-ztex-gateware/DeclROM/vid_decl_rom_13.s new file mode 100644 index 0000000..3540f88 --- /dev/null +++ b/nubus-to-ztex-gateware/DeclROM/vid_decl_rom_13.s @@ -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: diff --git a/nubus-to-ztex-gateware/DeclROM/vid_decl_rom_hires.s b/nubus-to-ztex-gateware/DeclROM/vid_decl_rom_hires.s new file mode 100644 index 0000000..f47d7c8 --- /dev/null +++ b/nubus-to-ztex-gateware/DeclROM/vid_decl_rom_hires.s @@ -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: diff --git a/nubus-to-ztex-gateware/blit_goblin.c b/nubus-to-ztex-gateware/blit_goblin.c index bc71680..874d8cd 100644 --- a/nubus-to-ztex-gateware/blit_goblin.c +++ b/nubus-to-ztex-gateware/blit_goblin.c @@ -97,14 +97,17 @@ typedef volatile unsigned int u_int32_t; #define FUN_DONE (1<= _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) diff --git a/nubus-to-ztex-gateware/goblin_fb.py b/nubus-to-ztex-gateware/goblin_fb.py index 15faf26..32dd954 100644 --- a/nubus-to-ztex-gateware/goblin_fb.py +++ b/nubus-to-ztex-gateware/goblin_fb.py @@ -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), }), ), ),