mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-10-30 23:26:05 +00:00
438 lines
16 KiB
Plaintext
438 lines
16 KiB
Plaintext
;
|
|
; File: AliasMgr.a
|
|
;
|
|
; Contains: Alias Manager trap dispatcher and gestalt support
|
|
;
|
|
; Written by: Prashant Patel
|
|
;
|
|
; Copyright: © 1989-1992 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <SM3> 10/28/92 SWC Changed ATalkEqu.a->AppleTalk.a.
|
|
; <17> 6/2/92 JSM Move AliasMgrInstall here (and capitalize it) from
|
|
; AliasMgrPatch.a since it's used by both the ROM and System
|
|
; builds.
|
|
; <16> 2/27/91 PP ich,#ich-AMgr-0096:Interface for GetExportedFolderInfo has
|
|
; changed.
|
|
; <15> 1/30/91 gbm sab, #38: Reorganize some of the include files, change CASE to
|
|
; OBJ to avoid several case sensitivity bugs in the assembler
|
|
; <14> 1/25/91 PP ich,#81507:Add FollowFinderAlias as an internal trap selector so
|
|
; Finder can use it.
|
|
; <13> 1/14/91 PP (sad) Add GetFolderName. Get rid of short branch warnings.
|
|
; <12> 12/20/90 PP (ich) Added BlockInit routine.
|
|
; <11> 9/1/90 PP SetArrowCursor is selector id 29.
|
|
; <10> 8/6/90 PP Support auto volume mount for foreign file systems other than
|
|
; AppleShare.
|
|
; <9> 7/2/90 PP Add ReleaseFolder and ResolveAliasFile.
|
|
; <8> 6/15/90 PP Remove "SelectAlias" and associated Traps. Allow a way for
|
|
; building AliasMgr as an INIT overpatch.
|
|
; <7> 5/10/90 JSM Use secondary jump table so we can be a linked patch.
|
|
; <6> 5/3/90 PP Incorporate Diet tips.
|
|
; <5> 3/8/90 PP Add Trap selectors #8 and #9 for minimal alias support.
|
|
; <4> 2/27/90 PP Add Trap selector #10 for FindFolderInternal.
|
|
; <3> 2/6/90 PP Remove CatSearch glue.
|
|
; <2> 1/4/90 PP Add gestalt support.
|
|
; <2.0> 12/8/89 dnf remove CatSearch macro definition
|
|
; <1.9> 11/27/89 prp SetArrowCursor is a Trap selector routine.
|
|
; <1.8> 10/30/89 prp • Add AL_findVolume internally selected trap.
|
|
; <1.7> 10/13/89 prp Added AL_appendPString and AL_displayAlert as internal Trap
|
|
; selectors.
|
|
; <1.6> 10/2/89 prp Added 'GetAliasInfo' routine.
|
|
; <1.5> 9/18/89 prp AL_filterFile is an additional trap selector.
|
|
; <1.4> 9/6/89 prp Added DisposeAlias back until DPMgr is in sync.
|
|
; <1.3> 9/6/89 prp Changes from CodeReview.
|
|
; <1.2> 8/7/89 prp Additional Trap selector routines.
|
|
; <1.1> 6/5/89 prp Folder Manager is added as part of Alias Manager.
|
|
; <1.0> 5/30/89 prp Initial Release
|
|
; 5/28/89 prp Initial Creation
|
|
;
|
|
|
|
TITLE 'AliasMgr.a - alias trap'
|
|
CASE OBJ
|
|
|
|
PRINT OFF
|
|
LOAD 'StandardEqu.d'
|
|
INCLUDE 'LinkedPatchMacros.a' ; <17>
|
|
INCLUDE 'GestaltEqu.a'
|
|
INCLUDE 'InternalMacros.a'
|
|
INCLUDE 'AppleTalk.a'
|
|
PRINT ON
|
|
|
|
DEBUG default false ; debugging off by default
|
|
FOR_AMGR_PATCH_INIT default false ; AliasMgrPatchINIT off by default
|
|
|
|
;===============================================================================
|
|
;
|
|
; ALIASMGRINSTALL() <17>
|
|
;
|
|
; InstallProc for the Alias Manager. Calls InitFolderManager and installs
|
|
; the Alias Manager and Folder Manager Gestalt routines. For this
|
|
; reason, Gestalt must be installed before us.
|
|
;
|
|
;===============================================================================
|
|
ALIASMGRINSTALL InstallProc (Plus,SE,II,Portable,IIci)
|
|
|
|
IMPORT InitFolderManager
|
|
IMPORT gestaltAliasMgr
|
|
IMPORT gestaltFolderMgr
|
|
|
|
JSR InitFolderManager ; set up the Folder Manager
|
|
|
|
MOVE.L #gestaltAliasMgrAttr,d0 ; AliasMgr Gestalt selector
|
|
leaResident gestaltAliasMgr,a0 ; get gestaltFunction ProcPtr
|
|
_NewGestalt
|
|
|
|
MOVE.L #gestaltFindFolderAttr,d0 ; FolderMgr Gestalt selector
|
|
leaResident gestaltFolderMgr,a0 ; get gestaltFunction ProcPtr
|
|
_NewGestalt
|
|
|
|
RTS
|
|
ENDPROC ; end of ALIASMGRINSTALL
|
|
|
|
;===============================================================================
|
|
;
|
|
; PROCEDURE ALIAS(); - alias manager trap
|
|
;
|
|
;===============================================================================
|
|
|
|
PROC
|
|
|
|
EXPORT ALIAS
|
|
|
|
; macro to build jump table
|
|
if FOR_AMGR_PATCH_INIT then
|
|
|
|
Bra.s ALIAS ; Allow this file to be compiled as a patch.
|
|
endif
|
|
|
|
MACRO
|
|
JT &entry
|
|
DC.W JumpTo&entry - JumpTable
|
|
ENDM
|
|
|
|
JumpTable ; offsets to alias manager routines
|
|
JT FindFolder ; 0 find folder by type (Folder Manager)
|
|
JT AL_CANONIFYFILE ; 1 canonify a filename
|
|
JT AL_NEWALIAS ; 2 create a new alias
|
|
JT AL_RESOLVEALIAS ; 3 resolve "the" alias
|
|
DC.W 0 ; 4 select an alias (obsolete)
|
|
JT AL_MATCHALIAS ; 5 match an alias for >=1 matches
|
|
JT AL_UPDATEALIAS ; 6 update an alias
|
|
JT AL_GETALIASINFO ; 7 get alias information
|
|
JT AL_NEWALIASMINIMAL ; 8 create a new minimal alias
|
|
JT AL_NEWALIASMINIMALFROMFULLPATH ; 9 create a new minimal alias from fullpath
|
|
JT FindFolderInternal ; 10 find folder internal (For Installer)
|
|
JT ReleaseFolder ; 11 release folder (Folder Manager)
|
|
JT AL_RESOLVEALIASFILE ; 12 Resolve an alias created by Finder
|
|
JT AL_ALIASVOLUMEMOUNT ; 13 Mount a foreign volume
|
|
JT GetFolderName ; 14 get special folder name (Folder Manager)
|
|
JT AL_FOLLOWFINDERALIAS ; 15 Follow an alias created by Finder
|
|
|
|
ReservedPublic
|
|
EndReserved
|
|
; following are alias manager support routines that are good candidates for a
|
|
; generalized file manager utility routines.
|
|
JT ALI_FINDVOLBYNAME ; 16 find volume by name
|
|
JT ALI_FINDDIRBYID ; 17 find directory by ID
|
|
JT ALI_FINDBYNAME ; 18 find file/directory by name
|
|
JT ALI_FINDFILEBYID ; 19 find file by cnodeID
|
|
JT ALI_FINDFILEBYNUM ; 20 find file by file number
|
|
JT ALI_ISFULLPATH ; 21 Is given path a full path?
|
|
JT ALI_GETFILENAME ; 22 parse filename from full or partial path
|
|
JT ALI_STRIPFILENAME ; 23 strip filename from full or partial path
|
|
JT ALI_COPYPSTRING ; 24 copy a pascal string
|
|
JT ALI_FSEQUALSTRING ; 25 comapare FileSystem fileName string
|
|
JT ALI_BLOCKINIT ; 26 init a block with given char
|
|
JT ALI_BLOCKCOMPARE ; 27 comapare two blocks
|
|
JT ALI_APPENDPSTRING ; 28 append a pascal string
|
|
JT SETARROWCURSOR ; 29 set arrow cursor
|
|
JumpEnd
|
|
|
|
minSelector EQU (JumpTable - JumpTable) / 2 ; no private routines
|
|
maxSelector EQU (JumpEnd - JumpTable) / 2 - 1
|
|
minReservedSelector EQU (ReservedPublic - JumpTable) / 2
|
|
maxReservedSelector EQU (EndReserved - JumpTable) / 2 - 1
|
|
|
|
ALIAS ; actual dispatcher starts here
|
|
|
|
lEntry
|
|
CMP.B #minSelector, D0 ; do range checking
|
|
BLT.S lBadSelector ; too small
|
|
CMP.B #maxSelector, D0
|
|
BGT.S lBadSelector ; too big
|
|
CMP.B #minReservedSelector, D0 ; do reserved range checking
|
|
BLT.S lDispatch ; it is a valid public call
|
|
CMP.B #maxReservedSelector, D0
|
|
BLE.S lBadSelector ; reserved public call
|
|
|
|
lDispatch
|
|
EXT.W D0 ; selector OK
|
|
ASL.W #1, D0 ; extend and shift
|
|
MOVE.W JumpTable(D0.W), D0 ; get the offset
|
|
JMP JumpTable(D0.W) ; jump to it
|
|
|
|
lBadSelector
|
|
LSR.W #8, D0 ; get the stack frame size
|
|
MOVEA.L (A7)+, A0 ; move the return address
|
|
ADD.W D0, A7 ; pop the parameters
|
|
MOVE.W #corErr, (A7) ; core routine number not in range
|
|
JMP (A0) ; return to caller
|
|
|
|
;
|
|
; Because linked patches don't allow word references to other modules,
|
|
; the jump table before this one points to the following "real" jump table,
|
|
; which does a JMP to the actual routine.
|
|
;
|
|
|
|
; macro to build "real" jump table
|
|
|
|
MACRO
|
|
JumpTo &name
|
|
IMPORT &name
|
|
JumpTo&name: JMP &name
|
|
ENDM
|
|
|
|
CODEREFS FORCEJT ; we don't want PC relative here
|
|
RealJumpTable
|
|
JumpTo FindFolder ; 0 find folder by type (Folder Manager)
|
|
JumpTo AL_CANONIFYFILE ; 1 canonify a filename
|
|
JumpTo AL_NEWALIAS ; 2 create a new alias
|
|
JumpTo AL_RESOLVEALIAS ; 3 resolve "the" alias
|
|
JumpTo AL_MATCHALIAS ; 5 match an alias for >=1 matches
|
|
JumpTo AL_UPDATEALIAS ; 6 update an alias
|
|
JumpTo AL_GETALIASINFO ; 7 get alias information
|
|
JumpTo AL_NEWALIASMINIMAL ; 8 create a new minimal alias
|
|
JumpTo AL_NEWALIASMINIMALFROMFULLPATH ; 9 create a new minimal alias from fullpath
|
|
JumpTo FindFolderInternal ; 10 find folder internal (For Installer)
|
|
JumpTo ReleaseFolder ; 11 release folder (Folder Manager)
|
|
JumpTo AL_RESOLVEALIASFILE ; 12 Resolve an alias created by Finder
|
|
JumpTo AL_ALIASVOLUMEMOUNT ; 13 Mount a foreign volume
|
|
JumpTo GetFolderName ; 14 Get a special folder name
|
|
JumpTo AL_FOLLOWFINDERALIAS ; 15 Follow an alias created by Finder
|
|
JumpTo ALI_FINDVOLBYNAME ; 16 find volume by name
|
|
JumpTo ALI_FINDDIRBYID ; 17 find directory by ID
|
|
JumpTo ALI_FINDBYNAME ; 18 find file/directory by name
|
|
JumpTo ALI_FINDFILEBYID ; 19 find file by cnodeID
|
|
JumpTo ALI_FINDFILEBYNUM ; 20 find file by file number
|
|
JumpTo ALI_ISFULLPATH ; 21 Is given path a full path?
|
|
JumpTo ALI_GETFILENAME ; 22 parse filename from full or partial path
|
|
JumpTo ALI_STRIPFILENAME ; 23 strip filename from full or partial path
|
|
JumpTo ALI_COPYPSTRING ; 24 copy a pascal string
|
|
JumpTo ALI_FSEQUALSTRING ; 25 comapare FileSystem fileName string
|
|
JumpTo ALI_BLOCKINIT ; 26 init a block with given char
|
|
JumpTo ALI_BLOCKCOMPARE ; 27 comapare two blocks
|
|
JumpTo ALI_APPENDPSTRING ; 28 append a pascal string
|
|
JumpTo SETARROWCURSOR ; 29 set arrow cursor
|
|
|
|
CODEREFS FORCEPC
|
|
|
|
ENDPROC
|
|
|
|
;===============================================================================
|
|
;
|
|
; PROCEDURE gestaltAliasMgr(); - alias manager gestalt function
|
|
;
|
|
; FUNCTION gestaltAliasMgr (
|
|
; gestaltSelector: OSType; = PACKED ARRAY [1..4] OF CHAR;
|
|
; VAR gestaltResult: Longint;
|
|
; ): OSErr; = Integer;
|
|
;
|
|
;===============================================================================
|
|
|
|
gestaltAliasMgr PROC EXPORT
|
|
|
|
resultsStackFrame
|
|
error ds.w 1 ; the resulting error code
|
|
parametersStackFrame
|
|
gestaltSelector ds.l 1 ; the selector type
|
|
gestaltResult ds.l 1 ; returned result
|
|
endStackFrame
|
|
|
|
linkSave
|
|
|
|
MOVE.W #gestaltUndefSelectorErr,D0 ; assume bad selector was passed
|
|
CLR.L D1 ; initialize return result code
|
|
CMP.L #gestaltAliasMgrAttr,gestaltSelector(A6)
|
|
BNE.S @done ; not the right selector
|
|
BSET.L #gestaltAliasMgrPresent,D1 ; set the presence bit
|
|
CLR.W D0 ; no error
|
|
@done
|
|
MOVE.L gestaltResult(a6),A0 ; load address of result
|
|
MOVE.L D1,(A0) ; return the computed result
|
|
MOVE.W D0,error(A6); ; return error code
|
|
|
|
restoreUnlinkReturn
|
|
|
|
ENDPROC
|
|
|
|
;********************************************************************************
|
|
; Since VolMount glue is not released on EASE, it is
|
|
; released as part of Alias Manager.
|
|
; Glue for GetExportedFolderInfo is here also.
|
|
; Remove following code when the glue is officially released.
|
|
;********************************************************************************
|
|
;___________________________________________________________________________
|
|
;
|
|
; AppleShare Volume Mount Trap Glue Code
|
|
;
|
|
; Ruth Hennigar
|
|
; Copyright Apple Computer, Inc. 1986 - 1989
|
|
; All Rights Reserved
|
|
;
|
|
; Modification History:
|
|
;
|
|
; 5/9/89 RH New today. Created glue code for the two new $A060 traps
|
|
; GetVolMountInfo and VolumeMount
|
|
; 6/13/89 RH Moved constants from drEqu.a to here.
|
|
;
|
|
;___________________________________________________________________________
|
|
|
|
VolMIntf PROC
|
|
|
|
EXPORT GETVOLMOUNTINFOSIZE, GETVOLMOUNTINFO, VOLUMEMOUNT, GETEXPORTEDFOLDERINFO
|
|
;
|
|
; new $A060 traps for getVolMountInfo & VolumeMount routines
|
|
;
|
|
GetVMInfoSize EQU 63 ; index of getVolMountInfoSize trap
|
|
GetVMInfo EQU 64 ; index of getVolMountInfo trap
|
|
VMount EQU 65 ; index of volumeMount trap
|
|
ServerControl EQU 0 ; index of ServerControl trap
|
|
|
|
|
|
GETEXPORTEDFOLDERINFO:
|
|
MOVEA.L 6(A7), A0 ; get the param block pointer
|
|
MOVE.L #ServerControl, D0 ; our dispatch number
|
|
DC.W $A094 ; special server control call Trap
|
|
MOVEA.L (A7)+, A0 ; move the return address
|
|
ADDA.L #6, A7 ; blow away the parameters
|
|
MOVE.W D0, (A7) ; write function result
|
|
JMP (A0) ; go home
|
|
|
|
;________________________________________________________________________________
|
|
;
|
|
; Routine: GetVolMountInfoSize
|
|
;
|
|
; Function: Returns the volume mount information size from the VCB that is needed
|
|
; to allocate storage for actual volume mount informaion.
|
|
;
|
|
; Pascal interface:
|
|
; Function GetVolMountInfoSize (volRefNum: Integer;
|
|
; sizeInBytes: ^Integer): OSErr;
|
|
;________________________________________________________________________________
|
|
;
|
|
GETVOLMOUNTINFOSIZE:
|
|
LINK A6,#-ioHFQElSiz ; Allocate space for a IO ParmBlock
|
|
BSR.S ClrStkPB ; Get a pointer to the cleared parameter block
|
|
;
|
|
; At this point, the stack looks as follows:
|
|
;
|
|
; (A6) --> Old A6
|
|
; 4(A6) --> Return address
|
|
; 8(A6) --> Pointer to returned size info
|
|
; 12(A6) --> Volume Ref Num
|
|
; 14(A6) --> Return value
|
|
;
|
|
MOVE.L 8(A6),ioBuffer(A0) ; Copy returned size pointer into ioBuffer
|
|
MOVE.W 12(A6),ioVRefNum(A0) ; Copy Volume RefNum
|
|
MOVE.W #GetVMInfoSize,D0 ; Indicate requested function
|
|
DC.W $A060 ; Dispatch call
|
|
MOVE.W D0,14(A6) ; Return final result
|
|
|
|
UNLK A6 ; Pop off the call frame
|
|
MOVE.L (SP)+,A0 ; Save the return address
|
|
ADDA.W #6,SP ; Pop off the incoming arguments
|
|
JMP (A0) ; And call it a day.
|
|
|
|
;________________________________________________________________________________
|
|
;
|
|
; Routine: GetVolMountInfo
|
|
;
|
|
; Function: Returns the information from the VCB that is needed to mount a
|
|
; volume (zone, server and volume name, volume password,
|
|
; user name and password
|
|
;
|
|
; Pascal interface:
|
|
; Function GetVolMountIntfo (volRefNum: Integer;
|
|
; volInfoPtr: ^VolumeLocation): OSErr;
|
|
;________________________________________________________________________________
|
|
;
|
|
GETVOLMOUNTINFO:
|
|
LINK A6,#-ioHFQElSiz ; Allocate space for a IO ParmBlock
|
|
BSR.S ClrStkPB ; Get a pointer to the cleared parameter block
|
|
;
|
|
; At this point, the stack looks as follows:
|
|
;
|
|
; (A6) --> Old A6
|
|
; 4(A6) --> Return address
|
|
; 8(A6) --> Pointer to volume Information record
|
|
; 12(A6) --> Volume Ref Num
|
|
; 14(A6) --> Return value
|
|
;
|
|
MOVE.L 8(A6),ioBuffer(A0) ; Copy volInfo pointer into ioBuffer
|
|
MOVE.W 12(A6),ioVRefNum(A0) ; Copy Volume RefNum
|
|
MOVE.W #GetVMInfo,D0 ; Indicate requested function
|
|
DC.W $A060 ; Dispatch call
|
|
MOVE.W D0,14(A6) ; Return final result
|
|
|
|
UNLK A6 ; Pop off the call frame
|
|
MOVE.L (SP)+,A0 ; Save the return address
|
|
ADDA.W #6,SP ; Pop off the incoming arguments
|
|
JMP (A0) ; And call it a day.
|
|
|
|
;________________________________________________________________________________
|
|
;
|
|
; Routine: VolumeMount
|
|
;
|
|
; Function: Mounts the volume specified by the zone, server and volume name,
|
|
; volume password, user name and password in the VolInfo record passed
|
|
; into this routine. Returns the vRefNum of the volume as well.
|
|
;
|
|
; Pascal interface:
|
|
; Function VolumeMount (volInfoPtr: ^VolumeLocation;
|
|
; VAR volRefNum: Integer): OSErr;
|
|
;________________________________________________________________________________
|
|
;
|
|
VOLUMEMOUNT:
|
|
LINK A6,#-ioHFQElSiz ; Allocate space for a IO ParmBlock
|
|
BSR.S ClrStkPB ; Get a pointer to the cleared parameter block
|
|
;
|
|
; At this point, the stack looks as follows:
|
|
;
|
|
; (A6) --> Old A6
|
|
; 4(A6) --> Return address
|
|
; 8(A6) --> volRefNum
|
|
; 12(A6) --> Pointer to volume Information record
|
|
; 16(A6) --> Return value
|
|
;
|
|
MOVE.L 12(A6),ioBuffer(A0) ; Copy volume info record into ioBuffer
|
|
MOVE.W #VMount,D0 ; Indicate requested function
|
|
DC.W $A060 ; Dispatch call
|
|
MOVE.W D0,16(A6) ; Return final result
|
|
|
|
MOVEA.L 8(A6),A1 ; A1 points to volRefNum parameter
|
|
MOVE.W ioVRefNum(A0),(A1) ; return the vRefNum
|
|
|
|
UNLK A6 ; Pop off the call frame
|
|
MOVE.L (SP)+,A0 ; Save the return address
|
|
ADDA.W #8,SP ; Pop off the incoming arguments
|
|
JMP (A0) ; And call it a day.
|
|
|
|
|
|
;
|
|
; A small setup subroutine. Assuming the caller has executed
|
|
; a LINK A6,#-ioHFQElSiz, this routine points A0 to the start of a
|
|
; cleared parameter block.
|
|
;
|
|
; D0 is trashed.
|
|
;
|
|
ClrStkPB MOVEA.L A6,A0 ; Point to top of parameter block
|
|
MOVE.W #(ioHFQElSiz/2-1),D0 ; DBRA word loop index
|
|
@1 CLR.W -(A0) ; ...cleared.
|
|
DBRA D0,@1 ;
|
|
RTS ; And we're done.
|
|
|
|
END
|
|
|
|
|