; 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.

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
MOVE.L #$FA40C006,D1 ; 4 byte table to fill buffer with
MOVEQ #19,D2 ; repeat 19 times
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

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
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

MOVE #295,D0 ; 296 values to copy
MOVE.B -74(A0),(A0) ; move in next value
ADDQ #2,A0
DBRA D0,FLoop2 ; loop till done

; now wait for blanking before repeating

MOVE.W #5500,D0 ; init timeout factor
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