diff --git a/nubus-to-ztex-gateware/DeclROM/DepVideo.inc b/nubus-to-ztex-gateware/DeclROM/DepVideo.inc index 64d66ec..f36eebe 100644 --- a/nubus-to-ztex-gateware/DeclROM/DepVideo.inc +++ b/nubus-to-ztex-gateware/DeclROM/DepVideo.inc @@ -6,6 +6,8 @@ defMinorBase = 0 /* beginning */ defMinorLength = 0x200000 /* 2048 KiB */ Pages8s = 1 +Pages4s = 1 +Pages2s = 1 Pages1s = 1 defmBounds_Ls = 0 @@ -17,6 +19,8 @@ defScrnRow = HRES /* row bytes */ RB8s = HRES +RB4s = HRES/2 +RB2s = HRES/4 RB1s = HRES/8 DrHwNuBusFPGA = 0xBEEF /* placeholder */ diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c index 4c68fa3..52fcc47 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c @@ -116,7 +116,7 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) { VDPageInfo *vPInfo = (VDPageInfo *)*(long *)pb->csParam; dStore->curMode = firstVidMode; - dStore->curDepth = kDepthMode1; + dStore->curDepth = kDepthMode1; /* 8-bit */ vPInfo->csMode = firstVidMode; vPInfo->csPage = 0; vPInfo->csBaseAddr = 0; @@ -140,6 +140,18 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) SwapMMUMode ( &busMode ); break; case secondVidMode: + dStore->curMode = secondVidMode; + SwapMMUMode ( &busMode ); + write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_4BIT); + SwapMMUMode ( &busMode ); + break; + case thirdVidMode: + dStore->curMode = secondVidMode; + SwapMMUMode ( &busMode ); + write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_2BIT); + SwapMMUMode ( &busMode ); + break; + case fourthVidMode: dStore->curMode = secondVidMode; SwapMMUMode ( &busMode ); write_reg(dce, GOBOFB_MODE, GOBOFB_MODE_1BIT); @@ -244,60 +256,32 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) break; case cscGrayPage: /* 5 == cscGrayScreen */ { - /* FIXME: TODO */ VDPageInfo *vPInfo = (VDPageInfo *)*(long *)pb->csParam; + const uint8_t idx = dStore->curMode % 4; // checkme + const UInt32 a32 = dce->dCtlDevBase; + UInt32 a32_l0, a32_l1; + UInt32 a32_4p0, a32_4p1; + const uint32_t wb = HRES >> idx; + unsigned short j, i; if (vPInfo->csPage != 0) return paramErr; - + SwapMMUMode ( &busMode ); - - switch (dStore->curMode) { - case firstVidMode: // 8bpp - { - /* grey the screen */ - UInt32 a32 = dce->dCtlDevBase; - UInt32 a32_l0, a32_l1; - UInt32 a32_4p0, a32_4p1; - short j, i; - a32_l0 = a32; - a32_l1 = a32 + HRES; - for (j = 0 ; j < VRES ; j+= 2) { - a32_4p0 = a32_l0; - a32_4p1 = a32_l1; - for (i = 0 ; i < HRES ; i += 4) { - *((UInt32*)a32_4p0) = 0xFF00FF00; - *((UInt32*)a32_4p1) = 0x00FF00FF; - a32_4p0 += 4; - a32_4p1 += 4; - } - a32_l0 += 2*HRES; - a32_l1 += 2*HRES; - } - } break; - case secondVidMode: // 1bpp - { - /* grey the screen */ - UInt32 a32 = dce->dCtlDevBase; - UInt32 a32_l0, a32_l1; - UInt32 a32_4p0, a32_4p1; - short j, i; - a32_l0 = a32; - a32_l1 = a32 + HRES/8; - for (j = 0 ; j < VRES ; j+= 2) { - a32_4p0 = a32_l0; - a32_4p1 = a32_l1; - for (i = 0 ; i < HRES/8 ; i += 4) { - *((UInt32*)a32_4p0) = 0xAAAAAAAA; - *((UInt32*)a32_4p1) = 0x55555555; - a32_4p0 += 4; - a32_4p1 += 4; - } - a32_l0 += 2*HRES/8; - a32_l1 += 2*HRES/8; - } - } break; + /* grey the screen */ + a32_l0 = a32; + a32_l1 = a32 + wb; + for (j = 0 ; j < VRES ; j+= 2) { + a32_4p0 = a32_l0; + a32_4p1 = a32_l1; + for (i = 0 ; i < wb ; i += 4) { + *((UInt32*)a32_4p0) = 0xFF00FF00; + *((UInt32*)a32_4p1) = 0x00FF00FF; + a32_4p0 += 4; + a32_4p1 += 4; + } + a32_l0 += 2*wb; + a32_l1 += 2*wb; } - SwapMMUMode ( &busMode ); ret = noErr; @@ -350,6 +334,16 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) 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 ); diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c index c1d6eed..c6c8b59 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c @@ -73,6 +73,10 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) break; case secondVidMode: break; + case thirdVidMode: + break; + case fourthVidMode: + break; default: return paramErr; } @@ -198,11 +202,11 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) break; case kDisplayModeIDFindFirstResolution: vdres->csDisplayModeID = firstVidMode; - vdres->csMaxDepthMode = kDepthMode2; + vdres->csMaxDepthMode = kDepthMode4; break; case kDisplayModeIDCurrent: vdres->csDisplayModeID = firstVidMode; - vdres->csMaxDepthMode = kDepthMode2; + vdres->csMaxDepthMode = kDepthMode4; break; default: return paramErr; @@ -219,7 +223,9 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) (vdparam->csDisplayModeID != kDisplayModeIDCurrent)) return paramErr; if ((vdparam->csDepthMode != kDepthMode1) && - (vdparam->csDepthMode != kDepthMode2)) + (vdparam->csDepthMode != kDepthMode2) && + (vdparam->csDepthMode != kDepthMode3) && + (vdparam->csDepthMode != kDepthMode4)) return paramErr; VPBlock* vpblock = vdparam->csVPBlockPtr; /* basically the same as the EBVParms ? */ @@ -242,6 +248,14 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) vpblock->vpCmpCount = 1; vpblock->vpCmpSize = 8; } else if (vdparam->csDepthMode == kDepthMode2) { + vpblock->vpPixelSize = 4; + vpblock->vpCmpCount = 1; + vpblock->vpCmpSize = 4; + } else if (vdparam->csDepthMode == kDepthMode3) { + vpblock->vpPixelSize = 2; + vpblock->vpCmpCount = 1; + vpblock->vpCmpSize = 2; + } else if (vdparam->csDepthMode == kDepthMode4) { vpblock->vpPixelSize = 1; vpblock->vpCmpCount = 1; vpblock->vpCmpSize = 1; diff --git a/nubus-to-ztex-gateware/DeclROM/vid_decl_rom.s b/nubus-to-ztex-gateware/DeclROM/vid_decl_rom.s index 3b5dbfd..1f4e8b9 100644 --- a/nubus-to-ztex-gateware/DeclROM/vid_decl_rom.s +++ b/nubus-to-ztex-gateware/DeclROM/vid_decl_rom.s @@ -96,7 +96,9 @@ _sRsrc_VidHiRes: /* OSLstEntry sGammaDir,_GammaDirS /* directory for 640x480 monitor */ /* Parameters */ OSLstEntry firstVidMode,_HiRes8Modes /* offset to 8 Bit Mode parms */ - OSLstEntry secondVidMode,_HiRes1Modes /* offset to 1 Bit Mode parms */ + OSLstEntry secondVidMode,_HiRes4Modes /* offset to 4 Bit Mode parms */ + OSLstEntry thirdVidMode,_HiRes2Modes /* offset to 2 Bit Mode parms */ + OSLstEntry fourthVidMode,_HiRes1Modes /* offset to 1 Bit Mode parms */ .long EndOfList /* end of list */ ALIGN 2 @@ -181,6 +183,50 @@ _HRV8Parms: .long defmPlaneBytes /* bmPlaneBytes */ _EndHRV8Parms: ALIGN 2 +_HiRes4Modes: + OSLstEntry mVidParams,_HRV4Parms /* offset to vid parameters */ + DatLstEntry mPageCnt,Pages4s /* number of video pages */ + DatLstEntry mDevType,defmDevType /* 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,defmDevType /* 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 */ diff --git a/nubus-to-ztex-gateware/goblin_fb.py b/nubus-to-ztex-gateware/goblin_fb.py index 90ecc54..bd9d8da 100644 --- a/nubus-to-ztex-gateware/goblin_fb.py +++ b/nubus-to-ztex-gateware/goblin_fb.py @@ -200,8 +200,10 @@ class VideoFrameBufferMultiDepth(Module, AutoCSR): If(self.use_indexed, Case(self.indexed_mode, { 0x3: [ self.cdc.source.connect(self.conv8.sink), ], - 0x2: [ self.cdc.source.connect(self.conv4.sink), ], - 0x1: [ self.cdc.source.connect(self.conv2.sink), ], + 0x2: [ self.cdc.source.connect(self.conv4.sink, omit={"data"}), + *[ self.conv4.sink.data[xbyte*8 + xbit*4:xbyte*8 + xbit*4+4].eq(self.cdc.source.data[xbyte*8 + 4-xbit*4:xbyte*8 + 4-xbit*2+4]) for xbit in range(0,2) for xbyte in range(0, dram_port.data_width//8) ], ], + 0x1: [ self.cdc.source.connect(self.conv2.sink, omit={"data"}), + *[ self.conv2.sink.data[xbyte*8 + xbit*2:xbyte*8 + xbit*2+2].eq(self.cdc.source.data[xbyte*8 + 6-xbit*2:xbyte*8 + 6-xbit*2+2]) for xbit in range(0,4) for xbyte in range(0, dram_port.data_width//8) ], ], 0x0: [ self.cdc.source.connect(self.conv1.sink, omit={"data"}), *[ self.conv1.sink.data[xbyte*8 + xbit].eq(self.cdc.source.data[xbyte*8 + 7-xbit]) for xbit in range(0,8) for xbyte in range(0, dram_port.data_width//8) ], ],