mac-rom/Toolbox/DataPubsMgr/dpMisc.a
Elliot Nunn 4325cdcc78 Bring in CubeE sources
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.
2017-12-26 09:52:23 +08:00

346 lines
10 KiB
Plaintext

;
; File: dpMisc.a
;
; Contains: random assembly language routines for the Edition Manager
;
; Written by: Nick Kledzik
;
; Copyright: © 1989-1990 by Apple Computer, Inc., all rights reserved.
;
; This file is used in these builds: BigBang
;
; Change History (most recent first):
;
; <9> 11/26/90 ngk <DFH> Added dpSetCurrentAppRefNum and dp_GetCurrentAppRefNum.
; This takes advantage of new switch expandmem field
; emEditionMgrPerApp.
; <8> 7/11/90 gbm add END to file. Sorry about last comment.
; <7> 7/11/90 gbm .
; <6> 5/31/90 ngk change globals from a handle to a pointer.
; <5> 4/7/90 ngk Added, FailOSErr, IsFailure. Fix dp_CallFormatIOProc to return
; error if I/O has been aborted.
; <4> 3/10/90 ngk Removed GetStateAndLock and RestoreState
; <3> 1/22/90 ngk Fix CallProcPtr routines to use symbolic standard names
; <2> 1/6/90 ngk Added dp_CallEditionOpenerProc and dp_CallFormatIOProc
; <1> 1/6/90 ngk first checked into BBS
; <1.7> 11/20/89 ngk Added dummy rts at end to get MacsBug symbols
; <1.6> 11/13/89 ngk Added GetStateAndLock and RestoreState
; <1.5> 10/25/89 ngk Fixed bug in which I forgot to deallocate parameters in
; UnSignedDivide and UnSignedMultiply
; <¥1.4> 10/2/89 ngk nothing
; <1.3> 9/18/89 ngk Added unsigned multiple and divide
; <1.2> 8/8/89 ngk No changes
; <1.1> 5/29/89 ngk Got qNames to work with MacsBug Symbols
; <1.0> 5/19/89 ngk Submitted for first time
;
; To Do:
;
SEG 'Main'
CASE OFF
LOAD 'StandardEqu.d'
INCLUDE 'dpCompileOptions.inc.a'
INCLUDE 'EditionsPrivate.a'
;---------------------------------------------------------------------------
; dpGetGlobalsLocation
;
; FUNCTION dpGetGlobalsLocation: EdtnMgrGlobalsPtrPtr; EXTERNAL;
;
;---------------------------------------------------------------------------
dpGetGlobalsLocation PROC EXPORT
move.l ExpandMem,A0 ; get pointer to expanded low mem
lea ExpandMemRec.emDataPub(A0),A0 ; get location of globals handle
move.l A0,4(SP) ; return it
rts
IF qNames THEN
DebugerSymbol dpGetGlobalsLocation ; MacsBug Symbols
ENDIF
ENDPROC ; dpGetGlobalsLocation
;---------------------------------------------------------------------------
; dpSetCurrentAppRefNum
;
; PROCEDURE dpSetCurrentAppRefNum(app: AppRefNum);
;
;---------------------------------------------------------------------------
dpSetCurrentAppRefNum PROC EXPORT
move.l (SP)+,A0 ; get return address
move.l ExpandMem,A1 ; get pointer to expanded low mem
move.l (SP)+,ExpandMemRec.emEditionMgrPerApp(A1); store handle
jmp (A0) ; return
IF qNames THEN
DebugerSymbol dpSetCurrentAppRefNum ; MacsBug Symbols
ENDIF
ENDPROC ; dpSetCurrentAppRefNum
;---------------------------------------------------------------------------
; dp_GetCurrentAppRefNum
;
; FUNCTION dp_GetCurrentAppRefNum(VAR app: AppRefNum): OSErr;
;
;---------------------------------------------------------------------------
dp_GetCurrentAppRefNum PROC EXPORT
move.l ExpandMem,A0 ; get pointer to expanded low mem
move.l ExpandMemRec.emEditionMgrPerApp(A0),D0 ; get app's global's handle
move.l (SP)+,A0 ; get return address
move.l (SP)+,A1 ; get place to put handle
clr.w (SP) ; return noErr by default
move.l D0,(A1) ; return handle
bne.s @done ; is handle NIL?
move.w #editionMgrInitErr,(SP) ; if so, return error
@done jmp (A0) ; return
IF qNames THEN
DebugerSymbol dp_GetCurrentAppRefNum ; MacsBug Symbols
ENDIF
ENDPROC ; dp_GetCurrentAppRefNum
;---------------------------------------------------------------------------
;
; PROCEDURE UnSignedDivide(numerator: {unsigned}LONGINT;
; denom: {unsigned}INTEGER;
; VAR quotient,remainder: {unsigned}INTEGER);
;
;---------------------------------------------------------------------------
UnSignedDivide PROC EXPORT
numerator EQU 18
denom EQU 16
quotient EQU 12
remainder EQU 8
link A6,#0
move.l numerator(a6),D0
divu denom(a6),D0
move.l quotient(a6),A0
move.w D0,(A0)
swap D0
move.l remainder(a6),A0
move.w D0,(A0)
unlk A6
move.l (SP)+,A0
add #14,SP
jmp (A0)
IF qNames THEN
DebugerSymbol UnSignedDivide ; MacsBug Symbols
ENDIF
ENDPROC ; UnSignedDivide
;---------------------------------------------------------------------------
;
; PROCEDURE UnSignedMultiply(mult1, mult2: {unsigned}INTEGER;
; VAR result{unsigned}LONGINT);
;
;---------------------------------------------------------------------------
UnSignedMultiply PROC EXPORT
mult1 EQU 14
mult2 EQU 12
result EQU 8
link A6,#0
move.w mult1(A6),D0
mulu mult2(a6),D0
move.l result(a6),A0
move.l D0,(A0)
unlk A6
move.l (SP)+,A0
add #8,SP
jmp (A0)
IF qNames THEN
DebugerSymbol UnSignedMultiply ; MacsBug Symbols
ENDIF
ENDPROC ; UnSignedMultiply
;----------------------------------------------------------------------------------------------
;
; FUNCTION dp_CallEditionOpenerProc(selector: EditionOpenerVerb; VAR PB: EditionOpenerParamBlock;
; routine: EditionOpenerProcPtr): OSErr;
;
;----------------------------------------------------------------------------------------------
dp_CallEditionOpenerProc PROC EXPORT
IMPORT dpStandardOpener
move.l (SP)+,A0 ; get return address
move.l (SP)+,D0 ; get routine address
move.l A0, -(SP) ; restore return address
cmp.l #kStandardOpenerProcPtr,D0 ; do we use standard ?
beq dpStandardOpener ; if yes, jump to standard
move.l D0,A0 ; otherwise,
jmp (A0) ; jump to ProcPtr
IF qNames THEN
DebugerSymbol dp_CallEditionOpenerProc ; MacsBug Symbols
ENDIF
ENDPROC ; dp_CallEditionOpenerProc
;----------------------------------------------------------------------------------------------
;
; FUNCTION dp_CallFormatIOProc(selector: FormatIOVerb; VAR PB: FormatIOParamBlock;
; routine: FormatIOProcPtr): OSErr;
;
;----------------------------------------------------------------------------------------------
dp_CallFormatIOProc PROC EXPORT
IMPORT dpStandardIO
move.l (SP)+,A0 ; get return address
move.l (SP)+,D0 ; get routine address
move.l A0, -(SP) ; restore return address
cmp.l #kStandardFormatIOProcPtr,D0 ; do we use standard ?
beq dpStandardIO ; if yes, jump to standard
cmp.l #kBogusFormatIOProcPtr,D0 ; has I/O been aborted ?
bne.s @callThePtr ; if no, call the pointer
move.l (SP)+,D0 ; get return address
addq.l #6,SP ; remove parameters
move.w #abortErr,(SP) ; return OSErr
@callThePtr move.l D0,A0 ; otherwise,
jmp (A0) ; jump to ProcPtr
IF qNames THEN
DebugerSymbol dp_CallFormatIOProc ; MacsBug Symbols
ENDIF
ENDPROC ; dp_CallFormatIOProc
;----------------------------------------------------------------------------------------------
;
; FUNCTION IsFailure(VAR info: FailInfo; VAR errorValue: OSErr): BOOLEAN;
;
;----------------------------------------------------------------------------------------------
IsFailure PROC EXPORT
returnAddr EQU 0
errorPtr EQU 4
infoPtr EQU 8
; save All regs first
MOVE.L infoPtr(SP),A1
MOVEM.L A2-A7/D3-D7,FailInfo.regs(A1)
; save where to return to on failure and where to put error code
MOVE.L returnAddr(SP),FailInfo.returnTo(A1) ; save the return address
MOVE.L errorPtr(SP),A0
MOVE.L A0,FailInfo.errorPtr(A1) ; save the place to put error
CLR.W (A0) ; be nice and initialize it
; link failinfo into list
SUBQ.L #4,SP
BSR dpGetGlobalsLocation
MOVE.L (SP)+,A0
MOVE.L (A0),A0
MOVE.L EdtnMgrGlobals.failureHandler(A0),FailInfo.nextInfo(A1)
MOVE.L infoPtr(SP),EdtnMgrGlobals.failureHandler(A0)
; clean up stack and return
MOVE.L (SP)+,A0
ADDQ.L #8,SP
CLR.W (SP) ; return FALSE
JMP (A0)
IF qNames THEN
DebugerSymbol IsFailure ; MacsBug Symbols
ENDIF
ENDPROC ; IsFailure
;----------------------------------------------------------------------------------------------
;
; PROCEDURE FailOSErr(anErr: OSErr);
;
;----------------------------------------------------------------------------------------------
FailOSErr PROC EXPORT
returnAddr EQU 0
anErr EQU 4
infoPtr EQU 8
IF qCatchFailures THEN
SUBQ.L #4,SP
BSR dpGetGlobalsLocation
MOVE.L (SP)+,A0
MOVE.L (A0),A0
MOVE.L EdtnMgrGlobals.failureHandler(A0),D0
BNE.S @isHandler
PEA NoHandlerWarn
_DebugStr
@isHandler MOVE.W anErr(SP),D0
BEQ.S @noErr
CMP.W #noTypeErr,D0
BEQ.S @DoFail
PEA FailWarning
_DebugStr
MOVE.W anErr(SP),D0
ELSE
MOVE.W anErr(SP),D0
BEQ.S @noErr
ENDIF
; get current failure info and unlink from list
@DoFail SUBQ.L #4,SP
BSR dpGetGlobalsLocation
MOVE.L (SP)+,A0
MOVE.L (A0),A0
MOVE.L EdtnMgrGlobals.failureHandler(A0),A1
IF qCatchFailures THEN
MOVE.L A1,D1
BNE.S @infoOK
PEA NoHandlerWarn
_DebugStr
@infoOK
ENDIF
MOVE.L FailInfo.nextInfo(A1),EdtnMgrGlobals.failureHandler(A0)
; restore state to return to place that called IsFailure
MOVEM.L FailInfo.regs(A1),A2-A7/D3-D7 ; restore regs
ADD.L #14,SP ; remove IsFailure parameters
; save where to return to on failure and where to put error code
MOVE.L FailInfo.errorPtr(A1),A0 ; get place to put error
MOVE.W D0,(A0) ; put error code where caller wants
MOVE.L FailInfo.returnTo(A1),A0 ; get where to goto
ST -(SP) ; Fake IsFailure returning TRUE
BRA.S @jmp
@noErr MOVE.L (SP)+,A0
ADDQ.L #2,SP
@jmp JMP (A0)
IF qNames THEN
DebugerSymbol FailOSErr ; MacsBug Symbols
ENDIF
IF qCatchFailures THEN
STRING PASCAL
NoHandlerWarn DC.B 'FailOSErr: no failure handler, crash!'
FailWarning DC.B 'FailOSErr: failing.'
ENDIF
ENDPROC ; FailOSErr
END