******************************************************************************* * sound.library.S Written by Readysoft. * Copyright 1992,1993,1994 RS. All rights reserved. 1992.05.08.-1994.05.18. * v1.2. ******************************************************************************* ******************************************************************************* * Macros ******************************************************************************* ;------------------------------------------------------------------------------ ; SoundName Macro ;------------------------------------------------------------------------------ SND.NAM MACRO DC.B 'sound.library',0 EVEN ENDM ******************************************************************************* * LIB Macro ******************************************************************************* SND.LIB MACRO ******************************************************************************* * Constant Definitions ******************************************************************************* ;------------------------------------------------------------------------------ ; Error Codes ;------------------------------------------------------------------------------ snd_er_OK EQU $00000000 all right snd_er_UnDef EQU $8084ffff undefined error ******************************************************************************* * Varibles ******************************************************************************* RSRESET snd_NotUsed RS.L 1 snd_SizeOf RS.B 0 ******************************************************************************* * Routine Offsets ******************************************************************************* RSRESET RS.B -6 snd_Init RS.B -6 snd_InitMusic RS.B -6 snd_EndMusic RS.B -6 snd_PlayMusic RS.B -6 snd_PlaySample RS.B -6 ******************************************************************************* * Code ******************************************************************************* jmp snd.PlaySample jmp snd.PlayMusic jmp snd.EndMusic jmp snd.InitMusic jmp snd.Init sound.lib BLK.B snd_SizeOf,0 EVEN ;------------------------------------------------------------------------------ ; Init NoOp ;------------------------------------------------------------------------------ snd.Init movem.l d0/a0/a5,-(a7) lea sound.lib(pc),a5 move.l a5,a0 clear varible area move.w #snd_SizeOf-1,d0 .Clear clr.b (a0)+ dbf d0,.Clear movem.l (a7)+,d0/a0/a5 rts ;------------------------------------------------------------------------------ ; Protracker v1.1a Replay-Routine. Resourced and recoded by Readysoft. ; 1991.11.18.-1992.01.24. ; Improvements by Readysoft : ; - snd_MasterVol (word) Max volume for all channels ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; InitMusic ModuleAddress(a0) ;------------------------------------------------------------------------------ snd.InitMusic movem.l d0-d2/a0-a2,-(a7) move.l a0,snd.Data lea $3B8(a0),a1 moveq #$7F,d0 moveq #0,d2 moveq #0,d1 snd.loop move.b (a1)+,d1 cmp.b d2,d1 ble.s snd.loop2 move.l d1,d2 snd.loop2 dbra d0,snd.loop addq.b #1,d2 asl.l #8,d2 asl.l #2,d2 lea 4(a1,d2.l),a2 lea snd.samples(pc),a1 add.w #$2A,a0 moveq #$1E,d0 snd.loop3 clr.l (a2) move.l a2,(a1)+ moveq #0,d1 move.w (a0),d1 asl.l #1,d1 add.l d1,a2 add.l #$1E,a0 dbra d0,snd.loop3 or.b #2,$BFE001 move.l #6,snd.speed moveq #0,d0 lea $DFF000,a0 move.w d0,$A8(a0) move.w d0,$B8(a0) move.w d0,$C8(a0) move.w d0,$D8(a0) clr.l snd.numpat clr.l snd.count clr.l snd.patpos movem.l (a7)+,d0-d2/a0-a2 rts ;------------------------------------------------------------------------------ ; EndMusic NoOp ;------------------------------------------------------------------------------ snd.EndMusic clr.w $DFF0A8 clr.w $DFF0B8 clr.w $DFF0C8 clr.w $DFF0D8 move.w #15,$DFF096 rts ;------------------------------------------------------------------------------ ; PlayMusic NoOp ;------------------------------------------------------------------------------ snd.PlayMusic movem.l d0-a6,-(a7) move.l snd.Data,a0 addq.l #1,snd.count move.l snd.count(pc),d0 cmp.l snd.speed(pc),d0 blt.w snd.NoNew clr.l snd.count lea 12(a0),a3 sample táblázat -30 lea $3B8(a0),a2 pattern sorrend lea $43C(a0),a0 pattern1 moveq #0,d1 move.l snd.numpat(pc),d0 move.b 0(a2,d0.w),d1 asl.l #8,d1 asl.l #2,d1 add.l snd.patpos(pc),d1 pattern offset clr.w snd.dma lea $DFF0A0,a5 lea snd.channel0(pc),a6 moveq #1,d2 bsr.w snd.PlayVoice lea $DFF0B0,a5 lea snd.channel1(pc),a6 moveq #2,d2 bsr.w snd.PlayVoice lea $DFF0C0,a5 lea snd.channel2(pc),a6 moveq #3,d2 bsr.w snd.PlayVoice lea $DFF0D0,a5 lea snd.channel3(pc),a6 moveq #4,d2 bsr.w snd.PlayVoice bsr snd.Wait move.w snd.dma,d0 and.w snd.MasterDma,d0 or.w #$8000,d0 move.w d0,$DFF096 bsr snd.Wait lea $DFF000,a5 lea snd.channel3(pc),a6 move.l 10(a6),$D0(a5) move.w 14(a6),$D4(a5) lea snd.channel2(pc),a6 move.l 10(a6),$C0(a5) move.w 14(a6),$C4(a5) lea snd.channel1(pc),a6 move.l 10(a6),$B0(a5) move.w 14(a6),$B4(a5) lea snd.channel0(pc),a6 move.l 10(a6),$A0(a5) move.w 14(a6),$A4(a5) add.l #$10,snd.patpos cmp.l #$400,snd.patpos bne snd.noend snd.next clr.l snd.patpos clr.b snd.newpat addq.l #1,snd.numpat and.l #$7F,snd.numpat move.l snd.numpat(pc),d1 move.l snd.Data,a0 cmp.b $3B6(a0),d1 bcs snd.noend clr.l snd.numpat snd.noend tst.b snd.newpat bne snd.next movem.l (a7)+,d0-a6 rts snd.NoNew lea snd.channel0(pc),a6 lea $DFF0A0,a5 bsr snd.CheckCom lea snd.channel1(pc),a6 lea $DFF0B0,a5 bsr snd.CheckCom lea snd.channel2(pc),a6 lea $DFF0C0,a5 bsr snd.CheckCom lea snd.channel3(pc),a6 lea $DFF0D0,a5 bsr snd.CheckCom bra snd.noend snd.Wait moveq #4,d3 snd.Wait2 move.b $DFF006,d2 snd.Wait3 cmp.b $DFF006,d2 beq.s snd.Wait3 dbra d3,snd.Wait2 moveq #8,d2 snd.Wait4 dbra d2,snd.Wait4 rts ; ; PlayVoice ------------------------------------------------------------------- ; snd.PlayVoice tst.l (a6) bne.w snd.Voice1 bsr snd.Nop snd.Voice1 move.l 0(a0,d1.l),(a6) aktuális pozíció addq.l #4,d1 következö channel moveq #0,d2 move.b 2(a6),d2 and.b #$F0,d2 lsr.b #4,d2 move.b (a6),d0 and.b #$F0,d0 or.b d0,d2 beq snd.Voice3 moveq #0,d3 lea snd.samples(pc),a1 move.w d2,d4 move.b d2,$2B(a6) subq.l #1,d2 lsl.l #2,d2 sample száma * 2 mulu #$1E,d4 move.l 0(a1,d2.l),4(a6) sample address move.w 0(a3,d4.l),8(a6) length move.w 0(a3,d4.l),$28(a6) length move.b 2(a3,d4.l),$12(a6) finetune move.b 3(a3,d4.l),$13(a6) volume move.w 4(a3,d4.l),d3 repeat tst.w d3 nincs repeat ? beq.s snd.Voice2 move.l 4(a6),d2 sample address (word) asl.w #1,d3 byte add.l d3,d2 repeat pozíció move.l d2,10(a6) move.l d2,$24(a6) move.w 4(a3,d4.l),d0 repeat add.w 6(a3,d4.l),d0 replen move.w d0,8(a6) move.w 6(a3,d4.l),14(a6) moveq #0,d0 move.b $13(a6),d0 mulu snd.MasterVol,d0 by Ready lsr.w #6,d0 by Ready move.w d0,8(a5) bra.s snd.Voice3 snd.Voice2 move.l 4(a6),d2 add.l d3,d2 move.l d2,10(a6) move.l d2,$24(a6) move.w 6(a3,d4.l),14(a6) moveq #0,d0 move.b $13(a6),d0 mulu snd.MasterVol,d0 by Ready lsr.w #6,d0 by Ready move.w d0,8(a5) snd.Voice3 move.w (a6),d0 and.w #$FFF,d0 beq snd.PlayVoice2 move.w 2(a6),d0 and.w #$FF0,d0 cmp.w #$E50,d0 beq.s snd.Voice4 move.b 2(a6),d0 and.b #15,d0 cmp.b #3,d0 beq.s snd.Voice5 cmp.b #5,d0 beq.s snd.Voice5 cmp.b #9,d0 bne.s snd.Voice6 bsr snd.PlayVoice2 bra.s snd.Voice6 snd.Voice4 bsr snd.CommE5 bra.s snd.Voice6 snd.Voice5 bsr snd.PlayVoiceSub bra snd.PlayVoice2 snd.Voice6 movem.l d0/d1/a0/a1,-(a7) move.w (a6),d1 and.w #$FFF,d1 lea snd.Period(pc),a1 moveq #0,d0 moveq #$24,d7 snd.VoiceSeek cmp.w 0(a1,d0.w),d1 bcc snd.VoiceFound addq.l #2,d0 dbra d7,snd.VoiceSeek snd.VoiceFound moveq #0,d1 move.b $12(a6),d1 mulu #$4A,d1 add.l d1,a1 move.w 0(a1,d0.w),$10(a6) movem.l (a7)+,d0/d1/a0/a1 move.w 2(a6),d0 and.w #$FF0,d0 cmp.w #$ED0,d0 beq snd.PlayVoice2 move.w $14(a6),$DFF096 btst #2,$1E(a6) bne snd.Voice7 clr.b $1B(a6) snd.Voice7 btst #6,$1E(a6) bne snd.Voice8 clr.b $1D(a6) snd.Voice8 move.w 8(a6),4(a5) move.l 4(a6),(a5) bne snd.Voice9 clr.l 10(a6) moveq #1,d0 move.w d0,4(a5) move.w d0,14(a6) snd.Voice9 move.w $10(a6),6(a5) st $2A(a6) move.w $14(a6),d0 or.w d0,snd.dma bra snd.PlayVoice2 ; ; Check commands ------ 1-7 / 10 / 14 ----------------------------------------- ; snd.CheckCom move.w 2(a6),d0 and.w #$FFF,d0 beq snd.ExCheckCom move.b 2(a6),d0 and.b #15,d0 tst.b d0 beq snd.Arpeggio cmp.b #1,d0 beq snd.PortUp cmp.b #2,d0 beq snd.PortDown cmp.b #3,d0 beq snd.MyPort cmp.b #4,d0 beq snd.Vib cmp.b #5,d0 beq snd.Comm5 cmp.b #6,d0 beq snd.Comm6 cmp.b #14,d0 beq snd.CommE move.w $10(a6),6(a5) cmp.b #7,d0 beq snd.Comm7 cmp.b #10,d0 beq snd.VolSlide snd.ExCheckCom rts snd.Nop move.w $10(a6),6(a5) rts ; ;- Arpeggio ------------------------------------------------------------------- ; snd.Arpeggio moveq #0,d0 move.l snd.count(pc),d0 divs #3,d0 swap d0 cmp.w #0,d0 beq snd.Arp2 cmp.w #2,d0 beq snd.Arp1 moveq #0,d0 move.b 3(a6),d0 lsr.b #4,d0 bra snd.Arp3 snd.Arp1 moveq #0,d0 move.b 3(a6),d0 and.b #15,d0 bra snd.Arp3 snd.Arp2 move.w $10(a6),d2 bra snd.Arp5 snd.Arp3 asl.w #1,d0 moveq #0,d1 move.b $12(a6),d1 mulu #$4A,d1 lea snd.Period(pc),a0 add.l d1,a0 moveq #0,d1 move.w $10(a6),d1 moveq #$24,d7 snd.Arp4 move.w 0(a0,d0.w),d2 cmp.w (a0),d1 bcc snd.Arp5 addq.l #2,a0 dbra d7,snd.Arp4 rts snd.Arp5 move.w d2,6(a5) rts ; ;- E1 command ----------------------------------------------------------------- ; snd.CommE1 tst.l snd.count bne snd.ExCheckCom move.b #15,snd.PortMask ; ;- 1 command ------------------------------------------------------------------ ; snd.PortUp moveq #0,d0 move.b 3(a6),d0 and.b snd.PortMask,d0 move.b #$FF,snd.PortMask sub.w d0,$10(a6) move.w $10(a6),d0 and.w #$FFF,d0 cmp.w #$71,d0 bpl snd.PortUp_1 and.w #$F000,$10(a6) or.w #$71,$10(a6) snd.PortUp_1 move.w $10(a6),d0 and.w #$FFF,d0 move.w d0,6(a5) rts ; ;- E2 command ----------------------------------------------------------------- ; snd.CommE2 tst.l snd.count bne snd.ExCheckCom move.b #15,snd.PortMask ; ;- 2 command ------------------------------------------------------------------ ; snd.PortDown moveq #0,d0 move.b 3(a6),d0 and.b snd.PortMask,d0 move.b #$FF,snd.PortMask add.w d0,$10(a6) move.w $10(a6),d0 and.w #$FFF,d0 cmp.w #$358,d0 bmi snd.PortDown_1 and.w #$F000,$10(a6) or.w #$358,$10(a6) snd.PortDown_1 move.w $10(a6),d0 and.w #$FFF,d0 move.w d0,6(a5) rts ; ;- PlayVoice calls this routine ----------------------------------------------- ; snd.PlayVoiceSub move.l a0,-(a7) move.w (a6),d2 and.w #$FFF,d2 moveq #0,d0 move.b $12(a6),d0 mulu #$4A,d0 lea snd.Period(pc),a0 add.l d0,a0 moveq #0,d0 snd.PVS2 cmp.w 0(a0,d0.w),d2 bcc snd.PVS3 addq.w #2,d0 cmp.w #$4A,d0 bcs snd.PVS2 moveq #$46,d0 snd.PVS3 move.b $12(a6),d2 and.b #8,d2 beq snd.PVS4 tst.w d0 beq snd.PVS4 subq.w #2,d0 snd.PVS4 move.w 0(a0,d0.w),d2 move.l (a7)+,a0 move.w d2,$18(a6) move.w $10(a6),d0 clr.b $16(a6) cmp.w d0,d2 beq snd.PVS5 bge snd.ExCheckCom move.b #1,$16(a6) rts snd.PVS5 clr.w $18(a6) rts ; ;- 3 command ------------------------------------------------------------------ ; snd.MyPort move.b 3(a6),d0 beq snd.MySlide move.b d0,$17(a6) clr.b 3(a6) snd.MySlide tst.w $18(a6) beq snd.ExCheckCom moveq #0,d0 move.b $17(a6),d0 tst.b $16(a6) bne snd.MySub add.w d0,$10(a6) move.w $18(a6),d0 cmp.w $10(a6),d0 bgt snd.MyOk move.w $18(a6),$10(a6) clr.w $18(a6) bra snd.MyOk snd.MySub sub.w d0,$10(a6) move.w $18(a6),d0 cmp.w $10(a6),d0 blt snd.MyOk move.w $18(a6),$10(a6) clr.w $18(a6) snd.MyOk move.w $10(a6),d2 move.b $1F(a6),d0 and.b #15,d0 beq snd.MyExit moveq #0,d0 move.b $12(a6),d0 mulu #$4A,d0 lea snd.Period(pc),a0 add.l d0,a0 moveq #0,d0 snd.MySeek cmp.w 0(a0,d0.w),d2 bcc snd.MyFound addq.w #2,d0 cmp.w #$4A,d0 bcs snd.MySeek moveq #$46,d0 snd.MyFound move.w 0(a0,d0.w),d2 snd.MyExit move.w d2,6(a5) rts ; ;- 4 command ------------------------------------------------------------------ ; snd.Vib move.b 3(a6),d0 beq snd.Vib4 move.b $1A(a6),d2 and.b #15,d0 beq snd.Vib2 and.b #$F0,d2 or.b d0,d2 snd.Vib2 move.b 3(a6),d0 and.b #$F0,d0 beq snd.Vib3 and.b #15,d2 or.b d0,d2 snd.Vib3 move.b d2,$1A(a6) snd.Vib4 move.b $1B(a6),d0 lea snd.Sin(pc),a4 lsr.w #2,d0 and.w #$1F,d0 moveq #0,d2 move.b $1E(a6),d2 and.b #3,d2 beq snd.Vib7 lsl.b #3,d0 cmp.b #1,d2 beq snd.Vib5 move.b #$FF,d2 bra snd.Vib8 snd.Vib5 tst.b $1B(a6) bpl snd.Vib6 move.b #$FF,d2 sub.b d0,d2 bra snd.Vib8 snd.Vib6 move.b d0,d2 bra snd.Vib8 snd.Vib7 move.b 0(a4,d0.w),d2 snd.Vib8 move.b $1A(a6),d0 and.w #15,d0 mulu d0,d2 lsr.w #7,d2 move.w $10(a6),d0 tst.b $1B(a6) bmi snd.VibMin add.w d2,d0 bra snd.VibMax snd.VibMin sub.w d2,d0 snd.VibMax move.w d0,6(a5) move.b $1A(a6),d0 lsr.w #2,d0 and.w #$3C,d0 add.b d0,$1B(a6) rts ; ;- 5 command ------------------------------------------------------------------ ; snd.Comm5 bsr snd.MySlide bra snd.VolSlide ; ;- 6 command ------------------------------------------------------------------ ; snd.Comm6 bsr snd.Vib4 bra snd.VolSlide ; ;- 7 command ------------------------------------------------------------------ ; snd.Comm7 move.b 3(a6),d0 beq snd.Comm74 move.b $1C(a6),d2 and.b #15,d0 beq snd.Comm72 and.b #$F0,d2 or.b d0,d2 snd.Comm72 move.b 3(a6),d0 and.b #$F0,d0 beq snd.Comm73 and.b #15,d2 or.b d0,d2 snd.Comm73 move.b d2,$1C(a6) snd.Comm74 move.b $1D(a6),d0 lea snd.Sin(pc),a4 lsr.w #2,d0 and.w #$1F,d0 moveq #0,d2 move.b $1E(a6),d2 lsr.b #4,d2 and.b #3,d2 beq snd.Comm77 lsl.b #3,d0 cmp.b #1,d2 beq snd.Comm75 move.b #$FF,d2 bra snd.Comm78 snd.Comm75 tst.b $1B(a6) bpl snd.Comm76 move.b #$FF,d2 sub.b d0,d2 bra snd.Comm78 snd.Comm76 move.b d0,d2 bra snd.Comm78 snd.Comm77 move.b 0(a4,d0.w),d2 snd.Comm78 move.b $1C(a6),d0 and.w #15,d0 mulu d0,d2 lsr.w #6,d2 moveq #0,d0 move.b $13(a6),d0 tst.b $1D(a6) bmi snd.Comm79 add.w d2,d0 bra snd.Comm7A snd.Comm79 sub.w d2,d0 snd.Comm7A bpl snd.Comm7B clr.w d0 snd.Comm7B cmp.w #$40,d0 bls snd.Comm7C move.w #$40,d0 snd.Comm7C mulu snd.MasterVol,d0 by Ready lsr.w #6,d0 by Ready move.w d0,8(a5) move.b $1C(a6),d0 lsr.w #2,d0 and.w #$3C,d0 add.b d0,$1D(a6) rts ; ;- 9 command ------------------------------------------------------------------ ; snd.Comm9 moveq #0,d0 move.b 3(a6),d0 beq snd.Comm9_1 move.b d0,$20(a6) snd.Comm9_1 move.b $20(a6),d0 lsl.w #7,d0 cmp.w 8(a6),d0 bge snd.Comm9_2 sub.w d0,8(a6) lsl.w #1,d0 add.l d0,4(a6) rts snd.Comm9_2 move.w #1,8(a6) rts ; ;- A command ------------------------------------------------------------------ ; snd.VolSlide moveq #0,d0 move.b 3(a6),d0 lsr.b #4,d0 tst.b d0 beq snd.VolDown2 snd.VolUp add.b d0,$13(a6) cmp.b #$40,$13(a6) bmi snd.VolUpOk move.b #$40,$13(a6) snd.VolUpOk move.b $13(a6),d0 mulu snd.MasterVol,d0 by Ready lsr.w #6,d0 by Ready move.w d0,8(a5) rts snd.VolDown moveq #0,d0 move.b 3(a6),d0 and.b #15,d0 snd.VolDown2 sub.b d0,$13(a6) bpl snd.VolDownOk clr.b $13(a6) snd.VolDownOk move.b $13(a6),d0 mulu snd.MasterVol,d0 by Ready lsr.w #6,d0 by Ready move.w d0,8(a5) rts ; ;- B command ------------------------------------------------------------------ ; snd.PosJump moveq #0,d0 move.b 3(a6),d0 subq.b #1,d0 move.l d0,snd.numpat st snd.newpat rts ; ;- C command ------------------------------------------------------------------ ; snd.SetVol moveq #0,d0 move.b 3(a6),d0 cmp.b #$40,d0 bls snd.VolOk moveq #$40,d0 snd.VolOk move.b d0,$13(a6) mulu snd.MasterVol,d0 by Ready lsr.w #6,d0 by Ready move.w d0,8(a5) rts ; ;- D command ------------------------------------------------------------------ ; snd.PattBreak moveq #0,d0 move.b 3(a6),d0 move.l d0,d2 lsr.b #4,d0 mulu #10,d0 and.b #15,d2 add.b d2,d0 cmp.b #$3F,d0 bhi snd.PattBreak2 lsl.w #4,d0 move.l d0,snd.patpos snd.PattBreak2 st snd.newpat rts ; ;- F command ------------------------------------------------------------------ ; snd.SetSpeed moveq #0,d0 move.b 3(a6),d0 cmp.b #$1F,d0 bls.s snd.OkSpeed moveq #$1F,d0 snd.OkSpeed tst.w d0 bne.s snd.OkSpeed2 moveq #1,d0 snd.OkSpeed2 move.l d0,snd.speed rts ; ;- PlayVoice2 ----------------------------------------------------------------- ; snd.PlayVoice2 move.b 2(a6),d0 and.b #15,d0 cmp.b #9,d0 beq snd.Comm9 cmp.b #11,d0 beq snd.PosJump cmp.b #13,d0 beq snd.PattBreak cmp.b #14,d0 beq snd.CommE cmp.b #15,d0 beq snd.SetSpeed cmp.b #12,d0 beq snd.SetVol rts ; ;- E commands ----------------------------------------------------------------- ; snd.CommE move.b 3(a6),d0 and.b #$F0,d0 lsr.b #4,d0 beq snd.Filter cmp.b #1,d0 beq snd.CommE1 cmp.b #2,d0 beq snd.CommE2 cmp.b #3,d0 beq snd.CommE3 cmp.b #4,d0 beq snd.CommE4 cmp.b #5,d0 beq snd.CommE5 cmp.b #6,d0 beq snd.CommE6 cmp.b #7,d0 beq snd.CommE7 cmp.b #8,d0 beq snd.CommE8 cmp.b #14,d0 beq snd.CommEE cmp.b #9,d0 beq snd.CommE9 cmp.b #10,d0 beq snd.CommEA cmp.b #11,d0 beq snd.CommEB cmp.b #12,d0 beq snd.CommEC cmp.b #13,d0 beq snd.CommED cmp.b #15,d0 beq snd.CommEF rts ; ;- E0 filter on/off ----------------------------------------------------------- ; snd.Filter move.b 3(a6),d0 and.b #1,d0 asl.b #1,d0 and.b #$FD,$BFE001 or.b d0,$BFE001 rts ; ;- E3 ------------------------------------------------------------------------- ; snd.CommE3 move.b 3(a6),d0 and.b #15,d0 and.b #$F0,$1F(a6) or.b d0,$1F(a6) rts ; ;- E4 ------------------------------------------------------------------------- ; snd.CommE4 move.b 3(a6),d0 and.b #15,d0 and.b #$F0,$1E(a6) or.b d0,$1E(a6) rts ; ;- E5 ------------------------------------------------------------------------- ; snd.CommE5 move.b 3(a6),d0 and.b #15,d0 move.b d0,$12(a6) rts ; ;- E6 ------------------------------------------------------------------------- ; snd.CommE6 tst.l snd.count bne snd.ExCheckCom move.b 3(a6),d0 and.b #15,d0 beq snd.CommE6_3 tst.b $22(a6) beq snd.CommE6_2 sub.b #1,$22(a6) beq snd.ExCheckCom snd.CommE6_1 move.b $21(a6),snd.byte1 st snd.byte2 rts snd.CommE6_2 move.b d0,$22(a6) bra snd.CommE6_1 snd.CommE6_3 move.l snd.patpos,d0 lsr.l #4,d0 and.b #$3F,d0 move.b d0,$21(a6) rts ; ;- E7 ------------------------------------------------------------------------- ; snd.CommE7 move.b 3(a6),d0 and.b #15,d0 lsl.b #4,d0 and.b #15,$1E(a6) or.b d0,$1E(a6) rts ; ;- E8 ------------------------------------------------------------------------- ; snd.CommE8 movem.l d1/d2/a0/a1,-(a7) move.l 10(a6),a0 move.l a0,a1 move.w 14(a6),d0 add.w d0,d0 subq.w #2,d0 snd.CommE8_c move.b (a0),d1 ext.w d1 move.b 1(a0),d2 ext.w d2 add.w d1,d2 asr.w #1,d2 move.b d2,(a0)+ dbra d0,snd.CommE8_c move.b (a0),d1 ext.w d1 move.b (a1),d2 ext.w d2 add.w d1,d2 asr.w #1,d2 move.b d2,(a0) movem.l (a7)+,d1/d2/a0/a1 rts ; ;- E9 ------------------------------------------------------------------------- ; snd.CommE9 move.l d1,-(a7) moveq #0,d0 move.b 3(a6),d0 and.b #15,d0 beq snd.CommE9_ex move.l snd.count,d1 bne snd.CommE9_1 move.w 0(a6),d1 and.w #$FFF,d1 bne snd.CommE9_ex move.l snd.count,d1 snd.CommE9_1 divu d0,d1 swap d1 tst.w d1 bne snd.CommE9_ex snd.CommE9_2 move.w $14(a6),$DFF096 move.l 4(a6),(a5) move.w 8(a6),4(a5) move.w $10(a6),6(a5) moveq #0,d0 move.b $13(a6),d0 mulu snd.MasterVol,d0 by Ready lsr.w #6,d0 by Ready move.w d0,8(a5) move.w snd.DmaWait,d0 snd.CommE9_c_1 dbra d0,snd.CommE9_c_1 move.w $14(a6),d0 bset #15,d0 move.w d0,$DFF096 move.w snd.DmaWait,d0 snd.CommE9_c_2 dbra d0,snd.CommE9_c_2 move.l 10(a6),(a5) move.l 14(a6),4(a5) snd.CommE9_ex move.l (a7)+,d1 rts ; ;- EA ------------------------------------------------------------------------- ; snd.CommEA tst.l snd.count bne snd.ExCheckCom moveq #0,d0 move.b 3(a6),d0 and.b #15,d0 bra snd.VolUp ; ;- EB ------------------------------------------------------------------------- ; snd.CommEB tst.l snd.count bne snd.ExCheckCom moveq #0,d0 move.b 3(a6),d0 and.b #15,d0 bra snd.VolDown ; ;- EC ------------------------------------------------------------------------- ; snd.CommEC moveq #0,d0 move.b 3(a6),d0 and.b #15,d0 cmp.l snd.count,d0 bne snd.ExCheckCom clr.b $13(a6) clr.w 8(a5) rts ; ;- ED ------------------------------------------------------------------------- ; snd.CommED moveq #0,d0 move.b 3(a6),d0 and.b #15,d0 cmp.l snd.count,d0 bne snd.ExCheckCom move.w (a6),d0 and.w #$FFF,d0 beq snd.ExCheckCom move.l d1,-(a7) bra snd.CommE9_2 ; ;- EE ------------------------------------------------------------------------- ; snd.CommEE tst.l snd.count bne snd.ExCheckCom moveq #0,d0 move.b 3(a6),d0 and.b #15,d0 tst.b snd.byte4 bne snd.ExCheckCom addq.b #1,d0 move.b d0,snd.byte3 rts ; ;- EF ------------------------------------------------------------------------- ; snd.CommEF tst.l snd.count bne snd.ExCheckCom move.b 3(a6),d0 and.b #15,d0 lsl.b #4,d0 and.b #15,$1F(a6) or.b d0,$1F(a6) tst.b d0 beq snd.ExCheckCom snd.CommEF_1 movem.l d1/d2/a0,-(a7) moveq #0,d0 move.b $1F(a6),d0 lsr.b #4,d0 beq snd.CommEF_3 lea snd.EFDat(pc),a0 move.b 0(a0,d0.w),d0 add.b d0,$23(a6) btst #7,$23(a6) beq snd.CommEF_3 clr.b $23(a6) move.l 4(a6),d1 moveq #0,d2 move.w $28(a6),d2 lsl.w #1,d2 add.l d2,d1 move.w 14(a6),d2 lsl.l #1,d2 sub.l d2,d1 move.l $24(a6),d2 moveq #0,d0 move.w 14(a6),d0 lsl.l #1,d0 add.l d0,d2 cmp.l d1,d2 bls snd.CommEF_2 move.l 10(a6),d2 snd.CommEF_2 move.l d2,$24(a6) move.l d2,(a5) snd.CommEF_3 movem.l (a7)+,d1/d2/a0 rts snd.EFDat dc.b $00,$05,$06,$07,$08,$0a,$0b,$0d dc.b $10,$13,$16,$1a,$20,$2b,$40,$80 ;------------------------------------------------------------------------------ ; PlaySample Sample,Channel,Period(d0,d1,d2) ;------------------------------------------------------------------------------ snd.PlaySample movem.l d0-a6,-(a7) moveq #0,d3 bset d1,d3 move.w d3,$dff096 tst.b d0 sample0 ? beq .Exit channel off lea snd.PSData(pc),a0 clr.l (a0) move.l d0,d3 and.b #$0f,d3 lsl.b #4,d3 or.b d3,2(a0) sample bit0-3 move.b d0,d3 and.b #$f0,d3 or.b d3,(a0) sample bit4 lea snd.Period(pc),a3 lsl.w #1,d2 move.w 0(a3,d2.w),d3 and.w #$fff,d3 or.w d3,(a0) period move.l snd.Data,a3 lea 12(a3),a3 sample table -30 lea $dff0a0,a5 move.l d1,d3 lsl.l #4,d3 adda.l d3,a5 lea snd.channel0(pc),a6 move.l d1,d3 mulu #44,d3 adda.l d3,a6 moveq #0,d1 pattern offset bsr.w snd.Voice1 bsr snd.Wait move.w snd.dma,d0 and.w snd.MasterDma,d0 or.w #$8000,d0 move.w d0,$dff096 bsr snd.Wait move.l 10(a6),0(a5) move.w 14(a6),4(a5) .Exit movem.l (a7)+,d0-a6 rts ******************************************************************************* * DataArea ******************************************************************************* snd.PSData DC.L 0 snd.Data DC.L 0 snd.samples BLK.L 31,0 snd.channel0 DC.W 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 snd.channel1 DC.W 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0 snd.channel2 DC.W 0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0 snd.channel3 DC.W 0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0 snd.count DC.L 0 snd.speed DC.L 6 snd.numpat DC.L 0 snd.patpos DC.L 0 snd.dma DC.W 0 snd.MasterDma DC.W $ffff snd.MasterVol DC.W 64 snd.DmaWait DC.W 300 snd.newpat DC.B 0 snd.PortMask DC.B $ff snd.byte1 DC.B 0 snd.byte2 DC.B 0 snd.byte3 DC.B 0 snd.byte4 DC.B 0 snd.Sin DC.B $00,$18,$31,$4a,$61,$78,$8d,$a1 DC.B $b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd DC.B $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5 DC.B $b4,$a1,$8d,$78,$61,$4a,$31,$18 snd.Period DC.W $358,$328,$2FA,$2D0,$2A6,$280,$25C,$23A,$21A,$1FC DC.W $1E0,$1C5,$1AC,$194,$17D,$168,$153,$140,$12E,$11D DC.W $10D,$FE,$F0,$E2,$D6,$CA,$BE,$B4,$AA,$A0,$97,$8F DC.W $87,$7F,$78,$71,0 DC.W $352,$322,$2F5,$2CB,$2A2,$27D,$259,$237,$217,$1F9 DC.W $1DD,$1C2,$1A9,$191,$17B,$165,$151,$13E,$12C,$11C DC.W $10C,$FD,$EF,$E1,$D5,$C9,$BD,$B3,$A9,$9F,$96,$8E DC.W $86,$7E,$77,$71,0 DC.W $34C,$31C,$2F0,$2C5,$29E,$278,$255,$233,$214,$1F6 DC.W $1DA,$1BF,$1A6,$18E,$178,$163,$14F,$13C,$12A,$11A DC.W $10A,$FB,$ED,$E0,$D3,$C7,$BC,$B1,$A7,$9E,$95,$8D DC.W $85,$7D,$76,$70,0 DC.W $346,$317,$2EA,$2C0,$299,$274,$250,$22F,$210,$1F2 DC.W $1D6,$1BC,$1A3,$18B,$175,$160,$14C,$13A,$128,$118 DC.W $108,$F9,$EB,$DE,$D1,$C6,$BB,$B0,$A6,$9D,$94,$8C DC.W $84,$7D,$76,$6F,0 DC.W $340,$311,$2E5,$2BB,$294,$26F,$24C,$22B,$20C,$1EF DC.W $1D3,$1B9,$1A0,$188,$172,$15E,$14A,$138,$126,$116 DC.W $106,$F7,$E9,$DC,$D0,$C4,$B9,$AF,$A5,$9C,$93,$8B DC.W $83,$7C,$75,$6E,0 DC.W $33A,$30B,$2E0,$2B6,$28F,$26B,$248,$227,$208,$1EB DC.W $1CF,$1B5,$19D,$186,$170,$15B,$148,$135,$124,$114 DC.W $104,$F5,$E8,$DB,$CE,$C3,$B8,$AE,$A4,$9B,$92,$8A DC.W $82,$7B,$74,$6D,0 DC.W $334,$306,$2DA,$2B1,$28B,$266,$244,$223,$204,$1E7 DC.W $1CC,$1B2,$19A,$183,$16D,$159,$145,$133,$122,$112 DC.W $102,$F4,$E6,$D9,$CD,$C1,$B7,$AC,$A3,$9A,$91,$89 DC.W $81,$7A,$73,$6D,0 DC.W $32E,$300,$2D5,$2AC,$286,$262,$23F,$21F,$201,$1E4 DC.W $1C9,$1AF,$197,$180,$16B,$156,$143,$131,$120,$110 DC.W $100,$F2,$E4,$D8,$CC,$C0,$B5,$AB,$A1,$98,$90,$88 DC.W $80,$79,$72,$6C,0 DC.W $38B,$358,$328,$2FA,$2D0,$2A6,$280,$25C,$23A,$21A DC.W $1FC,$1E0,$1C5,$1AC,$194,$17D,$168,$153,$140,$12E DC.W $11D,$10D,$FE,$F0,$E2,$D6,$CA,$BE,$B4,$AA,$A0,$97 DC.W $8F,$87,$7F,$78,0 DC.W $384,$352,$322,$2F5,$2CB,$2A3,$27C,$259,$237,$217 DC.W $1F9,$1DD,$1C2,$1A9,$191,$17B,$165,$151,$13E,$12C DC.W $11C,$10C,$FD,$EE,$E1,$D4,$C8,$BD,$B3,$A9,$9F,$96 DC.W $8E,$86,$7E,$77,0 DC.W $37E,$34C,$31C,$2F0,$2C5,$29E,$278,$255,$233,$214 DC.W $1F6,$1DA,$1BF,$1A6,$18E,$178,$163,$14F,$13C,$12A DC.W $11A,$10A,$FB,$ED,$DF,$D3,$C7,$BC,$B1,$A7,$9E,$95 DC.W $8D,$85,$7D,$76,0 DC.W $377,$346,$317,$2EA,$2C0,$299,$274,$250,$22F,$210 DC.W $1F2,$1D6,$1BC,$1A3,$18B,$175,$160,$14C,$13A,$128 DC.W $118,$108,$F9,$EB,$DE,$D1,$C6,$BB,$B0,$A6,$9D,$94 DC.W $8C,$84,$7D,$76,0 DC.W $371,$340,$311,$2E5,$2BB,$294,$26F,$24C,$22B,$20C DC.W $1EE,$1D3,$1B9,$1A0,$188,$172,$15E,$14A,$138,$126 DC.W $116,$106,$F7,$E9,$DC,$D0,$C4,$B9,$AF,$A5,$9C,$93 DC.W $8B,$83,$7B,$75,0 DC.W $36B,$33A,$30B,$2E0,$2B6,$28F,$26B,$248,$227,$208 DC.W $1EB,$1CF,$1B5,$19D,$186,$170,$15B,$148,$135,$124 DC.W $114,$104,$F5,$E8,$DB,$CE,$C3,$B8,$AE,$A4,$9B,$92 DC.W $8A,$82,$7B,$74,0 DC.W $364,$334,$306,$2DA,$2B1,$28B,$266,$244,$223,$204 DC.W $1E7,$1CC,$1B2,$19A,$183,$16D,$159,$145,$133,$122 DC.W $112,$102,$F4,$E6,$D9,$CD,$C1,$B7,$AC,$A3,$9A,$91 DC.W $89,$81,$7A,$73,0 DC.W $35E,$32E,$300,$2D5,$2AC,$286,$262,$23F,$21F,$201 DC.W $1E4,$1C9,$1AF,$197,$180,$16B,$156,$143,$131,$120 DC.W $110,$100,$F2,$E4,$D8,$CB,$C0,$B5,$AB,$A2,$99,$90 DC.W $88,$80,$79,$72,0 ENDM