mirror of
https://github.com/elliotnunn/sys7.1-doc-wip.git
synced 2024-12-12 04:29:09 +00:00
189 lines
6.4 KiB
Plaintext
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
|