mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-29 20:49:19 +00:00
593 lines
13 KiB
C
593 lines
13 KiB
C
/*
|
|
File: ATIVideoImp.c
|
|
|
|
Contains: xxx put contents here xxx
|
|
|
|
Written by: xxx put writers here xxx
|
|
|
|
Copyright: © 1993 by Apple Computer, Inc., all rights reserved.
|
|
|
|
Change History (most recent first):
|
|
|
|
<1> 11/5/93 fau first checked in
|
|
<1> 10/27/93 fau first checked in
|
|
<1> 10/19/93 fau first checked in
|
|
|
|
*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: ATIVideoImp.c
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 6/19/92
|
|
*
|
|
*Purpose: Contains ATI specific video routines.
|
|
*
|
|
*Category: Video Hardware Implementation
|
|
*File: ATIVideoImp.c
|
|
*
|
|
*Exports: DoProgramDAC
|
|
* DoProgramDACGamma
|
|
* DoBuildLinearRamp
|
|
* DoGammaCorrectCLUT
|
|
* DoProgramEndeavor
|
|
* DoProgramACDC
|
|
* DoProgramSwatch
|
|
* DoEnableVideo
|
|
* DoDisableVideo
|
|
*
|
|
*Locals:
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Includes
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
#include <Types.h>
|
|
#include <Video.h>
|
|
#include <Devices.h>
|
|
#include <Errors.h>
|
|
#include <OSUtils.h>
|
|
#include <Slots.h>
|
|
#include <Memory.h>
|
|
|
|
#include "NubEqu.h"
|
|
#include "ATIStdTypes.h"
|
|
#include "ATIDrvr.h"
|
|
#include "ATIVideo.h"
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Imported Variables
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Imported Procedures
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
extern Ptr FindVideoTimingStruct(UInt8 monitorID, UInt8 theSlot);
|
|
extern Ptr GetTimingSBlock(UInt8 monitorID, UInt8 videoMode, UInt8 timingSelector, UInt8 ourSlot);
|
|
extern void PruneMonitors(UInt8 monitorID, UInt8 theSlot);
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Local Typedefs and Defines
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Exported Variables
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Exported Procedures
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Local Variables
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Beginning of Procedure Definitions
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: DoProgramDAC
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 5/28/92
|
|
*
|
|
*Purpose: Sends the specified CLUT to the hardware CLUT.
|
|
*
|
|
*Category:
|
|
*File: ATIDrvrImp.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: void
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
void
|
|
DoProgramDAC(ColorSpecPtr ctPtr, UInt16 numEntries, UInt16 start, Boolean indexMode)
|
|
{
|
|
|
|
UInt32 i;
|
|
UInt32 *clutReg;
|
|
UInt32 *clutAddrReg;
|
|
UInt32 dummy;
|
|
|
|
// DebugStr("\pDoProgramDAC");
|
|
|
|
// bogus code
|
|
return;
|
|
clutAddrReg = (UInt32 *) kDACAddrReg;
|
|
clutReg = (UInt32 *) kDACDataReg; // Point to data register
|
|
|
|
if ( indexMode ) { // Fill specific CLUT entries
|
|
WaitForVBL();
|
|
for ( i = 0; i < numEntries; i++ ) {
|
|
*clutAddrReg = ctPtr[i].value; // Point to specific CLUT entry
|
|
dummy = *clutAddrReg; // HW funnies.
|
|
*clutReg = ctPtr[i].rgb.red;
|
|
*clutReg = ctPtr[i].rgb.green;
|
|
*clutReg = ctPtr[i].rgb.blue;
|
|
}
|
|
} else { // Fill the CLUT sequencially
|
|
*clutAddrReg = start; // Goto the proper clut entry
|
|
dummy = *clutAddrReg; // HW funnies.
|
|
WaitForVBL();
|
|
for ( i = 0; i < numEntries; i++ ) {
|
|
*clutReg = ctPtr[i].rgb.red;
|
|
*clutReg = ctPtr[i].rgb.green;
|
|
*clutReg = ctPtr[i].rgb.blue;
|
|
}
|
|
}
|
|
} /* End of DoProgramDAC */
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: DoProgramDACGamma
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 5/28/92
|
|
*
|
|
*Purpose: Programs the specified gamma table into the CLUT DAC.
|
|
*
|
|
*Category:
|
|
*File: ATIDrvrImp.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: void
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
void
|
|
DoProgramDACGamma(GammaTablePtr gammaPtr)
|
|
{
|
|
|
|
char *redGammaPtr;
|
|
UInt32 i;
|
|
UInt32 *clutReg;
|
|
UInt32 *clutAddrReg;
|
|
UInt32 dummy;
|
|
UInt16 numEntries;
|
|
|
|
// DebugStr("\pDoProgramDACGamma");
|
|
|
|
// bogus
|
|
return;
|
|
|
|
clutAddrReg = (UInt32 *) kDACAddrReg;
|
|
clutReg = (UInt32 *) kDACDataReg; // Point to data register
|
|
*clutAddrReg = 0; // Point to first CLUT entry
|
|
dummy = *clutAddrReg; // HW funnies.
|
|
|
|
redGammaPtr = gammaPtr->gFormulaData;
|
|
redGammaPtr += gammaPtr->gFormulaSize;
|
|
numEntries = gammaPtr->gDataCnt;
|
|
|
|
WaitForVBL();
|
|
for ( i = 0; i < numEntries; i++ ) {
|
|
*clutReg = redGammaPtr[i];
|
|
*clutReg = redGammaPtr[i];
|
|
*clutReg = redGammaPtr[i];
|
|
}
|
|
|
|
} /* End of DoProgramDACGamma */
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: DoBuildLinearRamp
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 5/28/92
|
|
*
|
|
*Purpose: Sets the specified color spec array to a linear ramp.
|
|
*
|
|
*Category:
|
|
*File: ATIDrvrImp.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: void
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
void
|
|
DoBuildLinearRamp (ColorSpecPtr ctPtr)
|
|
{
|
|
|
|
UInt16 i;
|
|
|
|
// DebugStr("\pDoBuildLinearRamp");
|
|
|
|
for ( i = 0; i < kNumCLUTEntries; i++ ) {
|
|
ctPtr[i].value = i;
|
|
ctPtr[i].rgb.red = ctPtr[i].rgb.green = ctPtr[i].rgb.blue = i << 8;
|
|
}
|
|
|
|
} /* End of DoBuildLinearRamp */
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: DoGammaCorrectCLUT
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 5/27/92
|
|
*
|
|
*Purpose: Applies the specified gamma table to the CLUT passed.
|
|
*
|
|
*Category:
|
|
*File: ATIDrvrImp.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: void
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
void
|
|
DoGammaCorrectCLUT(UInt16 numEntries, ColorSpecPtr orgCLUTPtr,
|
|
ColorSpecPtr corrCLUTPtr,GammaTablePtr gammaPtr)
|
|
{
|
|
|
|
char *redGammaPtr;
|
|
char *greenGammaPtr;
|
|
char *blueGammaPtr;
|
|
UInt16 red,green,blue;
|
|
UInt16 i;
|
|
|
|
// DebugStr("\pDoGammaCorrectCLUT");
|
|
|
|
for ( i = 0; i < numEntries; i++ ) { // Copy all the needed entries
|
|
corrCLUTPtr[i].value = orgCLUTPtr[i].value;
|
|
corrCLUTPtr[i].rgb.red = orgCLUTPtr[i].rgb.red;
|
|
corrCLUTPtr[i].rgb.green = orgCLUTPtr[i].rgb.green;
|
|
corrCLUTPtr[i].rgb.blue = orgCLUTPtr[i].rgb.blue;
|
|
}
|
|
redGammaPtr = gammaPtr->gFormulaData;
|
|
redGammaPtr += gammaPtr->gFormulaSize;
|
|
if ( gammaPtr->gChanCnt == 1 ) { // If single channel gamma table
|
|
greenGammaPtr = redGammaPtr; // Point all other channels to red
|
|
blueGammaPtr = redGammaPtr;
|
|
}
|
|
if ( gammaPtr->gChanCnt == 3 ) { // If triple channel gamma table
|
|
greenGammaPtr = redGammaPtr + gammaPtr->gDataCnt;
|
|
blueGammaPtr = greenGammaPtr + gammaPtr->gDataCnt;
|
|
}
|
|
for ( i = 0; i < numEntries; i++ ) { // Gamma correct each entry
|
|
red = corrCLUTPtr[i].rgb.red;
|
|
red >>= 8; // Rotate high order bits down
|
|
if ( corrCLUTPtr[i].rgb.red & 0x0080 ) { // If low order high bit was set
|
|
if ( red != 0x00FF ) red += 1; // If we won't overflow add one
|
|
}
|
|
green = corrCLUTPtr[i].rgb.green;
|
|
green >>= 8; // Rotate high order bits down
|
|
if ( corrCLUTPtr[i].rgb.green & 0x0080 ) { // If low order high bit was set
|
|
if ( green != 0x00FF ) green += 1; // If we won't overflow add one
|
|
}
|
|
blue = corrCLUTPtr[i].rgb.blue;
|
|
blue >>= 8; // Rotate high order bits down
|
|
if ( corrCLUTPtr[i].rgb.blue & 0x0080 ) { // If low order high bit was set
|
|
if ( blue != 0x00FF ) blue += 1; // If we won't overflow add one
|
|
}
|
|
corrCLUTPtr[i].rgb.red = redGammaPtr[red];
|
|
corrCLUTPtr[i].rgb.green = greenGammaPtr[green];
|
|
corrCLUTPtr[i].rgb.blue = blueGammaPtr[blue];
|
|
}
|
|
|
|
} /* End of DoGammaCorrectCLUT */
|
|
|
|
//===========================================================================
|
|
// Hardware specific routines.
|
|
//===========================================================================
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: DoProgramTiming
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 4/16/92
|
|
*
|
|
*Purpose: Programs the Arial and MMIC hardware for the ATI video system.
|
|
*
|
|
*Category:
|
|
*File: ATIDrvrImp.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit:
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
void DoProgramTiming (UInt32 slotNum, Ptr baseAddr, UInt8 monitorID,
|
|
UInt8 videoMode, UInt8 ourSlot, UInt16 rowBytes,
|
|
Boolean enableInterrupts)
|
|
{
|
|
#pragma unused (baseAddr, ourSlot, rowBytes, enableInterrupts)
|
|
|
|
UInt8 *DACRegPtr;
|
|
UInt8 *MMICRegPtr;
|
|
UInt8 DACValue;
|
|
UInt8 MMICValue;
|
|
|
|
// DebugStr("\pDoProgramTiming");
|
|
// bogus
|
|
return;
|
|
|
|
DACRegPtr = (UInt8 *) (slotNum | kArielBaseAddr);
|
|
MMICRegPtr = (UInt8 *) (slotNum | kMMICBaseAddr);
|
|
|
|
switch ( videoMode ) {
|
|
case kFirstVideoMode: DACValue = kArial1BPPCode; break;
|
|
case kSecondVideoMode: DACValue = kArial2BPPCode; break;
|
|
case kThirdVideoMode: DACValue = kArial4BPPCode; break;
|
|
case kFourthVideoMode: DACValue = kArial8BPPCode; break;
|
|
case kFifthVideoMode: DACValue = kArial16BPPCode; break;
|
|
}
|
|
|
|
switch ( monitorID ) {
|
|
case kRGB1312Connected: MMICValue = kMMIC13Code; break;
|
|
case kRGB16Connected: MMICValue = kMMIC16Code; break;
|
|
case kRGB15Connected: MMICValue = kMMIC15Code; break;
|
|
case kRGB12Connected: MMICValue = kMMIC12Code; break;
|
|
}
|
|
|
|
*DACRegPtr = DACValue;
|
|
*MMICRegPtr = MMICValue;
|
|
|
|
} /* End of DoProgramTiming */
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: DoEnableVideo
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 4/17/92
|
|
*
|
|
*Purpose: Turns the video curcuitry on for ATI hardware.
|
|
*
|
|
*Category:
|
|
*File: ATIDrvrImp.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit:
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
void DoEnableVideo(UInt32 theSlot)
|
|
{
|
|
UInt32 *SashaRegPtr;
|
|
|
|
// DebugStr("\pDoEnableVideo");
|
|
|
|
// bogus
|
|
return;
|
|
|
|
SashaRegPtr = (UInt32 *) (theSlot | kSashaBase);
|
|
|
|
*SashaRegPtr = (kOutputCtl | kPixelDataOutEn |
|
|
kAcDcCSYNCEnable | kAcDcCBLANKEnable |
|
|
kAcDcSYNCEnable | kAcDcLoadClkEnable);
|
|
|
|
*SashaRegPtr = (kSwatchSoftReset | kNormal);
|
|
|
|
*SashaRegPtr = (kVidPipeReset | kNormal);
|
|
|
|
} /* End of DoEnableVideo */
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: DoDisableVideo
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 4/17/92
|
|
*
|
|
*Purpose: Turns the video curcuitry off for ATI hardware.
|
|
*
|
|
*Category:
|
|
*File: ATIDrvrImp.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit:
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
void DoDisableVideo(UInt32 theSlot)
|
|
{
|
|
UInt32 *SashaRegPtr;
|
|
|
|
// DebugStr("\pDoDisableVideo");
|
|
|
|
// bogus
|
|
return;
|
|
|
|
SashaRegPtr = (UInt32 *) (theSlot | kSashaBase);
|
|
|
|
*SashaRegPtr = (kOutputCtl |
|
|
kAcDcCSYNCDisable | kAcDcCBLANKDisable |
|
|
kAcDcSYNCDisable | kAcDcLoadClkDisable);
|
|
|
|
*SashaRegPtr = (kSwatchSoftReset | kNormal);
|
|
|
|
*SashaRegPtr = (kVidPipeReset | kNormal);
|
|
|
|
} /* End of DoDisableVideo */
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* End of Module
|
|
*
|
|
*-----------------------------------------------------------------------*/
|