From 192b1b01dc7a906e8a8e402b2c553575a20c1729 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Tue, 9 Aug 2022 22:32:16 +0200 Subject: [PATCH] New old RMT player and bugfix --- artwork/sfx/rmt_feat.a65 | 41 ++ artwork/sfx/rmt_feat.asm | 1 + artwork/sfx/rmtplayr.a65 | 1356 ++++++++++++++++++++++++++++++++++++++ scorch.asm | 72 +- scorch.xex | Bin 43561 -> 43502 bytes textproc.asm | 2 +- variables.asm | 2 - weapons.asm | 2 + 8 files changed, 1446 insertions(+), 30 deletions(-) create mode 100644 artwork/sfx/rmt_feat.a65 create mode 100644 artwork/sfx/rmtplayr.a65 diff --git a/artwork/sfx/rmt_feat.a65 b/artwork/sfx/rmt_feat.a65 new file mode 100644 index 0000000..eafd077 --- /dev/null +++ b/artwork/sfx/rmt_feat.a65 @@ -0,0 +1,41 @@ +STEREOMODE equ 0 +;* --------BEGIN-------- +;* C:\Atari\rmt\rmt128\aaa.rmt +FEAT_SFX equ 1 +FEAT_GLOBALVOLUMEFADE equ 0 ;RMTGLOBALVOLUMEFADE variable +FEAT_NOSTARTINGSONGLINE equ 0 +FEAT_INSTRSPEED equ 1 +FEAT_CONSTANTSPEED equ 0 ;(18 times) +FEAT_COMMAND1 equ 1 ;(10 times) +FEAT_COMMAND2 equ 0 ;(0 times) +FEAT_COMMAND3 equ 0 ;(0 times) +FEAT_COMMAND4 equ 0 ;(0 times) +FEAT_COMMAND5 equ 0 ;(0 times) +FEAT_COMMAND6 equ 1 ;(2 times) +FEAT_COMMAND7SETNOTE equ 0 ;(0 times) +FEAT_COMMAND7VOLUMEONLY equ 0 ;(0 times) +FEAT_PORTAMENTO equ 0 ;(0 times) +FEAT_FILTER equ 1 ;(22 times) +FEAT_FILTERG0L equ 1 ;(13 times) +FEAT_FILTERG1L equ 1 ;(22 times) +FEAT_FILTERG0R equ 0 ;(0 times) +FEAT_FILTERG1R equ 0 ;(0 times) +FEAT_BASS16 equ 0 ;(0 times) +FEAT_BASS16G1L equ 0 ;(0 times) +FEAT_BASS16G3L equ 0 ;(0 times) +FEAT_BASS16G1R equ 0 ;(0 times) +FEAT_BASS16G3R equ 0 ;(0 times) +FEAT_VOLUMEONLYG0L equ 0 ;(0 times) +FEAT_VOLUMEONLYG2L equ 0 ;(0 times) +FEAT_VOLUMEONLYG3L equ 0 ;(0 times) +FEAT_VOLUMEONLYG0R equ 0 ;(0 times) +FEAT_VOLUMEONLYG2R equ 0 ;(0 times) +FEAT_VOLUMEONLYG3R equ 0 ;(0 times) +FEAT_TABLETYPE equ 0 ;(0 times) +FEAT_TABLEMODE equ 0 ;(0 times) +FEAT_TABLEGO equ 0 ;(0 times) +FEAT_AUDCTLMANUALSET equ 0 ;(0 times) +FEAT_VOLUMEMIN equ 0 ;(0 times) +FEAT_EFFECTVIBRATO equ 1 ;(1 times) +FEAT_EFFECTFSHIFT equ 0 ;(0 times) +;* --------END-------- \ No newline at end of file diff --git a/artwork/sfx/rmt_feat.asm b/artwork/sfx/rmt_feat.asm index c5a2bc3..eafd077 100644 --- a/artwork/sfx/rmt_feat.asm +++ b/artwork/sfx/rmt_feat.asm @@ -1,3 +1,4 @@ +STEREOMODE equ 0 ;* --------BEGIN-------- ;* C:\Atari\rmt\rmt128\aaa.rmt FEAT_SFX equ 1 diff --git a/artwork/sfx/rmtplayr.a65 b/artwork/sfx/rmtplayr.a65 new file mode 100644 index 0000000..0e8c70c --- /dev/null +++ b/artwork/sfx/rmtplayr.a65 @@ -0,0 +1,1356 @@ +;* +;* Raster Music Tracker, RMT Atari routine version 1.20090108 +;* (c) Radek Sterba, Raster/C.P.U., 2002 - 2009 +;* http://raster.atari.org +;* +;* 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 +;* + IFT STEREOMODE==1 +TRACKS equ 8 + ELS +TRACKS equ 4 + EIF +;* +;*PLAYER equ $3400 +;* +;* RMT FEATures definitions file +;* For optimizations of RMT player routine to concrete RMT modul only! + icl "rmt_feat.a65" +;* +;* RMT ZeroPage addresses + org RMT_Zero_Page_V +p_tis +p_instrstable org *+2 +p_trackslbstable org *+2 +p_trackshbstable org *+2 +p_song org *+2 +ns org *+2 +nr org *+2 +nt org *+2 +reg1 org *+1 +reg2 org *+1 +reg3 org *+1 +tmp org *+1 + IFT FEAT_COMMAND2 +frqaddcmd2 org *+1 + EIF + IFT TRACKS>4 + org PLAYER-$400+$40 + ELS + org PLAYER-$400+$e0 + EIF +track_variables +trackn_db org *+TRACKS +trackn_hb org *+TRACKS +trackn_idx org *+TRACKS +trackn_pause org *+TRACKS +trackn_note org *+TRACKS +trackn_volume org *+TRACKS +trackn_distor org *+TRACKS +trackn_shiftfrq org *+TRACKS + IFT FEAT_PORTAMENTO +trackn_portafrqc org *+TRACKS +trackn_portafrqa org *+TRACKS +trackn_portaspeed org *+TRACKS +trackn_portaspeeda org *+TRACKS +trackn_portadepth org *+TRACKS + EIF +trackn_instrx2 org *+TRACKS +trackn_instrdb org *+TRACKS +trackn_instrhb org *+TRACKS +trackn_instridx org *+TRACKS +trackn_instrlen org *+TRACKS +trackn_instrlop org *+TRACKS +trackn_instrreachend org *+TRACKS +trackn_volumeslidedepth org *+TRACKS +trackn_volumeslidevalue org *+TRACKS + IFT FEAT_VOLUMEMIN +trackn_volumemin org *+TRACKS + EIF +FEAT_EFFECTS equ FEAT_EFFECTVIBRATO||FEAT_EFFECTFSHIFT + IFT FEAT_EFFECTS +trackn_effdelay org *+TRACKS + EIF + IFT FEAT_EFFECTVIBRATO +trackn_effvibratoa org *+TRACKS + EIF + IFT FEAT_EFFECTFSHIFT +trackn_effshift org *+TRACKS + EIF +trackn_tabletypespeed org *+TRACKS + IFT FEAT_TABLEMODE +trackn_tablemode org *+TRACKS + EIF +trackn_tablenote org *+TRACKS +trackn_tablea org *+TRACKS +trackn_tableend org *+TRACKS + IFT FEAT_TABLEGO +trackn_tablelop org *+TRACKS + EIF +trackn_tablespeeda org *+TRACKS + IFT FEAT_FILTER||FEAT_BASS16 +trackn_command org *+TRACKS + EIF + IFT FEAT_BASS16 +trackn_outnote org *+TRACKS + EIF + IFT FEAT_FILTER +trackn_filter org *+TRACKS + EIF +trackn_audf org *+TRACKS +trackn_audc org *+TRACKS + IFT FEAT_AUDCTLMANUALSET +trackn_audctl org *+TRACKS + EIF +v_aspeed org *+1 +track_endvariables + 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 + IFT 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 + EIF + org PLAYER-$100-$140 + IFT 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 + EIF + org PLAYER-$100-$100 +frqtab + ERT [255 + ldy #0 + tya +ri0 sta track_variables,y + sta track_endvariables-$100,y + iny + bne ri0 + ELS + ldy #track_endvariables-track_variables + lda #0 +ri0 sta track_variables-1,y + dey + bne ri0 + EIF + ldy #4 + lda (ns),y + sta v_maxtracklen + iny + IFT FEAT_CONSTANTSPEED==0 + lda (ns),y + sta v_speed + EIF + IFT FEAT_INSTRSPEED==0 + iny + lda (ns),y + sta v_instrspeed + sta v_ainstrspeed + ELI FEAT_INSTRSPEED>1 + lda #FEAT_INSTRSPEED + sta v_ainstrspeed + EIF + ldy #8 +ri1 lda (ns),y + sta p_tis-8,y + iny + cpy #8+8 + bne ri1 + IFT FEAT_NOSTARTINGSONGLINE==0 + pla + pha + IFT TRACKS>4 + asl @ + asl @ + asl @ + clc + adc p_song + sta p_song + pla + php + and #$e0 + asl @ + rol @ + rol @ + rol @ + ELS + asl @ + asl @ + clc + adc p_song + sta p_song + pla + php + and #$c0 + asl @ + rol @ + rol @ + EIF + plp + adc p_song+1 + sta p_song+1 + EIF + jsr GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 +rmt_silence + IFT 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 + ELS + lda #0 + sta $d208 + ldy #3 + sty $d20f + ldy #8 +si1 sta $d200,y + dey + bpl si1 + EIF + IFT FEAT_INSTRSPEED==0 + lda v_instrspeed + ELS + lda #FEAT_INSTRSPEED + EIF + 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 + IFT FEAT_CONSTANTSPEED==0 + lda #$ff +v_speed equ *-1 + sta v_bspeed + EIF + 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 + IFT FEAT_BASS16 + sta trackn_outnote,x + EIF + 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 + IFT FEAT_GLOBALVOLUMEFADE + sec + sbc #$00 +RMTGLOBALVOLUMEFADE equ *-1 + bcs voig + lda #0 +voig + EIF + and #$f0 + sta trackn_volume,x +oo1x +xtracks03sub1 cpx #TRACKS-1 + bne oo1 + IFT FEAT_CONSTANTSPEED==0 + lda #$ff +v_bspeed equ *-1 + sta v_speed + ELS + lda #FEAT_CONSTANTSPEED + EIF + 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 + IFT FEAT_CONSTANTSPEED==0 + bmi oo63_1X + iny + lda (ns),y + sta v_bspeed + inc trackn_idx,x + jmp oo1i +oo63_1X + EIF + 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 + IFT FEAT_SFX + jsr SetUpInstrumentY2 + jmp p2x0 +rmt_sfx + sta trackn_note,x + IFT FEAT_BASS16 + sta trackn_outnote,x + EIF + lda #$f0 ;* sfx note volume*16 +RMTSFXVOLUME equ *-1 ;* label for sfx note volume parameter overwriting + sta trackn_volume,x + EIF +SetUpInstrumentY2 + lda (p_instrstable),y + sta trackn_instrdb,x + sta nt + iny + lda (p_instrstable),y + sta trackn_instrhb,x + sta nt+1 + IFT FEAT_FILTER + lda #1 + sta trackn_filter,x + EIF + IFT FEAT_TABLEGO + IFT FEAT_FILTER + tay + ELS + ldy #1 + EIF + lda (nt),y + sta trackn_tablelop,x + iny + ELS + ldy #2 + EIF + lda (nt),y + sta trackn_instrlen,x + iny + lda (nt),y + sta trackn_instrlop,x + iny + lda (nt),y + sta trackn_tabletypespeed,x + IFT FEAT_TABLETYPE||FEAT_TABLEMODE + and #$3f + EIF + sta trackn_tablespeeda,x + IFT FEAT_TABLEMODE + lda (nt),y + and #$40 + sta trackn_tablemode,x + EIF + IFT FEAT_AUDCTLMANUALSET + iny + lda (nt),y + sta trackn_audctl,x + iny + ELS + ldy #6 + EIF + lda (nt),y + sta trackn_volumeslidedepth,x + IFT FEAT_VOLUMEMIN + iny + lda (nt),y + sta trackn_volumemin,x + IFT FEAT_EFFECTS + iny + EIF + ELS + IFT FEAT_EFFECTS + ldy #8 + EIF + EIF + IFT FEAT_EFFECTS + lda (nt),y + sta trackn_effdelay,x + IFT FEAT_EFFECTVIBRATO + iny + lda (nt),y + tay + lda vibtabbeg,y + sta trackn_effvibratoa,x + EIF + IFT FEAT_EFFECTFSHIFT + ldy #10 + lda (nt),y + sta trackn_effshift,x + EIF + EIF + 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 + IFT FEAT_SFX + rts + ELS + jmp p2x0 + EIF +rmt_play +rmt_p0 + jsr SetPokey +rmt_p1 + IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1 + dec v_ainstrspeed + bne rmt_p3 + EIF + IFT FEAT_INSTRSPEED==0 + lda #$ff +v_instrspeed equ *-1 + sta v_ainstrspeed + ELI FEAT_INSTRSPEED>1 + lda #FEAT_INSTRSPEED + sta v_ainstrspeed + EIF +rmt_p2 + dec v_aspeed + bne rmt_p3 + inc v_abeat + lda #$ff +v_abeat equ *-1 + cmp #$ff +v_maxtracklen equ *-1 + 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 +pp1b + lda trackn_instrlop,x +pp2 sta trackn_instridx,x + lda reg1 + IFT TRACKS>4 + cpx #4 + bcc pp2s + lsr @ + lsr @ + lsr @ + lsr @ +pp2s + EIF + 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 + IFT FEAT_EFFECTS + lda trackn_effdelay,x + beq ei2 + cmp #1 + bne ei1 + lda trackn_shiftfrq,x + IFT FEAT_EFFECTFSHIFT + clc + adc trackn_effshift,x + EIF + IFT FEAT_EFFECTVIBRATO + clc + ldy trackn_effvibratoa,x + adc vib0,y + EIF + sta trackn_shiftfrq,x + IFT FEAT_EFFECTVIBRATO + lda vibtabnext,y + sta trackn_effvibratoa,x + EIF + jmp ei2 +ei1 + dec trackn_effdelay,x +ei2 + EIF + ldy trackn_tableend,x + cpy #INSTRPAR+1 + bcc ei3 + lda trackn_tablespeeda,x + bpl ei2f +ei2c + tya + cmp trackn_tablea,x + bne ei2c2 + IFT FEAT_TABLEGO + lda trackn_tablelop,x + ELS + lda #INSTRPAR + EIF + 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 + IFT FEAT_TABLEMODE + ldy trackn_tablemode,x + beq ei2e + clc + adc trackn_tablenote,x +ei2e + EIF + sta trackn_tablenote,x + lda trackn_tabletypespeed,x + IFT FEAT_TABLETYPE||FEAT_TABLEMODE + and #$3f + EIF +ei2f + sec + sbc #1 + sta trackn_tablespeeda,x +ei3 + lda trackn_instrreachend,x + bpl ei4 + lda trackn_volume,x + beq ei4 + IFT FEAT_VOLUMEMIN + cmp trackn_volumemin,x + beq ei4 + bcc ei4 + EIF + tay + lda trackn_volumeslidevalue,x + clc + adc trackn_volumeslidedepth,x + sta trackn_volumeslidevalue,x + bcc ei4 + tya + sbc #16 + sta trackn_volume,x +ei4 + IFT FEAT_COMMAND2 + lda #0 + sta frqaddcmd2 + EIF + IFT FEAT_COMMAND1||FEAT_COMMAND2||FEAT_COMMAND3||FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + lda reg2 + IFT FEAT_FILTER||FEAT_BASS16 + sta trackn_command,x + EIF + and #$70 + IFT 1==[FEAT_COMMAND1+FEAT_COMMAND2+FEAT_COMMAND3+FEAT_COMMAND4+FEAT_COMMAND5+FEAT_COMMAND6+[FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY]] + beq cmd0 + ELS + lsr @ + lsr @ + sta jmx+1 +jmx bcc * + jmp cmd0 + nop + jmp cmd1 + IFT FEAT_COMMAND2||FEAT_COMMAND3||FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd2 + EIF + IFT FEAT_COMMAND3||FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd3 + EIF + IFT FEAT_COMMAND4||FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd4 + EIF + IFT FEAT_COMMAND5||FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd5 + EIF + IFT FEAT_COMMAND6||FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd6 + EIF + IFT FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + nop + jmp cmd7 + EIF + EIF + ELS + IFT FEAT_FILTER||FEAT_BASS16 + lda reg2 + sta trackn_command,x + EIF + EIF +cmd1 + IFT FEAT_COMMAND1 + lda reg3 + jmp cmd0c + EIF +cmd2 + IFT FEAT_COMMAND2 + lda reg3 + sta frqaddcmd2 + lda trackn_note,x + jmp cmd0a + EIF +cmd3 + IFT FEAT_COMMAND3 + lda trackn_note,x + clc + adc reg3 + sta trackn_note,x + jmp cmd0a + EIF +cmd4 + IFT FEAT_COMMAND4 + lda trackn_shiftfrq,x + clc + adc reg3 + sta trackn_shiftfrq,x + lda trackn_note,x + jmp cmd0a + EIF +cmd5 + IFT FEAT_COMMAND5&&FEAT_PORTAMENTO + IFT FEAT_TABLETYPE + lda trackn_tabletypespeed,x + bpl cmd5a1 + ldy trackn_note,x + lda (nr),y + clc + adc trackn_tablenote,x + jmp cmd5ax + EIF +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 + ELI FEAT_COMMAND5 + lda trackn_note,x + jmp cmd0a + EIF +cmd6 + IFT FEAT_COMMAND6&&FEAT_FILTER + lda reg3 + clc + adc trackn_filter,x + sta trackn_filter,x + lda trackn_note,x + jmp cmd0a + ELI FEAT_COMMAND6 + lda trackn_note,x + jmp cmd0a + EIF +cmd7 + IFT FEAT_COMMAND7SETNOTE||FEAT_COMMAND7VOLUMEONLY + IFT FEAT_COMMAND7SETNOTE + lda reg3 + IFT FEAT_COMMAND7VOLUMEONLY + cmp #$80 + beq cmd7a + EIF + sta trackn_note,x + jmp cmd0a + EIF + IFT FEAT_COMMAND7VOLUMEONLY +cmd7a + lda trackn_audc,x + ora #$f0 + sta trackn_audc,x + lda trackn_note,x + jmp cmd0a + EIF + EIF +cmd0 + lda trackn_note,x + clc + adc reg3 +cmd0a + IFT FEAT_TABLETYPE + ldy trackn_tabletypespeed,x + bmi cmd0b + EIF + clc + adc trackn_tablenote,x + cmp #61 + bcc cmd0a1 + lda #0 + sta trackn_audc,x + lda #63 +cmd0a1 + IFT FEAT_BASS16 + sta trackn_outnote,x + EIF + tay + lda (nr),y + clc + adc trackn_shiftfrq,x + IFT FEAT_COMMAND2 + clc + adc frqaddcmd2 + EIF + IFT 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 + IFT FEAT_COMMAND2 + clc + adc frqaddcmd2 + EIF + EIF +cmd0c + sta trackn_audf,x +pp9 + IFT 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 + EIF +ppnext + dex + bmi rmt_p4 + jmp pp1 +rmt_p4 + IFT FEAT_AUDCTLMANUALSET + lda trackn_audctl+0 + ora trackn_audctl+1 + ora trackn_audctl+2 + ora trackn_audctl+3 + tax + ELS + ldx #0 + EIF +qq1 + stx v_audctl + IFT FEAT_FILTER + IFT 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 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2L + lda trackn_audc+2 + and #$10 + bne qq1a + EIF + lda #0 + sta trackn_audc+2 +qq1a + txa + ora #4 + tax + EIF +qq2 + IFT 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 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG3L + lda trackn_audc+3 + and #$10 + bne qq2a + EIF + lda #0 + sta trackn_audc+3 +qq2a + txa + ora #2 + tax + EIF +qq3 + IFT FEAT_FILTERG0L||FEAT_FILTERG1L + cpx v_audctl + bne qq5 + EIF + EIF + IFT FEAT_BASS16 + IFT 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 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG0L + lda trackn_audc+0 + and #$10 + bne qq3a + EIF + lda #0 + sta trackn_audc+0 +qq3a + txa + ora #$50 + tax + EIF +qq4 + IFT 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 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2L + lda trackn_audc+2 + and #$10 + bne qq4a + EIF + lda #0 + sta trackn_audc+2 +qq4a + txa + ora #$28 + tax + EIF + EIF +qq5 + stx v_audctl + IFT TRACKS>4 + IFT FEAT_AUDCTLMANUALSET + lda trackn_audctl+4 + ora trackn_audctl+5 + ora trackn_audctl+6 + ora trackn_audctl+7 + tax + ELS + ldx #0 + EIF + stx v_audctl2 + IFT FEAT_FILTER + IFT 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 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2R + lda trackn_audc+2+4 + and #$10 + bne qs1a + EIF + lda #0 + sta trackn_audc+2+4 +qs1a + txa + ora #4 + tax + EIF +qs2 + IFT 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 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG3R + lda trackn_audc+3+4 + and #$10 + bne qs2a + EIF + lda #0 + sta trackn_audc+3+4 +qs2a + txa + ora #2 + tax + EIF +qs3 + IFT FEAT_FILTERG0R||FEAT_FILTERG1R + cpx v_audctl2 + bne qs5 + EIF + EIF + IFT FEAT_BASS16 + IFT 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 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG0R + lda trackn_audc+0+4 + and #$10 + bne qs3a + EIF + lda #0 + sta trackn_audc+0+4 +qs3a + txa + ora #$50 + tax + EIF +qs4 + IFT 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 + IFT FEAT_COMMAND7VOLUMEONLY&&FEAT_VOLUMEONLYG2R + lda trackn_audc+2+4 + and #$10 + bne qs4a + EIF + lda #0 + sta trackn_audc+2+4 +qs4a + txa + ora #$28 + tax + EIF + EIF +qs5 + stx v_audctl2 + EIF +rmt_p5 + IFT FEAT_INSTRSPEED==0||FEAT_INSTRSPEED>1 + lda #$ff +v_ainstrspeed equ *-1 + ELS + lda #1 + EIF + rts +SetPokey + IFT STEREOMODE==1 ;* L1 L2 L3 L4 R1 R2 R3 R4 + ldy #$ff +v_audctl2 equ *-1 + 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 #$ff +v_audctl equ *-1 +xstysta01 sty $d218 + sta $d208 + ELI STEREOMODE==0 ;* L1 L2 L3 L4 + ldy #$ff +v_audctl equ *-1 + 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 $d200+4 + stx $d201+4 + lda trackn_audf+3 + ldx trackn_audc+3 + sta $d200+6 + stx $d201+6 + sty $d208 + ELI STEREOMODE==2 ;* L1 R2 R3 L4 + ldy #$ff +v_audctl equ *-1 + 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 + ELI STEREOMODE==3 ;* L1 L2 R3 R4 + ldy #$ff +v_audctl equ *-1 + 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 + EIF + rts +RMTPLAYEREND diff --git a/scorch.asm b/scorch.asm index 52c5542..22bd47b 100644 --- a/scorch.asm +++ b/scorch.asm @@ -40,7 +40,7 @@ .endm icl 'definitions.asm' - icl 'artwork/sfx/rmt_feat.asm' +; icl 'artwork/sfx/rmt_feat.asm' .zpvar xdraw .word = $80 ;variable X for plot @@ -87,25 +87,30 @@ ;.zpvar dliA .byte ;.zpvar dliX .byte ;.zpvar dliY .byte + .zpvar sfx_effect .byte +;-------------- + + displayposition = modify + ;* RMT ZeroPage addresses - .zpvar p_tis .word - .zpvar p_trackslbstable .word - .zpvar p_trackshbstable .word - .zpvar p_song .word - .zpvar ns .word - .zpvar nr .word - .zpvar nt .word - .zpvar reg1 .byte - .zpvar reg2 .byte - .zpvar reg3 .byte - .zpvar tmp .byte - IFT FEAT_COMMAND2 - .zpvar frqaddcmd2 .byte - EIF - p_instrstable = p_tis + .zpvar RMT_Zero_Page_V .byte +; .zpvar p_tis .word +; .zpvar p_trackslbstable .word +; .zpvar p_trackshbstable .word +; .zpvar p_song .word +; .zpvar ns .word +; .zpvar nr .word +; .zpvar nt .word +; .zpvar reg1 .byte +; .zpvar reg2 .byte +; .zpvar reg3 .byte +; .zpvar tmp .byte +; IFT FEAT_COMMAND2 +; .zpvar frqaddcmd2 .byte +; EIF +; p_instrstable = p_tis - displayposition = modify ;------------------------------- icl 'lib/atari.hea' @@ -143,6 +148,18 @@ FirstSTART sta variablesToInitialize,y dey bpl @- + + ; RMT INIT + lda #$f0 ;initial value + sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240) + + lda #$ff ;initial value + sta sfx_effect + + lda #0 + jsr RmtSongSelect + + VMAIN VBLinterrupt,7 ;jsr SetVBL START ; Startup sequence @@ -990,17 +1007,17 @@ MakeTanksVisible mva #1 CurrentRoundNr ;we start from round 1 mva #6 NTSCcounter - ; RMT INIT - lda #$f0 ;initial value - sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240) +; ; RMT INIT +; lda #$f0 ;initial value +; sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240) ; - lda #$ff ;initial value - sta sfx_effect +; lda #$ff ;initial value +; sta sfx_effect ; - lda #0 - jsr RmtSongSelect +; lda #0 +; jsr RmtSongSelect ; - VMAIN VBLinterrupt,7 ;jsr SetVBL +; VMAIN VBLinterrupt,7 ;jsr SetVBL rts .endp @@ -1141,7 +1158,7 @@ itsPAL bmi lab2 asl @ ; * 2 tay ;Y = 2,4,..,16 instrument number * 2 (0,2,4,..,126) - ldx #0 ;X = 0 channel (0..3 or 0..7 for stereo module) + ldx #3 ;X = 0 channel (0..3 or 0..7 for stereo module) lda #0 ;A = 0 note (0..60) bit noSfx smi:jsr RASTERMUSICTRACKER+15 ;RMT_SFX start tone (It works only if FEAT_SFX is enabled !!!) @@ -1550,8 +1567,9 @@ TankFont ; reserved space for RMT player .ds $0320 .align $100 +PLAYER .ECHO 'PLAYER: ',* - icl 'artwork/sfx/rmtplayr_game.asm' + icl 'artwork/sfx/rmtplayr.a65' MODUL equ $b000 ;address of RMT module opt h- ;RMT module is standard Atari binary file already diff --git a/scorch.xex b/scorch.xex index b037bc30771dfa1db388439f94d9c8ff2b199bbd..8e5b2547607f7f39dbe8a0724df03b72e3f4ebd9 100644 GIT binary patch delta 16964 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 m6o?rN`|PJT)>4j~NpfE*2i5e_sgcuB!K5 zy?Ryk>eYL%J3cnapO`{LV~lU_62_GFzEw7H z1LtuqOJ#$2rHPAXD=h)FmFv5zXZbU3{#@>F%Q~yL<8!zJH*wQ%X0Ur?gW%+bWy?mf zl5oAA1rVMyZk2m6x*z9ppJnen%ljKf^d~cV6H7RWtm{v_NhE9}>v|Kfk-Z!mLR_4h zjJ87~iEEG*FF%ir0sTCL0om@jNj3lrua@ucXUZjy lf{Ea@b%L?fXA{XB#x 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 diff --git a/textproc.asm b/textproc.asm index a8fffb1..2f37e43 100644 --- a/textproc.asm +++ b/textproc.asm @@ -2010,7 +2010,7 @@ FastTank jsr GameOverResultsClear rts RandomizeTankPos - randomize 8 32 + randomize 10 32 ; 10 not 8 - barrel !! :) sta Ytankstable,x randomize 0 180 sta AngleTable,x diff --git a/variables.asm b/variables.asm index 56974df..a206f04 100644 --- a/variables.asm +++ b/variables.asm @@ -46,8 +46,6 @@ isInventory .ds 1 ; 0 - purchase, $ff - inventory ;-------------- drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) ;-------------- -sfx_effect .ds 1 -;-------------- noDeathCounter .ds 1 ;-------------- OptionsY .ds 1 ;vertical position of cursor on Options screen diff --git a/weapons.asm b/weapons.asm index 6df7ef9..a7c0cab 100644 --- a/weapons.asm +++ b/weapons.asm @@ -283,6 +283,7 @@ NoLowerCircle .endp ; ------------------------ .proc napalm + mva #sfx_napalm sfx_effect inc FallDown2 mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) jsr CalculateExplosionRange @@ -291,6 +292,7 @@ NoLowerCircle .endp ; ------------------------ .proc hotnapalm + mva #sfx_napalm sfx_effect inc FallDown2 mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) jsr CalculateExplosionRange