mac-rom/Patches/SysBeepPatch.a

189 lines
6.4 KiB
Plaintext

;
; File: SysBeepPatch.a
;
; Copyright: © 1988-1990, 1992 by Apple Computer, Inc., all rights reserved.
;
; This file is used in these builds: ROM System
;
; Change History (most recent first):
;
; <2> 3/10/92 PN Change sysbeep to upper case for the linker
; <16> 6/12/91 LN added #include 'SysPrivateEqu.a'
; <15> 6/12/91 LN Removed #includes for private interfaces from public interfaces.
; Changed #include 'HardwareEqu.a' to 'HardwarePrivateEqu.a'
; <14> 8/21/90 KIP Fix a with statement.
; <13> 8/21/90 KIP Try to play the ROM beep if the resource ID in PRAM is not
; found; switch logic of sysBeepState value.
; <12> 8/13/90 KIP Make SysBeep look again for sound volume of zero and flash the
; menu bar (Neil changed _SndPlay to do this, but that was the
; wrong thing to do).
; <11> 6/12/90 DDG NEEDED FOR SIXPACK: Fixed previous comment.
; <10> 6/11/90 CV NEEDED FOR SIXPACK: Removing test for sound active and sound
; volume equal to 0 because they are in the sound manager now.
; <9> 6/2/90 NC NEEDED FOR SIXPACK: New Sound Manager can disable SysBeep for
; presentation purposes. SysBeepPatch now looks at the global and
; exits if sysbeep is disabled.
; <8> 5/29/90 DDG NEEDED FOR SIXPACK: Changed all the sixpack conditionals from
; six-point-oh-seven to six-point-oh-six.
; <7> 3/20/90 DDG Changed $610 to $606 in all the system version conditionals.
; <6> 2/5/90 DDG Fix SysBeep by including it in the sound manager patch instead
; of the individual patches for each ROM. (Neil [NC] actually did
; the fix)
; <5> 2/3/90 NC SysBeep is now patched by the Sound Manager. This file should
; now reside in the SoundMgr folder but BBS won't let me put it
; there!
; <4> 2/1/90 NC How about using asm Ifs instead of C #ifs?
; <3> 2/1/90 NC Conditionally remove the SoundActive check because new Sound
; Manager really returns errors.
; <2> 1/4/90 dba get rid of warning caused by unnecessary branch; also get rid of
; MacPlusBeep/MacSEBeep symbols; this file will become part of a
; Mac Plus/Mac SE patch file and will use Bind in the future
; <1.0> 11/16/88 CCH Added to EASE.
; 7/8/88 bbm <S529> Made massive changes to SysBeepPatch.a. Cleaned up some
; code. We now jump to rom if extra parameter ram is not present,
; or if we are playing 'snd ' 1 on a MacPlus or MacSE. Since the
; new sound manager uses timer one, any application that called
; SysBeep and used timer one would die on System 6.0. If a user
; chooses simple beep, the sound manager wonÕt be called on a
; MacPlus or MacSE, so the application wonÕt croak.
;
; To Do:
;
INCLUDE 'sysequ.a'
INCLUDE 'HardwarePrivateEqu.a'
INCLUDE 'Traps.a'
INCLUDE 'ToolEqu.a'
INCLUDE 'SysPrivateEqu.a'
PrNonPortable SET 1
INCLUDE 'private.a'
PrNonPortable SET 0
CASE OBJ
MACHINE MC68000
;--------------------------------------------------------------------------------------------
;
; SMgrGlobals Ax returns the Ptr to our New Sound Manager Globals in Ax
;
MACRO
SMgrGlobs &temp
MOVE.L ExpandMem,&temp
MOVE.L ExpandMemRec.soundMgrGlobals(&temp),&temp
ENDM
sysBeepState EQU 24
;--------------------------------------------------------------------------------------------
PROC ENTRY
EXPORT SYSBEEP
SYSBEEP
MOVEM.L D0-D7/A1-A6,-(SP) ; save the world
MOVE.W 60(sp),D7 ; save duration for later
MOVE.W SR,D0 ; are we at interrupt level?
AND.W #$0700,D0 ;
BNE @done ; if we are, can't make sound
SMgrGlobs A0
TST.W sysBeepState(A0)
BEQ.S @done ; if SysBeep value is disabled, then GTFO
TST.B SdVolume ; zero sound?
BNE.S @makeSound ; br if not
@flash ;
TST.B WWExist ; is there a window world?
BNE.S @done ; if not, skip this entirely
CLR.L -(SP) ; flash entire menu bar
_FlashMenuBar ; flash menu bar instead
SUB.L A0,A0 ;
ADDQ #8,A0 ;
_Delay ;
_FlashMenuBar ;
BRA.S @done ;
@makeSound
btst #hwCbClock,HWCfgFlags ; is new clock chip here
bne.s @getSoundId ; if so, get resource id
bsr.s @rombeep ; else go do a beep if possible
bra.s @done ; and exit
@getSoundId ; get resource id from param ram here
CLR.W -(SP) ; space for id
MOVE.L SP,A0 ; it's address
MOVE.L #$0002007C,D0 ; two bytes, from snd res location
_ReadXPRam ;
MOVE.W (SP)+,D5 ; get it (and leave it there)
cmp.w #1,D5 ; special case simple beep (id=1)
bne.s @getsound ;
@tryRomBeep ; <13> KIP
bsr.s @rombeep ; go do a beep if possible
beq.s @done ; exit if sound played
@getsound
CLR.L -(SP) ;leave space for result
MOVE.L #'snd ',-(SP) ;push resource type
MOVE.W D5,-(SP) ;push resource number
MOVE.B ResLoad,D4 ;save resload
MOVE.B #1,ResLoad ;set resload true
_RGetResource
MOVE.B D4,ResLoad ;restore resload
MOVE.L (SP)+,A0 ;get handle back
CLR.W -(SP) ;leave space for result
CLR.L -(SP) ;push nil for channel
MOVE.L A0,-(SP) ;push handle
CLR.W -(SP) ;push false for async
_SndPlay ;_SndPlay
MOVE.W (SP)+,D0 ;pop function result off
TST.W D0 ;was there an error?
BEQ.S @done ;if not, we're done
CMP.W #1,D5 ;was it id #1?
BEQ.S @flash ;yes, to bad, can't beep so flash
MOVE.W #1,D5 ;else, try id #1 just for laughs
BRA.S @tryRomBeep ; <13> KIP
@done
MOVEM.L (SP)+,D0-D7/A1-A6 ; restore the world
MOVE.L (SP)+,A0
ADDQ #2,SP
JMP (A0)
; ---------------------------------------------------------------------------
; upon entry,
; D7 has duration.
; upon exit,
; cc = EQ rom sound played
; cc = NE no sound played
; ---------------------------------------------------------------------------
@rombeep
move.l rombase,A0 ; is this is a rom we know?
add.w #8,A0 ; point at rom version
cmpi.w #$0075,(A0) ; is rom MacPlus rom?
bne.s @1
move.l #$4011DC,A0
bra.s @dobeep
@1
cmpi.w #$0276,(A0) ; is rom MacSE rom?
bne.s @rts ; if not, punt (unknown cpu)
move.l #$4029B4,A0
@dobeep
move.w D7,-(sp) ; get duration for sysbeep
jsr (A0) ; do rombeep and fall into @done
moveq #0,d0 ; set condition code before return
@rts
rts
ENDPROC
END