mirror of
https://github.com/elliotnunn/supermario.git
synced 2025-02-27 08:29:24 +00:00
617 lines
13 KiB
C
617 lines
13 KiB
C
/*
|
|
File: ATISlotUtils.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: ATISlotUtils.c
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 6/19/92
|
|
*
|
|
*Purpose: Contains routines to works with video slot resources
|
|
*
|
|
*Category:
|
|
*File: ATISlotUtils.c
|
|
*
|
|
*Exports: MonitorIDToSpID
|
|
* FindVideoTimingStruct
|
|
* GetTimingSBlock
|
|
* GetBitDepth
|
|
* GetRowBytes
|
|
* GetNumLines
|
|
* PruneMonitors
|
|
*
|
|
*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"
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Imported Variables
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Imported Procedures
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Local Typedefs and Defines
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Exported Variables
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Exported Procedures
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Local Variables
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Beginning of Procedure Definitions
|
|
*
|
|
*-----------------------------------------------------------------------*/
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: MonitorIDToSpID
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 6/12/92
|
|
*
|
|
*Purpose: Transforms a monitor id into the appropriate slot resource id.
|
|
*
|
|
*Category:
|
|
*File: ATISlotUtils.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: UInt8
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note: Today the monitor identification is the slot manager spId.
|
|
* You must be careful not get the header file used here out of
|
|
* sync with the declaration ROM assembler file.
|
|
*
|
|
* We only have values for the 13" RGB currently.
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
UInt8
|
|
MonitorIDToSpID(UInt8 monitorId)
|
|
{
|
|
|
|
// UInt8 spId;
|
|
|
|
// DebugStr("\pMonitorIDToSpID");
|
|
|
|
return(monitorId);
|
|
|
|
} /* End of MonitorIDToSpID */
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: GetNumLines
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 6/22/92
|
|
*
|
|
*Purpose: Returns the number of vertical lines for the specified monitor/mode.
|
|
*
|
|
*Category:
|
|
*File: ATISlotUtils.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry: rowBytes - If the video parameters structure couldn't be
|
|
* located zero is returned. Otherwise a 16 bit
|
|
* value indicating the number of vertical lines
|
|
* is returned.
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: UInt16
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
UInt16
|
|
GetNumLines(UInt8 monitorID, UInt8 videoMode, UInt8 theSlot)
|
|
{
|
|
|
|
OSErr err;
|
|
// UInt8 spId;
|
|
SpBlock spPb;
|
|
char *p;
|
|
short i;
|
|
VPBlockPtr vpPtr;
|
|
Rect bounds;
|
|
|
|
// DebugStr("\pGetNumLines");
|
|
|
|
return(kNumLines480);
|
|
|
|
p = (char *) &spPb;
|
|
for ( i = 0; i < sizeof(SpBlock); i++ ) *p++ = 0;
|
|
|
|
spPb.spSlot = theSlot;
|
|
spPb.spID = MonitorIDToSpID(monitorID); // The id of the monitor sRsrc
|
|
err = SRsrcInfo(&spPb); // Find it, it better be there
|
|
if ( err != noErr ) return(0); // Something bad has happened
|
|
|
|
spPb.spID = videoMode; // Find the structure for the mode
|
|
err = SFindStruct(&spPb); // Go find it
|
|
if ( err != noErr ) return(0); // Couldn't structure
|
|
|
|
spPb.spID = mVidParams; // Get the video mode structure
|
|
err = SGetBlock(&spPb);
|
|
if ( err != noErr ) return(0); // Couldn't structure
|
|
|
|
vpPtr = (VPBlockPtr) spPb.spResult;
|
|
bounds = vpPtr->vpBounds; // Save screen bounds value
|
|
DisposPtr((Ptr) spPb.spResult);
|
|
return(bounds.bottom-bounds.top);
|
|
|
|
} /* End of GetNumLines */
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: GetBitDepth
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 6/22/92
|
|
*
|
|
*Purpose: Returns the bit depth for the specified monitor/mode.
|
|
*
|
|
*Category:
|
|
*File: ATISlotUtils.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: UInt16
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
UInt16
|
|
GetBitDepth(UInt8 monitorID, UInt8 videoMode, UInt8 theSlot)
|
|
{
|
|
|
|
OSErr err;
|
|
// UInt8 spId;
|
|
SpBlock spPb;
|
|
char *p;
|
|
short i;
|
|
VPBlockPtr vpPtr;
|
|
UInt16 depth;
|
|
|
|
// DebugStr("\pGetBitDepth");
|
|
|
|
return(8);
|
|
|
|
p = (char *) &spPb;
|
|
for ( i = 0; i < sizeof(SpBlock); i++ ) *p++ = 0;
|
|
|
|
spPb.spSlot = theSlot;
|
|
spPb.spID = MonitorIDToSpID(monitorID); // The id of the monitor sRsrc
|
|
err = SRsrcInfo(&spPb); // Find it, it better be there
|
|
if ( err != noErr ) return(0); // Something bad has happened
|
|
|
|
spPb.spID = videoMode; // Find the structure for the mode
|
|
err = SFindStruct(&spPb); // Go find it
|
|
if ( err != noErr ) return(0); // Couldn't structure
|
|
|
|
spPb.spID = mVidParams; // Get the video mode structure
|
|
err = SGetBlock(&spPb);
|
|
if ( err != noErr ) return(0); // Couldn't structure
|
|
|
|
vpPtr = (VPBlockPtr) spPb.spResult;
|
|
depth = vpPtr->vpPixelSize; // Save depth
|
|
DisposPtr((Ptr) spPb.spResult);
|
|
return(depth);
|
|
|
|
} /* End of GetBitDepth */
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: GetRowBytes
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 6/22/92
|
|
*
|
|
*Purpose: Returns the rowBytes value for the specified monitor and mode.
|
|
*
|
|
*Category:
|
|
*File: ATISlotUtils.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry: rowBytes - If the video parameters structure couldn't be
|
|
* located zero is returned. Otherwise a 16 bit
|
|
* value indicating the rowbytes for the mode is
|
|
* returned.
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: UInt16
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
UInt16
|
|
GetRowBytes(UInt8 monitorID, UInt8 videoMode, UInt8 theSlot)
|
|
{
|
|
|
|
OSErr err;
|
|
// UInt8 spId;
|
|
SpBlock spPb;
|
|
char *p;
|
|
short i;
|
|
VPBlockPtr vpPtr;
|
|
UInt16 rowBytes;
|
|
unsigned long data;
|
|
|
|
IOLongWrite(0xF2800000, 0x02 << 12);
|
|
data = LByteSwap(*(unsigned long *)0xF2C00000); // Get Vendor ID
|
|
|
|
if ( data == (0x1002 | (0x4158 << 16)) ) { // look for ATI
|
|
return(1024);
|
|
}
|
|
|
|
if ( data == (0x100E | (0x9001 << 16)) ) { // look for Diamond
|
|
return(640);
|
|
}
|
|
|
|
return(640);
|
|
|
|
p = (char *) &spPb;
|
|
for ( i = 0; i < sizeof(SpBlock); i++ ) *p++ = 0;
|
|
|
|
spPb.spSlot = theSlot;
|
|
spPb.spID = MonitorIDToSpID(monitorID); // The id of the monitor sRsrc
|
|
err = SRsrcInfo(&spPb); // Find it, it better be there
|
|
if ( err != noErr ) return(0); // Something bad has happened
|
|
|
|
spPb.spID = videoMode; // Find the structure for the mode
|
|
err = SFindStruct(&spPb); // Go find it
|
|
if ( err != noErr ) return(0); // Couldn't structure
|
|
|
|
spPb.spID = mVidParams; // Get the video mode structure
|
|
err = SGetBlock(&spPb);
|
|
if ( err != noErr ) return(0); // Couldn't structure
|
|
|
|
vpPtr = (VPBlockPtr) spPb.spResult;
|
|
rowBytes = vpPtr->vpRowBytes; // Save rowBytes value
|
|
DisposPtr((Ptr) spPb.spResult);
|
|
return(rowBytes);
|
|
|
|
} /* End of GetRowBytes */
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: FindVideoTimingStruct
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 6/12/92
|
|
*
|
|
*Purpose: Locates the proper sRsrc for the given monitor.
|
|
*
|
|
*Category:
|
|
*File: ATISlotUtils.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: Ptr
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
Ptr
|
|
FindVideoTimingStruct(UInt8 monitorID, UInt8 theSlot)
|
|
{
|
|
OSErr err;
|
|
// UInt8 spId;
|
|
SpBlock spPb;
|
|
char *p;
|
|
short i;
|
|
|
|
// DebugStr("\pFindVideoTimingStruct");
|
|
|
|
p = (char *) &spPb;
|
|
for ( i = 0; i < sizeof(SpBlock); i++ ) *p++ = 0;
|
|
|
|
spPb.spSlot = theSlot;
|
|
#ifdef ROM
|
|
spPb.spID = 0x11; // The id of the board sRsrc
|
|
#else
|
|
spPb.spID = 0x01;
|
|
#endif
|
|
err = SRsrcInfo(&spPb); // Find it, it better be there
|
|
if ( err != noErr ) return(nil); // Something bad has happened
|
|
|
|
spPb.spID = kATIVidParmSpId; // So far we only know about this one
|
|
err = SFindStruct(&spPb); // Go find it
|
|
if ( err != noErr ) return(nil); // Couldn't locate ATI video tree
|
|
|
|
spPb.spID = MonitorIDToSpID(monitorID); // Point to a specific monitor timimg set
|
|
err = SFindStruct(&spPb); // Go find it
|
|
if ( err != noErr ) return(nil); // There is no monitor of that type
|
|
return((Ptr) spPb.spsPointer); // Return slot pointer
|
|
|
|
} /* End of FindVideoTimingStruct */
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: GetTimingSBlock
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 6/12/92
|
|
*
|
|
*Purpose: Returns a pointer to the SBlock with all timing parameters.
|
|
*
|
|
*Category:
|
|
*File: ATISlotUtils.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry:
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: Ptr - If the proper SBlock is located a pointer to the
|
|
* block of data is returned. If the block chould
|
|
* not be located nil is returned.
|
|
*
|
|
*Detailed: It is the responsibility of the caller of this routine to
|
|
* dispose of the pointer returned.
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
Ptr
|
|
GetTimingSBlock(UInt8 monitorID, UInt8 videoMode, UInt8 timingSelector, UInt8 ourSlot)
|
|
{
|
|
|
|
OSErr err;
|
|
Ptr vidParmPtr;
|
|
SpBlock spPb;
|
|
char *p;
|
|
short i;
|
|
|
|
// DebugStr("\pGetTimingSBlock");
|
|
|
|
p = (char *) &spPb;
|
|
for ( i = 0; i < sizeof(SpBlock); i++ ) *p++ = 0;
|
|
|
|
vidParmPtr = FindVideoTimingStruct(monitorID,ourSlot);
|
|
if ( vidParmPtr ) {
|
|
spPb.spsPointer = vidParmPtr;
|
|
spPb.spID = timingSelector;
|
|
if ( timingSelector == kSwatchParmSpId ) {
|
|
spPb.spID = kSwatchParmSpId;
|
|
err = SFindStruct(&spPb);
|
|
if ( err != noErr ) return(nil);
|
|
spPb.spID = videoMode;
|
|
}
|
|
err = SGetBlock(&spPb);
|
|
if ( err == noErr ) {
|
|
return((Ptr) spPb.spResult);
|
|
}
|
|
}
|
|
return(nil);
|
|
|
|
} /* End of GetTimingSBlock */
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*start
|
|
*
|
|
*Name: PruneMonitors
|
|
*Creator: George D. Wilson Jr.
|
|
*Date: 6/19/92
|
|
*
|
|
*Purpose: Removes the unused monitors timing sResources
|
|
*
|
|
*Category:
|
|
*File: ATISlotUtils.c
|
|
*
|
|
*Calls:
|
|
*
|
|
*Called By:
|
|
*
|
|
*Entry: monitorID - The monitor identifer to keep around.
|
|
*
|
|
* theSlot - The slot we are operating out of
|
|
*
|
|
*Alters:
|
|
*
|
|
*Exit: void
|
|
*
|
|
*Detailed:
|
|
*
|
|
*Algorithm:
|
|
*
|
|
*Note:
|
|
*
|
|
*History:
|
|
*
|
|
* Date Programmer Modification
|
|
* -------- ---------- -----------------------------------------
|
|
*
|
|
*stop
|
|
*-----------------------------------------------------------------------*/
|
|
void
|
|
PruneMonitors(UInt16 cardType, UInt8 theSlot)
|
|
{
|
|
|
|
OSErr err;
|
|
// UInt8 spId;
|
|
SpBlock spPb;
|
|
char *p;
|
|
short i;
|
|
|
|
p = (char *) &spPb;
|
|
for ( i = 0; i < sizeof(SpBlock); i++ ) *p++ = 0;
|
|
|
|
spPb.spSlot = theSlot; // should be 0x00
|
|
|
|
if ( cardType == 0x1002) { // look for ATI
|
|
spPb.spID = 0x90;
|
|
}
|
|
|
|
if ( cardType == 0x100E) { // look for Diamond
|
|
spPb.spID = 0x80; // The id of the board sRsrc
|
|
}
|
|
|
|
err = SDeleteSRTRec(&spPb);
|
|
|
|
} /* End of PruneMonitors */
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* End of Module
|
|
*
|
|
*-----------------------------------------------------------------------*/
|