From 10d4f758c06af4b8b56eb3c777ef3d03f01b2d94 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Wed, 11 Jun 2025 15:10:11 +0200 Subject: [PATCH] Another RMT player --- lumber.asm | 14 +- lumber.xex | Bin 35454 -> 35524 bytes msx/rmtplayr.asm | 1358 ++++++++++++++++++++++++++++++++++++++++++++++ timberman.xex | Bin 38026 -> 38096 bytes 4 files changed, 1371 insertions(+), 1 deletion(-) create mode 100644 msx/rmtplayr.asm diff --git a/lumber.asm b/lumber.asm index 34cdb3d..c4b172a 100644 --- a/lumber.asm +++ b/lumber.asm @@ -3,6 +3,9 @@ .IFNDEF TARGET .def TARGET = 800 ; 5200 .ENDIF +.IFNDEF RMT + .def RMT = 1 ; 2 - new player +.ENDIF ;--------------------------------------------------- ;OPT r+ ; saves 10 bytes, and probably works :) https://github.com/tebe6502/Mad-Assembler/issues/10 @@ -84,7 +87,7 @@ display = $a000 .zpvar COLPM2_d .byte .zpvar COLPM3_d .byte -RMT_zpvars = COLPM3_d+1 ; POZOR!!! RMT vars go here +RMT_Zero_Page_V = COLPM3_d+1 ; POZOR!!! RMT vars go here ;--------------------------------------------------- ; init.... dark screean and BASIC off ORG $2000 @@ -4108,6 +4111,7 @@ hs_def_name .by "A " ;------------------------------------------------- ;RMT PLAYER variables +.IF RMT = 2 track_variables trackn_db .ds TRACKS trackn_hb .ds TRACKS @@ -4142,9 +4146,17 @@ trackn_audc .ds TRACKS trackn_audctl .ds TRACKS v_aspeed .ds 1 track_endvariables +.ENDIF ;------------------------------------------------- ;RMT PLAYER loading shenaningans + .align $100 + .ds $400 +PLAYER +.IF RMT =2 icl 'msx/rmtplayr_modified.asm' +.ELSE + icl 'msx/rmtplayr.asm' +.ENDIF ;------------------------------------------------- ;------------------------------------------------- ; music and sfx diff --git a/lumber.xex b/lumber.xex index e870280ae664347d0ddceaf4a843437dec0e3fc1..ad86701d33ca373241a5a9ad4c0870a21b0740f9 100644 GIT binary patch delta 4339 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 diff --git a/msx/rmtplayr.asm b/msx/rmtplayr.asm new file mode 100644 index 0000000..28e0313 --- /dev/null +++ b/msx/rmtplayr.asm @@ -0,0 +1,1358 @@ +;* +;* 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 +;* +;* RMT FEATures definitions file +;* For optimizations of RMT player routine to concrete RMT modul only! + icl "feat.txt" +STEREOMODE equ 0 + + .IF STEREOMODE==1 +TRACKS equ 8 + .ELSE +TRACKS equ 4 + .ENDIF +;* +;*PLAYER equ $3400 +;* +;* +;* RMT ZeroPage addresses + .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 + IFT FEAT_COMMAND2 + .zpvar frqaddcmd2 .byte + 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 @ + lda #0 ; my fix :) +; 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/timberman.xex b/timberman.xex index 111dea0ec29b881859e16d531ffb4d4b68e0718a..8fe4b8ee891adf05a507c617413263192741ed15 100644 GIT binary patch delta 4521 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 KPdsk($Nd+Jv;lDd