mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2025-01-04 01:29:22 +00:00
5b0f0cc134
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.
232 lines
7.0 KiB
C
232 lines
7.0 KiB
C
/*
|
|
File: DBDMA.h
|
|
|
|
Contains: public headers defining the Descriptor Based DMA standard
|
|
|
|
Written by: Craig Prouse
|
|
|
|
Copyright: © 1993 by Apple Computer, Inc., all rights reserved.
|
|
|
|
Change History (most recent first):
|
|
|
|
<SM2> 12/13/93 chp Add TStat encodings.
|
|
<1> 11/10/93 fau first checked in
|
|
<SMG3> 10/26/93 chp Checking in the first ÒcompleteÓ version.
|
|
<SMG2> 9/29/93 chp Add channel control bits and channel commands. Prepare for
|
|
littleEndian support by default.
|
|
|
|
*/
|
|
|
|
#ifndef __DBDMA__
|
|
#define __DBDMA__
|
|
|
|
#ifndef __M68K__
|
|
#include <M68K.h>
|
|
#endif
|
|
|
|
#ifndef __ENDIANAWARE__
|
|
#include <EndianAware.h>
|
|
#endif
|
|
|
|
|
|
// This structure defines the standard set of DB-DMA channel registers.
|
|
|
|
struct DBDMAChannelRegisters {
|
|
unsigned long channelControl;
|
|
unsigned long channelStatus;
|
|
unsigned long commandPtrHi; // implementation optional
|
|
unsigned long commandPtrLo;
|
|
unsigned long dataPtrHi; // implementation optional
|
|
unsigned long dataPtrLo;
|
|
unsigned long byteCount;
|
|
|
|
unsigned long reserved1;
|
|
unsigned long data2PtrHi; // implementation optional
|
|
unsigned long data2PtrLo; // implementation optional
|
|
unsigned long transferModes; // implementation optional
|
|
unsigned long addressHi; // implementation optional
|
|
unsigned long reserved2 [4];
|
|
unsigned long unimplemented [16];
|
|
|
|
// This structure must remain fully padded to 256 bytes.
|
|
unsigned long undefined [32];
|
|
};
|
|
typedef struct DBDMAChannelRegisters DBDMAChannelRegisters;
|
|
|
|
|
|
// These constants define the DB-DMA channel control words and status flags.
|
|
|
|
enum {
|
|
kdbdmaSetRun = 0x80008000,
|
|
kdbdmaClrRun = 0x80000000,
|
|
kdbdmaSetPause = 0x40004000,
|
|
kdbdmaClrPause = 0x40000000,
|
|
|
|
kdbdmaClrHalted = 0x20000000,
|
|
kdbdmaClrDead = 0x10000000,
|
|
kdbdmaSetActive = 0x08000800,
|
|
|
|
kdbdmaSetS3 = 0x00080008,
|
|
kdbdmaClrS3 = 0x00080000,
|
|
kdbdmaSetS2 = 0x00040004,
|
|
kdbdmaClrS2 = 0x00040000,
|
|
kdbdmaSetS1 = 0x00020002,
|
|
kdbdmaClrS1 = 0x00020000,
|
|
kdbdmaSetS0 = 0x00010001,
|
|
kdbdmaClrS0 = 0x00010000,
|
|
|
|
kdbdmaClrAll = 0xF00F0000,
|
|
|
|
kdbdmaHalted = 0x2000,
|
|
kdbdmaDead = 0x1000,
|
|
kdbdmaActive = 0x0800,
|
|
kdbdmaPaused = 0x0400,
|
|
|
|
kTStatMore = 0x0000,
|
|
kTStatDone = 0x0100,
|
|
kTStatDiff = 0x0200,
|
|
kTStatError = 0x0300,
|
|
kdbdmaTStatMask = 0x0300,
|
|
|
|
kdbdmaS3 = 0x0008,
|
|
kdbdmaS2 = 0x0004,
|
|
kdbdmaS1 = 0x0002,
|
|
kdbdmaS0 = 0x0001
|
|
};
|
|
|
|
|
|
// This structure defines the DB-DMA channel command descriptor.
|
|
|
|
// *** WARNING: Endian-ness issues must be considered when performing load/store! ***
|
|
// *** DB-DMA specifies memory organization as quadlets so it is not correct
|
|
// *** to think of either the operation or result field as two 16-bit fields.
|
|
// *** This would have undesirable effects on the byte ordering within their
|
|
// *** respective quadlets.
|
|
|
|
struct DBDMADescriptor {
|
|
unsigned long operation; // MSW = command, LSW = reqCount
|
|
unsigned long address;
|
|
unsigned long data32;
|
|
unsigned long result; // MSW = xferStatus, LSW = resCount
|
|
};
|
|
typedef struct DBDMADescriptor DBDMADescriptor, *DBDMADescriptorPtr;
|
|
|
|
|
|
// These constants define the DB-DMA channel command operations and modifiers.
|
|
|
|
enum {
|
|
// Command.cmd operations
|
|
OUTPUT_MORE = 0x0000,
|
|
OUTPUT_LAST = 0x0100,
|
|
INPUT_MORE = 0x0200,
|
|
INPUT_LAST = 0x0300,
|
|
STORE_QUAD = 0x0400,
|
|
LOAD_QUAD = 0x0500,
|
|
JUMP = 0x0600,
|
|
WAIT = 0x0700,
|
|
STOP = 0x0800,
|
|
kdbdmaCmdMask = 0x0F00,
|
|
|
|
// Command.test modifiers (choose all that apply)
|
|
kTestMore = 0x1000,
|
|
kTestDone = 0x2000,
|
|
kTestDiff = 0x4000,
|
|
kTestError = 0x8000,
|
|
kdbdmaTestMask = 0xF000,
|
|
|
|
// Command.i modifiers (choose one)
|
|
kIntError = 0x0000, // default modifier
|
|
kIntErrorDiff = 0x0040,
|
|
kIntErrorDiffDone = 0x0080,
|
|
kIntAll = 0x00C0,
|
|
kdbdmaIMask = 0x00C0,
|
|
|
|
// Command.h modifiers (choose one)
|
|
kHaltError = 0x0000, // default modifier
|
|
kHaltErrorDiff = 0x0010,
|
|
kHaltErrorDiffDone = 0x0020,
|
|
kHaltNone = 0x0030,
|
|
kdbdmaHMask = 0x0030,
|
|
|
|
// Command.cdep.key modifiers (choose one for INPUT, OUTPUT, LOAD, and STORE operations)
|
|
KEY_STREAM0 = 0x0000, // default modifier
|
|
KEY_STREAM1 = 0x0001,
|
|
KEY_STREAM2 = 0x0002,
|
|
KEY_STREAM3 = 0x0003,
|
|
KEY_REGS = 0x0005,
|
|
KEY_SYSTEM = 0x0006,
|
|
KEY_DEVICE = 0x0007,
|
|
kdbdmaKeyMask = 0x0007,
|
|
|
|
// Command.cdep.cond modifiers (choose all that apply for JUMP and WAIT operations)
|
|
kFailZerosFailOnes = 0x0001,
|
|
kFailZerosPassOnes = 0x0002,
|
|
kPassZerosFailOnes = 0x0004,
|
|
kPassZerosPassOnes = 0x0008,
|
|
kdbdmaCondMask = 0x000F
|
|
};
|
|
|
|
|
|
// void MakeCCDescriptor (DBDMADescriptor *descPtr, unsigned short cmd,
|
|
// unsigned short count, unsigned long addr);
|
|
#define MakeCCDescriptor(descPtr,cmd,count,addr) \
|
|
((descPtr)->result = 0, \
|
|
(descPtr)->data32 = 0, \
|
|
(descPtr)->address = EndianSwap32(addr), \
|
|
NOP(), \
|
|
(descPtr)->operation = EndianSwap32((cmd) << 16 | ((count) & 0x0000FFFF)), \
|
|
NOP())
|
|
|
|
// void MakeData32CCDescriptor (DBDMADescriptor *descPtr, unsigned short cmd,
|
|
// unsigned short count, unsigned long addr, unsigned long data);
|
|
#define MakeData32CCDescriptor(descPtr,cmd,count,addr,data) \
|
|
((descPtr)->result = 0, \
|
|
(descPtr)->data32 = EndianSwap32(data), \
|
|
(descPtr)->address = EndianSwap32(addr), \
|
|
NOP(), \
|
|
(descPtr)->operation = EndianSwap32((cmd) << 16 | ((count) & 0x0000FFFF)), \
|
|
NOP())
|
|
|
|
// unsigned short GetCCCmd (DBDMADescriptor *descPtr)
|
|
#define GetCCCmd(descPtr) \
|
|
((unsigned short) (EndianSwap32((descPtr)->operation) >> 16))
|
|
|
|
// unsigned short GetCCReqCount (DBDMADescriptor *descPtr)
|
|
#define GetCCReqCount(descPtr) \
|
|
((unsigned short) (EndianSwap32((descPtr)->operation) & 0x0000FFFF))
|
|
|
|
// unsigned long GetCCAddress (DBDMADescriptor *descPtr);
|
|
#define GetCCAddress(descPtr) \
|
|
(EndianSwap32((descPtr)->address))
|
|
|
|
// unsigned long GetCCData32 (DBDMADescriptor *descPtr);
|
|
#define GetCCData32(descPtr) \
|
|
(EndianSwap32((descPtr)->data32))
|
|
|
|
// unsigned short GetCCXferStatus (DBDMADescriptor *descPtr);
|
|
#define GetCCXferStatus(descPtr) \
|
|
((unsigned short) (EndianSwap32((descPtr)->result) >> 16))
|
|
|
|
// unsigned short GetCCResCount (DBDMADescriptor *descPtr);
|
|
#define GetCCResCount(descPtr) \
|
|
((unsigned short) (EndianSwap32((descPtr)->result) & 0x0000FFFF))
|
|
|
|
// void SetChannelControl (DBDMAChannelRegisters *registerSetPtr, unsigned long ctlValue);
|
|
#define SetChannelControl(registerSetPtr, ctlValue) \
|
|
((registerSetPtr)->channelControl = EndianSwap32(ctlValue), NOP())
|
|
|
|
// unsigned long GetChannelStatus (DBDMAChannelRegisters *registerSetPtr);
|
|
#define GetChannelStatus(registerSetPtr) \
|
|
(EndianSwap32((registerSetPtr)->channelStatus))
|
|
|
|
// unsigned long GetCommandPtr (DBDMAChannelRegisters *registerSetPtr);
|
|
#define GetCommandPtr(registerSetPtr) \
|
|
(EndianSwap32((registerSetPtr)->commandPtrLo))
|
|
|
|
// void SetCommandPtr (DBDMAChannelRegisters *registerSetPtr, unsigned long cclPtr);
|
|
#define SetCommandPtr(registerSetPtr,cclPtr) \
|
|
((registerSetPtr)->commandPtrLo = EndianSwap32(cclPtr), NOP())
|
|
|
|
|
|
#endif __DBDMA__
|