home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
M.u.C.S. Disc 2000
/
MUCS2000.iso
/
sound
/
dspmod34
/
easy_use.s
< prev
Wrap
Text File
|
1999-09-01
|
6KB
|
282 lines
dspmod34_init: equ 28
dspmod34_off: equ 32
dspmod34_playeron: equ 36
dspmod34_playeroff: equ 40
dspmod34_playmusic: equ 44
dspmod34_playtime: equ 48
dspmod34_modtype: equ 52
dspmod34_fx: equ 56
dspmod34_not_used: equ 60
dspmod34_flags: equ 61
dspmod34_surrounddelay: equ 62
dspmod34_dsptracks: equ 64
dspmod34_playinfos: equ 66
dspmod34_samplesets: equ 70
dspmod34_interpolation: equ 0
dspmod34_surround: equ 0
; dspmod34 - September 1, 1999
; by bITmASTER of TCE
;
; Additional patches and fixes by Noring/NoCrew
; and Evil/DHS, thanks to Earx/FUN for tips.
;
; news for v3.2
; nocrew dsp bootstrap code fix so other dsp app's
; work after dspmod.
;
; news for v3.3:
; There was an error in dspmod32 with FastRam machines.
; The DMA-Playbuffer was allocated to FastRam and
; caused random ST-RAM overwrites (one 8k block).
;
; news for v3.4:
; save and restore of most sound registers
; no more loss of the ym-chip after running
; dspmod.
;
; Use this routine from the VBL or a Timer. It can
; be anything between 50-100 Hz (maybe more as well).
;
; This file assembles right off with Devpac and
; Assemble.
section text
begin:
move.l 4(sp),a5 ;address to basepage
move.l $0c(a5),d0 ;length of text segment
add.l $14(a5),d0 ;length of data segment
add.l $1c(a5),d0 ;length of bss segment
add.l #$1000,d0 ;length of stackpointer
add.l #$100,d0 ;length of basepage
move.l a5,d1 ;address to basepage
add.l d0,d1 ;end of program
and.l #-2,d1 ;make address even
move.l d1,sp ;new stackspace
move.l d0,-(sp) ;mshrink()
move.l a5,-(sp) ;
move.w d0,-(sp) ;
move.w #$4a,-(sp) ;
trap #1 ;
lea 12(sp),sp ;
move.w #0,-(sp) ;mxalloc() - reserve stram only
move.l #8000,-(sp) ;for dma playbuffer
move.w #$44,-(sp) ;
trap #1 ;
addq.l #8,sp ;
tst.l d0 ;check if there is stram enough
beq.w exit_nostram ;nope
move.l d0,dspmod34_dma_pointer ;store address of stram buffer
bsr.w dspmod34_supervisor_in ;enter supervisor for inits
bsr.w dspmod34_saveaudio ;save audio regsiters
bsr.w dspmod34_start ;init dspmod
bsr.w dspmod34_play_module ;start player
move.l #dspmod34_vbl,$04d2.w ;place routine on vbl
bsr.w dspmod34_supervisor_out ;exit supervisor - inits done
move.w #7,-(sp) ;wait for keypress
trap #1 ;
addq.l #2,sp ;
bsr.w dspmod34_supervisor_in ;enter supervisor for restore
clr.l $04d2.w ;remove vbl routine
bsr.w dspmod34_stop ;stop player and restore dsp
bsr.w dspmod34_restoreaudio ;restore audio registers
bsr.w dspmod34_supervisor_out ;exit supervisor - restore done
exit_nostram:
clr.w -(sp) ;terminate program
trap #1 ;
;
; subroutines
;
dspmod34_supervisor_in:
clr.l -(sp) ;enter supervisormode
move.w #32,-(sp) ;
trap #1 ;
addq.l #6,sp ;
move.l d0,dspmod34_save_stack ;
rts
dspmod34_supervisor_out:
move.l dspmod34_save_stack,-(sp) ;exit supervisor
move.w #32,-(sp) ;
trap #1 ;
addq.l #6,sp ;
rts
dspmod34_play_module:
lea.l dspmod34_mod,a0 ;address to module
lea.l dspmod34_voltab4,a1 ;4channel volumetable
bsr.w dspmod34_player+dspmod34_modtype ;check mod type
cmp.w #4,d0 ;if 4, start module
beq.s .four ;
lea.l dspmod34_voltab8,a1 ;otherwise, use 8channel table
.four: lea.l dspmod34_mod,a0 ;address to module
bsr.w dspmod34_player+dspmod34_playeron ;start playing
ifne dspmod34_surround
bchg #0,dspmod34_player+dspmod34_flags ;toggle surround on/off
endc
ifne dspmod34_interpolation
bchg #1,dspmod34_player+dspmod34_flags ;toggle interpolation on/off
endc
rts
dspmod34_vbl:
bsr.w dspmod34_player+44 ;call player
rts
dspmod34_start:
bsr.w dspmod34_player+dspmod34_init ;install player
move.w #$200b,$ffff8932.w ;DSP-Out-> DAC & DMA-In
clr.b $ffff8900.w ;no DMA-Interrupts
clr.b $ffff8936.w ;record 1 track
move.b #$40,$ffff8921.w ;16 Bit
move.b #$80,$ffff8901.w ;select record-frame-register
move.l dspmod34_dma_pointer,d0 ;
move.l d0,d1 ;
move.b d1,$ffff8907.w ;Basis Low
lsr.l #8,d1 ;
move.b d1,$ffff8905.w ;Basis Mid
lsr.l #8,d1 ;
move.b d1,$ffff8903.w ;Basis High
add.l #8000,d0 ;
move.l d0,d1 ;
move.b d1,$ffff8913.w ;End Low
lsr.l #8,d1 ;
move.b d1,$ffff8911.w ;End Mid
lsr.l #8,d1 ;
move.b d1,$ffff890f.w ;End High
move.b #$b0,$ffff8901.w ;repeated record
rts
dspmod34_stop:
clr.b $ffff8901.w ;DMA-Stop
bsr.w dspmod34_player+dspmod34_playeroff ;stop module
bsr.w dspmod34_player+dspmod34_off ;dsp system off
bsr.w dspmod34_fix ;load new dsp bootstrap (bugfix)
rts
dspmod34_saveaudio:
lea.l dspmod34_saveaudiobuf,a0
move.w $ffff8930.w,(a0)+
move.w $ffff8932.w,(a0)+
move.b $ffff8934.w,(a0)+
move.b $ffff8935.w,(a0)+
move.b $ffff8936.w,(a0)+
move.b $ffff8937.w,(a0)+
move.b $ffff8938.w,(a0)+
move.b $ffff8939.w,(a0)+
move.w $ffff893a.w,(a0)+
move.b $ffff893c.w,(a0)+
move.b $ffff8941.w,(a0)+
move.b $ffff8943.w,(a0)+
move.b $ffff8900.w,(a0)+
move.b $ffff8901.w,(a0)+
move.b $ffff8920.w,(a0)+
move.b $ffff8921.w,(a0)+
rts
dspmod34_restoreaudio:
lea.l dspmod34_saveaudiobuf,a0
move.w (a0)+,$ffff8930.w
move.w (a0)+,$ffff8932.w
move.b (a0)+,$ffff8934.w
move.b (a0)+,$ffff8935.w
move.b (a0)+,$ffff8936.w
move.b (a0)+,$ffff8937.w
move.b (a0)+,$ffff8938.w
move.b (a0)+,$ffff8939.w
move.w (a0)+,$ffff893a.w
move.b (a0)+,$ffff893c.w
move.b (a0)+,$ffff8941.w
move.b (a0)+,$ffff8943.w
move.b (a0)+,$ffff8900.w
move.b (a0)+,$ffff8901.w
move.b (a0)+,$ffff8920.w
move.b (a0)+,$ffff8921.w
rts
dspmod34_fix:
include 'dsp_fix.s' ;NoCrew DSP bootstrap-code replacement
section data
even
dspmod34_voltab4:
dc.w $7fff,$7fff,$7fff,$7fff
dc.w 0,0,0,0
even
dspmod34_voltab8:
dc.w $3fff,$3fff,$3fff,$3fff
dc.w $3fff,$3fff,$3fff,$3fff
even
dspmod34_player:
incbin 'dspmod.tce'
even
dspmod34_mod: ;module - can be 4-8 channels
incbin 'd:\temp\mod.mod'
even
section bss
dspmod34_saveaudiobuf: ds.w 10
dspmod34_dma_pointer: ds.l 1
dspmod34_save_stack: ds.l 1