Compare commits

...

51 Commits

Author SHA1 Message Date
Pirx 8c61ce7e4d Merge pull request #145 from pkali/develop
Develop
2022-10-31 01:54:02 -04:00
Pirx eb38407868 manual_en update 2022-10-31 01:52:56 -04:00
Pirx 7d7da78fd6 manual_en update 2022-10-31 01:52:06 -04:00
Pirx 148c64f158 version, README and manual_en update 2022-10-31 01:51:20 -04:00
Pecusx 4bf6b33528 Keyboard autorepeat added #141 2022-10-30 12:51:38 +01:00
Pecusx cd70e8c1ec New (faster) ingame DLI 2022-10-29 17:40:00 +02:00
Pecusx c7aea8e3ab DLI optimization
No more WSYNC :)
2022-10-29 16:22:53 +02:00
Pecusx fe990a6668 WaitOneFrame procedure sometimes hung in NTSC
And manuals update.
2022-10-29 11:36:33 +02:00
Pecusx 6f369735c3 Final (or not :) ) PAL and NTSC music by @mikerro 2022-10-28 21:27:06 +02:00
Pecusx d462c84577 Bouncy Castle bounces Funky Bomb bug fixed #129 2022-10-27 20:33:54 +02:00
Pecusx 3ed648b01f Better music in NTSC 2022-10-26 19:15:37 +02:00
Pecusx 2aca68c41c ATRACT mode fixed. 2022-10-25 19:47:15 +02:00
Pecusx 5f5ea0a752 Credits flickering fixed! 2022-10-25 19:15:50 +02:00
Pirx 1891bcc7f1 5200 ingame dli fix 2022-10-25 09:38:01 -04:00
Pecusx 11592414a8 GameOver screen optimization and return of Tab in weapon selection :) 2022-10-25 10:03:04 +02:00
Pirx 89d6f4834b README updt 2022-10-16 23:51:42 -04:00
Pirx 6377e9a936 Merge pull request #144 from pkali/develop
Develop
2022-10-16 23:31:02 -04:00
Pirx 3654743456 5200 keyboard OK-ish 2022-10-16 23:29:04 -04:00
Pirx 378ac8b0f6 5200 bin 2022-10-08 09:17:12 -04:00
Pirx 76a20e26fb 800 recompile 2022-10-08 02:05:11 -04:00
Pirx 443b62e9e6 a bit better 5200 keyboard but still not good... 2022-10-08 02:04:20 -04:00
Pirx ecc8e11d13 minor style improv 2022-10-08 01:18:10 -04:00
Pirx da2c027fee WIP: 5200 keyboard revert 2022-10-05 11:21:49 -04:00
Pirx 6425431496 WIP: more keyboard shenanigans 2022-10-03 22:54:20 -04:00
Pirx f3b9092777 wip: screen lowered, 5200 game over does not flicker 2022-10-01 11:54:52 -04:00
Pirx 8d188f4497 5200 works 2022-09-27 19:18:26 -04:00
Pirx f9092110ac 5200 works 2022-09-27 19:17:31 -04:00
Pirx 0968613b02 WIP: 5200 works on atari800 emu, still fails in Altirra 2022-09-27 08:30:49 -04:00
Pirx 95303380e7 WIP: 5200 runs on a800 (fire to skip menu) 2022-09-26 11:37:42 -04:00
Pirx 174dbe0bed WIP: 5200 starts 2022-09-19 09:01:56 -04:00
Pirx d72ca57181 5200 compiles 2022-09-19 08:02:27 -04:00
Pirx 01160ff4b9 5200 POKEY addr fix 2022-09-18 10:57:20 -04:00
Pirx 6fc2882a6e WIP: 5200 port (not yet working) 2022-09-17 23:31:12 -04:00
Pirx c15a80443c moving finished 2022-09-17 15:35:24 -04:00
Pirx 415bfbba2b WIP: moving displays part 3 2022-09-17 14:36:36 -04:00
Pirx 2addb0905e WIP: moving displays part 2 2022-09-17 14:16:02 -04:00
Pirx fe55f94702 moving displays + opty part 1 2022-09-17 09:59:56 -04:00
Pecusx 0693e5d20e Tank No fix and optimizations 2022-09-16 18:48:58 +02:00
Pecusx 9c5c701ca1 Display dynamic->static optimizations 2022-09-16 17:54:56 +02:00
Pirx 2a83fa962d memory map settled (most .IFs removed) 2022-09-14 06:30:50 -04:00
Pirx 2c01691bf5 ver bump 2022-09-12 01:01:51 -04:00
Pirx fad8c2c06a merge conflict fix 2022-09-12 00:57:05 -04:00
Pirx 58eec3dc9c ver bump 2022-09-12 00:53:45 -04:00
Pirx a98c0b81b9 merge conflict reslv 2022-09-12 00:44:19 -04:00
Pirx 2471ca7282 a800 version for merge with develop 2022-09-12 00:41:17 -04:00
Pirx 4078722b29 5200 cart size full music, a 4KiB glitch to be fixed still 2022-09-12 00:21:23 -04:00
Pirx e782e101f5 rmtplyr de-self-modified 2022-09-11 21:32:31 -04:00
Pirx 8a73202fa3 rmtplayr_modified.asm <-- simplified and working RMT player 2022-09-11 20:32:16 -04:00
Pirx 0ad513d5cb shortened version 2022-09-10 16:17:09 -04:00
Pirx c9855b66ba typos, not important 2022-09-05 22:29:16 -04:00
Pirx cad3a0cf38 WIP: conditional compilation, the beginnings 2022-09-03 23:33:12 -04:00
26 changed files with 2137 additions and 584 deletions
+17 -14
View File
@@ -14,10 +14,10 @@ On the first screen, you can configure gameplay options:
* frequency of suicides :) - if for a number of turns the game has not recorded hits (tanks are constantly shooting inaccurately), after one of such misses a tank commits suicide - here you determine how long they can "shooting for the stars" :) - if only people play the optimal setting is "norm", in the case of computer-controlled players ... you choose.
* The height (and undulation) of the mountains from almost flat (NL - Kingdom of the Netherlands), to soaring and high (NP - Federal Democratic Republic of Nepal)
* the way the walls (edges of the screen) work:
* none - projectiles that flew off the screen do not return
* wrap - the screen "wraps" and projectiles that flew to the right appear on the left side (and vice versa)
* bump - the right and left walls deflect projectiles that want to fly through them
* boxy - just like bump, except that the "ceiling" also reflects projectiles
* none - projectiles that flew off the screen do not return (black color of the screen frame)
* wrap - the screen "wraps" and projectiles that flew to the right appear on the left side and vice versa (purple color of the screen frame)
* bump - the right and left walls deflect projectiles that want to fly through them (dark blue color of the screen frame)
* boxy - just like bump, except that the "ceiling" also reflects projectiles (green color of the screen frame)
* rand - at the beginning of each round, one of the above 4 ways the walls work is drawn.
During gameplay, the current mode of the walls is represented by the color of the screen frame: none - black, wrap - purple, bump - blue, boxy - green.
@@ -56,16 +56,19 @@ The status line shows which player is currently allowed to take a shot and a set
* in parentheses is the name of the active defensive weapon - if there is any activated by the player.
The keyboard controls here are simple, cursor keys or joystick: left/right - change the angle of the barrel, up/down - change the the force of the shot.
* [SPACE] or joystick button pressed briefly - firing a shot.
* [TAB] or [SELECT] - selection of offensive weapons (this option is not available directly with the joystick - you need to select Inventory).
* [I] or longer holding the joystick button - go to Inventory. It is a screen (actually two) with the same layout as the shopping menu, it also works similarly except that here you don't buy weapons, but choose one of the offensive ones to shoot or activate a defensive weapon.
* [A] or [OPTION] - go directly to the defensive weapons activation.
* [M] key - disable/enable background music.
* [S] key - disable/enable effect sounds.
* [START] - speed up some game animations.
* [O] - end the current game and jump to the Game Over screen with a summary. The summary of the results does not take into account the current round of the game, but only the rounds completed earlier. This corresponds to pressing the [ESC] key with the difference that the summary and credits are displayed.
* [START] + [OPTION] - immediately force the end of the game (Game Over), just like [O] but without confirmation.
* [ESC] - during the entire game at any time (unless the computer is playing, then sometimes you have to wait a while) you can press the [ESC] key, which allows you to abort the game and return to the beginning (of course, there is protection against accidental pressing).
| A800 | 5200 | function |
| --- | --- | --- |
| [SPACE] | [0] | or joystick button pressed briefly - firing a shot. |
| [TAB] or [SELECT] | [5] | selection of offensive weapons (this option is not available directly with the joystick - you need to select Inventory) |
| [I] | [9] | or longer holding the joystick button - go to Inventory. It is a screen (actually two) with the same layout as the shopping menu, it also works similarly except that here you don't buy weapons, but choose one of the offensive ones to shoot or activate a defensive weapon. |
| [A] or [OPTION] | [7] | go directly to the defensive weapons activation.
| [M] | [PAUSE] | disable/enable background music. |
| [S] key | [RESET] | disable/enable effect sounds. |
| [START] | N/A | speed up some game animations. |
| [O] | [3] | end the current game and jump to the Game Over screen with a summary. The summary of the results does not take into account the current round of the game, but only the rounds completed earlier. This corresponds to pressing the [ESC] key with the difference that the summary and credits are displayed. |
| [START] + [OPTION] | N/A | immediately force the end of the game (Game Over), just like [O] but without confirmation.
| [ESC] | [*] | during the entire game at any time (unless the computer is playing, then sometimes you have to wait a while) you can press the [ESC] key, which allows you to abort the game and return to the beginning (of course, there is protection against accidental pressing). |
## 5. Game mechanics - offensive weapons
+4 -4
View File
@@ -13,10 +13,10 @@ Na pierwszym ekranie możemy skonfigurować opcje rozgrywwki:
* częstotliwość samobójstw :) - jeśli przez ileś tur gra nie odnotowała trafień (czołgi ciągle strzelają niecelnie) jeden z takich pudłujących czołgów popełnia samobójstwo - tu określamy jak długo mogą “strzelać w próżnię” :) - jeśli grają tylko ludzie optymalne ustawienie to “norm”, w przypadku graczy sterowanych przez komputer… wedle uznania.
* wysokość (i pofałdowanie) gór od prawie płaskich (NL - Królestwo Niderlandów), do strzelistych i wysokich (NP - Federalna Demokratyczna Republika Nepalu)
* sposób działania ścian (krawędzi ekranu):
* none - pociski, które wyleciały poza ekran nie wracają
* wrap - ekran "zawija się" i pociski, które wyleciały w prawo pojawiają się z lewej strony (i odwrotnie)
* bump - prawa i lewa ściana odbijają pociski, które chcą przez nie przelecieć
* boxy - tak jak bump, tyle że "sufit" także odbija pociski
* none - pociski, które wyleciały poza ekran nie wracają (czarny kolor ramki ekranu)
* wrap - ekran "zawija się" i pociski, które wyleciały w prawo pojawiają się z lewej strony i odwrotnie (fioletowy kolor ramki ekranu)
* bump - prawa i lewa ściana odbijają pociski, które chcą przez nie przelecieć (granatowy kolor ramki ekranu)
* boxy - tak jak bump, tyle że "sufit" także odbija pociski (zielony kolor ramki ekranu)
* rand - na początku każdej rundy losowany jest jeden z 4 powyższych sposobów działania ścian
W trakcie rozgrywki aktualny sposób działania ścian reprezentowany jest przez kolor ramki ekranu: none - czarny, wrap - fioletowy, bump - niebieski, boxy - zielony.
+30 -2
View File
@@ -46,7 +46,35 @@ It never happened, but we got some encouraging comments and we are still trying
With the advent of [fujinet](https://fujinet.online/) we are thinking about making the game interplanetary, err, with multiplayer over the net. We'll see.
## Changes:
## Changelog:
###### Version 1.17
2022-10-31
Mostly 5200 console port and NTSC improvements.
* Updated songs from Miker do not require skipping frames on NTSC machines. Crucial for the next point.
* Bouncy Castle bouncing of Funky Bomb fixed https://github.com/pkali/scorch_src/issues/129
* 5200 version had various graphical and sound glitches. Although mostly harmless, it hurt our sense of aesthetics. First of all the flickering credits roll is all good now.
* Rare hang-ups on NTSC machines fixed
* Screen lowered down by 7 scan lines to help top status line on NTSC CRTs.
* 5200 ATTRACT mode not going away fixed
* Autorepeat added to menus what should help 5200 users with their non-centering abomination of a controller.
* DLI interrupts optimized, few cycles saved.
* 5200 keypad sort-of-works. Please refer to manual for key bindings.
###### Version 1.16
2022-10-16
The official release of our game for the Atari 5200 SuperSystem. Grab the `scorch.bin` file and burn a cart!
This is all thanks to @miker who supported us all this time of uncertainty and despair.
Cramming the game into a 32KiB cart and 16KiB RAM was a big task - it required a rewrite of the RMT player, a crazy number of size optimizations, and counting each byte.
The release is not perfect - we have a number of glitches and improvements to the 5200 controller procedures to work on, but the game is playable.
Changes:
* numerous, but not very visible
###### Version 1.14
2022-09-05
@@ -60,7 +88,7 @@ Changes:
* Bouncy Castle bounces like it should.
* Tracer and Smoke Tracer are not causing defense weapons to trigger anymore.
* In rare cases direct hit was not accounted for correctly.
* Manuals updated.
* Manuals updated. https://github.com/pkali/scorch_src/releases/tag/v1.16
###### Version 1.13
+643
View File
@@ -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 [<frqtab]!=0 ;* frqtab must begin at the memory page bound! (i.e. $..00 address)
frqtabbass1
dta $BF,$B6,$AA,$A1,$98,$8F,$89,$80,$F2,$E6,$DA,$CE,$BF,$B6,$AA,$A1
dta $98,$8F,$89,$80,$7A,$71,$6B,$65,$5F,$5C,$56,$50,$4D,$47,$44,$3E
dta $3C,$38,$35,$32,$2F,$2D,$2A,$28,$25,$23,$21,$1F,$1D,$1C,$1A,$18
dta $17,$16,$14,$13,$12,$11,$10,$0F,$0E,$0D,$0C,$0B,$0A,$09,$08,$07
frqtabbass2
dta $FF,$F1,$E4,$D8,$CA,$C0,$B5,$AB,$A2,$99,$8E,$87,$7F,$79,$73,$70
dta $66,$61,$5A,$55,$52,$4B,$48,$43,$3F,$3C,$39,$37,$33,$30,$2D,$2A
dta $28,$25,$24,$21,$1F,$1E,$1C,$1B,$19,$17,$16,$15,$13,$12,$11,$10
dta $0F,$0E,$0D,$0C,$0B,$0A,$09,$08,$07,$06,$05,$04,$03,$02,$01,$00
frqtabpure
dta $F3,$E6,$D9,$CC,$C1,$B5,$AD,$A2,$99,$90,$88,$80,$79,$72,$6C,$66
dta $60,$5B,$55,$51,$4C,$48,$44,$40,$3C,$39,$35,$32,$2F,$2D,$2A,$28
dta $25,$23,$21,$1F,$1D,$1C,$1A,$18,$17,$16,$14,$13,$12,$11,$10,$0F
dta $0E,$0D,$0C,$0B,$0A,$09,$08,$07,$06,$05,$04,$03,$02,$01,$00,$00
.align $100
volumetab
dta $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
dta $00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$01,$01,$01,$01,$01
dta $00,$00,$00,$00,$01,$01,$01,$01,$01,$01,$01,$01,$02,$02,$02,$02
dta $00,$00,$00,$01,$01,$01,$01,$01,$02,$02,$02,$02,$02,$03,$03,$03
dta $00,$00,$01,$01,$01,$01,$02,$02,$02,$02,$03,$03,$03,$03,$04,$04
dta $00,$00,$01,$01,$01,$02,$02,$02,$03,$03,$03,$04,$04,$04,$05,$05
dta $00,$00,$01,$01,$02,$02,$02,$03,$03,$04,$04,$04,$05,$05,$06,$06
dta $00,$00,$01,$01,$02,$02,$03,$03,$04,$04,$05,$05,$06,$06,$07,$07
dta $00,$01,$01,$02,$02,$03,$03,$04,$04,$05,$05,$06,$06,$07,$07,$08
dta $00,$01,$01,$02,$02,$03,$04,$04,$05,$05,$06,$07,$07,$08,$08,$09
dta $00,$01,$01,$02,$03,$03,$04,$05,$05,$06,$07,$07,$08,$09,$09,$0A
dta $00,$01,$01,$02,$03,$04,$04,$05,$06,$07,$07,$08,$09,$0A,$0A,$0B
dta $00,$01,$02,$02,$03,$04,$05,$06,$06,$07,$08,$09,$0A,$0A,$0B,$0C
dta $00,$01,$02,$03,$03,$04,$05,$06,$07,$08,$09,$0A,$0A,$0B,$0C,$0D
dta $00,$01,$02,$03,$04,$05,$06,$07,$07,$08,$09,$0A,$0B,$0C,$0D,$0E
dta $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F
;*
;* Set of RMT main vectors:
;*
RASTERMUSICTRACKER
jmp rmt_init
jmp rmt_play
jmp rmt_p3
jmp rmt_silence
jmp SetPokey
jmp rmt_sfx ;* A=note(0,..,60),X=channel(0,..,3 or 0,..,7),Y=instrument*2(0,2,4,..,126)
rmt_init
stx ns
sty ns+1
pha
; IFT track_endvariables-track_variables>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
+40
View File
@@ -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--------
Binary file not shown.
Binary file not shown.
Binary file not shown.
+3 -3
View File
@@ -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."
+33 -7
View File
@@ -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,27 +580,41 @@ CreditsStart
dta d"SFX, Music and Suppor",d"t"*
dta d"Michal 'Miker' Szpilowsk",d"i"*
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"*
.IF target != 5200
dta d"Krzysztof 'Kaz' Ziembi",d"k"*
.ENDIF
dta d" "*
dta d"Ideas and Q",d"A"*
dta d"Ideas, help and Q",d"A"*
dta d"Bocianu, Probabilitydragon, EnderDude",d","*
dta d"Beeblebrox, KrzysRog, lopezpb, Dracon",d","*
dta d"brad-colbert, archon800, nowy80",d","*
dta d"Shaggy the Atarian, RetroBorsuk, ZP",d"H"*
.IF target = 5200
dta d"x-usr(1536), Aking, JAC!, phaero",d"n"*
.ENDIF
dta d" "*
dta d"Additional testin",d"g"*
dta d"Arek and Alex Peck",d"o"*
.IF target != 5200
dta d" "*
dta d"Stay tuned for the FujiNet version",d"!"*
.ENDIF
dta d" "*
CreditsEnd
CreditsLines=44
.IF target = 5200
CreditsLines=37
.ELSE
CreditsLines=42 ; 34 in reality. add 7?
.ENDIF
.endif
+6 -8
View File
@@ -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
@@ -29,6 +25,8 @@ TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor
TextForegroundColor = $0A
space = 0 ; space in screencodes
KeyRepeatSpeed = 10 ; (max 127 !!!)
;character codes for symbols (tank, parachute, etc. )
char_parachute_______ = $02
char_flag____________ = $1e
+45
View File
@@ -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
+46
View File
@@ -0,0 +1,46 @@
; @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
.word purchaseTextBuffer
.byte $00+$80
.byte $50,$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
+76 -111
View File
@@ -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)
;-----------------------------------------------
@@ -111,8 +10,43 @@ OptionsScreen
dta d"Welcome to Scorch v. "
build ; 4 bytes from scorch.asm (fancy method) :)
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,11 +114,11 @@ GameOverTitle2
;-----------------------------------------------------
dl ; MAIN game display list
.byte 0
.byte $70
.byte $42
.word textbuffer
.byte $02, $02 +$80 ;DLI
.byte $10 ; 2 blank lines
.word statusBuffer
.byte $02, $02
.byte $10+$80 ; 2 blank lines + DLI
.byte $4f
.word display ; 1 line
@@ -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,12 +213,13 @@ 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
.byte $0f+$80
.byte $4f ; 1 line
.word display+(40*32)
.word display+(40*(32-7)) ;7 lines up to match new sprite position
:30 .byte $0f ; 30 lines
.byte $0f+$80 ; 1 line
.byte $4f ; 1 line
+11
View File
@@ -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
+45 -3
View File
@@ -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 #<screenwidth
@
bne nextPointChecking
txa
rts
.endp
; -----------------------------------------
.proc unPlot
; plots a point and saves the plotted byte, reverts the previous plot.
@@ -2171,5 +2181,37 @@ ybarrel
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 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
.endif
+149
View File
@@ -0,0 +1,149 @@
;-------------------------------------
.MACRO ROLW
ROL :1
ROL :1+1
.ENDM
;-------------------------------------
.MACRO ASLW
ASL :1
ROL :1+1
.ENDM
;-------------------------------------
.MACRO RORW
ROR :1+1
ROR :1
.ENDM
;-------------------------------------
.MACRO LSRW
LSR :1+1
ROR :1
.ENDM
;-------------------------------------
.MACRO VMAIN
; VMAIN #WORD,interrupt.vector
; interrupt.vector:
; 0 - VIMIRQ
; 1 - TIMCNT1
; 2 - TIMCNT2
; 3 - TIMCNT3
; 4 - TIMCNT4
; 5 - TIMCNT5
; 6 - VVBLKI
; 7 - VVBLKD
; 8 - TIMVEC1
; 9 - TIMVEC2
; Initialises Vertical Blank Interrupts
; (works only with system interrupts ON)
;----------
; on 5200 it sets up deferred VBL ONLY for now
sei
lda #$00 ;Disable all interruptes
sta nmien
sta irqen
@ lda vcount
bne @-
mwa #:1 VVBLKD
mva #$40 nmien
;Enable IRQ interrupts
sta pokmsk
sta irqen
cli
.ENDM
;-------------------------------------
.MACRO VDLI
; VDLI #WORD
; Initialises Display List Interrupts
mwa #:1 VDSLST
mva #$C0 NMIEN
.ENDM
;-------------------------------------
.MACRO halt
?stop
lda RANDOM
and #$05
sta COLBAK
jmp ?stop
.ENDM
;-------------------------------------
.MACRO KEY
; KEY
; waits for releasing and pressing "any key"
.ENDM
;-------------------------------------
.MACRO WAIT
; WAIT
; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
?zero LDA VCOUNT
cmp #$05
bcc ?zero
cmp #$70
bcc ?WA
sbc #10 ; last lines correction
?WA cmp VCOUNT
beq ?WA
bcc ?WA
?WFRAME cmp VCOUNT
beq ?nowait
bcs ?WFRAME
?nowait
.ENDM
;-------------------------------------
.macro negw
; negate the given word (0-a)
;-------------------------------------
sec
lda #$00
sbc :1
sta :1
lda #$00
sbc :1+1
sta :1+1
.endm
;-------------------------------------
.macro randomizer
;usage: randomize floor ceiling
;returns (in A) a random .byte between "floor" and "ceiling"
.if :2 < :1
.error "floor higher than ceiling"
.endif
?rand
lda random
cmp #:1 ;floor
bcc ?rand
cmp #:2+1 ;ceiling
bcs ?rand
.endm
;-------------------------------------
.macro phx
txa
pha
.endm
;-------------------------------------
.macro phy
tya
pha
.endm
;-------------------------------------
.macro plx
pla
tax
.endm
;-------------------------------------
.macro ply
pla
tay
.endm
;-------------------------------------
.macro pause
;waits :1 number (byte) of frames
ldx #:1
?PAUSELOOP
wait
dex
bne ?PAUSELOOP
.ENDM
+272
View File
@@ -0,0 +1,272 @@
;****************************************************************************
;* ATARI 5200 CONSOLE *
;* SYSTEM EQUATES *
;****************************************************************************
; based on https://web.archive.org/web/20200831200348/http://www.atarimuseum.com/videogames/consoles/5200/conv_to_5200.html
;
; OS VARIABLES FOR 5200
;
; PAGE 0
POKMSK = $00 ;pokmsk at $00 on Atari 5200 instead of $10 on Atari XL
RTCLOK = $01 ;Actually $01/$02
CRITIC = $03
ATRACT = $04 ;attact at $04 on Atari 5200 instead of $4D on Atari XL
DLPTRS = $05 ;DLPTRS at $05/$06 on Atari 5200 instead of $230 on Atari XL
DMACTLS = $07 ;DMACTLS at $07 on Atari 5200 instead of $22f on Atari XL
SSKCTL = skctl ;There is no shadow on Atari 5200
PCOLR0 EQU $08 ;P0 COLOR
PCOLR1 EQU $09 ;P1 COLOR
PCOLR2 EQU $0a ;P2 COLOR
PCOLR3 EQU $0b ;P3 COLOR
COLOR0 EQU $0c ;COLOR 0
COLOR1 EQU $0d
COLOR2 EQU $0e
COLOR3 EQU $0f
COLOR4 EQU $10
COLBAKS EQU COLOR4
PADDL0 EQU $11
PADDL1 EQU $12
PADDL2 EQU $13
PADDL3 EQU $14
PADDL4 EQU $15
PADDL5 EQU $16
PADDL6 EQU $17
PADDL7 EQU $18
STICK0 = $19 ;There is no stick0 but we will make the analog stick look like a digital one and store it here
STRIG0 = $1a ;There is no strig0 but we will make this the shadow of the TRIG0 ($c010) of GTIA
chbas = $1b ;There is no CHBAS but we will make this the shadow of the CHBASE
CONSOL = $1c ;There are no console keys on Atari 5200, so we replace console h/w reads with a new shadow based on the keypad keys
consol_reset = $07;The constant value representing that no consol key is pressed
kbcode = $1d ;There is no keyboard on the Atari 5200, so replace kbcode h/w reads with a byte variable read based on the keypad keys
; PAGE 2
VIMIRQ EQU $0200 ;IMMED IRQ VECTOR
VVBLKI EQU $0202 ;IMM VBLK NMI VECTOR
VVBLKD EQU $0204 ;DEF VBLK NMI VECTOR
VDSLST EQU $0206 ;DSP LIST NMI VECTOR
VKEYBD EQU $0208 ;POKEY KB IRQ VECTOR
VKEYCNT EQU $020A ;Keypad routine continuation vector
BRKKY EQU $023C ;BREAK KEY VECTOR
VBREAK EQU $020E ;BRK INST IRQ VECTOR
VSERIN EQU $0210 ;POKEY INPUT RDY IRQ
VSEROR EQU $0212 ;POKEY OUTPUT RDY
VSEROC EQU $0214 ;POKEY OUTPUT DONE
VTIMR1 EQU $0216 ;POKEY TIMER 1 IRQ
VTIMR2 EQU $0218 ;POKEY TIMER 2 IRQ
VTIMR4 EQU $021A ;POKEY TIMER 4 IRQ
ROM_SETTINGS = $bfe8 ; game ROM info start (24 bytes total, 20b title, 2b year, 2b start vector)
; HARDWARE REGISTERS
; ---------------------------------------------------------------------------
POKEY EQU $EB00
; ---------------------------------------------------------------------------
;
; READ
;
POT0 EQU POKEY+$00
POT1 EQU POKEY+$01
POT2 EQU POKEY+$02
POT3 EQU POKEY+$03
POT4 EQU POKEY+$04
POT5 EQU POKEY+$05
POT6 EQU POKEY+$06
POT7 EQU POKEY+$07
ALLPOT EQU POKEY+$08
KBCODE_5200 EQU POKEY+$09
RANDOM EQU POKEY+$0a
POTGO EQU POKEY+$0b
SERIN EQU POKEY+$0d
IRQST EQU POKEY+$0e
SKSTAT EQU POKEY+$0f
;
; WRITE
;
AUDF1 EQU POKEY+$00
AUDC1 EQU POKEY+$01
AUDF2 EQU POKEY+$02
AUDC2 EQU POKEY+$03
AUDF3 EQU POKEY+$04
AUDC3 EQU POKEY+$05
AUDF4 EQU POKEY+$06
AUDC4 EQU POKEY+$07
AUDCTL EQU POKEY+$08
STIMER EQU POKEY+$09
SKRES EQU POKEY+$0a
SEROUT EQU POKEY+$0d
IRQEN EQU POKEY+$0e
SKCTL EQU POKEY+$0f
;
;
;
; ---------------------------------------------------------------------------
GTIA EQU $C000
; ---------------------------------------------------------------------------
;
; WRITE
;
HPOSP0 EQU GTIA+$00
HPOSP1 EQU GTIA+$01
HPOSP2 EQU GTIA+$02
HPOSP3 EQU GTIA+$03
HPOSM0 EQU GTIA+$04
HPOSM1 EQU GTIA+$05
HPOSM2 EQU GTIA+$06
HPOSM3 EQU GTIA+$07
SIZEP0 EQU GTIA+$08
SIZEP1 EQU GTIA+$09
SIZEP2 EQU GTIA+$0a
SIZEP3 EQU GTIA+$0b
SIZEM EQU GTIA+$0c
GRAFP0 EQU GTIA+$0d
GRAFP1 EQU GTIA+$0e
GRAFP2 EQU GTIA+$0f
GRAFP3 EQU GTIA+$10
GRAFM EQU GTIA+$11
COLPM0 EQU GTIA+$12
COLPM1 EQU GTIA+$13
COLPM2 EQU GTIA+$14
COLPM3 EQU GTIA+$15
COLPF0 EQU GTIA+$16
COLPF1 EQU GTIA+$17
COLPF2 EQU GTIA+$18
COLPF3 EQU GTIA+$19
COLBAK EQU GTIA+$1a
PRIOR EQU GTIA+$1b
GPRIOR = PRIOR ; no PRIOR shadow (GPRIOR)
VDELAY EQU GTIA+$1c
GRACTL EQU GTIA+$1d
HITCLR EQU GTIA+$1e
CONSOL5200 EQU GTIA+$1f ; no CONSOL in 5200
;
; READ
;
M0PF EQU GTIA+$00
M1PF EQU GTIA+$01
M2PF EQU GTIA+$02
M3PF EQU GTIA+$03
P0PF EQU GTIA+$04
P1PF EQU GTIA+$05
P2PF EQU GTIA+$06
P3PF EQU GTIA+$07
M0PL EQU GTIA+$08
M1PL EQU GTIA+$09
M2PL EQU GTIA+$0a
M3PL EQU GTIA+$0b
P0PL EQU GTIA+$0c
P1PL EQU GTIA+$0d
P2PL EQU GTIA+$0e
P3PL EQU GTIA+$0f
TRIG0 EQU GTIA+$10
TRIG1 EQU GTIA+$11
TRIG2 EQU GTIA+$12
TRIG3 EQU GTIA+$13
PAL EQU GTIA+$14
;
;
; ---------------------------------------------------------------------------
ANTIC EQU $D400
; ---------------------------------------------------------------------------
;
DMACTL EQU ANTIC+$00
CHACTL EQU ANTIC+$01
DLPTR EQU ANTIC+$02
;DLISTH EQU ANTIC+$03
HSCROL EQU ANTIC+$04
VSCROL EQU ANTIC+$05
PMBASE EQU ANTIC+$07
CHBASE EQU ANTIC+$09
WSYNC EQU ANTIC+$0a
VCOUNT EQU ANTIC+$0b
PENH EQU ANTIC+$0c
PENV EQU ANTIC+$0d
NMIEN EQU ANTIC+$0e
NMIRES EQU ANTIC+$0f
NMIST EQU ANTIC+$0f
;
; ---------------------------------------------------------------------------
; Atari ANTIC chip display list equates
; ---------------------------------------------------------------------------
;
JUMP EQU $01 ; display list jump instruction (3 byte)
JVB EQU $41 ; display list jump and wait for vblank instruction (3)
;
SCH EQU $10 ; display list horizontal scrolling
SCV EQU $20 ; display list vertical scrolling
LMS EQU $40 ; display list load memory scan instruction (3 byte)
DLII EQU $80 ; display list interrupt instruction
;
SKIP1 EQU $00 ; display list skip 1 scan line instruction
SKIP2 EQU $10 ; display list skip 2 scan lines instruction
SKIP3 EQU $20 ; display list skip 3 scan lines instruction
SKIP4 EQU $30 ; display list skip 4 scan lines instruction
SKIP5 EQU $40 ; display list skip 5 scan lines instruction
SKIP6 EQU $50 ; display list skip 6 scan lines instruction
SKIP7 EQU $60 ; display list skip 7 scan lines instruction
SKIP8 EQU $70 ; display list skip 8 scan lines instruction
;
MODE2 EQU $02 ; display list mode 2
MODE4 EQU $04 ; display list mode 4
MODE8 EQU $08 ; display list mode 8
MODEE EQU $0E ; display list mode E
MODEF EQU $0F ; display list mode F
; ---------------------------------------------------------------------------
; ENUMS
; ---------------------------------------------------------------------------
.enum @dmactl
blank = %00
narrow = %01
standard= %10
wide = %11
missiles= %100
players = %1000
lineX1 = %10000
lineX2 = %00000
dma = %100000
.ende
scr48 = @dmactl(wide|dma|players|missiles|lineX1)
scr40 = @dmactl(standard|dma|players|missiles|lineX1)
scr32 = @dmactl(narrow|dma|players|missiles|lineX1)
.enum @pmcntl
missiles= %1
players = %10
trigs = %100
.ende
.enum @gtictl
prior0 = %0
prior1 = %1
prior2 = %10
prior4 = %100
prior8 = %1000
ply5 = %10000 ; Fifth Player Enable
mlc = %100000 ; Multiple Color Player Enable
mode9 = %01000000
mode10 = %10000000
mode11 = %11000000
.ende
/*
; commented out to be replaced by the application specific A800 --> 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
*/
+68
View File
@@ -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
+5 -3
View File
@@ -77,8 +77,10 @@
; WAIT
; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
?zero LDA VCOUNT
beq ?zero
bpl ?WA
cmp #$05
bcc ?zero
cmp #$70
bcc ?WA
sbc #10 ; last lines correction
?WA cmp VCOUNT
beq ?WA
@@ -101,7 +103,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
+372 -200
View File
@@ -4,44 +4,29 @@
;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
;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.17" ; number of this build (4 bytes)
.endm
.macro RMTSong
lda #:1
jsr RMTSongSelect
.endm
;---------------------------------------------------
icl 'definitions.asm'
;---------------------------------------------------
.zpvar DliColorBack .byte = $63
.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)
.zpvar xbyte .word
@@ -83,11 +68,9 @@
.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
.zpvar ScrollFlag .byte
; --------------OPTIMIZATION VARIABLES--------------
.zpvar Force .word
@@ -103,7 +86,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 +116,6 @@
.zpvar HowToDraw .byte
.zpvar gravity .byte
.zpvar LineLength .word
;.zpvar LineAddress4x4 .word
.zpvar tracerflag .byte
.zpvar isInventory .byte
.zpvar DifficultyLevel .byte
@@ -143,28 +124,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
.ende */
.ELSE
icl 'lib/ATARISYS.ASM'
icl 'lib/macro.hea'
;splash screen and musix
icl 'artwork/Scorch50.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 $3000
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'
;----------------------------------------------
;--------------------------------------------------
@@ -202,6 +252,23 @@ FirstSTART
cpy #screenheight+1
bne @-
.IF TARGET = 800
lda PAL
and #%00001110
bne NoRMT_PALchange
;it is PAL here
; Change RMT to PAL version
; 5 values in RMT file
; not elegant :(
mva #$06 MODUL-6+$941
mva #$10 MODUL-6+$a43
mva #$06 MODUL-6+$b9d
mva #$04 MODUL-6+$bd2
mva #$08 MODUL-6+$e17
mva #$06 MODUL-6+$e3d
NoRMT_PALchange
.ENDIF
; RMT INIT
lda #$f0 ;initial value
@@ -210,20 +277,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 +313,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 +347,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 +450,7 @@ GoGameOver
NoGameOverYet
inc CurrentRoundNr
jsr MakeDarkScreen ; issue #72
jsr RmtSongSelect
; jsr RmtSongSelect ; ?????
mva #sfx_silencer sfx_effect
jsr PMoutofscreen
@@ -402,8 +467,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 +521,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 +633,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 +695,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 +715,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 +725,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 +796,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)
@@ -794,7 +847,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 +953,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 +1024,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,18 +1125,7 @@ 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
/* .proc DLIinterruptGraph
;sta dliA
;sty dliY
pha
@@ -1114,9 +1133,10 @@ MakeTanksVisible
ldy dliCounter
lda dliColorsBack,y
ldy dliColorsFore
.IF TARGET = 800
nop ; necessary on 800 because DLIs take less time, jitter visible without it
nop
nop
nop
.ENDIF
sta COLPF1
sty COLPF2
inc dliCounter
@@ -1125,6 +1145,26 @@ MakeTanksVisible
ply
pla
rti
.endp */
.proc DLIinterruptGraph
pha
lda dliColorsFore
nop
nop
nop
.IF TARGET = 800
nop ; necessary on 800 because DLIs take less time, jitter visible without it
nop
.ENDIF
sta COLPF2
lda DliColorBack
sta COLPF1
eor #$02
sta DliColorBack
pla
rti
.endp
;--------------------------------------------------
.proc DLIinterruptOptions
@@ -1148,44 +1188,29 @@ MakeTanksVisible
lda dliCounter
bne EndofPMG
lda #%00100001 ; playfield after P/M - prior=1
STA WSYNC
;STA WSYNC
sta PRIOR
bne EndOfDLI_GO
EndofPMG
cmp #1
bne ColoredLines
lda #%00100100 ; playfield before P/M
STA WSYNC
;STA WSYNC
sta PRIOR
bne EndOfDLI_GO
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 WSYNC
sta COLPF2
sty COLPF1
bne EndOfDLI_GO
CreditsScroll
lda #$00
sta COLPF2
inc CreditsVScrol
lda CreditsVScrol
cmp #32 ;not too fast
beq nextlinedisplay
:2 lsr ;not too fast
sta VSCROL
jmp EndOfDLI_GO
nextlinedisplay
lda #0
sta CreditsVScrol
sta VSCROL
adw DLCreditsAddr #40
cpw DLCreditsAddr #CreditsLastLine
bne EndOfDLI_GO
mwa #Credits DLCreditsAddr
EndOfDLI_GO
inc dliCounter
ply
@@ -1196,8 +1221,9 @@ EndOfDLI_GO
.proc DLIinterruptText
;sta dliA
pha
sta WSYNC
mva #TextBackgroundColor COLPF2
lda #TextBackgroundColor
;sta WSYNC
sta COLPF2
mva #TextForegroundColor COLPF3
;lda dliA
pla
@@ -1206,10 +1232,8 @@ DLIinterruptNone
.endp
;--------------------------------------------------
.proc VBLinterrupt
pha
phx
phy
mva #0 dliCounter
mva #$02 DliColorBack
lda PAL
and #%00001110
@@ -1218,13 +1242,15 @@ DLIinterruptNone
dec NTSCcounter
bne itsPAL
mva #6 NTSCcounter
bne exitVBL ; skip doing VBL things each 6 frames in Amerika, Amerika
bne SkippedIfNTSC ; skip doing VBL things each 6 frames in Amerika, Amerika
; We're all living in Amerika, Coca Cola, Wonderbra
itsPAL
; pressTimer is trigger tick counter. always 50 ticks / s
bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s
SkippedIfNTSC
bit RMT_blocked
bmi SkipRMTVBL
; ------- RMT -------
@@ -1243,12 +1269,90 @@ lab2
jsr RASTERMUSICTRACKER+3 ;1 play
; ------- RMT -------
SkipRMTVBL
exitVBL
ply
plx
bit ScrollFlag
bpl EndOfCreditsVBI
CreditsVBI
inc CreditsVScrol
lda CreditsVScrol
cmp #32 ;not too fast
beq nextlinedisplay
:2 lsr ;not too fast
sta VSCROL
jmp EndOfCreditsVBI
nextlinedisplay
lda #0
sta CreditsVScrol
sta VSCROL
clc
lda DLCreditsAddr
adc #40
sta DLCreditsAddr
bcc @+
inc DLCreditsAddr+1
@
cmp #<CreditsLastLine
bne EndOfCreditsVBI
lda DLCreditsAddr+1
cmp #>CreditsLastLine
bne EndOfCreditsVBI
; adw DLCreditsAddr #40
; cpw DLCreditsAddr #CreditsLastLine
; bne EndOfCreditsVBI
mwa #Credits DLCreditsAddr
EndOfCreditsVBI
.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 +1570,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,15 +1622,18 @@ SetRandomWalls
;--------------------------------------------------
jsr WaitForKeyRelease
@
.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 #28 ; ESC
cmp #@kbcode._esc ; 28 ; ESC
bne getkeyend
mvx #$80 escFlag
bne getkeyend
@@ -1547,9 +1654,11 @@ notpressedJoyGetKey
;fire
lda STRIG0
bne @-
lda #$0c ;Return key
lda #@kbcode._ret ;Return key
getkeyend
ldx #0
stx ATRACT ; reset atract mode
mvx #sfx_keyclick sfx_effect
rts
.endp
@@ -1566,19 +1675,26 @@ getkeyend
;--------------------------------------------------
.proc WaitForKeyRelease
;--------------------------------------------------
mva #128-KeyRepeatSpeed pressTimer ; tricky
StillWait
bit pressTimer
bmi KeyReleased
lda STICK0
and #$0f
cmp #$0f
bne WaitForKeyRelease
bne StillWait
lda STRIG0
beq WaitForKeyRelease
beq StillWait
.IF TARGET = 800
lda SKSTAT
cmp #$ff
bne WaitForKeyRelease
bne StillWait
lda CONSOL
and #%00000110 ; Select and Option only
cmp #%00000110
bne WaitForKeyRelease
bne StillWait
.ENDIF
KeyReleased
rts
.endp
;--------------------------------------------------
@@ -1606,26 +1722,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 +1756,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 +1767,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-NTSC.rmt",+6 ;include music RMT module
;opt h+
MODULEND
;----------------------------------------------
org $bf80
font4x4
ins 'artwork/font4x4s.bmp',+62
;----------------------------------------------
.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
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+89 -76
View File
@@ -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
@@ -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._tab ; $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,7 +2020,9 @@ FinishResultDisplay
jsr ClearPMmemory
jsr PrepareCredits
jsr GameOverResultsClear
jsr CopyFromPurchaseAndGameOver
mwa #GameOverDL dlptrs
mva #$ff ScrollFlag ; credits scroll on
lda #%00111110 ; normal screen width, DL on, P/M on
sta dmactls
lda #%00100100 ; playfield before P/M
@@ -2113,8 +2127,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
@
@@ -2127,7 +2140,7 @@ MainTanksFloatingLoop
AllTanksFloatingDown
stx TankNr
lda Ytankstable,x
cmp #72 ; tank under screen - no erase
cmp #(72-7) ; tank under screen - no erase
bcs NoEraseTank
mva #1 Erase
jsr DrawTankNr
@@ -2142,9 +2155,9 @@ NoEraseTank
NotFastTank
lda Ytankstable,x
; cmp #32 ; tank over screen - not visible
cmp #80 ; tank under screen - new tank randomize
cmp #(80-7) ; tank under screen - new tank randomize
bcs TankUnderScreen
cmp #72 ; tank under screen but.... parachute
cmp #(72-7) ; tank under screen but.... parachute
bcs DrawOnlyParachute
bcc TankOnScreen
TankUnderScreen
@@ -2161,11 +2174,12 @@ FastTank
bpl AllTanksFloatingDown
jsr IsKeyPressed
bne MainTanksFloatingLoop ; neverending loop
mva #$00 ScrollFlag ; credits scroll off
jsr MakeDarkScreen
jsr GameOverResultsClear
rts
RandomizeTankPos
randomize 10 32 ; 10 not 8 - barrel !! :)
randomize 10 (32-7) ; 10 not 8 - barrel !! :)
sta Ytankstable,x
randomize 0 180
sta AngleTable,x
@@ -2258,13 +2272,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 +2286,7 @@ EndOfCredits
lda ActiveWeapon,x
jsr HowManyBullets
sta decimal
mwa #textbuffer+20 displayposition
mwa #statusBuffer+20 displayposition
jsr displaybyte
;---------------------
@@ -2293,7 +2307,7 @@ EndOfCredits
ldy #15
@
lda (temp),y
sta textbuffer+23,y
sta statusBuffer+23,y
dey
bpl @-
@@ -2301,15 +2315,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 +2341,7 @@ ClearingOnly
ldy #15
@
lda (temp),y
sta textbuffer+40+40+23,y
sta statusBuffer+40+40+23,y
dey
bpl @-
@@ -2338,7 +2352,7 @@ ClearingOnly
lda Energy,x
sta decimal
mwa #textbuffer+48 displayposition
mwa #statusBuffer+48 displayposition
jsr displaybyte
;---------------------
@@ -2346,10 +2360,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 +2372,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 +2387,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 +2400,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 +2415,7 @@ DisplayWindValue
;=========================
lda CurrentRoundNr
sta decimal
mwa #textbuffer+80+7 displayposition
mwa #statusBuffer+80+7 displayposition
jsr displaybyte ;decimal (byte), displayposition (word)
;=========================
@@ -2412,7 +2426,7 @@ DisplayWindValue
sta decimal
lda ForceTableH,x
sta decimal+1
mwa #textbuffer+40+35 displayposition
mwa #statusBuffer+40+35 displayposition
jsr displaydec5
;=========================
@@ -2428,9 +2442,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 +2453,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 +2481,7 @@ AngleDisplay
tax
NextChar02
lda tanksnames,x
sta textbuffer+7,y
sta statusBuffer+7,y
inx
iny
cpy #$08
@@ -2496,7 +2510,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 +2525,5 @@ NextChar02
rts
.endp
;-------------------------------------------------
.endif
+103 -51
View File
@@ -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
;----------------------------------------------------
+35 -57
View File
@@ -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
@@ -1237,6 +1207,7 @@ checkJoy
cmp #$0f
beq notpressedJoy
tay
mva #0 ATRACT ; reset atract mode
lda joyToKeyTable,y
jmp jumpFromStick
notpressedJoy
@@ -1430,8 +1401,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
@@ -1446,9 +1416,10 @@ pressedS
pressedSpace
;=================================
;we shoot here!!!
mva #0 pressTimer ; reset
jsr WaitForKeyRelease
lda #0
sta ATRACT ; reset atract mode
sta pressTimer ; reset
jsr WaitForKeyRelease.StillWait
lda pressTimer
cmp #25 ; 1/2s
bcc fire
@@ -1547,7 +1518,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 +1866,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 :)
@@ -1926,6 +1897,13 @@ NoDefence
lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2
rts ; END !!!
BouncyCastle
; now in Y we have number of of the attacking player (TankNr) !
lda ActiveWeapon,y
; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down
cmp #ind_Funky_Bomb_____
bne @+
jsr SetFullScreenSoilRange
@
mva #sfx_shield_on sfx_effect
; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)!
mva #1 Erase
@@ -2579,7 +2557,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 +2566,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