Created
August 21, 2017 14:14
-
-
Save cbmeeks/9707994a3b8cc0145923122bd79f2d7a to your computer and use it in GitHub Desktop.
Early Macintosh Boot Beep
This file contains 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