mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 01:29:20 +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.
389 lines
10 KiB
Plaintext
389 lines
10 KiB
Plaintext
;
|
|
; File: DBDMA.a
|
|
;
|
|
; Contains: public headers defining the Descriptor Based DMA standard
|
|
;
|
|
; Written by: Craig Prouse
|
|
;
|
|
; Copyright: © 1993-1994 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <SM3> 1/10/94 chp Comment out WAIT command value. This identifier conflicts with
|
|
; something in SonyEqu.a that should be encapsulated in a record.
|
|
; However, WAIT may soon be obsolete anyway.
|
|
; <SM2> 12/13/93 chp Add TStat encodings.
|
|
; <SM1> 11/10/93 fau first checked in
|
|
; <SMG2> 10/26/93 chp Checking in the first ÒcompleteÓ version. Some macros changed
|
|
; for compatibility with C equivalents.
|
|
;
|
|
;
|
|
|
|
IF &TYPE('__INCLUDINGDBDMA__') = 'UNDEFINED' THEN
|
|
__INCLUDINGDBDMA__ SET 1
|
|
|
|
IF &TYPE('__INCLUDINGENDIANAWARE__') = 'UNDEFINED' THEN
|
|
INCLUDE 'EndianAware.a'
|
|
ENDIF
|
|
|
|
|
|
; This structure defines the standard set of DB-DMA channel registers.
|
|
|
|
DBDMAChannelRegisters record 0
|
|
|
|
channelControl ds.l 1
|
|
channelStatus ds.l 1
|
|
commandPtrHi ds.l 1 ; implementation optional
|
|
commandPtrLo ds.l 1
|
|
dataPtrHi ds.l 1 ; implementation optional
|
|
dataPtrLo ds.l 1
|
|
byteCount ds.l 1
|
|
|
|
reserved1 ds.l 1
|
|
data2PtrHi ds.l 1 ; implementation optional
|
|
data2PtrLo ds.l 1 ; implementation optional
|
|
transferModes ds.l 1 ; implementation optional
|
|
addressHi ds.l 1 ; implementation optional
|
|
reserved2 ds.l 4
|
|
unimplemented ds.l 16
|
|
|
|
; This structure must remain fully padded to 256 bytes.
|
|
undefined ds.l 32
|
|
|
|
IF * <> 256 THEN
|
|
AERROR ('DBDMAChannelRegisters is the wrong size!')
|
|
ENDIF
|
|
endr
|
|
|
|
|
|
; These constants define the DB-DMA channel control words and status flags.
|
|
|
|
kdbdmaSetRun equ $80008000
|
|
kdbdmaClrRun equ $80000000
|
|
kdbdmaSetPause equ $40004000
|
|
kdbdmaClrPause equ $40000000
|
|
|
|
kdbdmaClrHalted equ $20000000
|
|
kdbdmaClrDead equ $10000000
|
|
kdbdmaSetActive equ $08000800
|
|
|
|
kdbdmaSetS3 equ $00080008
|
|
kdbdmaClrS3 equ $00080000
|
|
kdbdmaSetS2 equ $00040004
|
|
kdbdmaClrS2 equ $00040000
|
|
kdbdmaSetS1 equ $00020002
|
|
kdbdmaClrS1 equ $00020000
|
|
kdbdmaSetS0 equ $00010001
|
|
kdbdmaClrS0 equ $00010000
|
|
|
|
kdbdmaClrAll equ $F00F0000
|
|
|
|
kdbdmaHalted equ $2000
|
|
kdbdmaDead equ $1000
|
|
kdbdmaActive equ $0800
|
|
kdbdmaPaused equ $0400
|
|
|
|
kTStatMore equ $0000
|
|
kTStatDone equ $0100
|
|
kTStatDiff equ $0200
|
|
kTStatError equ $0300
|
|
kdbdmaTStatMask equ $0300
|
|
|
|
kdbdmaS3 equ $0008
|
|
kdbdmaS2 equ $0004
|
|
kdbdmaS1 equ $0002
|
|
kdbdmaS0 equ $0001
|
|
|
|
|
|
; 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.
|
|
|
|
DBDMADescriptor record 0
|
|
|
|
operation ds.l 1 ; MSW = command, LSW = reqCount
|
|
address ds.l 1
|
|
data32 ds.l 1
|
|
result ds.l 1 ; MSW = xferStatus, LSW = resCount
|
|
|
|
size equ *
|
|
endr
|
|
|
|
|
|
; These constants define the DB-DMA channel command operations and modifiers.
|
|
|
|
; Command.cmd operations
|
|
OUTPUT_MORE equ $0000
|
|
OUTPUT_LAST equ $0100
|
|
INPUT_MORE equ $0200
|
|
INPUT_LAST equ $0300
|
|
STORE_QUAD equ $0400
|
|
LOAD_QUAD equ $0500
|
|
JUMP equ $0600
|
|
;WAIT equ $0700
|
|
STOP equ $0800
|
|
kdbdmaCmdMask equ $0F00
|
|
|
|
; Command.test modifiers (choose all that apply)
|
|
kTestMore equ $1000
|
|
kTestDone equ $2000
|
|
kTestDiff equ $4000
|
|
kTestError equ $8000
|
|
kdbdmaTestMask equ $F000
|
|
|
|
; Command.i modifiers (choose one)
|
|
kIntError equ $0000 ; default modifier
|
|
kIntErrorDiff equ $0040
|
|
kIntErrorDiffDone equ $0080
|
|
kIntAll equ $00C0
|
|
kdbdmaIMask equ $00C0
|
|
|
|
; Command.h modifiers (choose one)
|
|
kHaltError equ $0000 ; default modifier
|
|
kHaltErrorDiff equ $0010
|
|
kHaltErrorDiffDone equ $0020
|
|
kHaltNone equ $0030
|
|
kdbdmaHMask equ $0030
|
|
|
|
; Command.cdep.key modifiers (choose one for INPUT, OUTPUT, LOAD, and STORE operations)
|
|
KEY_STREAM0 equ $0000 ; default modifier
|
|
KEY_STREAM1 equ $0001
|
|
KEY_STREAM2 equ $0002
|
|
KEY_STREAM3 equ $0003
|
|
KEY_REGS equ $0005
|
|
KEY_SYSTEM equ $0006
|
|
KEY_DEVICE equ $0007
|
|
kdbdmaKeyMask equ $0007
|
|
|
|
; Command.cdep.cond modifiers (choose all that apply for JUMP and WAIT operations)
|
|
kFailZerosFailOnes equ $0001
|
|
kFailZerosPassOnes equ $0002
|
|
kPassZerosFailOnes equ $0004
|
|
kPassZerosPassOnes equ $0008
|
|
kdbdmaCondMask equ $000F
|
|
|
|
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
; _MakeCCDescriptor (macro)
|
|
;
|
|
; In: A0 pointer to a channel command descriptor buffer
|
|
; D0.L DMA command in high word, DMA request count in low word
|
|
; A1 DMA address
|
|
;
|
|
; Notes: D0/D1 are never preserved.
|
|
; The macro generates code for either big-endian or little-endian storage.
|
|
; The command field must be written to memory last for STOP replacement.
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
macro
|
|
_MakeCCDescriptor
|
|
|
|
adda.w #DBDMADescriptor.size,a0
|
|
|
|
clr.l -(a0) ; initialize status and residual count
|
|
clr.l -(a0) ; data32 is usually reserved
|
|
|
|
move.l a1,d1
|
|
endsw.l d1
|
|
move.l d1,-(a0) ; address
|
|
nop
|
|
|
|
endsw.l d0
|
|
move.l d0,-(a0) ; command and count
|
|
nop
|
|
|
|
endm
|
|
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
; _MakeData32CCDescriptor (macro)
|
|
;
|
|
; In: A0 pointer to a channel command descriptor buffer
|
|
; D0.L DMA command in high word, DMA reqCount in low word
|
|
; D1.L 32-bit data word for STORE_QUAD
|
|
; A1 DMA address
|
|
;
|
|
; Notes: D0/D1 are never preserved.
|
|
; The macro generates code for either big-endian or little-endian storage.
|
|
; The command field must be written to memory last for STOP replacement.
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
macro
|
|
_MakeData32CCDescriptor
|
|
|
|
adda.w #DBDMADescriptor.size,a0
|
|
|
|
clr.l -(a0) ; initialize status and residual count
|
|
|
|
endsw.l d1
|
|
move.l d1,-(a0) ; data32
|
|
|
|
move.l a1,d1
|
|
endsw.l d1
|
|
move.l d1,-(a0) ; address
|
|
nop
|
|
|
|
endsw.l d0
|
|
move.l d0,-(a0) ; command and count
|
|
nop
|
|
|
|
endm
|
|
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
; _GetCCOperation (macro)
|
|
;
|
|
; In: A0 pointer to a DB-DMA channel register set
|
|
; Out: D0.L DMA command in high word, DMA request count in low word
|
|
;
|
|
; Notes: The macro generates code for either big-endian or little-endian storage.
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
macro
|
|
_GetCCOperation
|
|
|
|
move.l DBDMADescriptor.operation(a0),d0
|
|
endsw.l d0
|
|
|
|
endm
|
|
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
; _GetCCAddress (macro)
|
|
;
|
|
; In: A0 pointer to a DB-DMA channel register set
|
|
; Out: D0.L 32-bit address
|
|
;
|
|
; Notes: The macro generates code for either big-endian or little-endian storage.
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
macro
|
|
_GetCCAddress
|
|
|
|
move.l DBDMADescriptor.address(a0),d0
|
|
endsw.l d0
|
|
|
|
endm
|
|
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
; _GetCCData32 (macro)
|
|
;
|
|
; In: A0 pointer to a DB-DMA channel register set
|
|
; Out: D0.L 32-bit data word from LOAD_QUAD
|
|
;
|
|
; Notes: The macro generates code for either big-endian or little-endian storage.
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
macro
|
|
_GetCCData32
|
|
|
|
move.l DBDMADescriptor.data32(a0),d0
|
|
endsw.l d0
|
|
|
|
endm
|
|
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
; _GetCCResult (macro)
|
|
;
|
|
; In: A0 pointer to a DB-DMA channel register set
|
|
; Out: D0.L DMA status in high word, DMA residual count in low word
|
|
;
|
|
; Notes: The macro generates code for either big-endian or little-endian storage.
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
macro
|
|
_GetCCResult
|
|
|
|
move.l DBDMADescriptor.result(a0),d0
|
|
endsw.l d0
|
|
|
|
endm
|
|
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
; _SetChannelControl (macro)
|
|
;
|
|
; In: A0 pointer to a DB-DMA channel register set
|
|
; D0.L sum of desired DB-DMA control words
|
|
;
|
|
; Notes: D0 is not guaranteed to be preserved.
|
|
; The macro generates code for either big-endian or little-endian storage.
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
macro
|
|
_SetChannelControl
|
|
|
|
with DBDMAChannelRegisters
|
|
|
|
endsw.l d0
|
|
move.l d0,channelControl(a0) ; store channel control
|
|
nop ; eieio
|
|
|
|
endwith
|
|
endm
|
|
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
; _GetChannelStatus (macro)
|
|
;
|
|
; In: A0 pointer to a DB-DMA channel register set
|
|
; Out: D0.L sum of DB-DMA status flags
|
|
;
|
|
; Notes: The macro generates code for either big-endian or little-endian storage.
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
macro
|
|
_GetChannelStatus
|
|
|
|
with DBDMAChannelRegisters
|
|
|
|
move.l channelStatus(a0),d0 ; recover channel status
|
|
endsw.l d0
|
|
|
|
endwith
|
|
endm
|
|
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
; _GetCommandPtr (macro)
|
|
;
|
|
; In: A0 pointer to a DB-DMA channel register set
|
|
; Out: D0.L pointer to the current descriptor in the channel command list
|
|
;
|
|
; Notes: The macro generates code for either big-endian or little-endian storage.
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
macro
|
|
_GetCommandPtr
|
|
|
|
with DBDMAChannelRegisters
|
|
|
|
move.l commandPtrLo(a0),d0 ; pointer to next descriptor in list
|
|
endsw.l d0
|
|
|
|
endwith
|
|
endm
|
|
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
; _SetCommandPtr (macro)
|
|
;
|
|
; In: A0 pointer to a DB-DMA channel register set
|
|
; D0.L pointer to an initialized channel command list
|
|
;
|
|
; Notes: D0 is not guaranteed to be preserved.
|
|
; The macro generates code for either big-endian or little-endian storage.
|
|
; ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
macro
|
|
_SetCommandPtr
|
|
|
|
with DBDMAChannelRegisters
|
|
|
|
endsw.l d0
|
|
move.l d0,commandPtrLo(a0) ; pointer to first descriptor in list
|
|
nop ; eieio
|
|
|
|
endwith
|
|
endm
|
|
|
|
|
|
ENDIF ; __INCLUDINGDBDMA__
|