mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2025-01-01 11:29:27 +00:00
0ba83392d4
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.
225 lines
6.1 KiB
Plaintext
225 lines
6.1 KiB
Plaintext
;==========================================================================
|
|
;
|
|
; File: SIMMachine.a
|
|
;
|
|
; Contains: Misc. routines for SIM SCSI State Machine
|
|
;
|
|
; Written by: Paul Wolf
|
|
;
|
|
; Copyright: © 1990-1993 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <SM12> 11/16/93 SAM Include HardwarePrivateEqu.a
|
|
; <SM11> 10/14/93 pdw <MC> roll-in.
|
|
; <MC2> 10/12/93 pdw Added support for Synchronous data transfers, rewrote State
|
|
; Machine, message handling etc.
|
|
; <SM10> 9/9/93 pdw Lots of little changes. Name changes, temporary cache_bug
|
|
; stuff.
|
|
; <SM9> 7/8/93 pdw Changed recording data for stack switching events to help Kurt
|
|
; with StkLowPt problem.
|
|
; <SM8> 6/29/93 pdw Massive checkins: Change asynchronicity mechanism to CallMachine
|
|
; stack switching mechanism. Adding support for Cold Fusion.
|
|
; Rearranging HW/SW Init code. Some code optimizations.
|
|
; <SM7> 5/5/93 PW Converted names to meanies-friendly names. Updated with latest
|
|
; from Ludwig stuff.
|
|
; <LW3> 5/1/93 PW Got rid of RECORD_ON and RECORD_rCMD definitions (should only be
|
|
; in Debug.a now.
|
|
; <SM6> 2/9/93 PW Removed some PDM debug stuff that's not needed.
|
|
; <SM5> 1/31/93 PW Update from the latest of Ludwig. Also changes required for PDM
|
|
; (will update Ludwig with these as needed myself).
|
|
; <SM4> 11/20/92 DCB Removed VM Stuff and put it into SCSIGlue.a
|
|
; <SM3> 10/30/92 DCB Stopped recording VM calls
|
|
; <SM2> 10/8/92 PW Removed lots of unused code.
|
|
;
|
|
;==========================================================================
|
|
|
|
|
|
MACHINE MC68020 ; '020-level
|
|
BLANKS ON ; assembler accepts spaces & tabs in operand field
|
|
PRINT OFF ; do not send subsequent lines to the listing file
|
|
; don't print includes
|
|
|
|
|
|
INCLUDE 'SysEqu.a' ; for StkLowPt
|
|
INCLUDE 'HardwarePrivateEqu.a'
|
|
INCLUDE 'Traps.a' ; for _DebugStr
|
|
INCLUDE 'Debug.a' ; for NAME
|
|
INCLUDE 'ACAM.a'
|
|
INCLUDE 'HALc96equ.a'
|
|
|
|
|
|
PRINT ON ; do send subsequent lines to the listing files
|
|
CASE OBJECT
|
|
|
|
IMPORT RecordEvent
|
|
|
|
|
|
;==========================================================================
|
|
|
|
|
|
;**************************************************************************
|
|
;
|
|
; CallMachine -
|
|
;
|
|
;==========================================================================
|
|
|
|
CallMachine PROC EXPORT
|
|
|
|
IMPORT TheMachine
|
|
IMPORT FreeMachine
|
|
WITH HALc96GlobalRecord
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
; Switch to SCSI stack, suspending the main "thread".
|
|
; then call the selected routine
|
|
; then switch back to the previous "thread" which may be the main thread or
|
|
; it may be the interrupt thread (i.e. we're finally completing a request)
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
move.l A5, -(sp) ; save caller's A5
|
|
|
|
move.l 8(sp), A0 ; get SIMg parameter
|
|
move.l (A0), A5 ; get HALg
|
|
|
|
DisableSCSIIRQ ; disable ints before we go down into Machine
|
|
|
|
IF STACK_RECORD_ON THEN
|
|
pea '>> '
|
|
move.l StkLowPt, -(sp)
|
|
bsr RecordEvent
|
|
addq.l #8, sp
|
|
ENDIF
|
|
|
|
movem.l D3-D7/A2-A6, -(sp)
|
|
bsr.s PrivateCallMachine ; MAGIC stack change here!!
|
|
movem.l (sp)+, D3-D7/A2-A6
|
|
|
|
IF STACK_RECORD_ON THEN
|
|
pea '<< '
|
|
move.l StkLowPt, -(sp)
|
|
bsr RecordEvent
|
|
addq.l #8, sp
|
|
ENDIF
|
|
|
|
EnableSCSIIRQ ; enable ints after we come back out
|
|
|
|
move.l (sp)+, A5 ; restore caller's A5
|
|
rts
|
|
|
|
NAME 'CallMachine'
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
PrivateCallMachine
|
|
|
|
; Switch to SCSI stack ÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
IF STACK_RECORD_ON THEN
|
|
pea ' >>'
|
|
move.l StkLowPt, -(sp)
|
|
bsr RecordEvent
|
|
addq.l #8, sp
|
|
ENDIF
|
|
|
|
move.l StkLowPt, publicStkLowPt(A5) ; remember old StkLowPt
|
|
clr.l StkLowPt ; and disable stack sniffer
|
|
move.l sp, publicSP(A5) ; suspend main thread
|
|
IF DEBUGGING THEN
|
|
move.b #1, privStackState(A5)
|
|
ENDIF
|
|
move.l privStackTop(A5), sp ; create SCSI thread
|
|
|
|
IF STACK_RECORD_ON THEN
|
|
pea '>Mch'
|
|
move.l StkLowPt, -(sp)
|
|
bsr RecordEvent
|
|
addq.l #8, sp
|
|
ENDIF
|
|
|
|
; Call the State Machine ÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
; TheMachine( OSErr * finalStatus, SIM_IO ** completedIO, SIMglobals * SIMg)
|
|
|
|
subq.l #6, sp ; allocate room for completedIO & finalStatus
|
|
|
|
move.l A0, -(sp) ; pass SIMg into Machine
|
|
pea 4(sp) ; sp=SIMg,completedIO
|
|
pea 12(sp) ; sp=*completedIO,SIMg,completedIO,finalStatus
|
|
|
|
bsr TheMachine
|
|
|
|
lea 8(sp), sp ; get rid of parameters except for...
|
|
move.l (sp)+, A0 ; ...SIMg
|
|
move.l (sp)+, A1 ; get completedIO
|
|
moveq.l #0, D1
|
|
move.w (sp)+, D1 ; get finalStatus
|
|
|
|
; Return to previous stack ÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
IF STACK_RECORD_ON THEN
|
|
pea '<Mch'
|
|
move.l StkLowPt, -(sp)
|
|
bsr RecordEvent
|
|
addq.l #8, sp
|
|
ENDIF
|
|
|
|
IF DEBUGGING THEN
|
|
move.b #4, privStackState(A5)
|
|
ENDIF
|
|
move.l publicSP(A5), sp ; resume previous thread
|
|
move.l publicStkLowPt(A5), StkLowPt ; resume stack sniffing
|
|
|
|
IF STACK_RECORD_ON THEN
|
|
pea ' <<'
|
|
move.l StkLowPt, -(sp)
|
|
bsr RecordEvent
|
|
addq.l #8, sp
|
|
ENDIF
|
|
|
|
tst.w D0 ; what did TheMachine return?
|
|
beq.s @exit ; freeTheMachine? no -> rts (old API)
|
|
move.l A0, -(sp) ; SIMg
|
|
move.l A1, -(sp) ; ioPtr
|
|
move.l D1, -(sp) ; finalStatus
|
|
bsr FreeMachine
|
|
lea 12(sp), sp ; get rid of parameters
|
|
@exit
|
|
rts
|
|
|
|
NAME 'PrivateCallMachine'
|
|
|
|
ENDWITH
|
|
|
|
;**************************************************************************
|
|
;
|
|
; BlockInterrupts, UnblockInterrupts -
|
|
;
|
|
;==========================================================================
|
|
|
|
BlockInterrupts PROC EXPORT
|
|
|
|
move.w SR, D0
|
|
ori.w #$0700,SR ; disable all ints
|
|
rts
|
|
|
|
NAME 'BlockInterrupts'
|
|
|
|
ENDP
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
UnblockInterrupts PROC EXPORT
|
|
|
|
move.w 6(sp), SR
|
|
rts
|
|
|
|
NAME 'UnblockInterrupts'
|
|
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
END
|
|
|
|
|