************************************************* * This NoiseTracker source is made by: * * Lars-¸ke Berg * * Email adress:d0berg@dtek.chalmers.se * * It is PublicDomain * * If you want to get in contact with me * * use my email adress or write to * * Lars-¸ke Berg * * Volratamsgatan 6-9320 * * 412 60 G”teborg * * Sweden * * or phone 046-(0)31-163123 * ************************************************* * Thanx to M.K for the sorce.(from the Amiga) * ************************************************* * This player uses NoiseTracker modules from * * the amiga (not SoundTracker and ProTracker). * * To start, it,do like this. * * 1. Assamble it in (Seka). * * 2. Chose playing frek by puting 0,1 or 2(.l) * * in hz (label). * * 3. jump to start. * * 4. to stop playing jump to back. * * 3 diffrent playing frek. are included. * * The flag hz(.l) stands for * * 0(.l)=6.25 kHz 1(.l)=12.5 kHz 2(.l)=25.0 kHz * * don't forget to do initmusic and initdma * * after changing playing frek. * ************************************************* moduldta=$80000 start: bsr.L mod_init bsr.l initmusic bsr.l initdma move.w #$2700,sr move.l $70,oldvbl move.l #vbl,$70 move.w #$2300,sr rts back: move.w #$2700,sr move.l oldvbl,$70 ; move.w #$-1,$ff8240 move.w #$2300,sr rts oldvbl: dc.l 0 vbl: movem.l a0-a6/d0-d7,-(sp) ; move.w #$000,$ff8240 bsr.L playmod move.w #$fff,$ff8240 bsr.l Atari_rutin ; move.w #$-1,$ff8240 bsr.s levelstaplar movem.l (sp)+,a0-a6/d0-d7 rte *********************************************** ;show rutiner *********************************************** levelstaplar: lea voice1+6,a1 lea old_voltab,a2 move.w (a1),d0 ;level ch 0 move.w 28(a1),d1;level ch 1 move.w 56(a1),d2;level ch 2 move.w 84(a1),d3;level ch 3 and.w #$7f,d0 and.w #$7f,d1 and.w #$7f,d2 and.w #$7f,d3 lsr.w #1,d0 ;skala ner 2 ggr. lsr.w #1,d1 lsr.w #1,d2 lsr.w #1,d3 lea $f8002+[160*90],a0 bsr.s vol_before bsr.s channel lea $f800a+[160*90],a0 move.w d1,d0 bsr.s vol_before bsr.s channel lea $f8012+[160*90],a0 move.w d2,d0 bsr.s vol_before bsr.s channel lea $f801a+[160*90],a0 move.w d3,d0 bsr.s vol_before bsr.s channel rts vol_before: cmp.w #$40,d0 ble.s no_error_vol moveq #$40,d0 no_error_vol: move.w (a2),d5 cmp.w d5,d0 blo.s minska_st move.w d0,(a2)+ rts minska_st: subq.w #1,d5 bpl.s minska_st2 moveq #0,d5 minska_st2: move.w d5,(a2)+ move.w d5,d0 rts channel: lea stapel,a1 lsl.w #1,d0 and.l #$00fe ,d0 add.l d0,a1 moveq #31,d4 lpstap: move.w (a1)+,(a0) lea 160(a0),a0 dbf d4,lpstap rts old_voltab: dc.w 0,0,0,0 stapel: dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.w -1,-1,-1,-1,-1,-1,-1,-1 dc.w -1,-1,-1,-1,-1,-1,-1,-1 dc.w -1,-1,-1,-1,-1,-1,-1,-1 dc.w -1,-1,-1,-1,-1,-1,-1,-1 ************************************************ mod_init: ;spara pekare till smp data. lea moduldta,a0 lea spl_dta_starts,a1 lea 42(a0),a0 moveq #31,d0 ;max 31 sampels. moveq #$1e,d1 init_lp: move.l a0,(a1)+ add.l d1,a0 dbf d0,init_lp ;leta reda pa hogsta pattern nr. ->d2 lea moduldta,a0 lea 952(a0),a0 moveq #127,d0 ;max 128 moveq #0,d1 moveq #0,d2 init_lp2: move.b (a0)+,d1 cmp.b d2,d1 ble.s init_lp3 move.w d1,d2 init_lp3: dbf d0,init_lp2 addq.l #1,d2 ;step to spl. ;find samples starts lea moduldta,a0 lea 1084(a0),a0 ;pattern starts lea spl_starts,a1 lea spl_dta_starts,a2 lsl.l #8,d2 ;mulu 1024 lsl.l #2,d2 ;step to first spl. add.l d2,a0 ;pointer spl. moveq #31,d1 init_lp4: moveq #0,d0 move.l a0,(a1)+ move.l (a2)+,a3 move.w (a3),d0 ;len in words lsl.w #1,d0 ;in bytes add.l d0,a0 dbf d1,init_lp4 ;set volym =0 lea voice1,a0 moveq #0,d0 move.w d0,6(a0) move.w d0,28+6(a0) move.w d0,56+6(a0) move.w d0,84+6(a0) move.b d0,songpos move.b d0,counter move.w d0,patternpos move.b #6,songspeed rts ;init data. spl_dta_starts: blk.l 32,0 spl_starts: blk.l 32,0 songpos: dc.b 0 counter: dc.b 0 patternpos: dc.w 0 songspeed: dc.b 0 mod_break: dc.b 0 even playmod: lea moduldta,a0 add.b #1,counter move.b counter,d0 cmp.b songspeed,d0 blo.L no_new new_voice: moveq #0,d0 moveq #0,d1 lea 1084(a0),a1 ;first pattern pek move.b d0,counter move.b songpos,d0 add.l #950,a0 move.b 2(a0,d0.w),d0 move.w patternpos,d1 lsl.l #8,d0 ;find right pattern offset. lsl.l #2,d0 lea spl_starts,a2 lea spl_dta_starts,a6 lea voice1,a4 bsr.s playvoice addq.w #4,d1 lea voice2,a4 bsr.s playvoice addq.w #4,d1 lea voice3,a4 bsr.s playvoice addq.w #4,d1 lea voice4,a4 bsr.s playvoice addq.w #4,d1 move.w d1,patternpos cmp.w #1024,d1 bne.s not_end_pattern end_pattern: move.w #0,patternpos clr.b mod_break add.b #1,songpos move.b songpos,d0 cmp.b (a0),d0 bne.s not_end_song end_song: move.b #0,songpos move.w #0,patternpos not_end_pattern: not_end_song: tst.b mod_break bne.s end_pattern rts playvoice: lea 0(a1,d0.l),a3 ;pattern pek add.l d1,a3 ;pattern pos move.l (a3),18(a4) ;lagra ton dta. moveq #0,d2 moveq #0,d3 move.w 18(a4),d2 move.w 18+2(a4),d3 and.w #$f000,d2 and.w #$f000,d3 lsr.w #4,d3 or.w d3,d2 lsr.w #8,d2 tst.w d2 beq.L old_instr sub.w #1,d2 lsl.w #2,d2 move.l 0(a2,d2.w),a5 ;spl start move.l a5,(a4) ;to voicedta move.l a5,d3 ;copy spl start move.l 0(a6,d2.w),a5 ;spl dta pek move.w (a5),d2 lsl.w #1,d2 ;len in bytes neg.w d2 sub.l d2,(a4) ;andra spl start move.w d2,4(a4) ;to voicedta move.w 2(a5),d2 and.w #$007f,d2 ;volyme (mask bort fine tune) cmp.w #$40,d2 ble.s volmask moveq #$40,d2 volmask: move.w d2,6(a4) ;volym moveq #0,d2 move.w 4(a5),d2 ;rep point beq.s no_loop ;no rep from beginning lsl.w #1,d2 ;to bytes. add.l d3,d2 move.l d2,8(a4) ;rep start moveq #0,d4 move.w 6(a5),d4 ;rel len lsl.w #1,d4 ;rep len in bytes neg.w d4 sub.l d4,8(a4) ;rep start. move.w d4,12(a4) ;rep dta pek. (len) bra.s looping no_loop: move.l d3,8(a4) moveq #0,d3 move.w 6(a5),d3 sub.w #1,d3 ;kompensation lsl.w #1,d3 neg.w d3 sub.l d3,8(a4) move.w d3,12(a4) looping: move.w #0,16(a4) old_instr: move.w 18(a4),d2 and.w #$0fff,d2 ;note period beq.L mod_command2 tst.w 4(a4) ;tst spl len beq.s stopsound move.b 18+2(a4),d3 ;effect command and.b #$0f,d3 cmp.b #5,d3 beq.s set_port cmp.b #3,d3 beq.s set_port move.w d2,14(a4) ;to voicedta clr.b 27(a4) bra.L mod_command2 stopsound: move.w #0,6(a4) bra.L mod_command2 no_new: lea voice1,a4 bsr.L mod_command lea voice2,a4 bsr.L mod_command lea voice3,a4 bsr.L mod_command lea voice4,a4 bsr.L mod_command rts set_port: move.w 18(a4),d2 ;period and.w #$0fff,d2 move.w d2,22(a4) ;new period? move.w 14(a4),d3 ;old note period clr.b 24(a4) cmp.w d3,d2 beq.s mod_clrport bge.L mod_command2 move.b #1,24(a4) ;set flag bra.L mod_command2 mod_clrport: clr.w 22(a4) rts mod_port: moveq #0,d3 move.b 18+3(a4),d2 beq.s mod_port2 move.b d2,25(a4) move.b d3,18+3(a4) mod_port2: tst.w 22(a4) beq.s mod_rts move.b 25(a4),d3 tst.b 24(a4) bne.s mod_sub add.w d3,14(a4) move.w 22(a4),d3 cmp.w 14(a4),d3 bgt.s mod_portok move.w 22(a4),14(a4) clr.w 22(a4) mod_portok: mod_rts: rts mod_sub: sub.w d3,14(a4) move.w 22(a4),d3 cmp.w 14(a4),d3 blt.s mod_portok move.w 22(a4),14(a4) clr.w 22(a4) rts mod_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 mod_vib: move.b 18+3(a4),d3 beq.s mod_vib2 move.b d3,26(a4) mod_vib2: move.b 27(a4),d3 lsr.w #2,d3 and.w #$1f,d3 moveq #0,d2 lea mod_sin,a3 move.b 0(a3,d3.w),d2 move.b 26(a4),d3 and.w #$0f,d3 mulu d3,d2 lsr.w #7,d2 move.w 14(a4),d3 tst.b 27(a4) bmi.s mod_vibsub add.w d2,d3 bra.s mod_vib3 mod_vibsub: sub.w d2,d3 mod_vib3: move.w d3,14(a4) move.b 26(a4),d3 lsr.w #2,d3 and.w #$3c,d3 add.b d3,27(a4) rts mod_arplist: dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0 dc.b 1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1 mod_arp: moveq #0,d3 move.b counter,d3 move.b mod_arplist(pc,d3.w),d3 beq.s mod_normper cmp.b #2,d3 beq.s mod_arp2 mod_arp1: move.b 18+3(a4),d3 lsr.w #4,d3 bra.s mod_arpdo mod_arp2: move.b 18+3(a4),d3 and.w #$0f,d3 mod_arpdo: lsl.w #1,d3 move.w 14(a4),d2 lea mod_periods,a0 mod_arp3: cmp.w (a0)+,d2 blt.s mod_arp3 move.w -2(a0,d3.w),14(a4) rts mod_normper: move.w 14(a4),14(a4) rts mod_command: move.w 18+2(a4),d3 and.w #$0fff,d3 beq.s mod_normper ;normal period move.b 18+2(a4),d3 and.b #$0f,d3 beq.s mod_arp cmp.b #6,d3 beq.L mod_volvib cmp.b #4,d3 beq.L mod_vib cmp.b #5,d3 beq.L mod_volport cmp.b #3,d3 beq.L mod_port cmp.b #1,d3 beq.s mod_portup cmp.b #2,d3 beq.s mod_portdown move.w 14(a4),14(a4) ;set period cmp.b #10,d3 beq.s mod_volslide rts mod_portup: moveq #0,d2 move.b 18+3(a4),d2 sub.w d2,14(a4) move.w 14(a4),d2 cmp.w #$71,d2 bpl.s mod_portup2 move.w #$71,14(a4) mod_portup2: rts mod_portdown: moveq #0,d2 move.b 18+3(a4),d2 add.w d2,14(a4) move.w 14(a4),d2 cmp.w #$358,d2 bmi.s mod_portdown2 move.w #$358,14(a4) mod_portdown2: rts mod_volvib: bsr.L mod_vib2 bra.s mod_volslide mod_volport: bsr.L mod_port2 mod_volslide: moveq #0,d2 move.b 18+3(a4),d2 lsr.b #4,d2 tst.b d2 beq.s mod_vol3 add.w d2,6(a4) cmp.w #$40,6(a4) bmi.s mod_vol2 move.w #$40,6(a4) mod_vol2: move.w 6(a4),6(a4) rts mod_vol3: moveq #0,d2 move.b 18+3(a4),d2 and.b #$0f,d2 sub.w d2,6(a4) bpl.s mod_vol4 clr.w 6(a4) mod_vol4: move.w 6(a4),6(a4) rts mod_command2: ;extra tst.w 4(a4) bne.L vol_snd move.w #0,6(a4) ;stop_sound vol_snd: ;hit moveq #0,d3 move.b 18+2(a4),d3 and.b #$0f,d3 beq.L mod_rts cmp.b #$0e,d3 beq.s mod_filter cmp.b #$0d,d3 beq.s mod_pattbreak cmp.b #$0b,d3 beq.s mod_songjmp cmp.b #$0c,d3 beq.s mod_setvol cmp.b #$0f,d3 beq.s mod_setspeed rts mod_filter: rts ;ej i funk mod_pattbreak: move.b #1,mod_break rts mod_songjmp: move.b #1,mod_break move.b 18+3(a4),d3 subq.b #1,d3 move.b d3,songpos rts mod_setvol: cmp.b #$40,18+3(a4) ble.s mod_sv2 move.b #$40,18+3(a4) mod_sv2: move.b 18+3(a4),7(a4) ;set volym ; move.w 6(a4),6(a4) rts mod_setspeed: cmp.b #$1f,18+3(a4) ble.s mod_sp2 move.b #$1f,18+3(a4) mod_sp2: moveq #0,d3 move.b 18+3(a4),d3 beq.s mod_sp3 move.b d3,songspeed clr.b counter mod_sp3: rts mod_periods: dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a,$01fc,$01e0 dc.w $01c5,$01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d,$010d,$00fe dc.w $00f0,$00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f,$0087 dc.w $007f,$0078,$0071,$0000 ; spl pek .l 0 ; spl len in bytes.w 4 ; spl volym .w 6 ; rep. start .l 8 ; rep. len .w 12 ; period .w 14 ; special .w 16 ; ton dta .l 18 ; clc period .w 22 ; flagga .b 24 ; flagga .b 25 ; ---"---- .b 26 ; ---"---- .b 27 voice1: blk.b 28,0 voice2: blk.b 28,0 voice3: blk.b 28,0 voice4: blk.b 28,0 Atari_rutin: ;every vbl.. ; move.w #$070,$ff8240 bsr.L setframe move.b #0,$ff8901 move.b #1,$ff8901 bsr.L bytframe move.l frames,a5 bsr.L playonatari ; move.w #$-1,$ff8240 rts initmusic: ;init make volum control tabel. move.w #$40,d0 lea volymtab+$4100,a0 ;endtabell lagra baklanges init1: move.w #$ff,d1 init2: move.w d1,d2 ext.w d2 muls d0,d2 divs #$0080,d2 move.b d2,-(a0) dbf d1,init2 dbf d0,init1 ;make period tabel $2e8 longwords lea periodtab,a0 lea Hztabvol,a1 move.l hz,d5 lsl.l #2,d5 move.l 0(a1,d5.l),a1 move.w #$0071,d1 move.w #$02e7,d0 move.l #$011df98a,d2 init3: swap d2 moveq #0,d3 move.w d2,d3 divu d1,d3 move.w d3,d4 swap d4 swap d2 move.w d2,d3 divu d1,d3 move.w d3,d4 jsr (a1) move.l d4,(a0)+ addq.w #1,d1 dbf d0,init3 do_fastcheck: lea fastcheck,a0 lea periodtab,a1 move.l hz,d6 move.l #250,d7 lsl.w d6,d7 move.w #$2e7,d0 chlp1: move.w d7,d1 ;+1 for security. moveq #0,d4 moveq #0,d5 move.w (a1)+,d2 move.w (a1)+,d3 chlp2: add.w d3,d5 addx.w d2,d4 dbf d1,chlp2 move.w d4,(a0)+ dbf d0,chlp1 rts twice: lsl.l #1,d4 rts norm: rts half: lsr.l #1,d4 rts Hztabvol: dc.l twice,norm,half initdma: move.l frames+4,d0 ;startframe bsr.L setframe2 move.l hz,d0 move.b d0,$ff8921 ;set frek. writetodma: move.b #0,$ff8901 lea dmadta,a0 move.w (a0)+,$ff8924 bra.s dmaloop newdmadta: move.w d0,$ff8922 waitondma: tst.w $ff8922 bne.s waitondma dmaloop: move.w (a0)+,d0 bne.s newdmadta move.b #1,$ff8901 rts dmadta: dc.w $0ffe ;mask dc.w $09d1 ;master vol dc.w $0aa9 ;left vol dc.w $0a29 ;right vol dc.w $090d ;dis -12dB $901 0dB $90d +12dB $919 dc.w $088d ;bas -12dB $881 0dB $88d +12dB $899 dc.w $0803 ;mix mixa inte dc.w 0 setframe: move.l frames,d0 ;startframe setframe2: move.l d0,d1 move.l hz,d2 move.l #250,d3 lsl.l d2,d3 add.l d3,d1 move.b d0,$ff8907 lsr.l #8,d0 move.b d0,$ff8905 lsr.l #8,d0 move.b d0,$ff8903 move.b d1,$ff8913 lsr.l #8,d1 move.b d1,$ff8911 lsr.l #8,d1 move.b d1,$ff890f rts bytframe: move.l frames,d0 move.l frames+4,d1 exg d0,d1 move.l d0,frames move.l d1,frames+4 rts frames: dc.l frame1,frame2 faster1:macro add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 move.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 move.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 move.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 move.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 move.w d4,(a5)+ endm faster2:macro add.w d2,d0 addx.w d3,d1 dc.w $6b08 move.w d6,d1 move.l d5,a0 addq.w #2,a5 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 dc.w $6b08 move.w d6,d1 move.l d5,a0 addq.w #2,a5 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 dc.w $6b08 move.w d6,d1 move.l d5,a0 addq.w #2,a5 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 dc.w $6b08 move.w d6,d1 move.l d5,a0 addq.w #2,a5 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 dc.w $6b08 move.w d6,d1 move.l d5,a0 addq.w #2,a5 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.w d4,(a5)+ endm faster3:macro add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $6008 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $6008 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $6008 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $6008 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $6008 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),(a5) addq.w #2,a5 endm faster4:macro add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.b d4,(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.b d4,(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.b d4,(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.b d4,(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 dc.w $6b06 move.w d6,d1 move.l d5,a0 dc.w $600a move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.b d4,(a5) addq.w #2,a5 endm fastest1:macro add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 move.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 move.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 move.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 move.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 move.w d4,(a5)+ endm fastest2:macro add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.w d4,(a5)+ add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.w d4,(a5)+ endm fastest3:macro add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),(a5) addq.w #2,a5 endm fastest4:macro add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.b d4,(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.b d4,(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.b d4,(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.b d4,(a5) addq.w #2,a5 add.w d2,d0 addx.w d3,d1 move.b $0(a0,d1.l),d4 move.b $0(a1,d4.l),d4 add.b d4,(a5) addq.w #2,a5 endm playonatari: ;en svordom kuken: move.l a5,a3 bsr.l no_volym lea periodtab,a2 sub.l #$1c4,a2 lea volymtab,a4 ;CHANNEL 1 playitlp1: move.l a3,a5 moveq #0,d0 moveq #0,d1 lea fastcheck,a6 move.l voice1,a0 ;spl location move.w voice1+4,d1 ;kvar av smp. move.w voice1+16,d0 move.w voice1+14,d4;ton hojd and.w #$0fff,d4 add.w d4,d4 move.w 0(a6,d4.w),d5 ;fast check offset. add.w d4,d4 move.w 0(a2,d4.w),d3 ;konvert perid move.w 2(a2,d4.w),d2 move.w voice1+6,d4 ;volym st volymflag1 tst.w d4 bne.s volymon1 sf volymflag1 volymon1: lsl.w #8,d4 lea 0(a4,d4.w),a1 moveq #0,d4 lea fastsound1,a6 move.w d3,d6 lsl.w #1,d5 add.w d5,d6 move.w d1,d5 add.w d6,d5 bmi.s no_fasts1 lea sound1,a6 no_fasts1: move.l voice1+8,d5 ;repeat offset move.w voice1+12,d6 tst.b volymflag1 bne.s volym1 bra.s volym2_1 volym1: tst.w d1 beq.L volym2_1 moveq #0,d4 move.l hz,d4 cmp.l #0,d4 beq.s one_1 cmp.l #1,d4 beq.s two_1 jsr (a6) jsr (a6) two_1: jsr (a6) one_1: jsr (a6) volym2_1: move.l a0,voice1 move.w d1,voice1+4 move.w d0,voice1+16 ;CHANNEL 2 playitlp2: move.l a3,a5 moveq #0,d0 moveq #0,d1 lea fastcheck,a6 move.l voice2,a0 ;spl location move.w voice2+4,d1 ;kvar av smp. move.w voice2+16,d0 move.w voice2+14,d4;ton hojd and.w #$0fff,d4 add.w d4,d4 move.w 0(a6,d4.w),d5 ;fast check offset. add.w d4,d4 move.w 0(a2,d4.w),d3 ;konvert perid move.w 2(a2,d4.w),d2 move.w voice2+6,d4 ;volym st volymflag2 tst.w d4 bne.s volymon2 sf volymflag2 volymon2: lsl.w #8,d4 lea 0(a4,d4.w),a1 moveq #0,d4 lea fastsound2,a6 move.w d3,d6 lsl.w #1,d5 add.w d5,d6 move.w d1,d5 add.w d6,d5 bmi.s no_fasts2 lea sound2,a6 no_fasts2: move.l voice2+8,d5 ;repeat offset move.w voice2+12,d6 tst.b volymflag2 bne.s volym2 bra.s volym2_2 volym2: tst.w d1 beq.L volym2_2 moveq #0,d4 move.l hz,d4 cmp.l #0,d4 beq.s one_2 cmp.l #1,d4 beq.s two_2 jsr (a6) jsr (a6) two_2: jsr (a6) one_2: jsr (a6) volym2_2: move.l a0,voice2 move.w d1,voice2+4 move.w d0,voice2+16 ;CHANNEL 3 playitlp3: move.l a3,a5 moveq #0,d0 moveq #0,d1 lea fastcheck,a6 move.l voice3,a0 ;spl location move.w voice3+4,d1 ;kvar av smp. move.w voice3+16,d0 move.w voice3+14,d4;ton hojd and.w #$0fff,d4 add.w d4,d4 move.w 0(a6,d4.w),d5 ;fast check offset. add.w d4,d4 move.w 0(a2,d4.w),d3 ;konvert perid move.w 2(a2,d4.w),d2 move.w voice3+6,d4 ;volym st volymflag3 tst.w d4 bne.s volymon3 sf volymflag3 volymon3: lsl.w #8,d4 lea 0(a4,d4.w),a1 moveq #0,d4 lea fastsound3,a6 move.w d3,d6 lsl.w #1,d5 add.w d5,d6 move.w d1,d5 add.w d6,d5 bmi.s no_fasts3 lea sound3,a6 no_fasts3: move.l voice3+8,d5 ;repeat offset move.w voice3+12,d6 tst.b volymflag3 bne.s volym3 bra.s volym2_3 volym3: tst.w d1 beq.L volym2_3 moveq #0,d4 move.l hz,d4 cmp.l #0,d4 beq.s one_3 cmp.l #1,d4 beq.s two_3 jsr (a6) jsr (a6) two_3: jsr (a6) one_3: jsr (a6) volym2_3: move.l a0,voice3 move.w d1,voice3+4 move.w d0,voice3+16 ;CHANNEL 4 playitlp4: move.l a3,a5 moveq #0,d0 moveq #0,d1 lea fastcheck,a6 move.l voice4,a0 ;spl location move.w voice4+4,d1 ;kvar av smp. move.w voice4+16,d0 move.w voice4+14,d4;ton hojd and.w #$0fff,d4 add.w d4,d4 move.w 0(a6,d4.w),d5 ;fast check offset. add.w d4,d4 move.w 0(a2,d4.w),d3 ;konvert perid move.w 2(a2,d4.w),d2 move.w voice4+6,d4 ;volym st volymflag4 tst.w d4 bne.s volymon4 sf volymflag4 volymon4: lsl.w #8,d4 lea 0(a4,d4.w),a1 moveq #0,d4 lea fastsound4,a6 move.w d3,d6 lsl.w #1,d5 add.w d5,d6 move.w d1,d5 add.w d6,d5 bmi.s no_fasts4 lea sound4,a6 no_fasts4: move.l voice4+8,d5 ;repeat offset move.w voice4+12,d6 tst.b volymflag4 bne.s volym4 bra.s volym2_4 volym4: tst.w d1 beq.L volym2_4 moveq #0,d4 move.l hz,d4 cmp.l #0,d4 beq.s one_4 cmp.l #1,d4 beq.s two_4 jsr (a6) jsr (a6) two_4: jsr (a6) one_4: jsr (a6) volym2_4: move.l a0,voice4 move.w d1,voice4+4 move.w d0,voice4+16 rts volymflag1: dc.b 0 volymflag2: dc.b 0 volymflag3: dc.b 0 volymflag4: dc.b 0 even sound1: ; move.w #$f00,$ff8240 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 faster1 rts sound2: ; move.w #$f00,$ff8240 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 faster2 rts sound3: ; move.w #$f00,$ff8240 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 faster3 rts sound4: ; move.w #$f00,$ff8240 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 faster4 rts fastsound1: ; move.w #$ff0,$ff8240 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 fastest1 rts fastsound2: ; move.w #$ff0,$ff8240 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 fastest2 rts fastsound3: ; move.w #$ff0,$ff8240 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 fastest3 rts fastsound4: ; move.w #$ff0,$ff8240 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 fastest4 rts no_volym: ; move.w #$00f,$ff8240 blitter: move.l a3,$ff8a32 move.b #0,$ff8a3b move.w #1,$ff8a38 move.w #125,d0 move.l hz,d1 lsl.w d1,d0 move.w d0,$ff8a36 move.w #2,$ff8a2e move.w #2,$ff8a30 move.b #$c0,$ff8a3c rts ;uppspelnings frekvens ;0 = 6.25 kHz in stereo ;1 = 12.5 kHz in stereo ;2 = 25.0 kHz in stereo hz: dc.l 0 volymtab: blk.b $4100,0 periodtab: blk.l $2e8,0 fastcheck: blk.w $2e8,0 frame1: blk.b 1000,0 frame2: blk.b 1000,0