Skip to content

Instantly share code, notes, and snippets.

@cbmeeks
Created August 21, 2017 14:14
Show Gist options
  • Save cbmeeks/9707994a3b8cc0145923122bd79f2d7a to your computer and use it in GitHub Desktop.
Save cbmeeks/9707994a3b8cc0145923122bd79f2d7a to your computer and use it in GitHub Desktop.
Early Macintosh Boot Beep
; 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