; ; File: Bass_Allocate.a ; ; Copyright: © 1989-1993 by Apple Computer, Inc., all rights reserved. ; ; Change History (most recent first): ; ; 9/13/93 SAM Removed an include of QDHooks.a. ; 2/20/93 SAM Added and INCLUDE of TrapsPrivate.a. ; 2/4/93 PN I did a global search and NewTempHandle is only called from ; CTempBuffHand. So I change the name to FontNewTempHandle to ; eliminate confusion with QD call. ; 4/16/92 PN Change GETSTYLEBUFHAND to upper case ; <3> 7/10/91 JSM Remove obsolete SysVers conditionals. ; <2> 3/20/91 CL B3B, #84919: Fixed NewTempHandle, EndSystem mode reset the state ; from MFTempHandle. This resulted in a memory leak since we ; thought we did not get a block from MFTemp memory and continued ; to get a application block instead. ; <13> 9/23/90 CL Can not call BeginSystemMode or EndSystem mode in 6.0.x systems. ; <12> 9/13/90 CL Fixing test for MultiFinder to use the unimplemented trap ; instead of these old weird vectors. ; <11> 9/10/90 CL Added PurgeSpaceSysTotal and NewHandleSysNoInt for testing purposes. ; <10> 9/4/90 CL Added MultiFinderExist routine to call from c code. ; <9> 8/31/90 KSM Add Charlton's changes for MF existence checking. ; <8> 7/20/90 DTY Added EndProcs and End for Greggy. ; <7> 7/20/90 CL The assembler wishes to create a branch of zero. This gets ; intrepreted into a long branch and takes the next instruction as ; the offset and really messes up the code. ; <6> 7/5/90 RB Richard is checking this out for my Chazz bug. Need to BSR to ; NewTempHandle instead of calling the Macro. ; <5> 7/3/90 CL Putting back in the NewTempHandle call for the init since the ; trap does not exist on the 6.0.x world. ; <4> 6/22/90 CL Taking out newTempHandle, newTempBuffer, disposeTempBuffer. ; <3> 4/11/90 dba Chaz says we need this new version ; <2> 2/27/90 CL Supports new fast blit loops… ; <1.2> 8/28/89 CEL Linker has a mean bug that leaves out some code. Moved code ; <1.1> 8/14/89 CEL Fixed up tstMFExist macro to use different base addr for MacPlus ; <1.0> 8/1/89 CEL Adding into Bass build for the first time… ; <1.0> 8/1/89 CEL Adding into Bass build for the first time… ; ;—————————————————————————————————————————————————————————————————————————————————————————— ; Bass_Allocate.a ; ; File: Bass_Allocate.a ; Language: 68000 assembly ; ; Author: Charlton E. Lui ; Date: August 1, 1989 ; Modifications: 1.0 ; ; Copyright Apple Computer, Inc. 1989 ; All Rights Reserved ; ; Gets memory from Multifinder heap. ; ;—————————————————————————————————————————————————————————————————————————————————————————— CASE OBJ INCLUDE 'Traps.a' INCLUDE 'SysEqu.a' INCLUDE 'SplineDefines.a' INCLUDE 'fontPrivate.a' INCLUDE 'MFPrivate.a' INCLUDE 'TrapsPrivate.a' ; if &type('INITVERSION') = 'UNDEFINED' then BASS_INIT equ 0 else BASS_INIT equ 1 asGaudi equ 1 endif MACRO ; $$$$ Use the unimplemented Trap instead _tstMFExists IF 1 THEN MOVE.L #$A89F, D0 ;Unimplemented trap _GetTrapAddress MOVE.L A0, D1 MOVE.L #$A88F, D0 ;MultiFinder trap _GetTrapAddress SUB.L A0, D1 ELSE MOVE.L expandMem, A0 ; get low mem expand MOVE.L ExpandMemRec.emSplineKey(A0), A0 ; Handle to splineKey MOVE.L (A0), A0 ; Pointer to rec MOVE.W splineKeyRec.machineType(A0), D0 ; Save away machine type CMP.W #envMacPlus, D0 ; Is it a MacPlus BNE.S @useCheck move.l ($C00+$9f*4),d0 ; get address of unimplemented trap cmp.l ($C00+$8f*4),d0 ; same as OSDispatch? BRA.S @doneMacro @useCheck move.l ($E00+$9f*4),d0 ;get address of unimplemented trap cmp.l ($E00+$8f*4),d0 ;same as OSDispatch? @doneMacro ENDIF ENDM PurgeSpaceSysTotal Proc Export ;Checks for purge space in sys heap _PurgeSpace ,SYS RTS MultiFinderExist Proc Export _tstMFExists ;is twitcher happening? (trashes d0) MOVE.L D1, D0 ;Finder mode! rts FontNewTempHandle PROC ;-------------------------------------------------- ; ; Function FontNewTempHandle(VAR requestSize: long) : TBuffer; ; ; This routine attempts to get a block of the requested size from ; the multiFinder temporary memory pool. ; If multiFinder is not running or memory is full, then a nil pointer ; and a size of zero are returned. ; ; entry: d0 = requested size ; exit: d0 = actual size ; a0 = handle movem.l d1-d3,-(sp) ;save work registers MOVEM.L A0-A1/D0-D2,-(SP) ;Save off all registers before call <13> _BeginSystemMode ;<9> MOVEM.L (SP)+, A0-A1/D0-D2 ;Restore all registers on return clr.l -(sp) ;room for result move.l d3,-(sp) ;ask for it pea memErr ;var result code _MFTempNewHandle move.l (sp)+,d0 move.l d0,a0 ;return handle beq.s @done ;leave it empty $$$ take out later move.l d3,d0 ;return size in d0 $$$ take out later @done ; $$$ take out later MOVEM.L A0-A1/D0-D2,-(SP) ;Save off all registers before call _EndSystemMode ;<9> MOVEM.L (SP)+, A0-A1/D0-D2 ;Restore all registers on return move.l a0, d0 ;set status @noTry movem.l (sp)+,d1-d3 ;restore work registers rts NewTempBuffer PROC EXPORT ;<18Jun89> BAL ;-------------------------------------------------- ; ; Function NewTempBuffer(VAR requestSize: long) : TBuffer; ; ; This routine attempts to get a block of the requested size from ; the multiFinder temporary memory pool. If the requested amount is ; not available it returns the largest contiguous block and its size. ; If multiFinder is not running or memory is full, then a nil pointer ; and a size of zero is returned. ; ; entry: d0 = requested size ; exit: d0 = actual size ; a0 = handle movem.l d1-d3,-(sp) ;save work registers move.l d0,d3 ;copy requested size _tstMFExists ;is twitcher happening? (trashes d0) bne.s @tryMultMem ;no, we're out of luck <9> moveq #0,d0 ;zero resulting size move.l d0,a0 ;return nil handle bra.s @noTry @tryMultMem IF NOT BASS_INIT THEN MOVEM.L A0-A1/D0-D2,-(SP) ;Save off all registers before call _BeginSystemMode ;<9> MOVEM.L (SP)+, A0-A1/D0-D2 ;Restore all registers on return ENDIF clr.l -(sp) ;room for result move.l d3,-(sp) ;ask for it pea memErr ;var result code _MFTempNewHandle move.l (sp)+,d0 beq.s @hardWay @gotit move.l d0,-(sp) ;save a copy of the handle move.l d0,-(sp) ;handle to lock pea memErr ;var result code _MFTempHLock ;lock it down move.l (sp)+,a0 ;return handle in a0 move.l d3,d0 ;return size in d0 @done IF NOT BASS_INIT THEN MOVEM.L A0-A1/D0-D2,-(SP) ;Save off all registers before call _EndSystemMode MOVEM.L (SP)+, A0-A1/D0-D2 ;Restore all registers on return ENDIF @noTry movem.l (sp)+,d1-d3 ;restore work registers rts @hardWay clr.l -(sp) ;room for grow amt clr.l -(sp) ;room for result pea 4(sp) ;push var grow _MFMaxMem move.l (sp)+,d3 ;get size in d3 addq #4,sp ;pop grow amt ; tst.l d3 ;<9> ble.s @noMem ;bail if none or less @tryAgain clr.l -(sp) ;room for result move.l d3,-(sp) ;ask for this much pea memErr ;var result code _MFTempNewHandle ;a prayer move.l (sp)+,d0 ;did we get it? bne.s @gotit sub.l #$1000,d3 ;no, back off by 4K bgt.s @tryAgain ;try again @noMem moveq #0,d0 ;zero resulting size <9> move.l d0,a0 ;return nil handle bra.s @done DisposeTempBuffer PROC EXPORT ;<18Jun89> BAL ;-------------------------------------------------- ; ; Procedure DisposeTempBuffer(aBufferHandle: : TBuffer); ; ; This routine frees a block of multiFinder temporary memory. ; ; entry: a0 = handle to dispose move.l a0,d0 ;is it nil? beq.s @nil move.l a0,-(sp) ;push the handle pea memErr ;var result code _MFTempDisposHandle ;dispose it. @nil rts ENDPROC ;-------------------------------------------------- ; This procedure has to be underneath NewTempHandle ; and GetStyleBufHand. Otherwise the mean old linker ; bug will eliminate code that is below this routine. ; ; ; CtempBufHand PROC EXPORT EXPORT GETSTYLEBUFHAND MOVE.L 4(SP), d0 ; Get size GETSTYLEBUFHAND MOVE.L D0, D3 ; Save request in reg BSR FontNewTempHandle ; Try to get it from Multi Temp BNE.S @returnVal ; Worked so go home MOVE.L D3, d0 ; Get size MOVE.L theZone, D2 ; Save the current zone MOVE.L applZone, theZone ; Switch to app zone _NewHandle ; Try App heap MOVE.L D2, theZone ; Restore zone @returnVal MOVE.L A0, D0 RTS ENDPROC END