Created
July 23, 2018 20:52
-
-
Save cbmeeks/15a724f9a388896647b74c27e61f324c to your computer and use it in GitHub Desktop.
Boot Beep - Original Macintosh Boot Sound
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; https://www.folklore.org/html/BootBeep.html | |
; Boot beep routine | |
; | |
; Called with RTS6 A3 must be set up w/ memory offset (overlay) | |
; D3 contains the duration: 40 is boot beep | |
; make an attractive beep to tell the world that the CPU works. Use | |
; Charlie Kellner's filter algorithm. First fill the waveForm buffer | |
; with the initial waveForm. | |
BootBeep | |
MOVE.L #VBase,A5 ; get the VIA base address | |
BCLR #7,VBufB(A5) ;enable the sound | |
LEA SoundLow,A0 ; get sound buffer address | |
ADD.L A3,A0 ; overlay bit is on, so offset | |
MOVE.L A0,A4 ; keep soundBase in A4 | |
MOVEQ #4,D0 ; repeat 74 byte sequence 5 times | |
@3 | |
MOVE.L #$FA40C006,D1 ; 4 byte table to fill buffer with | |
@2 | |
MOVEQ #19,D2 ; repeat 19 times | |
@1 | |
MOVE.B D1,(A0) ; move in a byte | |
ADDQ #2,A0 ; bump to next buffer location | |
SUBQ #1,D2 ; done 19 times yet? | |
BNE.S @1 ; if not, loop | |
LSR.L #8,D1 ; get next byte value | |
BNE.S @2 ; fill next 18 values | |
DBRA D0,@3 ; repeat the whole sequence 5 times | |
; OK, now filter it for a nice fade -- repeat the filtering process D3 times | |
; note that D1 and D2 are zero at this point | |
FLoop0 | |
MOVE.L A4,A0 ; point A0 to start of buffer | |
LEA 146(A0),A1 ; point A1 74 values in | |
MOVEQ #73,D0 ; process 74 samples | |
FLoop1 | |
MOVE.B (A1),D2 ; get 74th value | |
ADDQ #4,A1 ; bump to 76th value | |
MOVE.B (A1),D1 ; make it a word value | |
ADD.W D1,D2 ; add to the accumulator | |
SUBQ #2,A1 ; point at 75th value | |
MOVE.B (A1),D1 ; get it | |
ADD.W D1,D2 ; add to accumulator | |
ADD.W D1,D2 ; count it twice | |
ADDQ #3,D2 ; add 3 to round off | |
ASR #2,D2 ; divide it by 4 | |
MOVE.B D2,(A0) ; store it away | |
ADDQ #2,A0 ; bump to next value | |
DBRA D0,FLoop1 ; loop for all 74 values | |
; now copy first 74 values into the rest of the buffer | |
FillIt | |
MOVE #295,D0 ; 296 values to copy | |
FLoop2 | |
MOVE.B -74(A0),(A0) ; move in next value | |
ADDQ #2,A0 | |
DBRA D0,FLoop2 ; loop till done | |
; now wait for blanking before repeating | |
EndLoop | |
MOVE.W #5500,D0 ; init timeout factor | |
@1 | |
BTST #1,VIFR(A5) ; is VBL on? | |
DBNE D0,@1 ; wait for it to come on | |
MOVE.B #$02,VIFR(A5) ; mask it off | |
DBRA D3,FLoop0 ; repeat D3 times | |
; all done with our boot beep so turn down the sound | |
BSET #7,VBufB(A5) ;disable the sound | |
RTS6 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment