          A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990

                                12.Teil...

So, direkt im Anschluss kommt die zweite versprochene Abspielroutine,
diesaml die, die 2.3 Sounds abspielt.
Tips am ende...

;+++++++++++++++++++++++++++++++
;+++ Soundtracker 2.3 Player +++
;+++++++++++++++++++++++++++++++

mt_init:lea     mt_data(pc),a0
        add.l   #$01d8,a0
        move.l  #$0080,d0
        moveq   #$00,d1
mt_init1:
        move.l  d1,d2
        subq.w  #1,d0
mt_init2:
        move.b  (a0)+,d1
        cmp.b   d2,d1
        bgt.s   mt_init1
        dbf     d0,mt_init2
        addq.b  #1,d2

mt_init3:
        lea     mt_data(pc),a0
        lea     mt_sample1(pc),a1
        asl.l   #$08,d2
        asl.l   #$02,d2
        add.l   #$0258,d2
        add.l   a0,d2
        moveq   #$0e,d0
mt_init4:
        move.l  d2,(a1)+
        moveq   #$00,d1
        move.w  42(a0),d1
        asl.l   #1,d1
        add.l   d1,d2
        add.l   #$1e,a0
        dbf     d0,mt_init4

        lea     mt_sample1(pc),a0
        moveq   #$00,d0
mt_clear:
        move.l  (a0,d0),a1
        clr.l   (a1)
        addq.l  #4,d0
        cmp.l   #$3c,d0
        bne.s   mt_clear

        clr.w   $dff0a8
        clr.w   $dff0b8
        clr.w   $dff0c8
        clr.w   $dff0d8
        clr.l   mt_partnrplay
        clr.l   mt_partnote
        clr.l   mt_partpoint

        move.b  mt_data+$1d6,mt_maxpart+1
        rts

mt_end: clr.w   $dff0a8
        clr.w   $dff0b8
        clr.w   $dff0c8
        clr.w   $dff0d8
        move.w  #$000f,$dff096
        rts

mt_music:
        addq.l  #1,mt_counter
mt_cool:cmp.l   #6,mt_counter
        bne.s   mt_notsix
        clr.l   mt_counter
        bra     mt_rout2

mt_notsix:
        lea     mt_aud1temp(pc),a6
        tst.b   3(a6)
        beq.s   mt_arp1
        lea     $dff0a0,a5
        bsr.s   mt_arprout
mt_arp1:lea     mt_aud2temp(pc),a6
        tst.b   3(a6)
        beq.s   mt_arp2
        lea     $dff0b0,a5
        bsr.s   mt_arprout
mt_arp2:lea     mt_aud3temp(pc),a6
        tst.b   3(a6)
        beq.s   mt_arp3
        lea     $dff0c0,a5
        bsr.s   mt_arprout
mt_arp3:lea     mt_aud4temp(pc),a6
        tst.b   3(a6)
        beq.s   mt_arp4
        lea     $dff0d0,a5
        bra.s   mt_arprout
mt_arp4:rts

mt_arprout:
        move.b  2(a6),d0
        and.b   #$0f,d0
        tst.b   d0
        beq.s   mt_arpegrt
        cmp.b   #1,d0
        beq.s   mt_portup
        cmp.b   #2,d0
        beq.s   mt_portdwn
        rts

mt_portup:
        moveq   #$00,d0
        move.b  3(a6),d0
        sub.w   d0,22(a6)
        cmp.w   #$71,22(a6)
        bpl.s   mt_ok1
        move.w  #$71,22(a6)
mt_ok1: move.w  22(a6),6(a5)
        rts

mt_portdwn:
        moveq   #$00,d0
        move.b  3(a6),d0
        add.w   d0,22(a6)
        cmp.w   #$358,22(a6)
        bmi.s   mt_ok2
        move.w  #$358,22(a6)
mt_ok2: move.w  22(a6),6(a5)
        rts

mt_arpegrt:
        cmp.l   #1,mt_counter
        beq.s   mt_loop2
        cmp.l   #2,mt_counter
        beq.s   mt_loop3
        cmp.l   #3,mt_counter
        beq.s   mt_loop4
        cmp.l   #4,mt_counter
        beq.s   mt_loop2
        cmp.l   #5,mt_counter
        beq.s   mt_loop3
        rts

mt_loop2:
        moveq   #$00,d0
        move.b  3(a6),d0
        lsr.b   #4,d0
        bra.s   mt_cont
mt_loop3:
        moveq   #$00,d0
        move.b  3(a6),d0
        and.b   #$0f,d0
        bra.s   mt_cont
mt_loop4:
        move.w  16(a6),d2
        bra.s   mt_endpart
mt_cont:
        asl.w   #1,d0
        moveq   #$00,d1
        move.w  16(a6),d1
        lea     mt_arpeggio(pc),a0
mt_loop5:
        move.w  (a0,d0),d2
        cmp.w   (a0),d1
        beq.s   mt_endpart
        addq.l  #2,a0
        bra.s   mt_loop5
mt_endpart:
        move.w  d2,6(a5)
        rts

mt_rout2:
        lea     mt_data(pc),a0
        move.l  a0,a3
        add.l   #$0c,a3
        move.l  a0,a2
        add.l   #$1d8,a2
        add.l   #$258,a0
        move.l  mt_partnrplay,d0
        moveq   #$00,d1
        move.b  (a2,d0),d1
        asl.l   #$08,d1
        asl.l   #$02,d1
        add.l   mt_partnote,d1
        move.l  d1,mt_partpoint
        clr.w   mt_dmacon

        lea     $dff0a0,a5
        lea     mt_aud1temp(pc),a6
        bsr     mt_playit
        lea     $dff0b0,a5
        lea     mt_aud2temp(pc),a6
        bsr     mt_playit
        lea     $dff0c0,a5
        lea     mt_aud3temp(pc),a6
        bsr     mt_playit
        lea     $dff0d0,a5
        lea     mt_aud4temp(pc),a6
        bsr     mt_playit
        move.w  #$01f4,d0
mt_rls: dbf     d0,mt_rls

        move.w  #$8000,d0
        or.w    mt_dmacon,d0
        move.w  d0,$dff096

        lea     mt_aud4temp(pc),a6
        cmp.w   #1,14(a6)
        bne.s   mt_voice3
        move.l  10(a6),$dff0d0
        move.w  #1,$dff0d4
mt_voice3:
        lea     mt_aud3temp(pc),a6
        cmp.w   #1,14(a6)
        bne.s   mt_voice2
        move.l  10(a6),$dff0c0
        move.w  #1,$dff0c4
mt_voice2:
        lea     mt_aud2temp(pc),a6
        cmp.w   #1,14(a6)
        bne.s   mt_voice1
        move.l  10(a6),$dff0b0
        move.w  #1,$dff0b4
mt_voice1:
        lea     mt_aud1temp(pc),a6
        cmp.w   #1,14(a6)
        bne.s   mt_voice0
        move.l  10(a6),$dff0a0
        move.w  #1,$dff0a4
mt_voice0:
        move.l  mt_partnote,d0
        add.l   #$10,d0
        move.l  d0,mt_partnote
        cmp.l   #$400,d0
        bne.s   mt_stop
mt_higher:
        clr.l   mt_partnote
        addq.l  #1,mt_partnrplay
        moveq   #$00,d0
        move.w  mt_maxpart,d0
        move.l  mt_partnrplay,d1
        cmp.l   d0,d1
        bne.s   mt_stop
        clr.l   mt_partnrplay

mt_stop:tst.w   mt_status
        beq.s   mt_stop2
        clr.w   mt_status
        bra.s   mt_higher
mt_stop2:
        rts

mt_playit:
        move.l  (a0,d1),(a6)
        addq.l  #4,d1
        moveq   #$00,d2
        move.b  2(a6),d2
        and.b   #$f0,d2
        lsr.b   #4,d2
        tst.b   d2
        beq.s   mt_nosamplechange

        moveq   #$00,d3
        lea     mt_samples(pc),a1
        move.l  d2,d4
        asl.l   #2,d2
        mulu    #$1e,d4
        move.l  (a1,d2),4(a6)
        move.w  (a3,d4),8(a6)
        move.w  2(a3,d4),18(a6)
        move.w  4(a3,d4),d3
        tst.w   d3
        beq.s   mt_displace
        move.l  4(a6),d2
        add.l   d3,d2
        move.l  d2,4(a6)
        move.l  d2,10(a6)
        move.w  6(a3,d4),8(a6)
        move.w  6(a3,d4),14(a6)
        move.w  18(a6),8(a5)
        bra.s   mt_nosamplechange

