home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
YPA: Your Privacy Assured
/
YPA.ISO
/
other_goodies
/
music
/
ep154b_1.dms
/
ep154b_1.adf
/
EagleplayerDeveloper
/
Examples
/
NoisePackerII.s
< prev
next >
Wrap
Text File
|
1995-01-17
|
18KB
|
796 lines
**************************************************************
** EaglePlayer/DelitrackerV1.3+ Noisepackerplayroutine **
** Eagleplayer Adaption by Buggs & Eagleeye of Defect **
**************************************************************
incdir Include:
include "misc/EaglePlayer.i"
PLAYERHEADER Tags
dc.b '$VER: NoisePacker V2.02 Eagleplayer V1.3 (July/21/93)',0,0
even
Tags: dc.l DTP_PlayerVersion,3
dc.l DTP_PlayerName,NP_Player
dc.l DTP_Creator,NP_Name
dc.l DTP_Check2,NP_Check
dc.l DTP_Interrupt,NP_Music
dc.l DTP_InitPlayer,NP_InitPlay
dc.l DTP_EndPlayer,NP_EndPlay
dc.l DTP_InitSound,NP_Init
dc.l DTP_EndSound,NP_RemSnd
dc.l DTP_NextPatt,NP_NextPattern
dc.l DTP_PrevPatt,NP_PrevPattern
dc.l DTP_Volume,SetVol
dc.l DTP_Balance,SetVol
dc.l EP_Voices,SetVoices
dc.l EP_Get_ModuleInfo,NP_GetInfos
dc.l EP_GetPositionNr,NP_GetPosNr
dc.l EP_StructInit,StrukInit
dc.l EP_Flags,EPB_Save!EPB_Restart!EPB_Songend!EPB_Volume!EPB_Balance!EPB_Voices!EPB_Analyzer!EPB_Moduleinfo!EPB_Nextpatt!EPB_Prevpatt
dc.l 0
*------------------------------------------------------------------------*
NP_Structadr: ds.b UPS_sizeof
NP_Data: dc.l 0
NP_RightVol dc.w 0
NP_LeftVol dc.w 0
NP_SndVol dc.w 0
NP_Voice1 dc.w 1
NP_Voice2 dc.w 1
NP_Voice3 dc.w 1
NP_Voice4 dc.w 1
NP_OldVoice1 dc.w 0
NP_OldVoice2 dc.w 0
NP_OldVoice3 dc.w 0
NP_OldVoice4 dc.w 0
NP_SongEndAdr: dc.l 0
*-----------------------------------------------------------------------*
NP_Name: dc.b "Twins of Phenomena,",10
dc.b "adapted by DEFECT",0
NP_Player: dc.b "NoisePacker 2.x",0
even
*------------------- Tag-Item Struktur fⁿr Module-Info -----------------*
NP_InfoBuffer: dc.l MI_Samples,0 ;4
dc.l MI_Length,0 ;12
dc.l MI_Pattern,0 ;20
dc.l MI_SongSize,0 ;28
dc.l MI_SamplesSize,0 ;36
dc.l MI_Calcsize,0 ;44
dc.l MI_Unpacked,0 ;52
dc.l MI_Unpackedsystem,MIUS_Noisetracker
dc.l 0
*----------------- Get Infos (Create InfoTag-Itemliste) ----------------*
NP_GetInfos: move.l NP_data(pc),a0
lea NP_InfoBuffer(pc),a4
moveq #16,d3
moveq #0,d0
moveq #0,d2
move.l a0,a1
move.w (a0)+,d0
move.l d0,d6
move.w (a0)+,d2
add.l d2,d6
add.w (a0)+,d6
add.w (a0)+,d6
move.l d6,28(a4) ;SongSize
move.l d6,44(a4) ;CalcSize
moveq #0,d6
add.l d0,a1 ;Patternliste
lsr.w #4,d0
move.l d0,d1
move.l d1,4(a4) ;SamplesAnz
subq.l #1,d1
addq.l #4,a0 ;Adr auf Sampleliste
.SucheSample move.w (a0),d0
add.l d0,d0
add.l d0,d6
add.l d3,a0
dbf d1,.SucheSample
lsr.w #1,d2
move.l d2,12(a4) ;Length setzen
move.l d6,36(a4) ;Samplessize
move.l d6,52(a4) ;Unpacked
add.l d6,44(a4) ;CalcSize
subq.l #1,d2
moveq #0,d0
.NextPattern: cmp.w (a1),d0
bge.s .AddAdr
move.w (a1),d0
.AddAdr: addq.l #2,a1
dbf d2,.NextPattern
lsr.w #3,d0
addq.l #1,d0
move.l d0,20(a4) ;Pattern
mulu #1024,d0
add.l #$43c,d0
add.l d0,52(a4)
move.l a4,a0
NP_Return: rts
*------------------------ Test auf Noisepacker II ---------------------------*
NP_Check: move.l dtg_ChkData(a5),a0
moveq #-1,d0
move.l a0,a1
move.w (a0),d5 ;Anzahl der Samples
move.w d5,d1 ;merken
and.w #$f,d5 ;jedes NP Modul beginnt mit
;(Anzahl der Samples*16) OR 12
cmp.w #$c,d5 ;ist die 12 vorhanden ?
bne .NP_Fail ;n÷
lsr.w #4,d1 ;$c rausrotieren
cmp.w #$1f,d1 ;Anzahl der Samples > 32 (0..31)
bhi .NP_Fail ;ja,Fehler
move.w 4(a0),d2 ;Offset Patterns
btst #0,d2 ;Ungerade ?
bne .np_fail ;->Fehler
add.w (a0),a1 ;auf Pointer addieren
move.w -4(a1),d5 ;H÷chste Patternnummer ist 2 mal eingetragen
btst #0,d5 ;Ungerade ?
bne .np_fail ;->Fehler
cmp.w 2(a0),d5 ;Vergleich
bne .NP_fail ;Unstimmigkeit,Ende der Vorstellung
move.l a0,a1 ;Pointer auf Modul saven
add.w (a1),a0 ;Liste der Patterns fⁿr jeweilige Songposition
move.w -4(a0),d1 ;LΣnge des Songs
asr.w #1,d1 ;durch 2 dividieren
subq.w #1,d1
;in A0 Zeiger auf Tabelle fⁿr die
;Zeiger auf die Patternnummer fⁿr die
;jeweilige Songposition
moveq #0,d5
move.w d1,d4 ;brauchen wir noch
.check2: move.w (a0)+,d3 ;Patternnummer
cmp.w d5,d3 ;mit derzeit h÷chster vergleichen
bls.s .check1 ;kleiner -> weiter
move.w d3,d5 ;h÷chste Patternnr. merken
.check1 dbf d1,.check2 ;alle Patterns
addq.l #8,d5 ;+8
cmp.w d5,d2 ;Gegenvergleich
bne .np_fail ;passt nicht -> Fehler
and.w #7,d5 ;ausmaskieren (Patternnummer mu▀ durch 8
;teilbar sein)
bne .np_fail ;nein->Fehler
;A0 mu▀ hier auf dem Anfang der Offsettabelle der
;Patterns stehen
moveq #0,d5 ;d5 killen
move.w (a1),d5 ;Pointer auf Patternliste
add.w 2(a1),a1 ;LΣnge dieser Patternliste
add.l d5,a1 ;zusammenaddieren = Pointer auf Patternoffsets
cmp.l a0,a1 ;stimmt das ?
bne .np_fail ;wieso auch ?
;an dieser Stelle kann als gesichert gelten,da▀
;es sich um ein Noisepackermodul handelt,es bleibt
;nur die Unterscheidung zum Noisepacker 3
move.w #$c0,d1 ;die Patternoffsets bei NP2.02
;sind Vielfache von 192
.Untersch: moveq #0,d5 ;d5 l÷schen
move.w (a1)+,d5 ;Offset holen
divu d1,d5 ;durch 192 dividieren
clr.w d5 ;Ergebnis l÷schen (unteres Wort)
tst.l d5 ;Rest (oberes Wort) = 0 ,d.h. Offset durch 192
;teilbar
bne.s .np_fail ;nein,ertappt
dbf d4,.Untersch ;alle testen
.NP_ok: moveq #0,d0 ;alles klar
.NP_Fail: tst.l d0
rts
*-----------------------------------------------------------------------*
NP_InitPlay: lea NP_OldVoice1(pc),a0 ;Voices 0 setzen=alle an
clr.l (a0)+ ; Old Voice l÷schen
clr.l (a0)+
moveq #0,d0
move.l dtg_GetListData(a5),a0 ; Function
jsr (a0)
lea NP_Data(pc),a1
move.l a0,(a1)
move.l DTG_SongEnd(a5),NP_SongEndAdr-NP_Data(a1)
move.l dtg_AudioAlloc(a5),a0 ; Function
jmp (a0) ; returncode is already set !
*-----------------------------------------------------------------------*
NP_EndPlay: move.l dtg_AudioFree(a5),a0 ; Function
jmp (a0)
*-----------------------------------------------------------------------*
NP_RemSnd: lea $dff000,a0
moveq #0,d0
move.w d0,$a8(a0)
move.w d0,$b8(a0)
move.w d0,$c8(a0)
move.w d0,$d8(a0)
move.w #$F,$96(a0) ; End Sound
rts
*------------------------- Struktur ⁿbergeben ---------------------------*
Strukinit: lea NP_StructAdr(pc),a0
rts
*----------------- Daten in die Userprogramm-Struktur ⁿbergeben ---------*
NP_Getvoice: movem.l d0-d1/a1,-(sp)
lea NP_Structadr(pc),a1 ;1.Kanal
cmp.l #$dff0a0,a4
beq.s .yes
lea NP_Structadr+ups_modulo(pc),a1 ;2.Kanal
cmp.l #$dff0b0,a4
beq.s .yes
lea NP_Structadr+ups_modulo*2(pc),a1 ;3.Kanal
cmp.l #$dff0c0,a4
beq.s .yes
lea NP_Structadr+ups_modulo*3(pc),a1 ;4.Kanal
.yes: move.w 24(a2),UPS_Voice1Per(a1) ;Sampleperiode
move.l (a3),UPS_Voice1Adr(a1) ;Sampleadresse
moveq #0,d1
cmp.w #1,12(a3) ;Repeat on ?
bne.s .ok
moveq #1,d1 ;nein,Repeat "off" setzen
.ok move.w d1,UPS_Voice1Repeat(a1)
move.w 4(a3),UPS_Voice1len(a1) ;LΣnge
movem.l (sp)+,d0-d1/a1
rts
*-----------------------------------------------------------------------*
* d0 Bit 0-3 = Set Voices Bit=1 Voice on *
SetVoices: lea NP_Voice1(pc),a0
lea NP_StructAdr(pc),a1
moveq #1,d1
move.w d1,(a0)+ Voice1=0 setzen
btst #0,d0
bne.s .NoVoice1
clr.w -2(a0)
clr.w $dff0a8
clr.w UPS_Voice1Vol(a1)
.NoVoice1: move.w d1,(a0)+ Voice2=0 setzen
btst #1,d0
bne.s .NoVoice2
clr.w -2(a0)
clr.w $dff0b8
clr.w UPS_Voice2Vol(a1)
.NoVoice2: move.w d1,(a0)+ Voice3=0 setzen
btst #2,d0
bne.s .NoVoice3
clr.w -2(a0)
clr.w $dff0c8
clr.w UPS_Voice3Vol(a1)
.NoVoice3: move.w d1,(a0)+ Voice4=0 setzen
btst #3,d0
bne.s .NoVoice4
clr.w -2(a0)
clr.w $dff0d8
clr.w UPS_Voice4Vol(a1)
.NoVoice4: move.w d0,UPS_DMACON(a1)
moveq #0,d0
rts
*-----------------------------------------------------------------------*
SetVol: move.w DTG_SndLBal(a5),d0
mulu DTG_SndVol(a5),d0
lsr.w #6,d0 ; durch 64
move.w d0,NP_LeftVol ; Left Volume
move.w DTG_SndRBal(a5),d0
mulu DTG_SndVol(a5),d0
lsr.w #6,d0 ; durch 64
move.w d0,NP_RightVol ; Right Volume
lea NP_OldVoice1(pc),a0
lea $dff0a0,a5
moveq #3,d1
.SetNew move.w (a0)+,d0
bsr.s NP_SetVoices
addq.l #8,a5
addq.l #8,a5
dbf d1,.SetNew
rts
*-----------------------------------------------------------------------*
NP_SetVolume: movem.l d0/a5,-(a7)
move.w 4(a2),d0
bra.s NP_SetVolume3
NP_SetVolume2: movem.l d0/a5,-(a7)
move.w 4(a0),d0
NP_SetVolume3: move.l a4,a5
bsr.s NP_SetVoices
movem.l (a7)+,d0/a5
rts
*-----------------------------------------------------------------------*
NP_SetVoices: and.w #$7f,d0
cmp.l #$dff0a0,a5 ;Left Volume
bne.s .NoVoice1
move.w d0,NP_OldVoice1
tst.w NP_Voice1
bne.s .Voice1On
moveq #0,d0
.Voice1On: move.w d0,NP_StructAdr+UPS_Voice1Vol
mulu.w NP_LeftVol(pc),d0
lsr.w #6,d0
move.w d0,8(a5)
rts
.NoVoice1: cmp.l #$dff0b0,a5 ;Right Volume
bne.s .NoVoice2
move.w d0,NP_OldVoice2
tst.w NP_Voice2
bne.s .Voice2On
moveq #0,d0
.Voice2On: move.w d0,NP_StructAdr+UPS_Voice2Vol
mulu.w NP_RightVol(pc),d0
lsr.w #6,d0
move.w d0,8(a5)
rts
.NoVoice2: cmp.l #$dff0c0,a5 ;Right Volume
bne.s .NoVoice3
move.w d0,NP_OldVoice3
tst.w NP_Voice3
bne.w .Voice3On
moveq #0,d0
.Voice3On: move.w d0,NP_StructAdr+UPS_Voice3Vol
mulu.w NP_RightVol(pc),d0
lsr.w #6,d0
move.w d0,8(a5)
rts
.NoVoice3: move.w d0,NP_OldVoice4
tst.w NP_Voice4
bne.w .Voice4On
moveq #0,d0
.Voice4On: move.w d0,NP_StructAdr+UPS_Voice4Vol
mulu.w NP_LeftVol(pc),d0
lsr.w #6,d0
move.w d0,8(a5)
.Return: rts
*-----------------------------------------------------------------------*
NP_NextPattern: lea np_block(pc),a6
move.l np_position(pc),a0
addq #2,6(a6)
move 6(a6),d0
cmp -4(a0),d0
bne.s .next
move -2(a0),6(a6) ;End
move.l NP_SongendAdr(pc),a0
jsr (a0)
.next clr.w 8(a6) ;PattPos l÷schen
move.w 6(a6),d0
asr.w #1,d0
rts
*-----------------------------------------------------------------------*
NP_PrevPattern: lea np_block(pc),a6
move.l np_position(pc),a0
move.w 6(a6),d0
subq.w #2,d0
bgt.s .no
move.w -4(a0),d0
subq.w #2,d0
.no: move.w d0,6(a6)
move.w #0,8(A6)
asr.w #1,d0
rts
*-----------------------------------------------------------------------*
NP_GetPosNr: move.w np_block+6(pc),d0
asr.w #1,d0
rts
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* NoisePacker V2.02 PlayRoutine ⌐1990 Twins of Phenomena. *
* Used registers are d0-d7/a0-a6. Not using lev6irq. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
np_init: move.l NP_data(pc),a0
move.l a0,a4
lea $dff000,a5
lea np_position(pc),a6
moveq #2,d0
moveq #0,d1
move.l a4,a3
np_init1: add (a4)+,a3
move.l a3,(a6)+
dbf d0,np_init1
move (a4)+,d0
add.l d0,a3
move.l #$01060100,(a6)+
move #$8200,(a6)+
move.l d1,(a6)+
move.l #np_portup,(a6)+
move.l #np_portdown,(a6)+
move.l #np_port,(a6)+
move.l #np_vib,(a6)+
move.l #np_port2,(a6)+
move.l #np_vib2,(a6)+
move.l #np_volslide,(a6)+
move.l #np_arp,(a6)+
move.l #np_songjmp,(a6)+
move.l #np_setvol,(a6)+
move.l #np_pattbreak,(a6)+
move.l #np_filter,(a6)+
move.l #np_setspeed,(a6)+
moveq #0,d0
move.l a4,a6
add -8(a4),a6
sub #12,a6
np_init2: move.l a3,(a4)
move.l a3,a2
move 14(a4),d0
add d0,d0
add.l d0,a2
move.l a2,8(a4)
move 4(a4),d0
add d0,d0
add.l d0,a3
add #16,a4
cmp.l a4,a6
bne.s np_init2
rts
*--------------------------------------------------------------------------*
NP_Music: movem.l d1-a6,-(a7)
lea NP_StructAdr(pc),a0
move.w #UPSB_Adr!UPSB_LEN!UPSB_Per!UPSB_Vol!UPSB_DMACON,UPS_Flags(a0)
clr.w UPS_Voice1per(a0)
clr.w UPS_Voice2per(a0)
clr.w UPS_Voice3per(a0)
clr.w UPS_Voice4per(a0)
move.w #1,UPS_Enabled(A0)
bsr.s NP_Music2
lea NP_StructAdr(pc),a0
clr.w UPS_Enabled(A0)
movem.l (a7)+,d1-a6
moveq #0,d0
rts
NP_Music2: moveq #0,d6
lea $dff000,a5
lea $d0(a5),a4
lea np_block(pc),a6
subq.b #1,(a6) ;SpeedCounter
bhi.w np_nonew
lea np_position(pc),a3
move.l (a3)+,a0 ;Position Adresse
add 6(a6),a0
move (a0),d0 ;Patternnummer
move.l (a3)+,a0 ;Pattern Adresse
add d0,a0
move.l (a3)+,a1 ;Voice Adresse
add 8(a6),a1
lea np_voidat1(pc),a2
moveq #8,d0
moveq #0,d5
np_loop1: moveq #0,d1
move (a0)+,d1
lea (a1,d1.l),a3
move.b (a3)+,d1
move.b (a3)+,d3
move.b (a3)+,d4
move.b d3,d7
lsr.b #4,d7
move.b d1,d2
and #1,d2
beq.s np_loop2
moveq #$10,d2
np_loop2: move.l NP_data(pc),a3 ;hier aufpassen
subq.l #8,a3
or.b d7,d2
bne.s np_loop3
move.b 1(a2),d2
lsl #4,d2
add d2,a3
bra.s np_loop4
np_loop3: move.b d2,1(a2)
lsl #4,d2
add d2,a3
move 6(a3),4(a2)
np_loop4: and #$f,d3
move.b d3,2(a2)
move.b d4,3(a2)
and #$fe,d1
beq.s np_loop5
move np_periods-2(pc,d1.w),d7
subq #3,d3
beq.w np_setport
subq #2,d3
beq.w np_setport
or d0,d5
move.b d1,(a2)
move.b d6,49(a2)
move d7,24(a2) ;
bsr np_getvoice
move.l (a3)+,(a4) ;Adresse (a3)
move (a3)+,4(a4) ;LΣnge/2=Anzahl der Worte 4(a3)
addq.l #2,a3 ;LautstΣrke 6(a3)
move.l (a3)+,72(a2) ;Repeatadresse 8(a3)
move (a3)+,76(a2) ;RepeatlΣnge/2 12(a3)
subq #6,d3
bmi.s np_loop6
add d3,d3
add d3,d3
move.l 42(a6,d3.w),a3
jmp (a3)
np_loop5: sub #11,d3
bmi.s np_loop6
add d3,d3
add d3,d3
move.l 42(a6,d3.w),a3
jmp (a3)
np_periods: dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a
dc.w $01fc,$01e0,$01c5,$01ac,$0194,$017d,$0168,$0153,$0140
dc.w $012e,$011d,$010d,$00fe,$00f0,$00e2,$00d6,$00ca,$00be
dc.w $00b4,$00aa,$00a0,$0097,$008f,$0087,$007f,$0078,$0071
np_loop6: move 24(a2),6(a4) ;Sampleperiode
np_loop7: bsr.w NP_SetVolume
; move 4(a2),8(a4) ;Vol 1
addq #6,a2
sub #$10,a4
lsr #1,d0
bne.w np_loop1
move d5,$96(a5)
move.b d5,5(a6)
move.b 1(a6),(a6)
bsr NP_Waitdma
; move #270,d0 ;hΣtte auf Turbokarten keinen Sinn !
;np_wait1: dbf d0,np_wait1
move 4(a6),$96(a5)
bsr NP_Waitdma
; moveq #80,d0 ;Turbokarten und sogar 68010-er
;np_wait2: dbf d0,np_wait2 ;Prozessoren versagen hier;
;typischer A500 Code
;aber ich hab ja selber einen :-)
move.l np_position(pc),a0
bset #0,2(a6)
beq.w np_break
addq #3,8(a6)
cmp #192,8(a6)
bne.s np_next
np_break: move d6,8(a6)
addq #2,6(a6)
move 6(a6),d0
cmp -4(a0),d0
bne.s np_next
move -2(a0),6(a6)
move.l NP_SongEndAdr(pc),a0
jsr (a0)
np_next: lea np_voidat2(pc),a0
move.l (a0)+,$d0(a5)
move (a0)+,$d4(a5)
move.l (a0)+,$c0(a5)
move (a0)+,$c4(a5)
move.l (a0)+,$b0(a5)
move (a0)+,$b4(a5)
move.l (a0)+,$a0(a5)
move (a0)+,$a4(a5)
rts
np_setvol: move.b d4,5(a2)
bra.w np_loop6
np_pattbreak: move d6,2(a6)
bra.w np_loop6
np_songjmp: move d6,2(a6)
move.b d4,7(a6)
bra.w np_loop6
np_setspeed: move.b d4,1(a6)
bra.w np_loop6
np_filter:
; and.b #$fd,$bfe001
; or.b d4,$bfe001
bra.w np_loop6
np_setport: move.b d6,50(a2)
move d7,26(a2)
cmp 24(a2),d7
beq.s np_clrport
bge.w np_loop7
move.b #1,50(a2)
bra.w np_loop7
np_clrport: move d6,26(a2)
bra.w np_loop7
np_nonew: lea np_voidat1(pc),a0
moveq #3,d0
np_lop1: moveq #0,d1
move.b 2(a0),d1
beq.s np_lop2
subq #8,d1
bhi.s np_lop2
addq #7,d1
add d1,d1
add d1,d1
move.l 10(a6,d1.w),a3
jmp (a3)
np_lop2: addq #6,a0
sub #$10,a4
dbf d0,np_lop1
rts
np_portup: moveq #0,d2
move.b 3(a0),d2
sub d2,24(a0)
cmp #$71,24(a0)
bpl.s np_portup2
move #$71,24(a0)
np_portup2: move 24(a0),6(a4)
bra.s np_lop2
np_portdown: moveq #0,d2
move.b 3(a0),d2
add d2,24(a0)
cmp #$358,24(a0)
bmi.s np_portdown2
move #$358,24(a0)
np_portdown2: move 24(a0),6(a4)
bra.s np_lop2
np_arp: moveq #0,d2
move.b (a6),d2
sub.b 1(a6),d2
neg.b d2
move.b np_arplist(pc,d2.w),d2
beq.s np_arp0
subq.b #2,d2
beq.s np_arp2
np_arp1: move.b 3(a0),d2
lsr #3,d2
and #$e,d2
bra.s np_arp3
np_arp2: move.b 3(a0),d2
and #$f,d2
add d2,d2
np_arp3: add.b (a0),d2
cmp #$48,d2
bls.s np_arp4
moveq #$48,d2
np_arp4: lea np_periods-2(pc),a3
move (a3,d2.w),6(a4)
bra.w np_lop2
np_arp0: move 24(a0),6(a4)
bra.w np_lop2
np_arplist:dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1
np_sin: dc.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
dc.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18
np_vib: move.b 3(a0),d3
beq.s np_vib2
move.b d3,48(a0)
np_vib2: move.b 49(a0),d3
lsr.b #2,d3
and #$1f,d3
moveq #0,d2
move.b np_sin(pc,d3.w),d2
move.b 48(a0),d3
and #$f,d3
mulu d3,d2
lsr #7,d2
move 24(a0),d3
tst.b 49(a0)
bmi.s np_vibsub
add d2,d3
bra.s np_vib3
np_vibsub: sub d2,d3
np_vib3: move d3,6(a4)
move.b 48(a0),d3
lsr.b #2,d3
and #$3c,d3
add.b d3,49(a0)
cmp.b #20,d1
bne.w np_lop2
np_volslide: move.b 3(a0),d2
add.b d2,5(a0)
bmi.s np_vol3
cmp.b #$40,5(a0)
bmi.s np_vol2
move #$40,4(a0)
np_vol2: bsr.w NP_SetVolume2
; move 4(a0),8(a4) ;Vol2
bra.w np_lop2
np_vol3: move d6,4(a0)
bsr.w NP_SetVolume2
; move 4(a0),8(a4) ;Vol3
bra.w np_lop2
np_port: move.b 3(a0),d2
beq.s np_port2
move.b d2,29(a0)
np_port2: move 26(a0),d2
beq.s np_rts
move 28(a0),d3
tst.b 50(a0)
bne.s np_sub
add d3,24(a0)
cmp 24(a0),d2
bgt.s np_portok
move d2,24(a0)
move d6,26(a0)
np_portok: move 24(a0),6(a4)
np_rts: cmp.b #16,d1
beq.s np_volslide
bra.w np_lop2
np_sub: sub d3,24(a0)
cmp 24(a0),d2
blt.s np_portok
move d2,24(a0)
move d6,26(a0)
move 24(a0),6(a4)
cmp.b #16,d1
beq.w np_volslide
bra.w np_lop2
NP_waitdma
movem.l d0-d1,-(sp)
moveq #8,d0
.dma1 move.b $dff006,d1
.dma2 cmp.b $dff006,d1
beq .dma2
dbeq d0,.dma1
movem.l (sp)+,d0-d1
rts
np_position: dc.l 0
np_pattern: dc.l 0
np_voice: dc.l 0
np_block: blk.w 31,0
np_voidat1: blk.l 18,0
np_voidat2: blk.l 6,0