mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-22 19:31:02 +00:00
175 lines
5.9 KiB
C
175 lines
5.9 KiB
C
|
/*
|
|||
|
File: HALc96GC.c
|
|||
|
|
|||
|
Contains: Grand Central SCSI HBA
|
|||
|
|
|||
|
Written by: Craig Prouse
|
|||
|
|
|||
|
Copyright: © 1993-1994 by Apple Computer, Inc., all rights reserved.
|
|||
|
|
|||
|
Change History (most recent first):
|
|||
|
|
|||
|
<SM2> 1/12/94 chp Comment out pipeline mode initialization.
|
|||
|
<SMG2> 10/26/93 chp Remove ATI bringup hack.
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
#include "SIMCorePriv.h"
|
|||
|
#include "HALc96.h"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// Should match MIN_AMIC_DMA_SIZE in order to reuse Setup/Teardown routines.
|
|||
|
#define MIN_GC_DMA_SIZE 0x0200
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/* ……………………………………………………………………………………………………………………………………………………………………………………………………………………
|
|||
|
InitHW_GC:
|
|||
|
|
|||
|
Vestigial.
|
|||
|
……………………………………………………………………………………………………………………………………………………………………………………………………………………
|
|||
|
*/
|
|||
|
|
|||
|
OSErr InitHW_GC (HALc96Globals *HALg)
|
|||
|
{
|
|||
|
#pragma unused (HALg)
|
|||
|
|
|||
|
// Grand Central doesn’t require any particular channel hardware initialization.
|
|||
|
|
|||
|
/*
|
|||
|
* It is assumed that HammerHead is previously programmed to allow the system
|
|||
|
* to run in pipeline mode. During bringup, this programming was effected here.
|
|||
|
* Pipeline mode is now enabled by TNT HardwareInit, before the emulator runs.
|
|||
|
*/
|
|||
|
|
|||
|
// *(unsigned long *) 0xF80001D0 = 0x04000000; /* ChipExpress HammerHead */
|
|||
|
// *(unsigned long *) 0xF8000090 = 0x04000000; /* TI HammerHead */
|
|||
|
|
|||
|
return noErr;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/* ……………………………………………………………………………………………………………………………………………………………………………………………………………………
|
|||
|
InitSW_GC:
|
|||
|
|
|||
|
Allocate memory for double-buffered DMA and the DB-DMA Channel Command List.
|
|||
|
|
|||
|
Both structures are contiguously locked physical buffers. They are allocated
|
|||
|
together on a page boundary and extend for an integral number of whole pages
|
|||
|
in order to avoid any other data structures sharing the same physical pages.
|
|||
|
|
|||
|
*** WARNING: The following code is page-size dependent and hard codes both
|
|||
|
the page size of the machine and the DMA buffer size. While
|
|||
|
not strictly kosher, this is consistent with other DMA HBAs.
|
|||
|
……………………………………………………………………………………………………………………………………………………………………………………………………………………
|
|||
|
*/
|
|||
|
|
|||
|
OSErr InitSW_GC (HALc96Globals *HALg)
|
|||
|
{
|
|||
|
OSErr err;
|
|||
|
Ptr memStart;
|
|||
|
void * pageStart;
|
|||
|
unsigned long needSize, peCount;
|
|||
|
|
|||
|
const unsigned long pageSize = 4096;
|
|||
|
const unsigned long bufferSize = 1 * pageSize; // must be a multiple of pageSize
|
|||
|
const unsigned long cclSize = 1 * pageSize; // must be a multiple of pageSize
|
|||
|
|
|||
|
LogicalToPhysicalTable mappingTable;
|
|||
|
|
|||
|
|
|||
|
// Allocate a block with some extra slop for page alignment.
|
|||
|
|
|||
|
needSize = bufferSize + cclSize;
|
|||
|
memStart = NewPtrSys(needSize + pageSize);
|
|||
|
if (memStart == nil) {
|
|||
|
err = MemError();
|
|||
|
goto failNewPtrSys;
|
|||
|
}
|
|||
|
|
|||
|
// Calculate the first page boundary within the allocated block.
|
|||
|
// Scale back the allocation as much as possible.
|
|||
|
|
|||
|
pageStart = (void *) ((unsigned long) memStart + (pageSize - 1) & ~(pageSize - 1));
|
|||
|
SetPtrSize(memStart, needSize + ((unsigned long) pageStart - (unsigned long) memStart));
|
|||
|
|
|||
|
// Lock the buffers contiguously with respect to VM and calculate physical addresses.
|
|||
|
|
|||
|
err = LockMemoryContiguous(pageStart, needSize);
|
|||
|
if (err)
|
|||
|
goto failLockMemoryContiguous;
|
|||
|
|
|||
|
peCount = 1;
|
|||
|
mappingTable.logical.address = pageStart;
|
|||
|
mappingTable.logical.count = needSize;
|
|||
|
err = GetPhysical(&mappingTable, &peCount);
|
|||
|
if (err)
|
|||
|
goto failGetPhysical;
|
|||
|
|
|||
|
// Record buffer addresses (logical and physical) in the HAL globals.
|
|||
|
|
|||
|
HALg->physicalCopyBuffer = mappingTable.physical[0].address;
|
|||
|
HALg->logicalCopyBuffer = pageStart;
|
|||
|
|
|||
|
HALg->cclPhysicalAddr = HALg->physicalCopyBuffer + bufferSize;
|
|||
|
HALg->cclLogicalAddr = (Ptr) ((unsigned long) pageStart + bufferSize);
|
|||
|
|
|||
|
HALg->minDMAsize = MIN_GC_DMA_SIZE;
|
|||
|
|
|||
|
return noErr;
|
|||
|
|
|||
|
|
|||
|
// Failure handlers:
|
|||
|
|
|||
|
failGetPhysical:
|
|||
|
UnlockMemory(pageStart, needSize);
|
|||
|
|
|||
|
failLockMemoryContiguous:
|
|||
|
DisposePtr(memStart);
|
|||
|
|
|||
|
failNewPtrSys:
|
|||
|
return err;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/* ……………………………………………………………………………………………………………………………………………………………………………………………………………………
|
|||
|
SetupIOGC:
|
|||
|
|
|||
|
Inspection shows that the PSC and AMIC versions of this routine are nearly
|
|||
|
identical. No major changes are yet required for TNT. Rather than copy and
|
|||
|
paste (again), just call the existing version.
|
|||
|
|
|||
|
Some minor changes may be required eventually. But perhaps these would best
|
|||
|
be implemented by adding double buffer criteria to the HwDesc table rather
|
|||
|
than hard coding them. Many HBAs could share the bulk of this routine.
|
|||
|
……………………………………………………………………………………………………………………………………………………………………………………………………………………
|
|||
|
*/
|
|||
|
|
|||
|
void SetupIOGC (SIM_IO *ioPtr)
|
|||
|
{
|
|||
|
extern void SetupIOAMIC (SIM_IO *ioPtr);
|
|||
|
|
|||
|
|
|||
|
SetupIOAMIC(ioPtr);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/* ……………………………………………………………………………………………………………………………………………………………………………………………………………………
|
|||
|
TeardownIOGC:
|
|||
|
|
|||
|
See the notes on SetupIOGC above.
|
|||
|
……………………………………………………………………………………………………………………………………………………………………………………………………………………
|
|||
|
*/
|
|||
|
|
|||
|
void TeardownIOGC (SIM_IO *ioPtr, HALc96Globals *HALg)
|
|||
|
{
|
|||
|
extern void TeardownIOAMIC (SIM_IO *ioPtr, HALc96Globals *HALg);
|
|||
|
|
|||
|
|
|||
|
TeardownIOAMIC(ioPtr, HALg);
|
|||
|
}
|