From 6943a54854899a22064901020f5d85a6e072b3ae Mon Sep 17 00:00:00 2001 From: Romain Dolbeau Date: Wed, 5 Oct 2022 22:41:27 +0200 Subject: [PATCH] C-ify iodone, irq --- .../DeclROM/NuBusFPGADrvr.s | 26 ----------- .../DeclROM/NuBusFPGADrvr_Ctrl.c | 32 ++++++++----- .../DeclROM/NuBusFPGADrvr_OpenClose.c | 23 +++++++++- .../DeclROM/NuBusFPGADrvr_Status.c | 45 +++++++++++++------ .../DeclROM/NuBusFPGARAMDskDrvr.s | 13 +----- .../DeclROM/NuBusFPGARAMDskDrvr_Ctrl.c | 2 + .../DeclROM/NuBusFPGARAMDskDrvr_Prime.c | 3 ++ .../DeclROM/NuBusFPGARAMDskDrvr_Status.c | 2 + 8 files changed, 81 insertions(+), 65 deletions(-) diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr.s b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr.s index ca8a108..12924aa 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr.s +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr.s @@ -36,8 +36,6 @@ _NuBusFPGACtl: jsr cNuBusFPGACtl MOVE.L (%A7)+, %a0 MOVE.L (%A7)+, %a1 - BTST #9,%a0@(ioTrap) /* noQueueBit is 9 */ - BEQ.S _GoIODone rts _NuBusFPGAStatus: @@ -46,8 +44,6 @@ _NuBusFPGAStatus: jsr cNuBusFPGAStatus MOVE.L (%A7)+, %a0 MOVE.L (%A7)+, %a1 - BTST #9,%a0@(ioTrap) /* noQueueBit is 9 */ - BEQ.S _GoIODone rts _NuBusFPGAClose: @@ -57,12 +53,6 @@ _NuBusFPGAClose: MOVE.L (%A7)+, %a0 MOVE.L (%A7)+, %a1 rts - -_GoIODone: - /* MOVEA.L JIODone,%A0 */ - /* JMP (%A0) */ - movel JIODone,%sp@- - rts .include "NuBusFPGADrvr_OpenClose.s" .text @@ -71,20 +61,4 @@ _GoIODone: .include "NuBusFPGADrvr_Status.s" .text - ALIGN 2 -interruptRoutine: - moveal %a1,%a0 - addal #0x0090000c,%a0 /* FIXME */ - MOVEQ #1,%D0 - _SwapMMUMode - clrb %a0@ /* we only need to write */ - _SwapMMUMode - movel %a1,%d0 - roll #8,%d0 - andiw #15,%d0 - moveal 0xd28,%a0 /* JVBLTask */ - jsr (%a0) - moveq #1,%d0 - rts - ALIGN 2 diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c index 6fedda4..a1a42fc 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Ctrl.c @@ -78,13 +78,12 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) NuBusFPGADriverGlobalsHdl dStoreHdl = (NuBusFPGADriverGlobalsHdl)dce->dCtlStorage; NuBusFPGADriverGlobalsPtr dStore = *dStoreHdl; - short ret = -1; + short ret = noErr; char busMode = 1; /* write_reg(dce, GOBOFB_DEBUG, 0xBEEF0001); */ /* write_reg(dce, GOBOFB_DEBUG, pb->csCode); */ - -#if 1 + switch (pb->csCode) { case -1: @@ -171,16 +170,19 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) if (gammaTbl == NULL) { linearGamma(dStore); } else { + ret = noErr; if (gammaTbl->gDataWidth != 8) - return paramErr; + ret = paramErr; if (gammaTbl->gDataCnt != 256) // 8-bits - return paramErr; + ret = paramErr; if ((gammaTbl->gChanCnt != 1) && (gammaTbl->gChanCnt != 3)) - return paramErr; + ret = paramErr; if ((gammaTbl->gType != 0) && (gammaTbl->gType != 0xFFFFBEEF)) - return paramErr; + ret = paramErr; if (gammaTbl->gFormulaSize != 0) - return paramErr; + ret = paramErr; + if (ret != noErr) + goto done; dStore->gamma.gVersion = gammaTbl->gVersion; dStore->gamma.gType = gammaTbl->gType; @@ -215,8 +217,10 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) const uint32_t wb = dStore->hres[0] >> idx; unsigned short j, i; short npage = (vPInfo->csMode == kDepthMode5) ? 1 : 2; - if (vPInfo->csPage >= npage) + if (vPInfo->csPage >= npage) { return paramErr; + goto done; + } a32 += vPInfo->csPage * 1024 * 1024 * 4; /* fixme */ @@ -297,7 +301,7 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) case cscDirectSetEntries: /* 0x8 */ asm volatile(".word 0xfe16\n"); - return controlErr; + ret = controlErr; break; case cscSetDefaultMode: /* 0x9 */ @@ -351,7 +355,11 @@ OSErr cNuBusFPGACtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) ret = controlErr; break; } -#endif + + done: + if (!(pb->ioTrap & (1<dCtlStorage; NuBusFPGADriverGlobalsPtr dStore = *dStoreHdl; const short npage = (depth == kDepthMode5) ? 1 : 2; - OSErr err = noErr; + OSErr err = -1; char busMode = 1; /* write_reg(dce, GOBOFB_DEBUG, 0xBEEF0031); */ diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_OpenClose.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_OpenClose.c index 9da6e30..1d441a9 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_OpenClose.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_OpenClose.c @@ -2,6 +2,20 @@ #include "ROMDefs.h" +typedef void(*vblproto)(short); + +#pragma parameter __D0 fbIrq(__A1) +short fbIrq(const long sqParameter){ + /* AuxDCEPtr dce = (AuxDCEPtr)sqParameter; */ + /* NuBusFPGADriverGlobalsHdl dStoreHdl = (NuBusFPGADriverGlobalsHdl)dce->dCtlStorage; */ + /* NuBusFPGADriverGlobalsPtr dStore = *dStoreHdl; */ + vblproto myVbl = *(vblproto**)0x0d28; + /* write_reg(dce, GOBOFB_INTR_CLEAR, 0); */ + *((volatile unsigned int*)(sqParameter+GOBOFB_BASE+GOBOFB_INTR_CLEAR)) = 0; + myVbl((sqParameter>>24)&0xf); + return 1; +} + OSErr cNuBusFPGAOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) { OSErr ret = noErr; @@ -46,10 +60,17 @@ OSErr cNuBusFPGAOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) siqel->sqType = sIQType; siqel->sqPrio = 8; //siqel->sqAddr = interruptRoutine; + /* not sure how to get the proper result in C... */ + /* SlotIntServiceProcPtr sqAddr; */ + /* asm("lea %%pc@(interruptRoutine),%0\n" : "=a"(sqAddr)); */ + /* siqel->sqAddr = sqAddr; */ + /* siqel->sqParm = (long)dce->dCtlDevBase; */ + /* not sure how to get the proper result in C... */ SlotIntServiceProcPtr sqAddr; - asm("lea %%pc@(interruptRoutine),%0\n" : "=a"(sqAddr)); + asm("lea %%pc@(fbIrq),%0\n" : "=a"(sqAddr)); siqel->sqAddr = sqAddr; + /* siqel->sqParm = (long)dce; */ siqel->sqParm = (long)dce->dCtlDevBase; dStore->siqel = siqel; diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c index 9642d43..9749654 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGADrvr_Status.c @@ -76,8 +76,10 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) (vPInfo->csMode != kDepthMode3) && (vPInfo->csMode != kDepthMode4) && (vPInfo->csMode != kDepthMode5) && - (vPInfo->csMode != kDepthMode6)) - return paramErr; + (vPInfo->csMode != kDepthMode6)) { + ret = paramErr; + goto done; + } vPInfo->csPage = (vPInfo->csMode == kDepthMode5) ? 1 : 2; ret = noErr; } @@ -90,11 +92,15 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) (vPInfo->csMode != kDepthMode3) && (vPInfo->csMode != kDepthMode4) && (vPInfo->csMode != kDepthMode5) && - (vPInfo->csMode != kDepthMode6)) - return paramErr; + (vPInfo->csMode != kDepthMode6)) { + ret = paramErr; + goto done; + } short npage = (vPInfo->csMode == kDepthMode5) ? 1 : 2; - if (vPInfo->csPage >= npage) - return paramErr; + if (vPInfo->csPage >= npage) { + ret = paramErr; + goto done; + } vPInfo->csBaseAddr = vPInfo->csPage * 1024 * 1024 * 4; /* fixme for > 2 pages ? */ ret = noErr; } @@ -176,8 +182,10 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) if (((((UInt8)vdtim->csTimingMode) < nativeVidMode) || (((UInt8)vdtim->csTimingMode) > dStore->maxMode)) && (vdtim->csTimingMode != kDisplayModeIDFindFirstResolution) && - (vdtim->csTimingMode != kDisplayModeIDCurrent)) - return paramErr; + (vdtim->csTimingMode != kDisplayModeIDCurrent)) { + ret = paramErr; + goto done; + } unsigned int mode = vdtim->csTimingMode; if (mode == kDisplayModeIDFindFirstResolution) mode = nativeVidMode; @@ -238,8 +246,10 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) { default: if ((((UInt8)vdres->csPreviousDisplayModeID) < nativeVidMode) || - (((UInt8)vdres->csPreviousDisplayModeID) > dStore->maxMode)) - return paramErr; + (((UInt8)vdres->csPreviousDisplayModeID) > dStore->maxMode)) { + ret = paramErr; + goto done; + } if (((UInt8)vdres->csPreviousDisplayModeID) == dStore->maxMode) vdres->csDisplayModeID = kDisplayModeIDNoMoreResolutions; else @@ -274,15 +284,19 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) if (((((UInt8)vdparam->csDisplayModeID) < nativeVidMode) || (((UInt8)vdparam->csDisplayModeID) > dStore->maxMode)) && (vdparam->csDisplayModeID != kDisplayModeIDFindFirstResolution) && - (vdparam->csDisplayModeID != kDisplayModeIDCurrent)) - return paramErr; + (vdparam->csDisplayModeID != kDisplayModeIDCurrent)) { + ret = paramErr; + goto done; + } if ((vdparam->csDepthMode != kDepthMode1) && (vdparam->csDepthMode != kDepthMode2) && (vdparam->csDepthMode != kDepthMode3) && (vdparam->csDepthMode != kDepthMode4) && (vdparam->csDepthMode != kDepthMode5) && - (vdparam->csDepthMode != kDepthMode6)) - return paramErr; + (vdparam->csDepthMode != kDepthMode6)) { + ret = paramErr; + goto done; + } /* write_reg(dce, GOBOFB_DEBUG, 0xBEEF0022); */ /* write_reg(dce, GOBOFB_DEBUG, (unsigned int)vdparam->csDisplayModeID); */ /* write_reg(dce, GOBOFB_DEBUG, (unsigned int)vdparam->csDepthMode); */ @@ -385,5 +399,8 @@ OSErr cNuBusFPGAStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) break; } #endif + done: + if (!(pb->ioTrap & (1<ioTrap & (1<ioTrap & (1<ioTrap & (1<