diff --git a/msx/feat.txt b/msx/feat.txt index 7b10234..c39b62e 100644 --- a/msx/feat.txt +++ b/msx/feat.txt @@ -1,3 +1,4 @@ +SFX_PRIOR equ 0 STEREOMODE equ 0 PSEUDOSTEREO equ 1 ;* --------BEGIN-------- diff --git a/msx/rmtplayr.asm b/msx/rmtplayr.asm index ac1b163..e7425d5 100644 --- a/msx/rmtplayr.asm +++ b/msx/rmtplayr.asm @@ -30,6 +30,14 @@ ; ; PSEUDOSTEREO equ 0/1 ; +; And second new feature :) +; It only works if FEAT_SFX is set to 1 (SFX enabled) +; If this option is enabled, SFX take priority over music. +; Music instruments on the SFX channel starts playing after the effect sounds +; (never interrupts SFX) +; +; SFX_PRIOR equ 0/1 +; ;* ;* RMT FEATures definitions file ;* For optimizations of RMT player routine to concrete RMT modul only! @@ -42,6 +50,9 @@ .IFNDEF PSEUDOSTEREO PSEUDOSTEREO equ 0 ; no pseudo stereo .ENDIF +.IFNDEF SFX_PRIOR + SFX_PRIOR equ 0 ; no SFX priority +.ENDIF .IF STEREOMODE==1 @@ -92,6 +103,9 @@ p_tis = p_instrstable .IF FEAT_SFX .zpvar RMTSFXVOLUME .byte .ENDIF + .IF FEAT_SFX&&SFX_PRIOR + .zpvar sfx_flag .byte + .ENDIF ; end of de-self-modification vars .IF TRACKS>4 org PLAYER-$400+$40 @@ -360,6 +374,12 @@ si1 sta $d200,y .ELSE lda #FEAT_INSTRSPEED .ENDIF + ; sfx priority (Pecus) + .IF FEAT_SFX&&SFX_PRIOR + lda #$80 + sta sfx_flag + .ENDIF + ; -------- rts GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 GetSongLine @@ -518,9 +538,24 @@ InitOfNewSetInstrumentsOnly p2x1 ldy trackn_instrx2,x bmi p2x0 .IF FEAT_SFX + .IF SFX_PRIOR jsr SetUpInstrumentY2 + .ELSE + jsr SetUpInstrumentY2_continue + .ENDIF jmp p2x0 +SetUpInstrumentY2 + ; sfx priority (Pecus) + .IF SFX_PRIOR + cpx sfx_flag + bne SetUpInstrumentY2_continue + rts + .ENDIF + ; ------- rmt_sfx + .IF SFX_PRIOR + stx sfx_flag ; sfx priority (Pecus) + .ENDIF sta trackn_note,x .IF FEAT_BASS16 sta trackn_outnote,x @@ -528,7 +563,7 @@ rmt_sfx lda RMTSFXVOLUME ;* sfx note volume*16 sta trackn_volume,x .ENDIF -SetUpInstrumentY2 +SetUpInstrumentY2_continue lda (p_instrstable),y sta trackn_instrdb,x sta nt @@ -683,6 +718,14 @@ pp1 beq pp2 lda #$80 sta trackn_instrreachend,x + ; sfx priority (Pecus) + .IF FEAT_SFX&&SFX_PRIOR + cpx sfx_flag + bne no_this_channel + sta sfx_flag ; $80 +no_this_channel + .ENDIF + ; -------- pp1b lda trackn_instrlop,x pp2 sta trackn_instridx,x diff --git a/msx/rmtplayr_sfxprior.asm b/msx/rmtplayr_sfxprior.asm deleted file mode 100644 index 90d61c5..0000000 --- a/msx/rmtplayr_sfxprior.asm +++ /dev/null @@ -1,1410 +0,0 @@ -;* -;* Raster Music Tracker, RMT Atari routine version 1.20090108 -;* (c) Radek Sterba, Raster/C.P.U., 2002 - 2009 -;* http://raster.atari.org -;* -; de-self-modification and pseudo stereo option - Pecus 2025 -; -;* Warnings: -;* -;* 1. RMT player routine needs 19 itself reserved bytes in zero page (no accessed -;* from any other routines) as well as cca 1KB of memory before the "PLAYER" -;* address for frequency tables and functionary variables. It's: -;* a) from PLAYER-$03c0 to PLAYER for stereo RMTplayer -;* b) from PLAYER-$0320 to PLAYER for mono RMTplayer -;* -;* 2. RMT player routine MUST (!!!) be compiled from the begin of the memory page. -;* i.e. "PLAYER" address can be $..00 only! -;* -;* 3. Because of RMTplayer provides a lot of effects, it spent a lot of CPU time. -;* -;* STEREOMODE equ 0..3 ;0 => compile RMTplayer for 4 tracks mono -;* ;1 => compile RMTplayer for 8 tracks stereo -;* ;2 => compile RMTplayer for 4 tracks stereo L1 R2 R3 L4 -;* ;3 => compile RMTplayer for 4 tracks stereo L1 L2 R3 R4 -;* -; Message from Pecus: -; This is a new minor feature. -; It only works if STEREOMODE is set to 0 (mono) -; If on then plays on the second POKEY all sounds delayed by one frame. -; -; PSEUDOSTEREO equ 0/1 -; -;* -;* RMT FEATures definitions file -;* For optimizations of RMT player routine to concrete RMT modul only! - icl "feat.txt" - -; set default values for STEREOMODE and PSEUDOSTEREO if not defined -.IFNDEF STEREOMODE - STEREOMODE equ 0 ; 4 track mono -.ENDIF -.IFNDEF PSEUDOSTEREO - PSEUDOSTEREO equ 0 ; no pseudo stereo -.ENDIF - - -.IF STEREOMODE==1 - TRACKS equ 8 -.ELSE - TRACKS equ 4 -.ENDIF - - -;* -;*PLAYER equ $3400 -;* -;* -;* RMT ZeroPage addresses -; Remember to use the ".zpvar" directive in your program for declaring the starting address -; .zpvar first_zp_variable .byte = $80 (where $80 is the first used address on the zero page) - .zpvar p_instrstable .word - .zpvar p_trackslbstable .word - .zpvar p_trackshbstable .word - .zpvar p_song .word -p_tis = p_instrstable - .zpvar ns .word - .zpvar nr .word - .zpvar nt .word - .zpvar reg1 .byte - .zpvar reg2 .byte - .zpvar reg3 .byte - .zpvar tmp .byte - .IF FEAT_COMMAND2 - .zpvar frqaddcmd2 .byte - .ENDIF - ; de-self-modification vars - .zpvar v_audctl .byte - .IF TRACKS>4 - .zpvar v_audctl2 .byte - .ENDIF - .IF FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1 - .zpvar v_ainstrspeed .byte - .ENDIF - .zpvar v_maxtracklen .byte - .zpvar v_abeat .byte - .IF FEAT_CONSTANTSPEED==0 - .zpvar v_bspeed .byte - .ENDIF - .IF FEAT_CONSTANTSPEED==0 - .zpvar v_speed .byte - .ENDIF - .IF FEAT_SFX - .zpvar RMTSFXVOLUME .byte - .zpvar sfx_flag .byte - .ENDIF - ; end of de-self-modification vars - .IF TRACKS>4 - org PLAYER-$400+$40 - .ELSE - org PLAYER-$400+$e0 - .ENDIF -; Non zero page variables block -; You can move this block to the place where you plan to store variables -track_variables -trackn_db .ds TRACKS -trackn_hb .ds TRACKS -trackn_idx .ds TRACKS -trackn_pause .ds TRACKS -trackn_note .ds TRACKS -trackn_volume .ds TRACKS -trackn_distor .ds TRACKS -trackn_shiftfrq .ds TRACKS - .IF FEAT_PORTAMENTO -trackn_portafrqc .ds TRACKS -trackn_portafrqa .ds TRACKS -trackn_portaspeed .ds TRACKS -trackn_portaspeeda .ds TRACKS -trackn_portadepth .ds TRACKS - .ENDIF -trackn_instrx2 .ds TRACKS -trackn_instrdb .ds TRACKS -trackn_instrhb .ds TRACKS -trackn_instridx .ds TRACKS -trackn_instrlen .ds TRACKS -trackn_instrlop .ds TRACKS -trackn_instrreachend .ds TRACKS -trackn_volumeslidedepth .ds TRACKS -trackn_volumeslidevalue .ds TRACKS - .IF FEAT_VOLUMEMIN -trackn_volumemin .ds TRACKS - .ENDIF -FEAT_EFFECTS equ FEAT_EFFECTVIBRATO||FEAT_EFFECTFSHIFT - .IF FEAT_EFFECTS -trackn_effdelay .ds TRACKS - .ENDIF - .IF FEAT_EFFECTVIBRATO -trackn_effvibratoa .ds TRACKS - .ENDIF - .IF FEAT_EFFECTFSHIFT -trackn_effshift .ds TRACKS - .ENDIF -trackn_tabletypespeed .ds TRACKS - .IF FEAT_TABLEMODE -trackn_tablemode .ds TRACKS - .ENDIF -trackn_tablenote .ds TRACKS -trackn_tablea .ds TRACKS -trackn_tableend .ds TRACKS - .IF FEAT_TABLEGO -trackn_tablelop .ds TRACKS - .ENDIF -trackn_tablespeeda .ds TRACKS - .IF FEAT_FILTER||FEAT_BASS16 -trackn_command .ds TRACKS - .ENDIF - .IF FEAT_BASS16 -trackn_outnote .ds TRACKS - .ENDIF - .IF FEAT_FILTER -trackn_filter .ds TRACKS - .ENDIF -trackn_audf .ds TRACKS -trackn_audc .ds TRACKS - .IF FEAT_AUDCTLMANUALSET -trackn_audctl .ds TRACKS - .ENDIF -v_aspeed .ds 1 -track_endvariables -; End of non zero page variables block - - org PLAYER-$100-$140-$40+2 -INSTRPAR equ 12 -tabbeganddistor - dta frqtabpure-frqtab,$00 - dta frqtabpure-frqtab,$20 - dta frqtabpure-frqtab,$40 - dta frqtabbass1-frqtab,$c0 - dta frqtabpure-frqtab,$80 - dta frqtabpure-frqtab,$a0 - dta frqtabbass1-frqtab,$c0 - dta frqtabbass2-frqtab,$c0 - .IF FEAT_EFFECTVIBRATO -vibtabbeg dta 0,vib1-vib0,vib2-vib0,vib3-vib0 -vib0 dta 0 -vib1 dta 1,-1,-1,1 -vib2 dta 1,0,-1,-1,0,1 -vib3 dta 1,1,0,-1,-1,-1,-1,0,1,1 -vibtabnext - dta vib0-vib0+0 - dta vib1-vib0+1,vib1-vib0+2,vib1-vib0+3,vib1-vib0+0 - dta vib2-vib0+1,vib2-vib0+2,vib2-vib0+3,vib2-vib0+4,vib2-vib0+5,vib2-vib0+0 - dta vib3-vib0+1,vib3-vib0+2,vib3-vib0+3,vib3-vib0+4,vib3-vib0+5,vib3-vib0+6,vib3-vib0+7,vib3-vib0+8,vib3-vib0+9,vib3-vib0+0 - .ENDIF - org PLAYER-$100-$140 - .IF FEAT_BASS16 -frqtabbasslo - dta $F2,$33,$96,$E2,$38,$8C,$00,$6A,$E8,$6A,$EF,$80,$08,$AE,$46,$E6 - dta $95,$41,$F6,$B0,$6E,$30,$F6,$BB,$84,$52,$22,$F4,$C8,$A0,$7A,$55 - dta $34,$14,$F5,$D8,$BD,$A4,$8D,$77,$60,$4E,$38,$27,$15,$06,$F7,$E8 - dta $DB,$CF,$C3,$B8,$AC,$A2,$9A,$90,$88,$7F,$78,$70,$6A,$64,$5E,$00 - .ENDIF - org PLAYER-$100-$100 -frqtab - ERT [255 - ldy #0 - tya -ri0 sta track_variables,y - sta track_endvariables-$100,y - iny - bne ri0 - .ELSE - ldy #track_endvariables-track_variables - lda #0 -ri0 sta track_variables-1,y - dey - bne ri0 - .ENDIF - ldy #4 - lda (ns),y - sta v_maxtracklen - iny - .IF FEAT_CONSTANTSPEED==0 - lda (ns),y - sta v_speed - .ENDIF - .IF FEAT_INSTRSPEED==0 - iny - lda (ns),y - sta v_instrspeed - sta v_ainstrspeed - .ELSEIF FEAT_INSTRSPEED>1 - lda #FEAT_INSTRSPEED - sta v_ainstrspeed - .ENDIF - ldy #8 -ri1 lda (ns),y - sta p_tis-8,y - iny - cpy #8+8 - bne ri1 - .IF FEAT_NOSTARTINGSONGLINE==0 - pla - pha - .IF TRACKS>4 - asl @ - asl @ - asl @ - clc - adc p_song - sta p_song - pla - php - and #$e0 - asl @ - rol @ - rol @ - rol @ - .ELSE - asl @ - asl @ - clc - adc p_song - sta p_song - pla - php - and #$c0 - asl @ - rol @ - rol @ - .ENDIF - plp - adc p_song+1 - sta p_song+1 - .ENDIF - jsr GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 -rmt_silence - .IF STEREOMODE>0 - lda #0 - sta $d208 - sta $d218 - ldy #3 - sty $d20f - sty $d21f - ldy #8 -si1 sta $d200,y - sta $d210,y - dey - bpl si1 - .ELSE - lda #0 - sta $d208 - ldy #3 - sty $d20f - ldy #8 -si1 sta $d200,y - dey - bpl si1 - .ENDIF - .IF FEAT_INSTRSPEED==0 - lda v_instrspeed - .ELSE - lda #FEAT_INSTRSPEED - .ENDIF - ; sfx priority (Pecus) - .IF FEAT_SFX - lda #$80 - sta sfx_flag - .ENDIF - ; -------- - rts -GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 -GetSongLine - ldx #0 - stx v_abeat -nn0 -nn1 txa - tay - lda (p_song),y - cmp #$fe - bcs nn2 - tay - lda (p_trackslbstable),y - sta trackn_db,x - lda (p_trackshbstable),y -nn1a sta trackn_hb,x - lda #0 - sta trackn_idx,x - lda #1 -nn1a2 sta trackn_pause,x - lda #$80 - sta trackn_instrx2,x - inx -xtracks01 cpx #TRACKS - bne nn1 - lda p_song - clc -xtracks02 adc #TRACKS - sta p_song - bcc GetTrackLine - inc p_song+1 -nn1b - jmp GetTrackLine -nn2 - beq nn3 -nn2a - lda #0 - beq nn1a2 -nn3 - ldy #2 - lda (p_song),y - tax - iny - lda (p_song),y - sta p_song+1 - stx p_song - ldx #0 - beq nn0 -GetTrackLine -oo0 -oo0a - .IF FEAT_CONSTANTSPEED==0 - lda v_speed - sta v_bspeed - .ENDIF - ldx #-1 -oo1 - inx - dec trackn_pause,x - bne oo1x -oo1b - lda trackn_db,x - sta ns - lda trackn_hb,x - sta ns+1 -oo1i - ldy trackn_idx,x - inc trackn_idx,x - lda (ns),y - sta reg1 - and #$3f - cmp #61 - beq oo1a - bcs oo2 - sta trackn_note,x - .IF FEAT_BASS16 - sta trackn_outnote,x - .ENDIF - iny - lda (ns),y - lsr @ - and #$3f*2 - sta trackn_instrx2,x -oo1a - lda #1 - sta trackn_pause,x - ldy trackn_idx,x - inc trackn_idx,x - lda (ns),y - lsr @ - ror reg1 - lsr @ - ror reg1 - lda reg1 - .IF FEAT_GLOBALVOLUMEFADE - sec - sbc #$00 -RMTGLOBALVOLUMEFADE equ *-1 - bcs voig - lda #0 -voig - .ENDIF - and #$f0 - sta trackn_volume,x -oo1x -xtracks03sub1 cpx #TRACKS-1 - bne oo1 - .IF FEAT_CONSTANTSPEED==0 - lda v_bspeed - sta v_speed - .ELSE - lda #FEAT_CONSTANTSPEED - .ENDIF - sta v_aspeed - jmp InitOfNewSetInstrumentsOnly -oo2 - cmp #63 - beq oo63 - lda reg1 - and #$c0 - beq oo62_b - asl @ - rol @ - rol @ - sta trackn_pause,x - jmp oo1x -oo62_b - iny - lda (ns),y - sta trackn_pause,x - inc trackn_idx,x - jmp oo1x -oo63 - lda reg1 - .IF FEAT_CONSTANTSPEED==0 - bmi oo63_1X - iny - lda (ns),y - sta v_bspeed - inc trackn_idx,x - jmp oo1i -oo63_1X - .ENDIF - cmp #255 - beq oo63_11 - iny - lda (ns),y - sta trackn_idx,x - jmp oo1i -oo63_11 - jmp GetSongLine -p2xrmtp3 jmp rmt_p3 -p2x0 dex - bmi p2xrmtp3 -InitOfNewSetInstrumentsOnly -p2x1 ldy trackn_instrx2,x - bmi p2x0 - .IF FEAT_SFX - jsr SetUpInstrumentY2_continue - jmp p2x0 -SetUpInstrumentY2 - ; sfx priority (Pecus) - cpx sfx_flag - bne SetUpInstrumentY2_continue - rts - ; ------- -rmt_sfx - stx sfx_flag ; sfx priority (Pecus) - sta trackn_note,x - .IF FEAT_BASS16 - sta trackn_outnote,x - .ENDIF - lda RMTSFXVOLUME ;* sfx note volume*16 - sta trackn_volume,x - .ENDIF -SetUpInstrumentY2_continue - lda (p_instrstable),y - sta trackn_instrdb,x - sta nt - iny - lda (p_instrstable),y - sta trackn_instrhb,x - sta nt+1 - .IF FEAT_FILTER - lda #1 - sta trackn_filter,x - .ENDIF - .IF FEAT_TABLEGO - .IF FEAT_FILTER - tay - .ELSE - ldy #1 - .ENDIF - lda (nt),y - sta trackn_tablelop,x - iny - .ELSE - ldy #2 - .ENDIF - lda (nt),y - sta trackn_instrlen,x - iny - lda (nt),y - sta trackn_instrlop,x - iny - lda (nt),y - sta trackn_tabletypespeed,x - .IF FEAT_TABLETYPE||FEAT_TABLEMODE - and #$3f - .ENDIF - sta trackn_tablespeeda,x - .IF FEAT_TABLEMODE - lda (nt),y - and #$40 - sta trackn_tablemode,x - .ENDIF - .IF FEAT_AUDCTLMANUALSET - iny - lda (nt),y - sta trackn_audctl,x - iny - .ELSE - ldy #6 - .ENDIF - lda (nt),y - sta trackn_volumeslidedepth,x - .IF FEAT_VOLUMEMIN - iny - lda (nt),y - sta trackn_volumemin,x - .IF FEAT_EFFECTS - iny - .ENDIF - .ELSE - .IF FEAT_EFFECTS - ldy #8 - .ENDIF - .ENDIF - .IF FEAT_EFFECTS - lda (nt),y - sta trackn_effdelay,x - .IF FEAT_EFFECTVIBRATO - iny - lda (nt),y - tay - lda vibtabbeg,y - sta trackn_effvibratoa,x - .ENDIF - .IF FEAT_EFFECTFSHIFT - ldy #10 - lda (nt),y - sta trackn_effshift,x - .ENDIF - .ENDIF - lda #128 - sta trackn_volumeslidevalue,x - sta trackn_instrx2,x - asl @ - sta trackn_instrreachend,x - sta trackn_shiftfrq,x - tay - lda (nt),y - sta trackn_tableend,x - adc #0 - sta trackn_instridx,x - lda #INSTRPAR - sta trackn_tablea,x - tay - lda (nt),y - sta trackn_tablenote,x -xata_rtshere - .IF FEAT_SFX - rts - .ELSE - jmp p2x0 - .ENDIF -rmt_play -rmt_p0 - jsr SetPokey -rmt_p1 - .IF FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1 - dec v_ainstrspeed - bne rmt_p3 - .ENDIF - .IF FEAT_INSTRSPEED==0 - lda #$ff -v_instrspeed equ *-1 - sta v_ainstrspeed - .ELSEIF FEAT_INSTRSPEED>1 - lda #FEAT_INSTRSPEED - sta v_ainstrspeed - .ENDIF -rmt_p2 - dec v_aspeed - bne rmt_p3 - inc v_abeat - lda v_abeat - cmp v_maxtracklen - beq p2o3 - jmp GetTrackLine -p2o3 - jmp GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 -go_ppnext - jmp ppnext -rmt_p3 - lda #>frqtab - sta nr+1 -xtracks05sub1 ldx #TRACKS-1 -pp1 - lda trackn_instrhb,x - beq go_ppnext - sta ns+1 - lda trackn_instrdb,x - sta ns - ldy trackn_instridx,x - lda (ns),y - sta reg1 - iny - lda (ns),y - sta reg2 - iny - lda (ns),y - sta reg3 - iny - tya - cmp trackn_instrlen,x - bcc pp2 - beq pp2 - lda #$80 - sta trackn_instrreachend,x - ; sfx priority (Pecus) - .IF FEAT_SFX - cpx sfx_flag - bne no_this_channel - sta sfx_flag ; $80 -no_this_channel - .ENDIF - ; -------- -pp1b - lda trackn_instrlop,x -pp2 sta trackn_instridx,x - lda reg1 - .IF TRACKS>4 - cpx #4 - bcc pp2s - lsr @ - lsr @ - lsr @ - lsr @ -pp2s - .ENDIF - and #$0f - ora trackn_volume,x - tay - lda volumetab,y - sta tmp - lda reg2 - and #$0e - tay - lda tabbeganddistor,y - sta nr - lda tmp - ora tabbeganddistor+1,y - sta trackn_audc,x -InstrumentsEffects - .IF FEAT_EFFECTS - lda trackn_effdelay,x - beq ei2 - cmp #1 - bne ei1 - lda trackn_shiftfrq,x - .IF FEAT_EFFECTFSHIFT - clc - adc trackn_effshift,x - .ENDIF - .IF FEAT_EFFECTVIBRATO - clc - ldy trackn_effvibratoa,x - adc vib0,y - .ENDIF - sta trackn_shiftfrq,x - .IF FEAT_EFFECTVIBRATO - lda vibtabnext,y - sta trackn_effvibratoa,x - .ENDIF - jmp ei2 -ei1 - dec trackn_effdelay,x -ei2 - .ENDIF - ldy trackn_tableend,x - cpy #INSTRPAR+1 - bcc ei3 - lda trackn_tablespeeda,x - bpl ei2f -ei2c - tya - cmp trackn_tablea,x - bne ei2c2 - .IF FEAT_TABLEGO - lda trackn_tablelop,x - .ELSE - lda #INSTRPAR - .ENDIF - sta trackn_tablea,x - bne ei2a -ei2c2 - inc trackn_tablea,x -ei2a - lda trackn_instrdb,x - sta nt - lda trackn_instrhb,x - sta nt+1 - ldy trackn_tablea,x - lda (nt),y - .IF FEAT_TABLEMODE - ldy trackn_tablemode,x - beq ei2e - clc - adc trackn_tablenote,x -ei2e - .ENDIF - sta trackn_tablenote,x - lda trackn_tabletypespeed,x - .IF FEAT_TABLETYPE||FEAT_TABLEMODE - and #$3f - .ENDIF -ei2f - sec - sbc #1 - sta trackn_tablespeeda,x -ei3 - lda trackn_instrreachend,x - bpl ei4 - lda trackn_volume,x - beq ei4 - .IF FEAT_VOLUMEMIN - cmp trackn_volumemin,x - beq ei4 - bcc ei4 - .ENDIF - tay - lda trackn_volumeslidevalue,x - clc - adc trackn_volumeslidedepth,x - sta trackn_volumeslidevalue,x - bcc ei4 - tya - sbc #16 - sta trackn_volume,x -ei4 - .IF FEAT_COMMAND2 - lda #0 - sta frqaddcmd2 - .ENDIF - .IF FEAT_COMMAND1||FEAT_COMMAND2||FEAT_COMMAND3||FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY - lda reg2 - .IF FEAT_FILTER||FEAT_BASS16 - sta trackn_command,x - .ENDIF - and #$70 - .IF 1==[FEAT_COMMAND1+FEAT_COMMAND2+FEAT_COMMAND3+FEAT_COMMAND4+FEAT_COMMAND5+FEAT_COMMAND6+[FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY]] - beq cmd0 - .ELSE - ; de-self-modification routine by Pecus - lsr @ - lsr @ - lsr @ - tay - lda cmdroutines+1,y - pha - lda cmdroutines,y - pha - rts -cmdroutines - .word cmd0-1 - .word cmd1-1 - .word cmd2-1 - .word cmd3-1 - .word cmd4-1 - .word cmd5-1 - .word cmd6-1 - .word cmd7-1 - ; end of de-self-modification routine - .ENDIF - .ELSE - .IF FEAT_FILTER||FEAT_BASS16 - lda reg2 - sta trackn_command,x - .ENDIF - .ENDIF -cmd1 - .IF FEAT_COMMAND1 - lda reg3 - jmp cmd0c - .ENDIF -cmd2 - .IF FEAT_COMMAND2 - lda reg3 - sta frqaddcmd2 - lda trackn_note,x - jmp cmd0a - .ENDIF -cmd3 - .IF FEAT_COMMAND3 - lda trackn_note,x - clc - adc reg3 - sta trackn_note,x - jmp cmd0a - .ENDIF -cmd4 - .IF FEAT_COMMAND4 - lda trackn_shiftfrq,x - clc - adc reg3 - sta trackn_shiftfrq,x - lda trackn_note,x - jmp cmd0a - .ENDIF -cmd5 - .IF FEAT_COMMAND5&&FEAT_PORTAMENTO - .IF FEAT_TABLETYPE - lda trackn_tabletypespeed,x - bpl cmd5a1 - ldy trackn_note,x - lda (nr),y - clc - adc trackn_tablenote,x - jmp cmd5ax - .ENDIF -cmd5a1 - lda trackn_note,x - clc - adc trackn_tablenote,x - cmp #61 - bcc cmd5a2 - lda #63 -cmd5a2 - tay - lda (nr),y -cmd5ax - sta trackn_portafrqc,x - ldy reg3 - bne cmd5a - sta trackn_portafrqa,x -cmd5a - tya - lsr @ - lsr @ - lsr @ - lsr @ - sta trackn_portaspeed,x - sta trackn_portaspeeda,x - lda reg3 - and #$0f - sta trackn_portadepth,x - lda trackn_note,x - jmp cmd0a - .ELSEIF FEAT_COMMAND5 - lda trackn_note,x - jmp cmd0a - .ENDIF -cmd6 - .IF FEAT_COMMAND6&&FEAT_FILTER - lda reg3 - clc - adc trackn_filter,x - sta trackn_filter,x - lda trackn_note,x - jmp cmd0a - .ELSEIF FEAT_COMMAND6 - lda trackn_note,x - jmp cmd0a - .ENDIF -cmd7 - .IF FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY - .IF FEAT_COMMAND7SETNOTE - lda reg3 - .IF FEAT_COMMAND7VOLUMEONLY - cmp #$80 - beq cmd7a - .ENDIF - sta trackn_note,x - jmp cmd0a - .ENDIF - .IF FEAT_COMMAND7VOLUMEONLY -cmd7a - lda trackn_audc,x - ora #$f0 - sta trackn_audc,x - lda trackn_note,x - jmp cmd0a - .ENDIF - .ENDIF -cmd0 - lda trackn_note,x - clc - adc reg3 -cmd0a - .IF FEAT_TABLETYPE - ldy trackn_tabletypespeed,x - bmi cmd0b - .ENDIF - clc - adc trackn_tablenote,x - cmp #61 - bcc cmd0a1 - lda #0 - sta trackn_audc,x - lda #63 -cmd0a1 - .IF FEAT_BASS16 - sta trackn_outnote,x - .ENDIF - tay - lda (nr),y - clc - adc trackn_shiftfrq,x - .IF FEAT_COMMAND2 - clc - adc frqaddcmd2 - .ENDIF - .IF FEAT_TABLETYPE - jmp cmd0c -cmd0b - cmp #61 - bcc cmd0b1 - lda #0 - sta trackn_audc,x - lda #63 -cmd0b1 - tay - lda trackn_shiftfrq,x - clc - adc trackn_tablenote,x - clc - adc (nr),y - .IF FEAT_COMMAND2 - clc - adc frqaddcmd2 - .ENDIF - .ENDIF -cmd0c - sta trackn_audf,x -pp9 - .IF FEAT_PORTAMENTO - lda trackn_portaspeeda,x - beq pp10 - dec trackn_portaspeeda,x - bne pp10 - lda trackn_portaspeed,x - sta trackn_portaspeeda,x - lda trackn_portafrqa,x - cmp trackn_portafrqc,x - beq pp10 - bcs pps1 - adc trackn_portadepth,x - bcs pps8 - cmp trackn_portafrqc,x - bcs pps8 - jmp pps9 -pps1 - sbc trackn_portadepth,x - bcc pps8 - cmp trackn_portafrqc,x - bcs pps9 -pps8 - lda trackn_portafrqc,x -pps9 - sta trackn_portafrqa,x -pp10 - lda reg2 - and #$01 - beq pp11 - lda trackn_portafrqa,x - clc - adc trackn_shiftfrq,x - sta trackn_audf,x -pp11 - .ENDIF -ppnext - dex - bmi rmt_p4 - jmp pp1 -rmt_p4 - .IF FEAT_AUDCTLMANUALSET - lda trackn_audctl+0 - ora trackn_audctl+1 - ora trackn_audctl+2 - ora trackn_audctl+3 - tax - .ELSE - ldx #0 - .ENDIF -qq1 - stx v_audctl - .IF FEAT_FILTER - .IF FEAT_FILTERG0L - lda trackn_command+0 - bpl qq2 - lda trackn_audc+0 - and #$0f - beq qq2 - lda trackn_audf+0 - clc - adc trackn_filter+0 - sta trackn_audf+2 - .IF FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2L - lda trackn_audc+2 - and #$10 - bne qq1a - .ENDIF - lda #0 - sta trackn_audc+2 -qq1a - txa - ora #4 - tax - .ENDIF -qq2 - .IF FEAT_FILTERG1L - lda trackn_command+1 - bpl qq3 - lda trackn_audc+1 - and #$0f - beq qq3 - lda trackn_audf+1 - clc - adc trackn_filter+1 - sta trackn_audf+3 - .IF FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG3L - lda trackn_audc+3 - and #$10 - bne qq2a - .ENDIF - lda #0 - sta trackn_audc+3 -qq2a - txa - ora #2 - tax - .ENDIF -qq3 - .IF FEAT_FILTERG0L||FEAT_FILTERG1L - cpx v_audctl - bne qq5 - .ENDIF - .ENDIF - .IF FEAT_BASS16 - .IF FEAT_BASS16G1L - lda trackn_command+1 - and #$0e - cmp #6 - bne qq4 - lda trackn_audc+1 - and #$0f - beq qq4 - ldy trackn_outnote+1 - lda frqtabbasslo,y - sta trackn_audf+0 - lda frqtabbasshi,y - sta trackn_audf+1 - .IF FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG0L - lda trackn_audc+0 - and #$10 - bne qq3a - .ENDIF - lda #0 - sta trackn_audc+0 -qq3a - txa - ora #$50 - tax - .ENDIF -qq4 - .IF FEAT_BASS16G3L - lda trackn_command+3 - and #$0e - cmp #6 - bne qq5 - lda trackn_audc+3 - and #$0f - beq qq5 - ldy trackn_outnote+3 - lda frqtabbasslo,y - sta trackn_audf+2 - lda frqtabbasshi,y - sta trackn_audf+3 - .IF FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2L - lda trackn_audc+2 - and #$10 - bne qq4a - .ENDIF - lda #0 - sta trackn_audc+2 -qq4a - txa - ora #$28 - tax - .ENDIF - .ENDIF -qq5 - stx v_audctl - .IF TRACKS>4 - .IF FEAT_AUDCTLMANUALSET - lda trackn_audctl+4 - ora trackn_audctl+5 - ora trackn_audctl+6 - ora trackn_audctl+7 - tax - .ELSE - ldx #0 - .ENDIF - stx v_audctl2 - .IF FEAT_FILTER - .IF FEAT_FILTERG0R - lda trackn_command+0+4 - bpl qs2 - lda trackn_audc+0+4 - and #$0f - beq qs2 - lda trackn_audf+0+4 - clc - adc trackn_filter+0+4 - sta trackn_audf+2+4 - .IF FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2R - lda trackn_audc+2+4 - and #$10 - bne qs1a - .ENDIF - lda #0 - sta trackn_audc+2+4 -qs1a - txa - ora #4 - tax - .ENDIF -qs2 - .IF FEAT_FILTERG1R - lda trackn_command+1+4 - bpl qs3 - lda trackn_audc+1+4 - and #$0f - beq qs3 - lda trackn_audf+1+4 - clc - adc trackn_filter+1+4 - sta trackn_audf+3+4 - .IF FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG3R - lda trackn_audc+3+4 - and #$10 - bne qs2a - .ENDIF - lda #0 - sta trackn_audc+3+4 -qs2a - txa - ora #2 - tax - .ENDIF -qs3 - .IF FEAT_FILTERG0R||FEAT_FILTERG1R - cpx v_audctl2 - bne qs5 - .ENDIF - .ENDIF - .IF FEAT_BASS16 - .IF FEAT_BASS16G1R - lda trackn_command+1+4 - and #$0e - cmp #6 - bne qs4 - lda trackn_audc+1+4 - and #$0f - beq qs4 - ldy trackn_outnote+1+4 - lda frqtabbasslo,y - sta trackn_audf+0+4 - lda frqtabbasshi,y - sta trackn_audf+1+4 - .IF FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG0R - lda trackn_audc+0+4 - and #$10 - bne qs3a - .ENDIF - lda #0 - sta trackn_audc+0+4 -qs3a - txa - ora #$50 - tax - .ENDIF -qs4 - .IF FEAT_BASS16G3R - lda trackn_command+3+4 - and #$0e - cmp #6 - bne qs5 - lda trackn_audc+3+4 - and #$0f - beq qs5 - ldy trackn_outnote+3+4 - lda frqtabbasslo,y - sta trackn_audf+2+4 - lda frqtabbasshi,y - sta trackn_audf+3+4 - .IF FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2R - lda trackn_audc+2+4 - and #$10 - bne qs4a - .ENDIF - lda #0 - sta trackn_audc+2+4 -qs4a - txa - ora #$28 - tax - .ENDIF - .ENDIF -qs5 - stx v_audctl2 - .ENDIF -rmt_p5 - .IF FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1 - lda v_ainstrspeed - .ELSE - lda #1 - .ENDIF - .IF PSEUDOSTEREO==1&&STEREOMODE==0 - ldy #$10 - bne SetPokey_OffsetY - .ENDIF - rts -SetPokey - .IF STEREOMODE==1 ;* L1 L2 L3 L4 R1 R2 R3 R4 - ldy v_audctl2 - lda trackn_audf+0+4 - ldx trackn_audf+0 -xstastx01 sta $d210 - stx $d200 - lda trackn_audc+0+4 - ldx trackn_audc+0 -xstastx02 sta $d211 - stx $d201 - lda trackn_audf+1+4 - ldx trackn_audf+1 -xstastx03 sta $d212 - stx $d202 - lda trackn_audc+1+4 - ldx trackn_audc+1 -xstastx04 sta $d213 - stx $d203 - lda trackn_audf+2+4 - ldx trackn_audf+2 -xstastx05 sta $d214 - stx $d204 - lda trackn_audc+2+4 - ldx trackn_audc+2 -xstastx06 sta $d215 - stx $d205 - lda trackn_audf+3+4 - ldx trackn_audf+3 -xstastx07 sta $d216 - stx $d206 - lda trackn_audc+3+4 - ldx trackn_audc+3 -xstastx08 sta $d217 - stx $d207 - lda v_audctl -xstysta01 sty $d218 - sta $d208 - .ELSEIF STEREOMODE==0 ;* L1 L2 L3 L4 - ldy #$00 -SetPokey_OffsetY - lda trackn_audf+0 - sta $d200,y - lda trackn_audc+0 - sta $d201,y - lda trackn_audf+1 - sta $d200+2,y - lda trackn_audc+1 - sta $d201+2,y - lda trackn_audf+2 - sta $d200+4,y - lda trackn_audc+2 - sta $d201+4,y - lda trackn_audf+3 - sta $d200+6,y - lda trackn_audc+3 - sta $d201+6,y - lda v_audctl - sta $d208,y - .ELSEIF STEREOMODE==2 ;* L1 R2 R3 L4 - ldy v_audctl - lda trackn_audf+0 - ldx trackn_audc+0 - sta $d200 - stx $d201 - sta $d210 - lda trackn_audf+1 - ldx trackn_audc+1 - sta $d210+2 - stx $d211+2 - lda trackn_audf+2 - ldx trackn_audc+2 - sta $d210+4 - stx $d211+4 - sta $d200+4 - lda trackn_audf+3 - ldx trackn_audc+3 - sta $d200+6 - stx $d201+6 - sta $d210+6 - sty $d218 - sty $d208 - .ELSEIF STEREOMODE==3 ;* L1 L2 R3 R4 - ldy v_audctl - lda trackn_audf+0 - ldx trackn_audc+0 - sta $d200 - stx $d201 - lda trackn_audf+1 - ldx trackn_audc+1 - sta $d200+2 - stx $d201+2 - lda trackn_audf+2 - ldx trackn_audc+2 - sta $d210+4 - stx $d211+4 - sta $d200+4 - lda trackn_audf+3 - ldx trackn_audc+3 - sta $d210+6 - stx $d211+6 - sta $d200+6 - sty $d218 - sty $d208 - .ENDIF - rts -RMTPLAYEREND