mt_displace:
        move.l  4(a6),d2
        add.l   d3,d2
        move.l  d2,10(a6)
        move.w  6(a3,d4),14(a6)
        move.w  18(a6),8(a5)
mt_nosamplechange:
        tst.w   (a6)
        beq.s   mt_retrout
        move.w  (a6),16(a6)
        move.w  20(a6),$dff096
        move.l  4(a6),(a5)
        move.w  8(a6),4(a5)
        move.w  (a6),6(a5)
        move.w  20(a6),d0
        or.w    d0,mt_dmacon

mt_retrout:
        tst.w   (a6)
        beq.s   mt_nonewper
        move.w  (a6),22(a6)

mt_nonewper:
        move.b  2(a6),d0
        and.b   #$0f,d0
        cmp.b   #11,d0
        beq.s   mt_posjmp
        cmp.b   #12,d0
        beq.s   mt_setvol
        cmp.b   #13,d0
        beq.s   mt_break
        cmp.b   #14,d0
        beq.s   mt_setfil
        cmp.b   #15,d0
        beq.s   mt_setspeed
        rts

mt_posjmp:
        not.w   mt_status
        moveq   #$00,d0
        move.b  3(a6),d0
        subq.b  #$01,d0
        move.l  d0,mt_partnrplay
        rts

mt_setvol:
        move.b  3(a6),8(a5)
        rts

mt_break:
        not.w   mt_status
        rts

mt_setfil:
        moveq   #$00,d0
        move.b  3(a6),d0
        and.b   #$01,d0
        rol.b   #$01,d0
        and.b   #$fd,$bfe001
        or.b    d0,$bfe001
        rts

mt_setspeed:
        move.b  3(a6),d0
        and.b   #$0f,d0
        beq.s   mt_back
        clr.l   mt_counter
        move.b  d0,mt_cool+5
mt_back:rts

mt_aud1temp:
        blk.w   10,0
        dc.w    $0001
        blk.w   2,0
mt_aud2temp:
        blk.w   10,0
        dc.w    $0002
        blk.w   2,0
mt_aud3temp:
        blk.w   10,0
        dc.w    $0004
        blk.w   2,0
mt_aud4temp:
        blk.w   10,0
        dc.w    $0008
        blk.w   2,0
mt_partnote:    dc.l    0
mt_partnrplay:  dc.l    0
mt_counter:     dc.l    0
mt_partpoint:   dc.l    0
mt_samples:dc.l 0
mt_sample1:blk.l 15,0
mt_maxpart:dc.w $0000
mt_dmacon:dc.w  $0000
mt_status:dc.w  $0000

mt_arpeggio:
dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c
dc.w $023a,$021a,$01fc,$01e0,$01c5,$01ac,$0194,$017d
dc.w $0168,$0153,$0140,$012e,$011d,$010d,$00fe,$00f0
dc.w $00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097
dc.w $008f,$0087,$007f,$0078,$0071,$0000,$0000,$0000

>extern "name des Moduls",mt_data

mt_data:blk.b   laenge des moduls,0


Einbauen muesst ihr die so wie die erste...das duerfte kein Problem sein,
oder ?

Tip...Baut die Soundroutine nur ganz am Anfang eines Intros ein...dann
ueberpueft ihr ob sie laeuft...Dann setzt ihr im oberen teil des Sources,
vor die 3 MT_... aufrufe Semikolons, dann wird es vom Seka als
Kommentarezeile gesehen und nicht assembliert, die Komplette
Abspielroutine, ladet ihr immer nur mal kurz ein, wenn ihr einen Effekt
lauffaehig habt..das erspart euch viel zeit...

Ich will kein Kapitel mehr dranhaengen, deshalb ist schon schluss fuer
jetzt, werde aber sofort den naechsten Teil schreiben. Versprochen !!

                Jeff Kandle
