diff --git a/artwork/sfx/rmtplayr_modified.asm b/artwork/sfx/rmtplayr_modified.asm new file mode 100644 index 0000000..45972d8 --- /dev/null +++ b/artwork/sfx/rmtplayr_modified.asm @@ -0,0 +1,643 @@ +; +; 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 +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 +.zpvar v_audctl .byte ; de-self-modification vars +.zpvar v_ainstrspeed .byte +.zpvar v_maxtracklen .byte +.zpvar v_abeat .byte +.zpvar v_bspeed .byte +.zpvar v_speed .byte +.zpvar RMTSFXVOLUME .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 v_speed + + 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 v_bspeed + + 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 RMTSFXVOLUME ;* sfx note volume*16 + ;* 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 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 +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 v_ainstrspeed + + rts +SetPokey + 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 $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/artwork/sfx/scorch_SFX-feat.txt b/artwork/sfx/scorch_SFX-feat.txt new file mode 100644 index 0000000..e7bb349 --- /dev/null +++ b/artwork/sfx/scorch_SFX-feat.txt @@ -0,0 +1,40 @@ +;* --------BEGIN-------- +;* C:\Atari\rmt\rmt128\scorch_SFX-only-str.rmt +FEAT_SFX equ 1 +FEAT_GLOBALVOLUMEFADE equ 0 ;RMTGLOBALVOLUMEFADE variable +FEAT_NOSTARTINGSONGLINE equ 0 +FEAT_INSTRSPEED equ 1 +FEAT_CONSTANTSPEED equ 16 ;(0 times) +FEAT_COMMAND1 equ 1 ;(8 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 0 ;(0 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 0 ;(0 times) +FEAT_FILTERG1L equ 0 ;(0 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 1 ;(2 times) +FEAT_AUDCTLMANUALSET equ 1 ;(6 times) +FEAT_VOLUMEMIN equ 0 ;(0 times) +FEAT_EFFECTVIBRATO equ 1 ;(1 times) +FEAT_EFFECTFSHIFT equ 1 ;(11 times) +;* --------END-------- diff --git a/artwork/sfx/scorch_SFX-only-str.rmt b/artwork/sfx/scorch_SFX-only-str.rmt new file mode 100644 index 0000000..cc689e5 Binary files /dev/null and b/artwork/sfx/scorch_SFX-only-str.rmt differ diff --git a/artwork/sfx/scorch_SFX-only.rmt b/artwork/sfx/scorch_SFX-only.rmt new file mode 100644 index 0000000..9fa9461 Binary files /dev/null and b/artwork/sfx/scorch_SFX-only.rmt differ diff --git a/constants.asm b/constants.asm index 2f55d79..5cdd5a4 100644 --- a/constants.asm +++ b/constants.asm @@ -559,8 +559,6 @@ CreditsStart dta d"Warsaw, Miam",d"i"* dta d"2000-202",d"2"* dta d" "* - dta d"B",d"y"* - dta d" "* dta d"Programmin",d"g"* dta d"Tomasz 'Pecus' Peck",d"o"* dta d"Pawel 'pirx' Kalinowsk",d"i"* @@ -568,15 +566,19 @@ CreditsStart dta d"SFX, Music and Suppor",d"t"* dta d"Michal 'Miker' Szpilowsk",d"i"* dta d" "* - dta d"Additional Musi",d"c"* - dta d"Mario 'Emkay' Kri",d"x"* - dta d" "* + .IF target != 5200 + dta d"Additional Musi",d"c"* + dta d"Mario 'Emkay' Kri",d"x"* + dta d" "* + .ENDIF dta d"Code Optimizatio",d"n"* dta d"Piotr '0xF' Fusi",d"k"* dta d" "* dta d"Ar",d"t"* dta d"Adam Wachowsk",d"i"* - dta d"Krzysztof 'Kaz' Ziembi",d"k"* + .IF target != 5200 + dta d"Krzysztof 'Kaz' Ziembi",d"k"* + .ENDIF dta d" "* dta d"Ideas and Q",d"A"* dta d"Bocianu, Probabilitydragon, EnderDude",d","* @@ -586,9 +588,16 @@ CreditsStart dta d" "* dta d"Additional testin",d"g"* dta d"Arek and Alex Peck",d"o"* - dta d" "* - dta d"Stay tuned for the FujiNet version",d"!"* + .IF target != 5200 + dta d" "* + dta d"Stay tuned for the FujiNet version",d"!"* + .ENDIF dta d" "* CreditsEnd -CreditsLines=44 +.IF target = 5200 + CreditsLines=36 +.ELSE + CreditsLines=42 ; 34 in reality. add 7? +.ENDIF + .endif diff --git a/definitions.asm b/definitions.asm index 25bb623..8c3de4b 100644 --- a/definitions.asm +++ b/definitions.asm @@ -5,16 +5,24 @@ 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(?) + .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/display.asm b/display.asm index 7c4a95e..7dbfcbd 100644 --- a/display.asm +++ b/display.asm @@ -28,15 +28,6 @@ OptionsHere OptionsScreenEnd ;----------------------------------------------- -ListOfWeapons - ; 0123456789012345678901234567890123456789 -; :number_of_offensives dta d" " - :32 dta d" " -ListOfWeapons1End -ListOfDefensiveWeapons -; :number_of_defensives dta d" " - :16 dta d" " -ListOfDefensiveWeaponsEnd ;constant useful when clearing NameScreen dta d" Enter names of players " dta d" Tank 01 Name:" @@ -103,173 +94,5 @@ DLCreditsAddr ;------------------------ ; end of "variables" (RAM) ;------------------------ -; start of "constants" (ROM) -;----------------------------------------------- -;Screen displays go first to avoid crossing 4kb barrier -;----------------------------------------------- -OptionsScreen - dta d"Welcome to Scorch v. " - build ; 4 bytes from scorch.asm (fancy method) :) - dta d" (un)2000-2022" - dta d" Please select option with cursor keys " - dta d" and press (Return) to proceed " -MoreUp - dta d" " - dta 92,92,92 - dta d" more " - dta 92,92,92 - dta d" " -MoreDown - dta d" " - dta 93,93,93 - dta d" more " - dta 93,93,93 - dta d" " -WeaponsDescription - ; 0123456789012345678901234567890123456789 - dta d"Tab"* - dta d ": Defensive/Offensive weapon " -PurchaseDescription - ; 0123456789012345678901234567890123456789 - dta d"Space"* - dta d": Purchase " - dta d"Return"* - dta d": Finish " -ActivateDescription - ; 0123456789012345678901234567890123456789 - dta d"Space"* - dta d": Activate " - dta d"Return"* - dta d": Finish " -EmptyLine - dta d" " -;--------------------------------------------------- -OptionsTitle - dta d" scorch "* -DifficultyTitle - dta d" difficulty "* -PurchaseTitle - dta d"purchase weapons" -InventoryTitle - dta d"activate weapons"* -GameOverTitle - dta d" game over "* -GameOverTitle2 - dta d" Player Points Hits Earned Money " -;----------------------------------------------------- -;-------------display-lists--------------------------- -;----------------------------------------------------- -dl ; MAIN game display list - .byte 0 - .byte $42 - .word textbuffer - .byte $02, $02 +$80 ;DLI - .byte $10 ; 2 blank lines - - .byte $4f - .word display ; 1 line - :76 .by $0f ;76 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :13 .by $0f ;13 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :8 .by $0f ;8 - .by $4f ;1 - .wo display+$0ff0 - :2 .by $0f ;2 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :9 .by $0f ;9 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :8 .by $0f ;8 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :7 .by $0f ;7 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :6 .by $0f ;6 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :5 .by $0f ;5 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :4 .by $0f ;4 - .by $0f+$80 ; DLI (black bar) ;2 - .by $0f+$80 ; DLI - :3 .by $0f ;3 - .by $0f+$80 ; DLI (black to end);1 - :38 .byte $0f ;35 ..... = 200 - .by $4f - .wo EmptyLine ; additional line of ground - .byte $41 - .word dl -;----------------------------------------------- - .ALIGN $1000 ; WARNING!!!! 4KiB barrier crossing here, might need reassignment!!! -OptionsDL - .byte $70 - .byte $47 - .word OptionsTitle - .byte $70,$70 - .byte $42 - .word OptionsScreen - .byte $30,$02,$02,$70 - .byte $42 - .word OptionsHere - .byte $10 - :maxOptions-1 .by $02,$10 - :(9-maxOptions) .by $70,$10 - .byte $80 - .byte $4f - .word (display+140*40) - :21 .by $0f ;76 - .byte $41 - .word OptionsDL -;------------------------ -;Enter names of tanks DL -NameDL - .byte $70 - .byte $47 - .word DifficultyTitle - .byte $70,$70 - .byte $42 - .word NameScreen - .byte $30 - .byte $02,$30+$80,$02 - .byte $10,$02,$02,$02,$30,$02,$02 - .byte $41 - .word NameDL -; ------------------------------------------------- -GameOverResults = display+$0ff0 ; reuse after game -Credits = GameOverResults +(6*40) -CreditsLastLine = Credits + (CreditsLines*40) -GameOverDL - .byte $70,$40 - .byte $47 ; 16 gr8 lines - .word GameOverTitle - .byte $4f ; 1 line - .word display+(40*72) - :28 .byte $0f ; 28 lines - .byte $0f+$80 - .byte $4f ; 1 line - .word display+(40*32) - :30 .byte $0f ; 30 lines - .byte $0f+$80 ; 1 line - .byte $4f ; 1 line - .word display+(40*72) - :7 .byte $0f ; 7 lines - .byte $00+$80 ; 1 line - .byte $42 ; 7 tekst lines - .word GameOverTitle2 - .byte $00+$80 - .byte $42 - .word GameOverResults - :5 .byte $00+$80,$02 - .byte $01 - .word DLCreditsFragm -; --------------- -; end of "constants" (ROM) -;----------------------------------------------- .endif \ No newline at end of file diff --git a/display_static.asm b/display_static.asm new file mode 100644 index 0000000..c81c5a6 --- /dev/null +++ b/display_static.asm @@ -0,0 +1,174 @@ +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + +.IF *>0 ;this is a trick that prevents compiling this file alone +;------------------------ +; start of "constants" (ROM) +;----------------------------------------------- +;Screen displays go first to avoid crossing 4kb barrier +;----------------------------------------------- +OptionsScreen + dta d"Welcome to Scorch v. " + build ; 4 bytes from scorch.asm (fancy method) :) + dta d" (un)2000-2022" + dta d" Please select option with cursor keys " + dta d" and press (Return) to proceed " +MoreUp + dta d" " + dta 92,92,92 + dta d" more " + dta 92,92,92 + dta d" " +MoreDown + dta d" " + dta 93,93,93 + dta d" more " + dta 93,93,93 + dta d" " +WeaponsDescription + ; 0123456789012345678901234567890123456789 + dta d"Tab"* + dta d ": Defensive/Offensive weapon " +PurchaseDescription + ; 0123456789012345678901234567890123456789 + dta d"Space"* + dta d": Purchase " + dta d"Return"* + dta d": Finish " +ActivateDescription + ; 0123456789012345678901234567890123456789 + dta d"Space"* + dta d": Activate " + dta d"Return"* + dta d": Finish " +EmptyLine + dta d" " +;--------------------------------------------------- +OptionsTitle + dta d" scorch "* +DifficultyTitle + dta d" difficulty "* +PurchaseTitle + dta d"purchase weapons" +InventoryTitle + dta d"activate weapons"* +GameOverTitle + dta d" game over "* +GameOverTitle2 + dta d" Player Points Hits Earned Money " +;----------------------------------------------------- +;-------------display-lists--------------------------- +;----------------------------------------------------- + +dl ; MAIN game display list + .byte 0 + .byte $42 + .word textbuffer + .byte $02, $02 +$80 ;DLI + .byte $10 ; 2 blank lines + + .byte $4f + .word display ; 1 line + :76 .by $0f ;76 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :13 .by $0f ;13 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :8 .by $0f ;8 + .by $4f ;1 + .wo display+$0ff0 + :2 .by $0f ;2 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :9 .by $0f ;9 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :8 .by $0f ;8 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :7 .by $0f ;7 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :6 .by $0f ;6 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :5 .by $0f ;5 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :4 .by $0f ;4 + .by $0f+$80 ; DLI (black bar) ;2 + .by $0f+$80 ; DLI + :3 .by $0f ;3 + .by $0f+$80 ; DLI (black to end);1 + :38 .byte $0f ;35 ..... = 200 + .by $4f + .wo EmptyLine ; additional line of ground + .byte $41 + .word dl +;----------------------------------------------- + ;.ALIGN $1000 ; WARNING!!!! 4KiB barrier crossing here, might need reassignment!!! +OptionsDL + .byte $70 + .byte $47 + .word OptionsTitle + .byte $70,$70 + .byte $42 + .word OptionsScreen + .byte $30,$02,$02,$70 + .byte $42 + .word OptionsHere + .byte $10 + :maxOptions-1 .by $02,$10 + :(9-maxOptions) .by $70,$10 + .byte $80 + .byte $4f + .word (display+140*40) + :21 .by $0f ;76 + .byte $41 + .word OptionsDL +;------------------------ +;Enter names of tanks DL +NameDL + .byte $70 + .byte $47 + .word DifficultyTitle + .byte $70,$70 + .byte $42 + .word NameScreen + .byte $30 + .byte $02,$30+$80,$02 + .byte $10,$02,$02,$02,$30,$02,$02 + .byte $41 + .word NameDL +; ------------------------------------------------- +GameOverResults = display+$0ff0 ; reuse after game +Credits = GameOverResults +(6*40) +CreditsLastLine = Credits + (CreditsLines*40) +GameOverDL + .byte $70,$40 + .byte $47 ; 16 gr8 lines + .word GameOverTitle + .byte $4f ; 1 line + .word display+(40*72) + :28 .byte $0f ; 28 lines + .byte $0f+$80 + .byte $4f ; 1 line + .word display+(40*32) + :30 .byte $0f ; 30 lines + .byte $0f+$80 ; 1 line + .byte $4f ; 1 line + .word display+(40*72) + :7 .byte $0f ; 7 lines + .byte $00+$80 ; 1 line + .byte $42 ; 7 tekst lines + .word GameOverTitle2 + .byte $00+$80 + .byte $42 + .word GameOverResults + :5 .byte $00+$80,$02 + .byte $01 + .word DLCreditsFragm +; --------------- +; end of "constants" (ROM) +;----------------------------------------------- +.endif \ No newline at end of file diff --git a/scorch.asm b/scorch.asm index 3a70a9f..a8e56ce 100644 --- a/scorch.asm +++ b/scorch.asm @@ -3,40 +3,22 @@ ;--------------------------------------------------- ;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 = 800 ;5200 ; or 800 .macro build dta d"1.14" ; number of this build (3 bytes) +<<<<<<< HEAD +======= +.endm + +.macro RMTSong + ; .IF target != 5200 + lda #:1 + jsr RMTSongSelect +; .ENDIF +>>>>>>> 5200 .endm icl 'definitions.asm' @@ -83,9 +65,6 @@ .zpvar pressTimer .byte .zpvar NTSCcounter .byte .zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling - ;.zpvar dliA .byte - ;.zpvar dliX .byte - ;.zpvar dliY .byte .zpvar sfx_effect .byte .zpvar RMT_blocked .byte @@ -143,7 +122,6 @@ .zpvar L1 .byte ;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65 - .zpvar RMT_Zero_Page_V .byte displayposition = modify LineAddress4x4 = temp @@ -153,18 +131,27 @@ icl 'lib/ATARISYS.ASM' icl 'lib/macro.hea' - ;splash screen and musix - icl 'artwork/Scorch50.asm' - + .IF target !=5200 + ;splash screen and musix + icl 'artwork/Scorch50.asm' + .ENDIF ;Game loading address - ORG $3000 + .IF target = 5200 + ORG linetableL - (variablesEnd - OneTimeZeroVariables + 1) + icl 'variables.asm' + ORG $4000 + .ELSE + ORG $3000 + .ENDIF + WeaponFont ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' ;----------------------------------------------- ;Screen displays go here to avoid crossing 4kb barrier ;----------------------------------------------- icl 'display.asm' + icl 'display_static.asm' ;---------------------------------------------- ;-------------------------------------------------- @@ -202,6 +189,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 @@ -221,9 +222,7 @@ START ;jsr GameOverScreen ; only for test !!! - lda #song_main_menu - jsr RmtSongSelect - + RMTSong song_main_menu jsr Options ;startup screen jsr MakeDarkScreen @@ -281,8 +280,7 @@ SettingBarrel ; Results are number of other deaths ; before the player dies itself - lda #song_round_over - jsr RmtSongSelect + RmtSong song_round_over jsr DisplayResults jsr DemoModeOrKey @@ -385,7 +383,7 @@ GoGameOver NoGameOverYet inc CurrentRoundNr jsr MakeDarkScreen ; issue #72 - jsr RmtSongSelect + ; jsr RmtSongSelect ; ????? mva #sfx_silencer sfx_effect jsr PMoutofscreen @@ -402,8 +400,7 @@ NoGameOverYet ; the shooting angle is randomized ; of course gains an loses are zeroed - lda #song_ingame - jsr RmtSongSelect + RmtSong song_ingame jsr SetPMWidth lda #0 @@ -1641,7 +1638,7 @@ MakeDarkScreen ;-------------------------------------------------- ; starting song line 0-255 to A reg cmp #song_ingame - bne noingame ; noMusic blck onlu ingame song + bne noingame ; noMusic blocks only ingame song bit noMusic spl:lda #song_silencio noingame @@ -1681,21 +1678,43 @@ 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 +; +; .ds $0320 +; .align $100 +; +;PLAYER icl 'artwork/sfx/rmtplayr_modified.asm' +; +; org $b500 +; +;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' - + 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_str6.rmt" ;include music RMT module - opt h+ + opt h- ;RMT module is standard Atari binary file already + ins "artwork/sfx/scorch_str6.rmt" ;include music RMT module + opt h+ +; .ENDIF ; +MODULEND ;---------------------------------------------- org $bf80 font4x4 diff --git a/textproc.asm b/textproc.asm index f112879..964d17f 100644 --- a/textproc.asm +++ b/textproc.asm @@ -298,12 +298,14 @@ GoToActivation lda #@dmactl(narrow|dma) ; narrow screen width, DL on, P/M off sta dmactls + .IF target != 5200 lda #song_supermarket bit IsInventory bpl @+ lda #song_inventory @ jsr RmtSongSelect - + .ENDIF + ldx tankNr lda TankStatusColoursTable,x sta COLOR2 @@ -1864,8 +1866,7 @@ quit_seppuku beq @+ ;unconditional jump, because TypeLine4x4 ends with beq GameOver4x4 - lda #song_round_over - jsr RmtSongSelect + RmtSong song_round_over mwa #LineGameOver LineAddress4x4 mwa #((ScreenWidth/2)-(8*4)) LineXdraw mva ResultY LineYdraw @@ -2113,8 +2114,7 @@ MakeAllTanksVisible jsr SetStandardBarrels ; start music and animations - lda #song_ending_looped - jsr RmtSongSelect + RmtSong song_ending_looped ; initial tank positions randomization ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 @ diff --git a/variables.asm b/variables.asm index 379ae63..69416c5 100644 --- a/variables.asm +++ b/variables.asm @@ -14,38 +14,51 @@ 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] + .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 ;===================================================== +; This is moved from display.asm to be easier to relocate +ListOfWeapons + ; 0123456789012345678901234567890123456789 +; :number_of_offensives dta d" " + ;:32 dta d" " + .ds 32*32 +ListOfWeapons1End +ListOfDefensiveWeapons +; :number_of_defensives dta d" " + ;:16 dta d" " + .ds 16*32 +ListOfDefensiveWeaponsEnd ;constant useful when clearing ;isInventory .ds 1 ; 0 - purchase, $ff - inventory ;-------------- drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) @@ -56,69 +69,69 @@ OptionsY .ds 1 ;vertical position of cursor on Options screen flyDelay .ds 1 ;-------------- ;NumberOfPlayers .DS 1 ;current number of players (counted from 1) -TankSequence .DS [MaxPlayers] ;sequence of shooting during the Round +TankSequence .DS MaxPlayers ;sequence of shooting during the Round GameIsOver .DS 1 ; 1 means it was the last round in the game ;---------------------------------------------------- moneyH ;we place zero at the end of prices and money ;and have range from 0 to 99990 (not too much) ;money players have (maybe one more byte is needed?) - .DS [MaxPlayers] + .DS MaxPlayers moneyL - .DS [MaxPlayers] + .DS MaxPlayers ;---------------------------------------------------- gainH ;how much money player gets after the round ;it is gathered during the round basing on energy ;opponents lose after player's shoots - .DS [MaxPlayers] + .DS MaxPlayers gainL - .DS [MaxPlayers] + .DS MaxPlayers ;---------------------------------------------------- loseH ;how much player looses after the round ;calculated from REAL energy loss ;(not only to zero energy) - .DS [MaxPlayers] + .DS MaxPlayers loseL - .DS [MaxPlayers] + .DS MaxPlayers ;---------------------------------------------------- Energy - .DS [MaxPlayers] + .DS MaxPlayers ShieldEnergy - .DS [MaxPlayers] + .DS MaxPlayers EnergyDecrease .DS 1 eXistenZ - .DS [MaxPlayers] + .DS MaxPlayers LASTeXistenZ ; eXistenZ before shoot - .DS [MaxPlayers] + .DS MaxPlayers ResultsTable ;the results in the gameeeeee - .DS [MaxPlayers] + .DS MaxPlayers TempResults - .DS [MaxPlayers] + .DS MaxPlayers DirectHitsH - .DS [MaxPlayers] + .DS MaxPlayers DirectHitsL - .DS [MaxPlayers] + .DS MaxPlayers EarnedMoneyH - .DS [MaxPlayers] + .DS MaxPlayers EarnedMoneyL - .DS [MaxPlayers] + .DS MaxPlayers ;---------------------------------------------------- ForceTableL ;shooting Force of the tank during the round - .DS [MaxPlayers] + .DS MaxPlayers ForceTableH - .DS [MaxPlayers] ;maxplayers=6 + .DS MaxPlayers ;maxplayers=6 MaxForceTableL ;Energy of the tank during the round ;(limes superior force of the Shoot) - .DS [MaxPlayers] ;1000 is the default + .DS MaxPlayers ;1000 is the default MaxForceTableH - .DS [MaxPlayers] + .DS MaxPlayers ;---------------------------------------------------- BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round start! - .DS [MaxPlayers] + .DS MaxPlayers ActiveWeapon ;number of the selected weapon - .DS [MaxPlayers] + .DS MaxPlayers ActiveDefenceWeapon ;number of the activated defence weapon - 0 - .DS [MaxPlayers] + .DS MaxPlayers WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile ;---------------------------------------------------- @@ -142,13 +155,13 @@ WindOrientation .DS 1 ;(0-right,1-left) WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy ;---------------------------------------------------- xtankstableL ;X positions of tanks (lower left point) - .DS [MaxPlayers] + .DS MaxPlayers xtankstableH - .DS [MaxPlayers] + .DS MaxPlayers ytankstable ;Y positions of tanks (lower left point) - .DS [MaxPlayers] + .DS MaxPlayers LowResDistances ; coarse tank positions divided by 4 (to be in just one byte) - .DS [MaxPlayers] + .DS MaxPlayers ;---------------------------------------------------- TargetTankNr ; Target tank index (for AI routines) .DS 1 @@ -367,24 +380,24 @@ CurrentResult .DS 1 ;-------------- AngleTable ;Angle of the barrel of each tank during the round - .DS [MaxPlayers] + .DS MaxPlayers ;NewAngle ; used in AI .DS 1 ;previousBarrelAngle -; .DS [MaxPlayers] +; .DS MaxPlayers EndOfTheBarrelX .ds 2 EndOfTheBarrelY .ds 1 ;---------------------------------------------------- previousAngle - .DS [MaxPlayers] + .DS MaxPlayers previousEnergyL - .DS [MaxPlayers] + .DS MaxPlayers previousLeftRange - .DS [MaxPlayers] + .DS MaxPlayers previousEnergyH - .DS [MaxPlayers] + .DS MaxPlayers RandBoundaryLow .ds 2 RandBoundaryHigh diff --git a/weapons.asm b/weapons.asm index 5fb42cd..60d8780 100644 --- a/weapons.asm +++ b/weapons.asm @@ -1192,8 +1192,7 @@ callInventory jsr Purchase afterInventory jsr MakeDarkScreen - lda #song_ingame - jsr RmtSongSelect + RmtSong song_ingame mva #0 escFlag jsr DisplayStatus jsr SetMainScreen @@ -1430,8 +1429,7 @@ pressedM ; have you tried turning the music off and on again? lda #$ff eor:sta noMusic - lda #song_ingame - jsr RmtSongSelect + RmtSong song_ingame jsr WaitForKeyRelease jmp BeforeFire