diff --git a/artwork/sfx/rmtplayr_modified.asm b/artwork/sfx/rmtplayr_modified.asm new file mode 100644 index 0000000..8a62912 --- /dev/null +++ b/artwork/sfx/rmtplayr_modified.asm @@ -0,0 +1,635 @@ +; +; 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 + +TRACKS equ 4 +; RMT FEATures definitions file +; For optimizations of RMT player routine to concrete RMT modul only! + icl "feat.txt" +;FEAT_EFFECTS equ FEAT_EFFECTVIBRATO||FEAT_EFFECTFSHIFT +; +; RMT ZeroPage addresses +.zpvar p_tis .word ;= RMT_Zero_Page_V +p_instrstable = p_tis +.zpvar p_trackslbstable .word +.zpvar p_trackshbstable .word +.zpvar p_song .word +.zpvar ns .word +.zpvar nr .word +.zpvar nt .byte +.zpvar reg1 .byte +.zpvar reg2 .byte +.zpvar reg3 .byte +.zpvar tmp .byte + org PLAYER-$400+$e0 +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 +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 +trackn_effdelay .ds TRACKS +trackn_effvibratoa .ds TRACKS +trackn_effshift .ds TRACKS +trackn_tabletypespeed .ds TRACKS +trackn_tablenote .ds TRACKS +trackn_tablea .ds TRACKS +trackn_tableend .ds TRACKS +trackn_tablelop .ds TRACKS +trackn_tablespeeda .ds TRACKS +trackn_command .ds TRACKS +trackn_filter .ds TRACKS +trackn_audf .ds TRACKS +trackn_audc .ds TRACKS +trackn_audctl .ds TRACKS +v_aspeed .ds 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 +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 + org PLAYER-$100-$140 + 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 + lda (ns),y + sta v_speed + ldy #8 +ri1 lda (ns),y + sta p_tis-8,y + iny + cpy #8+8 + bne ri1 + pla + pha + asl @ + asl @ + clc + adc p_song + sta p_song + pla + php + and #$c0 + asl @ + rol @ + rol @ + plp + adc p_song+1 + sta p_song+1 + jsr GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 +rmt_silence + lda #0 + sta $d208 + ldy #3 + sty $d20f + ldy #8 +si1 sta $d200,y + dey + bpl si1 + lda #FEAT_INSTRSPEED + 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 + lda #$ff +v_speed equ *-1 + sta v_bspeed + 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 + 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 + and #$f0 + sta trackn_volume,x +oo1x +xtracks03sub1 cpx #TRACKS-1 + bne oo1 + lda #$ff +v_bspeed equ *-1 + sta v_speed + 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 + bmi oo63_1X + iny + lda (ns),y + sta v_bspeed + inc trackn_idx,x + jmp oo1i +oo63_1X + 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 + jsr SetUpInstrumentY2 + jmp p2x0 +rmt_sfx + sta trackn_note,x + lda #$f0 ;* sfx note volume*16 +RMTSFXVOLUME equ *-1 ;* label for sfx note volume parameter overwriting + sta trackn_volume,x +SetUpInstrumentY2 + lda (p_instrstable),y + sta trackn_instrdb,x + sta nt + iny + lda (p_instrstable),y + sta trackn_instrhb,x + sta nt+1 + lda #1 + sta trackn_filter,x + tay + lda (nt),y + sta trackn_tablelop,x + iny + lda (nt),y + sta trackn_instrlen,x + iny + lda (nt),y + sta trackn_instrlop,x + iny + lda (nt),y + sta trackn_tabletypespeed,x + sta trackn_tablespeeda,x + iny + lda (nt),y + sta trackn_audctl,x + iny + lda (nt),y + sta trackn_volumeslidedepth,x + ldy #8 + lda (nt),y + sta trackn_effdelay,x + iny + lda (nt),y + tay + lda vibtabbeg,y + sta trackn_effvibratoa,x + ldy #10 + lda (nt),y + sta trackn_effshift,x + 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 + rts +rmt_play +rmt_p0 + jsr SetPokey +rmt_p1 +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 + 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 + lda trackn_effdelay,x + beq ei2 + cmp #1 + bne ei1 + lda trackn_shiftfrq,x + clc + adc trackn_effshift,x + clc + ldy trackn_effvibratoa,x + adc vib0,y + sta trackn_shiftfrq,x + lda vibtabnext,y + sta trackn_effvibratoa,x + jmp ei2 +ei1 + dec trackn_effdelay,x +ei2 + ldy trackn_tableend,x + cpy #INSTRPAR+1 + bcc ei3 + lda trackn_tablespeeda,x + bpl ei2f +ei2c + tya + cmp trackn_tablea,x + bne ei2c2 + lda trackn_tablelop,x + 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 + sta trackn_tablenote,x + lda trackn_tabletypespeed,x +ei2f + sec + sbc #1 + sta trackn_tablespeeda,x +ei3 + lda trackn_instrreachend,x + bpl ei4 + lda trackn_volume,x + beq ei4 + tay + lda trackn_volumeslidevalue,x + clc + adc trackn_volumeslidedepth,x + sta trackn_volumeslidevalue,x + bcc ei4 + tya + sbc #16 + sta trackn_volume,x +ei4 + lda reg2 + sta trackn_command,x + and #$70 + beq cmd0 +cmd1 + lda reg3 + jmp cmd0c +cmd2 +cmd3 +cmd4 +cmd5 +cmd6 +cmd7 +cmd0 + lda trackn_note,x + clc + adc reg3 +cmd0a + clc + adc trackn_tablenote,x + cmp #61 + bcc cmd0a1 + lda #0 + sta trackn_audc,x + lda #63 +cmd0a1 + tay + lda (nr),y + clc + adc trackn_shiftfrq,x +cmd0c + sta trackn_audf,x +pp9 +ppnext + dex + bmi rmt_p4 + jmp pp1 +rmt_p4 + lda trackn_audctl+0 + ora trackn_audctl+1 + ora trackn_audctl+2 + ora trackn_audctl+3 + tax +qq1 + stx v_audctl + 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 + lda #0 + sta trackn_audc+2 +qq1a + txa + ora #4 + tax +qq2 + 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 + lda #0 + sta trackn_audc+3 +qq2a + txa + ora #2 + tax +qq3 + cpx v_audctl + bne qq5 +qq5 + stx v_audctl +rmt_p5 + lda #$ff +v_ainstrspeed equ *-1 + rts +SetPokey + 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 + rts +RMTPLAYEREND diff --git a/definitions.asm b/definitions.asm index 25bb623..8defb80 100644 --- a/definitions.asm +++ b/definitions.asm @@ -5,16 +5,27 @@ screenBytes = 40 screenwidth = screenBytes*8 ; Max screenwidth = 512!!! TankWidth = 8 + .if target = 5200 +;---------------------------------------------- +; Player/missile memory +PMGraph = $1800 ; real PM start = PMGraph + $0300 +; Generated tables +linetableL = PMGraph + $0300 - (screenHeight+1)*2 +linetableH = PMGraph + $0300 - (screenHeight+1) +display = $2010 ;screen takes $1f68 because it has screenHeight+1 lines because of out of screen tracer(?) +;rmtplyr len = $393, align to the beginning of the page. +rmt_compilation_addr = ((linetableL - $393) / $100)*$100 ; $1500 for now +rmt_memory_start = rmt_compilation_addr - $320 ; $11e0 for now + .else ;---------------------------------------------- ; Player/missile memory PMGraph = $0800 ; real PM start = $0b00 - - ; Generated tables -linetableL = $0b00 - (screenHeight+1)*2 -linetableH = $0b00 - (screenHeight+1) - +linetableL = PMGraph + $0300 - (screenHeight+1)*2 +linetableH = PMGraph + $0300 - (screenHeight+1) display = $1010 ;screen takes $1f68 because it has screenHeight+1 lines because of out of screen tracer(?) + .endif +;---------------------------------------------- margin = 40 ;mountain drawing Y variable margin MaxPlayers = 6 diff --git a/scorch.asm b/scorch.asm index fb85659..6e428fc 100644 --- a/scorch.asm +++ b/scorch.asm @@ -3,39 +3,9 @@ ;--------------------------------------------------- ;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski ;Warsaw 2000,2001,2002,2003,2009,2012,2013 -;Miami&Warsaw 2022 -;you can contact us at pecus@poczta.fm or pirx@5oft.pl -;home page of this project is https://github.com/pkali/scorch_src +;Miami & Warsaw 2022 -;this source code was compiled under OMC65 crossassembler -;(https://github.com/pkali/omc65) -;and on 2012-06-21 translated to mads -; -;game source code is split into 5+2 parts: -;scorch.asm is the main game code (with many assorted routines) -;grafproc.asm - graphics routines like line or circle -;textproc.asm - text routines like list of weapons and shop -;variables.asm - all non-zero page variables and constans -;display.asm - display lists and text screen definitions -;ai.asm - artificial stupidity of computer opponents -;weapons.asm - general arsenal of tankies - -;we were trying to use as much macros and pseudoops as possible -;they are defined in atari.hea and macro.hea files together with many -;atari constans. This way it shoud be relatively easy to -;port this code to e.g. C64 -; -;After those N years of working on this piece of code -;we are sure it would be much wiser to write it in C, Action! -;or MadPascal but on the other hand it is so much fun to type 150 chars -;where you want to have y=ax+b :) -; -;originally most variables were in Polish, comments were sparse -;but we wanted to release this piece of code to public -;and due to being always short of time/energy (to finish the game) -;we decided it must go in 'English' to let other people work on it - -.def target = 5200 ; or 800 +.def target = 800 ;5200 ; or 800 .macro build dta d"1.13" ; number of this build (3 bytes) @@ -169,9 +139,11 @@ ;Game loading address .IF target = 5200 - ORG $3000 + ORG rmt_memory_start - (variablesEnd - OneTimeZeroVariables + 1) + icl 'variables.asm' + ORG $4000 .ELSE - ORG $3000 + ORG $3000 .ENDIF WeaponFont @@ -218,6 +190,20 @@ FirstSTART cpy #screenheight+1 bne @- +; .if target = 5200 +; ; move RMT player from ROM to RAM (it modifies itself) +; mwa #PlayerBlob temp +; mwa #PlayerBlobDest temp2 +;@ +; ldy #0 +; lda (temp),y +; sta (temp2),y +; inw temp +; inw temp2 +; cpw temp #PlayerBlobEnd +; bne @- +; .endif + ; RMT INIT lda #$f0 ;initial value @@ -1693,26 +1679,49 @@ noingame TankFont ins 'artwork/tanksv3.fnt',+0,352 ; 44 characters only ;---------------------------------------------- - icl 'variables.asm' + .if target != 5200 + icl 'variables.asm' + .endif ;---------------------------------------------- -; reserved space for RMT player +;RMT PLAYER and song loading shenaningans + + .IF target = 5200 +;---------------------------------------------- + ; 5200 memory layout +PLAYER = $1500 +;RASTERMUSICTRACKER = PLAYER +;RMTSFXVOLUME = $1669 +PlayerBlobDest = $1282 +PlayerBlob + ; this is rmtplayr.a65 compiled with artwork/sfx/rmt_player_bin_blob.asm + ; the compiled .xex was loaded to atari memory in Altirra and saved with + ; .writemem rmtplr_blob.bin 1282 L614 + ; I hate this solution, but the alternative would be rewriting RMT player so it uses no ORG inside + ; the player in 5200 mode takes memory from $11E0 !!! + ; WARNING!!!! Adding zpage vars require recompilation of rmt_player_bin_blob.asm !!!!!!!! +; ins 'artwork/sfx/rmtplr_blob.bin' +PlayerBlobEnd + ORG PLAYER + icl 'artwork/sfx/rmtplayr.a65' + .align $100 + org $b400 + +MODUL + ;opt h- ;RMT module is standard Atari binary file already + ins "artwork/sfx/scorch_SFX-only-str.rmt",+6 ;so remove the header to reallocate + ;opt h+ + .ELSE +;---------------------------------------------- + ; normal (A800) memory layout + ; reserved space for RMT player .ds $0320 .align $100 PLAYER - .ECHO 'PLAYER: ',* - icl 'artwork/sfx/rmtplayr.a65' - - .IF target=5200 + icl 'artwork/sfx/rmtplayr_modified.asm' MODUL equ $b000 ;address of RMT module opt h- ;RMT module is standard Atari binary file already - ins "artwork/sfx/scorch_SFX-only-str.rmt" ;include music RMT module - opt h+ - - .ELSE -MODUL equ $b000 ;address of RMT module - opt h- ;RMT module is standard Atari binary file already - ins "artwork/sfx/scorch_str6.rmt" ;include music RMT module + ins "artwork/sfx/scorch_str6.rmt" ;include music RMT module opt h+ .ENDIF ; diff --git a/scorch.xex b/scorch.xex index f827974..2027e71 100644 Binary files a/scorch.xex and b/scorch.xex differ diff --git a/variables.asm b/variables.asm index 379ae63..fe9c7d2 100644 --- a/variables.asm +++ b/variables.asm @@ -14,34 +14,35 @@ OneTimeZeroVariablesCount = variablesToInitialize-OneTimeZeroVariables ; MAX 12 .error "OneTimeZeroVariablesCount too large, ",OneTimeZeroVariablesCount .endif -noMusic .by 0 ; 0 - play music, $ff - do not play music -noSfx .by 0 ; 0 - play SFX, $ff - do not play SFX +noMusic .ds 1 ;.by 0 ; 0 - play music, $ff - do not play music +noSfx .ds 1 ;.by 0 ; 0 - play SFX, $ff - do not play SFX ;---------------------------------------------------- ; Color table for Game Over Screen (created in a gameover routine) - .by $00 ; labels line color -GameOverColoursTable .BYTE $80,$40,$c4,$20,$c0,$e4 + .ds 1 ;.by $00 ; labels line color +GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4 ;---------------------------------------------------- TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24 - :6 dta d" " + ;:6 dta d" " + .ds 6*8 ;---------------------------------------------------- skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) .DS [MaxPlayers] ;---------------------------------------------------- variablesToInitialize ;Options DO NOT ZERO ON RESTART GAME - ticket #27 -OptionsTable .by 0,1,2,2,0,1,3,2,0 -RoundsInTheGame .by 10 ;how many rounds in the current game -seppukuVal .by 75 -mountainDeltaH .by 3 -mountainDeltaL .by $ff +OptionsTable .ds maxOptions ;.by 0,1,2,2,0,1,3,2,0 +RoundsInTheGame .ds 1 ;.by 10 ;how many rounds in the current game +seppukuVal .ds 1 ;.by 75 +mountainDeltaH .ds 1 ;.by 3 +mountainDeltaL .ds 1 ;.by $ff ;---------------------------------------------------- LineHeader1 - dta d"# ROUND: " + .ds 9 ;dta d"# ROUND: " RoundNrDisplay - dta d" #", $ff + .ds 7 ;dta d" #", $ff ; 4x4 text buffer ResultLineBuffer - dta d" ", $ff + .ds 19 ;dta d" ", $ff ;===================================================== variablesStart ; zeroing starts here