mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 01:29:20 +00:00
4325cdcc78
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.
179 lines
4.7 KiB
Plaintext
179 lines
4.7 KiB
Plaintext
;_______________________________________________________________________
|
|
;
|
|
; File: SonySWIM3GC.a
|
|
;
|
|
; Written by: Monte Benaresh 1/4/94.
|
|
;
|
|
; Copyright: © 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
|