home *** CD-ROM | disk | FTP | other *** search
- *
- * JamCracker V1.0 Replay routine, written by M. Gemmel
- *
- * Make sure you have read the ReadMe file on this disk too.
- *
- * This is not a demonstration source, showing how to write
- * a song-play routine. This source is merely ment for
- * inclusion in other sources, or as assembly module for
- * linkage with other programs.
- *
- * This source was modified for the MasterSeka V1.53 assembler
- * and can be easily modified for other assemblers. (Not true, it's a lot of work - Arcade)
- * The song should be inserted at 'mysong' near the bottom of
- * this source, in chip memory.
- *
- * Modified for MasterSeka 1.53 by Arcade of CADCAM
- *
- * Note from Arcade: I saved all of you who want to use the replayer
- * with MasterSeka a lot of work. So leave this text here, I want the credits.
-
- * This is the correct calling procedure
- * Don't forget to save any important registers
- * because I don't care
-
- Start bsr.s pp_init ;First, initialize
-
- here bsr pp_play ;Then, play every 1/50 sec.
- hi cmpi.b #1,$dff006 ;wait for raster
- bne.s hi
- btst #6,$bfe001 ;Check left mouse button
- bne.s here
- bsr pp_end ;Finally, stop playing
-
- rts
-
- it_name equ 0
- it_flags equ 31
- it_size equ 32
- it_address equ 36
- it_sizeof equ 40
-
- pt_size equ 0
- pt_address equ 2
- pt_sizeof equ 6
-
- nt_period equ 0
- nt_instr equ 1
- nt_speed equ 2
- nt_arpeggio equ 3
- nt_vibrato equ 4
- nt_phase equ 5
- nt_volume equ 6
- nt_porta equ 7
- nt_sizeof equ 8
-
- pv_waveoffset equ 0
- pv_dmacon equ 2
- pv_custbase equ 4
- pv_inslen equ 8
- pv_insaddress equ 10
- pv_peraddress equ 14
- pv_pers equ 18
- pv_por equ 24
- pv_deltapor equ 26
- pv_porlevel equ 28
- pv_vib equ 30
- pv_deltavib equ 32
- pv_vol equ 34
- pv_deltavol equ 36
- pv_vollevel equ 38
- pv_phase equ 40
- pv_deltaphase equ 42
- pv_vibcnt equ 44
- pv_vibmax equ 45
- pv_flags equ 46
- pv_sizeof equ 48
-
- *** This is the actual replay routine
-
- wavesize equ $40
-
- pp_init lea mysong,a0
- addq.w #4,a0
- move.w (a0)+,d0
- move.w d0,d1
- move.l a0,instable
- mulu #it_sizeof,d0
- adda.w d0,a0
-
- move.w (a0)+,d0
- move.w d0,d2
- move.l a0,patttable
- mulu #pt_sizeof,d0
- adda.w d0,a0
-
- move.w (a0)+,d0
- move.w d0,songlen
- move.l a0,songtable
- lsl.w #1,d0
- adda.w d0,a0
-
- movea.l patttable,a1
- move.w d2,d0
- subq.w #1,d0
- lab0 move.l a0,pt_address(a1)
- move.w pt_size(a1),d3
- mulu #nt_sizeof*4,d3
- adda.w d3,a0
- addq.w #pt_sizeof,a1
- dbf d0,lab0
-
- movea.l instable,a1
- move.w d1,d0
- subq.w #1,d0
- lab1 move.l a0,it_address(a1)
- move.l it_size(a1),d2
- adda.l d2,a0
- adda.w #it_sizeof,a1
- dbf d0,lab1
-
-
- move.l songtable,pp_songptr
- move.w songlen,pp_songcnt
- movea.l pp_songptr,a0
- move.w (a0),d0
- mulu #pt_sizeof,d0
- add.l patttable,d0
- movea.l d0,a0
- move.l a0,pp_pattentry
- move.b pt_size+1(a0),pp_notecnt
- move.l pt_address(a0),pp_address
- move.b #6,pp_wait
- move.b #1,pp_waitcnt
- clr.w pp_nullwave
- move.w #$000f,$dff096
-
- lea pp_variables,a0
- lea $dff0a0,a1
- move.w #$0001,d1
- move.w #2*wavesize,d2
- move.w #3,d0
- lab2 clr.w 8(a1)
- move.w d2,pv_waveoffset(a0)
- move.w d1,pv_dmacon(a0)
- move.l a1,pv_custbase(a0)
- move.l #pp_periods,pv_peraddress(a0)
- move.w #1019,pv_pers(a0)
- clr.w pv_pers+2(a0)
- clr.w pv_pers+4(a0)
- clr.l pv_por(a0)
- clr.w pv_porlevel(a0)
- clr.l pv_vib(a0)
- clr.l pv_vol(a0)
- move.w #$0040,pv_vollevel(a0)
- clr.l pv_phase(a0)
- clr.w pv_vibcnt(a0)
- clr.b pv_flags(a0)
- adda.w #pv_sizeof,a0
- adda.w #$0010,a1
- lsl.w #1,d1
- addi.w #wavesize,d2
- dbf d0,lab2
- rts
-
-
- pp_end clr.w $dff0a8
- clr.w $dff0b8
- clr.w $dff0c8
- clr.w $dff0d8
- move.w #$000f,$dff096
- rts
-
-
- pp_play subq.b #1,pp_waitcnt
- bne.s lab3
- bsr pp_nwnt
- move.b pp_wait,pp_waitcnt
-
- lab3 lea pp_variables,a1
- bsr.s pp_uvs
- lea pp_variables+pv_sizeof,a1
- bsr.s pp_uvs
- lea pp_variables+[2*pv_sizeof],a1
- bsr.s pp_uvs
- lea pp_variables+[3*pv_sizeof],a1
-
-
- pp_uvs movea.l pv_custbase(a1),a0
-
- lab4 move.w pv_pers(a1),d0
- bne.s lab5
- bsr pp_rot
- bra.s lab4
- lab5 add.w pv_por(a1),d0
- tst.w pv_por(a1)
- beq.s lab5c
- bpl.s lab5a
- cmp.w pv_porlevel(a1),d0
- bge.s lab5c
- bra.s lab5b
- lab5a cmp.w pv_porlevel(a1),d0
- ble.s lab5c
- lab5b move.w pv_porlevel(a1),d0
-
- lab5c add.w pv_vib(a1),d0
- cmpi.w #135,d0
- bge.s lab5d
- move.w #135,d0
- bra.s lab5e
- lab5d cmpi.w #1019,d0
- ble.s lab5e
- move.w #1019,d0
- lab5e move.w d0,6(a0)
- bsr pp_rot
-
-
- move.w pv_deltapor(a1),d0
- add.w d0,pv_por(a1)
- cmpi.w #-1019,pv_por(a1)
- bge.s lab6
- move.w #-1019,pv_por(a1)
- bra.s lab7
- lab6 cmpi.w #1019,pv_por(a1)
- ble.s lab7
- move.w #1019,pv_por(a1)
-
-
- lab7 tst.b pv_vibcnt(a1)
- beq.s lab8
- move.w pv_deltavib(a1),d0
- add.w d0,pv_vib(a1)
- subq.b #1,pv_vibcnt(a1)
- bne.s lab8
- neg.w pv_deltavib(a1)
- move.b pv_vibmax(a1),pv_vibcnt(a1)
-
-
- lab8 move.w pv_dmacon(a1),d0
- move.w pv_vol(a1),8(a0)
- move.w pv_deltavol(a1),d0
- add.w d0,pv_vol(a1)
- tst.w pv_vol(a1)
- bpl.s lab9
- clr.w pv_vol(a1)
- bra.s lab10
- lab9 cmpi.w #$40,pv_vol(a1)
- ble.s lab10
- move.w #$40,pv_vol(a1)
-
-
- lab10 btst #1,pv_flags(a1)
- beq.s lab12
- movea.l pv_insaddress(a1),a0
- move.w pv_waveoffset(a1),d0
- neg.w d0
- lea 0(a0,d0.w),a2
- movea.l a2,a3
- move.w pv_phase(a1),d0
- lsr.w #2,d0
- adda.w d0,a3
-
- move.w #wavesize-1,d0
- lab11 move.b (a2)+,d1
- ext.w d1
- move.b (a3)+,d2
- ext.w d2
- add.w d1,d2
- asr.w #1,d2
- move.b d2,(a0)+
- dbf d0,lab11
-
- move.w pv_deltaphase(a1),d0
- add.w d0,pv_phase(a1)
- cmpi.w #wavesize*4,pv_phase(a1)
- blt.s lab12
- subi.w #wavesize*4,pv_phase(a1)
-
- lab12 rts
-
-
- pp_rot move.w pv_pers(a1),d0
- move.w pv_pers+2(a1),pv_pers(a1)
- move.w pv_pers+4(a1),pv_pers+2(a1)
- move.w d0,pv_pers+4(a1)
- rts
-
-
- pp_nwnt movea.l pp_address,a0
- addi.l #4*nt_sizeof,pp_address
- subq.b #1,pp_notecnt
- bne.s lab15
-
- lab13 addq.l #2,pp_songptr
- subq.w #1,pp_songcnt
- bne.s lab14
- move.l songtable,pp_songptr
- move.w songlen,pp_songcnt
- lab14 movea.l pp_songptr,a1
- move.w (a1),d0
- mulu #pt_sizeof,d0
- add.l patttable,d0
- movea.l d0,a1
- move.b pt_size+1(a1),pp_notecnt
- move.l pt_address(a1),pp_address
-
-
- lab15 clr.w pp_tmpdmacon
- lea pp_variables,a1
- bsr pp_nnt
- addq.w #nt_sizeof,a0
- lea pp_variables+pv_sizeof,a1
- bsr pp_nnt
- addq.w #nt_sizeof,a0
- lea pp_variables+[2*pv_sizeof],a1
- bsr pp_nnt
- addq.w #nt_sizeof,a0
- lea pp_variables+[3*pv_sizeof],a1
- bsr pp_nnt
-
-
- move.w pp_tmpdmacon,$dff096
- move.w #300,d0
- lab16 dbf d0,lab16
-
- lea pp_variables,a1
- bsr pp_scr
- lea pp_variables+pv_sizeof,a1
- bsr.s pp_scr
- lea pp_variables+[2*pv_sizeof],a1
- bsr.s pp_scr
- lea pp_variables+[3*pv_sizeof],a1
- bsr.s pp_scr
-
- bset #7,pp_tmpdmacon
- move.w pp_tmpdmacon,$dff096
- move.w #300,d0
- lab17 dbf d0,lab17
-
-
- move.l pp_variables+pv_insaddress,$dff0a0
- move.w pp_variables+pv_inslen,$dff0a4
- move.l pp_variables+pv_sizeof+pv_insaddress,$dff0b0
- move.w pp_variables+pv_sizeof+pv_inslen,$dff0b4
- move.l pp_variables+[2*pv_sizeof]+pv_insaddress,$dff0c0
- move.w pp_variables+[2*pv_sizeof]+pv_inslen,$dff0c4
- move.l pp_variables+[3*pv_sizeof]+pv_insaddress,$dff0d0
- move.w pp_variables+[3*pv_sizeof]+pv_inslen,$dff0d4
-
- rts
-
-
- pp_scr move.w pp_tmpdmacon,d0
- and.w pv_dmacon(a1),d0
- beq.s lab18
-
- movea.l pv_custbase(a1),a0
- move.l pv_insaddress(a1),(a0)
- move.w pv_inslen(a1),4(a0)
- move.w pv_pers(a1),6(a0)
- btst #0,pv_flags(a1)
- bne.s lab18
- move.l #pp_nullwave,pv_insaddress(a1)
- move.w #1,pv_inslen(a1)
-
- lab18 rts
-
-
- pp_nnt move.b nt_period(a0),d1
- beq lab22
-
- andi.l #$000000ff,d1
- lsl.w #1,d1
- addi.l #pp_periods-2,d1
- movea.l d1,a2
-
- btst #6,nt_speed(a0)
- beq.s lab21
- move.w (a2),pv_porlevel(a1)
- bra lab22
-
-
- lab21 move.w pv_dmacon(a1),d0
- or.w d0,pp_tmpdmacon
-
- move.l a2,pv_peraddress(a1)
- move.w (a2),pv_pers(a1)
- move.w (a2),pv_pers+2(a1)
- move.w (a2),pv_pers+4(a1)
-
- clr.w pv_por(a1)
-
- move.b nt_instr(a0),d0
- ext.w d0
- mulu #it_sizeof,d0
- add.l instable,d0
- movea.l d0,a2
- tst.l it_address(a2)
- bne.s lab20
- move.l #pp_nullwave,pv_insaddress(a1)
- move.w #1,pv_inslen(a1)
- clr.b pv_flags(a1)
- bra.s lab22
-
- lab20 movea.l it_address(a2),a3
- btst #1,it_flags(a2)
- bne.s lab19a
- move.l it_size(a2),d0
- lsr.l #1,d0
- move.w d0,pv_inslen(a1)
- bra.s lab19
- lab19a move.w pv_waveoffset(a1),d0
- adda.w d0,a3
- move.w #wavesize/2,pv_inslen(a1)
- lab19 move.l a3,pv_insaddress(a1)
- move.b it_flags(a2),pv_flags(a1)
- move.w pv_vollevel(a1),pv_vol(a1)
-
-
- lab22 move.b nt_speed(a0),d0
- andi.b #$0f,d0
- beq.s lab23
- move.b d0,pp_wait
-
-
- lab23 movea.l pv_peraddress(a1),a2
- move.b nt_arpeggio(a0),d0
- beq.s lab25
- cmpi.b #$ff,d0
- bne.s lab24
- move.w (a2),pv_pers(a1)
- move.w (a2),pv_pers+2(a1)
- move.w (a2),pv_pers+4(a1)
- bra.s lab25
- lab24 andi.b #$0f,d0
- lsl.b #1,d0
- ext.w d0
- move.w 0(a2,d0.w),pv_pers+4(a1)
- move.b nt_arpeggio(a0),d0
- lsr.b #4,d0
- lsl.b #1,d0
- ext.w d0
- move.w 0(a2,d0.w),pv_pers+2(a1)
- move.w (a2),pv_pers(a1)
-
-
- lab25 move.b nt_vibrato(a0),d0
- beq.s lab27
- cmpi.b #$ff,d0
- bne.s lab26
- clr.l pv_vib(a1)
- clr.b pv_vibcnt(a1)
- bra.s lab27
- lab26 clr.w pv_vib(a1)
- andi.b #$0f,d0
- ext.w d0
- move.w d0,pv_deltavib(a1)
- move.b nt_vibrato(a0),d0
- lsr.b #4,d0
- move.b d0,pv_vibmax(a1)
- lsr.b #1,d0
- move.b d0,pv_vibcnt(a1)
-
-
- lab27 move.b nt_phase(a0),d0
- beq.s lab29
- cmpi.b #$ff,d0
- bne.s lab28
- clr.l pv_phase(a1)
- bra.s lab29
- lab28 andi.b #$0f,d0
- ext.w d0
- move.w d0,pv_deltaphase(a1)
- clr.w pv_phase(a1)
-
-
- lab29 move.b nt_volume(a0),d0
- bne.s lab29a
- btst #7,nt_speed(a0)
- beq.s lab33
- bra.s lab30a
- lab29a cmpi.b #$ff,d0
- bne.s lab30
- clr.w pv_deltavol(a1)
- bra.s lab33
- lab30 btst #7,nt_speed(a0)
- beq.s lab31
- lab30a move.b d0,pv_vol+1(a1)
- move.b d0,pv_vollevel+1(a1)
- clr.w pv_deltavol(a1)
- bra.s lab33
- lab31 bclr #7,d0
- beq.s lab32
- neg.b d0
- lab32 ext.w d0
- move.w d0,pv_deltavol(a1)
-
-
- lab33 move.b nt_porta(a0),d0
- beq.s lab36
- cmpi.b #$ff,d0
- bne.s lab34
- clr.l pv_por(a1)
- bra.s lab36
- lab34 clr.w pv_por(a1)
- btst #6,nt_speed(a0)
- beq.s lab34a
- move.w pv_porlevel(a1),d1
- cmp.w pv_pers(a1),d1
- bgt.s lab34c
- neg.b d0
- bra.s lab34c
- lab34a bclr #7,d0
- bne.s lab35
- neg.b d0
- move.w #135,pv_porlevel(a1)
- bra.s lab34c
- lab35 move.w #1019,pv_porlevel(a1)
- lab34c ext.w d0
- lab35a move.w d0,pv_deltapor(a1)
-
-
- lab36 rts
-
-
- * Replayer data
-
- pp_periods dc.w 1019,962,908,857,809,763,720,680,642,606,572,540
- dc.w 509,481,454,428,404,381,360,340,321,303,286,270
- dc.w 254,240,227,214,202,190,180,170,160,151,143,135
- dc.w 135,135,135,135,135,135,135,135,135
- dc.w 135,135,135,135,135,135
-
- mysong Incbin "ST-00:Songs/DemoSong4" ;Insert your song here!
-
- songlen ds.w 1
- songtable ds.l 1
- instable ds.l 1
- patttable ds.l 1
-
- pp_wait ds.b 1
- pp_waitcnt ds.b 1
- pp_notecnt ds.b 1
-
- even
- pp_address ds.l 1
- pp_songptr ds.l 1
- pp_songcnt ds.w 1
- pp_pattentry ds.l 1
- pp_tmpdmacon ds.w 1
- pp_variables ds.b 4*48
-
- pp_nullwave ds.w 1
-
-