diff --git a/artwork/sfx/rmtplayr_modified.asm b/artwork/sfx/rmtplayr_modified.asm new file mode 100644 index 0000000..003018d --- /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 + +; MOVED TO variables.asm +; 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 + +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 + .align $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 AUDF1 + stx AUDC1 + lda trackn_audf+1 + ldx trackn_audc+1 + sta AUDF2 + stx AUDC2 + lda trackn_audf+2 + ldx trackn_audc+2 + sta AUDF3 + stx AUDC3 + lda trackn_audf+3 + ldx trackn_audc+3 + sta AUDF4 + stx AUDC4 + sty AUDCTL + 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/artwork/talk.asm b/artwork/talk.asm index ba3bfcf..2a11cd8 100644 --- a/artwork/talk.asm +++ b/artwork/talk.asm @@ -1,6 +1,6 @@ .proc talk ; Maximum text length is 63 characters!!! -L0 dta d"IN TIMES OF TROUBLE, GO WITH WHAT YOU KNOW." +L0 dta d"CYKA BLAT" L1 dta d"DIE!" L2 dta d"EAT MY SHORTS!" L3 dta d"YOU'RE TOAST!" @@ -47,7 +47,7 @@ L43 dta d"THIS IS YOUR BRAIN ON SCORCH." L44 dta d"TAKE THIS!" L45 dta d"THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US." L46 dta d"DIE, ALIEN SWINE!" -L47 dta d"SAY ARRGGHHHHH...." +L47 dta d"AWRUK!!!" L48 dta d"I SHALL OIL MY TURRET WITH YOUR BLOOD." L49 dta d"DIE, TANK-SCUM!" L50 dta d"I'M GONNA BREAK YOUR FACE!" @@ -104,7 +104,7 @@ L99 dta d"JOIN THE ARMY, SEE THE WORLD THEY SAID." L100 dta d"IT WASN'T JUST A JOB IT WAS AN ADVENTURE!" L101 dta d"I DIDN'T LIKE VIOLENCE ANYWAY!" L102 dta d"I THOUGHT YOU LIKED ME?" -L103 dta d"SUCH SENSELESS VIOLENCE! I DON'T UNDERSTAND IT." +L103 dta d"CTO XYEB" L104 dta d"I THINK THIS GUY'S A LITTLE CRAZY." L105 dta d"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE." L106 dta d"HEY! KILLIN' AIN'T COOL." diff --git a/constants.asm b/constants.asm index 2f55d79..45f1464 100644 --- a/constants.asm +++ b/constants.asm @@ -525,8 +525,22 @@ weaponsOfDeath ; weapons used in tank death animations dta 1,2,3,7,17,18,19,20,21,22,23,24,25,26,27 weaponsOfDeathEnd joyToKeyTable - ; .by 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15 - .by $ff,$ff,$ff,$ff,$ff,$ff,$ff,$07,$ff,$ff,$ff,$06,$ff,$0f,$0e,$ff + .by $ff ;00 + .by $ff ;01 + .by $ff ;02 + .by $ff ;03 + .by $ff ;04 + .by $ff ;05 + .by $ff ;06 + .by @kbcode._right ;07 + .by $ff ;08 + .by $ff ;09 + .by $ff ;0a + .by @kbcode._left ;0b + .by $ff ;0c + .by @kbcode._down ;0d + .by @kbcode._up ;0e + .by $ff ;0f ;----------------------------------- keycodes ;tables for converting KeyCode to Screen Code (38 -1 characters) @@ -546,7 +560,7 @@ scrcodes gameOverSpritesTop ; end of the Gover sprites by number of players ; 1 2 3 4 5 6 - .by 130,130,136,142,148,154 + .by 130+7,130+7,136+7,142+7,148+7,154+7 ;-------decimal constans zero digits dta d"0123456789" @@ -559,8 +573,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 +580,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 +602,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..995b30c 100644 --- a/definitions.asm +++ b/definitions.asm @@ -7,20 +7,16 @@ screenwidth = screenBytes*8 ; Max screenwidth = 512!!! TankWidth = 8 ;---------------------------------------------- ; Player/missile memory -PMGraph = $0800 ; real PM start = $0b00 - - +PMGraph = $1800 ; real PM start = PMGraph + $0300 ; Generated tables -linetableL = $0b00 - (screenHeight+1)*2 -linetableH = $0b00 - (screenHeight+1) - -display = $1010 ;screen takes $1f68 because it has screenHeight+1 lines because of out of screen tracer(?) +display = $2010 ;screen takes $1f68 because it has screenHeight+1 lines because of out of screen tracer(?) +;---------------------------------------------- margin = 40 ;mountain drawing Y variable margin MaxPlayers = 6 maxOptions = 9 ;number of all options PMOffsetX = $2C ; P/M to graphics offset -PMOffsetY = $23 ; P/M to graphics offset +PMOffsetY = $2A ; P/M to graphics offset napalmRadius = 10 StandardBarrel = 6 ; standard tank barrel length LongBarrel = 20 ; long barrel length diff --git a/display_main_menu.asm b/display_main_menu.asm new file mode 100644 index 0000000..8a7e121 --- /dev/null +++ b/display_main_menu.asm @@ -0,0 +1,45 @@ +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + +.IF *>0 ;this is a trick that prevents compiling this file alone +;----------------------------------------------- +; start of "variables" (RAM) +;----------------------------------------------- +OptionsHere + ; 0123456789012345678901234567890123456789 + dta d"Players : 2 3 4 5 6 " + dta d"Cash : none 2K 8K 12K 20K " + dta d"Gravity : 0.2G 0.5G 1G 2G 4G " + dta d"Wind : 1B 3B 5B 7B 9B " + dta d"Rounds : 10 20 30 40 50 " + dta d"Missiles : slug slow norm fast hare " + dta d"Seppuku : nevr rare norm oftn alws " + dta d"Mountains: NL BE CZ CH NP " + dta d"Walls : none wrap bump boxy rand " +;; 01234567890123456789012345678901 +; dta d"Players: 2 3 4 5 6 " +; dta d"Cash :none 2K 8K 12K 20K" +; dta d"Gravity:0.2G 0.5G 1G 2G 4G " +; dta d"Wind : 1B 3B 5B 7B 9B " +; dta d"Rounds : 10 20 30 40 50 " +; dta d"Missile:slug slow norm fast hare" +; dta d"Seppuku:nevr rare norm oftn alws" +; dta d"Hills : NL BE CZ CH NP " +; dta d"Walls :none wrap bump boxy rand" +OptionsScreenEnd + +;----------------------------------------------- +NameScreen2 + dta d" Tank 01 Name:" +NameAdr + dta d" " +NameScreen4 + dta d" " +NamesOfLevels + dta d" HUMAN Moron Shooter " + dta d" Poolshark Tosser Chooser " + dta d" Spoiler Cyborg Unknown " +;------------------------ +; end of "variables" (RAM) +;------------------------ + +.endif \ No newline at end of file diff --git a/display_purchasedl.asm b/display_purchasedl.asm new file mode 100644 index 0000000..eef87ab --- /dev/null +++ b/display_purchasedl.asm @@ -0,0 +1,45 @@ +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + +.IF *>0 ;this is a trick that prevents compiling this file alone +;--------------------------------------------------- +purchaseTextBuffer + dta d"Player: Cash: 0" ; ZERO TO MAKE YOU RICHER ON THE SCREEN + +; DLs fragments (modified by game code) +; all Purchase DL :) +PurchaseDL + .byte $70 + .byte $47 +DLPurTitleAddr + .word PurchaseTitle + .byte $50 + .byte $42+$80 + .word purchaseTextBuffer + .byte $60,$42 +MoreUpdl + .word EmptyLine + .byte 0,$42 +WeaponsListDL + .word ListOfWeapons + :15 .byte 0,2 + .byte 0, $42 +MoreDownDL + .word EmptyLine + .byte $40,$42 + .word WeaponsDescription + .byte $0,$42 +PurActDescAddr + .word PurchaseDescription + .byte $41 + .word PurchaseDL +;------------------------ +DLCreditsFragm + .byte $60+$80 + .byte $42+$20 ; VSCRL +DLCreditsAddr + .word Credits + :6 .byte $02+$20 + .byte $02 + .byte $41 + .word GameOverDL +.endif \ No newline at end of file diff --git a/display.asm b/display_static.asm similarity index 62% rename from display.asm rename to display_static.asm index 7c4a95e..0d5e39e 100644 --- a/display.asm +++ b/display_static.asm @@ -1,107 +1,6 @@ ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm .IF *>0 ;this is a trick that prevents compiling this file alone -;----------------------------------------------- -; start of "variables" (RAM) -;----------------------------------------------- -OptionsHere - ; 0123456789012345678901234567890123456789 - dta d"Players : 2 3 4 5 6 " - dta d"Cash : none 2K 8K 12K 20K " - dta d"Gravity : 0.2G 0.5G 1G 2G 4G " - dta d"Wind : 1B 3B 5B 7B 9B " - dta d"Rounds : 10 20 30 40 50 " - dta d"Missiles : slug slow norm fast hare " - dta d"Seppuku : nevr rare norm oftn alws " - dta d"Mountains: NL BE CZ CH NP " - dta d"Walls : none wrap bump boxy rand " -;; 01234567890123456789012345678901 -; dta d"Players: 2 3 4 5 6 " -; dta d"Cash :none 2K 8K 12K 20K" -; dta d"Gravity:0.2G 0.5G 1G 2G 4G " -; dta d"Wind : 1B 3B 5B 7B 9B " -; dta d"Rounds : 10 20 30 40 50 " -; dta d"Missile:slug slow norm fast hare" -; dta d"Seppuku:nevr rare norm oftn alws" -; dta d"Hills : NL BE CZ CH NP " -; dta d"Walls :none wrap bump boxy rand" -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:" -NameAdr - dta d" " - dta d" Human/Atari (difficulty level) " - dta d" " -NamesOfLevels - dta d" HUMAN Moron Shooter " - dta d" Poolshark Tosser Chooser " - dta d" Spoiler Cyborg Unknown " - dta d" " - dta d"Tab"* - dta d" - Player/Difficulty level " - dta d" " - dta d"Return"* - dta d" - Proceed " -;--------------------------------------------------- -textbuffer - ; 0123456789012345678901234567890123456789 - dta d"Player: " - dta d"Energy: Angle: Force: " - dta d"Round: Wind: " -textbuffer2 - dta d"Player: Cash: 0" ; ZERO TO MAKE YOU RICHER ON THE SCREEN - -; DLs fragments (modified by game code) -; all Purchase DL :) -PurchaseDL - .byte $70 - .byte $47 -DLPurTitleAddr - .word PurchaseTitle - .byte $50 - .byte $42+$80 - .word textbuffer2 - .byte $60,$42 -MoreUpdl - .word EmptyLine - .byte 0,$42 -WeaponsListDL - .word ListOfWeapons - :15 .byte 0,2 - .byte 0, $42 -MoreDownDL - .word EmptyLine - .byte $40,$42 - .word WeaponsDescription - .byte $0,$42 -PurActDescAddr - .word PurchaseDescription - .byte $41 - .word PurchaseDL -;------------------------ -DLCreditsFragm - .byte $60+$80 - .byte $42+$20 ; VSCRL -DLCreditsAddr - .word Credits - :6 .byte $02+$20 - .byte $02 - .byte $41 - .word GameOverDL -;------------------------ -; end of "variables" (RAM) ;------------------------ ; start of "constants" (ROM) ;----------------------------------------------- @@ -110,9 +9,44 @@ DLCreditsAddr OptionsScreen dta d"Welcome to Scorch v. " build ; 4 bytes from scorch.asm (fancy method) :) - dta d" (un)2000-2022" + dta d" (un)2000-2022" + +.IF TARGET = 800 dta d" Please select option with cursor keys " dta d" and press (Return) to proceed " +.ELIF TARGET = 5200 + dta d" Please select option with joystick one " + dta d" and press FIRE to proceed " +.ENDIF + ; 0123456789012345678901234567890123456789 +;----------------------------------------------- +NameScreen +.IF TARGET = 800 + dta d" Enter names of players " +.ELIF TARGET = 5200 + dta d"Hold " + dta d "FIRE"* + dta d " to enter player names " +.ENDIF +NameScreen3 + dta d" Human/Atari (difficulty level) " +NameScreen5 + .IF TARGET = 800 + dta d" " + dta d"TAB"* + dta d" - Player/Difficulty level " + dta d" " + dta d"Return"* + dta d" - Proceed " +.ELIF TARGET = 5200 + dta d" " + dta d"Joy"* + dta d" - Player/Difficulty level " + dta d" " + dta d"FIRE"* + dta d" - Proceed " +.ENDIF +;----------------------------------------------- MoreUp dta d" " dta 92,92,92 @@ -127,20 +61,39 @@ MoreDown dta d" " WeaponsDescription ; 0123456789012345678901234567890123456789 + .IF TARGET = 800 dta d"Tab"* dta d ": Defensive/Offensive weapon " +.ELIF TARGET = 5200 + dta d"Left"* + dta d ": Defensive/Offensive weapon" +.ENDIF PurchaseDescription ; 0123456789012345678901234567890123456789 + .IF TARGET = 800 dta d"Space"* dta d": Purchase " dta d"Return"* dta d": Finish " +.ELIF TARGET = 5200 + dta d"Right"* + dta d": Purchase " + dta d"FIRE"* + dta d": Finish " +.ENDIF ActivateDescription ; 0123456789012345678901234567890123456789 + .IF TARGET = 800 dta d"Space"* dta d": Activate " dta d"Return"* dta d": Finish " +.ELIF TARGET = 5200 + dta d"Right"* + dta d": Activate " + dta d"FIRE"* + dta d": Finish " +.ENDIF EmptyLine dta d" " ;--------------------------------------------------- @@ -161,9 +114,9 @@ GameOverTitle2 ;----------------------------------------------------- dl ; MAIN game display list - .byte 0 + .byte $70 .byte $42 - .word textbuffer + .word statusBuffer .byte $02, $02 +$80 ;DLI .byte $10 ; 2 blank lines @@ -207,7 +160,6 @@ dl ; MAIN game display list .byte $41 .word dl ;----------------------------------------------- - .ALIGN $1000 ; WARNING!!!! 4KiB barrier crossing here, might need reassignment!!! OptionsDL .byte $70 .byte $47 @@ -222,6 +174,7 @@ OptionsDL :maxOptions-1 .by $02,$10 :(9-maxOptions) .by $70,$10 .byte $80 + .byte $70 ; to match moved sprites .byte $4f .word (display+140*40) :21 .by $0f ;76 @@ -233,12 +186,23 @@ NameDL .byte $70 .byte $47 .word DifficultyTitle - .byte $70,$70 + .byte $70,$70 ; 16 empty lines .byte $42 .word NameScreen - .byte $30 - .byte $02,$30+$80,$02 - .byte $10,$02,$02,$02,$30,$02,$02 + .byte $30 ; 4 empty lines + .byte $42 + .word NameScreen2 + .byte $30+$80 ; 4 empty lines + DLI + .byte $42 + .word NameScreen3 + .byte $10 ; 2 empty lines + .byte $42 + .word NameScreen4 + .byte $02,$02 + .byte $30 ; 4 empty lines + .byte $42 + .word NameScreen5 + .byte $02 .byte $41 .word NameDL ; ------------------------------------------------- @@ -249,6 +213,7 @@ GameOverDL .byte $70,$40 .byte $47 ; 16 gr8 lines .word GameOverTitle + .byte $60 ; 7 lines down to match new sprite position .byte $4f ; 1 line .word display+(40*72) :28 .byte $0f ; 28 lines diff --git a/display_status.asm b/display_status.asm new file mode 100644 index 0000000..c3f5c68 --- /dev/null +++ b/display_status.asm @@ -0,0 +1,11 @@ +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + +.IF *>0 ;this is a trick that prevents compiling this file alone + +statusBuffer + ; 0123456789012345678901234567890123456789 + dta d"Player: " + dta d"Energy: Angle: Force: " + dta d"Round: Wind: " + +.ENDIF \ No newline at end of file diff --git a/grafproc.asm b/grafproc.asm index 76db853..1f42fcd 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -1590,14 +1590,24 @@ nextPointChecking lda (modify),y tax NotHigher - inw modify - cpw modify #(mountaintable+screenwidth) +; inw modify +; cpw modify #(mountaintable+screenwidth) + ; -- + ; better code (with Y reg) + iny + bne @+ + inc modify+1 +@ + lda modify+1 + cmp #>(mountaintable+screenwidth) + bne @+ + cpy # 5200 keypad translation +.enum @kbcode + _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _asterisk = $0a + _hash = $0b + _start = $0c + _pause = $0d + _reset = $0e +.ende +*/ \ No newline at end of file diff --git a/lib/ATARISYS.ASM b/lib/ATARISYS.ASM index 83cc301..7c031de 100644 --- a/lib/ATARISYS.ASM +++ b/lib/ATARISYS.ASM @@ -652,3 +652,71 @@ scr32 = @dmactl(narrow|dma|players|missiles|lineX1) mode10 = %10000000 mode11 = %11000000 .ende +; --------------------------------------------------------------------------- +; KBCODEs +; --------------------------------------------------------------------------- +.enum @kbcode + _none = 255 + _esc = 28 + _1 = 31 + _2 = 30 + _3 = 26 + _4 = 24 + _5 = 29 + _6 = 27 + _7 = 51 + _8 = 53 + _9 = 48 + _0 = 50 + _lt = 54 + _gt = 55 + _del = 52 + _tab = 44 + _Q = 47 + _W = 46 + _E = 42 + _R = 40 + _T = 45 + _Y = 43 + _U = 11 + _I = 13 + _O = 8 + _P = 10 + _min = 14 + _up = 14 ; cursor function + _eq = 15 + _down = 15 ; cursor function + _ret = 12 + _A = 63 + _S = 62 + _D = 58 + _F = 56 + _G = 61 + _H = 57 + _J = 1 + _K = 5 + _L = 0 + _semicolon = 2 + _plus = 6 + _left = 6 ; cursor function + _asterisk = 7 + _right = 7 ; cursor function + _caps = 60 + _Z = 23 + _X = 22 + _C = 18 + _V = 16 + _B = 21 + _N = 36 + _M = 37 + _comma = 32 + _dot = 34 + _slash = 38 + _atari = 39 + _help = 17 + _F1 = 3 + _F2 = 4 + _F3 = 19 + _F4 = 20 + _space = 33 +.ende \ No newline at end of file diff --git a/lib/macro.hea b/lib/MACRO.ASM similarity index 99% rename from lib/macro.hea rename to lib/MACRO.ASM index 2567870..14e7780 100644 --- a/lib/macro.hea +++ b/lib/MACRO.ASM @@ -101,7 +101,7 @@ sta :1+1 .endm ;------------------------------------- - .macro randomize + .macro randomizer ;usage: randomize floor ceiling ;returns (in A) a random .byte between "floor" and "ceiling" .if :2 < :1 diff --git a/scorch.asm b/scorch.asm index 3a70a9f..c6adf6b 100644 --- a/scorch.asm +++ b/scorch.asm @@ -2,45 +2,30 @@ ;Atari 8-bit Scorched Earth source code ;--------------------------------------------------- ;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 +;Warsaw 2000, 2001, 2002, 2003, 2009, 2012, 2013 +;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 +;--------------------------------------------------- +.def TARGET = 800 ;5200 ; or 800 +;atari800 -5200 -cart ${outputFilePath} -cart-type 4 +;atari800 -run ${outputFilePath} +;--------------------------------------------------- -;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 + OPT r+ ; saves 12 bytes :O +;--------------------------------------------------- .macro build - dta d"1.14" ; number of this build (3 bytes) + dta d"1.16" ; number of this build (4 bytes) .endm +.macro RMTSong + lda #:1 + jsr RMTSongSelect +.endm + +;--------------------------------------------------- icl 'definitions.asm' - +;--------------------------------------------------- .zpvar xdraw .word = $64 ;variable X for plot .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) @@ -83,9 +68,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 @@ -103,7 +85,6 @@ .zpvar Counter .byte ;temporary Counter for outside loops .zpvar ExplosionRadius .word ;because when adding in xdraw it is double byte .zpvar ResultY .byte -; .zpvar FallDown2 .byte .zpvar xcircle .word .zpvar ycircle .word .zpvar vy .word @@ -134,7 +115,6 @@ .zpvar HowToDraw .byte .zpvar gravity .byte .zpvar LineLength .word - ;.zpvar LineAddress4x4 .word .zpvar tracerflag .byte .zpvar isInventory .byte .zpvar DifficultyLevel .byte @@ -143,28 +123,97 @@ .zpvar L1 .byte ;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65 - .zpvar RMT_Zero_Page_V .byte displayposition = modify LineAddress4x4 = temp -;------------------------------- +;----------------------------------------------- +; libraries +;----------------------------------------------- + .IF TARGET = 5200 + OPT h-f+ ; no headers, single block --> cart bin file + icl 'lib/5200SYS.ASM' + icl 'lib/5200MACRO.ASM' + .enum @kbcode + /* + _0 + _1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _asterisk = $0a + _hash = $0b + _start = $0c + _pause = $0d + _reset = $0e + */ + _space = $00 + _Y = $01 + _up = $f2 ;02 + _O = $03 + _left = $f4 ;04 + _tab = $05 + _right = $f6 ;06 + _A = $07 + _down = $f8 ;08 + _I = $09 + _esc = $0a + _ret = $fb ;$0b ;not used in 5200 + _del = $fc ;$0c ;not used in 5200 + _M = $0d + _S = $0e + _none = $0f - icl 'lib/ATARISYS.ASM' - icl 'lib/macro.hea' - - ;splash screen and musix - icl 'artwork/Scorch50.asm' - - - ;Game loading address - ORG $3000 + .ende */ + .ELSE + icl 'lib/ATARISYS.ASM' + icl 'lib/MACRO.ASM' + icl 'artwork/Scorch50.asm' ; splash screen and musix + .ENDIF + +;----------------------------------------------- +; variable declarations in RAM (no code) +;----------------------------------------------- + ORG PMGraph + $0300 - (variablesEnd - OneTimeZeroVariables + 1) + icl 'variables.asm' + + ; Game loading address + ORG $4000 + WeaponFont ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' + ;----------------------------------------------- ;Screen displays go here to avoid crossing 4kb barrier ;----------------------------------------------- - icl 'display.asm' + DisplayCopyRom = * + org display, DisplayCopyRom +DisplayCopyStart + icl 'display_main_menu.asm' +DisplayCopyEnd + org DisplayCopyRom + (DisplayCopyEnd - DisplayCopyStart) + + DisplayCopyPurchaseDlROM = * + org DisplayCopyPurchase, DisplayCopyPurchaseDlROM +DisplayCopyPurchaseStart + icl 'display_purchasedl.asm' +DisplayCopyPurchaseEnd + org DisplayCopyPurchaseDlROM + (DisplayCopyPurchaseEnd - DisplayCopyPurchaseStart) + + StatusBufferROM = * + org StatusBufferCopy, StatusBufferROM +StatusBufferCopyStart + icl 'display_status.asm' +StatusBufferCopyEnd + org StatusBufferROM + (StatusBufferCopyEnd - StatusBufferCopyStart) + + + icl 'display_static.asm' ;---------------------------------------------- ;-------------------------------------------------- @@ -176,15 +225,15 @@ FirstSTART ; one time zero variables in RAM (non zero page) lda #0 ldy #OneTimeZeroVariablesCount-1 -@ sta OneTimeZeroVariables,y - dey +@ sta OneTimeZeroVariables,y + dey bpl @- ; initialize variables in RAM (non zero page) ldy #initialvaluesCount-1 -@ lda initialvaluesStart,y - sta variablesToInitialize,y - dey +@ lda initialvaluesStart,y + sta variablesToInitialize,y + dey bpl @- @@ -202,7 +251,6 @@ FirstSTART cpy #screenheight+1 bne @- - ; RMT INIT lda #$f0 ;initial value sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240) @@ -210,20 +258,24 @@ FirstSTART lda #$ff ;initial value sta sfx_effect - lda #0 - jsr RmtSongSelect + RMTSong 0 + .IF TARGET = 5200 + mva #$0f STICK0 + mva #$04 CONSOL5200 ;Speaker off, Pots enabled, port #1 selected + mwa #kb_continue VKEYCNT ;Keyboard handler + .ENDIF VMAIN VBLinterrupt,7 ;jsr SetVBL + mva #2 chactl ; necessary for 5200 + START ; Startup sequence jsr Initialize ;jsr GameOverScreen ; only for test !!! - lda #song_main_menu - jsr RmtSongSelect - + RMTSong song_main_menu jsr Options ;startup screen jsr MakeDarkScreen @@ -242,12 +294,7 @@ MainGameLoop jsr SetWallsType ; first set default barrel lengths (fix for Long Schlong activation :) ) ; we must do it before purchase/activate - ldx #(MaxPlayers-1) -SettingBarrel - lda #StandardBarrel ; standard barrel length - sta BarrelLength,x - dex - bpl SettingBarrel + jsr SetStandardBarrels jsr CallPurchaseForEveryTank @@ -281,8 +328,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 +431,7 @@ GoGameOver NoGameOverYet inc CurrentRoundNr jsr MakeDarkScreen ; issue #72 - jsr RmtSongSelect + ; jsr RmtSongSelect ; ????? mva #sfx_silencer sfx_effect jsr PMoutofscreen @@ -402,8 +448,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 @@ -457,16 +502,15 @@ SettingEnergies jsr calculatemountains ;let mountains be easy for the eye ;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height + + mwa #StatusBufferROM temp + mwa #StatusBufferCopy temp2 + mwa #StatusBufferCopyEnd+1 modify + jsr CopyFromROM + jsr SetMainScreen jsr ColorsOfSprites -; lda #90 ; barrel fully erect -; ldx #MaxPlayers-1 -;@ sta previousBarrelAngle,x -; dex -; bpl @- - - jsr drawmountains ;draw them jsr drawtanks ;finally draw tanks @@ -570,7 +614,7 @@ RoboTanks jsr DisplayStatus ; to make visible AI selected defensive (and offensive :) ) jsr MoveBarrelToNewPosition lda kbcode - cmp #28 ; ESC + cmp #@kbcode._esc ; 28 ; ESC bne @+ jsr AreYouSure @ lda escFlag @@ -632,16 +676,9 @@ ShootNow lda HitFlag ;0 if missed beq missed - lda #0 -; sta FallDown2 jsr Explosion continueMainRoundLoopAfterSeppuku - ;here we clear offensive text (after a shoot) - ;ldy TankNr - ;mva #0 plot4x4color - ;jsr DisplayOffensiveTextNr - AfterExplode jsr SoilDown2 ; allways @@ -659,9 +696,8 @@ NoExistNoFall dex bpl TanksFallDown mvx tempor2 TankNr -missed - ; TODO: IS IT OK??? possibly a fix here needed for #56 +missed ldy WeaponDepleted bne @+ ldx TankNr @@ -670,7 +706,6 @@ missed @ ;here we clear offensive text (after a shoot) - ;shit -- it's second time, but it must be like this ldy TankNr mva #$00 plot4x4color jsr DisplayOffensiveTextNr @@ -742,7 +777,6 @@ NoPlayerNoDeath ;clear NoDeathCounter here sta noDeathCounter - ; display defensive text here (well, defensive ; is not the real meaning, it should be pre-death, ; but I am too lazy to change names of variables) @@ -756,7 +790,7 @@ NoPlayerNoDeath inc CurrentResult mva #sfx_death_begin sfx_effect -;RandomizeDeffensiveText + ; RandomizeDeffensiveText randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) sta TextNumberOff ldy TankTempY @@ -794,7 +828,6 @@ NoPlayerNoDeath ;cleanup of the soil fall down ranges (left and right) sta RangeRight sta RangeRight+1 -; sta FallDown2 mwa #screenwidth RangeLeft ; We are randomizing the weapon now. @@ -901,11 +934,10 @@ NotNegativeShieldEnergy ;--------------------------------- .proc Seppuku lda #0 - ;sta FallDown2 sta ydraw+1 ; get position of the tank ldx TankNr - lda #0 ; turn off defense weapons when hara-kiring +; lda #0 ; turn off defense weapons when hara-kiring sta ActiveDefenceWeapon,x sta ShieldEnergy,x jsr SetupXYdraw @@ -973,27 +1005,6 @@ B0 DEY sta MaxForceTableL,x rts .endp -;-------------------------------------------------- -.proc PMoutofScreen -;-------------------------------------------------- - lda #$00 ; let all P/M disappear - :8 sta hposp0+# - rts -.endp -;-------------------------------------------------- -.proc ColorsOfSprites - lda TankColoursTable ; colours of sprites under tanks - sta PCOLR0 - lda TankColoursTable+1 - sta PCOLR1 - lda TankColoursTable+2 - sta PCOLR2 - lda TankColoursTable+3 - sta PCOLR3 - LDA TankColoursTable+4 - STA COLOR3 ; joined missiles (5th tank) - rts -.endp ;-------------------------------------------------- .proc WeaponCleanup; @@ -1095,17 +1106,6 @@ MakeTanksVisible rts .endp ;-------------------------------------------------- -.proc SetPMWidth - lda #$00 - sta sizep0 ; P0-P3 widths - sta sizep0+1 - sta sizep0+2 - sta sizep0+3 - lda #%01010101 - sta sizem ; all missiles, double width - rts -.endp -;-------------------------------------------------- .proc DLIinterruptGraph ;sta dliA ;sty dliY @@ -1114,8 +1114,9 @@ MakeTanksVisible ldy dliCounter lda dliColorsBack,y ldy dliColorsFore - nop - nop + .IF TARGET = 800 + nop ; necessary on 800 because DLIs take less time, jitter visible without it + .ENDIF nop sta COLPF1 sty COLPF2 @@ -1162,7 +1163,7 @@ ColoredLines cmp #9 beq CreditsScroll tay - lda GameOverColoursTable-3,y ; -2 becouse this is DLI nr 2 and -1 (labels line) + lda GameOverColoursTable-3,y ; -2 because this is DLI nr 2 and -1 (labels line) ldy #$0a ; text colour (brightnes) STA WSYNC sta COLPF2 @@ -1176,6 +1177,7 @@ CreditsScroll cmp #32 ;not too fast beq nextlinedisplay :2 lsr ;not too fast + sta WSYNC sta VSCROL jmp EndOfDLI_GO nextlinedisplay @@ -1196,8 +1198,9 @@ EndOfDLI_GO .proc DLIinterruptText ;sta dliA pha + lda #TextBackgroundColor sta WSYNC - mva #TextBackgroundColor COLPF2 + sta COLPF2 mva #TextForegroundColor COLPF3 ;lda dliA pla @@ -1206,9 +1209,6 @@ DLIinterruptNone .endp ;-------------------------------------------------- .proc VBLinterrupt - pha - phx - phy mva #0 dliCounter lda PAL @@ -1244,11 +1244,59 @@ lab2 ; ------- RMT ------- SkipRMTVBL exitVBL - ply - plx - pla - jmp XITVBV + .IF TARGET = 5200 + center = 114 ;Read analog stick and make it look like a digital stick + threshold = 60 + + lda paddl0 ;Read POT0 value (horizontal position) + cmp #center+threshold ;Compare with right threshold + rol stick0 ;Feed carry into digital stick value + cmp #center-threshold ;Compare with left threshold + rol stick0 ;Feed carry into digital stick value + + lda paddl1 ;Read POT1 value (vertical position) + cmp #center+threshold ;Compare with down threshold + rol stick0 ;Feed carry into digital stick value + cmp #center-threshold ;Compare with down threshold + rol stick0 ;Feed carry into digital stick value + + lda stick0 ;0 indicates a press so the right/down values need to be inverted + eor #2+8 + and #$0f + sta stick0 + + mva trig0 strig0 ;Move hardware to shadow + + mva chbas chbase + + lda skstat ;Reset consol key shadow is no key is pressed anymore + and #4 + beq @+ + mva #consol_reset consol + mva #@kbcode._none kbcode +@ + + pla + tay + pla + tax + pla + rti + .ELSE + jmp XITVBV + .ENDIF .endp + .IF TARGET = 5200 +.proc kb_continue + sta kbcode ;Store key code in shadow. +exit pla + tay + pla + tax + pla + rti +.endp + .ENDIF ;---------------------------------------------- .proc RandomizeSequence0 ldx #0 @@ -1466,7 +1514,7 @@ Bubble BubbleBobble lda TempResults,x cmp TempResults+1,x - beq nextishigher ; this is to block hangs when 2 same values meet + beq nextishigher ; this is to block hangs when 2 equal values meet bcc nextishigher ;here we must swap values ;because next is smaller than previous @@ -1518,18 +1566,21 @@ SetRandomWalls ;-------------------------------------------------- jsr WaitForKeyRelease @ - lda SKSTAT - cmp #$ff - beq checkJoyGetKey ; key not pressed, check Joy - cmp #$f7 ; SHIFT - beq checkJoyGetKey - - lda kbcode - and #$3f ;CTRL and SHIFT ellimination - cmp #28 ; ESC - bne getkeyend - mvx #$80 escFlag - bne getkeyend + .IF TARGET = 800 + lda SKSTAT + cmp #$ff + beq checkJoyGetKey ; key not pressed, check Joy + cmp #$f7 ; SHIFT + beq checkJoyGetKey + .ENDIF + lda kbcode + cmp #@kbcode._none + beq checkJoyGetKey + and #$3f ;CTRL and SHIFT ellimination + cmp #@kbcode._esc ; 28 ; ESC + bne getkeyend + mvx #$80 escFlag + bne getkeyend checkJoyGetKey ;------------JOY------------- @@ -1547,7 +1598,7 @@ notpressedJoyGetKey ;fire lda STRIG0 bne @- - lda #$0c ;Return key + lda #@kbcode._ret ;Return key getkeyend mvx #sfx_keyclick sfx_effect @@ -1566,20 +1617,22 @@ getkeyend ;-------------------------------------------------- .proc WaitForKeyRelease ;-------------------------------------------------- - lda STICK0 - and #$0f - cmp #$0f - bne WaitForKeyRelease - lda STRIG0 - beq WaitForKeyRelease - lda SKSTAT - cmp #$ff - bne WaitForKeyRelease - lda CONSOL - and #%00000110 ; Select and Option only - cmp #%00000110 - bne WaitForKeyRelease - rts + lda STICK0 + and #$0f + cmp #$0f + bne WaitForKeyRelease + lda STRIG0 + beq WaitForKeyRelease + .IF TARGET = 800 + lda SKSTAT + cmp #$ff + bne WaitForKeyRelease + lda CONSOL + and #%00000110 ; Select and Option only + cmp #%00000110 + bne WaitForKeyRelease + rts + .ENDIF .endp ;-------------------------------------------------- .proc IsKeyPressed ; A=0 - yes , A>0 - no @@ -1606,26 +1659,25 @@ checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE ;pause 150 ldy #75 jsr PauseYFrames - jmp noKey + rts peopleAreHere - jsr getkey -noKey - rts + jmp getkey ; jsr:rts .endp + MakeDarkScreen mva #0 dmactls ; dark screen + sta dmactl ; and wait one frame :) .proc WaitOneFrame lda CONSOL and #%00000101 ; Start + Option - bne @+ - mva #$40 escFlag -@ and #%00000001 ; START KEY - beq @+ - wait -@ rts + sne:mva #$40 escFlag + and #%00000001 ; START KEY + seq:wait + rts .endp + .proc PauseYFrames ; Y - number of frames to wait (divided by 2) ; pauses for maximally 510 frames (255 * 2) @@ -1641,7 +1693,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 @@ -1652,58 +1704,115 @@ noingame mva #0 RMT_blocked rts .endp -;;-------------------------------------------------- -;.proc Randomizer -;;-------------------------------------------------- -; ;usage: randomize floor ceiling -; ;returns (in A) a random .byte between "floor" and "ceiling" -;?rand -; lda random -; cmp #:1 ;floor -; bcc ?rand -; cmp #:2+1 ;ceiling -; bcs ?rand -; rts -;.endp +;------------------------------------------------- +.proc CopyFromROM +;------------------------------------------------- +;copy from CART to RAM +; trashes: Y +; temp: source +; temp2: destination +; modify: destination-end +;usage: +; mwa #DisplayCopyRom temp +; mwa #display temp2 +; mwa #DisplayCopyEnd+1 modify +; jsr CopyFromROM + + ldy #0 +@ lda (temp),y + sta (temp2),y + inw temp + inw temp2 + cpw temp2 modify + bne @- + rts +.endp +;-------------------------------------------------- +.macro randomize floor ceiling +;-------------------------------------------------- + ;usage: randomize floor ceiling + ;returns (in A) a random .byte between "floor" and "ceiling" + jsr _randomizator + .byte :floor + .byte :ceiling +.endm + +.proc _randomizator +; private function that accompanies `randomize` macro +; trashes: magic, temp, Y + pla + sta magic + pla + sta magic+1 + ldy #1 ; add 1 to the value got from the stack to point to the input parameters + lda (magic),y + sta temp + iny + lda (magic),y + sta temp+1 + +?rand + lda random + cmp temp ;floor + bcc ?rand + cmp temp+1 ;ceiling + bcs ?rand + tay ; save the result + + ; point the PC to a byte after the parameters + clc + lda magic + adc #2 ; length of the parameters in bytes + sta magic + lda magic+1 + adc #0 + pha + lda magic + pha + tya ; retrieve the result + rts +.endp ;---------------------------------------------- - icl 'weapons.asm' + icl 'constants.asm' ;---------------------------------------------- icl 'textproc.asm' ;---------------------------------------------- icl 'grafproc.asm' ;---------------------------------------------- - icl 'ai.asm' + icl 'weapons.asm' ;---------------------------------------------- - icl 'constants.asm' + icl 'ai.asm' ;---------------------------------------------- icl 'artwork/talk.asm' ;---------------------------------------------- TankFont ins 'artwork/tanksv3.fnt',+0,352 ; 44 characters only ;---------------------------------------------- - icl 'variables.asm' -;---------------------------------------------- -; reserved space for RMT player - .ds $0320 - .align $100 -PLAYER - .ECHO 'PLAYER: ',* - icl 'artwork/sfx/rmtplayr.a65' - -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+ -; +;RMT PLAYER and song loading shenaningans + icl 'artwork/sfx/rmtplayr_modified.asm' + org $b000 +MODUL ; equ $b000 ;address of RMT module + ;opt h- ;RMT module is standard Atari binary file already + ins "artwork/sfx/scorch_str6.rmt",+6 ;include music RMT module + ;opt h+ +MODULEND ;---------------------------------------------- - org $bf80 font4x4 ins 'artwork/font4x4s.bmp',+62 - - - - - - run FirstSTART +;---------------------------------------------- + .IF target = 5200 + .IF * > ROM_SETTINGS-1 + .ERROR 'Code too long to fit in 5200' + .ENDIF + org ROM_SETTINGS ; 5200 ROM settings address $bfe8 + ; "01234567890123456789" + .byte " scorch 5200 v" ;20 characters title + build ; " " + .byte " " + .byte "7A" ;2 characters year .. 1900 + $7A = 2020 + .word FirstSTART + .ELSE + run FirstSTART + .ENDIF \ No newline at end of file diff --git a/scorch.bin b/scorch.bin new file mode 100644 index 0000000..44756d4 Binary files /dev/null and b/scorch.bin differ diff --git a/scorch.xex b/scorch.xex index 1f25853..b1aa435 100644 Binary files a/scorch.xex and b/scorch.xex differ diff --git a/textproc.asm b/textproc.asm index f112879..c3c1971 100644 --- a/textproc.asm +++ b/textproc.asm @@ -18,11 +18,13 @@ jsr clearscreen ;let the screen be clean + mwa #DisplayCopyRom temp + mwa #display temp2 + mwa #DisplayCopyEnd+1 modify + jsr CopyFromROM + mwa #OptionsDL dlptrs -; lda dmactls -; and #$fc -; ora #$02 ; normal screen width -; lda #%00110010 ; normal screen width, DL on, P/M off + lda #%00111110 ; normal screen width, DL on, P/M on sta dmactls jsr SetPMWidth @@ -42,7 +44,7 @@ sta mountainDeltaL mva #6 NumberOfPlayers jsr PMoutofScreen ;let P/M disappear - jsr clearscreen ;let the screen be clean + ;jsr clearscreen ;let the screen be clean (clean-ish already) jsr ClearPMmemory jsr placetanks ;let the tanks be evenly placed jsr calculatemountains ;let mountains be easy for the eye @@ -66,7 +68,7 @@ OptionsMainLoop bit escFlag spl:rts - cmp #$f ;cursor down + cmp #@kbcode._down ; $f ;cursor down bne OptionsNoDown inc:lda OptionsY cmp #maxoptions @@ -75,7 +77,7 @@ OptionsMainLoop jmp OptionsMainLoop OptionsNoDown - cmp #$e ;cursor up + cmp #@kbcode._up ; $e ;cursor up bne OptionsNoUp dec OptionsY bpl OptionsMainLoop @@ -83,7 +85,7 @@ OptionsNoDown jmp OptionsMainLoop OptionsNoUp - cmp #$6 ;cursor left + cmp #@kbcode._left ; $6 ;cursor left bne OptionsNoLeft ldx OptionsY dec OptionsTable,X @@ -93,19 +95,19 @@ OptionsNoUp jmp OptionsMainLoop OptionsNoLeft - cmp #$7 ;cursor right + cmp #@kbcode._right ; $7 ;cursor right bne OptionsNoRight ldx OptionsY inc OptionsTable,X lda OptionsTable,X - cmp #5 + cmp #5 ; number of columns in options bne OptionsMainLoop dec OptionsTable,X jmp OptionsMainLoop OptionsNoRight - cmp #$c ;Return key + cmp #@kbcode._ret ; $c ;Return key bne OptionsNoReturn jmp OptionsFinished OptionsNoReturn @@ -276,6 +278,15 @@ AfterManualPurchase ; offensive weapon - 0, defensive - %10000000 jmp Purchase.GoToActivation .endp + +;-------------------------------------------------- +.proc CopyFromPurchaseAndGameOver + mwa #DisplayCopyPurchaseDlROM temp + mwa #DisplayCopyPurchase temp2 + mwa #DisplayCopyPurchaseEnd+1 modify + jmp CopyFromROM ; jsr:rts +.endp + ;-------------------------------------------------- .proc Purchase ; ;-------------------------------------------------- @@ -284,6 +295,8 @@ AfterManualPurchase ; Rest of the data is taken from appropriate tables ; and during the purchase these tables are modified. + jsr CopyFromPurchaseAndGameOver + mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons ; we are clearing list of the weapons @@ -303,7 +316,7 @@ GoToActivation bpl @+ lda #song_inventory @ jsr RmtSongSelect - + ldx tankNr lda TankStatusColoursTable,x sta COLOR2 @@ -317,7 +330,7 @@ GoToActivation tax NextChar03 lda tanksnames,x - sta textbuffer2+8,y + sta purchaseTextBuffer+8,y inx iny cpy #$08 @@ -335,7 +348,7 @@ AfterPurchase sta decimal lda moneyH,x sta decimal+1 - mwa #textbuffer2+26 displayposition + mwa #purchaseTextBuffer+26 displayposition jsr displaydec5 ; in xbyte there is the address of the line that @@ -385,19 +398,19 @@ ChoosingItemForPurchase jsr getkey bit escFlag spl:jmp WaitForKeyRelease ; like jsr ... : rts - cmp #$2c ; Tab + cmp #@kbcode._esc ; $2c ; Tab jeq ListChange - cmp #$06 ; cursor left + cmp #@kbcode._left ; $06 ; cursor left jeq ListChange - cmp #$0c ; Return + cmp #@kbcode._ret ; $0c ; Return sne:rts - cmp #$e + cmp #@kbcode._up ; $e beq PurchaseKeyUp - cmp #$f + cmp #@kbcode._down ; $f beq PurchaseKeyDown - cmp #$21 ; Space + cmp #@kbcode._space ; $21 ; Space jeq PurchaseWeaponNow - cmp #$07 ; cursor right + cmp #@kbcode._right ; $07 ; cursor right jeq PurchaseWeaponNow bne ChoosingItemForPurchase @@ -1057,7 +1070,7 @@ NoArrowDown sta difficultyLevel inx stx decimal - mwa #(NameScreen+41) displayposition + mwa #(NameScreen2+9) displayposition jsr displaybyte jsr HighlightLevel ; setting choosen level of the opponent (Moron, etc) @@ -1124,20 +1137,20 @@ YesLetter @ stx PositionInName ; if not, we store jmp CheckKeys CheckFurtherX01 ; here we check Tab, Return and Del - cmp #$0c ; Return + cmp #@kbcode._ret ; $0c ; Return jeq EndOfNick - cmp #$2c ; Tab + cmp #@kbcode._tab ; $2c ; Tab beq ChangeOfLevelUp - cmp #$7 ;cursor right + cmp #@kbcode._right ; $7 ;cursor right beq ChangeOfLevelUp - cmp #$6 ;cursor left + cmp #@kbcode._left ; $6 ;cursor left beq ChangeOfLevelDown - cmp #$f ;cursor down + cmp #@kbcode._down ; $f ;cursor down beq ChangeOfLevel3Up - cmp #$e ;cursor up + cmp #@kbcode._up ; $e ;cursor up beq ChangeOfLevel3Down - cmp #$34 ; Backspace (del) + cmp #@kbcode._del ; $34 ; Backspace (del) bne CheckKeys ; handling backing one char ldx PositionInName @@ -1321,7 +1334,7 @@ JoyNotCentered bne NoRight ; joy right cpy #7 - beq GoToMainLoop ; jast character + beq GoToMainLoop ; the last character iny bne GoToMainLoop NoRight @@ -1340,7 +1353,7 @@ NoLeft ; joy up cpx #(keycodesEnd-keycodes-1) bne @+ - ldx #$00 ; set to first character index (loop) + ldx #$00 ; set to the first character index (loop) beq CharAndMainLoop @ inx bne CharAndMainLoop @@ -1350,7 +1363,7 @@ NoUp ; joy down dex bpl CharAndMainLoop - ldx #(keycodesEnd-keycodes-1) ; set to last character index (loop) + ldx #(keycodesEnd-keycodes-1) ; set to the last character index (loop) CharAndMainLoop lda scrcodes,x sta NameAdr,y @@ -1754,7 +1767,7 @@ EndOfTypeLine4x4 jsr GetKey - cmp #$2b ; "Y" + cmp #@kbcode._Y ; $2b ; "Y" bne @+ mva #$80 escFlag bne skip01 @@ -1864,8 +1877,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 @@ -2008,6 +2020,7 @@ FinishResultDisplay jsr ClearPMmemory jsr PrepareCredits jsr GameOverResultsClear + jsr CopyFromPurchaseAndGameOver mwa #GameOverDL dlptrs lda #%00111110 ; normal screen width, DL on, P/M on sta dmactls @@ -2113,8 +2126,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 @ @@ -2258,13 +2270,13 @@ EndOfCredits ;displaying symbol of the weapon ;--------------------- ;display name and symbol of the weapon - ;textbuffer+18 - symbol (1 char) - ;textbuffer+20 - quantity left - ;textbuffer+23 - name + ;statusBuffer+18 - symbol (1 char) + ;statusBuffer+20 - quantity left + ;statusBuffer+23 - name ldx TankNr ldy ActiveWeapon,x lda WeaponSymbols,y - sta TextBuffer+18 + sta statusBuffer+18 ;--------------------- ;displaying quantity of the given weapon @@ -2272,7 +2284,7 @@ EndOfCredits lda ActiveWeapon,x jsr HowManyBullets sta decimal - mwa #textbuffer+20 displayposition + mwa #statusBuffer+20 displayposition jsr displaybyte ;--------------------- @@ -2293,7 +2305,7 @@ EndOfCredits ldy #15 @ lda (temp),y - sta textbuffer+23,y + sta statusBuffer+23,y dey bpl @- @@ -2301,15 +2313,15 @@ EndOfCredits ;displaying name of the defence weapon (if active) ;--------------------- lda #$08 ; ( - sta textbuffer+80+22 + sta statusBuffer+80+22 lda #$09 ; ) - sta textbuffer+80+39 + sta statusBuffer+80+39 lda ActiveDefenceWeapon,x bne ActiveDefence ; clear brackets lda #space - sta textbuffer+80+22 - sta textbuffer+80+39 + sta statusBuffer+80+22 + sta statusBuffer+80+39 mwa #emptyLine temp jmp ClearingOnly ActiveDefence @@ -2327,7 +2339,7 @@ ClearingOnly ldy #15 @ lda (temp),y - sta textbuffer+40+40+23,y + sta statusBuffer+40+40+23,y dey bpl @- @@ -2338,7 +2350,7 @@ ClearingOnly lda Energy,x sta decimal - mwa #textbuffer+48 displayposition + mwa #statusBuffer+48 displayposition jsr displaybyte ;--------------------- @@ -2346,10 +2358,10 @@ ClearingOnly ;--------------------- ; clear (if no shield) lda #space - sta textbuffer+40+10 - sta textbuffer+40+11 - sta textbuffer+40+12 - sta textbuffer+40+13 + sta statusBuffer+40+10 + sta statusBuffer+40+11 + sta statusBuffer+40+12 + sta statusBuffer+40+13 ; check shield energy and display it ldx TankNr lda ActiveDefenceWeapon,x @@ -2358,11 +2370,11 @@ ClearingOnly beq NoShieldEnergy sta decimal ; displayed value lda #$08 ; ( - sta textbuffer+40+10 - mwa #textbuffer+40+11 displayposition + sta statusBuffer+40+10 + mwa #statusBuffer+40+11 displayposition jsr displaybyte lda #$09 ; ) - sta textbuffer+40+13 + sta statusBuffer+40+13 NoDefenceWeapon NoShieldEnergy @@ -2373,9 +2385,9 @@ NoShieldEnergy lda Wind+3 ; highest byte of 4 byte wind bmi DisplayLeftWind lda #$7f ; (tab) char - sta textbuffer+80+20 + sta statusBuffer+80+20 lda #space - sta textbuffer+80+17 + sta statusBuffer+80+17 beq DisplayWindValue DisplayLeftWind sec ; Wind = -Wind @@ -2386,14 +2398,14 @@ DisplayLeftWind sbc temp+1 sta temp+1 lda #$7e ;(del) char - sta textbuffer+80+17 + sta statusBuffer+80+17 lda #space - sta textbuffer+80+20 + sta statusBuffer+80+20 DisplayWindValue :4 lsrw temp ;divide by 16 to have a nice value on a screen lda temp sta decimal - mwa #textbuffer+80+18 displayposition + mwa #statusBuffer+80+18 displayposition jsr displaybyte ;========================= @@ -2401,7 +2413,7 @@ DisplayWindValue ;========================= lda CurrentRoundNr sta decimal - mwa #textbuffer+80+7 displayposition + mwa #statusBuffer+80+7 displayposition jsr displaybyte ;decimal (byte), displayposition (word) ;========================= @@ -2412,7 +2424,7 @@ DisplayWindValue sta decimal lda ForceTableH,x sta decimal+1 - mwa #textbuffer+40+35 displayposition + mwa #statusBuffer+40+35 displayposition jsr displaydec5 ;========================= @@ -2428,9 +2440,9 @@ AngleToRight ; now we have values from 0 to 89 and right angle sta decimal lda #$7f ; (tab) character - sta textbuffer+40+25 + sta statusBuffer+40+25 lda #space - sta textbuffer+40+22 + sta statusBuffer+40+22 beq AngleDisplay AngleToLeft sec @@ -2439,19 +2451,19 @@ AngleToLeft ; angles 180 - 91 converted to 0 - 89 sta decimal lda #$7e ;(del) char - sta textbuffer+40+22 + sta statusBuffer+40+22 lda #space - sta textbuffer+40+25 + sta statusBuffer+40+25 beq AngleDisplay VerticallyUp ; now we have value 90 sta decimal lda #space - sta textbuffer+40+25 - sta textbuffer+40+22 + sta statusBuffer+40+25 + sta statusBuffer+40+22 AngleDisplay - mwa #textbuffer+40+23 displayposition + mwa #statusBuffer+40+23 displayposition jsr displaybyte ldx TankNr rts @@ -2467,7 +2479,7 @@ AngleDisplay tax NextChar02 lda tanksnames,x - sta textbuffer+7,y + sta statusBuffer+7,y inx iny cpy #$08 @@ -2496,7 +2508,7 @@ NextChar02 ; set background lda #$ff - ldx #100 ; top of the sprites + ldx #100+7 ; top of the sprites @ sta PMGraph+$400,x sta PMGraph+$500,x inx @@ -2511,6 +2523,5 @@ NextChar02 rts .endp -;------------------------------------------------- .endif \ No newline at end of file diff --git a/variables.asm b/variables.asm index 379ae63..9098334 100644 --- a/variables.asm +++ b/variables.asm @@ -14,35 +14,43 @@ 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 +linetableL ; = PMGraph + $0300 - (screenHeight+1)*2 + .ds (screenHeight+1) +linetableH ; = PMGraph + $0300 - (screenHeight+1) + .ds (screenHeight+1) +DisplayCopyPurchase + .ds (DisplayCopyPurchaseEnd - DisplayCopyPurchaseStart +1) +StatusBufferCopy + .ds screenBytes*3 ;===================================================== variablesStart ; zeroing starts here ;===================================================== @@ -56,69 +64,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 +150,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 +375,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 @@ -417,8 +425,52 @@ Xcounter4x4 .DS 1 nibbler4x4 .DS 1 CharCode4x4 .DS 1 ;plot4x4color .DS 1 ;1-white, 0-background - - +; 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 +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 variablesEnd ;---------------------------------------------------- diff --git a/weapons.asm b/weapons.asm index 5fb42cd..01f90fe 100644 --- a/weapons.asm +++ b/weapons.asm @@ -17,7 +17,6 @@ pha lda ExplosionRoutines,x pha -; inc FallDown2 rts ExplosionRoutines .word babymissile-1 ;Baby_Missile___;_00 @@ -62,35 +61,30 @@ tracer ; ------------------------ .proc babymissile mva #sfx_baby_missile sfx_effect -; inc FallDown2 mva #11 ExplosionRadius jmp xmissile .endp ; ------------------------ .proc missile ; mva #sfx_baby_missile sfx_effect -; inc FallDown2 mva #17 ExplosionRadius jmp xmissile .endp ; ------------------------ .proc babynuke mva #sfx_nuke sfx_effect -; inc FallDown2 mva #25 ExplosionRadius jmp xmissile .endp ; ------------------------ .proc nuke mva #sfx_nuke sfx_effect -; inc FallDown2 mva #30 ExplosionRadius jmp xmissile .endp ; ------------------------ .proc leapfrog mva #sfx_baby_missile sfx_effect -; inc FallDown2 mva #17 ExplosionRadius jsr xmissile @@ -143,7 +137,6 @@ EndOfLeapping .endp ; ------------------------ .proc mirv ; the whole mirv is performed by Flight routine -; inc FallDown2 rts .endp ; ------------------------ @@ -151,7 +144,6 @@ EndOfLeapping mva #sfx_baby_missile sfx_effect mwa xtraj+1 xtrajfb sbw ytraj+1 #$05 ytrajfb ; funky missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) -; inc FallDown2 ;central Explosion mva #21 ExplosionRadius jsr CalculateExplosionRange0 @@ -198,7 +190,6 @@ NoWallsInFunky .endp ; ------------------------ .proc deathshead -; inc FallDown2 mva #30 ExplosionRadius mva #sfx_nuke sfx_effect SaveDrawXY @@ -250,7 +241,6 @@ NoLowerCircle ; ------------------------ .proc napalm mva #sfx_napalm sfx_effect -; inc FallDown2 mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) jsr CalculateExplosionRange mva #0 ExplosionRadius ; in this weapon - flag: 0 - napalm, 1 - hotnapalm @@ -259,7 +249,6 @@ NoLowerCircle ; ------------------------ .proc hotnapalm mva #sfx_napalm sfx_effect -; inc FallDown2 mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) jsr CalculateExplosionRange mva #1 ExplosionRadius ; in this weapon - flag: 0 - napalm, 1 - hotnapalm @@ -324,7 +313,6 @@ CharOffTheScreen dec magic jpl RepeatNapalm ; after napalm -; inc FallDown2 ;now we must check tanks in range ldx NumberOfPlayers dex @@ -372,32 +360,27 @@ EndNurnedCheckLoop .endp ; ------------------------ .proc babyroller -; inc FallDown2 mva #11 ExplosionRadius jmp xroller .endp ; ------------------------ .proc roller ; -; inc FallDown2 mva #21 ExplosionRadius jmp xroller .endp ; ------------------------ .proc heavyroller -; inc FallDown2 mva #30 ExplosionRadius jmp xroller .endp ; ------------------------ .proc riotbomb -; inc FallDown2 mva #17 ExplosionRadius jsr CalculateExplosionRange jmp xriotbomb .endp ; ------------------------ .proc heavyriotbomb -; inc FallDown2 mva #29 ExplosionRadius jsr CalculateExplosionRange jmp xriotbomb @@ -406,7 +389,6 @@ EndNurnedCheckLoop .proc babydigger mva #sfx_digger sfx_effect mva #0 sandhogflag -; inc FallDown2 mva #13 DigLong mva #1 diggery ; how many branches (-1) jmp xdigger @@ -415,7 +397,6 @@ EndNurnedCheckLoop .proc digger ; mva #sfx_digger sfx_effect mva #0 sandhogflag -; inc FallDown2 mva #13 DigLong mva #3 diggery ; how many branches (-1) jmp xdigger @@ -424,7 +405,6 @@ EndNurnedCheckLoop .proc heavydigger mva #sfx_digger sfx_effect mva #0 sandhogflag -; inc FallDown2 mva #13 DigLong mva #7 diggery ; how many branches (-1) jmp xdigger @@ -548,7 +528,6 @@ DiggerCharacter .proc babysandhog mva #sfx_sandhog sfx_effect mva #char_sandhog_offset sandhogflag -; inc FallDown2 mva #13 DigLong mva #1 diggery ; how many branches (-1) jmp xdigger @@ -557,7 +536,6 @@ DiggerCharacter .proc sandhog mva #sfx_sandhog sfx_effect mva #char_sandhog_offset sandhogflag -; inc FallDown2 mva #13 DigLong mva #3 diggery ; how many branches (-1) jmp xdigger @@ -566,35 +544,30 @@ DiggerCharacter .proc heavysandhog mva #sfx_sandhog sfx_effect mva #char_sandhog_offset sandhogflag -; inc FallDown2 mva #13 DigLong mva #5 diggery ; how many branches (-1) jmp xdigger .endp ; ------------------------ .proc dirtclod -; inc FallDown2 mva #12 ExplosionRadius jsr CalculateExplosionRange jmp xdirt .endp ; ------------------------ .proc dirtball -; inc FallDown2 mva #22 ExplosionRadius jsr CalculateExplosionRange jmp xdirt .endp ; ------------------------ .proc tonofdirt -; inc FallDown2 mva #31 ExplosionRadius jsr CalculateExplosionRange jmp xdirt .endp ; ------------------------ .proc dirtcharge -; inc FallDown2 mva #61 ExplosionRadius jsr CalculateExplosionRange jmp ofdirt @@ -602,7 +575,6 @@ DiggerCharacter ; ------------------------ .proc riotcharge mva #sfx_riot_blast sfx_effect -; inc FallDown2 mva #31 ExplosionRadius jsr CalculateExplosionRange jmp cleanDirt @@ -610,7 +582,6 @@ DiggerCharacter ; ------------------------ .proc riotblast mva #sfx_riot_blast sfx_effect -; inc FallDown2 mva #61 ExplosionRadius jsr CalculateExplosionRange jmp cleanDirt @@ -1155,7 +1126,7 @@ notpressed lda kbcode and #%10111111 ; SHIFT elimination - cmp #$08 ; O + cmp #@kbcode._O ; $08 ; O bne @+ jsr AreYouSure bit escFlag @@ -1165,7 +1136,7 @@ QuitToGameover mva #$40 escFlag rts @ - cmp #28 ; ESC + cmp #@kbcode._esc ; 28 ; ESC bne @+ jsr AreYouSure bit escFlag @@ -1173,7 +1144,7 @@ QuitToGameover ;---esc pressed-quit game--- rts @ - cmp #$3f ; A + cmp #@kbcode._A ; $3f ; A bne @+ callActivation ; Hide all tanks - after inventory they may have other shapes @@ -1182,7 +1153,7 @@ callActivation jmp afterInventory @ - cmp #$0d ; I + cmp #@kbcode._I ; $0d ; I bne @+ callInventory ; Hide all tanks - after inventory they may have other shapes @@ -1192,8 +1163,7 @@ callInventory jsr Purchase afterInventory jsr MakeDarkScreen - lda #song_ingame - jsr RmtSongSelect + RmtSong song_ingame mva #0 escFlag jsr DisplayStatus jsr SetMainScreen @@ -1202,30 +1172,30 @@ afterInventory jsr WaitForKeyRelease jmp BeforeFire @ - cmp #$8e + cmp #$80|@kbcode._up jeq CTRLPressedUp - cmp #$8f + cmp #$80|@kbcode._down jeq CTRLPressedDown - cmp #$ac + cmp #$80|@kbcode._tab jeq CTRLPressedTAB and #$3f ;CTRL and SHIFT ellimination jumpFromStick - cmp #$e + cmp #@kbcode._up ; $e jeq pressedUp - cmp #$f + cmp #@kbcode._down ; $f jeq pressedDown - cmp #$6 + cmp #@kbcode._left ; $6 jeq pressedLeft - cmp #$7 + cmp #@kbcode._right ; $7 jeq pressedRight - cmp #$21 + cmp #@kbcode._space ; $21 jeq pressedSpace - cmp #$2c + cmp #@kbcode._tab ; $2c jeq pressedTAB - cmp #$25 ; M + cmp #@kbcode._M ; $25 ; M jeq pressedM - cmp #$3e ; S + cmp #@kbcode._S ; $3e ; S jeq pressedS jmp notpressed checkJoy @@ -1430,8 +1400,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 @@ -1547,7 +1516,7 @@ ShotUnderGround ;xtraj=xtraj+vx - without Wind ;vx=vx+Wind (Wind is a small fraction) ;plot xtraj,ytraj - there is clearing in plot -;goto begin +;goto begin- @@ -1895,7 +1864,7 @@ MagDeflector bit random ; left or right deflection ? bpl RightDeflection LeftDeflection - sbw XHit #18 ; 18 pixels to right and explode... + sbw XHit #18 ; 18 pixels to left and explode... bit XHit+1 ; if off-screen ... bpl EndOfMagDeflector ; hit of course but we need RTS adw XHit #36 ; change to right :) @@ -2579,7 +2548,7 @@ notpressed lda kbcode and #%00111111 ; CTRL and SHIFT elimination - cmp #28 ; ESC + cmp #@kbcode._esc ; 28 ; ESC bne @+ jsr AreYouSure bit escFlag @@ -2588,11 +2557,11 @@ notpressed rts @ jumpFromStick - cmp #$6 + cmp #@kbcode._left ; $6 jeq pressedLeft - cmp #$7 + cmp #@kbcode._right ; $7 jeq pressedRight - cmp #$21 + cmp #@kbcode._space ; $21 jeq pressedSpace jmp notpressed checkJoy