mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2025-01-04 01:29:22 +00:00
0ba83392d4
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
547 lines
13 KiB
C
547 lines
13 KiB
C
/*
|
|
File: ATIPrimaryInit.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: PrimaryInit.c
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 4/23/92
|
|
*
|
|
*Purpose: Main interface file for ATI video driver primary init.
|
|
*
|
|
*Category: Macintosh driver
|
|
*File: PrimaryInit.c
|
|
*
|
|
*Exports: main - Main entry point for primary init.
|
|
*
|
|
*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 "ATIStdTypes.h"
|
|
#include "ATI.h"
|
|
#include "ATIDrvr.h"
|
|
#include "ATIVideo.h"
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Imported Procedures
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
extern void PruneMonitors(UInt16 cardType, UInt8 theSlot);
|
|
extern UInt16 GetRowBytes(UInt8 monitorID, UInt8 videoMode, UInt8 theSlot);
|
|
extern UInt16 GetNumLines(UInt8 monitorID, UInt8 videoMode, UInt8 theSlot);
|
|
|
|
extern void DoProgramTiming(UInt32 slotNum, Ptr baseAddr, UInt8 monitorID,
|
|
UInt8 videoMode, UInt8 ourSlot, UInt16 rowBytes,
|
|
Boolean enableInterrupts);
|
|
extern void DoEnableVideo(UInt32 theSlot);
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: SenseLineCheck
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 5/21/92
|
|
*
|
|
*Purpose: Returns the currently connected monitor code.
|
|
*
|
|
*Category:
|
|
*File: PrimaryInit.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: UInt8 - Returns the sRsrc id of the monitor family connected.
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
* 9/28/93 George W. Added default return of 13" display.
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
UInt8
|
|
SenseLineCheck(UInt32 theSlot)
|
|
{
|
|
|
|
UInt32 *SenseRegPtr;
|
|
UInt32 senseLineVal1,senseLineVal2,senseLineVal3;
|
|
|
|
// DebugStr("\pSenseLineCheck");
|
|
|
|
|
|
return(kRGB1312Connected); // ¥¥¥ ATI hack
|
|
|
|
SenseRegPtr = (UInt32 *) (theSlot | kATISenseLineBase);
|
|
senseLineVal1 = *SenseRegPtr; // Read the sense lines
|
|
senseLineVal1 &= kSenseLineMask; // Mask off the sense line bits
|
|
senseLineVal1 >= kSenseLineShift;
|
|
switch ( senseLineVal1 ) {
|
|
case kMonitorNotConnected:
|
|
*SenseRegPtr = (kSenseLineAMask); // Set all lines to ones
|
|
// *SenseRegPtr = (kSenseLinesReg); // Causes sense lines to be read
|
|
senseLineVal1 = *SenseRegPtr; // Read the sense lines
|
|
senseLineVal1 &= kSenseLineMask; // Mask off the sense line bits
|
|
senseLineVal1 >= kSenseLineShift; // Move bits to bottom
|
|
|
|
*SenseRegPtr = (kSenseLineBMask); // Set all lines to ones
|
|
// *SenseRegPtr = (kSenseLinesReg); // Causes sense lines to be read
|
|
senseLineVal2 = *SenseRegPtr; // Read the sense lines
|
|
senseLineVal2 &= kSenseLineMask; // Mask off the sense line bits
|
|
senseLineVal2 >= kSenseLineShift; // Move bits to bottom
|
|
|
|
*SenseRegPtr = (kSenseLineCMask); // Set all lines to ones
|
|
// *SenseRegPtr = (kSenseLinesReg); // Causes sense lines to be read
|
|
senseLineVal3 = *SenseRegPtr; // Read the sense lines
|
|
senseLineVal3 &= kSenseLineMask; // Mask off the sense line bits
|
|
senseLineVal3 >= kSenseLineShift; // Move bits to bottom
|
|
|
|
if ( (senseLineVal1 == kSenseLineAMask) &&
|
|
(senseLineVal2 == kSenseLineBMask) &&
|
|
(senseLineVal3 == kSenseLineCMask) ) {
|
|
return(kMonitorNotConnected);
|
|
}
|
|
|
|
if ( (senseLineVal1 == k16SenseACode) &&
|
|
(senseLineVal2 == k16SenseBCode) &&
|
|
(senseLineVal3 == k16SenseCCode) ) {
|
|
return(kRGB16Connected);
|
|
}
|
|
return(kMonitorNotConnected);
|
|
break;
|
|
case kRGB1312:
|
|
return(kRGB1312Connected);
|
|
break;
|
|
default: return(kMonitorNotConnected);
|
|
}
|
|
|
|
} /* End of SenseLineCheck */
|
|
|
|
|
|
void RampCLUT (UInt8 devID, UInt16 cardType)
|
|
{
|
|
UInt32 i;
|
|
UInt8 *clutAddrReg;
|
|
UInt8 *clutData;
|
|
// UInt32 dummy;
|
|
|
|
// DebugStr("\pRampClut");
|
|
|
|
IOLongWrite(0xF2800000, (devID << 12) | 4);
|
|
*(unsigned char *)(0xF2C00000) = 0x3;
|
|
PerformPCIHack();
|
|
|
|
if (cardType == kATIVendorID) {
|
|
|
|
clutAddrReg = (UInt8 *) kDAC_W_INDEX;
|
|
clutData = (UInt8 *) kDAC_DATA; // Point to data register
|
|
*clutAddrReg = 0; // Point to the first entry
|
|
PerformPCIHack();
|
|
for ( i = 0; i < 256; i++ ) {
|
|
*clutData = kGrayCLUTValue;
|
|
PerformPCIHack();
|
|
*clutData = kGrayCLUTValue;
|
|
PerformPCIHack();
|
|
*clutData = kGrayCLUTValue;
|
|
PerformPCIHack();
|
|
}
|
|
}
|
|
|
|
if (cardType == kDiamondVendorID) {
|
|
unsigned char *writeReg;
|
|
unsigned char *dataReg;
|
|
|
|
writeReg = (unsigned char *)(0xF20003C8); // kRamWrite
|
|
dataReg = (unsigned char *)(0xF20003C9); // kPaletteData
|
|
|
|
*writeReg = 0;
|
|
PerformPCIHack();
|
|
for (i = 0; i < 256; i++) {
|
|
*dataReg = (unsigned char)i; // red
|
|
PerformPCIHack();
|
|
*dataReg = (unsigned char)i; // green
|
|
PerformPCIHack();
|
|
*dataReg = (unsigned char)i; // blue
|
|
PerformPCIHack();
|
|
}
|
|
}
|
|
|
|
IOLongWrite(0xF2800000, (devID << 12) | 4);
|
|
*(unsigned char *)(0xF2C00000) = 0x2;
|
|
PerformPCIHack();
|
|
} /* End of RampClut */
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: GrayPage
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 3/30/92
|
|
*
|
|
*Purpose:
|
|
*
|
|
*Category:
|
|
*File: PrimaryInit.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit:
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
OSErr GrayPage(Ptr baseAddr, UInt16 rowBytes, UInt8 depth, UInt16 numLines)
|
|
{
|
|
|
|
UInt32 grayPattern;
|
|
UInt32 numWrites;
|
|
Ptr linePtr;
|
|
UInt32 *dumbPtr;
|
|
UInt16 i,j;
|
|
#if 0
|
|
Ptr myPtr;
|
|
UInt16 k, huh, huh1;
|
|
#endif
|
|
|
|
// DebugStr("\pGrayPage");
|
|
|
|
switch ( depth ) {
|
|
case 1: grayPattern = kOneBitPattern; break;
|
|
case 2: grayPattern = kTwoBitPattern; break;
|
|
case 4: grayPattern = kFourBitPattern; break;
|
|
case 8: grayPattern = kEightBitPattern; break;
|
|
case 16: grayPattern = kSixTeenBitPattern; break;
|
|
case 32: grayPattern = kThirtyTwoBitPattern; break;
|
|
}
|
|
numWrites = rowBytes / 4;
|
|
|
|
linePtr = (Ptr) baseAddr;
|
|
if ( depth == 32 ) {
|
|
for ( i = 0; i < numLines; i++ ) {
|
|
dumbPtr = (UInt32 *) linePtr;
|
|
for ( j = 0; j < numWrites; j++ ) {
|
|
*dumbPtr++ = grayPattern;
|
|
grayPattern = ~grayPattern;
|
|
}
|
|
linePtr += rowBytes;
|
|
grayPattern = ~grayPattern;
|
|
}
|
|
} else {
|
|
for ( i = 0; i < numLines; i++ ) {
|
|
dumbPtr = (UInt32 *) linePtr;
|
|
for ( j = 0; j < numWrites; j++ ) {
|
|
*dumbPtr++ = grayPattern;
|
|
}
|
|
linePtr += rowBytes;
|
|
grayPattern = ~grayPattern;
|
|
}
|
|
}
|
|
|
|
// code to dump the DACs into the frame buffer.
|
|
// 16x16 rectangles each with a different pixel value.
|
|
#if 0
|
|
huh = 0;
|
|
for (i = 0; i < numLines; i++) {
|
|
linePtr = (Ptr) baseAddr + (i * rowBytes);
|
|
myPtr = linePtr;
|
|
huh1 = huh;
|
|
for (j = 0; j < 16; j++) {
|
|
for (k = 0; k < 40; k++) {
|
|
*myPtr = huh1;
|
|
myPtr++;
|
|
}
|
|
huh1++;
|
|
}
|
|
if (i % 30 == 0 && i > 0) {
|
|
huh += 16;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return(noErr);
|
|
|
|
} /* End of GrayPage */
|
|
|
|
|
|
void CalcSlotBaseAddr (UInt8 slot, UInt32 *baseAddr32, UInt32 *baseAddrFB32)
|
|
{
|
|
|
|
UInt8 slotNum;
|
|
|
|
slotNum = slot;
|
|
*baseAddr32 = ((UInt32) (0x0F0 | slotNum) << 24);
|
|
*baseAddrFB32 = (UInt32) ((0x0F00 | (slotNum << 4) | slotNum) << 20);
|
|
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: REALMAIN
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 5/21/92
|
|
*
|
|
*Purpose: Main entry point for the ATI primary init.
|
|
*
|
|
*Category: Entry Point
|
|
*File: PrimaryInit.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: UInt8
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
* 5/21/92 George W. Added sense line logic.
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
void REALMAIN (SEBlock *aSEBlockPtr)
|
|
{
|
|
|
|
Ptr baseAddr=0;
|
|
Ptr baseAddrFB;
|
|
UInt16 rowBytes;
|
|
UInt32 slotNum;
|
|
UInt8 slot;
|
|
UInt8 mmuMode;
|
|
UInt8 theMonitorID;
|
|
SpBlock spPb;
|
|
OSErr err;
|
|
SPRAMRecord sPRAM;
|
|
UInt8 videoMode=0;
|
|
UInt16 numLines;
|
|
UInt16 depth;
|
|
UInt16 cardType;
|
|
|
|
mmuMode = true32b;
|
|
SwapMMUMode(&mmuMode);
|
|
slot = aSEBlockPtr->seSlot; // Get out slot number
|
|
slotNum = kMySuperSlot;
|
|
|
|
#if 0
|
|
PruneMonitors(theMonitorID,slot);
|
|
if ( (theMonitorID < kRGB1312Connected) ||
|
|
(theMonitorID > kRGB16Connected) ) { // We only support 13"
|
|
aSEBlockPtr->seStatus = -1;
|
|
return; // All done get out
|
|
}
|
|
|
|
// CalcSlotBaseAddr(slot,&baseAddr,&baseAddrFB);
|
|
baseAddr = (Ptr) (kBaseAddress | kMySuperSlot);
|
|
baseAddrFB = (Ptr) (kBaseAddress | kMySlot | 0xF0000000);
|
|
|
|
videoMode = kFirstVideoMode;
|
|
|
|
spPb.spSlot = slot;
|
|
spPb.spResult = &sPRAM;
|
|
err = SReadPRAMRec(&spPb);
|
|
if ( err == noErr ) { // Did we get our PRAM?
|
|
if ( sPRAM.vendorUse4 != theMonitorID ) { // Is this the same monitor as last time?
|
|
sPRAM.vendorUse4 = theMonitorID; // No save the monitor ID
|
|
spPb.spsPointer = (Ptr) &sPRAM; // Heres the PRAM record to save
|
|
err = SPutPRAMRec(&spPb); // Save it for ever
|
|
} else { // Yes
|
|
if ( (sPRAM.vendorUse1 >= kFirstVideoMode) || // Range check mode value
|
|
(sPRAM.vendorUse1 >= kFifthVideoMode) ) {
|
|
videoMode = sPRAM.vendorUse1; // If mode value is funny save default.
|
|
}
|
|
}
|
|
}
|
|
rowBytes = GetRowBytes(theMonitorID,videoMode,slot);
|
|
numLines = GetNumLines(theMonitorID,videoMode,slot);
|
|
DoProgramTiming(kMySuperSlot,(Ptr) kBaseAddress,
|
|
theMonitorID,videoMode,slot, rowBytes,false);
|
|
depth = GetBitDepth(theMonitorID,videoMode,slot);
|
|
GrayPage(baseAddrFB,rowBytes,8,numLines);
|
|
RampCLUT();
|
|
DoEnableVideo(slotNum);
|
|
|
|
#else
|
|
|
|
//====================================================
|
|
// New funky code for ATI card
|
|
//====================================================
|
|
|
|
slot = FindPCICard(&cardType); // Search some slots for ATI
|
|
if ( slot == 0x00 ) {
|
|
aSEBlockPtr->seStatus = -1;
|
|
return; // All done get out
|
|
}
|
|
err = EnableIOAccess(slot, true, cardType);
|
|
if ( err != noErr ) {
|
|
aSEBlockPtr->seStatus = -1;
|
|
return; // All done get out
|
|
}
|
|
|
|
{
|
|
OSErr err;
|
|
SpBlock spPb;
|
|
char *p;
|
|
short i;
|
|
|
|
p = (char *) &spPb;
|
|
for ( i = 0; i < sizeof(SpBlock); i++ ) *p++ = 0;
|
|
|
|
spPb.spSlot = 0x00;
|
|
|
|
if ( cardType == kATIVendorID) { // look for ATI
|
|
spPb.spID = 0x90; // id of board sRsrc to delete
|
|
}
|
|
|
|
if ( cardType == kDiamondVendorID) { // look for Diamond
|
|
spPb.spID = 0x80; // The id of the board sRsrc
|
|
}
|
|
|
|
err = SDeleteSRTRec(&spPb);
|
|
}
|
|
|
|
theMonitorID = SenseLineCheck(slotNum);
|
|
if ( theMonitorID == kNoMonitorConnected ) { // No monitor
|
|
aSEBlockPtr->seStatus = -1;
|
|
return; // All done get out
|
|
}
|
|
|
|
videoMode = kFirstVideoMode;
|
|
|
|
spPb.spSlot = slot;
|
|
spPb.spResult = &sPRAM;
|
|
#if 0
|
|
err = SReadPRAMRec(&spPb);
|
|
if ( err == noErr ) { // Did we get our PRAM?
|
|
if ( sPRAM.vendorUse4 != theMonitorID ) { // Is this the same monitor as last time?
|
|
sPRAM.vendorUse4 = theMonitorID; // No save the monitor ID
|
|
spPb.spsPointer = (Ptr) &sPRAM; // Heres the PRAM record to save
|
|
err = SPutPRAMRec(&spPb); // Save it for ever
|
|
} else { // Yes
|
|
if ( (sPRAM.vendorUse1 >= kFirstVideoMode) || // Range check mode value
|
|
(sPRAM.vendorUse1 >= kFifthVideoMode) ) {
|
|
videoMode = sPRAM.vendorUse1; // If mode value is funny save default.
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
if (cardType == kATIVendorID) {
|
|
UInt32 data;
|
|
UInt16 *ioReg;
|
|
|
|
ioReg = (UInt16 *) kMEM_CFG; // Memory config IO register
|
|
data = WByteSwap(*ioReg); // Get existing data
|
|
data |= (kATIVRAMAddr >> 16) | k4MegAperture; // Set the VRAM base address
|
|
data &= 0x0000FFFF;
|
|
*ioReg = WByteSwap(data); // Write new stuff
|
|
PerformPCIHack();
|
|
|
|
ioReg = (UInt16 *) kLOCAL_CNTL; //
|
|
*ioReg = WByteSwap(0x00A2); // Write new stuff
|
|
PerformPCIHack();
|
|
|
|
baseAddr = (Ptr) kATIVRAMAddr; // should equal kDiamondFBBase
|
|
baseAddrFB = (Ptr) kATIVRAMAddr;
|
|
depth = 8; // Default for now is 8bpp
|
|
rowBytes = 1024;
|
|
numLines = 480;
|
|
|
|
GrayPage(baseAddrFB,rowBytes,depth,numLines);
|
|
RampCLUT(slot,kATIVendorID);
|
|
SlamRegisters(slot);
|
|
}
|
|
else {
|
|
baseAddr = (Ptr) kDiamondFBBase; // should equal kATIVRAMAddr
|
|
baseAddrFB = (Ptr) kDiamondFBBase;
|
|
depth = 8; // Default for now is 8bpp
|
|
rowBytes = 640;
|
|
numLines = 480;
|
|
|
|
GoDiamond640x480x8Apple(slot);
|
|
GrayPage(baseAddrFB,rowBytes,depth,numLines);
|
|
}
|
|
|
|
#endif
|
|
|
|
aSEBlockPtr->seStatus = noErr;
|
|
SwapMMUMode(&mmuMode);
|
|
|
|
}
|
|
|