;ΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡΡ ; ; File: XPTSCSIXlate.a ; ; Function: Intercepts old SCSI Manager calls and sends them to the XPT. ; ; Written by: Paul Wolf ; ; Copyright: © 1992-1993 by Apple Computer, Inc., All rights reserved. ; ; This file is used in these builds: ; ; Change History (most recent first): ; ; 10/29/93 DCB Getting rid of warnings. ; 10/14/93 pdw ; 10/12/93 pdw Added support for Synchronous data transfers, rewrote State ; Machine, message handling etc. ; 9/9/93 pdw Lots of little changes. Name changes, temporary cache_bug ; stuff. ; 7/8/93 pdw Added call to RecordError if error is being returned. ; 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. ; 5/29/93 PW Resolving with my Ludwig sources. ; 5/25/93 DCB Changing DebugStr to IFDebugStr/SysErr ; 5/5/93 PW Converted names to meanies-friendly names. Updated with latest ; from Ludwig stuff. ; 5/1/93 PW Got rid of RECORD_ON and RECORD_rCMD definitions (should only be ; in Debug.a now. ; 4/30/93 DCB Changing default RECORD_ON to 0 for final Candidate ; 2/9/93 PW Removed some Terror comment tags. ; 1/31/93 PW Update from the latest of Ludwig. Also some changes required ; for PDM (will update Ludwig with these changes myself). ; 1/13/93 PW Fixed everyone's RECORD_ON build problem. ; 1/12/93 DCB Changed CALL_RECORD_ON use to pay attention to -d defines in asm ; command line. ; 11/20/92 DCB Support for SCSI Msg In/Out ; 10/30/92 DCB New name for SCSI.a ; ;========================================================================== BLANKS ON ; assembler accepts spaces & tabs in operand field PRINT OFF ; do not send subsequent lines to the listing file ; don't print includes CASE OBJECT ; preserve case in object file LOAD 'StandardEqu.d' ; from StandardEqu.a and for building ROMs INCLUDE 'Debug.a' INCLUDE 'SCSI.a' ; INCLUDE 'ACAM.a' INCLUDE 'XPTEqu.a' INCLUDE 'HALc96equ.a' PRINT ON ; do send subsequent lines to the listing files SCSIXLATE PROC EXPORT EXPORT Init_SCSIXlate IMPORT OldSCSICall IMPORT RecordEvent, RecordError ;-------------------------------------------------------------------------- ; EXIT POINT StdExit2 ; Bad Select and SCSIComplete exit point StdExit movem.l (sp)+, a2-a5/d2-d7 ; restore these guys unlk a6 move.l (sp)+, a0 ; get return address add.w d0, sp ; fixup the stack IF RECORD_ON THEN tst.w (sp) beq.s @1 bsr RecordError ; use value at (sp) @1 ENDIF jmp (a0) RTSNAME 'StdExit' ;-------------------------------------------------------------------------- ; ; FUNCTION SCSIReset: INTEGER; ; (8) ; ; Uses: a0, a3, d0, d2, d3 ; ; Return Codes: ; noErr CI_SCSIReset IF CALL_RECORD_ON and RECORD_ON THEN pea 'Rst-' clr.l -(sp) bsr RecordEvent addq.l #8, sp ENDIF clr.l -(sp) ; missing parm 3 padding clr.l -(sp) ; missing parm 2 padding clr.l -(sp) ; missing parm 1 padding move.l D1, -(sp) ; scsiSelector bsr OldSCSICall add.l #$10, sp IF CALL_RECORD_ON and RECORD_ON THEN pea '-Rst' move.l D0, -(sp) bsr RecordEvent addq.l #8, sp ENDIF move.w d0, 8+0(a6) ; return code bra.s NoByteExit RTSNAME 'CI_SCSIReset' ;-------------------------------------------------------------------------- ; ; FUNCTION SCSIGet: INTEGER; ; (8) ; ; Uses: d0, d1, d2, d3 ; ; Return Codes: ; noErr CI_SCSIGet IF CALL_RECORD_ON and RECORD_ON THEN pea 'Get-' clr.l -(sp) bsr RecordEvent addq.l #8, sp ENDIF clr.l -(sp) ; missing parm 3 padding clr.l -(sp) ; missing parm 2 padding clr.l -(sp) ; missing parm 1 padding move.l D1, -(sp) ; scsiSelector bsr OldSCSICall add.l #$10, sp IF CALL_RECORD_ON and RECORD_ON THEN pea '-Get' ; EVENT = move.l D0, -(sp) ; result bsr RecordEvent addq.l #8, sp ENDIF move.w d0, 8+0(a6) ; return code NoByteExit moveq.l #0, d0 ; no arguments to clean up bra.w StdExit RTSNAME 'CI_SCSIGet' ;-------------------------------------------------------------------------- ; ; FUNCTION SCSISelect(TargID:INTEGER): INTEGER; ; FUNCTION SCSISelAtn(TargID:INTEGER): INTEGER; ; (8) (10) ; CI_SCSISelect CI_SCSISelAtn IF CALL_RECORD_ON and RECORD_ON THEN pea 'Sel-' ; EVENT = move.w 8(a6), -(sp) ; get the target's ID - parm 1 clr.w -(sp) ; ID padding bsr RecordEvent addq.l #8, sp ENDIF clr.l -(sp) ; missing parm 3 padding clr.l -(sp) ; missing parm 2 padding move.w 8(a6), -(sp) ; get the target's ID - parm 1 clr.w -(sp) ; ID padding move.l D1, -(sp) ; scsiSelector bsr OldSCSICall add.l #$10, sp IF CALL_RECORD_ON and RECORD_ON THEN pea '-Sel' ; EVENT = move.l D0, -(sp) ; result bsr RecordEvent addq.l #8, sp ENDIF move.w d0, 8+2(a6) ; return the result moveq.l #2, d0 ; stack cleanup bra.w StdExit ; RTSNAME 'CI_SCSISelect_Atn' ;-------------------------------------------------------------------------- ; ; FUNCTION SCSICmd(Buffer:Ptr, Count:INTEGER): INTEGER; ; (10) (8) (14) ; ; Send the target the given command. ; ; Return Codes: ; noErr, scPhaseErr, scCommErr CI_SCSICmd IF CALL_RECORD_ON and RECORD_ON THEN pea 'Cmd-' ; EVENT = move.w ([10,a6]),-(sp) ; 1st 2 CDB bytes move.w 8(a6), -(sp) ; get the length - parm 2 bsr RecordEvent addq.l #8, sp move.l ([10,a6],2),-(sp) ; CDB bytes 2-5 move.l ([10,a6],6),-(sp) ; CDB bytes 6-9 bsr RecordEvent addq.l #8, sp ENDIF clr.l -(sp) ; missing parm 3 padding move.w 8(a6), -(sp) ; get the length - parm 2 clr.w -(sp) ; length padding move.l 10(a6), -(sp) ; get command buffer address - parm 1 move.l D1, -(sp) ; scsiSelector bsr OldSCSICall add.l #$10, sp IF CALL_RECORD_ON and RECORD_ON THEN pea '-Cmd' ; EVENT = move.l D0, -(sp) ; result bsr RecordEvent addq.l #8, sp ENDIF move.w d0, 8+6(a6) ; return the result moveq.l #6, d0 ; cleanup stack value bra.w StdExit RTSNAME 'CI_SCSICmd' ;-------------------------------------------------------------------------- ; ; FUNCTION SCSIMsgIn( char * msgPtr): INTEGER; ; (8) (12) ; CI_SCSIMsgIn IF CALL_RECORD_ON and RECORD_ON THEN pea 'MgI-' ; EVENT = move.l 8(a6), -(sp) ; get the msg ptr - parm 1 bsr RecordEvent addq.l #8, sp ENDIF clr.l -(sp) ; missing parm 3 padding clr.l -(sp) ; missing parm 2 padding move.l 8(a6), -(sp) ; get the target's ID - parm 1 move.l D1, -(sp) ; scsiSelector bsr OldSCSICall add.l #$10, sp IF CALL_RECORD_ON and RECORD_ON THEN pea '-MgI' ; EVENT = move.l D0, -(sp) ; result bsr RecordEvent addq.l #8, sp ENDIF move.w d0, 8+4(a6) ; return the result moveq.l #4, d0 ; stack cleanup bra.w StdExit ; RTSNAME 'CI_SCSIMsgIn' ;-------------------------------------------------------------------------- ; ; FUNCTION SCSIMsgOut( msg): INTEGER; ; (8) (10) ; CI_SCSIMsgOut IF CALL_RECORD_ON and RECORD_ON THEN pea 'MgO-' ; EVENT = move.w 8(a6), -(sp) ; get the msg - parm 1 clr.w -(sp) ; ID padding bsr RecordEvent addq.l #8, sp ENDIF clr.l -(sp) ; missing parm 3 padding clr.l -(sp) ; missing parm 2 padding move.w 8(a6), -(sp) ; get the msg - parm 1 clr.w -(sp) ; ID padding move.l D1, -(sp) ; scsiSelector bsr OldSCSICall add.l #$10, sp IF CALL_RECORD_ON and RECORD_ON THEN pea '-MgO' ; EVENT = move.l D0, -(sp) ; result bsr RecordEvent addq.l #8, sp ENDIF move.w d0, 8+2(a6) ; return the result moveq.l #2, d0 ; stack cleanup bra.w StdExit ; RTSNAME 'CI_SCSIMsgOut' ;-------------------------------------------------------------------------- ; ; SCSIRead, SCSIRBlind, SCSIWrite, SCSIWBlind ; ; FUNCTION SCSI_R/W(TIB:TIBPtr): INTEGER; ; (8) (12) ; ; Called by: Toolbox Trap Dispatcher ; ; Calls: Transfer, primitive data transfer routines ; ; On entry: a3 - SCSI read base address ; a4 - pointer to SCSI Manager globals ; ; Internal: a1 - TIB scan pointer ; ; Function: Performs TIB interpretation, and data transfers. CI_SCSIWBlind IF CALL_RECORD_ON and RECORD_ON THEN pea 'WBL-' ; EVENT = move.l 8(a6), -(sp) ; get the TIB pointer - parm 1 bsr RecordEvent addq.l #8, sp bra.s CI_data ENDIF CI_SCSIWrite IF CALL_RECORD_ON and RECORD_ON THEN pea 'Wrt-' ; EVENT = move.l 8(a6), -(sp) ; get the TIB pointer - parm 1 bsr RecordEvent addq.l #8, sp bra.s CI_data ENDIF CI_SCSIRBlind IF CALL_RECORD_ON and RECORD_ON THEN pea 'RBL-' ; EVENT = move.l 8(a6), -(sp) ; get the TIB pointer - parm 1 bsr RecordEvent addq.l #8, sp bra.s CI_data ENDIF CI_SCSIRead IF CALL_RECORD_ON and RECORD_ON THEN pea 'Rd- ' ; EVENT = move.l 8(a6), -(sp) ; get the TIB pointer - parm 1 bsr RecordEvent addq.l #8, sp ENDIF CI_data clr.l -(sp) ; missing parm 3 padding clr.l -(sp) ; missing parm 2 padding move.l 8(a6), -(sp) ; get the TIB pointer - parm 1 move.l D1, -(sp) ; scsiSelector bsr OldSCSICall add.l #$10, sp IF CALL_RECORD_ON and RECORD_ON THEN pea '-Dat' ; EVENT = move.l D0, -(sp) ; result bsr RecordEvent addq.l #8, sp ENDIF move.w d0, 8+4(a6) ; return the result moveq.l #4, d0 ; stack cleanup bra.w StdExit RTSNAME 'CI_SCSI_data' ;-------------------------------------------------------------------------- ; ; FUNCTION SCSIComplete(VAR Stat, Message: INTEGER; wait:LongInt): INTEGER; ; (16) (12) (8) (20) ; ; ; Return Codes: ; noErr, scCommErr, scPhaseErr, scComplPhaseErr CI_SCSIComplete IF CALL_RECORD_ON and RECORD_ON THEN pea 'Cpt-' ; EVENT = move.l 16(a6), -(sp) ; get the client's status ptr - parm 1 bsr RecordEvent addq.l #8, sp ENDIF move.l 8(a6), -(sp) ; get tick count timeout - parm 3 move.l 12(a6), -(sp) ; get the client's msg ptr - parm 2 move.l 16(a6), -(sp) ; get the client's status ptr - parm 1 move.l D1, -(sp) ; scsiSelector bsr OldSCSICall add.l #$10, sp IF CALL_RECORD_ON and RECORD_ON THEN pea '-Cpt' ; EVENT = move.l D0, -(sp) ; result bsr RecordEvent addq.l #8, sp ENDIF move.w D0, 8+12(a6) ; return error moveq.l #12, d0 ; stack cleanup bra.w StdExit2 ; RTSNAME 'CI_SCSIComplete' ;-------------------------------------------------------------------------- ; ; FUNCTION SCSIStat: INTEGER; ; (8) ; ; ; Uses: d0, d1, d2 ; ; Return Codes: ; noErr CI_SCSIStat clr.l -(sp) ; missing parm 3 padding clr.l -(sp) ; missing parm 2 padding clr.l -(sp) ; missing parm 1 padding move.l D1, -(sp) ; scsiSelector bsr OldSCSICall add.l #$10, sp move.w D0, 8(a6) ; 8(a6) <- Bus and Status bra.w NoByteExit ; 9(a6) <- Current SCSI Bus Status RTSNAME 'CI_SCSIStat' ;-------------------------------------------------------------------------- ; ; FUNCTION Unimplemented: INTEGER; ; (8) CI_Unimplemented IfDebugStr 'unimplemented SCSIDispatch selector' moveq #dsIOCoreErr, D0 _SysError rts ;-------------------------------------------------------------------------- ; ; Initialization code for the SCSI Manager Init_SCSIXlate movem.l scsiRegs, -(sp) ; save all registers, for convenience movea.l SCSIGlobals, a4 ; get ptr to structure ; Set up the jump table moveq.l #numSelectors-1, d1 ; loop count lea.l OffsetTbl, a1 ; get start of dispatch table IF forC96Init OR forROM THEN ; if not a linked patch, treat addrs relative move.l a1, d0 ; remember base address ELSE moveq.l #0, D0 ; if linked patch, treat addrs absolute ENDIF movea.l a4, a0 ; point to base of old SCSI Mgr jump table @MakeJmpTbl move.l (a1)+, d2 ; get the next offset beq.s @skipEntry ; if zero, skip this entry add.l d0, d2 ; compute the address move.l d2, (a0) ; install it in the jump table @skipEntry adda.l #4, a0 dbra d1, @MakeJmpTbl ; loop for all vectors @InitDone movem.l (sp)+, scsiRegs ; restore registers rts NAME 'Init_SCSIXlate' ;------------------------------------------------------------- ; Macro DispatchVector &ROMAddress IF forC96Init OR forROM THEN ; dc.l &ROMAddress-OffsetTbl ELSE dcImportResident &ROMAddress ENDIF EndM OffsetTbl DispatchVector CI_SCSIReset ; 0: SCSIReset DispatchVector CI_SCSIGet ; 1: SCSIGet DispatchVector CI_SCSISelect ; 2: SCSISelect DispatchVector CI_SCSICmd ; 3: SCSICmd DispatchVector CI_SCSIComplete ; 4: SCSIComplete DispatchVector CI_SCSIRead ; 5: SCSIRead DispatchVector CI_SCSIWrite ; 6: SCSIWrite DispatchVector CI_Unimplemented ; 7: Was SCSIInstall DispatchVector CI_SCSIRBlind ; 8: SCSIRBlind DispatchVector CI_SCSIWBlind ; 9: SCSIWBlind DispatchVector CI_SCSIStat ; 10: SCSIStat DispatchVector CI_SCSISelAtn ; 11: SCSISelAtn DispatchVector CI_SCSIMsgIn ; 12: SCSIMsgIn DispatchVector CI_SCSIMsgOut ; 13: SCSIMsgOut ;========================================================================== END