mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2025-01-01 11:29:27 +00:00
179 lines
4.7 KiB
Plaintext
179 lines
4.7 KiB
Plaintext
|
;_______________________________________________________________________
|
|||
|
;
|
|||
|
; File: SonySWIM3GC.a
|
|||
|
;
|
|||
|
; Written by: Monte Benaresh 1/4/94.
|
|||
|
;
|
|||
|
; Copyright: <09> 1994 by Apple Computer, Inc., all rights reserved.
|
|||
|
;
|
|||
|
; Change History (most recent first):
|
|||
|
;
|
|||
|
; <SM2> 1/31/94 LB Changed SWIM3 register accesses to use the new address table in
|
|||
|
; SWIM3Vars. See <SM22> comments in SonySWIM3.a.
|
|||
|
; <1> 1/4/94 LB first checked in
|
|||
|
;_______________________________________________________________________
|
|||
|
;
|
|||
|
; Grand Central DMA routines for Sony SWIM3 driver
|
|||
|
;
|
|||
|
; This file contains the hardware-specific routines for the Grand
|
|||
|
; Central DMA controller, used on Tsumani/TNT. These routines are
|
|||
|
; installed into vectors which are called by the Sony SWIM3 floppy
|
|||
|
; driver.
|
|||
|
;
|
|||
|
; To do:
|
|||
|
;_______________________________________________________________________
|
|||
|
|
|||
|
INCLUDE 'DBDMA.a'
|
|||
|
INCLUDE 'GrandCentralPriv.a'
|
|||
|
|
|||
|
|
|||
|
with SWIM3Vars
|
|||
|
|
|||
|
;_______________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: jsr StartDMAAction
|
|||
|
; Inputs: d0.l- DMA timeout value
|
|||
|
; d1 - drive#
|
|||
|
; a1 - Globals
|
|||
|
; Outputs: none
|
|||
|
; Destroys: d0,a0
|
|||
|
; Calls: none
|
|||
|
; Called by: RawTrackRead, ReadRawHeader
|
|||
|
;
|
|||
|
; Function: This routine saves state in the DMARegSave area, and starts
|
|||
|
; the DMA, returning to the caller's caller.
|
|||
|
;_______________________________________________________________________
|
|||
|
|
|||
|
jStartGCDMAAction
|
|||
|
movem.l a3/d1-d3,DMARegSave(a1) ; save state
|
|||
|
move.l (sp)+,DMACompletionPtr(a1) ; stuff the completion routine
|
|||
|
|
|||
|
bsr.s StartDMATimeout ; start a time-out for the DMA
|
|||
|
|
|||
|
; enable floppy DMA channel interrupts
|
|||
|
|
|||
|
_GCEnableInterruptSource gcifDmaFloppy
|
|||
|
|
|||
|
move.b #StartAction,([vOnes,a1]) ; Start action
|
|||
|
|
|||
|
moveq #noErr,d0 ; return to caller's caller with no error
|
|||
|
rts
|
|||
|
|
|||
|
;_______________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: jsr SetUpDMAXFer
|
|||
|
; Inputs: a0 - DMA transfer address
|
|||
|
; a1 - SonyVars ptr
|
|||
|
; d0 - bit 31 = 0 -> read
|
|||
|
; = 1 -> write
|
|||
|
; bits 0-30 -> transfer count
|
|||
|
; Outputs: none
|
|||
|
; Destroys: d0
|
|||
|
; Calls:
|
|||
|
; Called by:
|
|||
|
;
|
|||
|
; Function: Sets up address, count, and direction for a DMA
|
|||
|
; transfer.
|
|||
|
;_______________________________________________________________________
|
|||
|
|
|||
|
jSetUpGCDMAXfer
|
|||
|
movem.l a2-a3/d1,-(sp) ; use a2 for DMA regs ptr, a3 for SonyVars
|
|||
|
|
|||
|
move.l a1,a3 ; SonyVars
|
|||
|
|
|||
|
move.l a0,a1 ; set xfer address
|
|||
|
move.l DBDMADescPtr(a3),a0 ; set ptr to descriptor
|
|||
|
swap d0 ; count in high word, bit 15 = command
|
|||
|
btst #15,d0
|
|||
|
bne @write
|
|||
|
@read
|
|||
|
move.w #INPUT_LAST,d0
|
|||
|
bra @makeCCD
|
|||
|
@write
|
|||
|
move.w #OUTPUT_LAST,d0
|
|||
|
@makeCCD
|
|||
|
swap d0 ; high word = cmd, low word = count
|
|||
|
_MakeCCDescriptor ; set up the descriptor
|
|||
|
|
|||
|
|
|||
|
; Point the DMA hardware at our CCL
|
|||
|
|
|||
|
movea.l DMABaseAddr(a3),a0 ; pointer to Grand Central reg base
|
|||
|
adda.l #kGCDMAChannelRegisterSpace \
|
|||
|
+ gcChannelFloppy*$100,a0 ; point to floppy channel registers
|
|||
|
|
|||
|
; Reset anything wrong with the channel status
|
|||
|
|
|||
|
move.l # kdbdmaClrRun |\
|
|||
|
kdbdmaClrPause |\
|
|||
|
kdbdmaClrHalted |\
|
|||
|
kdbdmaClrDead, d0
|
|||
|
_SetChannelControl
|
|||
|
|
|||
|
move.l DBDMADescPtr(a3),d0 ; pointer to channel command list in D0
|
|||
|
_SetCommandPtr ; A0 still points to DBDMAChannelRegisters
|
|||
|
|
|||
|
; Start our channel running
|
|||
|
|
|||
|
move.l # kdbdmaSetRun |\
|
|||
|
kdbdmaClrPause |\
|
|||
|
kdbdmaClrHalted |\
|
|||
|
kdbdmaClrDead |\
|
|||
|
kdbdmaSetActive, d0
|
|||
|
_SetChannelControl ; A0 still points to DBDMAChannelRegisters
|
|||
|
|
|||
|
move.l a3,a1 ;restore a1
|
|||
|
movem.l (sp)+,a2-a3/d1
|
|||
|
rts
|
|||
|
|
|||
|
;_______________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: jsr ClearDMAInt
|
|||
|
; Inputs: a1 - SonyVars ptr
|
|||
|
; Outputs: none
|
|||
|
; Destroys: none
|
|||
|
; Calls:
|
|||
|
; Called by:
|
|||
|
;
|
|||
|
; Function: Clears floppy DMA controller interrupt.
|
|||
|
;_______________________________________________________________________
|
|||
|
|
|||
|
jClearGCDMAInt
|
|||
|
move.l a0,-(sp)
|
|||
|
|
|||
|
_GCClearInterruptSource gcifDmaFloppy ; clear the floppy DMA interrupt
|
|||
|
|
|||
|
move.l (sp)+,a0
|
|||
|
rts
|
|||
|
|
|||
|
|
|||
|
|
|||
|
;_______________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: jsr StopDMA
|
|||
|
; Inputs: a1 - SonyVars ptr
|
|||
|
; Outputs: none
|
|||
|
; Destroys: none
|
|||
|
; Calls:
|
|||
|
; Called by:
|
|||
|
;
|
|||
|
; Function: Stops the floppy DMA channel.
|
|||
|
;_______________________________________________________________________
|
|||
|
|
|||
|
jStopGCDMA
|
|||
|
movem.l a0/d0,-(sp)
|
|||
|
|
|||
|
; clear the run bit in the Grand Central floppy DMA channel control register
|
|||
|
|
|||
|
movea.l DMABaseAddr(a1),a0 ; pointer to Grand Central reg base
|
|||
|
adda.l #kGCDMAChannelRegisterSpace \
|
|||
|
+ gcChannelFloppy*$100,a0 ; point to floppy channel registers
|
|||
|
move.l #kdbdmaClrRun, d0
|
|||
|
_SetChannelControl
|
|||
|
|
|||
|
movem.l (sp)+,d0/a0
|
|||
|
rts
|
|||
|
|
|||
|
|
|||
|
endwith ; SWIM3Vars
|