Compare commits

..

35 Commits

Author SHA1 Message Date
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
22 changed files with 1965 additions and 527 deletions
+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.
+3 -3
View File
@@ -1,6 +1,6 @@
.proc talk .proc talk
; Maximum text length is 63 characters!!! ; 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!" L1 dta d"DIE!"
L2 dta d"EAT MY SHORTS!" L2 dta d"EAT MY SHORTS!"
L3 dta d"YOU'RE TOAST!" L3 dta d"YOU'RE TOAST!"
@@ -47,7 +47,7 @@ L43 dta d"THIS IS YOUR BRAIN ON SCORCH."
L44 dta d"TAKE THIS!" L44 dta d"TAKE THIS!"
L45 dta d"THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US." L45 dta d"THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US."
L46 dta d"DIE, ALIEN SWINE!" 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." L48 dta d"I SHALL OIL MY TURRET WITH YOUR BLOOD."
L49 dta d"DIE, TANK-SCUM!" L49 dta d"DIE, TANK-SCUM!"
L50 dta d"I'M GONNA BREAK YOUR FACE!" 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!" L100 dta d"IT WASN'T JUST A JOB IT WAS AN ADVENTURE!"
L101 dta d"I DIDN'T LIKE VIOLENCE ANYWAY!" L101 dta d"I DIDN'T LIKE VIOLENCE ANYWAY!"
L102 dta d"I THOUGHT YOU LIKED ME?" 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." L104 dta d"I THINK THIS GUY'S A LITTLE CRAZY."
L105 dta d"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE." L105 dta d"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE."
L106 dta d"HEY! KILLIN' AIN'T COOL." L106 dta d"HEY! KILLIN' AIN'T COOL."
+35 -12
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 dta 1,2,3,7,17,18,19,20,21,22,23,24,25,26,27
weaponsOfDeathEnd weaponsOfDeathEnd
joyToKeyTable joyToKeyTable
; .by 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15 .by $ff ;00
.by $ff,$ff,$ff,$ff,$ff,$ff,$ff,$07,$ff,$ff,$ff,$06,$ff,$0f,$0e,$ff .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) keycodes ;tables for converting KeyCode to Screen Code (38 -1 characters)
@@ -546,7 +560,7 @@ scrcodes
gameOverSpritesTop gameOverSpritesTop
; end of the Gover sprites by number of players ; end of the Gover sprites by number of players
; 1 2 3 4 5 6 ; 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 ;-------decimal constans
zero zero
digits dta d"0123456789" digits dta d"0123456789"
@@ -559,8 +573,6 @@ CreditsStart
dta d"Warsaw, Miam",d"i"* dta d"Warsaw, Miam",d"i"*
dta d"2000-202",d"2"* dta d"2000-202",d"2"*
dta d" "* dta d" "*
dta d"B",d"y"*
dta d" "*
dta d"Programmin",d"g"* dta d"Programmin",d"g"*
dta d"Tomasz 'Pecus' Peck",d"o"* dta d"Tomasz 'Pecus' Peck",d"o"*
dta d"Pawel 'pirx' Kalinowsk",d"i"* dta d"Pawel 'pirx' Kalinowsk",d"i"*
@@ -568,15 +580,19 @@ CreditsStart
dta d"SFX, Music and Suppor",d"t"* dta d"SFX, Music and Suppor",d"t"*
dta d"Michal 'Miker' Szpilowsk",d"i"* dta d"Michal 'Miker' Szpilowsk",d"i"*
dta d" "* dta d" "*
dta d"Additional Musi",d"c"* .IF target != 5200
dta d"Mario 'Emkay' Kri",d"x"* dta d"Additional Musi",d"c"*
dta d" "* dta d"Mario 'Emkay' Kri",d"x"*
dta d" "*
.ENDIF
dta d"Code Optimizatio",d"n"* dta d"Code Optimizatio",d"n"*
dta d"Piotr '0xF' Fusi",d"k"* dta d"Piotr '0xF' Fusi",d"k"*
dta d" "* dta d" "*
dta d"Ar",d"t"* dta d"Ar",d"t"*
dta d"Adam Wachowsk",d"i"* dta d"Adam Wachowsk",d"i"*
dta d"Krzysztof 'Kaz' Ziembi",d"k"* .IF target != 5200
dta d"Krzysztof 'Kaz' Ziembi",d"k"*
.ENDIF
dta d" "* dta d" "*
dta d"Ideas and Q",d"A"* dta d"Ideas and Q",d"A"*
dta d"Bocianu, Probabilitydragon, EnderDude",d","* dta d"Bocianu, Probabilitydragon, EnderDude",d","*
@@ -586,9 +602,16 @@ CreditsStart
dta d" "* dta d" "*
dta d"Additional testin",d"g"* dta d"Additional testin",d"g"*
dta d"Arek and Alex Peck",d"o"* dta d"Arek and Alex Peck",d"o"*
dta d" "* .IF target != 5200
dta d"Stay tuned for the FujiNet version",d"!"* dta d" "*
dta d"Stay tuned for the FujiNet version",d"!"*
.ENDIF
dta d" "* dta d" "*
CreditsEnd CreditsEnd
CreditsLines=44 .IF target = 5200
CreditsLines=36
.ELSE
CreditsLines=42 ; 34 in reality. add 7?
.ENDIF
.endif .endif
+4 -8
View File
@@ -7,20 +7,16 @@ screenwidth = screenBytes*8 ; Max screenwidth = 512!!!
TankWidth = 8 TankWidth = 8
;---------------------------------------------- ;----------------------------------------------
; Player/missile memory ; Player/missile memory
PMGraph = $0800 ; real PM start = $0b00 PMGraph = $1800 ; real PM start = PMGraph + $0300
; Generated tables ; Generated tables
linetableL = $0b00 - (screenHeight+1)*2 display = $2010 ;screen takes $1f68 because it has screenHeight+1 lines because of out of screen tracer(?)
linetableH = $0b00 - (screenHeight+1) ;----------------------------------------------
display = $1010 ;screen takes $1f68 because it has screenHeight+1 lines because of out of screen tracer(?)
margin = 40 ;mountain drawing Y variable margin margin = 40 ;mountain drawing Y variable margin
MaxPlayers = 6 MaxPlayers = 6
maxOptions = 9 ;number of all options maxOptions = 9 ;number of all options
PMOffsetX = $2C ; P/M to graphics offset PMOffsetX = $2C ; P/M to graphics offset
PMOffsetY = $23 ; P/M to graphics offset PMOffsetY = $2A ; P/M to graphics offset
napalmRadius = 10 napalmRadius = 10
StandardBarrel = 6 ; standard tank barrel length StandardBarrel = 6 ; standard tank barrel length
LongBarrel = 20 ; long barrel length LongBarrel = 20 ; long barrel length
+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
+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
;---------------------------------------------------
purchaseTextBuffer
dta d"Player: Cash: 0" ; ZERO TO MAKE YOU RICHER ON THE SCREEN
; DLs fragments (modified by game code)
; all Purchase DL :)
PurchaseDL
.byte $70
.byte $47
DLPurTitleAddr
.word PurchaseTitle
.byte $50
.byte $42+$80
.word purchaseTextBuffer
.byte $60,$42
MoreUpdl
.word EmptyLine
.byte 0,$42
WeaponsListDL
.word ListOfWeapons
:15 .byte 0,2
.byte 0, $42
MoreDownDL
.word EmptyLine
.byte $40,$42
.word WeaponsDescription
.byte $0,$42
PurActDescAddr
.word PurchaseDescription
.byte $41
.word PurchaseDL
;------------------------
DLCreditsFragm
.byte $60+$80
.byte $42+$20 ; VSCRL
DLCreditsAddr
.word Credits
:6 .byte $02+$20
.byte $02
.byte $41
.word GameOverDL
.endif
+74 -109
View File
@@ -1,107 +1,6 @@
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
.IF *>0 ;this is a trick that prevents compiling this file alone .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) ; start of "constants" (ROM)
;----------------------------------------------- ;-----------------------------------------------
@@ -110,9 +9,44 @@ DLCreditsAddr
OptionsScreen OptionsScreen
dta d"Welcome to Scorch v. " dta d"Welcome to Scorch v. "
build ; 4 bytes from scorch.asm (fancy method) :) build ; 4 bytes from scorch.asm (fancy method) :)
dta d" (un)2000-2022" dta d" (un)2000-2022"
.IF TARGET = 800
dta d" Please select option with cursor keys " dta d" Please select option with cursor keys "
dta d" and press (Return) to proceed " 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 MoreUp
dta d" " dta d" "
dta 92,92,92 dta 92,92,92
@@ -127,20 +61,39 @@ MoreDown
dta d" " dta d" "
WeaponsDescription WeaponsDescription
; 0123456789012345678901234567890123456789 ; 0123456789012345678901234567890123456789
.IF TARGET = 800
dta d"Tab"* dta d"Tab"*
dta d ": Defensive/Offensive weapon " dta d ": Defensive/Offensive weapon "
.ELIF TARGET = 5200
dta d"Left"*
dta d ": Defensive/Offensive weapon"
.ENDIF
PurchaseDescription PurchaseDescription
; 0123456789012345678901234567890123456789 ; 0123456789012345678901234567890123456789
.IF TARGET = 800
dta d"Space"* dta d"Space"*
dta d": Purchase " dta d": Purchase "
dta d"Return"* dta d"Return"*
dta d": Finish " dta d": Finish "
.ELIF TARGET = 5200
dta d"Right"*
dta d": Purchase "
dta d"FIRE"*
dta d": Finish "
.ENDIF
ActivateDescription ActivateDescription
; 0123456789012345678901234567890123456789 ; 0123456789012345678901234567890123456789
.IF TARGET = 800
dta d"Space"* dta d"Space"*
dta d": Activate " dta d": Activate "
dta d"Return"* dta d"Return"*
dta d": Finish " dta d": Finish "
.ELIF TARGET = 5200
dta d"Right"*
dta d": Activate "
dta d"FIRE"*
dta d": Finish "
.ENDIF
EmptyLine EmptyLine
dta d" " dta d" "
;--------------------------------------------------- ;---------------------------------------------------
@@ -161,9 +114,9 @@ GameOverTitle2
;----------------------------------------------------- ;-----------------------------------------------------
dl ; MAIN game display list dl ; MAIN game display list
.byte 0 .byte $70
.byte $42 .byte $42
.word textbuffer .word statusBuffer
.byte $02, $02 +$80 ;DLI .byte $02, $02 +$80 ;DLI
.byte $10 ; 2 blank lines .byte $10 ; 2 blank lines
@@ -207,7 +160,6 @@ dl ; MAIN game display list
.byte $41 .byte $41
.word dl .word dl
;----------------------------------------------- ;-----------------------------------------------
.ALIGN $1000 ; WARNING!!!! 4KiB barrier crossing here, might need reassignment!!!
OptionsDL OptionsDL
.byte $70 .byte $70
.byte $47 .byte $47
@@ -222,6 +174,7 @@ OptionsDL
:maxOptions-1 .by $02,$10 :maxOptions-1 .by $02,$10
:(9-maxOptions) .by $70,$10 :(9-maxOptions) .by $70,$10
.byte $80 .byte $80
.byte $70 ; to match moved sprites
.byte $4f .byte $4f
.word (display+140*40) .word (display+140*40)
:21 .by $0f ;76 :21 .by $0f ;76
@@ -233,12 +186,23 @@ NameDL
.byte $70 .byte $70
.byte $47 .byte $47
.word DifficultyTitle .word DifficultyTitle
.byte $70,$70 .byte $70,$70 ; 16 empty lines
.byte $42 .byte $42
.word NameScreen .word NameScreen
.byte $30 .byte $30 ; 4 empty lines
.byte $02,$30+$80,$02 .byte $42
.byte $10,$02,$02,$02,$30,$02,$02 .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 .byte $41
.word NameDL .word NameDL
; ------------------------------------------------- ; -------------------------------------------------
@@ -249,6 +213,7 @@ GameOverDL
.byte $70,$40 .byte $70,$40
.byte $47 ; 16 gr8 lines .byte $47 ; 16 gr8 lines
.word GameOverTitle .word GameOverTitle
.byte $60 ; 7 lines down to match new sprite position
.byte $4f ; 1 line .byte $4f ; 1 line
.word display+(40*72) .word display+(40*72)
:28 .byte $0f ; 28 lines :28 .byte $0f ; 28 lines
+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 lda (modify),y
tax tax
NotHigher NotHigher
inw modify ; inw modify
cpw modify #(mountaintable+screenwidth) ; 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 bne nextPointChecking
txa txa
rts rts
.endp .endp
; ----------------------------------------- ; -----------------------------------------
.proc unPlot .proc unPlot
; plots a point and saves the plotted byte, reverts the previous plot. ; plots a point and saves the plotted byte, reverts the previous plot.
@@ -2171,5 +2181,37 @@ ybarrel
rts rts
.endp .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 .endif
+147
View File
@@ -0,0 +1,147 @@
;-------------------------------------
.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
beq ?zero
bpl ?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 mode10 = %10000000
mode11 = %11000000 mode11 = %11000000
.ende .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
+1 -1
View File
@@ -101,7 +101,7 @@
sta :1+1 sta :1+1
.endm .endm
;------------------------------------- ;-------------------------------------
.macro randomize .macro randomizer
;usage: randomize floor ceiling ;usage: randomize floor ceiling
;returns (in A) a random .byte between "floor" and "ceiling" ;returns (in A) a random .byte between "floor" and "ceiling"
.if :2 < :1 .if :2 < :1
+322 -213
View File
@@ -2,45 +2,30 @@
;Atari 8-bit Scorched Earth source code ;Atari 8-bit Scorched Earth source code
;--------------------------------------------------- ;---------------------------------------------------
;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski ;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski
;Warsaw 2000,2001,2002,2003,2009,2012,2013 ;Warsaw 2000, 2001, 2002, 2003, 2009, 2012, 2013
;Miami&Warsaw 2022 ;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) .def TARGET = 800 ;5200 ; or 800
;and on 2012-06-21 translated to mads ;atari800 -5200 -cart ${outputFilePath} -cart-type 4
; ;atari800 -run ${outputFilePath}
;game source code is split into 5+2 parts: ;---------------------------------------------------
;scorch.asm is the main game code (with many assorted routines)
;grafproc.asm - graphics routines like line or circle
;textproc.asm - text routines like list of weapons and shop
;variables.asm - all non-zero page variables and constans
;display.asm - display lists and text screen definitions
;ai.asm - artificial stupidity of computer opponents
;weapons.asm - general arsenal of tankies
;we were trying to use as much macros and pseudoops as possible OPT r+ ; saves 12 bytes :O
;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
;---------------------------------------------------
.macro build .macro build
dta d"1.14" ; number of this build (3 bytes) dta d"1.16" ; number of this build (4 bytes)
.endm .endm
.macro RMTSong
lda #:1
jsr RMTSongSelect
.endm
;---------------------------------------------------
icl 'definitions.asm' icl 'definitions.asm'
;---------------------------------------------------
.zpvar xdraw .word = $64 ;variable X for plot .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 ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen)
@@ -83,9 +68,6 @@
.zpvar pressTimer .byte .zpvar pressTimer .byte
.zpvar NTSCcounter .byte .zpvar NTSCcounter .byte
.zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling .zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling
;.zpvar dliA .byte
;.zpvar dliX .byte
;.zpvar dliY .byte
.zpvar sfx_effect .byte .zpvar sfx_effect .byte
.zpvar RMT_blocked .byte .zpvar RMT_blocked .byte
@@ -103,7 +85,6 @@
.zpvar Counter .byte ;temporary Counter for outside loops .zpvar Counter .byte ;temporary Counter for outside loops
.zpvar ExplosionRadius .word ;because when adding in xdraw it is double byte .zpvar ExplosionRadius .word ;because when adding in xdraw it is double byte
.zpvar ResultY .byte .zpvar ResultY .byte
; .zpvar FallDown2 .byte
.zpvar xcircle .word .zpvar xcircle .word
.zpvar ycircle .word .zpvar ycircle .word
.zpvar vy .word .zpvar vy .word
@@ -134,7 +115,6 @@
.zpvar HowToDraw .byte .zpvar HowToDraw .byte
.zpvar gravity .byte .zpvar gravity .byte
.zpvar LineLength .word .zpvar LineLength .word
;.zpvar LineAddress4x4 .word
.zpvar tracerflag .byte .zpvar tracerflag .byte
.zpvar isInventory .byte .zpvar isInventory .byte
.zpvar DifficultyLevel .byte .zpvar DifficultyLevel .byte
@@ -143,28 +123,97 @@
.zpvar L1 .byte .zpvar L1 .byte
;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65 ;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65
.zpvar RMT_Zero_Page_V .byte
displayposition = modify displayposition = modify
LineAddress4x4 = temp LineAddress4x4 = temp
;------------------------------- ;-----------------------------------------------
; libraries
;-----------------------------------------------
.IF TARGET = 5200
OPT h-f+ ; no headers, single block --> cart bin file
icl 'lib/5200SYS.ASM'
icl 'lib/5200MACRO.ASM'
.enum @kbcode
/*
_0
_1
_2
_3
_4
_5
_6
_7
_8
_9
_asterisk = $0a
_hash = $0b
_start = $0c
_pause = $0d
_reset = $0e
*/
_space = $00
_Y = $01
_up = $f2 ;02
_O = $03
_left = $f4 ;04
_tab = $05
_right = $f6 ;06
_A = $07
_down = $f8 ;08
_I = $09
_esc = $0a
_ret = $fb ;$0b ;not used in 5200
_del = $fc ;$0c ;not used in 5200
_M = $0d
_S = $0e
_none = $0f
icl 'lib/ATARISYS.ASM' .ende */
icl 'lib/macro.hea' .ELSE
icl 'lib/ATARISYS.ASM'
;splash screen and musix icl 'lib/MACRO.ASM'
icl 'artwork/Scorch50.asm' icl 'artwork/Scorch50.asm' ; splash screen and musix
.ENDIF
;Game loading address ;-----------------------------------------------
ORG $3000 ; variable declarations in RAM (no code)
;-----------------------------------------------
ORG PMGraph + $0300 - (variablesEnd - OneTimeZeroVariables + 1)
icl 'variables.asm'
; Game loading address
ORG $4000
WeaponFont WeaponFont
ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt'
;----------------------------------------------- ;-----------------------------------------------
;Screen displays go here to avoid crossing 4kb barrier ;Screen displays go here to avoid crossing 4kb barrier
;----------------------------------------------- ;-----------------------------------------------
icl 'display.asm' DisplayCopyRom = *
org display, DisplayCopyRom
DisplayCopyStart
icl 'display_main_menu.asm'
DisplayCopyEnd
org DisplayCopyRom + (DisplayCopyEnd - DisplayCopyStart)
DisplayCopyPurchaseDlROM = *
org DisplayCopyPurchase, DisplayCopyPurchaseDlROM
DisplayCopyPurchaseStart
icl 'display_purchasedl.asm'
DisplayCopyPurchaseEnd
org DisplayCopyPurchaseDlROM + (DisplayCopyPurchaseEnd - DisplayCopyPurchaseStart)
StatusBufferROM = *
org StatusBufferCopy, StatusBufferROM
StatusBufferCopyStart
icl 'display_status.asm'
StatusBufferCopyEnd
org StatusBufferROM + (StatusBufferCopyEnd - StatusBufferCopyStart)
icl 'display_static.asm'
;---------------------------------------------- ;----------------------------------------------
;-------------------------------------------------- ;--------------------------------------------------
@@ -176,15 +225,15 @@ FirstSTART
; one time zero variables in RAM (non zero page) ; one time zero variables in RAM (non zero page)
lda #0 lda #0
ldy #OneTimeZeroVariablesCount-1 ldy #OneTimeZeroVariablesCount-1
@ sta OneTimeZeroVariables,y @ sta OneTimeZeroVariables,y
dey dey
bpl @- bpl @-
; initialize variables in RAM (non zero page) ; initialize variables in RAM (non zero page)
ldy #initialvaluesCount-1 ldy #initialvaluesCount-1
@ lda initialvaluesStart,y @ lda initialvaluesStart,y
sta variablesToInitialize,y sta variablesToInitialize,y
dey dey
bpl @- bpl @-
@@ -202,7 +251,6 @@ FirstSTART
cpy #screenheight+1 cpy #screenheight+1
bne @- bne @-
; RMT INIT ; RMT INIT
lda #$f0 ;initial value lda #$f0 ;initial value
sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240) sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240)
@@ -210,20 +258,24 @@ FirstSTART
lda #$ff ;initial value lda #$ff ;initial value
sta sfx_effect sta sfx_effect
lda #0 RMTSong 0
jsr RmtSongSelect
.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 VMAIN VBLinterrupt,7 ;jsr SetVBL
mva #2 chactl ; necessary for 5200
START START
; Startup sequence ; Startup sequence
jsr Initialize jsr Initialize
;jsr GameOverScreen ; only for test !!! ;jsr GameOverScreen ; only for test !!!
lda #song_main_menu RMTSong song_main_menu
jsr RmtSongSelect
jsr Options ;startup screen jsr Options ;startup screen
jsr MakeDarkScreen jsr MakeDarkScreen
@@ -242,12 +294,7 @@ MainGameLoop
jsr SetWallsType jsr SetWallsType
; first set default barrel lengths (fix for Long Schlong activation :) ) ; first set default barrel lengths (fix for Long Schlong activation :) )
; we must do it before purchase/activate ; we must do it before purchase/activate
ldx #(MaxPlayers-1) jsr SetStandardBarrels
SettingBarrel
lda #StandardBarrel ; standard barrel length
sta BarrelLength,x
dex
bpl SettingBarrel
jsr CallPurchaseForEveryTank jsr CallPurchaseForEveryTank
@@ -281,8 +328,7 @@ SettingBarrel
; Results are number of other deaths ; Results are number of other deaths
; before the player dies itself ; before the player dies itself
lda #song_round_over RmtSong song_round_over
jsr RmtSongSelect
jsr DisplayResults jsr DisplayResults
jsr DemoModeOrKey jsr DemoModeOrKey
@@ -385,7 +431,7 @@ GoGameOver
NoGameOverYet NoGameOverYet
inc CurrentRoundNr inc CurrentRoundNr
jsr MakeDarkScreen ; issue #72 jsr MakeDarkScreen ; issue #72
jsr RmtSongSelect ; jsr RmtSongSelect ; ?????
mva #sfx_silencer sfx_effect mva #sfx_silencer sfx_effect
jsr PMoutofscreen jsr PMoutofscreen
@@ -402,8 +448,7 @@ NoGameOverYet
; the shooting angle is randomized ; the shooting angle is randomized
; of course gains an loses are zeroed ; of course gains an loses are zeroed
lda #song_ingame RmtSong song_ingame
jsr RmtSongSelect
jsr SetPMWidth jsr SetPMWidth
lda #0 lda #0
@@ -457,16 +502,15 @@ SettingEnergies
jsr calculatemountains ;let mountains be easy for the eye jsr calculatemountains ;let mountains be easy for the eye
;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height ;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 SetMainScreen
jsr ColorsOfSprites jsr ColorsOfSprites
; lda #90 ; barrel fully erect
; ldx #MaxPlayers-1
;@ sta previousBarrelAngle,x
; dex
; bpl @-
jsr drawmountains ;draw them jsr drawmountains ;draw them
jsr drawtanks ;finally draw tanks jsr drawtanks ;finally draw tanks
@@ -570,7 +614,7 @@ RoboTanks
jsr DisplayStatus ; to make visible AI selected defensive (and offensive :) ) jsr DisplayStatus ; to make visible AI selected defensive (and offensive :) )
jsr MoveBarrelToNewPosition jsr MoveBarrelToNewPosition
lda kbcode lda kbcode
cmp #28 ; ESC cmp #@kbcode._esc ; 28 ; ESC
bne @+ bne @+
jsr AreYouSure jsr AreYouSure
@ lda escFlag @ lda escFlag
@@ -632,16 +676,9 @@ ShootNow
lda HitFlag ;0 if missed lda HitFlag ;0 if missed
beq missed beq missed
lda #0
; sta FallDown2
jsr Explosion jsr Explosion
continueMainRoundLoopAfterSeppuku continueMainRoundLoopAfterSeppuku
;here we clear offensive text (after a shoot)
;ldy TankNr
;mva #0 plot4x4color
;jsr DisplayOffensiveTextNr
AfterExplode AfterExplode
jsr SoilDown2 ; allways jsr SoilDown2 ; allways
@@ -659,9 +696,8 @@ NoExistNoFall
dex dex
bpl TanksFallDown bpl TanksFallDown
mvx tempor2 TankNr mvx tempor2 TankNr
missed
; TODO: IS IT OK??? possibly a fix here needed for #56 missed
ldy WeaponDepleted ldy WeaponDepleted
bne @+ bne @+
ldx TankNr ldx TankNr
@@ -670,7 +706,6 @@ missed
@ @
;here we clear offensive text (after a shoot) ;here we clear offensive text (after a shoot)
;shit -- it's second time, but it must be like this
ldy TankNr ldy TankNr
mva #$00 plot4x4color mva #$00 plot4x4color
jsr DisplayOffensiveTextNr jsr DisplayOffensiveTextNr
@@ -742,7 +777,6 @@ NoPlayerNoDeath
;clear NoDeathCounter here ;clear NoDeathCounter here
sta noDeathCounter sta noDeathCounter
; display defensive text here (well, defensive ; display defensive text here (well, defensive
; is not the real meaning, it should be pre-death, ; is not the real meaning, it should be pre-death,
; but I am too lazy to change names of variables) ; but I am too lazy to change names of variables)
@@ -756,7 +790,7 @@ NoPlayerNoDeath
inc CurrentResult inc CurrentResult
mva #sfx_death_begin sfx_effect mva #sfx_death_begin sfx_effect
;RandomizeDeffensiveText ; RandomizeDeffensiveText
randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1)
sta TextNumberOff sta TextNumberOff
ldy TankTempY ldy TankTempY
@@ -794,7 +828,6 @@ NoPlayerNoDeath
;cleanup of the soil fall down ranges (left and right) ;cleanup of the soil fall down ranges (left and right)
sta RangeRight sta RangeRight
sta RangeRight+1 sta RangeRight+1
; sta FallDown2
mwa #screenwidth RangeLeft mwa #screenwidth RangeLeft
; We are randomizing the weapon now. ; We are randomizing the weapon now.
@@ -901,11 +934,10 @@ NotNegativeShieldEnergy
;--------------------------------- ;---------------------------------
.proc Seppuku .proc Seppuku
lda #0 lda #0
;sta FallDown2
sta ydraw+1 sta ydraw+1
; get position of the tank ; get position of the tank
ldx TankNr ldx TankNr
lda #0 ; turn off defense weapons when hara-kiring ; lda #0 ; turn off defense weapons when hara-kiring
sta ActiveDefenceWeapon,x sta ActiveDefenceWeapon,x
sta ShieldEnergy,x sta ShieldEnergy,x
jsr SetupXYdraw jsr SetupXYdraw
@@ -973,27 +1005,6 @@ B0 DEY
sta MaxForceTableL,x sta MaxForceTableL,x
rts rts
.endp .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; .proc WeaponCleanup;
@@ -1095,17 +1106,6 @@ MakeTanksVisible
rts rts
.endp .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 ;sta dliA
;sty dliY ;sty dliY
@@ -1114,8 +1114,9 @@ MakeTanksVisible
ldy dliCounter ldy dliCounter
lda dliColorsBack,y lda dliColorsBack,y
ldy dliColorsFore ldy dliColorsFore
nop .IF TARGET = 800
nop nop ; necessary on 800 because DLIs take less time, jitter visible without it
.ENDIF
nop nop
sta COLPF1 sta COLPF1
sty COLPF2 sty COLPF2
@@ -1162,7 +1163,7 @@ ColoredLines
cmp #9 cmp #9
beq CreditsScroll beq CreditsScroll
tay 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) ldy #$0a ; text colour (brightnes)
STA WSYNC STA WSYNC
sta COLPF2 sta COLPF2
@@ -1176,6 +1177,7 @@ CreditsScroll
cmp #32 ;not too fast cmp #32 ;not too fast
beq nextlinedisplay beq nextlinedisplay
:2 lsr ;not too fast :2 lsr ;not too fast
sta WSYNC
sta VSCROL sta VSCROL
jmp EndOfDLI_GO jmp EndOfDLI_GO
nextlinedisplay nextlinedisplay
@@ -1196,8 +1198,9 @@ EndOfDLI_GO
.proc DLIinterruptText .proc DLIinterruptText
;sta dliA ;sta dliA
pha pha
lda #TextBackgroundColor
sta WSYNC sta WSYNC
mva #TextBackgroundColor COLPF2 sta COLPF2
mva #TextForegroundColor COLPF3 mva #TextForegroundColor COLPF3
;lda dliA ;lda dliA
pla pla
@@ -1206,9 +1209,6 @@ DLIinterruptNone
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
.proc VBLinterrupt .proc VBLinterrupt
pha
phx
phy
mva #0 dliCounter mva #0 dliCounter
lda PAL lda PAL
@@ -1244,11 +1244,59 @@ lab2
; ------- RMT ------- ; ------- RMT -------
SkipRMTVBL SkipRMTVBL
exitVBL exitVBL
ply .IF TARGET = 5200
plx center = 114 ;Read analog stick and make it look like a digital stick
pla threshold = 60
jmp XITVBV
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 .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 .proc RandomizeSequence0
ldx #0 ldx #0
@@ -1466,7 +1514,7 @@ Bubble
BubbleBobble BubbleBobble
lda TempResults,x lda TempResults,x
cmp TempResults+1,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 bcc nextishigher
;here we must swap values ;here we must swap values
;because next is smaller than previous ;because next is smaller than previous
@@ -1518,18 +1566,21 @@ SetRandomWalls
;-------------------------------------------------- ;--------------------------------------------------
jsr WaitForKeyRelease jsr WaitForKeyRelease
@ @
lda SKSTAT .IF TARGET = 800
cmp #$ff lda SKSTAT
beq checkJoyGetKey ; key not pressed, check Joy cmp #$ff
cmp #$f7 ; SHIFT beq checkJoyGetKey ; key not pressed, check Joy
beq checkJoyGetKey cmp #$f7 ; SHIFT
beq checkJoyGetKey
lda kbcode .ENDIF
and #$3f ;CTRL and SHIFT ellimination lda kbcode
cmp #28 ; ESC cmp #@kbcode._none
bne getkeyend beq checkJoyGetKey
mvx #$80 escFlag and #$3f ;CTRL and SHIFT ellimination
bne getkeyend cmp #@kbcode._esc ; 28 ; ESC
bne getkeyend
mvx #$80 escFlag
bne getkeyend
checkJoyGetKey checkJoyGetKey
;------------JOY------------- ;------------JOY-------------
@@ -1547,7 +1598,7 @@ notpressedJoyGetKey
;fire ;fire
lda STRIG0 lda STRIG0
bne @- bne @-
lda #$0c ;Return key lda #@kbcode._ret ;Return key
getkeyend getkeyend
mvx #sfx_keyclick sfx_effect mvx #sfx_keyclick sfx_effect
@@ -1566,20 +1617,22 @@ getkeyend
;-------------------------------------------------- ;--------------------------------------------------
.proc WaitForKeyRelease .proc WaitForKeyRelease
;-------------------------------------------------- ;--------------------------------------------------
lda STICK0 lda STICK0
and #$0f and #$0f
cmp #$0f cmp #$0f
bne WaitForKeyRelease bne WaitForKeyRelease
lda STRIG0 lda STRIG0
beq WaitForKeyRelease beq WaitForKeyRelease
lda SKSTAT .IF TARGET = 800
cmp #$ff lda SKSTAT
bne WaitForKeyRelease cmp #$ff
lda CONSOL bne WaitForKeyRelease
and #%00000110 ; Select and Option only lda CONSOL
cmp #%00000110 and #%00000110 ; Select and Option only
bne WaitForKeyRelease cmp #%00000110
rts bne WaitForKeyRelease
rts
.ENDIF
.endp .endp
;-------------------------------------------------- ;--------------------------------------------------
.proc IsKeyPressed ; A=0 - yes , A>0 - no .proc IsKeyPressed ; A=0 - yes , A>0 - no
@@ -1606,26 +1659,25 @@ checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE
;pause 150 ;pause 150
ldy #75 ldy #75
jsr PauseYFrames jsr PauseYFrames
jmp noKey rts
peopleAreHere peopleAreHere
jsr getkey jmp getkey ; jsr:rts
noKey
rts
.endp .endp
MakeDarkScreen MakeDarkScreen
mva #0 dmactls ; dark screen mva #0 dmactls ; dark screen
sta dmactl
; and wait one frame :) ; and wait one frame :)
.proc WaitOneFrame .proc WaitOneFrame
lda CONSOL lda CONSOL
and #%00000101 ; Start + Option and #%00000101 ; Start + Option
bne @+ sne:mva #$40 escFlag
mva #$40 escFlag and #%00000001 ; START KEY
@ and #%00000001 ; START KEY seq:wait
beq @+ rts
wait
@ rts
.endp .endp
.proc PauseYFrames .proc PauseYFrames
; Y - number of frames to wait (divided by 2) ; Y - number of frames to wait (divided by 2)
; pauses for maximally 510 frames (255 * 2) ; pauses for maximally 510 frames (255 * 2)
@@ -1641,7 +1693,7 @@ MakeDarkScreen
;-------------------------------------------------- ;--------------------------------------------------
; starting song line 0-255 to A reg ; starting song line 0-255 to A reg
cmp #song_ingame cmp #song_ingame
bne noingame ; noMusic blck onlu ingame song bne noingame ; noMusic blocks only ingame song
bit noMusic bit noMusic
spl:lda #song_silencio spl:lda #song_silencio
noingame noingame
@@ -1652,58 +1704,115 @@ noingame
mva #0 RMT_blocked mva #0 RMT_blocked
rts rts
.endp .endp
;;-------------------------------------------------- ;-------------------------------------------------
;.proc Randomizer .proc CopyFromROM
;;-------------------------------------------------- ;-------------------------------------------------
; ;usage: randomize floor ceiling ;copy from CART to RAM
; ;returns (in A) a random .byte between "floor" and "ceiling" ; trashes: Y
;?rand ; temp: source
; lda random ; temp2: destination
; cmp #:1 ;floor ; modify: destination-end
; bcc ?rand ;usage:
; cmp #:2+1 ;ceiling ; mwa #DisplayCopyRom temp
; bcs ?rand ; mwa #display temp2
; rts ; mwa #DisplayCopyEnd+1 modify
;.endp ; 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 'textproc.asm'
;---------------------------------------------- ;----------------------------------------------
icl 'grafproc.asm' icl 'grafproc.asm'
;---------------------------------------------- ;----------------------------------------------
icl 'ai.asm' icl 'weapons.asm'
;---------------------------------------------- ;----------------------------------------------
icl 'constants.asm' icl 'ai.asm'
;---------------------------------------------- ;----------------------------------------------
icl 'artwork/talk.asm' icl 'artwork/talk.asm'
;---------------------------------------------- ;----------------------------------------------
TankFont TankFont
ins 'artwork/tanksv3.fnt',+0,352 ; 44 characters only ins 'artwork/tanksv3.fnt',+0,352 ; 44 characters only
;---------------------------------------------- ;----------------------------------------------
icl 'variables.asm'
;----------------------------------------------
; reserved space for RMT player ;RMT PLAYER and song loading shenaningans
.ds $0320 icl 'artwork/sfx/rmtplayr_modified.asm'
.align $100 org $b000
PLAYER MODUL ; equ $b000 ;address of RMT module
.ECHO 'PLAYER: ',* ;opt h- ;RMT module is standard Atari binary file already
icl 'artwork/sfx/rmtplayr.a65' ins "artwork/sfx/scorch_str6.rmt",+6 ;include music RMT module
;opt h+
MODUL equ $b000 ;address of RMT module MODULEND
opt h- ;RMT module is standard Atari binary file already
ins "artwork/sfx/scorch_str6.rmt" ;include music RMT module
opt h+
;
;---------------------------------------------- ;----------------------------------------------
org $bf80
font4x4 font4x4
ins 'artwork/font4x4s.bmp',+62 ins 'artwork/font4x4s.bmp',+62
;----------------------------------------------
.IF target = 5200
.IF * > ROM_SETTINGS-1
.ERROR 'Code too long to fit in 5200'
.ENDIF
run FirstSTART 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.
+84 -73
View File
@@ -18,11 +18,13 @@
jsr clearscreen ;let the screen be clean jsr clearscreen ;let the screen be clean
mwa #DisplayCopyRom temp
mwa #display temp2
mwa #DisplayCopyEnd+1 modify
jsr CopyFromROM
mwa #OptionsDL dlptrs 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 lda #%00111110 ; normal screen width, DL on, P/M on
sta dmactls sta dmactls
jsr SetPMWidth jsr SetPMWidth
@@ -42,7 +44,7 @@
sta mountainDeltaL sta mountainDeltaL
mva #6 NumberOfPlayers mva #6 NumberOfPlayers
jsr PMoutofScreen ;let P/M disappear 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 ClearPMmemory
jsr placetanks ;let the tanks be evenly placed jsr placetanks ;let the tanks be evenly placed
jsr calculatemountains ;let mountains be easy for the eye jsr calculatemountains ;let mountains be easy for the eye
@@ -66,7 +68,7 @@ OptionsMainLoop
bit escFlag bit escFlag
spl:rts spl:rts
cmp #$f ;cursor down cmp #@kbcode._down ; $f ;cursor down
bne OptionsNoDown bne OptionsNoDown
inc:lda OptionsY inc:lda OptionsY
cmp #maxoptions cmp #maxoptions
@@ -75,7 +77,7 @@ OptionsMainLoop
jmp OptionsMainLoop jmp OptionsMainLoop
OptionsNoDown OptionsNoDown
cmp #$e ;cursor up cmp #@kbcode._up ; $e ;cursor up
bne OptionsNoUp bne OptionsNoUp
dec OptionsY dec OptionsY
bpl OptionsMainLoop bpl OptionsMainLoop
@@ -83,7 +85,7 @@ OptionsNoDown
jmp OptionsMainLoop jmp OptionsMainLoop
OptionsNoUp OptionsNoUp
cmp #$6 ;cursor left cmp #@kbcode._left ; $6 ;cursor left
bne OptionsNoLeft bne OptionsNoLeft
ldx OptionsY ldx OptionsY
dec OptionsTable,X dec OptionsTable,X
@@ -93,19 +95,19 @@ OptionsNoUp
jmp OptionsMainLoop jmp OptionsMainLoop
OptionsNoLeft OptionsNoLeft
cmp #$7 ;cursor right cmp #@kbcode._right ; $7 ;cursor right
bne OptionsNoRight bne OptionsNoRight
ldx OptionsY ldx OptionsY
inc OptionsTable,X inc OptionsTable,X
lda OptionsTable,X lda OptionsTable,X
cmp #5 cmp #5 ; number of columns in options
bne OptionsMainLoop bne OptionsMainLoop
dec OptionsTable,X dec OptionsTable,X
jmp OptionsMainLoop jmp OptionsMainLoop
OptionsNoRight OptionsNoRight
cmp #$c ;Return key cmp #@kbcode._ret ; $c ;Return key
bne OptionsNoReturn bne OptionsNoReturn
jmp OptionsFinished jmp OptionsFinished
OptionsNoReturn OptionsNoReturn
@@ -276,6 +278,15 @@ AfterManualPurchase
; offensive weapon - 0, defensive - %10000000 ; offensive weapon - 0, defensive - %10000000
jmp Purchase.GoToActivation jmp Purchase.GoToActivation
.endp .endp
;--------------------------------------------------
.proc CopyFromPurchaseAndGameOver
mwa #DisplayCopyPurchaseDlROM temp
mwa #DisplayCopyPurchase temp2
mwa #DisplayCopyPurchaseEnd+1 modify
jmp CopyFromROM ; jsr:rts
.endp
;-------------------------------------------------- ;--------------------------------------------------
.proc Purchase ; .proc Purchase ;
;-------------------------------------------------- ;--------------------------------------------------
@@ -284,6 +295,8 @@ AfterManualPurchase
; Rest of the data is taken from appropriate tables ; Rest of the data is taken from appropriate tables
; and during the purchase these tables are modified. ; and during the purchase these tables are modified.
jsr CopyFromPurchaseAndGameOver
mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons
; we are clearing list of the weapons ; we are clearing list of the weapons
@@ -303,7 +316,7 @@ GoToActivation
bpl @+ bpl @+
lda #song_inventory lda #song_inventory
@ jsr RmtSongSelect @ jsr RmtSongSelect
ldx tankNr ldx tankNr
lda TankStatusColoursTable,x lda TankStatusColoursTable,x
sta COLOR2 sta COLOR2
@@ -317,7 +330,7 @@ GoToActivation
tax tax
NextChar03 NextChar03
lda tanksnames,x lda tanksnames,x
sta textbuffer2+8,y sta purchaseTextBuffer+8,y
inx inx
iny iny
cpy #$08 cpy #$08
@@ -335,7 +348,7 @@ AfterPurchase
sta decimal sta decimal
lda moneyH,x lda moneyH,x
sta decimal+1 sta decimal+1
mwa #textbuffer2+26 displayposition mwa #purchaseTextBuffer+26 displayposition
jsr displaydec5 jsr displaydec5
; in xbyte there is the address of the line that ; in xbyte there is the address of the line that
@@ -385,19 +398,19 @@ ChoosingItemForPurchase
jsr getkey jsr getkey
bit escFlag bit escFlag
spl:jmp WaitForKeyRelease ; like jsr ... : rts spl:jmp WaitForKeyRelease ; like jsr ... : rts
cmp #$2c ; Tab cmp #@kbcode._esc ; $2c ; Tab
jeq ListChange jeq ListChange
cmp #$06 ; cursor left cmp #@kbcode._left ; $06 ; cursor left
jeq ListChange jeq ListChange
cmp #$0c ; Return cmp #@kbcode._ret ; $0c ; Return
sne:rts sne:rts
cmp #$e cmp #@kbcode._up ; $e
beq PurchaseKeyUp beq PurchaseKeyUp
cmp #$f cmp #@kbcode._down ; $f
beq PurchaseKeyDown beq PurchaseKeyDown
cmp #$21 ; Space cmp #@kbcode._space ; $21 ; Space
jeq PurchaseWeaponNow jeq PurchaseWeaponNow
cmp #$07 ; cursor right cmp #@kbcode._right ; $07 ; cursor right
jeq PurchaseWeaponNow jeq PurchaseWeaponNow
bne ChoosingItemForPurchase bne ChoosingItemForPurchase
@@ -1057,7 +1070,7 @@ NoArrowDown
sta difficultyLevel sta difficultyLevel
inx inx
stx decimal stx decimal
mwa #(NameScreen+41) displayposition mwa #(NameScreen2+9) displayposition
jsr displaybyte jsr displaybyte
jsr HighlightLevel ; setting choosen level of the opponent (Moron, etc) jsr HighlightLevel ; setting choosen level of the opponent (Moron, etc)
@@ -1124,20 +1137,20 @@ YesLetter
@ stx PositionInName ; if not, we store @ stx PositionInName ; if not, we store
jmp CheckKeys jmp CheckKeys
CheckFurtherX01 ; here we check Tab, Return and Del CheckFurtherX01 ; here we check Tab, Return and Del
cmp #$0c ; Return cmp #@kbcode._ret ; $0c ; Return
jeq EndOfNick jeq EndOfNick
cmp #$2c ; Tab cmp #@kbcode._tab ; $2c ; Tab
beq ChangeOfLevelUp beq ChangeOfLevelUp
cmp #$7 ;cursor right cmp #@kbcode._right ; $7 ;cursor right
beq ChangeOfLevelUp beq ChangeOfLevelUp
cmp #$6 ;cursor left cmp #@kbcode._left ; $6 ;cursor left
beq ChangeOfLevelDown beq ChangeOfLevelDown
cmp #$f ;cursor down cmp #@kbcode._down ; $f ;cursor down
beq ChangeOfLevel3Up beq ChangeOfLevel3Up
cmp #$e ;cursor up cmp #@kbcode._up ; $e ;cursor up
beq ChangeOfLevel3Down beq ChangeOfLevel3Down
cmp #$34 ; Backspace (del) cmp #@kbcode._del ; $34 ; Backspace (del)
bne CheckKeys bne CheckKeys
; handling backing one char ; handling backing one char
ldx PositionInName ldx PositionInName
@@ -1321,7 +1334,7 @@ JoyNotCentered
bne NoRight bne NoRight
; joy right ; joy right
cpy #7 cpy #7
beq GoToMainLoop ; jast character beq GoToMainLoop ; the last character
iny iny
bne GoToMainLoop bne GoToMainLoop
NoRight NoRight
@@ -1340,7 +1353,7 @@ NoLeft
; joy up ; joy up
cpx #(keycodesEnd-keycodes-1) cpx #(keycodesEnd-keycodes-1)
bne @+ bne @+
ldx #$00 ; set to first character index (loop) ldx #$00 ; set to the first character index (loop)
beq CharAndMainLoop beq CharAndMainLoop
@ inx @ inx
bne CharAndMainLoop bne CharAndMainLoop
@@ -1350,7 +1363,7 @@ NoUp
; joy down ; joy down
dex dex
bpl CharAndMainLoop bpl CharAndMainLoop
ldx #(keycodesEnd-keycodes-1) ; set to last character index (loop) ldx #(keycodesEnd-keycodes-1) ; set to the last character index (loop)
CharAndMainLoop CharAndMainLoop
lda scrcodes,x lda scrcodes,x
sta NameAdr,y sta NameAdr,y
@@ -1754,7 +1767,7 @@ EndOfTypeLine4x4
jsr GetKey jsr GetKey
cmp #$2b ; "Y" cmp #@kbcode._Y ; $2b ; "Y"
bne @+ bne @+
mva #$80 escFlag mva #$80 escFlag
bne skip01 bne skip01
@@ -1864,8 +1877,7 @@ quit_seppuku
beq @+ ;unconditional jump, because TypeLine4x4 ends with beq beq @+ ;unconditional jump, because TypeLine4x4 ends with beq
GameOver4x4 GameOver4x4
lda #song_round_over RmtSong song_round_over
jsr RmtSongSelect
mwa #LineGameOver LineAddress4x4 mwa #LineGameOver LineAddress4x4
mwa #((ScreenWidth/2)-(8*4)) LineXdraw mwa #((ScreenWidth/2)-(8*4)) LineXdraw
mva ResultY LineYdraw mva ResultY LineYdraw
@@ -2008,6 +2020,7 @@ FinishResultDisplay
jsr ClearPMmemory jsr ClearPMmemory
jsr PrepareCredits jsr PrepareCredits
jsr GameOverResultsClear jsr GameOverResultsClear
jsr CopyFromPurchaseAndGameOver
mwa #GameOverDL dlptrs mwa #GameOverDL dlptrs
lda #%00111110 ; normal screen width, DL on, P/M on lda #%00111110 ; normal screen width, DL on, P/M on
sta dmactls sta dmactls
@@ -2113,8 +2126,7 @@ MakeAllTanksVisible
jsr SetStandardBarrels jsr SetStandardBarrels
; start music and animations ; start music and animations
lda #song_ending_looped RmtSong song_ending_looped
jsr RmtSongSelect
; initial tank positions randomization ; initial tank positions randomization
ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1
@ @
@@ -2258,13 +2270,13 @@ EndOfCredits
;displaying symbol of the weapon ;displaying symbol of the weapon
;--------------------- ;---------------------
;display name and symbol of the weapon ;display name and symbol of the weapon
;textbuffer+18 - symbol (1 char) ;statusBuffer+18 - symbol (1 char)
;textbuffer+20 - quantity left ;statusBuffer+20 - quantity left
;textbuffer+23 - name ;statusBuffer+23 - name
ldx TankNr ldx TankNr
ldy ActiveWeapon,x ldy ActiveWeapon,x
lda WeaponSymbols,y lda WeaponSymbols,y
sta TextBuffer+18 sta statusBuffer+18
;--------------------- ;---------------------
;displaying quantity of the given weapon ;displaying quantity of the given weapon
@@ -2272,7 +2284,7 @@ EndOfCredits
lda ActiveWeapon,x lda ActiveWeapon,x
jsr HowManyBullets jsr HowManyBullets
sta decimal sta decimal
mwa #textbuffer+20 displayposition mwa #statusBuffer+20 displayposition
jsr displaybyte jsr displaybyte
;--------------------- ;---------------------
@@ -2293,7 +2305,7 @@ EndOfCredits
ldy #15 ldy #15
@ @
lda (temp),y lda (temp),y
sta textbuffer+23,y sta statusBuffer+23,y
dey dey
bpl @- bpl @-
@@ -2301,15 +2313,15 @@ EndOfCredits
;displaying name of the defence weapon (if active) ;displaying name of the defence weapon (if active)
;--------------------- ;---------------------
lda #$08 ; ( lda #$08 ; (
sta textbuffer+80+22 sta statusBuffer+80+22
lda #$09 ; ) lda #$09 ; )
sta textbuffer+80+39 sta statusBuffer+80+39
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
bne ActiveDefence bne ActiveDefence
; clear brackets ; clear brackets
lda #space lda #space
sta textbuffer+80+22 sta statusBuffer+80+22
sta textbuffer+80+39 sta statusBuffer+80+39
mwa #emptyLine temp mwa #emptyLine temp
jmp ClearingOnly jmp ClearingOnly
ActiveDefence ActiveDefence
@@ -2327,7 +2339,7 @@ ClearingOnly
ldy #15 ldy #15
@ @
lda (temp),y lda (temp),y
sta textbuffer+40+40+23,y sta statusBuffer+40+40+23,y
dey dey
bpl @- bpl @-
@@ -2338,7 +2350,7 @@ ClearingOnly
lda Energy,x lda Energy,x
sta decimal sta decimal
mwa #textbuffer+48 displayposition mwa #statusBuffer+48 displayposition
jsr displaybyte jsr displaybyte
;--------------------- ;---------------------
@@ -2346,10 +2358,10 @@ ClearingOnly
;--------------------- ;---------------------
; clear (if no shield) ; clear (if no shield)
lda #space lda #space
sta textbuffer+40+10 sta statusBuffer+40+10
sta textbuffer+40+11 sta statusBuffer+40+11
sta textbuffer+40+12 sta statusBuffer+40+12
sta textbuffer+40+13 sta statusBuffer+40+13
; check shield energy and display it ; check shield energy and display it
ldx TankNr ldx TankNr
lda ActiveDefenceWeapon,x lda ActiveDefenceWeapon,x
@@ -2358,11 +2370,11 @@ ClearingOnly
beq NoShieldEnergy beq NoShieldEnergy
sta decimal ; displayed value sta decimal ; displayed value
lda #$08 ; ( lda #$08 ; (
sta textbuffer+40+10 sta statusBuffer+40+10
mwa #textbuffer+40+11 displayposition mwa #statusBuffer+40+11 displayposition
jsr displaybyte jsr displaybyte
lda #$09 ; ) lda #$09 ; )
sta textbuffer+40+13 sta statusBuffer+40+13
NoDefenceWeapon NoDefenceWeapon
NoShieldEnergy NoShieldEnergy
@@ -2373,9 +2385,9 @@ NoShieldEnergy
lda Wind+3 ; highest byte of 4 byte wind lda Wind+3 ; highest byte of 4 byte wind
bmi DisplayLeftWind bmi DisplayLeftWind
lda #$7f ; (tab) char lda #$7f ; (tab) char
sta textbuffer+80+20 sta statusBuffer+80+20
lda #space lda #space
sta textbuffer+80+17 sta statusBuffer+80+17
beq DisplayWindValue beq DisplayWindValue
DisplayLeftWind DisplayLeftWind
sec ; Wind = -Wind sec ; Wind = -Wind
@@ -2386,14 +2398,14 @@ DisplayLeftWind
sbc temp+1 sbc temp+1
sta temp+1 sta temp+1
lda #$7e ;(del) char lda #$7e ;(del) char
sta textbuffer+80+17 sta statusBuffer+80+17
lda #space lda #space
sta textbuffer+80+20 sta statusBuffer+80+20
DisplayWindValue DisplayWindValue
:4 lsrw temp ;divide by 16 to have a nice value on a screen :4 lsrw temp ;divide by 16 to have a nice value on a screen
lda temp lda temp
sta decimal sta decimal
mwa #textbuffer+80+18 displayposition mwa #statusBuffer+80+18 displayposition
jsr displaybyte jsr displaybyte
;========================= ;=========================
@@ -2401,7 +2413,7 @@ DisplayWindValue
;========================= ;=========================
lda CurrentRoundNr lda CurrentRoundNr
sta decimal sta decimal
mwa #textbuffer+80+7 displayposition mwa #statusBuffer+80+7 displayposition
jsr displaybyte ;decimal (byte), displayposition (word) jsr displaybyte ;decimal (byte), displayposition (word)
;========================= ;=========================
@@ -2412,7 +2424,7 @@ DisplayWindValue
sta decimal sta decimal
lda ForceTableH,x lda ForceTableH,x
sta decimal+1 sta decimal+1
mwa #textbuffer+40+35 displayposition mwa #statusBuffer+40+35 displayposition
jsr displaydec5 jsr displaydec5
;========================= ;=========================
@@ -2428,9 +2440,9 @@ AngleToRight
; now we have values from 0 to 89 and right angle ; now we have values from 0 to 89 and right angle
sta decimal sta decimal
lda #$7f ; (tab) character lda #$7f ; (tab) character
sta textbuffer+40+25 sta statusBuffer+40+25
lda #space lda #space
sta textbuffer+40+22 sta statusBuffer+40+22
beq AngleDisplay beq AngleDisplay
AngleToLeft AngleToLeft
sec sec
@@ -2439,19 +2451,19 @@ AngleToLeft
; angles 180 - 91 converted to 0 - 89 ; angles 180 - 91 converted to 0 - 89
sta decimal sta decimal
lda #$7e ;(del) char lda #$7e ;(del) char
sta textbuffer+40+22 sta statusBuffer+40+22
lda #space lda #space
sta textbuffer+40+25 sta statusBuffer+40+25
beq AngleDisplay beq AngleDisplay
VerticallyUp VerticallyUp
; now we have value 90 ; now we have value 90
sta decimal sta decimal
lda #space lda #space
sta textbuffer+40+25 sta statusBuffer+40+25
sta textbuffer+40+22 sta statusBuffer+40+22
AngleDisplay AngleDisplay
mwa #textbuffer+40+23 displayposition mwa #statusBuffer+40+23 displayposition
jsr displaybyte jsr displaybyte
ldx TankNr ldx TankNr
rts rts
@@ -2467,7 +2479,7 @@ AngleDisplay
tax tax
NextChar02 NextChar02
lda tanksnames,x lda tanksnames,x
sta textbuffer+7,y sta statusBuffer+7,y
inx inx
iny iny
cpy #$08 cpy #$08
@@ -2496,7 +2508,7 @@ NextChar02
; set background ; set background
lda #$ff lda #$ff
ldx #100 ; top of the sprites ldx #100+7 ; top of the sprites
@ sta PMGraph+$400,x @ sta PMGraph+$400,x
sta PMGraph+$500,x sta PMGraph+$500,x
inx inx
@@ -2511,6 +2523,5 @@ NextChar02
rts rts
.endp .endp
;-------------------------------------------------
.endif .endif
+103 -51
View File
@@ -14,35 +14,43 @@ OneTimeZeroVariablesCount = variablesToInitialize-OneTimeZeroVariables ; MAX 12
.error "OneTimeZeroVariablesCount too large, ",OneTimeZeroVariablesCount .error "OneTimeZeroVariablesCount too large, ",OneTimeZeroVariablesCount
.endif .endif
noMusic .by 0 ; 0 - play music, $ff - do not play music noMusic .ds 1 ;.by 0 ; 0 - play music, $ff - do not play music
noSfx .by 0 ; 0 - play SFX, $ff - do not play SFX noSfx .ds 1 ;.by 0 ; 0 - play SFX, $ff - do not play SFX
;---------------------------------------------------- ;----------------------------------------------------
; Color table for Game Over Screen (created in a gameover routine) ; Color table for Game Over Screen (created in a gameover routine)
.by $00 ; labels line color .ds 1 ;.by $00 ; labels line color
GameOverColoursTable .BYTE $80,$40,$c4,$20,$c0,$e4 GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4
;---------------------------------------------------- ;----------------------------------------------------
TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24 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) skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30)
.DS [MaxPlayers] .DS MaxPlayers
;---------------------------------------------------- ;----------------------------------------------------
variablesToInitialize variablesToInitialize
;Options DO NOT ZERO ON RESTART GAME - ticket #27 ;Options DO NOT ZERO ON RESTART GAME - ticket #27
OptionsTable .by 0,1,2,2,0,1,3,2,0 OptionsTable .ds maxOptions ;.by 0,1,2,2,0,1,3,2,0
RoundsInTheGame .by 10 ;how many rounds in the current game RoundsInTheGame .ds 1 ;.by 10 ;how many rounds in the current game
seppukuVal .by 75 seppukuVal .ds 1 ;.by 75
mountainDeltaH .by 3 mountainDeltaH .ds 1 ;.by 3
mountainDeltaL .by $ff mountainDeltaL .ds 1 ;.by $ff
;---------------------------------------------------- ;----------------------------------------------------
LineHeader1 LineHeader1
dta d"# ROUND: " .ds 9 ;dta d"# ROUND: "
RoundNrDisplay RoundNrDisplay
dta d" #", $ff .ds 7 ;dta d" #", $ff
; 4x4 text buffer ; 4x4 text buffer
ResultLineBuffer 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 variablesStart ; zeroing starts here
;===================================================== ;=====================================================
@@ -56,69 +64,69 @@ OptionsY .ds 1 ;vertical position of cursor on Options screen
flyDelay .ds 1 flyDelay .ds 1
;-------------- ;--------------
;NumberOfPlayers .DS 1 ;current number of players (counted from 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 GameIsOver .DS 1 ; 1 means it was the last round in the game
;---------------------------------------------------- ;----------------------------------------------------
moneyH ;we place zero at the end of prices and money moneyH ;we place zero at the end of prices and money
;and have range from 0 to 99990 (not too much) ;and have range from 0 to 99990 (not too much)
;money players have (maybe one more byte is needed?) ;money players have (maybe one more byte is needed?)
.DS [MaxPlayers] .DS MaxPlayers
moneyL moneyL
.DS [MaxPlayers] .DS MaxPlayers
;---------------------------------------------------- ;----------------------------------------------------
gainH ;how much money player gets after the round gainH ;how much money player gets after the round
;it is gathered during the round basing on energy ;it is gathered during the round basing on energy
;opponents lose after player's shoots ;opponents lose after player's shoots
.DS [MaxPlayers] .DS MaxPlayers
gainL gainL
.DS [MaxPlayers] .DS MaxPlayers
;---------------------------------------------------- ;----------------------------------------------------
loseH ;how much player looses after the round loseH ;how much player looses after the round
;calculated from REAL energy loss ;calculated from REAL energy loss
;(not only to zero energy) ;(not only to zero energy)
.DS [MaxPlayers] .DS MaxPlayers
loseL loseL
.DS [MaxPlayers] .DS MaxPlayers
;---------------------------------------------------- ;----------------------------------------------------
Energy Energy
.DS [MaxPlayers] .DS MaxPlayers
ShieldEnergy ShieldEnergy
.DS [MaxPlayers] .DS MaxPlayers
EnergyDecrease .DS 1 EnergyDecrease .DS 1
eXistenZ eXistenZ
.DS [MaxPlayers] .DS MaxPlayers
LASTeXistenZ ; eXistenZ before shoot LASTeXistenZ ; eXistenZ before shoot
.DS [MaxPlayers] .DS MaxPlayers
ResultsTable ;the results in the gameeeeee ResultsTable ;the results in the gameeeeee
.DS [MaxPlayers] .DS MaxPlayers
TempResults TempResults
.DS [MaxPlayers] .DS MaxPlayers
DirectHitsH DirectHitsH
.DS [MaxPlayers] .DS MaxPlayers
DirectHitsL DirectHitsL
.DS [MaxPlayers] .DS MaxPlayers
EarnedMoneyH EarnedMoneyH
.DS [MaxPlayers] .DS MaxPlayers
EarnedMoneyL EarnedMoneyL
.DS [MaxPlayers] .DS MaxPlayers
;---------------------------------------------------- ;----------------------------------------------------
ForceTableL ;shooting Force of the tank during the round ForceTableL ;shooting Force of the tank during the round
.DS [MaxPlayers] .DS MaxPlayers
ForceTableH ForceTableH
.DS [MaxPlayers] ;maxplayers=6 .DS MaxPlayers ;maxplayers=6
MaxForceTableL ;Energy of the tank during the round MaxForceTableL ;Energy of the tank during the round
;(limes superior force of the Shoot) ;(limes superior force of the Shoot)
.DS [MaxPlayers] ;1000 is the default .DS MaxPlayers ;1000 is the default
MaxForceTableH MaxForceTableH
.DS [MaxPlayers] .DS MaxPlayers
;---------------------------------------------------- ;----------------------------------------------------
BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round start! 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 ActiveWeapon ;number of the selected weapon
.DS [MaxPlayers] .DS MaxPlayers
ActiveDefenceWeapon ;number of the activated defence weapon - 0 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 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 WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy
;---------------------------------------------------- ;----------------------------------------------------
xtankstableL ;X positions of tanks (lower left point) xtankstableL ;X positions of tanks (lower left point)
.DS [MaxPlayers] .DS MaxPlayers
xtankstableH xtankstableH
.DS [MaxPlayers] .DS MaxPlayers
ytankstable ;Y positions of tanks (lower left point) 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) LowResDistances ; coarse tank positions divided by 4 (to be in just one byte)
.DS [MaxPlayers] .DS MaxPlayers
;---------------------------------------------------- ;----------------------------------------------------
TargetTankNr ; Target tank index (for AI routines) TargetTankNr ; Target tank index (for AI routines)
.DS 1 .DS 1
@@ -367,24 +375,24 @@ CurrentResult
.DS 1 .DS 1
;-------------- ;--------------
AngleTable ;Angle of the barrel of each tank during the round AngleTable ;Angle of the barrel of each tank during the round
.DS [MaxPlayers] .DS MaxPlayers
;NewAngle ; used in AI ;NewAngle ; used in AI
.DS 1 .DS 1
;previousBarrelAngle ;previousBarrelAngle
; .DS [MaxPlayers] ; .DS MaxPlayers
EndOfTheBarrelX EndOfTheBarrelX
.ds 2 .ds 2
EndOfTheBarrelY EndOfTheBarrelY
.ds 1 .ds 1
;---------------------------------------------------- ;----------------------------------------------------
previousAngle previousAngle
.DS [MaxPlayers] .DS MaxPlayers
previousEnergyL previousEnergyL
.DS [MaxPlayers] .DS MaxPlayers
previousLeftRange previousLeftRange
.DS [MaxPlayers] .DS MaxPlayers
previousEnergyH previousEnergyH
.DS [MaxPlayers] .DS MaxPlayers
RandBoundaryLow RandBoundaryLow
.ds 2 .ds 2
RandBoundaryHigh RandBoundaryHigh
@@ -417,8 +425,52 @@ Xcounter4x4 .DS 1
nibbler4x4 .DS 1 nibbler4x4 .DS 1
CharCode4x4 .DS 1 CharCode4x4 .DS 1
;plot4x4color .DS 1 ;1-white, 0-background ;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 variablesEnd
;---------------------------------------------------- ;----------------------------------------------------
+23 -54
View File
@@ -17,7 +17,6 @@
pha pha
lda ExplosionRoutines,x lda ExplosionRoutines,x
pha pha
; inc FallDown2
rts rts
ExplosionRoutines ExplosionRoutines
.word babymissile-1 ;Baby_Missile___;_00 .word babymissile-1 ;Baby_Missile___;_00
@@ -62,35 +61,30 @@ tracer
; ------------------------ ; ------------------------
.proc babymissile .proc babymissile
mva #sfx_baby_missile sfx_effect mva #sfx_baby_missile sfx_effect
; inc FallDown2
mva #11 ExplosionRadius mva #11 ExplosionRadius
jmp xmissile jmp xmissile
.endp .endp
; ------------------------ ; ------------------------
.proc missile ; .proc missile ;
mva #sfx_baby_missile sfx_effect mva #sfx_baby_missile sfx_effect
; inc FallDown2
mva #17 ExplosionRadius mva #17 ExplosionRadius
jmp xmissile jmp xmissile
.endp .endp
; ------------------------ ; ------------------------
.proc babynuke .proc babynuke
mva #sfx_nuke sfx_effect mva #sfx_nuke sfx_effect
; inc FallDown2
mva #25 ExplosionRadius mva #25 ExplosionRadius
jmp xmissile jmp xmissile
.endp .endp
; ------------------------ ; ------------------------
.proc nuke .proc nuke
mva #sfx_nuke sfx_effect mva #sfx_nuke sfx_effect
; inc FallDown2
mva #30 ExplosionRadius mva #30 ExplosionRadius
jmp xmissile jmp xmissile
.endp .endp
; ------------------------ ; ------------------------
.proc leapfrog .proc leapfrog
mva #sfx_baby_missile sfx_effect mva #sfx_baby_missile sfx_effect
; inc FallDown2
mva #17 ExplosionRadius mva #17 ExplosionRadius
jsr xmissile jsr xmissile
@@ -143,7 +137,6 @@ EndOfLeapping
.endp .endp
; ------------------------ ; ------------------------
.proc mirv ; the whole mirv is performed by Flight routine .proc mirv ; the whole mirv is performed by Flight routine
; inc FallDown2
rts rts
.endp .endp
; ------------------------ ; ------------------------
@@ -151,7 +144,6 @@ EndOfLeapping
mva #sfx_baby_missile sfx_effect mva #sfx_baby_missile sfx_effect
mwa xtraj+1 xtrajfb 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) 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 ;central Explosion
mva #21 ExplosionRadius mva #21 ExplosionRadius
jsr CalculateExplosionRange0 jsr CalculateExplosionRange0
@@ -198,7 +190,6 @@ NoWallsInFunky
.endp .endp
; ------------------------ ; ------------------------
.proc deathshead .proc deathshead
; inc FallDown2
mva #30 ExplosionRadius mva #30 ExplosionRadius
mva #sfx_nuke sfx_effect mva #sfx_nuke sfx_effect
SaveDrawXY SaveDrawXY
@@ -250,7 +241,6 @@ NoLowerCircle
; ------------------------ ; ------------------------
.proc napalm .proc napalm
mva #sfx_napalm sfx_effect mva #sfx_napalm sfx_effect
; inc FallDown2
mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width)
jsr CalculateExplosionRange jsr CalculateExplosionRange
mva #0 ExplosionRadius ; in this weapon - flag: 0 - napalm, 1 - hotnapalm mva #0 ExplosionRadius ; in this weapon - flag: 0 - napalm, 1 - hotnapalm
@@ -259,7 +249,6 @@ NoLowerCircle
; ------------------------ ; ------------------------
.proc hotnapalm .proc hotnapalm
mva #sfx_napalm sfx_effect mva #sfx_napalm sfx_effect
; inc FallDown2
mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width)
jsr CalculateExplosionRange jsr CalculateExplosionRange
mva #1 ExplosionRadius ; in this weapon - flag: 0 - napalm, 1 - hotnapalm mva #1 ExplosionRadius ; in this weapon - flag: 0 - napalm, 1 - hotnapalm
@@ -324,7 +313,6 @@ CharOffTheScreen
dec magic dec magic
jpl RepeatNapalm jpl RepeatNapalm
; after napalm ; after napalm
; inc FallDown2
;now we must check tanks in range ;now we must check tanks in range
ldx NumberOfPlayers ldx NumberOfPlayers
dex dex
@@ -372,32 +360,27 @@ EndNurnedCheckLoop
.endp .endp
; ------------------------ ; ------------------------
.proc babyroller .proc babyroller
; inc FallDown2
mva #11 ExplosionRadius mva #11 ExplosionRadius
jmp xroller jmp xroller
.endp .endp
; ------------------------ ; ------------------------
.proc roller ; .proc roller ;
; inc FallDown2
mva #21 ExplosionRadius mva #21 ExplosionRadius
jmp xroller jmp xroller
.endp .endp
; ------------------------ ; ------------------------
.proc heavyroller .proc heavyroller
; inc FallDown2
mva #30 ExplosionRadius mva #30 ExplosionRadius
jmp xroller jmp xroller
.endp .endp
; ------------------------ ; ------------------------
.proc riotbomb .proc riotbomb
; inc FallDown2
mva #17 ExplosionRadius mva #17 ExplosionRadius
jsr CalculateExplosionRange jsr CalculateExplosionRange
jmp xriotbomb jmp xriotbomb
.endp .endp
; ------------------------ ; ------------------------
.proc heavyriotbomb .proc heavyriotbomb
; inc FallDown2
mva #29 ExplosionRadius mva #29 ExplosionRadius
jsr CalculateExplosionRange jsr CalculateExplosionRange
jmp xriotbomb jmp xriotbomb
@@ -406,7 +389,6 @@ EndNurnedCheckLoop
.proc babydigger .proc babydigger
mva #sfx_digger sfx_effect mva #sfx_digger sfx_effect
mva #0 sandhogflag mva #0 sandhogflag
; inc FallDown2
mva #13 DigLong mva #13 DigLong
mva #1 diggery ; how many branches (-1) mva #1 diggery ; how many branches (-1)
jmp xdigger jmp xdigger
@@ -415,7 +397,6 @@ EndNurnedCheckLoop
.proc digger ; .proc digger ;
mva #sfx_digger sfx_effect mva #sfx_digger sfx_effect
mva #0 sandhogflag mva #0 sandhogflag
; inc FallDown2
mva #13 DigLong mva #13 DigLong
mva #3 diggery ; how many branches (-1) mva #3 diggery ; how many branches (-1)
jmp xdigger jmp xdigger
@@ -424,7 +405,6 @@ EndNurnedCheckLoop
.proc heavydigger .proc heavydigger
mva #sfx_digger sfx_effect mva #sfx_digger sfx_effect
mva #0 sandhogflag mva #0 sandhogflag
; inc FallDown2
mva #13 DigLong mva #13 DigLong
mva #7 diggery ; how many branches (-1) mva #7 diggery ; how many branches (-1)
jmp xdigger jmp xdigger
@@ -548,7 +528,6 @@ DiggerCharacter
.proc babysandhog .proc babysandhog
mva #sfx_sandhog sfx_effect mva #sfx_sandhog sfx_effect
mva #char_sandhog_offset sandhogflag mva #char_sandhog_offset sandhogflag
; inc FallDown2
mva #13 DigLong mva #13 DigLong
mva #1 diggery ; how many branches (-1) mva #1 diggery ; how many branches (-1)
jmp xdigger jmp xdigger
@@ -557,7 +536,6 @@ DiggerCharacter
.proc sandhog .proc sandhog
mva #sfx_sandhog sfx_effect mva #sfx_sandhog sfx_effect
mva #char_sandhog_offset sandhogflag mva #char_sandhog_offset sandhogflag
; inc FallDown2
mva #13 DigLong mva #13 DigLong
mva #3 diggery ; how many branches (-1) mva #3 diggery ; how many branches (-1)
jmp xdigger jmp xdigger
@@ -566,35 +544,30 @@ DiggerCharacter
.proc heavysandhog .proc heavysandhog
mva #sfx_sandhog sfx_effect mva #sfx_sandhog sfx_effect
mva #char_sandhog_offset sandhogflag mva #char_sandhog_offset sandhogflag
; inc FallDown2
mva #13 DigLong mva #13 DigLong
mva #5 diggery ; how many branches (-1) mva #5 diggery ; how many branches (-1)
jmp xdigger jmp xdigger
.endp .endp
; ------------------------ ; ------------------------
.proc dirtclod .proc dirtclod
; inc FallDown2
mva #12 ExplosionRadius mva #12 ExplosionRadius
jsr CalculateExplosionRange jsr CalculateExplosionRange
jmp xdirt jmp xdirt
.endp .endp
; ------------------------ ; ------------------------
.proc dirtball .proc dirtball
; inc FallDown2
mva #22 ExplosionRadius mva #22 ExplosionRadius
jsr CalculateExplosionRange jsr CalculateExplosionRange
jmp xdirt jmp xdirt
.endp .endp
; ------------------------ ; ------------------------
.proc tonofdirt .proc tonofdirt
; inc FallDown2
mva #31 ExplosionRadius mva #31 ExplosionRadius
jsr CalculateExplosionRange jsr CalculateExplosionRange
jmp xdirt jmp xdirt
.endp .endp
; ------------------------ ; ------------------------
.proc dirtcharge .proc dirtcharge
; inc FallDown2
mva #61 ExplosionRadius mva #61 ExplosionRadius
jsr CalculateExplosionRange jsr CalculateExplosionRange
jmp ofdirt jmp ofdirt
@@ -602,7 +575,6 @@ DiggerCharacter
; ------------------------ ; ------------------------
.proc riotcharge .proc riotcharge
mva #sfx_riot_blast sfx_effect mva #sfx_riot_blast sfx_effect
; inc FallDown2
mva #31 ExplosionRadius mva #31 ExplosionRadius
jsr CalculateExplosionRange jsr CalculateExplosionRange
jmp cleanDirt jmp cleanDirt
@@ -610,7 +582,6 @@ DiggerCharacter
; ------------------------ ; ------------------------
.proc riotblast .proc riotblast
mva #sfx_riot_blast sfx_effect mva #sfx_riot_blast sfx_effect
; inc FallDown2
mva #61 ExplosionRadius mva #61 ExplosionRadius
jsr CalculateExplosionRange jsr CalculateExplosionRange
jmp cleanDirt jmp cleanDirt
@@ -1155,7 +1126,7 @@ notpressed
lda kbcode lda kbcode
and #%10111111 ; SHIFT elimination and #%10111111 ; SHIFT elimination
cmp #$08 ; O cmp #@kbcode._O ; $08 ; O
bne @+ bne @+
jsr AreYouSure jsr AreYouSure
bit escFlag bit escFlag
@@ -1165,7 +1136,7 @@ QuitToGameover
mva #$40 escFlag mva #$40 escFlag
rts rts
@ @
cmp #28 ; ESC cmp #@kbcode._esc ; 28 ; ESC
bne @+ bne @+
jsr AreYouSure jsr AreYouSure
bit escFlag bit escFlag
@@ -1173,7 +1144,7 @@ QuitToGameover
;---esc pressed-quit game--- ;---esc pressed-quit game---
rts rts
@ @
cmp #$3f ; A cmp #@kbcode._A ; $3f ; A
bne @+ bne @+
callActivation callActivation
; Hide all tanks - after inventory they may have other shapes ; Hide all tanks - after inventory they may have other shapes
@@ -1182,7 +1153,7 @@ callActivation
jmp afterInventory jmp afterInventory
@ @
cmp #$0d ; I cmp #@kbcode._I ; $0d ; I
bne @+ bne @+
callInventory callInventory
; Hide all tanks - after inventory they may have other shapes ; Hide all tanks - after inventory they may have other shapes
@@ -1192,8 +1163,7 @@ callInventory
jsr Purchase jsr Purchase
afterInventory afterInventory
jsr MakeDarkScreen jsr MakeDarkScreen
lda #song_ingame RmtSong song_ingame
jsr RmtSongSelect
mva #0 escFlag mva #0 escFlag
jsr DisplayStatus jsr DisplayStatus
jsr SetMainScreen jsr SetMainScreen
@@ -1202,30 +1172,30 @@ afterInventory
jsr WaitForKeyRelease jsr WaitForKeyRelease
jmp BeforeFire jmp BeforeFire
@ @
cmp #$8e cmp #$80|@kbcode._up
jeq CTRLPressedUp jeq CTRLPressedUp
cmp #$8f cmp #$80|@kbcode._down
jeq CTRLPressedDown jeq CTRLPressedDown
cmp #$ac cmp #$80|@kbcode._tab
jeq CTRLPressedTAB jeq CTRLPressedTAB
and #$3f ;CTRL and SHIFT ellimination and #$3f ;CTRL and SHIFT ellimination
jumpFromStick jumpFromStick
cmp #$e cmp #@kbcode._up ; $e
jeq pressedUp jeq pressedUp
cmp #$f cmp #@kbcode._down ; $f
jeq pressedDown jeq pressedDown
cmp #$6 cmp #@kbcode._left ; $6
jeq pressedLeft jeq pressedLeft
cmp #$7 cmp #@kbcode._right ; $7
jeq pressedRight jeq pressedRight
cmp #$21 cmp #@kbcode._space ; $21
jeq pressedSpace jeq pressedSpace
cmp #$2c cmp #@kbcode._tab ; $2c
jeq pressedTAB jeq pressedTAB
cmp #$25 ; M cmp #@kbcode._M ; $25 ; M
jeq pressedM jeq pressedM
cmp #$3e ; S cmp #@kbcode._S ; $3e ; S
jeq pressedS jeq pressedS
jmp notpressed jmp notpressed
checkJoy checkJoy
@@ -1430,8 +1400,7 @@ pressedM
; have you tried turning the music off and on again? ; have you tried turning the music off and on again?
lda #$ff lda #$ff
eor:sta noMusic eor:sta noMusic
lda #song_ingame RmtSong song_ingame
jsr RmtSongSelect
jsr WaitForKeyRelease jsr WaitForKeyRelease
jmp BeforeFire jmp BeforeFire
@@ -1547,7 +1516,7 @@ ShotUnderGround
;xtraj=xtraj+vx - without Wind ;xtraj=xtraj+vx - without Wind
;vx=vx+Wind (Wind is a small fraction) ;vx=vx+Wind (Wind is a small fraction)
;plot xtraj,ytraj - there is clearing in plot ;plot xtraj,ytraj - there is clearing in plot
;goto begin ;goto begin-
@@ -1895,7 +1864,7 @@ MagDeflector
bit random ; left or right deflection ? bit random ; left or right deflection ?
bpl RightDeflection bpl RightDeflection
LeftDeflection 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 ... bit XHit+1 ; if off-screen ...
bpl EndOfMagDeflector ; hit of course but we need RTS bpl EndOfMagDeflector ; hit of course but we need RTS
adw XHit #36 ; change to right :) adw XHit #36 ; change to right :)
@@ -2579,7 +2548,7 @@ notpressed
lda kbcode lda kbcode
and #%00111111 ; CTRL and SHIFT elimination and #%00111111 ; CTRL and SHIFT elimination
cmp #28 ; ESC cmp #@kbcode._esc ; 28 ; ESC
bne @+ bne @+
jsr AreYouSure jsr AreYouSure
bit escFlag bit escFlag
@@ -2588,11 +2557,11 @@ notpressed
rts rts
@ @
jumpFromStick jumpFromStick
cmp #$6 cmp #@kbcode._left ; $6
jeq pressedLeft jeq pressedLeft
cmp #$7 cmp #@kbcode._right ; $7
jeq pressedRight jeq pressedRight
cmp #$21 cmp #@kbcode._space ; $21
jeq pressedSpace jeq pressedSpace
jmp notpressed jmp notpressed
checkJoy checkJoy