mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-24 17:32:59 +00:00
253 lines
8.1 KiB
C
253 lines
8.1 KiB
C
/*
|
||
File: PSCPrivEqu.h
|
||
|
||
Contains: HAL private equates for accessing the Peripheral Subsystem Controller (PSC)
|
||
|
||
Written by: Craig Prouse
|
||
|
||
Copyright: © 1992-1993 by Apple Computer, Inc., all rights reserved.
|
||
|
||
Change History (most recent first):
|
||
|
||
<SM10> 11/10/93 fau Update from SuperMunggio <SMG2>.
|
||
<SMG2> 9/29/93 chp Removed typedefs for unsigned types.
|
||
<SM9> 4/29/93 chp SuperMario = Ludwig B6
|
||
<LW5> 4/13/93 chp Remove unused fields from PSC_INT_TBL in conjunction with
|
||
changes to PSCEqu.a.
|
||
<LW4> 3/16/93 chp Remove the definition of the PSCIntTbl lomem which has been
|
||
superseded by an equivalent field in ExpandMem.
|
||
<LW3> 2/24/93 chp The TimeStamp structure was correct in <SM6> but the hardware
|
||
was backwards. Fix the structure one last time to reflect the
|
||
format of the UTSC in the final version of the PSC.
|
||
<LW2> 12/29/92 chp The TimeStamp structure was not reversed; the code using it was
|
||
reversed. The structure has been restored as it was in <SM5>.
|
||
———————————————————————————————————————————————————————————————————————————————————————
|
||
Pre-Ludwig ROM comments begin here.
|
||
———————————————————————————————————————————————————————————————————————————————————————
|
||
<SM6> 12/8/92 chp The TimeStamp structure was reversed, causing externally clocked
|
||
devices to hang the system.
|
||
<SM5> 12/4/92 chp PSC primitive functions moved here from SerialHALPSC.c. Channel
|
||
direction constants removed.
|
||
<SM4> 10/8/92 chp Added structs and constants for accessing the Universal Time
|
||
Stamp Counter (UTSC).
|
||
<SM3> 8/13/92 chp Support for PSC rev 1 (and all references to such support)
|
||
permanently removed.
|
||
<SM2> 7/1/92 chp Updated change history for SuperMario.
|
||
<SM1> 6/25/92 chp first checked in
|
||
———————————————————————————————————————————————————————————————————————————————————————
|
||
Pre-SuperMario ROM comments begin here.
|
||
———————————————————————————————————————————————————————————————————————————————————————
|
||
<5> 6/24/92 chp Eliminate compile-time conditionals for different PSC versions.
|
||
Update PSC equates for consistency with changes in assembly
|
||
definitions elsewhere.
|
||
<4> 6/20/92 chp Changed enum syntax slightly to satisfy the overly-retentive
|
||
compiler from another famous Cupertino development tool
|
||
provider. (It thinks an enumeration list can’t end with a
|
||
comma.)
|
||
<3> 6/11/92 chp Add a few more PSC constants, including one to support prototype
|
||
versions of the PSC. Use conditionals to permit building PSCHAL
|
||
for various versions of the PSC.
|
||
<2> 5/29/92 chp Reimplemented fragments of the Universal info data structures to
|
||
support base address retrieval using C idioms. Renamed a
|
||
poorly-named data type. Completed implementation of PSC register
|
||
offsets and named bits in control and status registers. Added
|
||
support for multiple inclusion.
|
||
<1> 5/12/92 chp first checked in
|
||
|
||
*/
|
||
|
||
|
||
#ifndef __PSCPRIVEQU__
|
||
#define __PSCPRIVEQU__
|
||
|
||
|
||
|
||
/* duplicate enough "UniversalEqu" data structures to find the PSC base address */
|
||
|
||
enum {
|
||
UnivInfoPtr = 0x0DD8 // low-memory global: type is (ProductInfo **)
|
||
};
|
||
|
||
|
||
struct ProductInfo {
|
||
long decoderInfoPtr; // offset to address decoder info
|
||
// there are several more fields here that are not interesting in this context
|
||
};
|
||
typedef struct ProductInfo ProductInfo;
|
||
|
||
|
||
struct DecoderInfo {
|
||
void *reserved [27]; // 27 base addresses precede the PSC in DecoderInfo
|
||
void *pscAddr;
|
||
};
|
||
typedef struct DecoderInfo DecoderInfo;
|
||
|
||
|
||
|
||
/* PSC Interrupt Handler equates and structures */
|
||
|
||
struct PSCPrimaryInterruptVector {
|
||
void (*hndlr) (void); // address of interrupt handler
|
||
long parm; // parameter passed to handler in register A1
|
||
};
|
||
typedef struct PSCPrimaryInterruptVector PSCPrimaryInterruptVector;
|
||
|
||
|
||
struct PSC_INT_TBL {
|
||
// device level 3 interrupts
|
||
PSCPrimaryInterruptVector MACE;
|
||
|
||
// device level 4 interrupts
|
||
PSCPrimaryInterruptVector SNDSTAT;
|
||
PSCPrimaryInterruptVector L4SCCA;
|
||
PSCPrimaryInterruptVector L4SCCB;
|
||
|
||
// device level 5 interrupts
|
||
PSCPrimaryInterruptVector DSP;
|
||
PSCPrimaryInterruptVector FRMOVRN;
|
||
|
||
// device level 6 interrupts
|
||
PSCPrimaryInterruptVector L660HZ;
|
||
PSCPrimaryInterruptVector L6SCCA;
|
||
PSCPrimaryInterruptVector L6SCCB;
|
||
|
||
// DMA channel interrupts (also interrupting at level 4)
|
||
PSCPrimaryInterruptVector SCSI;
|
||
PSCPrimaryInterruptVector MACE_RECV;
|
||
PSCPrimaryInterruptVector MACE_XMIT;
|
||
PSCPrimaryInterruptVector FDC;
|
||
PSCPrimaryInterruptVector SCCA;
|
||
PSCPrimaryInterruptVector SCCB;
|
||
PSCPrimaryInterruptVector SCCATx;
|
||
|
||
// DSP level 2 sound interrupt emulation vector
|
||
PSCPrimaryInterruptVector DSPL2;
|
||
};
|
||
typedef struct PSC_INT_TBL PSC_INT_TBL;
|
||
|
||
|
||
|
||
/* PSC register offsets and structures */
|
||
|
||
enum {
|
||
L3IR = 0x0130, // offset to Level 3 Interrupt Register
|
||
L3IER = 0x0134, // offset to Level 3 Interrupt Enable Register
|
||
MACE = 0,
|
||
|
||
L4IR = 0x0140, // offset to Level 4 Interrupt Register
|
||
L4IER = 0x0144, // offset to Level 4 Interrupt Enable Register
|
||
SNDSTAT = 0,
|
||
L4SCCA = 1,
|
||
L4SCCB = 2,
|
||
DMA = 3,
|
||
|
||
L5IR = 0x0150, // offset to Level 5 Interrupt Register
|
||
L5IER = 0x0154, // offset to Level 5 Interrupt Enable Register
|
||
DSP = 0,
|
||
FRMOVRN = 1,
|
||
|
||
L6IR = 0x0160, // offset to Level 6 Interrupt Register
|
||
L6IER = 0x0164, // offset to Level 6 Interrupt Enable Register
|
||
L660HZ = 0,
|
||
L6SCCA = 1,
|
||
L6SCCB = 2,
|
||
|
||
PSC_UTSC = 0x0300, // offset to Universal Time-Stamp Counter (48 of 64 bits)
|
||
|
||
PSC_BERRIE = 0x0800, // offset to Bus Error Interrupt Enable Register
|
||
BERRIE = 0,
|
||
|
||
PSC_ISR = 0x0804, // offset to DMA Interrupt Status Register array
|
||
|
||
PSC_CNTRL = 0x0C00, // offset to DMA Channel Overall Control Register array
|
||
|
||
PSC_SET = 0x1000 // offset to DMA Channel Register Set array
|
||
};
|
||
|
||
|
||
enum PSCChannel {
|
||
// DMA channel numbers
|
||
chanSCSI = 0,
|
||
chanENetRd = 1,
|
||
chanENetWr = 2,
|
||
chanFDC = 3,
|
||
chanSCCA = 4,
|
||
chanSCCB = 5,
|
||
chanSCCATx = 6
|
||
};
|
||
typedef enum PSCChannel PSCChannel;
|
||
|
||
|
||
enum {
|
||
// DMA channel CMDSTAT register bit offsets
|
||
SETMASK = 0xFF,
|
||
IF = 8,
|
||
DIR = 9,
|
||
TERMCNT = 10,
|
||
ENABLED = 11,
|
||
IE = 12,
|
||
|
||
// DMA channel CNTRL register bit offsets
|
||
CIRQ = 8,
|
||
DMAFLUSH = 9,
|
||
PAUSE = 10,
|
||
SWRESET = 11,
|
||
CIE = 12,
|
||
BERR = 13,
|
||
FROZEN = 14,
|
||
|
||
// VIA-style sense bit offsets
|
||
SENSE7 = 7, // bit 7 is the sense bit for 8-bit registers
|
||
SENSE15 = 15 // bit 15 is the sense bit for 16-bit registers
|
||
};
|
||
|
||
|
||
struct PSCDMACntrl {
|
||
short cntrl;
|
||
char reserved [16 - sizeof(short)]; // pad to 16 bytes
|
||
};
|
||
typedef struct PSCDMACntrl PSCDMACntrl;
|
||
|
||
|
||
struct PSCDMASet {
|
||
void *addr;
|
||
ulong cnt;
|
||
short cmdStat;
|
||
char reserved [16 - (sizeof(void *) + sizeof(ulong) + sizeof(short))]; // pad to 16 bytes
|
||
};
|
||
typedef struct PSCDMASet PSCDMASet;
|
||
|
||
|
||
typedef struct TimeStamp {
|
||
ulong lo; // low 32 bits of 48-bit UTSC register
|
||
ulong hi; // high 16 bits of 48-bit UTSC register (16 MSB read as 0)
|
||
};
|
||
typedef struct TimeStamp TimeStamp;
|
||
|
||
|
||
|
||
/* PSC primitive functions */
|
||
|
||
#if m68k
|
||
|
||
#pragma parameter __A0 PSCGetCntrl (__A0, __D0)
|
||
short *PSCGetCntrl (void *pscBase, PSCChannel pscChan) =
|
||
{
|
||
0xD0FC, PSC_CNTRL, // ADDA.W #PSC_CNTRL,A0
|
||
0xE988, // LSL.L #4,D0
|
||
0xD1C0 // ADDA.L D0,A0
|
||
};
|
||
|
||
|
||
#pragma parameter __A0 PSCGetSets (__A0, __D0)
|
||
PSCDMASet *PSCGetSets (void *pscBase, PSCChannel pscChan) =
|
||
{
|
||
0xD0FC, PSC_SET, // ADDA.W #PSC_SET,A0
|
||
0xEB88, // LSL.L #5,D0
|
||
0xD1C0 // ADDA.L D0,A0
|
||
};
|
||
|
||
#endif m68k
|
||
|
||
#endif __PSCPRIVEQU__
|