home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-12-06 | 25.5 KB | 1,511 lines |
-
-
-
-
- which_bank equ 0 ;test identification for fx bank
-
- demo equ 1 ;set to 0 to make returnable demo
-
- select_tunes equ 1 ; set to 0 for selecting music on mouse button
-
- ;**********************************************************************
-
-
- ; DRIVER REMAINS COPYRIGHT D.LOWE
-
- ; DRIVER TO RUN RELOCATABLE DATA BLK
- ;
- ; .....fade only affects music in this version
-
-
-
- ; devpac source code file... no macros.
-
- ; The data blocks can go anywhere in chip
- ; memory but the base address must be passed
- ; to the driver in A0...and call setup
-
-
- ; It must be assembled with SYMBOLS CASE independent.
-
- ; dont hesitate to ring with any problems
-
-
-
- ; DAVE LOWE.....0723 870648
-
-
-
- ; **************************
-
- section issA,code_c ;must be in low memory for dma access
- ;DEVPAC PSEUDO OP ..CAN BE DELETED
-
-
- ;*****************************************
-
-
- ; zero to step tunes on mouse button
- ; can be deleted..not essential
-
- ; ALL EQUs
-
-
-
-
-
- v equ 0
-
- no_loop equ 0
- loop equ 0
- chann1reg equ $dff0a0
- chann2reg equ $dff0b0
- chann3reg equ $dff0c0
- chann4reg equ $dff0d0
- dmacon equ $dff096
- int_bf_int equ $dff01e
- int_bf_w equ $dff09a
- vhposr equ $dff006
- in_line equ 0
- new_snd equ 4
- end_song equ 1
- end_patt equ 8
- new_env equ 12
- pbend equ 16
-
-
-
- hi: equ 223
- lo: equ 446
-
- r22 equ 134
- r20 equ 179 ;correctum
- r19 equ 150
- r18 equ 178
- r17 equ 200
- r16: equ 227 ;correctum
- r15: equ 249
- r14 equ 280
- r13: equ 305
- r12: equ 333
- r11: equ 361
- r10: equ 389
- r9: equ 419
- r8: equ 446
- r7: equ 446+112
- r6: equ 446+223
- r5: equ 446+223+112
- r4: equ 446*2
- r3: equ 446*3
- r2: equ 446*4
- r1: equ 446*8
-
-
- filter: equ $bfe001
- filter_on equ 44
- filter_off equ 48
-
- modon equ 20
- pboff equ 24
- modoff equ 28
- rest equ 32
- end_fxp equ 36
- end_fx3 equ 36
- end_fx4 equ 40
- acc equ 52
- repeat equ 56
- down equ 1
- up equ 2
-
- fx equ 0
-
-
-
- ;**************************************************************************
- ;**************************************************************************
-
-
- ; THIS IS THE CONTROL SECTION FOR TESTING AS A STAND ALONE PRG.
-
- ; AND CAN BE DELETED WHEN NOT REQUIRED
-
-
- lea music_data_blk,a0
- jsr set_up_music_address
-
- lea fx_data_blk,a0
- jsr set_up_fx_address
-
- lea speech_bank1,a0
- jsr set_up_speech1_address
-
- lea speech_bank2,a0
- jsr set_up_speech2_address
-
-
- move.l #1,song_buffer
- jsr select_new_song ;set up tune..numnber 1
-
- testloop:
- jsr delay ;wait for scan line at 50hz on pal
- tst.w endf
- beq noend
- jsr kill_chip
-
- rts ;finish
-
- endf dc.w 0
-
- noend
- jsr driver ;run driver at 50 hz for testing
-
- bra testloop ;loop back
-
- finish
- move.w #1,endf
- rts
-
- ;--------
-
- ;these are all routines used during test/stand alone
- ; assembly
-
- delay:
- tst.w fxtimer
- bne no_test
- clr.l d0
- move.b $bfe001,d0
- btst #6,d0
- bne no_test1
- move.w #10,fxtimer
- bra testfx4
- no_test
- subq #1,fxtimer
- no_test1
- clr.l d0
- move.w vhposr,d0
- andi.w #%1111111100000000,d0
- cmpi.w #%1111111100000000,d0
-
- bne no_test1
- rts
-
- testfx4:
-
- clr.l d0
- move.b $bfe001,d0
- btst #6,d0
- beq testfx4
-
- move.l song_buffer,d0
- addq.l #1,d0
- cmp.l max_songs,d0
- bne nores
- move.l #1,d0
- nores move.l d0,song_buffer
-
-
- ;-----------------------------
-
- ifeq demo
- bra finish ;end on mouse button
- endc
-
- ;----------------------------
-
- ifeq select_tunes
- jsr select_new_song ;new song on mouse button
- endc
- ;--------------------------
-
- ;run fx on mouse button
- move.l fx_last,d0
- move.l d0,fx_kill
-
- ;jsr kill_loopfx ;use only one fx at a time
- ;for testing
-
- no_k
- move.l fx_no,fx_number
- move.l fx_no,fx_last
- addq.l #1,fx_no
- move.l max_fx,d0
- cmp.l fx_no,d0
- bne noreset
- move.l #1,fx_no
- noreset:
- move.w #which_bank,fx_bank
-
- ifne select_tunes
-
- jsr set_up_fx
-
- endc
-
- bra no_test
-
- fxtc: dc.w 10
- fx_no: dc.l 1
- fx_last dc.l 0
- max_songs dc.l 10
- max_fx dc.l 4
-
-
- ; END OF CONTROL (DELETABLE) SECTION
-
- ;********************************************************************
- ;********************************************************************
-
- ; MAIN VARIABLES TO BE ACCESSED BY PROGRAMMER DURING RUNTIME
-
-
- fx_number: dc.l 0 ; number of fx required here
-
- fx_bank dc.w 0 ; fx bank here. 0 to 3 for genfx/speech1/speech2
-
- fx_kill dc.l 0 ; number of fx to kill/used mainly
- ; to kill looping fx
-
-
- song_buffer dc.l 0 ; number of piece of music required here ie.1 to ? ; currently playing beach background..see list
-
- music_disable: dc.w 0 ; 1 = disable music
-
- fx_disable: dc.w 0 ; 1 = disable fx
-
-
- fade: dc.w 0 ; 0 to 64..0 = full volume/64 = off
-
-
- ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- ; THESE VARIABLES ARE USED INTERNALLY BY THE DRIVER
- fxr1 dc.l 0
- fxr2 dc.l 0
- fxr3 dc.l 0
- fxr4 dc.l 0
- fxc1 dc.l 0
- fxc2 dc.l 0
- fxc3 dc.l 0
- fxc4 dc.l 0
- fx1_flag dc.w 0
- fx2_flag dc.w 0
- fx3_flag dc.w 0
- fx4_flag dc.w 0
- fxtimer dc.w 0
- gen dc.w 0
- int_disable dc.w 0
- altpf dc.w 0
- kill_flag dc.w 0
- mode dc.w 0
-
- music_base_address dc.l 0
- fx_base_address dc.l 0
- bank1_base_address dc.l 0
- bank2_base_address dc.l 0
- jingles_base_address dc.l 0
- curr_base_address dc.l 0
- speech_bank1_address dc.l 0
- speech_bank2_address dc.l 0
- ch1fx_ident dc.w 0
- ch2fx_ident dc.w 0
- ch3fx_ident dc.w 0
- ch4fx_ident dc.w 0
- globalfx_ident dc.w 0
- ch1_curr_base dc.l 0
- ch2_curr_base dc.l 0
- ch3_curr_base dc.l 0
- ch4_curr_base dc.l 0
-
-
-
- tempo_counter dc.l 0
- song_tempo dc.l 0
- play_flag dc.w 0
-
-
- ;*********************************
- set_up_music_address:
- move.l a0,music_base_address
- rts
-
- set_up_fx_address:
- move.l a0,fx_base_address
- rts
-
- set_up_speech1_address:
- move.l a0,speech_bank1_address
- rts
-
- set_up_speech2_address:
- move.l a0,speech_bank2_address
- rts
-
- ; *******************************************************
-
- ; CALL THIS SUBROUTINE TO SET UP THE REQIURED FX
- ;on entry it requires the fx number to be in "fx_number"(long word see above)
- ;and the bank number to be in "fx_bank" (word..see above)
-
- set_up_fx
- movem.l d5/a2,-(a7) ;save used registers
-
- tst.l fxc4
- bne check3
- use4:
- move.w #%0000000000001000,d5
- lea chann4reg,a2
- jsr end_fx4p
- move.l fx_number,fxr4
- move.l fx_number,fxc4
- move.w fx_bank,ch4fx_ident
- move.l #0,fx_number
- bra no_fx
- check3: tst.l fxc3
- bne check2
- use3:
- move.w #%0000000000000100,d5
- lea chann3reg,a2
- jsr end_fx3p
- move.l fx_number,fxr3
- move.l fx_number,fxc3
- move.w fx_bank,ch3fx_ident
- move.l #0,fx_number
- bra no_fx
- check2: tst.l fxc2
- bne check1
- use2:
- move.w #%0000000000000010,d5
- lea chann2reg,a2
- jsr end_fx2p
- move.l fx_number,fxr2
- move.l fx_number,fxc2
- move.w fx_bank,ch2fx_ident
- move.l #0,fx_number
- bra no_fx
- check1: tst.l fxc1
- bne use3
- use1:
- move.w #%0000000000000001,d5
- lea chann1reg,a2
- jsr end_fx1p
- move.l fx_number,fxr1
- move.l fx_number,fxc1
- move.w fx_bank,ch1fx_ident
- move.l #0,fx_number
- no_fx
- movem.l (a7)+,d5/a2 ;restore registers
- rts
-
- ;*************************************************
- ; CALL HERE TO KILL ANY FX...
- ; after putting the number of the fx you want to kill
- ; into fx_kill
-
- kill_loopfx
-
- movem.l d5/a2,-(a7) ;save used registers
- move.l fx_kill,d5
- cmp.l fxc1,d5
- bne k2
- move.w #%0000000000000001,d5
- lea chann1reg,a2
- jsr end_fx1p
- bra error
- k2 cmp.l fxc2,d5
- bne k3
- move.w #%0000000000000010,d5
- lea chann2reg,a2
- jsr end_fx2p
- bra error
- k3 cmp.l fxc3,d5
- bne k4
- move.w #%0000000000000100,d5
- lea chann3reg,a2
- jsr end_fx3p
- bra error
- k4 cmp.l fxc4,d5
- bne error
- move.w #%0000000000001000,d5
- lea chann2reg,a2
- jsr end_fx4p
- error
- clr.l fx_kill
- movem.l (a7)+,d5/a2 ;restore registers
- rts
- ;*************************************************
-
- ; CALL HERE TO KILL ANY SOUNDS LEFT ON CHIP
-
- kill_chip:
- move.w #%0000000000001111,dmacon
- move.l arest_data,chann1reg
- move.l arest_data,chann2reg
- move.l arest_data,chann3reg
- move.l arest_data,chann4reg
- move.w #16,chann1reg+4
- move.w #16,chann2reg+4
- move.w #16,chann3reg+4
- move.w #16,chann4reg+4
- move.w #0,chann1reg+8
- move.w #0,chann2reg+8
- move.w #0,chann3reg+8
- move.w #0,chann4reg+8
- move.w #1,chann1reg+6
- move.w #1,chann2reg+6
- move.w #1,chann3reg+6
- move.w #1,chann4reg+6
- move.l #0,fxr1
- move.l #0,fxr2
- move.l #0,fxr3
- move.l #0,fxr4
- move.w #0,fx1_flag
- move.w #0,fx2_flag
- move.w #0,fx3_flag
- move.w #0,fx4_flag
- move.l #0,fxc1
- move.l #0,fxc2
- move.l #0,fxc3
- move.l #0,fxc4
- rts
-
- arestd:
- arest_data:
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-
-
- ;****************************************
-
- ; CALL HERE TO SELECT WHICH PIECE OF MUSIC TO PLAY
- ; AFTER PLACING NUMBER (1 to ?) IN "SONG_BUFFER"..see above
- ; a call to this routine will initiliase the driver/kill any sound etc.
- ; make sure this routine has been called before running the interrupt
- ; driven section....see below
-
- select_new_song:
-
- move.w #1,int_disable
- movem.l d0/d1/a0/a1,-(a7) ;save used registers
- move.w music_disable,gen
- move.w #1,music_disable
- jsr kill_chip
- clr.l d0
- move.w #204,d0
- lea gvars,a0
- clloop: clr.w (a0)+
- dbra d0,clloop
- tst.l song_buffer
- beq no_song
- move.l song_buffer,d1
- add.l d1,d1
- add.l d1,d1
- add.l d1,d1
- add.l d1,d1
- add.l d1,d1
-
- ;-----------------
- movea.l (music_base_address),a1
- move.w (a1),d0 ;word offset to song_table
- lea (a1,d0),a1
- sub.l #32,a1
- ;-----------------
- ;LEA SONG_TABLE-16,A1
-
- add.l d1,a1 ;a1 points to song table in data blk
-
-
- movea.l (music_base_address),a2 ;sort tempo
- MOVE.L (A1)+,(song_tempo)
- ; ---------------------------------
-
- movea.l (music_base_address),a2
- MOVE.L (A1)+,d0
- add.l d0,a2
- move.l a2,wsong1
-
- movea.l (music_base_address),a2
- MOVE.L (A1)+,d0
- add.l d0,a2
- move.l a2,wsong2
-
- movea.l (music_base_address),a2
- MOVE.L (A1)+,d0
- add.l d0,a2
- move.l a2,wsong3
-
- movea.l (music_base_address),a2
- MOVE.L (A1),d0
- add.l d0,a2
- move.l a2,wsong4
-
-
-
-
- MOVE.L #pstart,PATTR1
- MOVE.L #pstart,PATTR2
- MOVE.L #pstart,PATTR3
- move.l #pstart,pattr4
- move.l #sstart,songr1
- MOVE.L #sstart,SONGR2
- MOVE.L #sstart,SONGR3
- move.l #sstart,songr4
- no_song
- move.w #1,ch1vars
- move.w #2,ch2vars
- move.w #3,ch3vars
- move.w #4,ch4vars
- move.w #6,ch4fxvars
- move.w #5,ch3fxvars
- move.w #7,ch2fxvars
- move.w #8,ch1fxvars
- move.w gen,music_disable
- clr.w int_disable
- movem.l (a7)+,d0/d1/a0/a1 ;restore registers
- rts
-
-
- sstart: dc.l 0,1
- pstart: dc.w 8
-
-
-
- ;**************************************************
-
- ;This is the interrupt routine
-
-
- ; CALL HERE ON A 50hz INTERRUPT DURING RUNTIME
- ; TO PLAY FX AND TUNES
-
- driver:
- tst.w int_disable
- beq process_data
- rts
- ;------------------------------
-
- process_data
-
- move.l #1,d0
- add.l (tempo_counter),d0
- move.l d0,(tempo_counter)
- cmp.l (song_tempo),d0
- bls process_data1
-
- move.w #1,play_flag ;inhibit music play this frame
- clr.l tempo_counter
-
-
- process_data1
-
- movem.l d0-d6/a0-a6,-(a7) ;save used registers
-
-
- ch1:
- tst.w fx_disable
- bne test_music1
- tst.l fxr1
- bne ch1j1
- tst.l fxc1
- beq test_music1
- bra ch1j3
- ch1j2 jsr run_dummy1
- jsr run_fx1
- bra ch2
- ch1j1
- jsr set_up1
- ch1j3 tst.w music_disable
- beq ch1j2
- jsr run_fx1
- bra ch2
- test_music1
- tst.w music_disable
- bne ch2
- jsr run_music1
- bra ch2
- ;***********************
-
- ; channel 1 subroutines
-
- run_dummy1
-
-
-
- tst.w play_flag
- beq rd1
- rts
- rd1
-
- move.l (music_base_address),(curr_base_address)
-
-
- lea ch1vars,a0
- lea dummy_reg,a2
- move.w #0,d5
- jsr sect1
- rts
-
- set_up1
- move.w ch1fx_ident,d0
- jsr sort_fx_bank ;move.l (fx_base_address),a1
- move.l a1,ch1_curr_base
-
- move.l a1,-(a7)
- move.w 2(a1),d0
- add.w d0,a1
- sub.l #4,a1 ;pointer to jumptable
- move.l fxr1,d0
- add d0,d0
- add d0,d0
- add.l d0,a1 ;pointer to fx offset within table
- move.l (a1),d0
-
- move.l (a7)+,a1 ;get base address from stack
-
- add.l d0,a1
- move.l a1,currfx1 ;store address
- clr.l fxr1
- clr.w fxintc1
- rts
-
- run_fx1
-
- move.l (ch1_curr_base),(curr_base_address)
-
- lea ch1fxvars,a0
- lea chann1reg,a2
- move.w #%0000000000000001,d5
- move.w #%1000000000000001,d1
-
- move.w #1,mode
- jsr sect1
- rts
-
- run_music1
-
- tst.w play_flag
- beq rm1
- rts
- rm1
- move.l (music_base_address),(curr_base_address)
-
-
- lea ch1vars,a0
- lea chann1reg,a2
- move.w #%0000000000000001,d5
- move.w #%1000000000000001,d1
- move.w #0,mode
- jsr sect1
- rts
-
- ; **************************
- ch2
- tst.w fx_disable
- bne test_music2
- tst.l fxr2
- bne ch2j1
- tst.l fxc2
- beq test_music2
- bra ch2j3
- ch2j2 jsr run_dummy2
- jsr run_fx2
- bra ch3
- ch2j1
- jsr set_up2
- ch2j3 tst.w music_disable
- beq ch2j2
- jsr run_fx2
- bra ch3
-
- test_music2
- tst.w music_disable
- bne ch3
- jsr run_music2
- bra ch3
- ;***********************
- ; channel 2 subroutines
- run_dummy2
-
- tst.w play_flag
- beq rd2
- rts
- rd2
-
- move.l (music_base_address),(curr_base_address)
-
- lea ch2vars,a0
- lea dummy_reg,a2
- move.w #0,d5
- jsr sect1
- rts
-
- set_up2
- move.w ch2fx_ident,d0
- jsr sort_fx_bank ;move.l (fx_base_address),a1
- move.l a1,ch2_curr_base
-
- move.l a1,-(a7)
- move.w 2(a1),d0
- add.w d0,a1
- sub.l #4,a1 ;pointer to jumptable
- move.l fxr2,d0
- add d0,d0
- add d0,d0
- add.l d0,a1 ;pointer to fx offset within table
- move.l (a1),d0
-
- move.l (a7)+,a1 ;get base address from stack
-
- add.l d0,a1
- move.l a1,currfx2 ;store address
- clr.l fxr2
- clr.w fxintc2
- rts
-
- run_fx2
-
- move.l (ch2_curr_base),(curr_base_address)
-
- lea ch2fxvars,a0
- lea chann2reg,a2
- move.w #%0000000000000010,d5
- move.w #%1000000000000010,d1
- move.w #1,mode
- jsr sect1
- rts
-
- run_music2
- tst.w play_flag
- beq rm2
- rts
- rm2
- move.l (music_base_address),(curr_base_address)
-
- lea ch2vars,a0
- lea chann2reg,a2
- move.w #%0000000000000010,d5
- move.w #%1000000000000010,d1
- move.w #0,mode
- jsr sect1
- rts
-
- ; **************************
-
- ch3:
- tst.w fx_disable
- bne test_music3
- tst.l fxr3
- bne ch3j1
- tst.l fxc3
- beq test_music3
- bra ch3j3
- ch3j2 jsr run_dummy3
- jsr run_fx3
- bra ch4
- ch3j1
- jsr set_up3
- ch3j3 tst.w music_disable
- beq ch3j2
- jsr run_fx3
- bra ch4
-
- test_music3
- tst.w music_disable
- bne ch4
- jsr run_music3
- bra ch4
-
- ;***********************
-
- ; channel 3 subroutines
-
- run_dummy3
- tst.w play_flag
- beq rd3
- rts
- rd3
-
- move.l (music_base_address),(curr_base_address)
-
- lea ch3vars,a0
- lea dummy_reg,a2
- move.w #0,d5
- jsr sect1
- rts
-
- set_up3
- move.w ch3fx_ident,d0
- jsr sort_fx_bank
- move.l a1,ch3_curr_base
-
- move.l a1,-(a7)
- move.w 2(a1),d0
- add.w d0,a1
- sub.l #4,a1 ;pointer to jumptable
- move.l fxr3,d0
- add d0,d0
- add d0,d0
- add.l d0,a1 ;pointer to fx offset within table
- move.l (a1),d0
-
- move.l (a7)+,a1 ;get base address from stack
-
- add.l d0,a1
- move.l a1,currfx3 ;store address
- clr.l fxr3
- clr.w fxintc3
- rts
-
-
- run_fx3
- move.l (ch3_curr_base),(curr_base_address)
-
- lea ch3fxvars,a0
- lea chann3reg,a2
- move.w #%0000000000000100,d5
- move.w #%1000000000000100,d1
- move.w #1,mode
- jsr sect1
- rts
-
- run_music3
-
- tst.w play_flag
- beq rm3
- rts
- rm3
-
- move.l (music_base_address),(curr_base_address)
-
- lea ch3vars,a0
- lea chann3reg,a2
- move.w #%0000000000000100,d5
- move.w #%1000000000000100,d1
- move.w #0,mode
- jsr sect1
- rts
-
- ; **************************
-
- ch4:
- tst.w fx_disable
- bne test_music4
- tst.l fxr4
- bne ch4j1
- tst.l fxc4
- beq test_music4
- bra ch4j3
- ch4j2 jsr run_dummy4
- jsr run_fx4
- bra no4
- ch4j1
- jsr set_up4
- ch4j3 tst.w music_disable
- beq ch4j2
- jsr run_fx4
- bra no4
-
- test_music4
- tst.w music_disable
- bne no4
- jsr run_music4
- no4
-
- clr.w play_flag ;inhibit music tempo play
-
- movem.l (a7)+,d0-d6/a0-a6 ;restore registers
- rts
-
- ;***********************
-
- ; channel 4 subroutines
-
- run_dummy4
-
- tst.w play_flag
- beq rd4
- rts
- rd4
-
-
- move.l (music_base_address),(curr_base_address)
-
- lea ch4vars,a0
- lea dummy_reg,a2
- move.w #0,d5
- jsr sect1
- rts
-
- set_up4
- move.w ch4fx_ident,d0
- jsr sort_fx_bank ;move.l (fx_base_address),a1
- move.l a1,ch4_curr_base
-
- move.l a1,-(a7)
- move.w 2(a1),d0
- add.w d0,a1
- sub.l #4,a1 ;pointer to jumptable
- move.l fxr4,d0
- add d0,d0
- add d0,d0
- add.l d0,a1 ;pointer to fx offset within table
- move.l (a1),d0
-
- move.l (a7)+,a1 ;get base address from stack
-
- add.l d0,a1
- move.l a1,currfx4 ;store address
- clr.l fxr4
- clr.w fxintc4
- rts
-
- run_fx4
-
- move.l (ch4_curr_base),(curr_base_address)
-
- lea ch4fxvars,a0
- lea chann4reg,a2
- move.w #%0000000000001000,d5
- move.w #%1000001000001000,d1
- move.w #1,mode
- jsr sect1
- rts
-
- run_music4
-
- tst.w play_flag
- beq rm4
- rts
- rm4
- move.l (music_base_address),(curr_base_address)
-
-
- lea ch4vars,a0
- lea chann4reg,a2
- move.w #%0000000000001000,d5
- move.w #%1000001000001000,d1
- move.w #0,mode
- jsr sect1
- rts
- ;---------------------------------------
-
-
- sort_fx_bank: ;d0 contains bank ident
- ;0 = gen fx
- ;1 = speech bank1
- ;2 = speech bank 2
-
- tst.w d0
- beq set_gen
- cmp.w #1,d0
- beq set_speech1
-
- move.l (speech_bank2_address),a1 ;set speech 2
- rts
-
- set_gen
- move.l (fx_base_address),a1
- rts
-
- set_speech1
- move.l (speech_bank1_address),a1
- rts
-
-
- ; **************************
-
- sect1: tst.w (a0)
- bne s1j1
- rts
-
- s1j1: tst.w 2(a0)
- beq sect3
- cmpi.w #1,2(a0)
- beq sect4
-
- cmpi.w #3,4(a0)
- beq part2
-
- mode_switch: subq.w #1,2(a0)
-
- check_effects: clr.w altpf
- move.w 6(a0),d2
- tst.w 8(a0)
- beq check_mod
- tst.w 14(a0)
- beq cont_bend
- subq.w #1,14(a0)
- bra check_mod
- cont_bend: addq.w #1,altpf
- move.w 10(a0),d3
- move.w 12(a0),d4
- cmpi.w #1,8(a0)
- beq pbup
-
- sub.w d3,d2
- cmp.w d2,d4
- bcs check_mod
- bra fbend
-
- pbup: add.w d3,d2
- cmp.w d2,d4
- bcc check_mod
- fbend: move.w d4,d2
- clr.w 8(a0)
- check_mod: tst.w 16(a0)
- beq send_alt_pitch
-
-
- tst.w 58(a0)
- beq st_ok
- subq.w #1,58(a0)
- bra send_alt_pitch
- st_ok:
- tst.w 50(a0)
- beq cont_mod
- subq #1,50(a0)
- bra send_alt_pitch
- cont_mod: move.w 52(a0),50(a0)
- addq #1,altpf
- cmpi #3,16(a0)
- bcc addmod
-
- move.w 56(a0),d3
- sub.w d3,d2
- addq.w #1,16(a0)
- bra send_alt_pitch
- addmod:
-
- move.w 54(a0),d3
- add.w d3,d2
- addq.w #1,16(a0)
- cmpi.w #5,16(a0)
- bne send_alt_pitch
- move.w #1,16(a0)
-
- send_alt_pitch: tst.w altpf
- beq send_env
- move.w d2,6(a0)
- move.w d2,6(a2)
-
- send_env:
-
- do_env_check:
-
- norm_env:
- move.l 18(a0),a1
- cmpi.w #255,(a1)
- beq env_finished
- ;cmpi.w #1,66(a0)
- ;bne no_acc
-
- resu clr.l d0
- move.w (a1)+,d0
- ;sub.w 64(a0),d0
-
- ;test for mode here
- tst.w mode
- bne sete
-
- sub.w fade,d0
- bcc sete
-
-
- move.w #0,d0
-
-
- sete move.w d0,8(a2)
- move.l a1,18(a0)
- rts
-
-
- no_acc:
- ;resu:
- no_off
- ;move.w (a1)+,d0
- sub.w fade,d0
- bcc sete2
- move.w #0,d0
- sete2 move.w d0,8(a2)
- move.w (a1)+,8(a2)
-
- fint: move.l a1,18(a0)
- rts
-
- env_finished:
- subq.l #2,a1
- bra resu
- rts
-
-
-
- one_shot_note: move.w #3,4(a0)
- move.l 38(a0),(a2)
- move.w 42(a0),4(a2)
- move.w d1,dmacon
- bra send_env
-
-
- part2:
- move.l 44(a0),(a2)
- move.w 48(a0),4(a2)
- subq.w #1,2(a0)
- move.w #1,4(a0)
- bra check_effects
-
- sect3:
- move.w #0,66(a0)
-
- move.l 22(a0),a1
- control_ret: move.w (a1)+,d0
- cmpi.w #100,d0
- bls sect5
-
- acc_note:
- move.w d0,6(a0)
- move.w d0,6(a2)
- move.w (a1)+,2(a0)
- subq.w #1,2(a0)
- move.l a1,22(a0)
- move.l 34(a0),18(a0)
- move.w 60(a0),58(a0)
-
-
- tst.w 16(a0)
- beq no_mod_res
- move.w #1,16(a0)
- no_mod_res:
- cmpi.w #0,4(a0)
- beq do_loop
- bra one_shot_note
-
-
- do_loop: move.w d1,dmacon
- bra send_env
-
- do_rest:
- move.w (a1)+,2(a0)
- subq.w #1,2(a0)
- move.l a1,22(a0)
- move.l #drest_env,18(a0)
-
- move.w #0,8(a2)
- bra send_env
-
- sect4:
- cmpi.w #0,4(a0)
- beq noof
- move.w d5,dmacon
- noof: subq.w #1,2(a0)
- bra check_effects
-
- sect5: move.l #jump_table,a3
- move.l (a3,d0),a4
- jmp (a4)
-
- jump_table:
- dc.l in_line_data
- dc.l nsound
- dc.l patt_end
- dc.l get_env
- dc.l check_pbend
- dc.l do_mod
- dc.l bend_off
- dc.l mod_off
- dc.l do_rest
- dc.l end_fx
- dc.l end_fx
- dc.l s_f_on
- dc.l s_f_off
- dc.l set_acc
- dc.l rept
-
- in_line_data:
-
- nop
- rts
-
- rept:
- move.l (a1),d0
- move.l (curr_base_address),a1
- add.l d0,a1
- bra control_ret
-
- s_f_on:
- bclr #1,filter
- bra control_ret
- s_f_off:
- bset #1,filter
- bra control_ret
-
- nsound:
- ;----------------------------
- move.l (a1)+,d0 ;sound offset
- move.l (curr_base_address),a3
- add.l d0,a3
- ;----------------------------
- ;move.l (a1)+,a3
-
- cmpi.w #0,(a3)
- bne one_shot_sound
-
- xxx
- move.w (a3)+,4(a0) ;length
-
- ;-----------------
- move.l (curr_base_address),a6
- move.l (a3)+,d0
- add.l d0,a6
- move.l a6,(a2)
- ;--------------------
- ;move.l (a3)+,(a2)
-
- move.w (a3),4(a2)
- jmp control_ret
-
- one_shot_sound:
- move.w (a3)+,4(a0) ;type of sound
- ;-----------
- move.l (curr_base_address),a6
- move.l (a3)+,d0
- add.l d0,a6
- move.l a6,38(a0) ;address sample 1
- ;---------------
- move.w (a3)+,42(a0) ;length sample 1
- ;---------------------
- move.l (curr_base_address),a6
- move.l (a3)+,d0
- add.l d0,a6
- move.l a6,44(a0)
-
- ;---------------------
- ;add.l #4,a3
- move.w (a3),48(a0)
- jmp control_ret
-
- patt_end:
-
- move.l 26(a0),a1
- cmpi.l #0,(a1)
- beq song_control ;end of song
- addq.l #4,26(a0) ;get next pattern address
- ;-----------------------
- move.l (a1),d0 ;offset
- move.l (curr_base_address),a1
- add.l d0,a1 ;new pattern
-
- ;------------------------
- ;move.l (a1),a1
- jmp control_ret
- get_env:
- ;-----------------------
- move.l (a1)+,d0 ;env offset
- move.l (curr_base_address),a4
- add.l d0,a4
- ;--------------------------
- ;move.l (a1)+,a4
-
- move.l (a4)+,62(a0)
-
- move.l a4,34(a0)
-
- bra control_ret
-
- check_pbend:
- move.l (a1)+,8(a0)
- move.l (a1)+,12(a0)
- bra control_ret
-
- do_mod: move.w #1,16(a0)
- move.l (a1)+,50(a0)
- move.l (a1)+,54(a0)
- move.l (a1)+,58(a0)
- bra control_ret
-
- bend_off: clr.w 8(a0)
- bra control_ret
-
- mod_off: clr.w 16(a0)
- bra control_ret
-
-
- end_fx:
- cmpi.w #6,(a0)
- beq end_fx4p
- cmpi.w #5,(a0)
- beq end_fx3p
- cmpi.w #7,(a0)
- beq end_fx2p
-
- end_fx1p:
- move.w d5,dmacon
- move.w #1,chann1reg+6
- move.w #0,8(a2)
- move.l #0,fxc1
- rts
-
- end_fx2p:
- move.w d5,dmacon
- move.w #1,chann2reg+6
- move.w #0,8(a2)
- move.l #0,fxc2
- rts
-
-
- end_fx3p:
- move.w d5,dmacon
- move.w #1,chann3reg+6
- move.w #0,8(a2)
- move.l #0,fxc3
- rts
-
- end_fx4p:
- move.w d5,dmacon
- move.w #1,chann4reg+6
- move.w #0,8(a2)
- move.l #0,fxc4
- rts
-
- set_acc: move.w #1,66(a0)
- bra control_ret
-
- song_control:
- addq.l #4,a1
- move.l 30(a0),26(a0)
- move.l 26(a0),a1
- addq.l #4,26(a0)
- ;------------------
- move.l (curr_base_address),a6
- move.l (a1),d0
- add.l d0,a6
- move.l a6,a1
- ;-----------------------
- ;move.l (a1),a1
- jmp control_ret
-
-
- ;"""""""""""""""""""""""""""""""""""""""""""""""""
- ;************************************************************
- gvars:
- ch1vars
- dc.w 0
- dc.w 0,0,0,0,0,0,0,0,0,0
- pattr1: dc.l 0
- songr1: dc.l 0
- wsong1: dc.l 0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- ch2vars
- dc.w 0
- dc.w 0,0,0,0,0,0,0,0,0,0
- pattr2: dc.l 0
- songr2: dc.l 0
- wsong2: dc.l 0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- ch3vars
- dc.w 0
- dc.w 0,0,0,0,0,0,0,0,0,0
- pattr3: dc.l 0
- songr3: dc.l 0
- wsong3: dc.l 0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- ch4vars
- dc.w 0
- dc.w 0,0,0,0,0,0,0,0,0,0
- pattr4: dc.l 0
- songr4: dc.l 0
- wsong4: dc.l 0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-
- ch1fxvars
- dc.w 0
- fxintc1:
- dc.w 0,0,0,0,0,0,0,0,0,0
- currfx1:
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- ch2fxvars
- dc.w 0
- fxintc2:
- dc.w 0,0,0,0,0,0,0,0,0,0
- currfx2:
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
-
- ch3fxvars
- dc.w 0
- fxintc3:
- dc.w 0,0,0,0,0,0,0,0,0,0
- currfx3:
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- ch4fxvars
- dc.w 0
- fxintc4:
- dc.w 0,0,0,0,0,0,0,0,0,0
- currfx4:
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- ;************************************************************
-
- drest_env dc.w 0,0,0,0,0,0,0,0,255
-
-
-
- dummy_reg dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- ;*******************************************************
- even
-
-
- fx_data_blk: ;test place for getting the general fx data blk in
-
-
- incbin c:sf2d/gfx.bin
-
- ;***********************************************************
- even
-
- speech_bank1 ;test place for speech1
-
-
- incbin c:sf2d/speech/chun_speech.bin
-
-
- ;*********************************************
-
- even
-
- speech_bank2 ;test place for speech2
-
-
- incbin c:sf2d/speech/ken_speech.bin
-
- ;**********************************************
-
- even
-
- music_data_blk: ;test place for music data blk
-
-
- incbin c:sf2d/ken.bin
-
- ;***********************************************************
-
- end
-
-
-
-