Compare commits
119 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2bc8a6d0d4 | |||
| fc1ab3bc7a | |||
| 82c39faddf | |||
| 0c730c9ea4 | |||
| e9cde15ee1 | |||
| cc99866a12 | |||
| 060649cbed | |||
| 4fa861af3d | |||
| 401d94eec9 | |||
| 0becca7a87 | |||
| ff465e11f0 | |||
| d0e1dc6f18 | |||
| 8486645bc8 | |||
| 86631ce2b0 | |||
| 6447155be5 | |||
| db3743965a | |||
| eb15ce0d78 | |||
| f6a7217114 | |||
| 7c482d798c | |||
| 13a5bd05df | |||
| 12c20c7637 | |||
| 145af2c4e7 | |||
| 824d635e88 | |||
| d54d630b4d | |||
| 2577b71e01 | |||
| fc3fe9ef19 | |||
| d17d49c5f0 | |||
| ce6f7b3406 | |||
| c8f3d52eab | |||
| 31646c65d3 | |||
| 0c0489f5ed | |||
| 3847729391 | |||
| 610a86d9c9 | |||
| f2f03533c5 | |||
| 41f8545af3 | |||
| 81ad461f5e | |||
| 7f0643c47e | |||
| f0077adcdf | |||
| 879423eeee | |||
| af101d46e9 | |||
| 1bfcd57d26 | |||
| 663321be99 | |||
| cc806b6cc0 | |||
| 3f4fe9839b | |||
| d36d5d3131 | |||
| 62d838d7ed | |||
| 1705c48d79 | |||
| 862ae9f640 | |||
| 6cf4a6d989 | |||
| 0385423fb0 | |||
| 5693fffd8a | |||
| f79da6ac0f | |||
| 1ce1e978bb | |||
| 11d9e99b5c | |||
| 825ef76362 | |||
| c32d7b0ce4 | |||
| 56a756f0ba | |||
| b438982e3d | |||
| b13b53602b | |||
| 9b34ac0e43 | |||
| be37772b29 | |||
| 569cbddfe2 | |||
| 367e87093e | |||
| cf00674136 | |||
| 74df612e67 | |||
| b83e4f7169 | |||
| fdccc9ddda | |||
| 17c4339a80 | |||
| 37cb34bc90 | |||
| 5e2c586c55 | |||
| 9cfef8098d | |||
| fd7448822b | |||
| b604851904 | |||
| c86aa65047 | |||
| 96372de688 | |||
| 1b6fdb6bb5 | |||
| e215148faf | |||
| 0e20f0e68d | |||
| cb1f9514e5 | |||
| 98018a16dd | |||
| 3174876183 | |||
| 253faff3cd | |||
| 16d629d94d | |||
| e8830401d0 | |||
| b759091882 | |||
| da99406bbd | |||
| 7088e02527 | |||
| 697a6ef9fe | |||
| 6685ef1203 | |||
| 28e34f3c02 | |||
| 14b35275f7 | |||
| 18107445e4 | |||
| 3a0600bd4d | |||
| df9db33c4b | |||
| 0b5029ddb9 | |||
| c9e8adb352 | |||
| 9aabd92d01 | |||
| 132cef82ee | |||
| 719b712451 | |||
| bc31fa0ea1 | |||
| 1e5530579f | |||
| a5f02cf33b | |||
| 5657171bb2 | |||
| 66d620fe4b | |||
| 19b71664f1 | |||
| f2de25a769 | |||
| 16fc84aa6f | |||
| fa79836f77 | |||
| f475999918 | |||
| 2005f7bf98 | |||
| ab965c00b4 | |||
| 83969e747b | |||
| e1a930ca44 | |||
| d12102ad60 | |||
| 2de654db32 | |||
| 0703a9db93 | |||
| af305f154c | |||
| 4cf4eb14c7 | |||
| 1337c83791 |
@@ -1,7 +1,5 @@
|
||||
.project
|
||||
*.bak
|
||||
scorch.lab
|
||||
scorch.lst
|
||||
textproc.lab
|
||||
textproc.lst
|
||||
*.lab
|
||||
*.lst
|
||||
artwork/talk.as_
|
||||
|
||||
@@ -12,8 +12,14 @@ OptionsScreen
|
||||
dta d" (un)2000-2023"
|
||||
|
||||
.IF TARGET = 800
|
||||
dta d" Please select option with cursor keys "
|
||||
dta d" and press (Return) to proceed "
|
||||
dta d" Please select option with "
|
||||
dta $fe,$dc,$dd,$ff ; cursors in inverse
|
||||
dta d" and "
|
||||
dta d"Tab"*
|
||||
dta d" "
|
||||
dta d" Press "
|
||||
dta d"Return"*
|
||||
dta d" to proceed "
|
||||
.ELIF TARGET = 5200
|
||||
dta d" Please select option with joystick one "
|
||||
dta d" and press FIRE to proceed "
|
||||
@@ -32,20 +38,21 @@ NameScreen3
|
||||
dta d" Human/Atari (difficulty level) "
|
||||
NameScreen5
|
||||
.IF TARGET = 800
|
||||
dta d" "
|
||||
dta d"TAB"*
|
||||
dta d" - Port nr "
|
||||
dta d"Joy"*
|
||||
dta d" - Difficulty "
|
||||
dta $fe,$dc,$dd,$ff ; cursors in inverse
|
||||
dta d" - Difficulty"
|
||||
dta d" "
|
||||
dta d"INV"*
|
||||
dta d" - Shape "
|
||||
dta d"Return"*
|
||||
dta d" - Proceed "
|
||||
.ELIF TARGET = 5200
|
||||
dta d" "
|
||||
dta d"(5)"*
|
||||
dta d" - Port nr "
|
||||
dta d" - Port/Shape "
|
||||
dta d"Joy"*
|
||||
dta d" - Difficulty "
|
||||
dta d" - Diffic. "
|
||||
dta d" "
|
||||
dta d"FIRE"*
|
||||
dta d" - Proceed "
|
||||
@@ -106,11 +113,6 @@ OptionsTitle
|
||||
dta d" scorch "*
|
||||
.ELIF TARGET = 5200
|
||||
dta d" scorch supersystem "*
|
||||
; dta d" scorch "*
|
||||
; dta d"5"
|
||||
; dta d"k"*
|
||||
; dta d"2"
|
||||
; dta d" "*
|
||||
.ENDIF
|
||||
DifficultyTitle
|
||||
dta d" difficulty "*
|
||||
@@ -0,0 +1,679 @@
|
||||
.IF *>0 ;this is a trick that prevents compiling this file alone
|
||||
|
||||
; Basic hardware-dependent graphics routines.
|
||||
|
||||
; -----------------------------------------
|
||||
.proc unPlot
|
||||
; plots a point and saves the plotted byte, reverts the previous plot.
|
||||
; -----------------------------------------
|
||||
ldx #0 ; only one pixel
|
||||
unPlotAfterX
|
||||
stx WhichUnPlot
|
||||
|
||||
; first remake the oldie
|
||||
lda oldplotL,x
|
||||
sta oldplot
|
||||
lda oldplotH,x
|
||||
sta oldplot+1
|
||||
|
||||
lda oldply,x
|
||||
tay
|
||||
lda oldora,x
|
||||
sta (oldplot),y
|
||||
|
||||
|
||||
; is it not out of the screen ????
|
||||
cpw ydraw #screenheight
|
||||
jcc CheckX
|
||||
mwa #0 ydraw
|
||||
CheckX
|
||||
cpw xdraw #screenwidth
|
||||
jcs EndOfUnPlot
|
||||
MakeUnPlot
|
||||
; let's count coordinates taken from xdraw and ydraw
|
||||
;xbyte = xbyte/8
|
||||
lda xdraw+1
|
||||
lsr
|
||||
lda xdraw
|
||||
ror ;just one bit over 256. Max screenwidth = 512!!!
|
||||
lsr
|
||||
lsr
|
||||
;---
|
||||
tay
|
||||
ldx WhichUnPlot
|
||||
tya
|
||||
sta oldply,x
|
||||
|
||||
ldx ydraw
|
||||
lda linetableL,x
|
||||
sta xbyte
|
||||
sta oldplot
|
||||
lda linetableH,x
|
||||
sta xbyte+1
|
||||
sta oldplot+1
|
||||
|
||||
lda xdraw
|
||||
and #$7
|
||||
tax
|
||||
|
||||
lda color
|
||||
bne ClearUnPlot
|
||||
|
||||
;plotting here
|
||||
lda (xbyte),y
|
||||
sta OldOraTemp
|
||||
ora bittable,x
|
||||
sta (xbyte),y
|
||||
bne ContinueUnPlot ; allways <>0
|
||||
ClearUnPlot
|
||||
lda (xbyte),y
|
||||
sta OldOraTemp
|
||||
and bittable2,x
|
||||
sta (xbyte),y
|
||||
ContinueUnPlot
|
||||
ldx WhichUnPlot
|
||||
lda OldOraTemp
|
||||
sta oldora,x
|
||||
lda oldplot
|
||||
sta oldplotL,x
|
||||
lda oldplot+1
|
||||
sta oldplotH,x
|
||||
; and now we must solve the problem of several plots
|
||||
; in one byte
|
||||
ldx #4
|
||||
ldy WhichUnPlot
|
||||
LetsCheckOverlapping
|
||||
cpx WhichUnPlot
|
||||
beq SkipThisPlot
|
||||
lda oldplotL,x
|
||||
cmp oldplotL,y
|
||||
bne NotTheSamePlot
|
||||
lda oldplotH,x
|
||||
cmp oldplotH,y
|
||||
bne NotTheSamePlot
|
||||
lda oldply,x
|
||||
cmp oldply,y
|
||||
bne NotTheSamePlot
|
||||
; the pixel is in the same byte so let's take correct contents
|
||||
lda oldora,x
|
||||
sta oldora,y
|
||||
NotTheSamePlot
|
||||
SkipThisPlot
|
||||
dex
|
||||
bpl LetsCheckOverlapping
|
||||
EndOfUnPlot
|
||||
rts
|
||||
.endp
|
||||
|
||||
; -----------------------------------------
|
||||
.proc plot ;plot (xdraw, ydraw, color)
|
||||
; color == 1 --> put pixel
|
||||
; color == 0 --> erase pixel
|
||||
; this is one of the most important routines in the whole
|
||||
; game. If you are going to speed up the game, start with
|
||||
; plot - it is used by every single effect starting from explosions
|
||||
; through line drawing and small text output!!!
|
||||
;
|
||||
; Optimized by 0xF (Fox) THXXXX!!!
|
||||
|
||||
; -----------------------------------------
|
||||
; is it not over the screen ???
|
||||
cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1)
|
||||
bcs unPlot.EndOfUnPlot ;nearest RTS
|
||||
CheckX02
|
||||
cpw xdraw #screenwidth
|
||||
bcs EndOfPlot
|
||||
MakePlot
|
||||
; let's calculate coordinates from xdraw and ydraw
|
||||
|
||||
;xbyte = xbyte/8
|
||||
lda xdraw+1
|
||||
lsr
|
||||
lda xdraw
|
||||
ror ;just one bit over 256. Max screenwidth = 512!!!
|
||||
lsr
|
||||
lsr
|
||||
sta xbyte
|
||||
;---
|
||||
ldx ydraw
|
||||
ldy linetableL,x
|
||||
lda linetableH,x
|
||||
sta xbyte+1
|
||||
|
||||
lda xdraw
|
||||
and #$7
|
||||
tax
|
||||
lda color
|
||||
bne ClearPlot
|
||||
|
||||
lda (xbyte),y
|
||||
ora bittable,x
|
||||
sta (xbyte),y
|
||||
EndOfPlot
|
||||
rts
|
||||
ClearPlot
|
||||
lda (xbyte),y
|
||||
and bittable2,x
|
||||
sta (xbyte),y
|
||||
rts
|
||||
.endp
|
||||
|
||||
; -----------------------------------------
|
||||
.proc point_plot
|
||||
; -----------------------------------------
|
||||
; checks state of the pixel (coordinates in xdraw and ydraw)
|
||||
; result is in A (zero or appropriate bit is set)
|
||||
|
||||
; let's calculate coordinates from xdraw and ydraw
|
||||
|
||||
;xbyte = xbyte/8
|
||||
lda xdraw+1
|
||||
lsr
|
||||
lda xdraw
|
||||
ror ;just one bit over 256. Max screenwidht = 512!!!
|
||||
lsr
|
||||
lsr
|
||||
sta xbyte
|
||||
;---
|
||||
ldx ydraw
|
||||
ldy linetableL,x
|
||||
lda linetableH,x
|
||||
sta xbyte+1
|
||||
|
||||
lda xdraw
|
||||
and #$7
|
||||
tax
|
||||
|
||||
lda (xbyte),y
|
||||
eor #$ff
|
||||
and bittable,x
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc drawmountains
|
||||
;--------------------------------------------------
|
||||
mwa #0 xdraw
|
||||
mwa #mountaintable modify
|
||||
mva #1 color
|
||||
|
||||
drawmountainsloop
|
||||
ldy #0
|
||||
lda (modify),y
|
||||
cmp #screenheight
|
||||
beq NoMountain
|
||||
sta ydraw
|
||||
sty ydraw+1
|
||||
.IF FASTER_GRAF_PROCS = 1
|
||||
; there was Drawline proc
|
||||
lda #screenheight
|
||||
sec
|
||||
sbc ydraw
|
||||
sta tempbyte01
|
||||
jsr plot.MakePlot
|
||||
; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit)
|
||||
; jmp IntoDraw ; jumps inside Draw routine
|
||||
; because one pixel is already plotted (and who cares? :) )
|
||||
@
|
||||
lda (xbyte),y
|
||||
and bittable2,x
|
||||
sta (xbyte),y
|
||||
;IntoDraw
|
||||
adw xbyte #screenBytes
|
||||
dec tempbyte01
|
||||
bne @-
|
||||
; end of Drawline proc
|
||||
.ELSE
|
||||
; there was Drawline proc
|
||||
drawline
|
||||
jsr plot.MakePlot
|
||||
inc ydraw
|
||||
lda ydraw
|
||||
cmp #screenheight
|
||||
bne drawline
|
||||
; end of Drawline proc
|
||||
.ENDIF
|
||||
NoMountain
|
||||
inw modify
|
||||
inw xdraw
|
||||
cpw xdraw #screenwidth
|
||||
bne drawmountainsloop
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc TypeChar
|
||||
; puts char on the graphics screen
|
||||
; in: CharCode
|
||||
; in: left LOWER corner of the char coordinates (xdraw, ydraw)
|
||||
;--------------------------------------------------
|
||||
; char to the table
|
||||
lda CharCode
|
||||
sta fontind
|
||||
lda #$00
|
||||
sta fontind+1
|
||||
; char intex times 8
|
||||
aslw fontind
|
||||
rolw fontind
|
||||
rolw fontind
|
||||
|
||||
adw fontind #TankFont
|
||||
|
||||
; and 8 bytes to the table
|
||||
ldy #7
|
||||
CopyChar
|
||||
lda (fontind),y
|
||||
eor #$ff
|
||||
sta char1,y
|
||||
lda #$ff
|
||||
sta char2,y
|
||||
dey
|
||||
bpl CopyChar
|
||||
; and 8 subsequent bytes as a mask
|
||||
adw fontind #8
|
||||
ldy #7
|
||||
CopyMask
|
||||
lda (fontind),y
|
||||
eor #$ff
|
||||
sta mask1,y
|
||||
lda #$00
|
||||
sta mask2,y
|
||||
dey
|
||||
bpl CopyMask
|
||||
|
||||
.IF FASTER_GRAF_PROCS = 1
|
||||
; calculating coordinates from xdraw and ydraw
|
||||
mwa xdraw xbyte
|
||||
|
||||
lda xbyte
|
||||
and #$7
|
||||
sta ybit
|
||||
|
||||
lsrw xbyte ; div 8
|
||||
rorw xbyte
|
||||
rorw xbyte
|
||||
;---
|
||||
ldy xbyte
|
||||
|
||||
lda ydraw ; y = y - 7 because left lower. shouldn't it be 8?
|
||||
sec
|
||||
sbc #7
|
||||
tax
|
||||
|
||||
lda linetableL,x
|
||||
sta xbyte
|
||||
lda linetableH,x
|
||||
sta xbyte+1
|
||||
; mask preparation and character shifting
|
||||
ldx ybit
|
||||
beq MaskOK00
|
||||
MakeMask00
|
||||
.rept 8
|
||||
lsr mask1+#
|
||||
ror mask2+#
|
||||
.endr
|
||||
sec
|
||||
.rept 8
|
||||
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
|
||||
ror char2+#
|
||||
.endr
|
||||
dex
|
||||
bne MakeMask00
|
||||
MaskOK00
|
||||
; here x=0
|
||||
lda Erase
|
||||
beq CharLoopi ; it works, because x=0
|
||||
lda #$ff
|
||||
ldx #7
|
||||
EmptyChar
|
||||
sta char1,x
|
||||
sta char2,x
|
||||
dex
|
||||
bpl EmptyChar
|
||||
ldx #0
|
||||
CharLoopi
|
||||
lda (xbyte),y
|
||||
ora mask1,x
|
||||
and char1,x
|
||||
sta (xbyte),y
|
||||
iny
|
||||
lda (xbyte),y
|
||||
ora mask2,x
|
||||
and char2,x
|
||||
sta (xbyte),y
|
||||
dey
|
||||
adw xbyte #screenBytes
|
||||
inx
|
||||
cpx #8
|
||||
bne CharLoopi
|
||||
.ELSE
|
||||
mvx #7 temp ; line counter (Y)
|
||||
CharLoop1
|
||||
mva #7 temp+1 ; pixel counter (X)
|
||||
CharLoop2
|
||||
mva #0 color
|
||||
rol mask1,x
|
||||
bcc NoMaskNoPlot
|
||||
rol char1,x
|
||||
bcs NoPlot
|
||||
MakeCharPlot
|
||||
lda Erase
|
||||
bne ErasingChar
|
||||
inc color
|
||||
ErasingChar
|
||||
NoPlot
|
||||
jsr plot.MakePlot
|
||||
AfterCharPlot
|
||||
inw xdraw
|
||||
ldx temp
|
||||
dec temp+1
|
||||
bpl CharLoop2
|
||||
sec
|
||||
sbw xdraw #8
|
||||
dec ydraw
|
||||
ldx temp
|
||||
dex
|
||||
stx temp
|
||||
bpl CharLoop1
|
||||
clc
|
||||
lda ydraw
|
||||
adc #8
|
||||
sta ydraw
|
||||
bne EndPutChar
|
||||
NoMaskNoPlot
|
||||
rol char1,x
|
||||
jmp AfterCharPlot
|
||||
.ENDIF
|
||||
EndPutChar
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc PutChar4x4
|
||||
; puts 4x4 pixels char on the graphics screen
|
||||
; in: dx, dy (LOWER left corner of the char)
|
||||
; in: CharCode4x4 (.sbyte)
|
||||
; in: plot4x4color (0/255)
|
||||
; all pixels are being drawn
|
||||
; (empty and not empty)
|
||||
;--------------------------------------------------
|
||||
cpw dy #(screenheight-1)
|
||||
jcs TypeChar.EndPutChar ;nearest RTS
|
||||
cpw dy #(4)
|
||||
jcc TypeChar.EndPutChar ;nearest RTS
|
||||
cpw dx #(screenwidth-4)
|
||||
jcs TypeChar.EndPutChar ;nearest RTS
|
||||
; checks ommited.
|
||||
; char to the table
|
||||
lda CharCode4x4
|
||||
and #%00000001
|
||||
beq Upper4bits
|
||||
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
|
||||
Upper4bits
|
||||
sta nibbler4x4
|
||||
lda CharCode4x4
|
||||
lsr
|
||||
sta fontind
|
||||
lda #$00
|
||||
sta fontind+1
|
||||
|
||||
adw fontind #font4x4
|
||||
|
||||
; and 4 bytes to the table
|
||||
ldy #0
|
||||
ldx #3
|
||||
CopyChar
|
||||
lda (fontind),y ; Y must be 0 !!!!
|
||||
bit nibbler4x4
|
||||
bpl GetUpper4bits
|
||||
:4 rol
|
||||
GetUpper4bits
|
||||
ora #$0f
|
||||
sta char1,x
|
||||
lda #$ff
|
||||
sta char2,x
|
||||
; and 4 bytes as a mask
|
||||
lda #$f0
|
||||
sta mask1,x
|
||||
lda #$00
|
||||
sta mask2,x
|
||||
adw fontind #32 ; next byte of 4x4 font
|
||||
dex
|
||||
bpl CopyChar
|
||||
|
||||
.IF FASTER_GRAF_PROCS = 1
|
||||
; calculating coordinates from xdraw and ydraw
|
||||
mwa dx xbyte
|
||||
|
||||
lda xbyte
|
||||
and #$7
|
||||
sta ybit
|
||||
|
||||
:3 lsrw xbyte ; div 8
|
||||
; rorw xbyte
|
||||
; rorw xbyte
|
||||
;---
|
||||
ldy xbyte ; horizontal byte offet stored in Y
|
||||
lda dy ; y = y - 3 because left lower.
|
||||
sec
|
||||
sbc #3
|
||||
tax
|
||||
|
||||
lda linetableL,x
|
||||
sta xbyte
|
||||
lda linetableH,x
|
||||
sta xbyte+1
|
||||
; mask preparation and character shifting
|
||||
ldx ybit
|
||||
beq MaskOK01
|
||||
MakeMask01
|
||||
.rept 4
|
||||
lsr mask1+#
|
||||
ror mask2+#
|
||||
.endr
|
||||
sec
|
||||
.rept 4
|
||||
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
|
||||
ror char2+#
|
||||
.endr
|
||||
dex
|
||||
bne MakeMask01
|
||||
MaskOK01
|
||||
ldx #0
|
||||
CharLoopi4x4
|
||||
lda (xbyte),y
|
||||
ora mask1,x
|
||||
bit plot4x4color
|
||||
bpl PutInColor0_1 ; only mask - no char
|
||||
and char1,x
|
||||
PutInColor0_1
|
||||
sta (xbyte),y
|
||||
iny
|
||||
lda (xbyte),y
|
||||
ora mask2,x
|
||||
bit plot4x4color
|
||||
bpl PutInColor0_2 ; only mask - no char
|
||||
and char2,x
|
||||
PutInColor0_2
|
||||
sta (xbyte),y
|
||||
dey
|
||||
adw xbyte #screenBytes
|
||||
inx
|
||||
cpx #4
|
||||
bne CharLoopi4x4
|
||||
.ELSE
|
||||
mwa xdraw char2
|
||||
mwa ydraw mask2
|
||||
mva color mask2+2
|
||||
mwa dx xdraw
|
||||
mwa dy ydraw
|
||||
mvx #3 temp ; line counter (Y)
|
||||
CharLoop1
|
||||
mva #3 temp+1 ; pixel counter (X)
|
||||
CharLoop2
|
||||
mva #0 color
|
||||
rol mask1,x
|
||||
bcc NoMaskNoPlot
|
||||
rol char1,x
|
||||
bcs NoPlot
|
||||
MakeCharPlot
|
||||
lda plot4x4color
|
||||
beq ErasingChar
|
||||
inc color
|
||||
ErasingChar
|
||||
NoPlot
|
||||
jsr plot.MakePlot
|
||||
AfterCharPlot
|
||||
inw xdraw
|
||||
ldx temp
|
||||
dec temp+1
|
||||
bpl CharLoop2
|
||||
sec
|
||||
sbw xdraw #4
|
||||
dec ydraw
|
||||
ldx temp
|
||||
dex
|
||||
stx temp
|
||||
bpl CharLoop1
|
||||
mwa char2 xdraw
|
||||
mwa mask2 ydraw
|
||||
mva mask2+2 color
|
||||
bpl EndPut4x4
|
||||
NoMaskNoPlot
|
||||
rol char1,x
|
||||
jmp AfterCharPlot
|
||||
.ENDIF
|
||||
EndPut4x4
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc ClearScreen
|
||||
;--------------------------------------------------
|
||||
mwa #display temp
|
||||
ldy #0
|
||||
@ lda #$ff
|
||||
sta (temp),y
|
||||
inw temp
|
||||
cpw temp #display+screenheight*screenBytes+1
|
||||
bne @-
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc GenerateLineTable
|
||||
|
||||
mwa #display temp
|
||||
mwa #linetableL temp2
|
||||
mwa #linetableH modify
|
||||
ldy #0
|
||||
@ lda temp
|
||||
sta (temp2),y
|
||||
lda temp+1
|
||||
sta (modify),y
|
||||
adw temp #40
|
||||
iny
|
||||
cpy #screenheight+1
|
||||
bne @-
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc SetMainScreen
|
||||
; mva #0 dmactls
|
||||
SetDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen
|
||||
mwa #dl dlptrs ; issue #72 (glitches when switches)
|
||||
lda #%00111110
|
||||
; and #$fc
|
||||
; ora #$02 ; 2=normal, 3 = wide screen width
|
||||
sta dmactls
|
||||
mva WallsType COLBAKS ; set color of background
|
||||
jmp WaitOneFrame
|
||||
; rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
|
||||
|
||||
; ******* This is weapon .... but ... *******
|
||||
; -------------------------------------------------
|
||||
.proc AtomicWinter
|
||||
; -------------------------------------------------
|
||||
; This routine is run from inside of the main loop
|
||||
; and replaces Shoot and Flight routines
|
||||
; X and TankNr - index of shooting tank
|
||||
; -------------------------------------------------
|
||||
mva #sfx_sandhog sfx_effect
|
||||
.IF FASTER_GRAF_PROCS = 1
|
||||
ldy #0 ; byte counter (from 0 to 39)
|
||||
NextColumn
|
||||
; big loop - we repat internal loops for each column of bytes
|
||||
sty magic
|
||||
ldx #120 ; line counter (from 0 to 60 )
|
||||
; first loop - inverse column of bytes for a while
|
||||
ldy magic
|
||||
NextLine1
|
||||
jsr InverseScreenByte
|
||||
dex
|
||||
dex
|
||||
bpl NextLine1
|
||||
;
|
||||
jsr WaitOneFrame ; wait uses A only
|
||||
; second loop - inverse again and put random "snow" to column of bytes
|
||||
ldx #120
|
||||
ldy magic
|
||||
mva #$55 magic+1
|
||||
NextLine2
|
||||
jsr InverseScreenByte
|
||||
lda random
|
||||
ora magic+1
|
||||
and (temp),y
|
||||
sta (temp),y
|
||||
lda magic+1
|
||||
eor #$ff
|
||||
sta magic+1
|
||||
dex
|
||||
dex
|
||||
bpl NextLine2
|
||||
; and go to next column
|
||||
iny
|
||||
cpy #40
|
||||
bne NextColumn
|
||||
.ELSE
|
||||
mva #1 color
|
||||
mwa #120 ydraw
|
||||
NextLineSlow
|
||||
lda #0
|
||||
sta xdraw
|
||||
sta xdraw+1
|
||||
NextPixelSlow
|
||||
bit random
|
||||
bpl NoPlot
|
||||
bvc NoPlot
|
||||
jsr plot.MakePlot
|
||||
NoPlot
|
||||
inw xdraw
|
||||
cpw xdraw #screenwidth
|
||||
bne NextPixelSlow
|
||||
dec ydraw
|
||||
dec ydraw
|
||||
bpl NextLineSlow
|
||||
.ENDIF
|
||||
; and we have "snow" :)
|
||||
lda #0
|
||||
ldx TankNr
|
||||
sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter
|
||||
jsr SetFullScreenSoilRange
|
||||
jmp SoilDown2.NoClearTanks
|
||||
; rts
|
||||
|
||||
; in order to optimize the fragment repeated in both internal loops
|
||||
; we save 15 bytes :)
|
||||
InverseScreenByte
|
||||
lda LineTableL,x
|
||||
sta temp
|
||||
lda LineTableH,x
|
||||
sta temp+1
|
||||
lda (temp),y
|
||||
eor #$ff
|
||||
sta (temp),y
|
||||
rts
|
||||
.endp
|
||||
|
||||
.ENDIF
|
||||
@@ -170,7 +170,15 @@ nextlinedisplay
|
||||
; bne EndOfCreditsVBI
|
||||
mwa #Credits DLCreditsAddr
|
||||
EndOfCreditsVBI
|
||||
.IF TARGET = 5200
|
||||
.IF TARGET = 800
|
||||
; support for joysticks :)
|
||||
ldx JoystickNumber
|
||||
lda STICK0,x
|
||||
sta STICK0
|
||||
lda STRIG0,x
|
||||
sta STRIG0
|
||||
jmp XITVBV
|
||||
.ELIF TARGET = 5200
|
||||
lda SkStatSimulator
|
||||
bmi @+
|
||||
inc SkStatSimulator
|
||||
@@ -225,14 +233,6 @@ EndOfCreditsVBI
|
||||
tax
|
||||
pla
|
||||
rti
|
||||
.ELSE
|
||||
; support for joysticks :)
|
||||
ldx JoystickNumber
|
||||
lda STICK0,x
|
||||
sta STICK0
|
||||
lda STRIG0,x
|
||||
sta STRIG0
|
||||
jmp XITVBV
|
||||
.ENDIF
|
||||
.endp
|
||||
.IF TARGET = 5200
|
||||
@@ -58,7 +58,6 @@
|
||||
jsr drawtanks ;finally draw tanks
|
||||
pla
|
||||
sta NumberOfPlayers
|
||||
; --------
|
||||
|
||||
mva #0 OptionsY
|
||||
|
||||
@@ -122,6 +121,7 @@ OptionsNoReturn
|
||||
OptionsNoTab
|
||||
jmp OptionsMainLoop
|
||||
.endp
|
||||
|
||||
.proc SelectNextGradient
|
||||
lda OptionsY ; if "Wind" option selected
|
||||
cmp #$03
|
||||
@@ -144,6 +144,7 @@ NoGradientLoop
|
||||
sta GradientColors+1
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------
|
||||
; inversing selected option (cursor)
|
||||
;--------
|
||||
@@ -154,7 +155,7 @@ optionWidth = 6
|
||||
nameWidth = 10
|
||||
mwa #OptionsHere temp ; offset of the first option=11
|
||||
mva #0 YPos ;option number pointer
|
||||
mva #0 Xpos ;X position in the menu
|
||||
sta Xpos ;X position in the menu
|
||||
tay ; Y is zero here...
|
||||
OptionsSetMainLoop
|
||||
ldx YPos ; Y position in the menu
|
||||
@@ -204,69 +205,10 @@ invertme
|
||||
rts
|
||||
.endp
|
||||
|
||||
; --------------------------------------
|
||||
; Sets the appropriate variables based on the options table
|
||||
;
|
||||
.proc SetVariablesFromOptions
|
||||
;first option
|
||||
ldy OptionsTable
|
||||
iny
|
||||
iny
|
||||
sty NumberOfPlayers ;1=1 player (but minimum is 2)
|
||||
|
||||
;second option (cash)
|
||||
|
||||
|
||||
ldy OptionsTable+1
|
||||
ldx #0
|
||||
@
|
||||
lda CashOptionL,y
|
||||
sta moneyL,x
|
||||
lda CashOptionH,y
|
||||
sta moneyH,x
|
||||
inx
|
||||
cpx NumberOfPlayers
|
||||
bne @-
|
||||
|
||||
;third option (gravity)
|
||||
ldy OptionsTable+2
|
||||
lda GravityTable,y
|
||||
sta gravity
|
||||
|
||||
;fourth option (wind)
|
||||
ldy OptionsTable+3
|
||||
lda MaxWindTable,y
|
||||
sta MaxWind
|
||||
|
||||
;fifth option (no of rounds)
|
||||
ldy OptionsTable+4
|
||||
lda RoundsTable,y
|
||||
sta RoundsInTheGame
|
||||
|
||||
;6th option (shell speed)
|
||||
ldy OptionsTable+5
|
||||
lda flyDelayTable,y
|
||||
sta flyDelay
|
||||
|
||||
;7th option (Airstrike after how many missess)
|
||||
ldy OptionsTable+6
|
||||
lda seppukuTable,y
|
||||
sta seppukuVal
|
||||
|
||||
;8th option (how aggressive are mountains)
|
||||
ldy OptionsTable+7
|
||||
lda mountainsDeltaTableH,y
|
||||
sta mountainDeltaH
|
||||
lda mountainsDeltaTableL,y
|
||||
sta mountainDeltaL
|
||||
|
||||
|
||||
rts
|
||||
.endp
|
||||
|
||||
.proc CallPurchaseForEveryTank
|
||||
;-------------------------------------------
|
||||
; call of the purchase (and activate) screens for each tank
|
||||
.proc CallPurchaseForEveryTank
|
||||
;-------------------------------------------
|
||||
|
||||
mva #0 TankNr
|
||||
sta isInventory
|
||||
@@ -406,7 +348,7 @@ AfterPurchase
|
||||
cmp IndexesOfWeaponsL1,y
|
||||
beq ?weaponfound
|
||||
iny
|
||||
cpy #(last_offensive_____ - first_offensive____)+1 ; maxOffensiveWeapons
|
||||
cpy #(last_offensive - first_offensive )+1 ; maxOffensiveWeapons
|
||||
bne @-
|
||||
; not found apparently?
|
||||
; TODO: check border case (the last weapon)
|
||||
@@ -541,7 +483,7 @@ DeffensiveSelected
|
||||
jmp ChoosingItemForPurchase
|
||||
|
||||
.endp
|
||||
;
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc CreateList
|
||||
;--------------------------------------------------
|
||||
@@ -697,7 +639,7 @@ notInventory
|
||||
NotTheSameAsLastTime
|
||||
; increase appropriate counter
|
||||
txa
|
||||
cpx #last_offensive_____+1
|
||||
cpx #last_offensive +1
|
||||
bcs DefenceList
|
||||
ldy HowManyOnTheListOff
|
||||
sta IndexesOfWeaponsL1,y
|
||||
@@ -715,14 +657,14 @@ NoWeapon
|
||||
|
||||
; next weapon. If no more weapons then finish!
|
||||
inx
|
||||
cpx #last_offensive_____+1
|
||||
cpx #last_offensive +1
|
||||
bne NoDefense
|
||||
|
||||
; if we got to the defense weapons,
|
||||
; we switch address to the second table.
|
||||
mwa #ListOfDefensiveWeapons xbyte
|
||||
NoDefense
|
||||
cpx #last_defensive_____+1
|
||||
cpx #last_defensive +1
|
||||
|
||||
jne CreateList
|
||||
|
||||
@@ -835,7 +777,7 @@ positiveMoney
|
||||
|
||||
; but if we purchasing "Buy me!" then we must draw the winning weapon.
|
||||
|
||||
cpy #ind_Buy_me_________
|
||||
cpy #ind_Buy_me
|
||||
bne NoSuprise
|
||||
|
||||
Suprise ; get a random weapon
|
||||
@@ -843,13 +785,13 @@ Suprise ; get a random weapon
|
||||
cmp #51 ; defensive weapons are less likely because they are more expensive - probability 255:51 (5:1)
|
||||
bcc GetRandomDefensive
|
||||
GetRandomOffensive
|
||||
randomize ind_Missile________ last_offensive_____
|
||||
;cmp #ind_Buy_me_________ ; buy me do not buy buy me :)
|
||||
randomize ind_Missile last_offensive
|
||||
;cmp #ind_Buy_me ; buy me do not buy buy me :)
|
||||
;beq GetRandomOffensive
|
||||
tay
|
||||
bne NoSuprise ; Y always <> 0
|
||||
GetRandomDefensive
|
||||
randomize ind_Battery________ last_defensive_____
|
||||
randomize ind_Battery last_defensive
|
||||
tay
|
||||
; lda WeaponUnits,y ; check if weapon exist
|
||||
; beq GetRandomDefensive
|
||||
@@ -888,7 +830,7 @@ invSelectDef
|
||||
lda IndexesOfWeaponsL2,y
|
||||
tay
|
||||
ldx tankNr
|
||||
cmp #ind_Battery________
|
||||
cmp #ind_Battery
|
||||
bne NotBattery
|
||||
; if activate battery, we do it differently
|
||||
mva #sfx_battery sfx_effect
|
||||
@@ -898,38 +840,38 @@ invSelectDef
|
||||
ply
|
||||
jmp DecreaseDefensive ; bypass activation
|
||||
NotBattery
|
||||
cmp #ind_Auto_Defense___
|
||||
cmp #ind_Auto_Defense
|
||||
bne NoAutoDefense
|
||||
; Auto Defense - do it like battery
|
||||
mva #sfx_auto_defense sfx_effect
|
||||
mva #$A1 AutoDefenseFlag,x ; this is "A" in inverse - for status line :)
|
||||
jmp DecreaseDefensive ; bypass activation
|
||||
NoAutoDefense
|
||||
cmp #ind_Lazy_Boy_______
|
||||
cmp #ind_Lazy_Boy
|
||||
bne NoLazyBoy
|
||||
; Lazy Boy - do it like battery
|
||||
mva #%01000000 LazyFlag
|
||||
jmp DecreaseDefensive ; bypass activation
|
||||
NoLazyBoy
|
||||
cmp #ind_Lazy_Darwin____
|
||||
cmp #ind_Lazy_Darwin
|
||||
bne NoLazyDarwin
|
||||
; Lazy Darwin - do it like battery
|
||||
mva #%11000000 LazyFlag
|
||||
jmp DecreaseDefensive ; bypass activation
|
||||
NoLazyDarwin
|
||||
cmp #ind_Spy_Hard_______
|
||||
cmp #ind_Spy_Hard
|
||||
bne NotSpy
|
||||
mva #$ff SpyHardFlag
|
||||
jmp DecreaseDefensive ; bypass activation
|
||||
NotSpy
|
||||
cmp #ind_Long_Barrel____
|
||||
cmp #ind_Long_Barrel
|
||||
bne NotBarrel
|
||||
; if activate long barrel, we do it differently too
|
||||
mva #sfx_long_barrel sfx_effect
|
||||
mva #LongBarrel BarrelLength,x
|
||||
bne DecreaseDefensive ; bypass activation
|
||||
NotBarrel
|
||||
cmp #ind_White_Flag_____
|
||||
cmp #ind_White_Flag
|
||||
bne NotWhiteFlag
|
||||
cmp ActiveDefenceWeapon,x
|
||||
bne NoDeactivateWhiteFlag
|
||||
@@ -958,11 +900,12 @@ DecreaseDefensive
|
||||
|
||||
DefActivationEnd
|
||||
jmp WaitForKeyRelease ; rts
|
||||
|
||||
.endp
|
||||
; -----------------------------------------------------
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc calcPosDefensive
|
||||
; calculate positionOnTheList from the activeWeapon (defensives)
|
||||
;--------------------------------------------------
|
||||
ldx tankNr
|
||||
lda ActiveDefenceWeapon,x
|
||||
beq ?noWeaponActive
|
||||
@@ -971,7 +914,7 @@ DefActivationEnd
|
||||
cmp IndexesOfWeaponsL2,y
|
||||
beq ?weaponfound
|
||||
iny
|
||||
cpy #(last_defensive_____ - first_defensive____)+1 ; maxDefensiveWeapon
|
||||
cpy #(last_defensive - first_defensive )+1 ; maxDefensiveWeapon
|
||||
bne @-
|
||||
; not found apparently?
|
||||
; TODO: check border case (the last weapon)
|
||||
@@ -994,7 +937,7 @@ DefActivationEnd
|
||||
cmp IndexesOfWeaponsL1,y
|
||||
beq ?weaponfound
|
||||
iny
|
||||
cpy #(last_offensive_____ - first_offensive____) ; maxOffensiveWeapon
|
||||
cpy #(last_offensive - first_offensive ) ; maxOffensiveWeapon
|
||||
bne @-
|
||||
; not found apparently?
|
||||
; TODO: check border case (the last weapon)
|
||||
@@ -1006,11 +949,13 @@ DefActivationEnd
|
||||
sty positionOnTheList
|
||||
rts
|
||||
.endp
|
||||
; -----------------------------------------------------
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc PutLitteChar
|
||||
;--------------------------------------------------
|
||||
; first let's clear both lists from little chars
|
||||
mwa #ListOfWeapons xbyte
|
||||
ldx #last_defensive_____ ; there are xx lines total
|
||||
ldx #last_defensive ; there are xx lines total
|
||||
ldy #$00
|
||||
EraseLoop
|
||||
tya ; lda #$00
|
||||
@@ -1027,10 +972,10 @@ EraseLoop
|
||||
mwa #ListOfDefensiveWeapons xbyte
|
||||
ldx PositionOnTheList
|
||||
beq SelectList2 ; if there is 0 we add nothing
|
||||
AddLoop2
|
||||
@
|
||||
adw xbyte #32 ; narrow screen
|
||||
dex
|
||||
bne AddLoop2
|
||||
bne @-
|
||||
SelectList2
|
||||
lda #$7f ; little char (tab) - this is the pointer
|
||||
sta (xbyte),y
|
||||
@@ -1048,10 +993,10 @@ CharToList1
|
||||
mwa #ListOfWeapons xbyte
|
||||
ldx PositionOnTheList
|
||||
beq SelectList1 ; if there is 0 we add nothing
|
||||
AddLoop1
|
||||
@
|
||||
adw xbyte #32 ; narrow screen
|
||||
dex
|
||||
bne AddLoop1
|
||||
bne @-
|
||||
SelectList1
|
||||
lda #$7f ; pointer = little char = (tab)
|
||||
sta (xbyte),y
|
||||
@@ -1059,10 +1004,10 @@ SelectList1
|
||||
mwa #ListOfWeapons xbyte
|
||||
ldx OffsetDL1
|
||||
beq SetWindowList1 ; if zero then add nothing
|
||||
LoopWindow1
|
||||
@
|
||||
adw xbyte #32 ; narrow screen
|
||||
dex
|
||||
bne LoopWindow1
|
||||
bne @-
|
||||
SetWindowList1
|
||||
mwa xbyte WeaponsListDL ; and we change Display List
|
||||
|
||||
@@ -1135,13 +1080,6 @@ NoArrowDown
|
||||
lda digits+1,x
|
||||
sta NameScreen2+7
|
||||
|
||||
; clear tank name editor field - not necessary
|
||||
; ldx #8
|
||||
; lda #0
|
||||
;@ sta NameAdr,x
|
||||
; dex
|
||||
; bpl @-
|
||||
|
||||
; copy existing name and place cursor at end
|
||||
lda TankNr
|
||||
:3 asl
|
||||
@@ -1149,7 +1087,6 @@ NoArrowDown
|
||||
|
||||
ldy #0
|
||||
@ lda TanksNames,x
|
||||
; beq endOfTankName
|
||||
sta NameAdr,y
|
||||
inx
|
||||
iny
|
||||
@@ -1164,9 +1101,8 @@ endOfTankName
|
||||
bpl @-
|
||||
LastNameChar
|
||||
cpy #7
|
||||
beq @+
|
||||
iny
|
||||
@ sty PositionInName
|
||||
seq:iny
|
||||
sty PositionInName
|
||||
|
||||
CheckKeys
|
||||
jsr HighlightLevel ; setting choosen level of the opponent (Moron, etc)
|
||||
@@ -1200,9 +1136,8 @@ YesLetter
|
||||
sta NameAdr,x
|
||||
inx
|
||||
cpx #$08 ; is there 8 characters?
|
||||
bne @+
|
||||
dex
|
||||
@ stx PositionInName ; if not, we store
|
||||
sne:dex
|
||||
stx PositionInName ; if not, we store
|
||||
jmp CheckKeys
|
||||
.ENDIF
|
||||
CheckFurtherX01 ; here we check Tab, Return and Del
|
||||
@@ -1254,34 +1189,23 @@ ChangeOfJoyUp
|
||||
ChangeOfLevelUp ; change difficulty level of computer opponent
|
||||
inc:lda DifficultyLevel
|
||||
cmp #9 ; 9 levels are possible
|
||||
bne DoNotLoopLevelUp
|
||||
mva #$0 DifficultyLevel
|
||||
DoNotLoopLevelUp
|
||||
sne:mva #$0 DifficultyLevel ; DoNotLoopLevelUp
|
||||
jmp CheckKeys
|
||||
;----
|
||||
ChangeOfLevelDown
|
||||
dec:lda DifficultyLevel
|
||||
bpl DoNotLoopLevelDown
|
||||
mva #$8 DifficultyLevel
|
||||
DoNotLoopLevelDown
|
||||
spl:mva #$8 DifficultyLevel ; DoNotLoopLevelDown
|
||||
jmp CheckKeys
|
||||
;----
|
||||
ChangeOfLevel3Up
|
||||
adb DifficultyLevel #3
|
||||
|
||||
cmp #9
|
||||
bcc DoNotLoopLevel3Up
|
||||
|
||||
sbb DifficultyLevel #9
|
||||
|
||||
DoNotLoopLevel3Up
|
||||
scc:sbb DifficultyLevel #9 ; DoNotLoopLevel3Up
|
||||
jmp CheckKeys
|
||||
;----
|
||||
ChangeOfLevel3Down
|
||||
sbb DifficultyLevel #3
|
||||
bpl @+
|
||||
adb DifficultyLevel #9
|
||||
@
|
||||
spl:adb DifficultyLevel #9
|
||||
jmp CheckKeys
|
||||
;----
|
||||
ChangeOfShapeUp
|
||||
@@ -1340,23 +1264,23 @@ NotRobot
|
||||
beq MakeDefaultName
|
||||
|
||||
ldy #0
|
||||
nextchar04
|
||||
@
|
||||
lda NameAdr,y
|
||||
and #$7f ; remove inverse (Cursor)
|
||||
sta tanksnames,x
|
||||
inx
|
||||
iny
|
||||
cpy #$08
|
||||
bne nextchar04
|
||||
bne @-
|
||||
rts
|
||||
MakeDefaultName
|
||||
nextchar05
|
||||
@
|
||||
lda tanksnamesDefault,x
|
||||
sta tanksnames,x
|
||||
inx
|
||||
iny
|
||||
cpy #$08
|
||||
bne nextchar05
|
||||
bne @-
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
@@ -1603,173 +1527,6 @@ displayloop1
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------
|
||||
.proc DisplayResults ;
|
||||
;displays results of the round
|
||||
;using 4x4 font
|
||||
jsr RoundOverSprites
|
||||
|
||||
|
||||
mva #$ff plot4x4color
|
||||
|
||||
;centering the result screen
|
||||
mva #((ScreenHeight/2)-(8*4)) ResultY
|
||||
|
||||
|
||||
;upper frame
|
||||
mva ResultY LineYdraw
|
||||
jsr TL4x4_top
|
||||
|
||||
adb ResultY #4 ;next line
|
||||
|
||||
;Header1
|
||||
;Displays round number
|
||||
lda CurrentRoundNr
|
||||
cmp RoundsInTheGame
|
||||
beq GameOver4x4
|
||||
|
||||
sta decimal
|
||||
mwa #RoundNrDisplay displayposition
|
||||
jsr displaybyte ;decimal (byte), displayposition (word)
|
||||
|
||||
mwa #LineHeader1 LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
|
||||
mva ResultY LineYdraw
|
||||
jsr TypeLine4x4
|
||||
beq @+ ;unconditional jump, because TypeLine4x4 ends with beq
|
||||
|
||||
GameOver4x4
|
||||
RmtSong song_round_over
|
||||
mwa #LineGameOver LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
|
||||
mva ResultY LineYdraw
|
||||
jsr TypeLine4x4
|
||||
mva #1 GameIsOver
|
||||
|
||||
@
|
||||
adb ResultY #4 ;next line
|
||||
|
||||
;Empty line
|
||||
mva ResultY LineYdraw
|
||||
jsr TL4x4_empty
|
||||
|
||||
adb ResultY #2 ;next line
|
||||
|
||||
|
||||
;Header2
|
||||
mwa #LineHeader2 LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
|
||||
mva ResultY LineYdraw
|
||||
jsr TypeLine4x4
|
||||
|
||||
adb ResultY #4 ;next line
|
||||
|
||||
;Empty line
|
||||
mva ResultY LineYdraw
|
||||
jsr TL4x4_empty
|
||||
|
||||
sbb ResultY #2 ;next line (was empty)
|
||||
|
||||
ldx NumberOfPlayers ;we start from the highest (best) tank
|
||||
dex ;and it is the last one
|
||||
stx ResultOfTankNr ;in TankSequence table
|
||||
|
||||
mwa #TanksNames tempXROLLER
|
||||
|
||||
ResultOfTheNextPlayer
|
||||
ldx ResultOfTankNr ;we are after a round, so we can use TankNr
|
||||
lda TankSequence,x ;and we keep here real number if the tank
|
||||
sta TankNr ;for which we are displaying results
|
||||
|
||||
|
||||
|
||||
|
||||
adb ResultY #4 ;next line
|
||||
|
||||
;there are at least 2 players, so we can safely
|
||||
;start displaying the result
|
||||
|
||||
lda #3 ;it means |
|
||||
sta ResultLineBuffer
|
||||
|
||||
ldy TankNr
|
||||
lda ResultsTable,y
|
||||
sta decimal
|
||||
mva #0 decimal+1
|
||||
mwa #(ResultLineBuffer+8) displayposition
|
||||
jsr displaydec5 ;decimal (byte), displayposition (word)
|
||||
|
||||
; overwrite the second digit of the points (max 255)
|
||||
;it means ":"
|
||||
mva #26 ResultLineBuffer+9
|
||||
|
||||
ldx #0
|
||||
lda TankNr
|
||||
asl
|
||||
asl ; times 8, because it is lengtgh
|
||||
asl ; of the names of the tanks
|
||||
tay
|
||||
|
||||
TankNameCopyLoop
|
||||
lda (tempXROLLER),y ;XROLLER is not working now
|
||||
and #$3f ;always CAPITAL letters
|
||||
inx
|
||||
sta ResultLineBuffer,x
|
||||
iny
|
||||
cpx #8 ; end of name
|
||||
bne TankNameCopyLoop
|
||||
; last letter of tank name overwrites first digit of the points (max 255)
|
||||
|
||||
|
||||
;just after the digits
|
||||
;it means |
|
||||
mva #$3 ResultLineBuffer+13
|
||||
|
||||
;result line display
|
||||
mwa #ResultLineBuffer LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
|
||||
mva ResultY LineYdraw
|
||||
jsr TypeLine4x4
|
||||
|
||||
adb ResultY #4 ;next line
|
||||
|
||||
;Empty line
|
||||
mva ResultY LineYdraw
|
||||
jsr TL4x4_empty
|
||||
|
||||
dec ResultOfTankNr
|
||||
bmi FinishResultDisplay
|
||||
|
||||
sbb ResultY #2 ;distance between lines is smaller
|
||||
|
||||
jmp ResultOfTheNextPlayer
|
||||
|
||||
FinishResultDisplay
|
||||
mva ResultY LineYdraw
|
||||
;jmp TL4x4_bottom ; just go
|
||||
.endp
|
||||
|
||||
.proc TL4x4_bottom
|
||||
;bottom of the frame
|
||||
mwa #LineBottom LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
|
||||
jmp TypeLine4x4 ; jsr:rts
|
||||
.endp
|
||||
|
||||
.proc TL4x4_top
|
||||
;bottom of the frame
|
||||
mwa #LineTop LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
|
||||
jmp TypeLine4x4 ; jsr:rts
|
||||
.endp
|
||||
|
||||
.proc TL4x4_empty
|
||||
;empty frame
|
||||
mwa #LineEmpty LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-(8*4)) LineXdraw
|
||||
jmp TypeLine4x4 ; jsr:rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc GameOverScreen
|
||||
;--------------------------------------------------
|
||||
@@ -1845,16 +1602,34 @@ NextChar
|
||||
jsr displaydec5
|
||||
mva #0 displayposition ; overwrite first digit
|
||||
; put hits points on the screen
|
||||
sta decimal+1 ; pozor!!! A=0
|
||||
ldx TankNr
|
||||
lda DirectHitsL,x
|
||||
lda DirectHits,x
|
||||
sta decimal
|
||||
lda DirectHitsH,x
|
||||
sta decimal+1
|
||||
; lda DirectHitsH,x ; one byte enough
|
||||
adw temp #19 displayposition
|
||||
jsr displaydec5
|
||||
mva #0 displayposition ; overwrite first digit
|
||||
; put earned money on the screen
|
||||
; put AI symbol or joystick
|
||||
ldx TankNr
|
||||
lda SkillTable,x
|
||||
tay
|
||||
bne ThisIsAI
|
||||
ldy JoyNumber,x
|
||||
iny ; tricky
|
||||
ThisIsAI
|
||||
lda digits,y
|
||||
ldy #39
|
||||
sta (temp),y ; AI level or joy number
|
||||
ldy #$0a ; Joystick symbol
|
||||
lda SkillTable,x
|
||||
beq NotAItank
|
||||
ldy #$5e ; Computer symbol
|
||||
NotAItank
|
||||
tya
|
||||
ldy #38
|
||||
sta (temp),y
|
||||
; put earned money on the screen
|
||||
lda EarnedMoneyL,x
|
||||
sta decimal
|
||||
lda EarnedMoneyH,x
|
||||
@@ -1902,9 +1677,7 @@ AllTanksFloatingDown
|
||||
lda Ytankstable,x
|
||||
cmp #(72-7) ; tank under screen - no erase
|
||||
bcs NoEraseTank
|
||||
mva #1 Erase
|
||||
jsr DrawTankNr
|
||||
mva #0 Erase
|
||||
jsr ClearTankNr
|
||||
sta ATRACT ; reset atract mode
|
||||
NoEraseTank
|
||||
ldx TankNr
|
||||
@@ -1923,7 +1696,7 @@ NotFastTank
|
||||
TankUnderScreen
|
||||
jsr RandomizeTankPos
|
||||
TankOnScreen
|
||||
jsr DrawTankNr
|
||||
jsr PutTankNr
|
||||
DrawOnlyParachute
|
||||
lda ActiveDefenceWeapon,x
|
||||
bne FastTank
|
||||
@@ -1936,8 +1709,8 @@ FastTank
|
||||
bne MainTanksFloatingLoop ; neverending loop
|
||||
mva #$00 ScrollFlag ; credits scroll off
|
||||
jsr MakeDarkScreen
|
||||
jsr GameOverResultsClear
|
||||
rts
|
||||
jmp GameOverResultsClear
|
||||
; rts
|
||||
RandomizeTankPos
|
||||
randomize 10 (32-7) ; 10 not 8 - barrel !! :)
|
||||
sta Ytankstable,x
|
||||
@@ -2030,37 +1803,65 @@ EndOfCredits
|
||||
rts
|
||||
.endp
|
||||
;-------------------------------------------------
|
||||
.proc PutTankNameOnScreen
|
||||
;-------------------------------------------------
|
||||
; puts name of the tank on the screen
|
||||
ldy #$00
|
||||
; lda TankNr
|
||||
txa ; TankNr in X !
|
||||
asl
|
||||
asl
|
||||
asl ; 8 chars per name
|
||||
tax
|
||||
NextChar02
|
||||
lda tanksnames,x
|
||||
sta statusBuffer+7,y
|
||||
inx
|
||||
iny
|
||||
cpy #$08
|
||||
bne NextChar02
|
||||
;=========================
|
||||
; displaying number of active controller port or AI level
|
||||
;=========================
|
||||
ldx TankNr
|
||||
ldy #$5e ; Computer symbol
|
||||
lda SkillTable,x
|
||||
tax
|
||||
bne ThisIsAI
|
||||
ldy #$0a ; Joystick symbol
|
||||
ldx JoystickNumber
|
||||
inx ; tricky
|
||||
ThisIsAI
|
||||
sty statusBuffer+16
|
||||
lda digits,x
|
||||
sta statusBuffer+17
|
||||
; rts
|
||||
.endp
|
||||
;-------------------------------------------------
|
||||
.proc DisplayStatus
|
||||
;-------------------------------------------------
|
||||
|
||||
; displaying number of active controller port
|
||||
ldy JoystickNumber
|
||||
lda digits+1,y
|
||||
sta statusBuffer+17
|
||||
;---------------------
|
||||
;displaying symbol of the weapon
|
||||
;---------------------
|
||||
;display name and symbol of the weapon
|
||||
;statusBuffer+18 - symbol (1 char)
|
||||
;statusBuffer+20 - quantity left
|
||||
;statusBuffer+23 - name
|
||||
ldx TankNr
|
||||
|
||||
;=========================
|
||||
;displaying symbol of the weapon
|
||||
;=========================
|
||||
ldy ActiveWeapon,x
|
||||
lda WeaponSymbols,y
|
||||
sta statusBuffer+19
|
||||
|
||||
;---------------------
|
||||
;=========================
|
||||
;displaying quantity of the given weapon
|
||||
;---------------------
|
||||
;=========================
|
||||
lda ActiveWeapon,x
|
||||
jsr HowManyBullets
|
||||
sta decimal
|
||||
mwa #statusBuffer+21 displayposition
|
||||
jsr displaybyte
|
||||
|
||||
;---------------------
|
||||
;=========================
|
||||
;displaying name of the weapon
|
||||
;---------------------
|
||||
;=========================
|
||||
ldx TankNr
|
||||
lda ActiveWeapon,x
|
||||
sta temp ;get back number of the weapon
|
||||
@@ -2080,9 +1881,9 @@ EndOfCredits
|
||||
dey
|
||||
bpl @-
|
||||
|
||||
;---------------------
|
||||
;=========================
|
||||
;displaying name of the defence weapon (if active)
|
||||
;---------------------
|
||||
;=========================
|
||||
lda AutoDefenseFlag,x ; Auto Defense symbol (space or "A" in inverse)
|
||||
bpl @+
|
||||
lda #$5e ; Auto Defense symbol
|
||||
@@ -2119,19 +1920,17 @@ ClearingOnly
|
||||
dey
|
||||
bpl @-
|
||||
|
||||
;---------------------
|
||||
;=========================
|
||||
;displaying the energy of a tank
|
||||
;---------------------
|
||||
|
||||
;=========================
|
||||
lda Energy,x
|
||||
|
||||
sta decimal
|
||||
mwa #statusBuffer+48 displayposition
|
||||
jsr displaybyte
|
||||
|
||||
;---------------------
|
||||
;=========================
|
||||
;displaying the energy of a tank shield (if exist)
|
||||
;---------------------
|
||||
;=========================
|
||||
; clear (if no shield)
|
||||
lda #space
|
||||
sta statusBuffer+40+10
|
||||
@@ -2155,17 +1954,20 @@ NoDefenceWeapon
|
||||
NoShieldEnergy
|
||||
|
||||
;=========================
|
||||
;display Wind
|
||||
; display Wind
|
||||
;=========================
|
||||
mwa Wind temp
|
||||
lda Wind+3 ; highest byte of 4 byte wind
|
||||
lda #space
|
||||
bit Wind+3 ; highest byte of 4 byte wind
|
||||
bmi DisplayLeftWind
|
||||
sta statusBuffer+80+17 ; (space) char
|
||||
lda #$7f ; (tab) char
|
||||
sta statusBuffer+80+20
|
||||
lda #space
|
||||
sta statusBuffer+80+17
|
||||
beq DisplayWindValue
|
||||
bne DisplayWindValue
|
||||
DisplayLeftWind
|
||||
sta statusBuffer+80+20 ; (space) char
|
||||
lda #$7e ;(del) char
|
||||
sta statusBuffer+80+17
|
||||
sec ; Wind = -Wind
|
||||
lda #$00
|
||||
sbc temp
|
||||
@@ -2173,10 +1975,6 @@ DisplayLeftWind
|
||||
lda #$00
|
||||
sbc temp+1
|
||||
sta temp+1
|
||||
lda #$7e ;(del) char
|
||||
sta statusBuffer+80+17
|
||||
lda #space
|
||||
sta statusBuffer+80+20
|
||||
DisplayWindValue
|
||||
:4 lsrw temp ;divide by 16 to have a nice value on a screen
|
||||
lda temp
|
||||
@@ -2207,6 +2005,7 @@ DisplayWindValue
|
||||
;display Angle
|
||||
;=========================
|
||||
displayAngle
|
||||
ldy #space
|
||||
ldx TankNr
|
||||
lda AngleTable,x
|
||||
cmp #90
|
||||
@@ -2215,28 +2014,25 @@ displayAngle
|
||||
AngleToRight
|
||||
; now we have values from 0 to 89 and right angle
|
||||
sta decimal
|
||||
sty statusBuffer+40+22 ; (space) character
|
||||
lda #$7f ; (tab) character
|
||||
sta statusBuffer+40+25
|
||||
lda #space
|
||||
sta statusBuffer+40+22
|
||||
beq AngleDisplay
|
||||
bne AngleDisplay
|
||||
AngleToLeft
|
||||
sec
|
||||
lda #180
|
||||
sbc AngleTable,x
|
||||
; angles 180 - 91 converted to 0 - 89
|
||||
sta decimal
|
||||
sty statusBuffer+40+25 ; (space) character
|
||||
lda #$7e ;(del) char
|
||||
sta statusBuffer+40+22
|
||||
lda #space
|
||||
sta statusBuffer+40+25
|
||||
beq AngleDisplay
|
||||
bne AngleDisplay
|
||||
VerticallyUp
|
||||
; now we have value 90
|
||||
sta decimal
|
||||
lda #space
|
||||
sta statusBuffer+40+25
|
||||
sta statusBuffer+40+22
|
||||
sty statusBuffer+40+25 ; (space) character
|
||||
sty statusBuffer+40+22 ; (space) character
|
||||
|
||||
AngleDisplay
|
||||
mwa #statusBuffer+40+23 displayposition
|
||||
@@ -2245,24 +2041,6 @@ AngleDisplay
|
||||
rts
|
||||
.endp
|
||||
;-------------------------------------------------
|
||||
.proc PutTankNameOnScreen
|
||||
; puts name of the tank on the screen
|
||||
ldy #$00
|
||||
lda TankNr
|
||||
asl
|
||||
asl
|
||||
asl ; 8 chars per name
|
||||
tax
|
||||
NextChar02
|
||||
lda tanksnames,x
|
||||
sta statusBuffer+7,y
|
||||
inx
|
||||
iny
|
||||
cpy #$08
|
||||
bne NextChar02
|
||||
rts
|
||||
.endp
|
||||
;-------------------------------------------------
|
||||
.proc RoundOverSprites
|
||||
; fill sprites with bytes
|
||||
ldy numberOfPlayers
|
||||
@@ -0,0 +1,708 @@
|
||||
.IF *>0 ;this is a trick that prevents compiling this file alone
|
||||
|
||||
; Basic hardware-dependent graphics routines.
|
||||
|
||||
; -----------------------------------------
|
||||
.proc unPlot
|
||||
; plots a point and saves the plotted byte, reverts the previous plot.
|
||||
; -----------------------------------------
|
||||
ldx #0 ; only one pixel
|
||||
unPlotAfterX
|
||||
stx WhichUnPlot
|
||||
|
||||
; first remake the oldie
|
||||
lda oldplotL,x
|
||||
sta oldplot
|
||||
lda oldplotH,x
|
||||
sta oldplot+1
|
||||
|
||||
ldy #0
|
||||
lda oldora,x
|
||||
sta (oldplot),y
|
||||
|
||||
|
||||
; is it not out of the screen ????
|
||||
cpw ydraw #screenheight
|
||||
jcc CheckX
|
||||
mwa #0 ydraw
|
||||
CheckX
|
||||
cpw xdraw #screenwidth
|
||||
jcs EndOfUnPlot
|
||||
MakeUnPlot
|
||||
; let's count coordinates taken from xdraw and ydraw
|
||||
lda xdraw
|
||||
and #%11111000
|
||||
;sta xbyte
|
||||
;---
|
||||
ldx ydraw
|
||||
clc
|
||||
adc linetableL,x
|
||||
sta xbyte
|
||||
sta oldplot
|
||||
lda linetableH,x
|
||||
adc xdraw+1
|
||||
sta xbyte+1
|
||||
sta oldplot+1
|
||||
|
||||
lda xdraw
|
||||
and #$7
|
||||
tax
|
||||
ldy #0
|
||||
|
||||
lda color
|
||||
bne ClearUnPlot
|
||||
|
||||
;plotting here
|
||||
lda (xbyte),y
|
||||
sta OldOraTemp
|
||||
ora bittable,x
|
||||
sta (xbyte),y
|
||||
bne ContinueUnPlot ; allways <>0
|
||||
ClearUnPlot
|
||||
lda (xbyte),y
|
||||
sta OldOraTemp
|
||||
and bittable2,x
|
||||
sta (xbyte),y
|
||||
ContinueUnPlot
|
||||
ldx WhichUnPlot
|
||||
lda OldOraTemp
|
||||
sta oldora,x
|
||||
lda oldplot
|
||||
sta oldplotL,x
|
||||
lda oldplot+1
|
||||
sta oldplotH,x
|
||||
; and now we must solve the problem of several plots
|
||||
; in one byte
|
||||
ldx #4
|
||||
ldy WhichUnPlot
|
||||
LetsCheckOverlapping
|
||||
cpx WhichUnPlot
|
||||
beq SkipThisPlot
|
||||
lda oldplotL,x
|
||||
cmp oldplotL,y
|
||||
bne NotTheSamePlot
|
||||
lda oldplotH,x
|
||||
cmp oldplotH,y
|
||||
bne NotTheSamePlot
|
||||
; the pixel is in the same byte so let's take correct contents
|
||||
lda oldora,x
|
||||
sta oldora,y
|
||||
NotTheSamePlot
|
||||
SkipThisPlot
|
||||
dex
|
||||
bpl LetsCheckOverlapping
|
||||
EndOfUnPlot
|
||||
rts
|
||||
.endp
|
||||
|
||||
; -----------------------------------------
|
||||
.proc plot ;plot (xdraw, ydraw, color)
|
||||
; color == 1 --> put pixel
|
||||
; color == 0 --> erase pixel
|
||||
; this is one of the most important routines in the whole
|
||||
; game. If you are going to speed up the game, start with
|
||||
; plot - it is used by every single effect starting from explosions
|
||||
; through line drawing and small text output!!!
|
||||
;
|
||||
; Optimized by 0xF (Fox) THXXXX!!!
|
||||
|
||||
; -----------------------------------------
|
||||
; is it not over the screen ???
|
||||
cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1)
|
||||
bcs unPlot.EndOfUnPlot ;nearest RTS
|
||||
CheckX02
|
||||
cpw xdraw #screenwidth
|
||||
bcs EndOfPlot
|
||||
MakePlot
|
||||
; let's calculate coordinates from xdraw and ydraw
|
||||
|
||||
lda xdraw
|
||||
and #%11111000
|
||||
;sta xbyte
|
||||
;---
|
||||
ldx ydraw
|
||||
clc
|
||||
adc linetableL,x
|
||||
sta xbyte
|
||||
lda linetableH,x
|
||||
adc xdraw+1
|
||||
sta xbyte+1
|
||||
|
||||
lda xdraw
|
||||
and #$7
|
||||
tax
|
||||
ldy #0
|
||||
lda color
|
||||
bne ClearPlot
|
||||
|
||||
lda (xbyte),y
|
||||
ora bittable,x
|
||||
sta (xbyte),y
|
||||
EndOfPlot
|
||||
rts
|
||||
ClearPlot
|
||||
lda (xbyte),y
|
||||
and bittable2,x
|
||||
sta (xbyte),y
|
||||
rts
|
||||
.endp
|
||||
|
||||
; -----------------------------------------
|
||||
.proc point_plot
|
||||
; -----------------------------------------
|
||||
; checks state of the pixel (coordinates in xdraw and ydraw)
|
||||
; result is in A (zero or appropriate bit is set)
|
||||
|
||||
; let's calculate coordinates from xdraw and ydraw
|
||||
|
||||
lda xdraw
|
||||
and #%11111000
|
||||
;sta xbyte
|
||||
;---
|
||||
ldx ydraw
|
||||
clc
|
||||
adc linetableL,x
|
||||
sta xbyte
|
||||
lda linetableH,x
|
||||
adc xdraw+1
|
||||
sta xbyte+1
|
||||
|
||||
lda xdraw
|
||||
and #$7
|
||||
tax
|
||||
ldy #0
|
||||
lda (xbyte),y
|
||||
eor #$ff
|
||||
and bittable,x
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc drawmountains
|
||||
;--------------------------------------------------
|
||||
mwa #0 xdraw
|
||||
mwa #mountaintable modify
|
||||
mva #1 color
|
||||
|
||||
drawmountainsloop
|
||||
ldy #0
|
||||
lda (modify),y
|
||||
cmp #screenheight
|
||||
beq NoMountain
|
||||
sta ydraw
|
||||
sty ydraw+1
|
||||
.IF FASTER_GRAF_PROCS = 1
|
||||
; there was Drawline proc
|
||||
lda #screenheight
|
||||
sec
|
||||
sbc ydraw
|
||||
sta tempbyte01
|
||||
jsr plot.MakePlot
|
||||
; X - index in bittable (number of bit) and nothing more (for use) in C64 :)
|
||||
; jmp IntoDraw ; jumps inside Draw routine
|
||||
; because one pixel is already plotted (and who cares? :) )
|
||||
@
|
||||
lda (xbyte),y
|
||||
and bittable2,x
|
||||
sta (xbyte),y
|
||||
;IntoDraw
|
||||
inc ydraw
|
||||
lda xdraw
|
||||
and #%11111000
|
||||
;sta xbyte
|
||||
;---
|
||||
ldy ydraw
|
||||
clc
|
||||
adc linetableL,y
|
||||
sta xbyte
|
||||
lda linetableH,y
|
||||
adc xdraw+1
|
||||
sta xbyte+1
|
||||
ldy #0
|
||||
dec tempbyte01
|
||||
bne @-
|
||||
; end of Drawline proc
|
||||
.ELSE
|
||||
; there was Drawline proc
|
||||
drawline
|
||||
jsr plot.MakePlot
|
||||
inc ydraw
|
||||
lda ydraw
|
||||
cmp #screenheight
|
||||
bne drawline
|
||||
; end of Drawline proc
|
||||
.ENDIF
|
||||
NoMountain
|
||||
inw modify
|
||||
inw xdraw
|
||||
cpw xdraw #screenwidth
|
||||
bne drawmountainsloop
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc TypeChar
|
||||
; puts char on the graphics screen
|
||||
; in: CharCode
|
||||
; in: left LOWER corner of the char coordinates (xdraw, ydraw)
|
||||
;--------------------------------------------------
|
||||
; char to the table
|
||||
lda CharCode
|
||||
sta fontind
|
||||
lda #$00
|
||||
sta fontind+1
|
||||
; char intex times 8
|
||||
aslw fontind
|
||||
rolw fontind
|
||||
rolw fontind
|
||||
|
||||
adw fontind #TankFont
|
||||
|
||||
; and 8 bytes to the table
|
||||
ldy #7
|
||||
CopyChar
|
||||
lda (fontind),y
|
||||
eor #$ff
|
||||
sta char1,y
|
||||
lda #$ff
|
||||
sta char2,y
|
||||
dey
|
||||
bpl CopyChar
|
||||
; and 8 subsequent bytes as a mask
|
||||
adw fontind #8
|
||||
ldy #7
|
||||
CopyMask
|
||||
lda (fontind),y
|
||||
eor #$ff
|
||||
sta mask1,y
|
||||
lda #$00
|
||||
sta mask2,y
|
||||
dey
|
||||
bpl CopyMask
|
||||
|
||||
.IF FASTER_GRAF_PROCS = 1
|
||||
; mask preparation and character shifting
|
||||
lda xdraw
|
||||
and #$7
|
||||
tax
|
||||
beq MaskOK00
|
||||
MakeMask00
|
||||
.rept 8
|
||||
lsr mask1+#
|
||||
ror mask2+#
|
||||
.endr
|
||||
sec
|
||||
.rept 8
|
||||
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
|
||||
ror char2+#
|
||||
.endr
|
||||
dex
|
||||
bne MakeMask00
|
||||
MaskOK00
|
||||
lda ydraw
|
||||
sec
|
||||
sbc #7
|
||||
sta ydraw
|
||||
; X = 0 !
|
||||
lda Erase
|
||||
beq CharLoopi ; it works, because x=0
|
||||
lda #$ff
|
||||
ldx #7
|
||||
EmptyChar
|
||||
sta char1,x
|
||||
sta char2,x
|
||||
dex
|
||||
bpl EmptyChar
|
||||
ldx #0
|
||||
CharLoopi
|
||||
; calculating coordinates from xdraw and ydraw
|
||||
ldy ydraw
|
||||
lda xdraw
|
||||
and #%11111000
|
||||
clc
|
||||
adc linetableL,y
|
||||
sta xbyte
|
||||
lda linetableH,y
|
||||
adc xdraw+1
|
||||
sta xbyte+1
|
||||
;--
|
||||
ldy #0
|
||||
lda (xbyte),y
|
||||
ora mask1,x
|
||||
and char1,x
|
||||
sta (xbyte),y
|
||||
ldy #8
|
||||
lda (xbyte),y
|
||||
ora mask2,x
|
||||
and char2,x
|
||||
sta (xbyte),y
|
||||
inc ydraw
|
||||
inx
|
||||
cpx #8
|
||||
bne CharLoopi
|
||||
.ELSE
|
||||
mvx #7 temp ; line counter (Y)
|
||||
CharLoop1
|
||||
mva #7 temp+1 ; pixel counter (X)
|
||||
CharLoop2
|
||||
mva #0 color
|
||||
rol mask1,x
|
||||
bcc NoMaskNoPlot
|
||||
rol char1,x
|
||||
bcs NoPlot
|
||||
MakeCharPlot
|
||||
lda Erase
|
||||
bne ErasingChar
|
||||
inc color
|
||||
ErasingChar
|
||||
NoPlot
|
||||
jsr plot.MakePlot
|
||||
AfterCharPlot
|
||||
inw xdraw
|
||||
ldx temp
|
||||
dec temp+1
|
||||
bpl CharLoop2
|
||||
sec
|
||||
sbw xdraw #8
|
||||
dec ydraw
|
||||
ldx temp
|
||||
dex
|
||||
stx temp
|
||||
bpl CharLoop1
|
||||
clc
|
||||
lda ydraw
|
||||
adc #8
|
||||
sta ydraw
|
||||
bne EndPutChar
|
||||
NoMaskNoPlot
|
||||
rol char1,x
|
||||
jmp AfterCharPlot
|
||||
.ENDIF
|
||||
EndPutChar
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc PutChar4x4
|
||||
; puts 4x4 pixels char on the graphics screen
|
||||
; in: dx, dy (LOWER left corner of the char)
|
||||
; in: CharCode4x4 (.sbyte)
|
||||
; in: plot4x4color (0/255)
|
||||
; all pixels are being drawn
|
||||
; (empty and not empty)
|
||||
;--------------------------------------------------
|
||||
cpw dy #(screenheight-1)
|
||||
jcs TypeChar.EndPutChar ;nearest RTS
|
||||
cpw dy #(4)
|
||||
jcc TypeChar.EndPutChar ;nearest RTS
|
||||
cpw dx #(screenwidth-4)
|
||||
jcs TypeChar.EndPutChar ;nearest RTS
|
||||
; checks ommited.
|
||||
; char to the table
|
||||
lda CharCode4x4
|
||||
and #%00000001
|
||||
beq Upper4bits
|
||||
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
|
||||
Upper4bits
|
||||
sta nibbler4x4
|
||||
lda CharCode4x4
|
||||
lsr
|
||||
sta fontind
|
||||
lda #$00
|
||||
sta fontind+1
|
||||
|
||||
adw fontind #font4x4
|
||||
|
||||
; and 4 bytes to the table
|
||||
ldy #0
|
||||
ldx #3
|
||||
CopyChar
|
||||
lda (fontind),y ; Y must be 0 !!!!
|
||||
bit nibbler4x4
|
||||
bpl GetUpper4bits
|
||||
:4 rol
|
||||
GetUpper4bits
|
||||
ora #$0f
|
||||
sta char1,x
|
||||
lda #$ff
|
||||
sta char2,x
|
||||
; and 4 bytes as a mask
|
||||
lda #$f0
|
||||
sta mask1,x
|
||||
lda #$00
|
||||
sta mask2,x
|
||||
adw fontind #32 ; next byte of 4x4 font
|
||||
dex
|
||||
bpl CopyChar
|
||||
|
||||
.IF FASTER_GRAF_PROCS = 1
|
||||
; mask preparation and character shifting
|
||||
lda dx
|
||||
and #$7
|
||||
tax
|
||||
beq MaskOK01
|
||||
MakeMask01
|
||||
.rept 4
|
||||
lsr mask1+#
|
||||
ror mask2+#
|
||||
.endr
|
||||
sec
|
||||
.rept 4
|
||||
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
|
||||
ror char2+#
|
||||
.endr
|
||||
dex
|
||||
bne MakeMask01
|
||||
MaskOK01
|
||||
lda dy
|
||||
sec
|
||||
sbc #3
|
||||
sta dy
|
||||
ldx #0
|
||||
CharLoopi4x4
|
||||
; calculating coordinates from xdraw and ydraw
|
||||
ldy dy
|
||||
lda dx
|
||||
and #%11111000
|
||||
clc
|
||||
adc linetableL,y
|
||||
sta xbyte
|
||||
lda linetableH,y
|
||||
adc dx+1
|
||||
sta xbyte+1
|
||||
;--
|
||||
ldy #0
|
||||
lda (xbyte),y
|
||||
ora mask1,x
|
||||
bit plot4x4color
|
||||
bpl PutInColor0_1 ; only mask - no char
|
||||
and char1,x
|
||||
PutInColor0_1
|
||||
sta (xbyte),y
|
||||
ldy #8
|
||||
lda (xbyte),y
|
||||
ora mask2,x
|
||||
bit plot4x4color
|
||||
bpl PutInColor0_2 ; only mask - no char
|
||||
and char2,x
|
||||
PutInColor0_2
|
||||
sta (xbyte),y
|
||||
inc dy
|
||||
inx
|
||||
cpx #4
|
||||
bne CharLoopi4x4
|
||||
.ELSE
|
||||
mwa xdraw char2
|
||||
mwa ydraw mask2
|
||||
mva color mask2+2
|
||||
mwa dx xdraw
|
||||
mwa dy ydraw
|
||||
mvx #3 temp ; line counter (Y)
|
||||
CharLoop1
|
||||
mva #3 temp+1 ; pixel counter (X)
|
||||
CharLoop2
|
||||
mva #0 color
|
||||
rol mask1,x
|
||||
bcc NoMaskNoPlot
|
||||
rol char1,x
|
||||
bcs NoPlot
|
||||
MakeCharPlot
|
||||
lda plot4x4color
|
||||
beq ErasingChar
|
||||
inc color
|
||||
ErasingChar
|
||||
NoPlot
|
||||
jsr plot.MakePlot
|
||||
AfterCharPlot
|
||||
inw xdraw
|
||||
ldx temp
|
||||
dec temp+1
|
||||
bpl CharLoop2
|
||||
sec
|
||||
sbw xdraw #4
|
||||
dec ydraw
|
||||
ldx temp
|
||||
dex
|
||||
stx temp
|
||||
bpl CharLoop1
|
||||
mwa char2 xdraw
|
||||
mwa mask2 ydraw
|
||||
mva mask2+2 color
|
||||
bpl EndPut4x4
|
||||
NoMaskNoPlot
|
||||
rol char1,x
|
||||
jmp AfterCharPlot
|
||||
.ENDIF
|
||||
EndPut4x4
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc ClearScreen
|
||||
;--------------------------------------------------
|
||||
mwa #displayC64 temp
|
||||
ldy #0
|
||||
@ lda #$ff
|
||||
sta (temp),y
|
||||
inw temp
|
||||
cpw temp #displayC64+screenheight*screenBytes+1
|
||||
bne @-
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc GenerateLineTable
|
||||
|
||||
mwa #displayC64 temp
|
||||
mwa #linetableL temp2
|
||||
mwa #linetableH modify
|
||||
ldy #0
|
||||
ldx #0
|
||||
@ lda temp
|
||||
sta (temp2),y
|
||||
lda temp+1
|
||||
sta (modify),y
|
||||
cpx #7
|
||||
bne NotChar
|
||||
ldx #0
|
||||
adw temp #(320-7)
|
||||
jmp next8lines
|
||||
NotChar
|
||||
inw temp
|
||||
inx
|
||||
next8lines
|
||||
iny
|
||||
cpy #screenheight+1
|
||||
bne @-
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc SetMainScreen
|
||||
lda #$b ; Grey background and border
|
||||
lda WallsType
|
||||
:4 rol
|
||||
sta $d020
|
||||
sta $d021
|
||||
|
||||
lda $dd00 ; Set video bank to start at 0
|
||||
and #252
|
||||
ora #3
|
||||
sta $dd00
|
||||
lda #$18
|
||||
sta $d018
|
||||
|
||||
; SwitchVICBank(0)
|
||||
; SetScreenMemory($2000)
|
||||
SetHiresBitmapMode ; Hires mode on
|
||||
lda #$00
|
||||
sta 53281
|
||||
; clear color RAM
|
||||
ldx #0
|
||||
@ lda #1
|
||||
sta $d800,x
|
||||
sta $d900,x
|
||||
sta $da00,x
|
||||
sta $db00,x
|
||||
lda #$0f
|
||||
sta $0400,x
|
||||
sta $0500,x
|
||||
sta $0600,x
|
||||
sta $0700,x
|
||||
inx
|
||||
bne @-
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
|
||||
|
||||
; ******* This is weapon .... but ... *******
|
||||
; -------------------------------------------------
|
||||
.proc AtomicWinter
|
||||
; -------------------------------------------------
|
||||
; This routine is run from inside of the main loop
|
||||
; and replaces Shoot and Flight routines
|
||||
; X and TankNr - index of shooting tank
|
||||
; -------------------------------------------------
|
||||
mva #sfx_sandhog sfx_effect
|
||||
.IF FASTER_GRAF_PROCS = 1
|
||||
mvy #0 magic ; byte counter (from 0 to 39)
|
||||
NextColumn
|
||||
; big loop - we repat internal loops for each column of bytes
|
||||
ldx #120 ; line counter (from 0 to 60 )
|
||||
; first loop - inverse column of bytes for a while
|
||||
NextLine1
|
||||
jsr InverseScreenByte
|
||||
dex
|
||||
dex
|
||||
bpl NextLine1
|
||||
;
|
||||
jsr WaitOneFrame ; wait uses A only
|
||||
; second loop - inverse again and put random "snow" to column of bytes
|
||||
ldx #120
|
||||
mva #$55 magic+1
|
||||
NextLine2
|
||||
jsr InverseScreenByte
|
||||
lda random
|
||||
ora magic+1
|
||||
and (temp),y
|
||||
sta (temp),y
|
||||
lda magic+1
|
||||
eor #$ff
|
||||
sta magic+1
|
||||
dex
|
||||
dex
|
||||
bpl NextLine2
|
||||
; and go to next column
|
||||
inc magic
|
||||
ldy magic
|
||||
cpy #40
|
||||
bne NextColumn
|
||||
.ELSE
|
||||
mva #1 color
|
||||
mwa #120 ydraw
|
||||
NextLineSlow
|
||||
lda #0
|
||||
sta xdraw
|
||||
sta xdraw+1
|
||||
NextPixelSlow
|
||||
bit random
|
||||
bpl NoPlot
|
||||
bvc NoPlot
|
||||
jsr plot.MakePlot
|
||||
NoPlot
|
||||
inw xdraw
|
||||
cpw xdraw #screenwidth
|
||||
bne NextPixelSlow
|
||||
dec ydraw
|
||||
dec ydraw
|
||||
bpl NextLineSlow
|
||||
.ENDIF
|
||||
; and we have "snow" :)
|
||||
lda #0
|
||||
ldx TankNr
|
||||
sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter
|
||||
jsr SetFullScreenSoilRange
|
||||
jmp SoilDown2.NoClearTanks
|
||||
; rts
|
||||
|
||||
; in order to optimize the fragment repeated in both internal loops
|
||||
; we save 15 bytes :)
|
||||
InverseScreenByte
|
||||
ldy magic
|
||||
sty temp
|
||||
ldy #0
|
||||
sty temp+1
|
||||
aslw temp
|
||||
rolw temp
|
||||
rolw temp
|
||||
lda temp
|
||||
adc LineTableL,x
|
||||
sta temp
|
||||
lda LineTableH,x
|
||||
adc temp+1
|
||||
sta temp+1
|
||||
lda (temp),y
|
||||
eor #$ff
|
||||
sta (temp),y
|
||||
rts
|
||||
.endp
|
||||
|
||||
.ENDIF
|
||||
@@ -0,0 +1,22 @@
|
||||
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
|
||||
|
||||
.IF *>0 ;this is a trick that prevents compiling this file alone
|
||||
|
||||
DLIinterruptGraph = 0
|
||||
;--------------------------------------------------
|
||||
.macro SetDLI
|
||||
; SetDLI #WORD
|
||||
; Initialises Display List Interrupts
|
||||
LDY # <:1
|
||||
LDX # >:1
|
||||
jsr _SetDLIproc
|
||||
.endm
|
||||
.proc _SetDLIproc
|
||||
; LDA #$C0
|
||||
; STY VDSLST
|
||||
; STX VDSLST+1
|
||||
; STA NMIEN
|
||||
rts
|
||||
.endp
|
||||
|
||||
.ENDIF
|
||||
@@ -0,0 +1,49 @@
|
||||
vic_spr0_x = $D000
|
||||
vic_spr0_y = $D001
|
||||
vic_spr1_x = $D002
|
||||
vic_spr1_y = $D003
|
||||
vic_spr2_x = $D004
|
||||
vic_spr2_y = $D005
|
||||
vic_spr3_x = $D006
|
||||
vic_spr3_y = $D007
|
||||
vic_spr4_x = $D008
|
||||
vic_spr4_y = $D009
|
||||
vic_spr5_x = $D00A
|
||||
vic_spr5_y = $D00B
|
||||
vic_spr6_x = $D00C
|
||||
vic_spr6_y = $D00D
|
||||
vic_spr7_x = $D00E
|
||||
vic_spr7_y = $D00F
|
||||
vic_spr_hi_x = $D010
|
||||
vic_cr1 = $D011
|
||||
vic_raster = $D012
|
||||
vic_lp_x = $D013
|
||||
vic_lp_y = $D014
|
||||
vic_spr_ena = $D015
|
||||
vic_cr2 = $D016
|
||||
vic_spr_exp_y = $D017
|
||||
vic_mem = $D018
|
||||
vic_irq = $D019
|
||||
vic_irq_ena = $D01A
|
||||
vic_spr_dp = $D01B
|
||||
vic_spr_mcolor = $D01C
|
||||
vic_spr_exp_x = $D01D
|
||||
vic_spr_ss_col = $D01E
|
||||
vic_spr_sd_col = $D01F
|
||||
vic_border = $D020
|
||||
vic_bg_color0 = $D021
|
||||
vic_bg_color1 = $D022
|
||||
vic_bg_color2 = $D023
|
||||
vic_bg_color3 = $D024
|
||||
vic_spr_color1 = $D025
|
||||
vic_spr_color2 = $D026
|
||||
vic_spr0_color = $D027
|
||||
vic_spr1_color = $D028
|
||||
vic_spr2_color = $D029
|
||||
vic_spr3_color = $D02A
|
||||
vic_spr4_color = $D02B
|
||||
vic_spr5_color = $D02C
|
||||
vic_spr6_color = $D02D
|
||||
vic_spr7_color = $D02E
|
||||
|
||||
RANDOM = $D41B
|
||||
@@ -0,0 +1,352 @@
|
||||
;****************************************************************************
|
||||
;* ATARI PERSONAL COMPUTER *
|
||||
;* SYSTEM EQUATES *
|
||||
;****************************************************************************
|
||||
|
||||
FAKEADDR EQU $0002
|
||||
|
||||
ATRACT EQU FAKEADDR
|
||||
RTCLOK EQU $12 ;REAL TIME CLOCK
|
||||
;
|
||||
; PAGE TWO RAM ASSIGNMENTS
|
||||
;
|
||||
VDSLST EQU FAKEADDR ;DSP LIST NMI VECTOR
|
||||
VPRCED EQU FAKEADDR ;PROCEED IRQ VECTOR
|
||||
VINTER EQU FAKEADDR ;INTERUPT IRQ VECTOR
|
||||
VBREAK EQU FAKEADDR ;BRK INST IRQ VECTOR
|
||||
VKEYBD EQU FAKEADDR ;POKEY KB IRQ VECTOR
|
||||
VSERIN EQU FAKEADDR ;POKEY INPUT RDY IRQ
|
||||
VSEROR EQU FAKEADDR ;POKEY OUTPUT RDY
|
||||
VSEROC EQU FAKEADDR ;POKEY OUTPUT DONE
|
||||
VTIMR1 EQU FAKEADDR ;POKEY TIMER 1 IRQ
|
||||
VTIMR2 EQU FAKEADDR ;POKEY TIMER 2 IRQ
|
||||
VTIMR4 EQU FAKEADDR ;POKEY TIMER 4 IRQ
|
||||
VIMIRQ EQU FAKEADDR ;IMMED IRQ VECTOR
|
||||
CDTMV1 EQU FAKEADDR ;COUNT DOWN TIMER 1
|
||||
CDTMV2 EQU FAKEADDR ;COUNT DOWN TIMER 2
|
||||
CDTMV3 EQU FAKEADDR ;COUNT DOWN TIMER 3
|
||||
CDTMV4 EQU FAKEADDR ;COUNT DOWN TIMER 4
|
||||
CDTMV5 EQU FAKEADDR ;COUNT DOWN TIMER 5
|
||||
VVBLKI EQU FAKEADDR ;IMM VBLK NMI VECTOR
|
||||
VVBLKD EQU FAKEADDR ;DEF VBLK NMI VECTOR
|
||||
CDTMA1 EQU FAKEADDR ;CDTMV1 JSR ADDRESS
|
||||
CDTMA2 EQU FAKEADDR ;CDTMV2 JSR ADDRESS
|
||||
CDTMF3 EQU FAKEADDR ;CDTMV3 FLAG
|
||||
SRTIMR EQU FAKEADDR ;SOFTWARE REPEAT TMR
|
||||
CDTMF4 EQU FAKEADDR ;CDTMV4 FLAG
|
||||
INTEMP EQU FAKEADDR ;IAN'S TEMP
|
||||
CDTMF5 EQU FAKEADDR ;CDTMV5 FLAG
|
||||
DMACTLS EQU FAKEADDR ;SAVE DMACTL REG
|
||||
DLPTRS EQU FAKEADDR ;SAVE DISP LIST LO
|
||||
;SDLSTH EQU $0231 ;SAVE DISP LIST HI
|
||||
SSKCTL EQU FAKEADDR ;SKCTL REGISTER RAM
|
||||
LCOUNT EQU FAKEADDR ;LOADER TEMP
|
||||
LPENH EQU FAKEADDR ;LIGHT PEN HORIZONTAL
|
||||
LPENV EQU FAKEADDR ;LIGHT PEN VERTICAL
|
||||
BRKKY EQU FAKEADDR ;BREAK KEY VECTOR
|
||||
RELADR EQU FAKEADDR ;LOADER REL ADDR
|
||||
CDEVIC EQU FAKEADDR ;COMMAND BUFFER-DEV
|
||||
CCOMND EQU FAKEADDR ;COMMAND BUFFER-CMND
|
||||
CAUX1 EQU FAKEADDR ;COMMAND BUFFER AUX1
|
||||
CAUX2 EQU FAKEADDR ;COMMAND BUFFER AUX2
|
||||
;TEMP EQU $023E ;TEMPORARY RAM CELL
|
||||
ERRFLG EQU FAKEADDR ;DEVICE ERROR FLAG
|
||||
DFLAGS EQU FAKEADDR ;DISK FLAGS(SECTOR1)
|
||||
DBSECT EQU FAKEADDR ;# DISK BOOT SECTORS
|
||||
BOOTAD EQU FAKEADDR ;DISK BOOT ADDRESS
|
||||
COLDST EQU FAKEADDR ;COLDSTART FLAG 1=CS
|
||||
RECLEN EQU FAKEADDR ;LOADER LENGTH
|
||||
DSKTIM EQU FAKEADDR ;DISK TIME OUT REG
|
||||
VSFLAG EQU FAKEADDR ;FINE SCROLL TEMP
|
||||
KEYDIS EQU FAKEADDR ;KEY DISABLE FLAG
|
||||
FINE EQU FAKEADDR ;FINE SCROLL ENABLE(A1200)
|
||||
GPRIOR EQU FAKEADDR ;GLOBAL PRIORITY
|
||||
PADDL0 EQU FAKEADDR ;POT 0 RAM CELL
|
||||
PADDL1 EQU FAKEADDR
|
||||
PADDL2 EQU FAKEADDR
|
||||
PADDL3 EQU FAKEADDR
|
||||
STICK0 EQU FAKEADDR ;JOYSTICK 0 RAM CELL
|
||||
STICK1 EQU FAKEADDR
|
||||
PTRIG0 EQU FAKEADDR ;PADDLE TRIGGER 0
|
||||
PTRIG1 EQU FAKEADDR
|
||||
PTRIG2 EQU FAKEADDR
|
||||
PTRIG3 EQU FAKEADDR
|
||||
STRIG0 EQU FAKEADDR ;JOYSTICK TRIGGER 0
|
||||
STRIG1 EQU FAKEADDR
|
||||
HIBYTE EQU FAKEADDR ;LOADER
|
||||
WMODE EQU FAKEADDR ;CASSETTE R/W MODE
|
||||
BLIM EQU FAKEADDR ;CASSETTE RECORD SIZE
|
||||
IMASK EQU FAKEADDR
|
||||
JVECK EQU FAKEADDR ;JUMP VECTOR
|
||||
NEWADR EQU FAKEADDR ;LOADER NEW ADDRESS
|
||||
TXTROW EQU FAKEADDR ;TEXT ROWCRS
|
||||
TXTCOL EQU FAKEADDR ;TEXT COLCRS
|
||||
TINDEX EQU FAKEADDR ;TEXT INDEX
|
||||
TXTMSC EQU FAKEADDR ;TEXT WINDOW MEM ADD
|
||||
TXTOLD EQU FAKEADDR ;TEXT OLDROW & COL
|
||||
CRETRY EQU FAKEADDR ;# COMMAND RETRIES
|
||||
HOLD3 EQU FAKEADDR
|
||||
SUBTMP EQU FAKEADDR
|
||||
HOLD2 EQU FAKEADDR
|
||||
DMASK EQU FAKEADDR ;PIXEL LOCATION MASK
|
||||
TMPLBT EQU FAKEADDR
|
||||
ESCFLG EQU FAKEADDR ;ESCAPE FLAG
|
||||
TABMAP EQU FAKEADDR ;TAB STOP MAP
|
||||
LOGMAP EQU FAKEADDR ;LINE START BIT MAP
|
||||
INVFLG EQU FAKEADDR ;INVERSE VIDEO FLAG
|
||||
FILFLG EQU FAKEADDR ;FILL FLAG FOR DRAW
|
||||
TMPROW EQU FAKEADDR
|
||||
TMPCOL EQU FAKEADDR
|
||||
SCRFLG EQU FAKEADDR ;SET IF SCROLLING
|
||||
HOLD4 EQU FAKEADDR ;TEMP USED BY DRAW
|
||||
DRETRY EQU FAKEADDR ;# OF DEVICE RETRIES
|
||||
SHFLOK EQU FAKEADDR ;SHIFT/CTL LOCK FLAG
|
||||
BOTSCR EQU FAKEADDR ;BOTTOM OF SCREEN
|
||||
PCOLR0 EQU FAKEADDR ;P0 COLOR
|
||||
PCOLR1 EQU FAKEADDR ;P1 COLOR
|
||||
PCOLR2 EQU FAKEADDR ;P2 COLOR
|
||||
PCOLR3 EQU FAKEADDR ;P3 COLOR
|
||||
COLOR0 EQU FAKEADDR ;COLOR 0
|
||||
COLOR1 EQU FAKEADDR
|
||||
COLOR2 EQU FAKEADDR
|
||||
COLOR3 EQU FAKEADDR
|
||||
COLOR4 EQU FAKEADDR
|
||||
COLBAKS EQU COLOR4
|
||||
CHBAS EQU FAKEADDR ;CHBAS REGISTER RAM
|
||||
;
|
||||
; COLLEEN MNEMONICS
|
||||
;
|
||||
; ---------------------------------------------------------------------------
|
||||
POKEY EQU FAKEADDR
|
||||
; ---------------------------------------------------------------------------
|
||||
;
|
||||
; READ
|
||||
;
|
||||
POT0 EQU POKEY+$00
|
||||
POT1 EQU POKEY+$00
|
||||
POT2 EQU POKEY+$00
|
||||
POT3 EQU POKEY+$00
|
||||
POT4 EQU POKEY+$00
|
||||
POT5 EQU POKEY+$00
|
||||
POT6 EQU POKEY+$00
|
||||
POT7 EQU POKEY+$00
|
||||
ALLPOT EQU POKEY+$00
|
||||
KBCODE EQU POKEY+$00
|
||||
; !!!!!
|
||||
;RANDOM EQU POKEY+$00
|
||||
;
|
||||
POTGO EQU POKEY+$00
|
||||
SERIN EQU POKEY+$00
|
||||
IRQST EQU POKEY+$00
|
||||
SKSTAT EQU POKEY+$00
|
||||
;
|
||||
; WRITE
|
||||
;
|
||||
AUDF1 EQU POKEY+$00
|
||||
AUDC1 EQU POKEY+$00
|
||||
AUDF2 EQU POKEY+$00
|
||||
AUDC2 EQU POKEY+$00
|
||||
AUDF3 EQU POKEY+$00
|
||||
AUDC3 EQU POKEY+$00
|
||||
AUDF4 EQU POKEY+$00
|
||||
AUDC4 EQU POKEY+$00
|
||||
AUDCTL EQU POKEY+$00
|
||||
STIMER EQU POKEY+$00
|
||||
SKRES EQU POKEY+$00
|
||||
SEROUT EQU POKEY+$00
|
||||
IRQEN EQU POKEY+$00
|
||||
SKCTL EQU POKEY+$00
|
||||
;
|
||||
;
|
||||
;
|
||||
; ---------------------------------------------------------------------------
|
||||
GTIA EQU FAKEADDR
|
||||
; ---------------------------------------------------------------------------
|
||||
;
|
||||
; WRITE
|
||||
;
|
||||
HPOSP0 EQU GTIA+$00
|
||||
HPOSP1 EQU GTIA+$00
|
||||
HPOSP2 EQU GTIA+$00
|
||||
HPOSP3 EQU GTIA+$00
|
||||
HPOSM0 EQU GTIA+$00
|
||||
HPOSM1 EQU GTIA+$00
|
||||
HPOSM2 EQU GTIA+$00
|
||||
HPOSM3 EQU GTIA+$00
|
||||
SIZEP0 EQU GTIA+$00
|
||||
SIZEP1 EQU GTIA+$00
|
||||
SIZEP2 EQU GTIA+$00
|
||||
SIZEP3 EQU GTIA+$00
|
||||
SIZEM EQU GTIA+$00
|
||||
GRAFP0 EQU GTIA+$00
|
||||
GRAFP1 EQU GTIA+$00
|
||||
GRAFP2 EQU GTIA+$00
|
||||
GRAFP3 EQU GTIA+$00
|
||||
GRAFM EQU GTIA+$00
|
||||
COLPM0 EQU GTIA+$00
|
||||
COLPM1 EQU GTIA+$00
|
||||
COLPM2 EQU GTIA+$00
|
||||
COLPM3 EQU GTIA+$00
|
||||
COLPF0 EQU GTIA+$00
|
||||
COLPF1 EQU GTIA+$00
|
||||
COLPF2 EQU GTIA+$00
|
||||
COLPF3 EQU GTIA+$00
|
||||
COLBAK EQU GTIA+$00
|
||||
PRIOR EQU GTIA+$00
|
||||
VDELAY EQU GTIA+$00
|
||||
GRACTL EQU GTIA+$00
|
||||
HITCLR EQU GTIA+$00
|
||||
CONSOL EQU GTIA+$00
|
||||
;
|
||||
; READ
|
||||
;
|
||||
M0PF EQU GTIA+$00
|
||||
M1PF EQU GTIA+$00
|
||||
M2PF EQU GTIA+$00
|
||||
M3PF EQU GTIA+$00
|
||||
P0PF EQU GTIA+$00
|
||||
P1PF EQU GTIA+$00
|
||||
P2PF EQU GTIA+$00
|
||||
P3PF EQU GTIA+$00
|
||||
M0PL EQU GTIA+$00
|
||||
M1PL EQU GTIA+$00
|
||||
M2PL EQU GTIA+$00
|
||||
M3PL EQU GTIA+$00
|
||||
P0PL EQU GTIA+$00
|
||||
P1PL EQU GTIA+$00
|
||||
P2PL EQU GTIA+$00
|
||||
P3PL EQU GTIA+$00
|
||||
TRIG0 EQU GTIA+$00
|
||||
TRIG1 EQU GTIA+$00
|
||||
TRIG2 EQU GTIA+$00
|
||||
TRIG3 EQU GTIA+$00
|
||||
PAL EQU GTIA+$00
|
||||
;
|
||||
;
|
||||
; ---------------------------------------------------------------------------
|
||||
ANTIC EQU FAKEADDR
|
||||
; ---------------------------------------------------------------------------
|
||||
;
|
||||
DMACTL EQU ANTIC+$00
|
||||
CHACTL EQU ANTIC+$00
|
||||
DLPTR EQU ANTIC+$00
|
||||
;DLISTH EQU ANTIC+$00
|
||||
HSCROL EQU ANTIC+$00
|
||||
VSCROL EQU ANTIC+$00
|
||||
PMBASE EQU ANTIC+$00
|
||||
CHBASE EQU ANTIC+$00
|
||||
WSYNC EQU ANTIC+$00
|
||||
; !!!!
|
||||
VCOUNT EQU ANTIC+$00
|
||||
; ----
|
||||
PENH EQU ANTIC+$00
|
||||
PENV EQU ANTIC+$00
|
||||
NMIEN EQU ANTIC+$00
|
||||
NMIRES EQU ANTIC+$00
|
||||
NMIST EQU ANTIC+$00
|
||||
;
|
||||
;
|
||||
; ---------------------------------------------------------------------------
|
||||
PIA EQU FAKEADDR
|
||||
; ---------------------------------------------------------------------------
|
||||
;
|
||||
PORTA EQU PIA+0
|
||||
PORTB EQU PIA+0
|
||||
PACTL EQU PIA+0
|
||||
PBCTL EQU PIA+0
|
||||
;
|
||||
; ---------------------------------------------------------------------------
|
||||
; 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
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; 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
|
||||
@@ -0,0 +1,296 @@
|
||||
|
||||
|
||||
|
||||
.macro basic_start(addr)
|
||||
|
||||
.word upstartEnd // link address
|
||||
.word 10 // line num
|
||||
.byte $9e // sys
|
||||
|
||||
?a=0
|
||||
?b=0
|
||||
?c=0
|
||||
?d=0
|
||||
?e=0
|
||||
|
||||
?v = %%addr
|
||||
|
||||
ift ?v>=10000
|
||||
?a=?v/10000
|
||||
?v=?v-(?a*10000)
|
||||
eif
|
||||
|
||||
ift ?v>=1000
|
||||
?b=?v/1000
|
||||
?v=?v-(?b*1000)
|
||||
eif
|
||||
|
||||
ift ?v>=100
|
||||
?c=?v/100
|
||||
?v=?v-(?c*100)
|
||||
eif
|
||||
|
||||
ift ?v>=10
|
||||
?d=?v/10
|
||||
?v=?v-(?d*10)
|
||||
eif
|
||||
|
||||
?e=?v%10
|
||||
|
||||
dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30
|
||||
|
||||
.byte 0
|
||||
upstartEnd
|
||||
.word 0 // empty link signals the end of the program
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
//
|
||||
// Switch bank in VIC-II
|
||||
//
|
||||
// Args:
|
||||
// bank: bank number to switch to. Valid values: 0-3.
|
||||
//
|
||||
.macro SwitchVICBank(bank)
|
||||
//
|
||||
// The VIC-II chip can only access 16K bytes at a time. In order to
|
||||
// have it access all of the 64K available, we have to tell it to look
|
||||
// at one of four banks.
|
||||
//
|
||||
// This is controller by bits 0 and 1 in $dd00 (PORT A of CIA #2).
|
||||
//
|
||||
// +------+-------+----------+-------------------------------------+
|
||||
// | BITS | BANK | STARTING | VIC-II CHIP RANGE |
|
||||
// | | | LOCATION | |
|
||||
// +------+-------+----------+-------------------------------------+
|
||||
// | 00 | 3 | 49152 | ($C000-$FFFF)* |
|
||||
// | 01 | 2 | 32768 | ($8000-$BFFF) |
|
||||
// | 10 | 1 | 16384 | ($4000-$7FFF)* |
|
||||
// | 11 | 0 | 0 | ($0000-$3FFF) (DEFAULT VALUE) |
|
||||
// +------+-------+----------+-------------------------------------+
|
||||
?bits=%11
|
||||
|
||||
ift (%%bank==0)
|
||||
?bits=%11
|
||||
eli (%%bank==1)
|
||||
?bits=%10
|
||||
eli (%%bank==2)
|
||||
?bits=%01
|
||||
eli (%%bank==3)
|
||||
?bits=%00
|
||||
eif
|
||||
|
||||
//
|
||||
// Set Data Direction for CIA #2, Port A to output
|
||||
//
|
||||
lda $dd02
|
||||
and #%11111100 // Mask the bits were interested in.
|
||||
ora #$03 // Set bits 0 and 1.
|
||||
sta $dd02
|
||||
|
||||
//
|
||||
// Tell VIC-II to switch to bank
|
||||
//
|
||||
lda $dd00
|
||||
and #%11111100
|
||||
ora #?bits
|
||||
sta $dd00
|
||||
.endm
|
||||
|
||||
|
||||
//
|
||||
// Enter hires bitmap mode (a.k.a. standard bitmap mode)
|
||||
//
|
||||
.macro SetHiresBitmapMode
|
||||
//
|
||||
// Clear extended color mode (bit 6) and set bitmap mode (bit 5)
|
||||
//
|
||||
lda $d011
|
||||
and #%10111111
|
||||
ora #%00100000
|
||||
sta $d011
|
||||
|
||||
//
|
||||
// Clear multi color mode (bit 4)
|
||||
//
|
||||
lda $d016
|
||||
and #%11101111
|
||||
sta $d016
|
||||
.endm
|
||||
|
||||
|
||||
//
|
||||
// Enter hires bitmap mode (a.k.a. standard bitmap mode)
|
||||
//
|
||||
.macro SetMulticolorBitmapMode
|
||||
//
|
||||
// Clear extended color mode (bit 6) and set bitmap mode (bit 5)
|
||||
//
|
||||
lda $d011
|
||||
and #%10111111
|
||||
ora #%00100000
|
||||
sta $d011
|
||||
|
||||
//
|
||||
// Clear multi color mode (bit 4)
|
||||
//
|
||||
lda $d016
|
||||
ora #%00010000
|
||||
sta $d016
|
||||
.endm
|
||||
|
||||
|
||||
//
|
||||
// Switch location of screen memory.
|
||||
//
|
||||
// Args:
|
||||
// address: Address relative to current VIC-II bank base address.
|
||||
// Valid values: $0000-$3c00. Must be a multiple of $0400.
|
||||
//
|
||||
.macro SetScreenMemory(address)
|
||||
//
|
||||
// The most significant nibble of $D018 selects where the screen is
|
||||
// located in the current VIC-II bank.
|
||||
//
|
||||
// +------------+-----------------------------+
|
||||
// | | LOCATION* |
|
||||
// | BITS +---------+-------------------+
|
||||
// | | DECIMAL | HEX |
|
||||
// +------------+---------+-------------------+
|
||||
// | 0000XXXX | 0 | $0000 |
|
||||
// | 0001XXXX | 1024 | $0400 (DEFAULT) |
|
||||
// | 0010XXXX | 2048 | $0800 |
|
||||
// | 0011XXXX | 3072 | $0C00 |
|
||||
// | 0100XXXX | 4096 | $1000 |
|
||||
// | 0101XXXX | 5120 | $1400 |
|
||||
// | 0110XXXX | 6144 | $1800 |
|
||||
// | 0111XXXX | 7168 | $1C00 |
|
||||
// | 1000XXXX | 8192 | $2000 |
|
||||
// | 1001XXXX | 9216 | $2400 |
|
||||
// | 1010XXXX | 10240 | $2800 |
|
||||
// | 1011XXXX | 11264 | $2C00 |
|
||||
// | 1100XXXX | 12288 | $3000 |
|
||||
// | 1101XXXX | 13312 | $3400 |
|
||||
// | 1110XXXX | 14336 | $3800 |
|
||||
// | 1111XXXX | 15360 | $3C00 |
|
||||
// +------------+---------+-------------------+
|
||||
//
|
||||
?bits = (%%address / $0400) << 4
|
||||
|
||||
lda $d018
|
||||
and #%00001111
|
||||
ora #?bits
|
||||
sta $d018
|
||||
.endm
|
||||
|
||||
|
||||
//
|
||||
// Set location of bitmap.
|
||||
//
|
||||
// Args:
|
||||
// address: Address relative to VIC-II bank address.
|
||||
// Valid values: $0000 (bitmap at $0000-$1FFF)
|
||||
// $2000 (bitmap at $2000-$3FFF)
|
||||
//
|
||||
.macro SetBitmapAddress(address)
|
||||
//
|
||||
// In standard bitmap mode the location of the bitmap area can
|
||||
// be set to either BANK address + $0000 or BANK address + $2000
|
||||
//
|
||||
// By setting bit 3, we can configure which of the locations to use.
|
||||
//
|
||||
|
||||
lda $d018
|
||||
|
||||
ift %%address == $0000
|
||||
and #%11110111
|
||||
eli %%address == $2000
|
||||
ora #%00001000
|
||||
eif
|
||||
|
||||
sta $d018
|
||||
.endm
|
||||
|
||||
//
|
||||
// Once this is done, random values appear in location $D41B (RANDOM)
|
||||
//
|
||||
.macro InitializeSIDrnd
|
||||
LDA #$FF ; maximum frequency value
|
||||
STA $D40E ; voice 3 frequency low byte
|
||||
STA $D40F ; voice 3 frequency high byte
|
||||
LDA #$80 ; noise waveform, gate bit off
|
||||
STA $D412 ; voice 3 control register
|
||||
.endm
|
||||
|
||||
;-------------------------------------
|
||||
.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 randomize
|
||||
;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 WAIT
|
||||
; WAIT
|
||||
; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
|
||||
?ze LDA $D012
|
||||
cmp #16 ; if line<16 then wait for line>15 (long VBI protection)
|
||||
bcc ?ze
|
||||
sbc #10 ; last lines correction
|
||||
?wa cmp $D012
|
||||
bcc ?wa
|
||||
?wf cmp $D012
|
||||
bcs ?wf
|
||||
.ENDM
|
||||
;-------------------------------------
|
||||
.macro halt
|
||||
?s jmp ?s
|
||||
.endm
|
||||
@@ -0,0 +1,333 @@
|
||||
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
|
||||
|
||||
|
||||
.IF *>0
|
||||
|
||||
WeaponsListDL = 0
|
||||
NamesOfLevels = 0
|
||||
;----------------------------------------
|
||||
; this module contains routines used in text mode
|
||||
; like shop and start-up options
|
||||
;----------------------------------------
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc Options
|
||||
;--------------------------------------------------
|
||||
; start-up screen - options, etc.
|
||||
; this function returns:
|
||||
; - number of players (NumberOfPlayers)
|
||||
; - money each player has on the beginning of the game (moneyL i moneyH)
|
||||
; - and I am sure maxwind, gravity, no_of_rounds in a game, speed of shell flight
|
||||
|
||||
|
||||
ldx #$08
|
||||
@ lda Autoplay_OptionsTable,x
|
||||
sta OptionsTable,x
|
||||
dex
|
||||
bpl @-
|
||||
|
||||
rts
|
||||
|
||||
Autoplay_OptionsTable .by 4,4,2,2,4,1,3,2,4
|
||||
|
||||
.endp
|
||||
|
||||
.proc SelectNextGradient
|
||||
lda OptionsY ; if "Wind" option selected
|
||||
cmp #$03
|
||||
bne NotWind
|
||||
lda WindChangeInRound ; wind change after each turn (not round only) flag
|
||||
eor #$1f ; '?' character
|
||||
sta WindChangeInRound
|
||||
rts
|
||||
NotWind
|
||||
ldy GradientNr
|
||||
iny
|
||||
cpy #$03
|
||||
bne NoGradientLoop
|
||||
ldy #$00
|
||||
NoGradientLoop
|
||||
sty GradientNr
|
||||
lda GradientAddrL,y
|
||||
sta GradientColors
|
||||
lda GradientAddrH,y
|
||||
sta GradientColors+1
|
||||
rts
|
||||
.endp
|
||||
|
||||
;-------------------------------------------
|
||||
; call of the purchase (and activate) screens for each tank
|
||||
.proc CallPurchaseForEveryTank
|
||||
|
||||
mva #0 TankNr
|
||||
sta isInventory
|
||||
@
|
||||
ldx TankNr
|
||||
lda SkillTable,x
|
||||
beq ManualPurchase
|
||||
jsr PurchaseAI ; remember to make ActivateAI :) !!!
|
||||
jmp AfterManualPurchase
|
||||
ManualPurchase
|
||||
lda JoyNumber,x
|
||||
sta JoystickNumber ; set joystick port for player
|
||||
mva #0 isInventory
|
||||
jsr Purchase ; purchase weapons
|
||||
bit escFlag
|
||||
spl:rts
|
||||
jsr DefensivesActivate ; activate weapons
|
||||
bit escFlag
|
||||
spl:rts
|
||||
AfterManualPurchase
|
||||
inc:lda TankNr
|
||||
cmp NumberOfPlayers
|
||||
bne @-
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc DefensivesActivate
|
||||
;--------------------------------------------------
|
||||
; This proc call Inventory and set Defensives activation first
|
||||
|
||||
mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons
|
||||
mva #$ff IsInventory
|
||||
mva #%10000000 WhichList
|
||||
; offensive weapon - 0, defensive - %10000000
|
||||
jmp Purchase.GoToActivation
|
||||
.endp
|
||||
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc Purchase ;
|
||||
;--------------------------------------------------
|
||||
; In tanknr there is a number of the tank (player)
|
||||
; that is buying weapons now (from 0).
|
||||
; Rest of the data is taken from appropriate tables
|
||||
; and during the purchase these tables are modified.
|
||||
|
||||
|
||||
; we are clearing list of the weapons
|
||||
mva #$00 WhichList
|
||||
; offensive weapon - 0, deffensive - %10000000
|
||||
GoToActivation
|
||||
rts
|
||||
|
||||
.endp
|
||||
|
||||
; -----------------------------------------------------
|
||||
.proc EnterPlayerNames
|
||||
;entering names of players
|
||||
|
||||
mva #0 TankNr
|
||||
sta COLBAKS ; set color of background
|
||||
@ tax
|
||||
lda TankStatusColoursTable,x
|
||||
sta COLOR2 ; set color of player name line
|
||||
jsr EnterPlayerName
|
||||
bit escFlag
|
||||
spl:rts
|
||||
jsr CheckTankCheat
|
||||
inc TankNr
|
||||
lda TankNr
|
||||
cmp NumberOfPlayers
|
||||
bne @-
|
||||
rts
|
||||
.endp
|
||||
; -----------------------------------------------------
|
||||
.proc EnterPlayerName
|
||||
; in: TankNr
|
||||
; Out: TanksNames, SkillTable
|
||||
|
||||
; this little thing is for choosing Player's skill (if computer)
|
||||
; and entering his name
|
||||
; If no name entered, there should be name "1st Tank", etc.
|
||||
; Default tanks names are in table TanksNamesDefault
|
||||
; -----------------------------------------------------
|
||||
|
||||
;
|
||||
|
||||
EndOfNick
|
||||
; storing name of the player and its level
|
||||
|
||||
; level of the computer opponent goes to
|
||||
; the table of levels (difficulties)
|
||||
ldx tanknr
|
||||
lda #6 ; Spoiler
|
||||
sta DifficultyLevel
|
||||
sta skilltable,x
|
||||
beq NotRobot
|
||||
lda #$03 ; shape for robotanks
|
||||
sta TankShape,x
|
||||
NotRobot
|
||||
; storing name of the tank in the right space
|
||||
; (without cursor!)
|
||||
ldy #$00
|
||||
txa ; ldx TankNr
|
||||
asl
|
||||
asl
|
||||
asl ; 8 chars per name
|
||||
tax ; in X where to put new name
|
||||
|
||||
mva #sfx_next_player sfx_effect
|
||||
|
||||
|
||||
; check if all chars are empty (" ")
|
||||
ldy #7
|
||||
lda #0
|
||||
@ ora #0 ; NameAdr,y
|
||||
and #$7F ; remove inverse (Cursor)
|
||||
dey
|
||||
bpl @-
|
||||
tay
|
||||
beq MakeDefaultName
|
||||
|
||||
ldy #0
|
||||
nextchar04
|
||||
lda #0 ; NameAdr,y
|
||||
and #$7f ; remove inverse (Cursor)
|
||||
sta tanksnames,x
|
||||
inx
|
||||
iny
|
||||
cpy #$08
|
||||
bne nextchar04
|
||||
rts
|
||||
MakeDefaultName
|
||||
nextchar05
|
||||
lda tanksnamesDefault,x
|
||||
sta tanksnames,x
|
||||
inx
|
||||
iny
|
||||
cpy #$08
|
||||
bne nextchar05
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc displaydec5 ;decimal (word), displayposition (word)
|
||||
;--------------------------------------------------
|
||||
; displays decimal number as in parameters (in text mode)
|
||||
; leading zeroes are removed
|
||||
; the range is (00000..65565 - two bytes)
|
||||
|
||||
ldy #4 ; there will be 5 digits
|
||||
NextDigit
|
||||
ldx #16 ; 16-bit dividee so Rotate 16 times
|
||||
lda #$00
|
||||
Rotate000
|
||||
aslw decimal
|
||||
rol ; scroll dividee
|
||||
; (as highest byte - additional - byte is A)
|
||||
cmp #10 ; divider
|
||||
bcc TooLittle000 ; if A is smaller than divider
|
||||
; there is nothing to substract
|
||||
sbc #10 ; divider
|
||||
inc decimal ; lowest bit set to 1
|
||||
; because it is 0 and this is the fastest way
|
||||
TooLittle000 dex
|
||||
bne Rotate000 ; and Rotate 16 times, Result will be in decimal
|
||||
tax ; and the rest in A
|
||||
; (and it goes to X because
|
||||
; it is our decimal digit)
|
||||
lda digits,x
|
||||
sta decimalresult,y
|
||||
dey
|
||||
bpl NextDigit ; Result again /10 and we have next digit
|
||||
|
||||
;rightnumber
|
||||
; displaying without leading zeroes (if zeroes exist then display space at this position)
|
||||
ldy #0
|
||||
ldx #0 ; digit flag (cut leading zeroes)
|
||||
displayloop
|
||||
lda decimalresult,y
|
||||
cpx #0
|
||||
bne noleading0
|
||||
cpy #4
|
||||
beq noleading0 ; if 00000 - last 0 must stay
|
||||
cmp zero
|
||||
bne noleading0
|
||||
lda #space
|
||||
beq displaychar ; space = 0 !
|
||||
noleading0
|
||||
inx ; set flag (no leading zeroes to cut)
|
||||
displaychar
|
||||
sta (displayposition),y
|
||||
nexdigit
|
||||
iny
|
||||
cpy #5
|
||||
bne displayloop
|
||||
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc displaybyte ;decimal (byte), displayposition (word)
|
||||
;--------------------------------------------------
|
||||
; displays decimal number as in parameters (in text mode)
|
||||
; leading zeores are removed
|
||||
; the range is (00..99 - one byte)
|
||||
|
||||
ldy #1 ; there will be 2 digits
|
||||
NextDigit2
|
||||
ldx #8 ; 8-bit dividee so Rotate 8 times
|
||||
lda #$00
|
||||
Rotate001
|
||||
asl decimal
|
||||
rol ; scroll dividee
|
||||
; (as highest byte - additional - byte is A)
|
||||
cmp #10 ; divider
|
||||
bcc TooLittle001 ; if A is smaller than divider
|
||||
; there is nothing to substract
|
||||
sbc #10 ; divider
|
||||
inc decimal ; because it is 0 and this is the fastest way
|
||||
TooLittle001 dex
|
||||
bne Rotate001 ; and Rotate 8 times, Result will be in decimal
|
||||
tax ; and the rest in A
|
||||
; (and it goes to X because
|
||||
; it is our decimal digit)
|
||||
lda digits,x
|
||||
sta decimalresult,y
|
||||
dey
|
||||
bpl NextDigit2 ; Result again /10 and we have next digit
|
||||
|
||||
; now cut leading zeroes (02 goes 2)
|
||||
lda decimalresult
|
||||
cmp zero
|
||||
bne decimalend1
|
||||
lda #space
|
||||
sta decimalresult
|
||||
|
||||
decimalend1
|
||||
; displaying
|
||||
ldy #1
|
||||
displayloop1
|
||||
lda decimalresult,y
|
||||
sta (displayposition),y
|
||||
dey
|
||||
bpl displayloop1
|
||||
|
||||
rts
|
||||
.endp
|
||||
;-------------------------------------------------
|
||||
.proc RoundOverSprites
|
||||
; fill sprites with bytes
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc GameOverScreen
|
||||
;--------------------------------------------------
|
||||
rts
|
||||
.endp
|
||||
;-------------------------------------------------
|
||||
.proc PutTankNameOnScreen
|
||||
;-------------------------------------------------
|
||||
|
||||
.endp
|
||||
;-------------------------------------------------
|
||||
.proc DisplayStatus
|
||||
;-------------------------------------------------
|
||||
DisplayAngle
|
||||
ldx TankNr
|
||||
rts
|
||||
.endp
|
||||
;-------------------------------------------------
|
||||
|
||||
|
||||
.endif
|
||||
@@ -3,12 +3,18 @@
|
||||
You can play using the keyboard (all functionality) or the joystick in the first port (all functionality necessary for gameplay).
|
||||
|
||||
## 1. Game Option Selection.
|
||||

|
||||
|
||||
On the first screen, you can configure gameplay options:
|
||||
* number of players (2 - 6) includes both human and computer-controlled players
|
||||
* the initial amount of cash of each player (2K is the optimal value we chose, but for short games, it is worth choosing a higher value)
|
||||
* gravity
|
||||
* maximum wind strength (wind is drawn at the beginning of each round or during the round between turns, here we can choose how strong it can be)
|
||||
* maximum wind strength (wind is drawn at the beginning of each round or during the round between turns, here we can choose how strong it can be):
|
||||
* 1B - maximum wind strength: 5
|
||||
* 3B - maximum wind strength: 20
|
||||
* 5B - maximum wind strength: 40
|
||||
* 7B - maximum wind strength: 70
|
||||
* 9B - maximum wind strength: 99
|
||||
* number of rounds in a game
|
||||
* missile speed (does not affect the flight path - only changes the apparent missile speed - does not change anything in the gameplay itself)
|
||||
* frequency of suicides :) - if for a number of turns the game has not recorded hits (tanks are constantly shooting inaccurately), after one of such misses a tank commits suicide - here you determine how long they can "shooting for the stars" :) - if only people play the optimal setting is "norm", in the case of computer-controlled players ... you choose.
|
||||
@@ -29,6 +35,7 @@ The [TAB] or [SELECT] key, and on the Atari 5200 console, the [5] controller key
|
||||
The [RETURN] key or a joystick button moves to the next screen.
|
||||
|
||||
## 2. Entering the name of players and selecting the level of computer-controlled players
|
||||

|
||||
|
||||
The second screen is shown for each player. Here you can use the cursor keys or joystick to select whether the tank will be driven by a human (HUMAN option) or a computer (other options).
|
||||
The [TAB] or [SELECT] key, and on the Atari 5200 console the [5] controller key allow you to choose which joystick port the player will use.
|
||||
@@ -40,20 +47,27 @@ The player's name can also be entered with the joystick. After pressing and hold
|
||||
If the name is not entered, it will be supplemented with the default name.
|
||||
|
||||
## 3. Shopping screen (before each round)
|
||||

|
||||

|
||||
|
||||
On this screen, you can make purchases of offensive and defensive weapons. Only those weapons that the player can afford are visible, along with information about the price and the number of units of a given weapon that will be obtained for that price. The information on the screen probably needs no more description. You move through the lists with the cursor keys (up and down) or with the joystick, the [TAB] key or the left arrow or the left joystick tilt change the screen to defensive or offensive weapons, the [SPACE] key or the right arrow and also the joystick to the right does the purchase of the indicated weapon.
|
||||
|
||||
The [RETURN] key or the joystick button press switches to the defensive weapon activation screen. Here you can activate previously bought defensive (or offensive after switching with [TAB], etc) weapons. This makes it possible to activate shields and others before the round starts.
|
||||
The [RETURN] key or the joystick button press switches to the defensive weapon activation screen. Here you can activate previously bought defensive (or offensive after switching with [TAB], etc) weapons.
|
||||
|
||||

|
||||
|
||||
This makes it possible to activate shields and others before the round starts.
|
||||
|
||||
Another [RETURN] key or joystick button press switches to the next player's shopping screen.
|
||||
(For computer players this screen is not shown.)
|
||||
|
||||
## 4. The main screen of the game
|
||||

|
||||
|
||||
The status line shows which player is currently allowed to take a shot and a set of other information:
|
||||
* player's tank name,
|
||||
* active joystick number
|
||||
* currently selected offensive weapon,
|
||||
* active joystick number or difficulty level of computer-controlled player (1-**Moron** - 8-**Unknown**),
|
||||
* currently selected offensive weapon (symbol quantity and name),
|
||||
* the player's remaining energy points and if he has an active defensive weapon that has its energy - in parentheses the energy level,
|
||||
* the angle and the direction of the barrel set by the player,
|
||||
* the shot strength set by the player (the maximum shot strength is limited by the player's energy - it can not exceed the energy * 10 . This means that you can fire weaker shots only when having a small amount of energy,
|
||||
@@ -67,7 +81,7 @@ The keyboard controls here are simple, cursor keys or joystick: left/right - cha
|
||||
| A800 | 5200 | function |
|
||||
| --- | --- | --- |
|
||||
| [SPACE] | [0] | or joystick button pressed briefly - firing a shot. |
|
||||
| [TAB] or [SELECT] | [5] | selection of offensive weapons (this option is not available directly with the joystick - you need to select Inventory). In the main menu it changes the mountain shading, indicated by the hill color change at the bottom of the screen. |
|
||||
| [TAB] or [SELECT] | [5] | selection of offensive weapons (this option is not available directly with the joystick - you need to select Inventory). |
|
||||
| [I] | [9] | or longer holding the joystick button - go to Inventory. It is a screen (actually two) with the same layout as the shopping menu, it also works similarly except that here you don't buy weapons, but choose one of the offensive ones to shoot or activate a defensive weapon. |
|
||||
| [A] or [OPTION] | [7] | go directly to the defensive weapons activation.
|
||||
| [M] | [PAUSE] | disable/enable background music. |
|
||||
@@ -78,6 +92,7 @@ The keyboard controls here are simple, cursor keys or joystick: left/right - cha
|
||||
| [G] | N/A | changes the mountain shading |
|
||||
| [ESC] | [*] | during the entire game at any time (unless the computer is playing, then sometimes you have to wait a while) you can press the [ESC] key, which allows you to abort the game and return to the beginning (of course, there is protection against accidental pressing). |
|
||||
| [Y] | [1] | when asked to abort or terminate the game - confirmation |
|
||||
| [CTRL] + [HELP] | N/A | Toggle "visual debug" mode. It displays distances measured, laser aiming, and aiming technique. It leaves a mess on the screen, but it does not impair the game, just makes it a bit harder. |
|
||||
|
||||
## 5. Game mechanics - offensive weapons
|
||||
|
||||
@@ -207,13 +222,13 @@ The game has 8 difficulty levels of computer-controlled opponents. Or actually 7
|
||||
|
||||
* **Poolshark** - When attacking, he sets the nearest tank as his target, then selects the angle of the shot, and tries to select its strength by drawing it from the selected range. He always shoots with the best weapon he has. He uses defensive weapons. With a probability of 1:3, he activates the best defensive weapon he owns (the highest on the list of weapons he owns - that is, not necessarily the best) before firing. If his energy level drops below 30 units - he uses **Battery** (of course, if he bought it before), if the energy drops below 5 and he has no **Battery** he surrenders - **White Flag**. At the beginning of the round he makes 1 attemp to buy defensive weapons and 6 offensive weapons.
|
||||
|
||||
** **Tosser** - When attacking, he acts exactly like **Poolshark** however, he may have a "better" weapon inventory due to a different purchase tactic. He always activates the best defensive weapon he has before shooting. And just like **Poolshark** he uses **Battery** and **White Flag**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/1250) attempts to buy offensive weapons.
|
||||
* **Tosser** - When attacking, he acts exactly like **Poolshark** however, he may have a "better" weapon inventory due to a different purchase tactic. He always activates the best defensive weapon he has before shooting. And just like **Poolshark** he uses **Battery** and **White Flag**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/1250) attempts to buy offensive weapons.
|
||||
|
||||
** **Chooser** - Takes as a target the weakest opponent (with the least amount of energy) and aims very precisely, but before the shot the energy of the shot is modified by the parameter of luck :) , that is, despite the precise aiming it does not always hit. He shoots with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He always activates the best defensive weapon he has before shooting and, like **Poolshark**, uses **Battery** and **White Flag**. He purchases just like **Tosser**.
|
||||
* **Chooser** - Takes as a target the weakest opponent (with the least amount of energy) and aims very precisely, but before the shot the energy of the shot is modified by the parameter of luck :) , that is, despite the precise aiming it does not always hit. He shoots with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He always activates the best defensive weapon he has before shooting and, like **Poolshark**, uses **Battery** and **White Flag**. He purchases just like **Tosser**.
|
||||
|
||||
* **Spoiler** - He shoots exactly like **Chooser** except that he has more luck :) , which means that even if he doesn't hit the target of his choice, it can be a more precise shot than **Chooser**. He uses defensive weapons exactly like **Chooser**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/320) attempts to buy offensive weapons. When buying defensive weapons, he buys only strong and precise weapons - that is, weapons that won't accidentally hurt him.
|
||||
|
||||
** **Cyborg** - Takes aim at the weakest opponent (with the least amount of energy) but prefers human-controlled opponents. Aims very accurately and in the vast majority of cases hits on the first shot. He fires the shot with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He uses defensive weapons exactly like **Chooser**. He shops exactly like **Spoiler**.
|
||||
* **Cyborg** - Takes aim at the weakest opponent (with the least amount of energy) but prefers human-controlled opponents. Aims very accurately and in the vast majority of cases hits on the first shot. He fires the shot with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He uses defensive weapons exactly like **Chooser**. He shops exactly like **Spoiler**.
|
||||
|
||||
* **Unknown** - Before firing each shot, he randomly chooses a course of action from **Poolshark** to **Cyborg** and applies his tactics. However, the tactics of weapon purchases are always identical to **Tosser**.
|
||||
|
||||
@@ -3,11 +3,18 @@
|
||||
Grać można przy użyciu klawiatury (wszystkie funkcjonalności) lub joysticka (wszystkie funkcjonalności niezbędne w rozgrywce).
|
||||
|
||||
## 1. Wybór opcji gry.
|
||||

|
||||
|
||||
Na pierwszym ekranie możemy skonfigurować opcje rozgrywki:
|
||||
* ilość graczy (2 - 6) obejmuje tak ludzi jak graczy sterowanych przez komputer
|
||||
* początkową ilość gotówki każdego z graczy (8k to wybrana przez nas wartość optymalna, lecz przy krótkich rozgrywkach warto wybrać większą wartość)
|
||||
* grawitacja
|
||||
* maksymalna siła wiatru (wiatr jest losowany na początku każdej z rund lub w czasie rundy pomiędzy turami, tu możemy wybrać jak silny może być)
|
||||
* maksymalna siła wiatru (wiatr jest losowany na początku każdej z rund lub w czasie rundy pomiędzy turami, tu możemy wybrać jak silny może być):
|
||||
* 1B - maksymalna siła wiatru: 5
|
||||
* 3B - maksymalna siła wiatru: 20
|
||||
* 5B - maksymalna siła wiatru: 40
|
||||
* 7B - maksymalna siła wiatru: 70
|
||||
* 9B - maksymalna siła wiatru: 99
|
||||
* liczba rozgrywanych rund
|
||||
* szybkość lotu pocisków (nie ma wpływu na tor lotu - zmienia jedynie widoczną prędkość rysowania - nie zmienia nic w samej rozgrywce)
|
||||
* częstotliwość samobójstw :) - jeśli przez ileś tur gra nie odnotowała trafień (czołgi ciągle strzelają niecelnie) jeden z takich pudłujących czołgów popełnia samobójstwo - tu określamy jak długo mogą “strzelać w próżnię” :) - jeśli grają tylko ludzie optymalne ustawienie to “norm”, w przypadku graczy sterowanych przez komputer… wedle uznania.
|
||||
@@ -23,11 +30,13 @@ Na pierwszym ekranie możemy skonfigurować opcje rozgrywki:
|
||||
|
||||
Wybór opcji klawiszami kursora lub joystickiem.
|
||||
|
||||
Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera zmieniają kolor gór (3 wersje do wyboru) lub (leśli kursor wskazuje opcję wyboru siły wiatru "Wind") zmieniają sposób losowania siły wiatru z "co rundę" na "co turę" i odwrotnie. Losowanie co turę jest sygnalizowane znakiem "?" przy słowie "Wind".
|
||||
Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera zmieniają kolor gór (3 wersje do wyboru) lub (jeśli kursor wskazuje opcję wyboru siły wiatru "Wind") zmieniają sposób losowania siły wiatru z "co rundę" na "co turę" i odwrotnie. Losowanie co turę jest sygnalizowane znakiem "?" przy słowie "Wind".
|
||||
|
||||
Klawisz [RETURN] lub przycisk Joysticka przechodzi do następnego ekranu.
|
||||
|
||||
## 2. Wprowadzanie nazwy graczy i wybór poziomu graczy sterowanych przez komputer
|
||||

|
||||
|
||||
Drugi ekran powtarza się dla każdego z graczy można na nim klawiszami kursora lub joystickiem wybrać czy danym czołgiem będzie kierował człowiek (opcja HUMAN) czy też komputer (pozostałe opcje).
|
||||
Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera pozwalają wybrać z którego portu joysticka będzie korzystał gracz.
|
||||
Klawisz [INVERSE] lub [OPTION] umożliwiają wybór jednego z 3 dostępnych kształtów czołgów. Na konsoli Atari 5200 uzyskuje się to poprzez cykliczne wybieranie kolejnych portów joysticka klawiszem [5].
|
||||
@@ -38,21 +47,27 @@ Nazwę gracza można wprowadzać także przy pomocy joysticka. Po wciśnięciu i
|
||||
Jeśli nazwa nie zostanie wpisana, to zostanie uzupełniona nazwą domyślną.
|
||||
|
||||
## 3. Ekran zakupów (przed każdą rundą)
|
||||

|
||||

|
||||
|
||||
Na tym ekranie można dokonywać zakupów broni ofensywnych i defensywnych. Widoczne są tylko te bronie na które gracza stać wraz z informacją o cenie i ilości jednostek danej broni, którą za ten cenę otrzymamy. Informacje na ekranie nie wymagają chyba więcej opisu. Po listach poruszamy się klawiszami kursora (góra i dół) lub joystickiem, klawisz [TAB] lub strzałka w lewo czy też ruch joystickiem w lewo zmieniają ekran na bronie defensywne lub ofensywne, klawisz [SPACJA] lub strzałka w prawo a także joystick w prawo realizują zakup wskazanej broni.
|
||||
|
||||
Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu aktywacji broni defensywnych.
|
||||
|
||||

|
||||
|
||||
Na ekranie tym można aktywować zakupione wcześniej bronie defensywne czy też ofensywne. Obsługiwany jest identycznie jak ekran zakupów, jednak [SPACJA] lub strzałka w prawo a także joystick w prawo realizują aktywacje wskazanej broni. Umożliwia to aktywowanie osłon jeszcze przed rozpoczęciem rundy.
|
||||
|
||||
Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następnego gracza.
|
||||
(oczywiście dla graczy komputerowych ten ekran się nie pojawia)
|
||||
|
||||
## 4. Główny ekran gry
|
||||

|
||||
|
||||
W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji:
|
||||
* nazwa czołgu gracza
|
||||
* numer aktywnego joysticka
|
||||
* wybrana aktualnie broń ofensywna
|
||||
* numer aktywnego joysticka lub poziom gracza sterowanego przez komputer (1-**Moron** - 8-**Unknown**),
|
||||
* wybrana aktualnie broń ofensywna (symbol ilość nazwa),
|
||||
* pozostała ilość punktów energii gracza i jeśli ma on aktywną broń defensywną posiadającą swój zasób energii - w nawiasie ten zasób
|
||||
* ustawiony przez gracza kąt nachylenia lufy i kierunek jej nachylenia
|
||||
* ustawiona przez gracza siła strzału (maksymalna siła strzału jest ograniczana przez energię gracza - nie może przekroczyć energii * 10 . Oznacza to, że mając małą ilość energii możemy oddać słabsze strzały
|
||||
@@ -66,7 +81,7 @@ Tutaj klawiszologia jest prosta, klawisze kursora lub joystick: lewo/prawo - zmi
|
||||
| A800 | 5200 | funkcja |
|
||||
| --- | --- | --- |
|
||||
| [SPACJA] | [0] | lub przycisk joysticka naciśnięte krótko - oddanie strzału |
|
||||
| [TAB] lub [SELECT] | [5] | wybór broni ofensywnej (ta opcja nie jest dostępna bezpośrednio joystickiem - trzeba wybrać Inventory). W głównym menu zmienia cieniowanie gór, widoczne w kolorze górek na dole ekranu. |
|
||||
| [TAB] lub [SELECT] | [5] | wybór broni ofensywnej (ta opcja nie jest dostępna bezpośrednio joystickiem - trzeba wybrać Inventory). |
|
||||
| [I] | [9] | lub dłuższe przytrzymanie przycisku joysticka - przejście do Inventory (aktywacji broni). Inventory to ekran (a w zasadzie dwa) bliźniaczo podobny do ekranu zakupów. Zasady poruszania się są identyczne z tym, że tu nie kupujemy broni, ale wybieramy jedną z ofensywnych, którą będziemy strzelać lub aktywujemy broń defensywną. |
|
||||
| [A] lub [OPTION] | [7] | bezpośrednie przejście na ekran Inventory aktywacji broni defensywnych. |
|
||||
| [M] | [PAUSE] | wyłączenie/włączenie muzyki w tle |
|
||||
@@ -77,6 +92,7 @@ Tutaj klawiszologia jest prosta, klawisze kursora lub joystick: lewo/prawo - zmi
|
||||
| [G] | brak | zmienia cieniowanie gór |
|
||||
| [ESC] | [*] | w czasie całej gry w dowolnym momencie (chyba że akurat gra komputer, wtedy czasem trzeba chwilę poczekać) można nacisnąć klawisz [ESC], który umożliwia przerwanie gry i powrót na początek (oczywiście jest zabezpieczenie przed przypadkowym naciśnięciem). |
|
||||
| [Y] | [1] | w przypadku pytania o przerwanie lub zakończenie gry - potwierdzenie decyzji |
|
||||
| [CTRL] + [HELP] | brak | Przełącza tryb "visual debug". Wizualizuje mierzone odległości, celowanie lasera oraz technikę celowania komputera. Pozostawia bałagan na ekranie, co nie zmienia rozgrywki, tylko ją nieco utrudnia. |
|
||||
|
||||
## 5. Zasady gry - bronie ofensywne
|
||||
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 6.5 KiB |
|
After Width: | Height: | Size: 8.4 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
@@ -5,52 +5,96 @@ Scorch is a multi-player, turn-based, artillery video game. Tanks do turn-based
|
||||
|
||||
by Tomasz 'Pecus' Pecko and Pawel 'pirx' Kalinowski
|
||||
|
||||
Warsaw, Miami 2000, 2001, 2002, 2003, 2009, 2012, 2013, 2022
|
||||
Warsaw, Miami 2000, 2001, 2002, 2003, 2009, 2012, 2013, 2022, 2023
|
||||
|
||||
Contributors:
|
||||
- Miker (@mikerro) - in-game music and sfx, ideas, QA
|
||||
- Kaz - splash screen, ideas
|
||||
- Adam (@6502adam) - font, design, QA
|
||||
- Bocianu (@bocianu) - important ideas, FujiNet implementation, QA
|
||||
- Miker ([mikerro](https://github.com/mikerro)) - in-game music and sfx, ideas, QA
|
||||
- Kaz - original splash screen, SV Atari 50 splash screen, ideas
|
||||
- Adam ([6502adam](https://github.com/6502adam)) - font, design, QA
|
||||
- Bocianu ([bocianu](https://github.com/bocianu)) - important ideas, FujiNet implementation, QA
|
||||
- Emkay - splash screen music
|
||||
- Fox (@pfusik) - plot and point optimization
|
||||
- Fox ([pfusik](https://github.com/pfusik)) - plot and point optimization
|
||||
- xorcerer ([xauberer](https://github.com/xauberer)) - AI generated splash and sticker
|
||||
|
||||
QA: Probabilitydragon, KrzysRog, Beeblebrox, EnderDude, lopezpb, Dracon, brad-colbert, archon800,
|
||||
Shaggy the Atarian, x=usr(1536), Aking, Kenshi
|
||||
|
||||
Special thanks to tebe (@tebe6502), JAC! (@peterdell) and phaeron for their fantastic tools and support.
|
||||
QA: Probabilitydragon, EnderDude, Dracon, Beeblebrox, KrzysRog, lopezpb,
|
||||
brad-colbert, archon800, nowy80, Saberman, Shaggy the Atarian, RetroBorsuk, ZPH,
|
||||
x=usr(1536), Aking, RB5200
|
||||
|
||||
Special thanks to tebe ([tebe6502](https://github.com/tebe6502)), JAC! ([peterdell](https://github.com/peterdell)) and phaeron ([Altirra](https://www.virtualdub.org/altirra.html)) for their fantastic tools and support.
|
||||
|
||||
You can contact us via [AtariAge](https://atariage.com) or [AtariOnLine](https://atarionline.pl) forums.
|
||||
|
||||
This source code was originally compiled with [OMC65 crossassembler](https://github.com/pkali/omc65) and on 2012-06-21 translated to [mads](https://github.com/tebe6502/Mad-Assembler).
|
||||
|
||||
Compilation: `mads scorch.asm -o:scorch.xex`
|
||||
Compilation:
|
||||
- `mads scorch.asm -o:scorch.xex -d:TARGET=800` for Atari800 version
|
||||
- `mads scorch.asm -o:scorch.bin -d:TARGET=5200` for Atari 5200 version
|
||||
- `mads scorchC64.asm -o:scorchC64.prg` for C64 version (WIP, not playable yet)
|
||||
|
||||
|
||||
Game source code is split into 5+4 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
|
||||
- constants.asm - various tables of constants
|
||||
- display_*.asm - display lists and text screen definitions
|
||||
- ai.asm - artificial stupidity of computer opponents
|
||||
- weapons.asm - general arsenal of tankies
|
||||
- definitions.asm - label definitions, moved to make it work better with Altirra debug (it doesn't).
|
||||
Game source code is split into several parts:
|
||||
- `scorch.asm` is the main game startup code
|
||||
- `game.asm` - it all happens here
|
||||
- `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
|
||||
- `constants.asm` - various tables of constants
|
||||
- `display_*.asm` - display lists and text screen definitions
|
||||
- `ai.asm` - artificial stupidity of computer opponents
|
||||
- `weapons.asm` - general arsenal of tankies
|
||||
- `definitions.asm` - label definitions, moved to make it work better with Altirra debug (it doesn't).
|
||||
|
||||
We were trying to use macros, pseudo-ops and simple graphics primitives as much as possible.
|
||||
This way it should be relatively easy to port this code to e.g. C64
|
||||
We were trying to use macros, pseudo-ops, and simple graphics primitives as much as possible. This way, it should be relatively easy to port this code to, for example, the 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 all you want to have y=a*x+b :)
|
||||
After working on this piece of code for N years, we are sure it would be much wiser to write it in C, Action!, or MadPascal. On the other hand, it is so much fun to type 150 characters when all you want to have is y = a * x + b. :)
|
||||
|
||||
Originally most variables were in Polish, comments were sparse, but we wanted to release this piece of code to public.
|
||||
Because of being always short of time/energy (to finish the game) we decided it must go in 'English' to let other people work on it.
|
||||
It never happened, but we got some encouraging comments and we are still trying to do something from time to time.
|
||||
Originally, most variables were in Polish, and comments were sparse. However, we wanted to release this piece of code to the public. Because we were always short of time and energy (to finish the game), we decided to translate it into English so that other people could work on it. This never happened, but we received some encouraging comments, and we are still trying to do something from time to time.
|
||||
|
||||
With the advent of [fujinet](https://fujinet.online/) we are thinking about making the game interplanetary, err, with multiplayer over the net. We'll see.
|
||||
|
||||
## Changelog:
|
||||
|
||||
###### Version 1.30
|
||||
2023-05-21
|
||||
|
||||
Okay, okay, we promised that the single-machine game was done, and it was. However, some bug reports came in, and development of the C64 version unearthed some mostly peaceful and dormant pests. As a result, it appears that a new release is happening.
|
||||
|
||||
The most important changes:
|
||||
- Most machine-dependent code moved to appropriate folders (`Atari/` and `C64/`).
|
||||
- Game Over results table improved by sorting all 3 values - points, hits and money earned. It was possible in the past to get a lower podium place with e.g., more money.
|
||||
- Game Over screen now displays level of robo tanks and controller number for organic players.
|
||||
- Gains calculations bug fixed.
|
||||
- Manuals now include pictures!
|
||||
- More than 6 tanks possible (not for Atari / 5200 where sprites and memory are the limiting factor)
|
||||
- Shield stays up after White Flag bug fixed https://github.com/pkali/scorch_src/issues/138. Finally!!!
|
||||
- Quit from game and quit to Game Over is now checked much more often, especially when robo tanks are fighting.
|
||||
- Numerous binary size and source code clarity improvements, mainly to facilitate the above changes.
|
||||
|
||||
|
||||
###### Version 1.28
|
||||
2023-04-22
|
||||
|
||||
Greetings and salutations,
|
||||
|
||||
Allow me to present the release notes for Version 1.28 of our esteemed hobby game for 8-bit computers.
|
||||
|
||||
First and foremost, let it be known that we have reached the end of an era. We bid adieu to the solitary player versions, as we are determined to preserve the sanctity of this auspicious round version number.
|
||||
|
||||
Moving on to the technical enhancements and embellishments, we are proud to introduce a simulated stereo feature for those fortunate enough to possess the dual pokey hardware. This auditory wonder was brought to fruition by the esteemed Arthur "Two Pokeys" Jackson, whose mastery in the field of sound engineering knows no bounds.
|
||||
|
||||
Furthermore, we have bestowed upon our beloved creation a splash screen of unrivaled brilliance, crafted by the masterful xorcerer. This work of art, by the Artificial Unintelligence and Machine Forgetting, shall leave an indelible mark on all who behold it.
|
||||
|
||||
Our developers have also painstakingly refined the game's performance with a plethora of improvements, including a refined round and final results sorting mechanism, additional keyboard usage assistance in the main menu, and a significant acceleration of the 8x8 and 4x4 put char routines. Additionally, we have incorporated configurable hardware and screen memory layout agnostic put char routines to accommodate future ports and ensure seamless compatibility.
|
||||
|
||||
Last but certainly not least, our mountain drawing optimization shall elevate the visual experience to new heights, ensuring an immersive and enjoyable experience for all.
|
||||
|
||||
We hope that these improvements shall enhance your gaming experience, and we eagerly anticipate your feedback.
|
||||
|
||||
Yours sincerely,
|
||||
|
||||
The Developers
|
||||
|
||||
###### Version 1.27
|
||||
2023-02-07
|
||||
|
||||
@@ -119,11 +163,11 @@ Other (dubious) improvements:
|
||||
|
||||
We couldn't resist! This is the Senior Executive Director's Cut.
|
||||
By virtue of byte misering we squeezed in a few new features:
|
||||
* new selectable tank shapes - change the controller enough times to get a different tank model
|
||||
* lonely bad pixel after Liquid Dirt fixed
|
||||
* mountain colors (or shades) possible, switch with [Tab] in the main menu
|
||||
* active controller number display in the game, store, and inventory screens
|
||||
* a very special terminator mode for Moron
|
||||
- new selectable tank shapes - change the controller enough times to get a different tank model
|
||||
- lonely bad pixel after Liquid Dirt fixed
|
||||
- mountain colors (or shades) possible, switch with [Tab] in the main menu
|
||||
- active controller number display in the game, store, and inventory screens
|
||||
- a very special terminator mode for Moron
|
||||
|
||||
|
||||
###### Version 1.20
|
||||
@@ -132,72 +176,72 @@ By virtue of byte misering we squeezed in a few new features:
|
||||
It's the final cut. Director's Cut.
|
||||
We squeezed the code and saved some bytes to add the joystick/controller selection. No more fights for the stick, up to 4 players can have fun with their own manipulators. And the fifth one can still use the keyboard :).
|
||||
Our most prolific testers Arek and Alex called for a number of fixes. Thank you, guys!
|
||||
* Players can select their controllers.
|
||||
* Better Auto Defense symbol in the status line.
|
||||
* Battery performance in AI and Auto Defense fixed.
|
||||
* More accurate and faster Laser.
|
||||
* Boost For Gifts includes a secret, quite powerful weapon.
|
||||
* Points counting fix-up (edge cases eliminated).
|
||||
* Long lists in inventory and shop were pointing to a weapon outside the screen. Fixed.
|
||||
* Lazy Boys now remember the last weapon used.
|
||||
* Especially for XEGS - SELECT key changes the joystick similarly to TAB.
|
||||
* Rare P/M glitches fixed.
|
||||
* ExplosionRange variable glitched (rarely) due to byte/word mix-up. Fixed.
|
||||
* Bouncy Castle was bouncing the laser from inside. Fixed.
|
||||
* Shielded tanks were autodestructing when shooting with angle 0. Fixed.
|
||||
* Physics of bouncing off the walls was incorrect for some weapons. Fixed.
|
||||
- Players can select their controllers.
|
||||
- Better Auto Defense symbol in the status line.
|
||||
- Battery performance in AI and Auto Defense fixed.
|
||||
- More accurate and faster Laser.
|
||||
- Boost For Gifts includes a secret, quite powerful weapon.
|
||||
- Points counting fix-up (edge cases eliminated).
|
||||
- Long lists in inventory and shop were pointing to a weapon outside the screen. Fixed.
|
||||
- Lazy Boys now remember the last weapon used.
|
||||
- Especially for XEGS - SELECT key changes the joystick similarly to TAB.
|
||||
- Rare P/M glitches fixed.
|
||||
- ExplosionRange variable glitched (rarely) due to byte/word mix-up. Fixed.
|
||||
- Bouncy Castle was bouncing the laser from inside. Fixed.
|
||||
- Shielded tanks were autodestructing when shooting with angle 0. Fixed.
|
||||
- Physics of bouncing off the walls was incorrect for some weapons. Fixed.
|
||||
|
||||
|
||||
###### Version 1.19
|
||||
2022-11-04
|
||||
|
||||
This is the final round of weapon additions! Also. our beloved testers and players found a number of issues and we were extremely happy to address them.
|
||||
* New defensive weapon "Lazy Boy" - aims at the closest enemy.
|
||||
* New defensive weapon "Lazy Darwin" - aims at the weakest link, an enemy I mean.
|
||||
* New defensive weapon "Auto Defense" - activate it to be automatically protected by shields and stuff (where available)
|
||||
* New defensive weapon "Spy Hard" - quickly view energies, weapons and shields of your opponents.
|
||||
* New SFXes, improvements in SFX, and music by @mikerro
|
||||
* Shooting with angle 0 caused the sudden death of the operator. Fixed.
|
||||
* Angles were asymmetrical, now you can go from 0 to 90 and to 0 again (181 degrees of freedom). Fixed with an improved arithmetic rounding of our sub-pixel accuracy.
|
||||
* Drawing a barrel when a tank was on the edge of X==256 pixels caused a lonely pixel to appear randomly. Fixed.
|
||||
* Liquid Dirt was overflowing from the right edge of the screen to the left. Fixed.
|
||||
* Liquid Dirt volume increased significantly, it is now a formidable attack!
|
||||
* A single pixel was erroneously plotted when measuring distance (was visible in e.g., Death's Head). Fixed.
|
||||
* Not all traces were correctly erased after Funky Bomb, fixed again (for the 3rt time I guess).
|
||||
* Soil sedimentation speed after Funky Bomb improved.
|
||||
* Pressing [ESC] when in inventory/store was quitting the game, now it quits the menu only.
|
||||
* A bug in MADS optimization was causing parts of SEPPUKU message to stay on screen.
|
||||
* BIGGEST OF ALL: the lonely pixel after Nuclear Winter was eliminated. https://github.com/pkali/scorch_src/issues/103 We have spent a disproportionately large amount of time trying to slap this bug. It is still there, but is not manifesting itself ;)
|
||||
- New defensive weapon "Lazy Boy" - aims at the closest enemy.
|
||||
- New defensive weapon "Lazy Darwin" - aims at the weakest link, an enemy I mean.
|
||||
- New defensive weapon "Auto Defense" - activate it to be automatically protected by shields and stuff (where available)
|
||||
- New defensive weapon "Spy Hard" - quickly view energies, weapons and shields of your opponents.
|
||||
- New SFXes, improvements in SFX, and music by @mikerro
|
||||
- Shooting with angle 0 caused the sudden death of the operator. Fixed.
|
||||
- Angles were asymmetrical, now you can go from 0 to 90 and to 0 again (181 degrees of freedom). Fixed with an improved arithmetic rounding of our sub-pixel accuracy.
|
||||
- Drawing a barrel when a tank was on the edge of X==256 pixels caused a lonely pixel to appear randomly. Fixed.
|
||||
- Liquid Dirt was overflowing from the right edge of the screen to the left. Fixed.
|
||||
- Liquid Dirt volume increased significantly, it is now a formidable attack!
|
||||
- A single pixel was erroneously plotted when measuring distance (was visible in e.g., Death's Head). Fixed.
|
||||
- Not all traces were correctly erased after Funky Bomb, fixed again (for the 3rt time I guess).
|
||||
- Soil sedimentation speed after Funky Bomb improved.
|
||||
- Pressing [ESC] when in inventory/store was quitting the game, now it quits the menu only.
|
||||
- A bug in MADS optimization was causing parts of SEPPUKU message to stay on screen.
|
||||
- BIGGEST OF ALL: the lonely pixel after Nuclear Winter was eliminated. https://github.com/pkali/scorch_src/issues/103 We have spent a disproportionately large amount of time trying to slap this bug. It is still there, but is not manifesting itself ;)
|
||||
|
||||
|
||||
###### Version 1.18
|
||||
2022-11-07
|
||||
|
||||
Possibly the final single-player version of the game, unless our dear players find another breaking issue!
|
||||
* 5200 keypad works as it should. You can now press these finicky foils to your heart's desire.
|
||||
* "Unknown" type Robotanks were attacking with Nuclear Winter every time. Fixed!
|
||||
* One of the variables was declared as a byte but used as a word that might cause some rare instabilities.
|
||||
* Page zero variables are cleared prior to the game start to eliminate rare issues in some software/hardware configurations.
|
||||
* The new version of music in NTSC eliminates issues with tempo (not that anyone but the artist noticed that, but still it is an improvement!)
|
||||
* You can now wrap around inventory and shop to faster access these options far down below.
|
||||
* Visual improvement of the main menu and fixed some color issues with the title headers.
|
||||
* Hovercraft was always flying to the top of the screen, it was not intended, it is now hovering just above the mountains!
|
||||
* The main menu does not blink now when changing options. This was a very minor thing but it bothered me to some extent. Fixing it required a complete rewrite of this portion of the menu.
|
||||
- 5200 keypad works as it should. You can now press these finicky foils to your heart's desire.
|
||||
- "Unknown" type Robotanks were attacking with Nuclear Winter every time. Fixed!
|
||||
- One of the variables was declared as a byte but used as a word that might cause some rare instabilities.
|
||||
- Page zero variables are cleared prior to the game start to eliminate rare issues in some software/hardware configurations.
|
||||
- The new version of music in NTSC eliminates issues with tempo (not that anyone but the artist noticed that, but still it is an improvement!)
|
||||
- You can now wrap around inventory and shop to faster access these options far down below.
|
||||
- Visual improvement of the main menu and fixed some color issues with the title headers.
|
||||
- Hovercraft was always flying to the top of the screen, it was not intended, it is now hovering just above the mountains!
|
||||
- The main menu does not blink now when changing options. This was a very minor thing but it bothered me to some extent. Fixing it required a complete rewrite of this portion of the menu.
|
||||
|
||||
|
||||
###### Version 1.17
|
||||
2022-10-31
|
||||
|
||||
Mostly 5200 console port and NTSC improvements.
|
||||
* Updated songs from Miker do not require skipping frames on NTSC machines. Crucial for the next point.
|
||||
* Bouncy Castle bouncing of Funky Bomb fixed https://github.com/pkali/scorch_src/issues/129
|
||||
* 5200 version had various graphical and sound glitches. Although mostly harmless, it hurt our sense of aesthetics. First of all the flickering credits roll is all good now.
|
||||
* Rare hang-ups on NTSC machines fixed
|
||||
* Screen lowered down by 7 scan lines to help top status line on NTSC CRTs.
|
||||
* 5200 ATTRACT mode not going away fixed
|
||||
* Autorepeat added to menus what should help 5200 users with their non-centering abomination of a controller.
|
||||
* DLI interrupts optimized, few cycles saved.
|
||||
* 5200 keypad sort-of-works. Please refer to manual for key bindings.
|
||||
- Updated songs from Miker do not require skipping frames on NTSC machines. Crucial for the next point.
|
||||
- Bouncy Castle bouncing of Funky Bomb fixed https://github.com/pkali/scorch_src/issues/129
|
||||
- 5200 version had various graphical and sound glitches. Although mostly harmless, it hurt our sense of aesthetics. First of all the flickering credits roll is all good now.
|
||||
- Rare hang-ups on NTSC machines fixed
|
||||
- Screen lowered down by 7 scan lines to help top status line on NTSC CRTs.
|
||||
- 5200 ATTRACT mode not going away fixed
|
||||
- Autorepeat added to menus what should help 5200 users with their non-centering abomination of a controller.
|
||||
- DLI interrupts optimized, few cycles saved.
|
||||
- 5200 keypad sort-of-works. Please refer to manual for key bindings.
|
||||
|
||||
|
||||
###### Version 1.16
|
||||
@@ -210,7 +254,7 @@ Cramming the game into a 32KiB cart and 16KiB RAM was a big task - it required a
|
||||
The release is not perfect - we have a number of glitches and improvements to the 5200 controller procedures to work on, but the game is playable.
|
||||
|
||||
Changes:
|
||||
* numerous, but not very visible
|
||||
- numerous, but not very visible
|
||||
|
||||
|
||||
###### Version 1.14
|
||||
@@ -220,12 +264,12 @@ Minor bugfixes and optimizations.
|
||||
Just a small update to allow for more testing and having fun before the bigger release.
|
||||
|
||||
Changes:
|
||||
* Numerous optimizations that require a solid test. Please have fun and report issues!
|
||||
* Small DrawTanks fix.
|
||||
* Bouncy Castle bounces like it should.
|
||||
* Tracer and Smoke Tracer are not causing defense weapons to trigger anymore.
|
||||
* In rare cases direct hit was not accounted for correctly.
|
||||
* Manuals updated. https://github.com/pkali/scorch_src/releases/tag/v1.16
|
||||
- Numerous optimizations that require a solid test. Please have fun and report issues!
|
||||
- Small DrawTanks fix.
|
||||
- Bouncy Castle bounces like it should.
|
||||
- Tracer and Smoke Tracer are not causing defense weapons to trigger anymore.
|
||||
- In rare cases direct hit was not accounted for correctly.
|
||||
- Manuals updated. https://github.com/pkali/scorch_src/releases/tag/v1.16
|
||||
|
||||
|
||||
###### Version 1.13
|
||||
@@ -236,13 +280,13 @@ Getting ready for porting the game!
|
||||
Several heavy optimizations and code cleanups in preparation for an unexpected port.
|
||||
|
||||
Changes:
|
||||
* Overhaul of AI - Cyborgs, Spoilers, and Choosers aim much better.
|
||||
* Cyborgs prefer to kill humans.
|
||||
* Fine tuning of AI purchases makes the difficulty level aligned with the robot level.
|
||||
* Fixed a very difficult and elusive bug that was causing tanks to freeze when falling close to the right edge of the screen fixed.
|
||||
* Updated music by @Miker
|
||||
* It is now possible to enter tank names with a joystick - all essential game functions are available without touching the keyboard!
|
||||
* Manuals updated with AI strategy information and more.
|
||||
- Overhaul of AI - Cyborgs, Spoilers, and Choosers aim much better.
|
||||
- Cyborgs prefer to kill humans.
|
||||
- Fine tuning of AI purchases makes the difficulty level aligned with the robot level.
|
||||
- Fixed a very difficult and elusive bug that was causing tanks to freeze when falling close to the right edge of the screen fixed.
|
||||
- Updated music by @Miker
|
||||
- It is now possible to enter tank names with a joystick - all essential game functions are available without touching the keyboard!
|
||||
- Manuals updated with AI strategy information and more.
|
||||
|
||||
|
||||
###### Version 1.12
|
||||
@@ -251,12 +295,12 @@ Changes:
|
||||
What is going on? Are we getting crazy or what?
|
||||
|
||||
Changes:
|
||||
* Background color indicates the type of walls. This is very useful when the rand option is selected.
|
||||
* XEGS users requested that console keys are used when no keyboard is attached! We delivered! [SELECT] to select an offensive weapon, [OPTION] to jump into inventory, defensive section, [START] + [OPTION] - immediate Game Over (no confirmation for you keyboardless folks)
|
||||
* A very silly bug detected by our young testers fixed - the game crashed when you built a very high mountain using Dirt Balls :)
|
||||
* Boxy infinite bounce bug fixed.
|
||||
* Funky bombs bounce off the walls!
|
||||
* The first letter entered for a tank name was inserted in the wrong spot. How did it work at all? Magic.
|
||||
- Background color indicates the type of walls. This is very useful when the rand option is selected.
|
||||
- XEGS users requested that console keys are used when no keyboard is attached! We delivered! [SELECT] to select an offensive weapon, [OPTION] to jump into inventory, defensive section, [START] + [OPTION] - immediate Game Over (no confirmation for you keyboardless folks)
|
||||
- A very silly bug detected by our young testers fixed - the game crashed when you built a very high mountain using Dirt Balls :)
|
||||
- Boxy infinite bounce bug fixed.
|
||||
- Funky bombs bounce off the walls!
|
||||
- The first letter entered for a tank name was inserted in the wrong spot. How did it work at all? Magic.
|
||||
[ESC] now correctly exits the purchase screen.
|
||||
|
||||
|
||||
@@ -268,8 +312,8 @@ A release lollapalooza.
|
||||
The silliness indicator crashed. What are we doing?
|
||||
|
||||
Changes:
|
||||
* A very silly buffer overflow bug fixed - it allowed for infinite (well... to the point) lengths of tank names, or rather for overwriting code with arbitrary values.
|
||||
* Gamefield walls added https://github.com/pkali/scorch_src/issues/50. Choosing a different wall effect from the main options menu allows for a sophisticated tactics change.
|
||||
- A very silly buffer overflow bug fixed - it allowed for infinite (well... to the point) lengths of tank names, or rather for overwriting code with arbitrary values.
|
||||
- Gamefield walls added https://github.com/pkali/scorch_src/issues/50. Choosing a different wall effect from the main options menu allows for a sophisticated tactics change.
|
||||
|
||||
###### Version 1.10
|
||||
2022-08-21
|
||||
@@ -281,22 +325,22 @@ This release brings a swath of gameplay updates and a generous dose of a new sil
|
||||
Version number bump reflects number of unreleased versions and amount of changes.
|
||||
|
||||
Changes:
|
||||
* Defensive weapons can be activated before the round to make for the unbeatable aiming precision of the robotanks.
|
||||
* Fixed bug with Long Schlong activation taking one Schlong too many.
|
||||
* Smoke Tracer not disappearing smoke fixed.
|
||||
* Bug allowing for infinite shooting outside the screen fixed.
|
||||
* Tank colors and P/M sequence as devised by Adam, the gfx artist. Tanks differ more and look better. https://github.com/pkali/scorch_src/issues/119
|
||||
* New item in the shop - loot box "Buy me!" with a surprise inside. https://github.com/pkali/scorch_src/issues/97
|
||||
* Tank names can have s p a c e s now! https://github.com/pkali/scorch_src/issues/120
|
||||
* Tanks are mobile now thanks to the new defensive option - Hovercraft https://github.com/pkali/scorch_src/issues/52
|
||||
* Main atari library switched to a more standard version based on Mapping the Atari
|
||||
* Huge memory optimizations to allow for the new features.
|
||||
* Narrow screen in shop / inventory (many bytes saved).
|
||||
* Explosion range corrections for a rare event of non-lethal Nuke explosions.
|
||||
* Pressing [A] jumps into defensive weapons activation directly.
|
||||
* Elusive randomize force error causing rare hangups for Tosser fixed.
|
||||
* Activation of defensive weapons moved to front.
|
||||
* Additional SFX for new weapons.
|
||||
- Defensive weapons can be activated before the round to make for the unbeatable aiming precision of the robotanks.
|
||||
- Fixed bug with Long Schlong activation taking one Schlong too many.
|
||||
- Smoke Tracer not disappearing smoke fixed.
|
||||
- Bug allowing for infinite shooting outside the screen fixed.
|
||||
- Tank colors and P/M sequence as devised by Adam, the gfx artist. Tanks differ more and look better. https://github.com/pkali/scorch_src/issues/119
|
||||
- New item in the shop - loot box "Buy me!" with a surprise inside. https://github.com/pkali/scorch_src/issues/97
|
||||
- Tank names can have s p a c e s now! https://github.com/pkali/scorch_src/issues/120
|
||||
- Tanks are mobile now thanks to the new defensive option - Hovercraft https://github.com/pkali/scorch_src/issues/52
|
||||
- Main atari library switched to a more standard version based on Mapping the Atari
|
||||
- Huge memory optimizations to allow for the new features.
|
||||
- Narrow screen in shop / inventory (many bytes saved).
|
||||
- Explosion range corrections for a rare event of non-lethal Nuke explosions.
|
||||
- Pressing [A] jumps into defensive weapons activation directly.
|
||||
- Elusive randomize force error causing rare hangups for Tosser fixed.
|
||||
- Activation of defensive weapons moved to front.
|
||||
- Additional SFX for new weapons.
|
||||
|
||||
###### Version 1.00
|
||||
2022-08-13
|
||||
@@ -310,18 +354,18 @@ All 48KB+ 8-bit Atari computers are supported.
|
||||
Thank you @Pecusx and @Miker for your hard work over the last few weeks - I was almost entirely absent because of the real-world attack.
|
||||
|
||||
Most important changes:
|
||||
* New Game Over screen with a summary of wins, direct hits and earned cash. https://github.com/pkali/scorch_src/issues/9
|
||||
* Tank barrels are drawn procedurally to make aiming easier..
|
||||
* Various SFX and music updates with new tunes for all parts of the game. https://github.com/pkali/scorch_src/issues/112
|
||||
* AI can use White Flag.
|
||||
* 3 different tank shapes https://github.com/pkali/scorch_src/issues/64.
|
||||
* All AI levels are programmed. Cyborg is tough! https://github.com/pkali/scorch_src/issues/40
|
||||
* New weapon - Long Schlong!
|
||||
* New splash screen.
|
||||
* Game mechanics improved.
|
||||
* [O] key skips to the Game Over screen.
|
||||
* The game works on Atari 800.
|
||||
* Huge amount of optimizations to squeeze the game into 48K.
|
||||
- New Game Over screen with a summary of wins, direct hits and earned cash. https://github.com/pkali/scorch_src/issues/9
|
||||
- Tank barrels are drawn procedurally to make aiming easier..
|
||||
- Various SFX and music updates with new tunes for all parts of the game. https://github.com/pkali/scorch_src/issues/112
|
||||
- AI can use White Flag.
|
||||
- 3 different tank shapes https://github.com/pkali/scorch_src/issues/64.
|
||||
- All AI levels are programmed. Cyborg is tough! https://github.com/pkali/scorch_src/issues/40
|
||||
- New weapon - Long Schlong!
|
||||
- New splash screen.
|
||||
- Game mechanics improved.
|
||||
- [O] key skips to the Game Over screen.
|
||||
- The game works on Atari 800.
|
||||
- Huge amount of optimizations to squeeze the game into 48K.
|
||||
|
||||
And now the new adventure begins!
|
||||
|
||||
@@ -397,10 +441,10 @@ The new inventory system has been added. Call it by pressing the "I" key or shor
|
||||
Another significant playability change is #54 - it is not finished yet, but keeping the joystick up or down makes force increase/decrease faster. Also - short press of fire calls Inventory, long press fires the shell. The timings are experimental, please let me know if this needs a modification/improvement.
|
||||
|
||||
Tickets closed:
|
||||
* https://github.com/pkali/scorch_src/issues/92 - less unnecessary cleaning of the offensive texts
|
||||
* https://github.com/pkali/scorch_src/issues/89 - improved collisions with tank
|
||||
* https://github.com/pkali/scorch_src/issues/71 - ditto
|
||||
* https://github.com/pkali/scorch_src/issues/11, https://github.com/pkali/scorch_src/issues/26, https://github.com/pkali/scorch_src/issues/8, https://github.com/pkali/scorch_src/issues/20 - new inventory system
|
||||
- https://github.com/pkali/scorch_src/issues/92 - less unnecessary cleaning of the offensive texts
|
||||
- https://github.com/pkali/scorch_src/issues/89 - improved collisions with tank
|
||||
- https://github.com/pkali/scorch_src/issues/71 - ditto
|
||||
- https://github.com/pkali/scorch_src/issues/11, https://github.com/pkali/scorch_src/issues/26, https://github.com/pkali/scorch_src/issues/8, https://github.com/pkali/scorch_src/issues/20 - new inventory system
|
||||
|
||||
###### Build 143
|
||||
2022-06-05
|
||||
|
||||
@@ -83,7 +83,7 @@ AIRoutines
|
||||
mwa #800 RandBoundaryHigh
|
||||
jsr RandomizeForce
|
||||
; choose the best weapon
|
||||
ldy #ind_Buy_me_________+1 ; if the cheat is active it will fire the BFG :)
|
||||
ldy #ind_Buy_me +1 ; if the cheat is active it will fire the BFG :)
|
||||
jmp ChooseBestOffensive.NotFromAll
|
||||
;rts
|
||||
.endp
|
||||
@@ -203,8 +203,8 @@ forceNow
|
||||
endo
|
||||
; choose the best weapon
|
||||
|
||||
jsr ChooseBestOffensive
|
||||
rts
|
||||
jmp ChooseBestOffensive
|
||||
; rts
|
||||
|
||||
;----------------------------------------------
|
||||
AngleTable ; 16 bytes ;ba w $348b L$3350
|
||||
@@ -219,8 +219,10 @@ AngleTable ; 16 bytes ;ba w $348b L$3350
|
||||
cmp #5
|
||||
bcs EnoughEnergy
|
||||
; lower than 5 units - white flag
|
||||
lda #ind_White_Flag_____
|
||||
jsr ClearTankNr ; we must hide tank to erase shields (issue #138)
|
||||
lda #ind_White_Flag
|
||||
sta ActiveDefenceWeapon,x
|
||||
jsr PutTankNr ; and draw tank witch Flag
|
||||
EnoughEnergy
|
||||
rts
|
||||
.endp
|
||||
@@ -231,7 +233,7 @@ EnoughEnergy
|
||||
cmp #30
|
||||
bcs EnoughEnergy
|
||||
; lower than 30 units - check battery
|
||||
ldy #ind_Battery________
|
||||
ldy #ind_Battery
|
||||
lda (temp),y ; has address of TanksWeaponsTable
|
||||
beq NoBatteries
|
||||
; we have batteries - use one
|
||||
@@ -258,7 +260,7 @@ NoBatteries
|
||||
ldy #last_real_defensive+1 ;the last defensive weapon
|
||||
@
|
||||
dey
|
||||
cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use)
|
||||
cpy #ind_Hovercraft ;first defensive weapon (White Flag, Battery and Hovercraft - never use)
|
||||
beq NoUseDefensive
|
||||
lda (temp),y ; has address of TanksWeaponsTable
|
||||
beq @-
|
||||
@@ -293,7 +295,7 @@ DefensiveInUse
|
||||
ldy #last_real_defensive+1 ;the last defensive weapon
|
||||
@
|
||||
dey
|
||||
cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use)
|
||||
cpy #ind_Hovercraft ;first defensive weapon (White Flag, Battery and Hovercraft - never use)
|
||||
beq NoUseDefensive
|
||||
lda (temp),y ; has address of TanksWeaponsTable
|
||||
beq @-
|
||||
@@ -337,7 +339,7 @@ NotNegativeEnergy
|
||||
jsr GetDistance
|
||||
cmp #6 ; 24/4
|
||||
bcs HighForce
|
||||
lda #ind_Baby_Missile___
|
||||
lda #ind_Baby_Missile
|
||||
sta ActiveWeapon,x
|
||||
HighForce
|
||||
rts
|
||||
@@ -369,7 +371,7 @@ NotNegativeEnergy
|
||||
jsr GetDistance
|
||||
cmp #6 ; 24/4
|
||||
bcs HighForce
|
||||
lda #ind_Baby_Missile___
|
||||
lda #ind_Baby_Missile
|
||||
sta ActiveWeapon,x
|
||||
HighForce
|
||||
rts
|
||||
@@ -387,7 +389,7 @@ HighForce
|
||||
jsr TakeAim ; direction still in A (0 - left, >0 - right)
|
||||
|
||||
; choose the best weapon
|
||||
ldy #ind_Nuke___________+1
|
||||
ldy #ind_Nuke +1
|
||||
jsr ChooseBestOffensive.NotFromAll
|
||||
|
||||
lda Force
|
||||
@@ -398,7 +400,7 @@ HighForce
|
||||
jsr GetDistance
|
||||
cmp #8 ;32/4
|
||||
bcs HighForce
|
||||
lda #ind_Baby_Missile___
|
||||
lda #ind_Baby_Missile
|
||||
sta ActiveWeapon,x
|
||||
HighForce
|
||||
rts
|
||||
@@ -554,7 +556,7 @@ RepeatAim
|
||||
adc temp2
|
||||
sta NewAngle
|
||||
; set virtual weapon :)
|
||||
lda #ind_Baby_Missile___
|
||||
lda #ind_Baby_Missile
|
||||
sta ActiveWeapon,x
|
||||
; now we have initial valuses
|
||||
mva #%11000000 TestFlightFlag
|
||||
@@ -601,6 +603,7 @@ NoHitInFirstLoopR
|
||||
sbc #5
|
||||
sta NewAngle
|
||||
HitOnRightSideOfTargetR
|
||||
dec NewAngle
|
||||
EndOfFirstLoopR
|
||||
mva #5 modify ; set counter (5 turns)
|
||||
SecondLoopR
|
||||
@@ -695,6 +698,7 @@ NoHitInFirstLoopL
|
||||
adc #5
|
||||
sta NewAngle
|
||||
HitOnLeftSideOfTargetL
|
||||
inc NewAngle
|
||||
EndOfFirstLoopL
|
||||
mva #5 modify ; set counter (5 turns)
|
||||
SecondLoopL
|
||||
@@ -869,7 +873,7 @@ SorryNoPurchase
|
||||
; mva #2 tempXroller; number of offensive purchases to perform
|
||||
ldx TankNr
|
||||
@
|
||||
randomize ind_Battery________ ind_StrongParachute
|
||||
randomize ind_Battery ind_StrongParachute
|
||||
jsr TryToPurchaseOnePiece
|
||||
; dec tempXroller
|
||||
; bne @-
|
||||
@@ -878,7 +882,7 @@ SorryNoPurchase
|
||||
mva #4 tempXroller; number of offensive purchases to perform
|
||||
;ldx TankNr
|
||||
@
|
||||
randomize ind_Missile________ ind_Heavy_Roller___
|
||||
randomize ind_Missile ind_Heavy_Roller
|
||||
jsr TryToPurchaseOnePiece
|
||||
dec tempXroller
|
||||
bne @-
|
||||
@@ -891,7 +895,7 @@ SorryNoPurchase
|
||||
; mva #2 tempXroller; number of offensive purchases to perform
|
||||
ldx TankNr
|
||||
@
|
||||
randomize ind_Battery________ ind_Bouncy_Castle__
|
||||
randomize ind_Battery ind_Bouncy_Castle
|
||||
jsr TryToPurchaseOnePiece
|
||||
dec tempXroller
|
||||
; bpl @-
|
||||
@@ -900,7 +904,7 @@ SorryNoPurchase
|
||||
mva #6 tempXroller; number of purchases to perform
|
||||
;ldx TankNr
|
||||
@
|
||||
randomize ind_Missile________ ind_Dirt_Charge____
|
||||
randomize ind_Missile ind_Dirt_Charge
|
||||
jsr TryToPurchaseOnePiece
|
||||
dec tempXroller
|
||||
bne @-
|
||||
@@ -918,7 +922,7 @@ SorryNoPurchase
|
||||
; first try to buy defensives
|
||||
; mva #1 tempXroller; number of defensive purchases to perform
|
||||
@
|
||||
randomize ind_Battery________ ind_Bouncy_Castle__
|
||||
randomize ind_Battery ind_Bouncy_Castle
|
||||
jsr TryToPurchaseOnePiece
|
||||
dec tempXroller
|
||||
bpl @-
|
||||
@@ -928,7 +932,7 @@ SorryNoPurchase
|
||||
asl ;*2
|
||||
sta tempXroller ; perform this many purchase attempts
|
||||
@
|
||||
randomize ind_Missile________ ind_Dirt_Charge____
|
||||
randomize ind_Missile ind_Dirt_Charge
|
||||
jsr TryToPurchaseOnePiece
|
||||
dec tempXroller
|
||||
bpl @-
|
||||
@@ -946,7 +950,7 @@ SorryNoPurchase
|
||||
; first try to buy defensives
|
||||
; mva #1 tempXroller; number of defensive purchases to perform
|
||||
@
|
||||
randomize ind_Battery________ ind_Bouncy_Castle__
|
||||
randomize ind_Battery ind_Bouncy_Castle
|
||||
jsr TryToPurchaseOnePiece2
|
||||
dec tempXroller
|
||||
bpl @-
|
||||
@@ -956,7 +960,7 @@ SorryNoPurchase
|
||||
:3 asl ;*8
|
||||
sta tempXroller ; perform this many purchase attempts
|
||||
@
|
||||
randomize first_offensive____ last_offensive_____
|
||||
randomize first_offensive last_offensive
|
||||
jsr TryToPurchaseOnePiece2
|
||||
dec tempXroller
|
||||
bpl @-
|
||||
@@ -968,7 +972,7 @@ SorryNoPurchase
|
||||
; choose the best weapon
|
||||
; X - TankNr
|
||||
;----------------------------------------------
|
||||
ldy #ind_Dirt_Charge____+1 ;the last weapon to choose +1 (not BFG or Laser :) )
|
||||
ldy #ind_Dirt_Charge +1 ;the last weapon to choose +1 (not BFG or Laser :) )
|
||||
NotFromAll
|
||||
; Y - the last offensive weapon to use + 1
|
||||
lda TanksWeaponsTableL,x
|
||||
|
||||
@@ -1,877 +0,0 @@
|
||||
/***************************************/
|
||||
/* Use MADS http://mads.atari8.info/ */
|
||||
/* Mode: DLI (char mode) */
|
||||
/***************************************/
|
||||
|
||||
;icl "Scorch50.h"
|
||||
;icl "../lib/ATARISYS.ASM"
|
||||
;icl "../lib/macro.hea"
|
||||
|
||||
; --- dmsc LZSS player routine on zero page
|
||||
org $80
|
||||
|
||||
chn_copy .ds 9
|
||||
chn_pos .ds 9
|
||||
bptr .ds 2
|
||||
cur_pos .ds 1
|
||||
chn_bits .ds 1
|
||||
|
||||
bit_data .ds 1
|
||||
|
||||
fcnt .ds 2
|
||||
fadr .ds 2
|
||||
fhlp .ds 2
|
||||
cloc .ds 1
|
||||
regA .ds 1
|
||||
regX .ds 1
|
||||
regY .ds 1
|
||||
|
||||
WIDTH = 40
|
||||
HEIGHT = 30
|
||||
|
||||
; --- BASIC switch OFF
|
||||
org $2000\ mva #$ff portb\ rts\ ini $2000
|
||||
|
||||
; --- MAIN PROGRAM
|
||||
org $2000
|
||||
ant dta $C2,a(scr)
|
||||
dta $02,$82,$02,$02,$82,$02,$82,$02,$82,$02,$02,$02,$82,$02,$82,$82
|
||||
dta $02,$02,$82,$02,$02,$82,$02,$02,$82,$82,$02,$82,$22
|
||||
;dta $42,a(verline)
|
||||
dta $41,a(ant)
|
||||
|
||||
;verline
|
||||
; :37 dta d" "
|
||||
; dta build
|
||||
|
||||
scr ins "Scorch50.scr"
|
||||
|
||||
.ds 0*40
|
||||
|
||||
.ALIGN $0400
|
||||
fnt ins "Scorch50.fnt"
|
||||
|
||||
ift USESPRITES
|
||||
.ALIGN $0800
|
||||
pmg .ds $0300
|
||||
ift FADECHR = 0
|
||||
SPRITES
|
||||
els
|
||||
.ds $500
|
||||
eif
|
||||
eif
|
||||
|
||||
|
||||
song_data
|
||||
ins 'mmm_16.lzs'
|
||||
song_end
|
||||
|
||||
buffers
|
||||
.ds 256 * 9
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Song Initialization - this runs in the first tick:
|
||||
;
|
||||
.proc init_song
|
||||
|
||||
mva #1 bit_data
|
||||
|
||||
; Example: here initializes song pointer:
|
||||
|
||||
;mwa #song_data song_ptr
|
||||
|
||||
; Init all channels:
|
||||
ldx #8
|
||||
ldy #0
|
||||
clear
|
||||
; Read just init value and store into buffer and POKEY
|
||||
jsr get_byte
|
||||
sta POKEY, x
|
||||
sty chn_copy, x
|
||||
cbuf
|
||||
sta buffers + 255
|
||||
inc cbuf + 2
|
||||
dex
|
||||
bpl clear
|
||||
|
||||
; Initialize buffer pointer:
|
||||
sty bptr
|
||||
sty cur_pos
|
||||
rts
|
||||
.endp
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Wait for next frame
|
||||
;
|
||||
.proc wait_frame
|
||||
|
||||
lda 20
|
||||
delay
|
||||
cmp 20
|
||||
beq delay
|
||||
.endp
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Play one frame of the song
|
||||
;
|
||||
.proc play_frame
|
||||
lda #>buffers
|
||||
sta bptr+1
|
||||
|
||||
lda song_data
|
||||
sta chn_bits
|
||||
ldx #8
|
||||
|
||||
; Loop through all "channels", one for each POKEY register
|
||||
chn_loop:
|
||||
lsr chn_bits
|
||||
bcs skip_chn ; C=1 : skip this channel
|
||||
|
||||
lda chn_copy, x ; Get status of this stream
|
||||
bne do_copy_byte ; If > 0 we are copying bytes
|
||||
|
||||
; We are decoding a new match/literal
|
||||
lsr bit_data ; Get next bit
|
||||
bne got_bit
|
||||
jsr get_byte ; Not enough bits, refill!
|
||||
ror ; Extract a new bit and add a 1 at the high bit (from C set above)
|
||||
sta bit_data ;
|
||||
got_bit:
|
||||
jsr get_byte ; Always read a byte, it could mean "match size/offset" or "literal byte"
|
||||
bcs store ; Bit = 1 is "literal", bit = 0 is "match"
|
||||
|
||||
sta chn_pos, x ; Store in "copy pos"
|
||||
|
||||
jsr get_byte
|
||||
sta chn_copy, x ; Store in "copy length"
|
||||
|
||||
; And start copying first byte
|
||||
do_copy_byte:
|
||||
dec chn_copy, x ; Decrease match length, increase match position
|
||||
inc chn_pos, x
|
||||
ldy chn_pos, x
|
||||
|
||||
; Now, read old data, jump to data store
|
||||
lda (bptr), y
|
||||
|
||||
store:
|
||||
ldy cur_pos
|
||||
sta POKEY, x ; Store to output and buffer
|
||||
sta (bptr), y
|
||||
|
||||
skip_chn:
|
||||
; Increment channel buffer pointer
|
||||
inc bptr+1
|
||||
|
||||
dex
|
||||
bpl chn_loop ; Next channel
|
||||
|
||||
inc cur_pos
|
||||
.endp
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Check for ending of song and jump to the next frame
|
||||
;
|
||||
|
||||
; not checking really so the tune gets funky :)))
|
||||
;lda song_ptr + 1
|
||||
;cmp #>song_end
|
||||
;bne wait_frame
|
||||
;lda song_ptr
|
||||
;cmp #<song_end
|
||||
;bne wait_frame
|
||||
|
||||
end_loop
|
||||
rts
|
||||
|
||||
song_ptr = get_byte + 1
|
||||
.proc get_byte
|
||||
lda song_data+1
|
||||
inc song_ptr
|
||||
bne skip
|
||||
inc song_ptr+1
|
||||
skip
|
||||
rts
|
||||
.endp
|
||||
|
||||
|
||||
main
|
||||
|
||||
jsr init_song
|
||||
|
||||
; ; copy system font to $a000
|
||||
; ldx #0
|
||||
;@ lda $e000,x
|
||||
; sta $a000,x
|
||||
; ;lda $e100,x ; i need digits only :]
|
||||
; ;sta $a100,x
|
||||
; ;lda $e200,x
|
||||
; ;sta $a200,x
|
||||
; ;lda $e300,x
|
||||
; ;sta $a300,x
|
||||
; inx
|
||||
; bne @-
|
||||
|
||||
; --- init PMG
|
||||
|
||||
ift USESPRITES
|
||||
mva >pmg pmbase ;missiles and players data address
|
||||
mva #$03 GRACTL ;enable players and missiles
|
||||
eif
|
||||
|
||||
lda:cmp:req $14 ;wait 1 frame
|
||||
|
||||
sei ;stop IRQ interrupts
|
||||
mva #$00 nmien ;stop NMI interrupts
|
||||
sta dmactl
|
||||
;mva #$fe portb ;switch off ROM to get 16k more ram
|
||||
|
||||
;mwa #NMI $fffa ;new NMI handler
|
||||
|
||||
sta COLOR4
|
||||
lda #$0E
|
||||
sta COLOR1
|
||||
lda #$84
|
||||
sta COLOR2
|
||||
lda #$0E
|
||||
sta COLOR3
|
||||
lda #$02
|
||||
|
||||
|
||||
|
||||
VMAIN NMI.vbl,6 ;jsr SetVBL
|
||||
VDLI DLI.dli_start
|
||||
|
||||
|
||||
mva #1 vscrol
|
||||
|
||||
mva #$c0 nmien ;switch on NMI+DLI again
|
||||
|
||||
_lp lda trig0 ; FIRE #0
|
||||
beq stop
|
||||
|
||||
lda trig1 ; FIRE #1
|
||||
beq stop
|
||||
|
||||
lda consol ; START
|
||||
and #1
|
||||
beq stop
|
||||
|
||||
lda skctl
|
||||
and #$04
|
||||
bne _lp ;wait to press any key; here you can put any own routine
|
||||
|
||||
|
||||
stop
|
||||
|
||||
cli
|
||||
vmain sysvbv,6
|
||||
|
||||
mva #$00 GRACTL ;PMG disabled
|
||||
tax
|
||||
sta:rne hposp0,x+
|
||||
|
||||
;mva #$ff portb ;ROM switch on
|
||||
mva #$40 nmien ;only NMI interrupts, DLI disabled
|
||||
;cli ;IRQ enabled
|
||||
|
||||
lda #0
|
||||
ldx #8
|
||||
@ sta POKEY,x
|
||||
dex
|
||||
bpl @-
|
||||
|
||||
|
||||
;no glitching please (issue #67)
|
||||
lda #0
|
||||
sta $D400 ;dmactl
|
||||
sta $022F ;dmactls
|
||||
rts ;return to ... DOS
|
||||
|
||||
; --- DLI PROGRAM
|
||||
|
||||
.local DLI
|
||||
|
||||
?old_dli = *
|
||||
|
||||
dli_start
|
||||
|
||||
dli13
|
||||
sta regA
|
||||
|
||||
sta wsync ;line=8
|
||||
sta wsync ;line=9
|
||||
sta wsync ;line=10
|
||||
sta wsync ;line=11
|
||||
sta wsync ;line=12
|
||||
sta wsync ;line=13
|
||||
c9 lda #$14
|
||||
sta wsync ;line=14
|
||||
sta colpm3
|
||||
DLINEW DLI.dli2 1 0 0
|
||||
|
||||
dli2
|
||||
sta regA
|
||||
lda >fnt+$400*$01
|
||||
sta wsync ;line=24
|
||||
sta chbase
|
||||
DLINEW dli3 1 0 0
|
||||
|
||||
dli3
|
||||
sta regA
|
||||
lda >fnt+$400*$02
|
||||
sta wsync ;line=48
|
||||
sta chbase
|
||||
sta wsync ;line=49
|
||||
sta wsync ;line=50
|
||||
sta wsync ;line=51
|
||||
s3 lda #$07
|
||||
sta wsync ;line=52
|
||||
sta sizem
|
||||
DLINEW dli14 1 0 0
|
||||
|
||||
dli14
|
||||
sta regA
|
||||
stx regX
|
||||
sty regY
|
||||
|
||||
x8 lda #$A3
|
||||
sta wsync ;line=64
|
||||
sta hposp3
|
||||
x9 lda #$AB
|
||||
sta wsync ;line=65
|
||||
sta hposm3
|
||||
sta wsync ;line=66
|
||||
sta wsync ;line=67
|
||||
sta wsync ;line=68
|
||||
sta wsync ;line=69
|
||||
sta wsync ;line=70
|
||||
s4 lda #$13
|
||||
x10 ldx #$A6
|
||||
sta wsync ;line=71
|
||||
sta sizem
|
||||
stx hposm2
|
||||
s5 lda #$01
|
||||
x11 ldx #$72
|
||||
x12 ldy #$62
|
||||
sta wsync ;line=72
|
||||
sta sizep2
|
||||
sta sizep3
|
||||
stx hposp2
|
||||
sty hposp3
|
||||
x13 lda #$A9
|
||||
sta wsync ;line=73
|
||||
sta hposp1
|
||||
DLINEW dli4 1 1 1
|
||||
|
||||
dli4
|
||||
sta regA
|
||||
lda >fnt+$400*$03
|
||||
sta wsync ;line=80
|
||||
sta chbase
|
||||
DLINEW dli5 1 0 0
|
||||
|
||||
dli5
|
||||
sta regA
|
||||
stx regX
|
||||
lda >fnt+$400*$04
|
||||
sta wsync ;line=112
|
||||
sta chbase
|
||||
sta wsync ;line=113
|
||||
sta wsync ;line=114
|
||||
sta wsync ;line=115
|
||||
sta wsync ;line=116
|
||||
sta wsync ;line=117
|
||||
sta wsync ;line=118
|
||||
s6 lda #$07
|
||||
x14 ldx #$A3
|
||||
sta wsync ;line=119
|
||||
sta sizem
|
||||
stx hposm1
|
||||
s7 lda #$01
|
||||
x15 ldx #$93
|
||||
sta wsync ;line=120
|
||||
sta sizep1
|
||||
stx hposp1
|
||||
DLINEW dli15 1 1 0
|
||||
|
||||
dli15
|
||||
sta regA
|
||||
stx regX
|
||||
|
||||
sta wsync ;line=128
|
||||
sta wsync ;line=129
|
||||
sta wsync ;line=130
|
||||
sta wsync ;line=131
|
||||
x16 lda #$4A
|
||||
sta wsync ;line=132
|
||||
sta hposp1
|
||||
c10 lda #$D4
|
||||
sta wsync ;line=133
|
||||
sta colpf2
|
||||
s8 lda #$C3
|
||||
x17 ldx #$5A
|
||||
sta wsync ;line=134
|
||||
sta sizem
|
||||
stx hposm3
|
||||
DLINEW dli6 1 1 0
|
||||
|
||||
dli6
|
||||
sta regA
|
||||
stx regX
|
||||
sty regY
|
||||
lda >fnt+$400*$05
|
||||
sta wsync ;line=136
|
||||
sta chbase
|
||||
sta wsync ;line=137
|
||||
sta wsync ;line=138
|
||||
sta wsync ;line=139
|
||||
sta wsync ;line=140
|
||||
sta wsync ;line=141
|
||||
sta wsync ;line=142
|
||||
s9 lda #$C7
|
||||
x18 ldx #$A9
|
||||
sta wsync ;line=143
|
||||
sta sizem
|
||||
stx hposm1
|
||||
s10 lda #$D7
|
||||
x19 ldx #$9E
|
||||
c11 ldy #$02
|
||||
sta wsync ;line=144
|
||||
sta sizem
|
||||
stx hposm2
|
||||
sty colpm2
|
||||
sta wsync ;line=145
|
||||
c12 lda #$04
|
||||
sta wsync ;line=146
|
||||
sta colpm1
|
||||
sta wsync ;line=147
|
||||
sta wsync ;line=148
|
||||
sta wsync ;line=149
|
||||
s11 lda #$00
|
||||
x20 ldx #$74
|
||||
c13 ldy #$02
|
||||
sta wsync ;line=150
|
||||
sta sizep3
|
||||
stx hposp3
|
||||
sty colpm3
|
||||
sta wsync ;line=151
|
||||
sta wsync ;line=152
|
||||
sta wsync ;line=153
|
||||
sta wsync ;line=154
|
||||
sta wsync ;line=155
|
||||
sta wsync ;line=156
|
||||
sta wsync ;line=157
|
||||
c14 lda #$04
|
||||
sta wsync ;line=158
|
||||
sta colpf0
|
||||
DLINEW dli7 1 1 1
|
||||
|
||||
dli7
|
||||
sta regA
|
||||
lda >fnt+$400*$06
|
||||
sta wsync ;line=160
|
||||
sta chbase
|
||||
DLINEW dli8 1 0 0
|
||||
|
||||
dli8
|
||||
sta regA
|
||||
stx regX
|
||||
sty regY
|
||||
lda >fnt+$400*$07
|
||||
sta wsync ;line=184
|
||||
sta chbase
|
||||
sta wsync ;line=185
|
||||
s12 lda #$00
|
||||
x21 ldx #$8E
|
||||
c15 ldy #$08
|
||||
sta wsync ;line=186
|
||||
sta sizep2
|
||||
stx hposp2
|
||||
sty colpm2
|
||||
x22 lda #$4C
|
||||
c16 ldx #$0E
|
||||
sta wsync ;line=187
|
||||
sta hposp3
|
||||
stx colpm3
|
||||
c17 lda #$0A
|
||||
c18 ldx #$34
|
||||
sta wsync ;line=188
|
||||
sta colpf1
|
||||
stx colpm3
|
||||
s13 lda #$43
|
||||
x23 ldx #$49
|
||||
sta wsync ;line=189
|
||||
sta sizem
|
||||
stx hposm3
|
||||
c19 lda #$08
|
||||
c20 ldx #$34
|
||||
sta wsync ;line=190
|
||||
sta colpf1
|
||||
stx colpm2
|
||||
sta wsync ;line=191
|
||||
c21 lda #$0A
|
||||
sta wsync ;line=192
|
||||
sta colpf1
|
||||
c22 lda #$08
|
||||
sta wsync ;line=193
|
||||
sta colpf1
|
||||
c23 lda #$0A
|
||||
sta wsync ;line=194
|
||||
sta colpf1
|
||||
c24 lda #$34
|
||||
sta wsync ;line=195
|
||||
sta colpf2
|
||||
c25 lda #$0C
|
||||
sta wsync ;line=196
|
||||
sta colpf1
|
||||
c26 lda #$0A
|
||||
sta wsync ;line=197
|
||||
sta colpf1
|
||||
c27 lda #$0C
|
||||
sta wsync ;line=198
|
||||
sta colpf1
|
||||
sta wsync ;line=199
|
||||
sta wsync ;line=200
|
||||
c28 lda #$0E
|
||||
sta wsync ;line=201
|
||||
sta colpf1
|
||||
c29 lda #$0C
|
||||
sta wsync ;line=202
|
||||
sta colpf1
|
||||
c30 lda #$0E
|
||||
sta wsync ;line=203
|
||||
sta colpf1
|
||||
c31 lda #$0C
|
||||
sta wsync ;line=204
|
||||
sta colpf1
|
||||
c32 lda #$0E
|
||||
sta wsync ;line=205
|
||||
sta colpf1
|
||||
DLINEW dli16 1 1 1
|
||||
|
||||
dli16
|
||||
sta regA
|
||||
|
||||
sta wsync ;line=208
|
||||
sta wsync ;line=209
|
||||
c33 lda #$0C
|
||||
sta wsync ;line=210
|
||||
sta colpf1
|
||||
c34 lda #$0E
|
||||
sta wsync ;line=211
|
||||
sta colpf1
|
||||
c35 lda #$0C
|
||||
sta wsync ;line=212
|
||||
sta colpf1
|
||||
DLINEW dli9 1 0 0
|
||||
|
||||
dli9
|
||||
sta regA
|
||||
stx regX
|
||||
sty regY
|
||||
lda >fnt+$400*$08
|
||||
c36 ldx #$0A
|
||||
sta wsync ;line=216
|
||||
sta chbase
|
||||
stx colpf1
|
||||
c37 lda #$0C
|
||||
sta wsync ;line=217
|
||||
sta colpf1
|
||||
c38 lda #$0A
|
||||
x24 ldx #$9D
|
||||
c39 ldy #$34
|
||||
sta wsync ;line=218
|
||||
sta colpf1
|
||||
stx hposm1
|
||||
sty colpm1
|
||||
s14 lda #$03
|
||||
x25 ldx #$7D
|
||||
sta wsync ;line=219
|
||||
sta sizep3
|
||||
stx hposp3
|
||||
c40 lda #$08
|
||||
s15 ldx #$13
|
||||
x26 ldy #$45
|
||||
sta wsync ;line=220
|
||||
sta colpf1
|
||||
stx sizem
|
||||
sty hposm2
|
||||
s16 lda #$03
|
||||
x27 ldx #$59
|
||||
sta wsync ;line=221
|
||||
sta sizep2
|
||||
stx hposp2
|
||||
s17 lda #$53
|
||||
x28 ldx #$49
|
||||
x29 ldy #$79
|
||||
sta wsync ;line=222
|
||||
sta sizem
|
||||
stx hposp1
|
||||
sty hposm3
|
||||
c41 lda #$06
|
||||
c42 ldx #$00
|
||||
sta wsync ;line=223
|
||||
sta colpf1
|
||||
stx colpf2
|
||||
lda >fnt+$400*$01
|
||||
s18 ldx #$50
|
||||
x30 ldy #$44
|
||||
sta wsync ;line=224
|
||||
sta chbase
|
||||
stx sizem
|
||||
sty hposm0
|
||||
sta wsync ;line=225
|
||||
c43 lda #$08
|
||||
sta wsync ;line=226
|
||||
sta colpf1
|
||||
c44 lda #$0C
|
||||
sta wsync ;line=227
|
||||
sta colpf1
|
||||
sta wsync ;line=228
|
||||
sta wsync ;line=229
|
||||
c45 lda #$0E
|
||||
sta wsync ;line=230
|
||||
sta colpf1
|
||||
DLINEW dli10 1 1 1
|
||||
|
||||
dli10
|
||||
sta regA
|
||||
lda >fnt+$400*$00
|
||||
sta wsync ;line=232
|
||||
sta chbase
|
||||
;DLINEW dli11 1 0 0
|
||||
|
||||
lda regA
|
||||
rti
|
||||
|
||||
;dli11
|
||||
; sta regA
|
||||
;
|
||||
; lda #>$a000 ; system font
|
||||
; sta wsync ;line=232
|
||||
; sta chbase
|
||||
; lda #$01
|
||||
; sta gtictl
|
||||
;
|
||||
; lda regA
|
||||
; rti
|
||||
|
||||
|
||||
.endl
|
||||
|
||||
; ---
|
||||
|
||||
CHANGES = 1
|
||||
FADECHR = 0
|
||||
|
||||
SCHR = 127
|
||||
|
||||
dliv = $0200
|
||||
|
||||
; ---
|
||||
|
||||
.proc NMI
|
||||
|
||||
bit nmist
|
||||
bpl VBL
|
||||
|
||||
jmp DLI.dli_start
|
||||
|
||||
|
||||
VBL
|
||||
sta regA
|
||||
stx regX
|
||||
sty regY
|
||||
|
||||
;sta nmist ;reset NMI flag
|
||||
|
||||
mwa #ant dlptr ;ANTIC address program
|
||||
|
||||
mva #@dmactl(standard|dma|lineX1|players|missiles) dmactl ;set new screen width
|
||||
|
||||
inc cloc ;little timer
|
||||
|
||||
; Initial values
|
||||
|
||||
lda >fnt+$400*$00
|
||||
sta chbase
|
||||
c0 lda #$00
|
||||
sta colbak
|
||||
c1 lda #$0E
|
||||
sta colpf1
|
||||
c2 lda #$84
|
||||
sta colpf2
|
||||
c3 lda #$0E
|
||||
sta colpf3
|
||||
lda #$02
|
||||
sta CHACTL
|
||||
lda #$01
|
||||
sta PRIOR
|
||||
sta sizep0
|
||||
s0 lda #$03
|
||||
sta sizem
|
||||
x0 lda #$D0
|
||||
sta hposp0
|
||||
x1 lda #$28
|
||||
sta hposm0
|
||||
c4 lda #$00
|
||||
sta colpm0
|
||||
x2 lda #$A2
|
||||
sta hposm3
|
||||
c5 lda #$0E
|
||||
sta colpm3
|
||||
s1 lda #$00
|
||||
sta sizep2
|
||||
sta sizep3
|
||||
x3 lda #$92
|
||||
sta hposp2
|
||||
x4 lda #$8A
|
||||
sta hposp3
|
||||
c6 lda #$14
|
||||
sta colpm2
|
||||
s2 lda #$00
|
||||
sta sizep1
|
||||
x5 lda #$9A
|
||||
sta hposp1
|
||||
c7 lda #$14
|
||||
sta colpm1
|
||||
x6 lda #$A4
|
||||
sta hposm2
|
||||
x7 lda #$A6
|
||||
sta hposm1
|
||||
c8 lda #$00
|
||||
sta colpf0
|
||||
|
||||
mwa #DLI.dli_start dliv ;set the first address of DLI interrupt
|
||||
|
||||
;this area is for yours routines
|
||||
jsr play_frame
|
||||
|
||||
quit
|
||||
lda regA
|
||||
ldx regX
|
||||
ldy regY
|
||||
jmp sysvbv
|
||||
|
||||
.endp
|
||||
|
||||
; ---
|
||||
ini main
|
||||
; ---
|
||||
|
||||
;opt l- ; this stops the listing
|
||||
|
||||
.MACRO SPRITES
|
||||
missiles
|
||||
.he 00 00 00 00 00 00 00 00 03 03 C3 03 03 03 03 03
|
||||
.he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
|
||||
.he 03 03 03 03 03 03 03 03 03 83 83 83 C3 C3 C3 C3
|
||||
.he C3 C3 C3 C3 C3 E3 E3 E3 E3 E3 E3 F3 F3 F3 F3 FB
|
||||
.he FB FB FB FB FF FF FF FF F3 33 83 83 83 83 C3 D3
|
||||
.he D3 D3 13 03 03 03 03 03 03 03 03 03 03 03 03 03
|
||||
.he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
|
||||
.he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 0F
|
||||
.he 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 03 03 03 03 C3 C3
|
||||
.he C3 C3 C3 C3 C3 C3 C3 C3 C3 D3 FF FF 3F 3F 3F 3F
|
||||
.he 3F 3F 33 13 03 03 03 03 03 03 03 03 03 03 03 03
|
||||
.he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
|
||||
.he 03 03 03 03 03 03 03 43 43 C3 C3 C3 C3 03 03 03
|
||||
.he 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
|
||||
.he 03 03 0F 0F 3F 3F FF FC FE FE FF DB 03 03 03 03
|
||||
.he 03 03 03 03 03 03 03 03 00 00 00 00 00 00 00 00
|
||||
player0
|
||||
.he 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00
|
||||
player1
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 F0 FC FE FE FF FF FF FF
|
||||
.he FF 0F 0F 0F 0F 0F 0F 0F 0F 0F 07 07 07 07 07 07
|
||||
.he 03 03 03 FF FF FF FF FF CF CF FF FF FF FF FF 9F
|
||||
.he 9F FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00
|
||||
.he 00 F0 F0 F0 F0 78 F8 78 78 78 78 38 78 38 3C 3C
|
||||
.he 3C 3C 1C 3C 1C 1C 1C 1C 1E 1E 1E 1E 0E 1E 0E 0E
|
||||
.he 0E 0F 07 0F 07 0F 07 07 07 07 07 07 06 06 06 06
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF 00 00 3E 3F 7F
|
||||
.he 7F 7F 7F 7F 7F 7F 7F 3F 3F 3F 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 FF FF FF FF FF FF 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
player2
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF
|
||||
.he FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 FF FF FF FF FF 99 99 FF FF FF FF FF 33
|
||||
.he 33 FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00
|
||||
.he 00 00 80 F0 F8 F8 F8 FC FC FC FC FC FC FC FC FC
|
||||
.he FC FE FE FE FE FE FE FF FF FF FF FF FF FF FE FC
|
||||
.he F8 F8 F8 F8 F0 F0 F0 F0 F0 F0 F0 F0 E0 E0 E0 E0
|
||||
.he E0 E0 E0 FC FE FE FF FF 8F 87 87 87 07 07 07 07
|
||||
.he 07 07 07 07 07 07 07 03 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 F8 FC FC FE FE FF FF 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 FF FF FF FF FF FF 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
player3
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 01 07 0F 1F 1F 3F 3F 7F
|
||||
.he 7F 78 78 F0 F0 F0 F0 F8 F8 F8 78 7C 7C 7C 3C 3E
|
||||
.he 3E 3E 1E 1F 1F 1F 0F 0F 0F 0F 0F 1F 1F 1F 1F 1F
|
||||
.he 1F 3F 3F 3F 3F 3F 3F 3F FF 7F 7F 3F 3F 1F 1F 0F
|
||||
.he 1F 1F 1F 3F 3F 3F 3F 3F 3F 3B 30 30 30 30 30 30
|
||||
.he 30 30 30 30 38 3E 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F
|
||||
.he 7F 7F 7F 7F 7F 7F 7F FF FF FF FF FF FF FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF 7F 7F 7F 7F 7F 7F FF FF
|
||||
.he FF FF FF FF FE FE FE FE FE FE FE FE FC 1C FF 7E
|
||||
.he 7E FE FE FE FE FF FF FF 7F 7E 7E 3C 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 7C FE FE FF FF FF 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 FF FF FF FF FF FF FF FF FF 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.ENDM
|
||||
|
||||
USESPRITES = 1
|
||||
|
||||
.MACRO DLINEW
|
||||
mva <:1 dliv
|
||||
ift [>?old_dli]<>[>:1]
|
||||
mva >:1 dliv+1
|
||||
eif
|
||||
|
||||
ift :2
|
||||
lda regA
|
||||
eif
|
||||
|
||||
ift :3
|
||||
ldx regX
|
||||
eif
|
||||
|
||||
ift :4
|
||||
ldy regY
|
||||
eif
|
||||
|
||||
rti
|
||||
|
||||
.def ?old_dli = *
|
||||
.ENDM
|
||||
|
||||
@@ -17,4 +17,3 @@ pressed
|
||||
jmp @-
|
||||
|
||||
run joytest
|
||||
|
||||
@@ -616,28 +616,33 @@ qq3
|
||||
qq5
|
||||
stx v_audctl
|
||||
rmt_p5
|
||||
lda v_ainstrspeed
|
||||
|
||||
; lda v_ainstrspeed
|
||||
.IF TARGET = 800
|
||||
ldx #$10 ; pseudo stereo
|
||||
bne SetPokey_OffsetX ; pseudo stereo
|
||||
.ELIF TARGET = 5200
|
||||
rts
|
||||
.ENDIF
|
||||
SetPokey
|
||||
ldy v_audctl
|
||||
|
||||
ldx #0 ; POKEY registers offset (for stereo)
|
||||
SetPokey_OffsetX
|
||||
lda trackn_audf+0
|
||||
ldx trackn_audc+0
|
||||
sta AUDF1
|
||||
stx AUDC1
|
||||
sta AUDF1,x
|
||||
lda trackn_audc+0
|
||||
sta AUDC1,x
|
||||
lda trackn_audf+1
|
||||
ldx trackn_audc+1
|
||||
sta AUDF2
|
||||
stx AUDC2
|
||||
sta AUDF2,x
|
||||
lda trackn_audc+1
|
||||
sta AUDC2,x
|
||||
lda trackn_audf+2
|
||||
ldx trackn_audc+2
|
||||
sta AUDF3
|
||||
stx AUDC3
|
||||
sta AUDF3,x
|
||||
lda trackn_audc+2
|
||||
sta AUDC3,x
|
||||
lda trackn_audf+3
|
||||
ldx trackn_audc+3
|
||||
sta AUDF4
|
||||
stx AUDC4
|
||||
sty AUDCTL
|
||||
sta AUDF4,x
|
||||
lda trackn_audc+3
|
||||
sta AUDC4,x
|
||||
lda v_audctl
|
||||
sta AUDCTL,x
|
||||
rts
|
||||
RMTPLAYEREND
|
||||
|
||||
@@ -0,0 +1,152 @@
|
||||
; --- dmsc LZSS player routine
|
||||
|
||||
song_data
|
||||
ins 'mmm_16.lzs'
|
||||
song_end
|
||||
|
||||
buffers
|
||||
.ds 256 * 9
|
||||
|
||||
POKEY2 = POKEY+$10 ; stereo
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Song Initialization - this runs in the first tick:
|
||||
;
|
||||
.proc init_song
|
||||
|
||||
; pokeys init
|
||||
lda #3 ; stereo
|
||||
sta POKEY+$0f ; stereo
|
||||
sta POKEY2+$0f ; stereo
|
||||
|
||||
mva #1 bit_data
|
||||
|
||||
; Example: here initializes song pointer:
|
||||
|
||||
;mwa #song_data song_ptr
|
||||
|
||||
; Init all channels:
|
||||
ldx #8
|
||||
ldy #0
|
||||
clear
|
||||
; Read just init value and store into buffer and POKEY
|
||||
jsr get_byte
|
||||
sta POKEY, x
|
||||
sta POKEY2,x ; stereo
|
||||
sta stereo_buff,x ; stereo
|
||||
sty chn_copy, x
|
||||
cbuf
|
||||
sta buffers + 255
|
||||
inc cbuf + 2
|
||||
dex
|
||||
bpl clear
|
||||
|
||||
; Initialize buffer pointer:
|
||||
sty bptr
|
||||
sty cur_pos
|
||||
rts
|
||||
.endp
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Wait for next frame
|
||||
;
|
||||
.proc wait_frame
|
||||
|
||||
lda 20
|
||||
delay
|
||||
cmp 20
|
||||
beq delay
|
||||
.endp
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Play one frame of the song
|
||||
;
|
||||
.proc play_frame
|
||||
ldx #8 ; stereo
|
||||
@ lda stereo_buff,x ; stereo
|
||||
sta POKEY2,x ; stereo
|
||||
dex ;stereo
|
||||
bpl @- ; stereo
|
||||
|
||||
lda #>buffers
|
||||
sta bptr+1
|
||||
|
||||
lda song_data
|
||||
sta chn_bits
|
||||
ldx #8
|
||||
|
||||
; Loop through all "channels", one for each POKEY register
|
||||
chn_loop:
|
||||
lsr chn_bits
|
||||
bcs skip_chn ; C=1 : skip this channel
|
||||
|
||||
lda chn_copy, x ; Get status of this stream
|
||||
bne do_copy_byte ; If > 0 we are copying bytes
|
||||
|
||||
; We are decoding a new match/literal
|
||||
lsr bit_data ; Get next bit
|
||||
bne got_bit
|
||||
jsr get_byte ; Not enough bits, refill!
|
||||
ror ; Extract a new bit and add a 1 at the high bit (from C set above)
|
||||
sta bit_data ;
|
||||
got_bit:
|
||||
jsr get_byte ; Always read a byte, it could mean "match size/offset" or "literal byte"
|
||||
bcs store ; Bit = 1 is "literal", bit = 0 is "match"
|
||||
|
||||
sta chn_pos, x ; Store in "copy pos"
|
||||
|
||||
jsr get_byte
|
||||
sta chn_copy, x ; Store in "copy length"
|
||||
|
||||
; And start copying first byte
|
||||
do_copy_byte:
|
||||
dec chn_copy, x ; Decrease match length, increase match position
|
||||
inc chn_pos, x
|
||||
ldy chn_pos, x
|
||||
|
||||
; Now, read old data, jump to data store
|
||||
lda (bptr), y
|
||||
|
||||
store:
|
||||
ldy cur_pos
|
||||
sta POKEY,x ; Store to output and buffer
|
||||
sta stereo_buff,x ; stereo
|
||||
sta (bptr), y
|
||||
|
||||
skip_chn:
|
||||
; Increment channel buffer pointer
|
||||
inc bptr+1
|
||||
|
||||
dex
|
||||
bpl chn_loop ; Next channel
|
||||
|
||||
inc cur_pos
|
||||
.endp
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Check for ending of song and jump to the next frame
|
||||
;
|
||||
|
||||
; not checking really so the tune gets funky :)))
|
||||
;lda song_ptr + 1
|
||||
;cmp #>song_end
|
||||
;bne wait_frame
|
||||
;lda song_ptr
|
||||
;cmp #<song_end
|
||||
;bne wait_frame
|
||||
|
||||
end_loop
|
||||
rts
|
||||
|
||||
song_ptr = get_byte + 1
|
||||
.proc get_byte
|
||||
lda song_data+1
|
||||
inc song_ptr
|
||||
bne skip
|
||||
inc song_ptr+1
|
||||
skip
|
||||
rts
|
||||
.endp
|
||||
|
||||
stereo_buff ; stereo
|
||||
.ds 9 ; stereo
|
||||
@@ -0,0 +1,73 @@
|
||||
; ----------------------------------
|
||||
; RastaConverter by Ilmenit v.Beta7
|
||||
; ----------------------------------
|
||||
missiles
|
||||
.ds $100
|
||||
player0
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 60 A0 26 1E 00 00 00 00
|
||||
.he 08 04 0E 0E 0F 0F 1E 07 03 02 02 C7 D7 F7 F7 77
|
||||
.he 77 37 F7 37 57 46 6E B0 B0 A0 C1 60 7C 1E 07 05
|
||||
.he 01 03 03 07 07 19 1F 1B 1B B2 53 BB 43 D3 60 38
|
||||
.he 01 7C 7B 41 C3 87 E7 85 75 02 C8 C8 9F 12 1E 9E
|
||||
.he 1E 9E 9E 9E F2 EB BF 1F 3F C7 00 7F 7F 7F 7F 7F
|
||||
.he 3F 3D 1D 0D 38 38 0F 1F 00 0C 04 04 08 10 E0 C0
|
||||
.he E4 E2 E0 E8 E0 7A EE FD F4 78 7F 7B A1 31 C5 56
|
||||
.he C6 D0 3C F7 90 CF 28 08 2C 3C 3C 3C 36 1D 14 36
|
||||
.he 32 30 38 1C 1E 38 70 FC FB F3 FE 8F D7 EF 43 83
|
||||
.he BA F9 F8 F8 1C 1C 0C 04 04 04 04 FA FB FA 30 70
|
||||
.he 70 78 F8 38 3F 00 03 03 0B 0F 07 13 03 03 13 C0
|
||||
.he CA 9A BF 9F 3F 5B 1F 9F FF CF 59 C4 0B EC 51 8F
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
player1
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 FE FE FE FE FE FF 03 03
|
||||
.he FF FF FF FF FF 01 FF FF DF DF DF 0F 1F 0F 1F 0F
|
||||
.he 1F 0F 1F 0E 1E CE DE DE FE 5F 3E 1E 83 C6 C3 C6
|
||||
.he C3 C7 C7 43 E7 67 E7 77 7F 7F 3F 3F 7F 3F 3E 00
|
||||
.he F0 3C E7 E0 60 E0 E0 E0 E0 E0 E0 E0 E0 E0 E0 77
|
||||
.he 77 07 07 5F 07 7F C7 FF FF FF FF 3E FE 0C C0 C0
|
||||
.he D8 C0 F0 C0 87 00 00 FC 01 00 20 20 50 10 50 5C
|
||||
.he 4C 44 60 6C 3C 38 C0 C8 98 39 1D 1F 1E C8 00 01
|
||||
.he 01 01 3F F2 F3 F6 E7 F7 D5 07 77 F7 FF FF DF 9F
|
||||
.he 6F FF FF BF FF FF 48 80 80 80 80 FF FF FF FF FF
|
||||
.he FF FF FF 7F 7F 7F 7F 5F DF FF FD FF FF FE F8 07
|
||||
.he 67 3F 27 7F 27 3F 27 7F DF A0 F8 E4 F8 E4 FC E0
|
||||
.he D8 E0 D8 20 95 E2 3F E0 7A E2 9E 81 5A CE 83 8C
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
player2
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 60 81 71 93 73 BB F9 BF
|
||||
.he F8 BF FD FC FC FC FC 8C 0C 88 0C 8C 38 38 B8 3A
|
||||
.he BA B8 3A BA BA B9 AC 0C CC 0C CC 1C 9C 7C 3C FC
|
||||
.he FA FC FE FC F4 F2 F0 72 72 26 52 22 C2 06 C2 22
|
||||
.he 38 C0 C0 0E 00 00 00 10 00 12 10 10 30 30 30 30
|
||||
.he 70 30 10 30 FF EC 3F EC 3F EC 3F ED 3C EC 3F ED
|
||||
.he 3F 6C 3F 2D 3F FE 10 18 1E 1E 1E 1C 1D E4 98 E4
|
||||
.he E8 DC E8 38 20 50 A8 58 AB 7E 36 1B E0 02 21 10
|
||||
.he 10 EC 20 05 EE 82 64 61 6D 24 6D 78 30 9C 75 5D
|
||||
.he 5D 1D 3D 57 4D E7 E7 24 0A 0C 38 1A 08 08 0C 0C
|
||||
.he 38 1C 18 0E 3E 3C 3E 3E 3E 3A 3A 3C 37 7A 3E 7E
|
||||
.he 3E 3F 10 2A 19 3A 39 1B 19 38 3E 38 18 3B 00 E0
|
||||
.he 50 C0 72 F8 68 DE 0A FF 1E 5A 1E 2B 16 FB DF FB
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
player3
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 06 DF CE FF 6E FF 60 47
|
||||
.he 60 E7 C0 D0 D8 D0 D8 DE CE EE EE E4 E6 E4 F1 F4
|
||||
.he F0 F0 D8 D8 D8 D0 D0 C6 C1 C6 D4 DF FF FF FF FE
|
||||
.he FE FE FE FE FE FE FE FF FF FF FF FF FE FF FE FF
|
||||
.he FF FE FE FF FF FF FF FF FF FF FF FC FE FF FF FF
|
||||
.he FF FF FF FF FF FF FF FF FF FF FF 03 43 F2 DF FF
|
||||
.he DD FF 9F FE BF FE 1E FE 1C FC FF 4E DE 2A 1C 00
|
||||
.he 04 2F 10 8E CC 5C 80 D0 A0 40 20 00 3A 0F FE 16
|
||||
.he 01 BB 5B DB 53 53 F3 F3 F3 E3 F3 F3 F3 F3 F6 FF
|
||||
.he FF FF FF FF FF FF 15 E1 92 C2 36 6B FF FF FF FE
|
||||
.he FE FA FC FA FC F8 FC FD 07 1F 2E 7F 7F FF 7F DF
|
||||
.he 7F FF 7F DF 7F DF 7F FF 7F FF 3A FF E7 FF E7 7F
|
||||
.he A7 FF 27 1F 0F 07 07 20 3F 3F 1F 38 F0 62 D0 E0
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
.he 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
@@ -0,0 +1,41 @@
|
||||
; ----------------------------------
|
||||
; RastaConverter by Ilmenit v.Beta7
|
||||
; ----------------------------------
|
||||
|
||||
; Initial values
|
||||
lda #$0E
|
||||
sta colpf0
|
||||
lda #$96
|
||||
sta colpf1
|
||||
lda #$88
|
||||
sta colpf2
|
||||
lda #$00
|
||||
sta COLBAK
|
||||
lda #$74
|
||||
sta COLPM0
|
||||
lda #$EE
|
||||
sta COLPM1
|
||||
lda #$85
|
||||
sta COLPM2
|
||||
lda #$95
|
||||
sta COLPM3
|
||||
lda #$5E
|
||||
sta HPOSP0
|
||||
lda #$9F
|
||||
sta HPOSP1
|
||||
lda #$45
|
||||
sta HPOSP2
|
||||
lda #$30
|
||||
sta HPOSP3
|
||||
lda #$0
|
||||
ldx #$0
|
||||
ldy #$0
|
||||
|
||||
; Set proper count of wsyncs
|
||||
|
||||
:2 sta wsync
|
||||
|
||||
; Set proper picture height
|
||||
|
||||
|
||||
PIC_HEIGHT = 200
|
||||
|
After Width: | Height: | Size: 109 KiB |
@@ -0,0 +1,282 @@
|
||||
/***************************************/
|
||||
/* Use MADS http://mads.atari8.info/ */
|
||||
/* Mode: GED- (bitmap mode) */
|
||||
/***************************************/
|
||||
|
||||
icl "splash.h"
|
||||
|
||||
; --- dmsc LZSS player routine on zero page
|
||||
org $80
|
||||
|
||||
chn_copy .ds 9
|
||||
chn_pos .ds 9
|
||||
bptr .ds 2
|
||||
cur_pos .ds 1
|
||||
chn_bits .ds 1
|
||||
|
||||
bit_data .ds 1
|
||||
; ---
|
||||
|
||||
org $00
|
||||
|
||||
fcnt .ds 2
|
||||
fadr .ds 2
|
||||
fhlp .ds 2
|
||||
cloc .ds 1
|
||||
regA .ds 1
|
||||
regX .ds 1
|
||||
regY .ds 1
|
||||
byt2 .ds 1
|
||||
|
||||
zc .ds ZCOLORS
|
||||
|
||||
* --- BASIC switch OFF
|
||||
org $2000\ mva #$ff portb\ rts\ ini $2000
|
||||
|
||||
* --- MAIN PROGRAM
|
||||
org $2010
|
||||
IFT PIC_HEIGHT>=204
|
||||
scr ins "output.png.mic", 0, 8160
|
||||
:16 .byte 0
|
||||
ins "output.png.mic" , +8160
|
||||
ELS
|
||||
scr ins "output.png.mic"
|
||||
EIF
|
||||
|
||||
.ifdef nil_used
|
||||
nil :8*40 brk
|
||||
eif
|
||||
|
||||
.ALIGN $0400
|
||||
ant ANTIC_PROGRAM scr,ant
|
||||
|
||||
fnt
|
||||
|
||||
ift USESPRITES
|
||||
.ALIGN $0800
|
||||
.ds $0300
|
||||
pmg SPRITES
|
||||
eif
|
||||
|
||||
FontSplash
|
||||
ins '../../artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt'
|
||||
|
||||
mother
|
||||
; dta d" The Mother of All Games "
|
||||
dta d" Father Unknown of All Games "
|
||||
icl "lzss_player.asm" ; player (and data) for splash music
|
||||
|
||||
main
|
||||
jsr init_song
|
||||
|
||||
* --- init PMG
|
||||
|
||||
ift USESPRITES
|
||||
mva >pmg pmbase ;missiles and players data address
|
||||
mva #$03 pmcntl ;enable players and missiles
|
||||
eif
|
||||
|
||||
lda:cmp:req $14 ;wait 1 frame
|
||||
|
||||
sei ;stop interrups
|
||||
mva #$00 nmien ;stop all interrupts
|
||||
mva #$fe portb ;switch off ROM to get 16k more ram
|
||||
|
||||
ZPINIT
|
||||
|
||||
////////////////////
|
||||
// RASTER PROGRAM //
|
||||
////////////////////
|
||||
|
||||
; jmp line239
|
||||
jmp raster_program_end
|
||||
|
||||
LOOP lda vcount ;synchronization for the first screen (picture) line
|
||||
cmp #$02
|
||||
;sta colpf0
|
||||
;sta colpm0
|
||||
;sta colbak
|
||||
bne LOOP
|
||||
|
||||
mva #%00111110 dmactl ;set new screen width
|
||||
mva <ant dlptr
|
||||
mva >ant dlptr+1
|
||||
|
||||
icl "output.png.rp.ini"
|
||||
|
||||
;--- 16 lines down ---- !!!
|
||||
:16 sta wsync
|
||||
|
||||
; wait 13 cycles !!!
|
||||
:4 nop
|
||||
inc byt2
|
||||
|
||||
;--- wait 18 cycles
|
||||
; jsr _rts
|
||||
; inc byt3
|
||||
|
||||
|
||||
;--- set global offset (23 cycles)
|
||||
jsr _rts
|
||||
cmp byt3\ pha:pla
|
||||
|
||||
;--- empty line
|
||||
jsr wait54cycle
|
||||
inc byt2
|
||||
|
||||
icl "output.png.rp"
|
||||
|
||||
raster_program_end
|
||||
|
||||
lda >FontSplash
|
||||
sta chbase
|
||||
c0 lda #$00
|
||||
sta colbak
|
||||
c1 lda #$00
|
||||
sta colpf0
|
||||
c2 lda #$02
|
||||
sta colpf1
|
||||
c3 lda #$08
|
||||
sta colpf2
|
||||
c4 lda #$00
|
||||
sta colpf3
|
||||
s0 lda #$03
|
||||
sta sizep0
|
||||
sta sizep1
|
||||
sta sizep2
|
||||
sta sizep3
|
||||
mva #$ff sizem
|
||||
sta grafm
|
||||
mva #$20 hposm0
|
||||
mva #$28 hposm1
|
||||
mva #$d0 hposm2
|
||||
mva #$d8 hposm3
|
||||
mva #$02 pmcntl
|
||||
lda #$14
|
||||
sta gtictl
|
||||
|
||||
|
||||
//--------------------
|
||||
// EXIT
|
||||
//--------------------
|
||||
|
||||
lda trig0 ; FIRE #0
|
||||
beq stop
|
||||
|
||||
lda trig1 ; FIRE #1
|
||||
beq stop
|
||||
|
||||
lda consol ; START
|
||||
and #1
|
||||
beq stop
|
||||
|
||||
lda skctl ; ANY KEY
|
||||
and #$04
|
||||
bne skp
|
||||
|
||||
stop mva #$00 pmcntl ;PMG disabled
|
||||
tax
|
||||
sta:rne hposp0,x+
|
||||
|
||||
; silent
|
||||
lda #0
|
||||
ldx #8
|
||||
@ sta POKEY,x
|
||||
sta POKEY2,x ; stereo
|
||||
dex
|
||||
bpl @-
|
||||
|
||||
;no glitching please (issue #67)
|
||||
lda #0
|
||||
sta $D400 ;dmactl
|
||||
sta $022F ;dmactls
|
||||
|
||||
|
||||
mva #$ff portb ;ROM switch on
|
||||
mva #$40 nmien ;only NMI interrupts, DLI disabled
|
||||
cli ;IRQ enabled
|
||||
|
||||
rts ;return to ... DOS
|
||||
skp
|
||||
|
||||
//--------------------
|
||||
jsr play_frame
|
||||
|
||||
jmp LOOP
|
||||
|
||||
;---
|
||||
|
||||
wait54cycle
|
||||
:2 inc byt2
|
||||
wait44cycle
|
||||
inc byt3
|
||||
nop
|
||||
wait36cycle
|
||||
inc byt3
|
||||
jsr _rts
|
||||
wait18cycle
|
||||
inc byt3
|
||||
_rts rts
|
||||
|
||||
byt3 brk
|
||||
|
||||
|
||||
;---
|
||||
|
||||
.MACRO ANTIC_PROGRAM
|
||||
dta $70,$70
|
||||
:+8 dta $4e,a(:1+$0000+#*40)
|
||||
:+8 dta $4e,a(:1+$0140+#*40)
|
||||
:+8 dta $4e,a(:1+$0280+#*40)
|
||||
:+8 dta $4e,a(:1+$03C0+#*40)
|
||||
:+8 dta $4e,a(:1+$0500+#*40)
|
||||
:+8 dta $4e,a(:1+$0640+#*40)
|
||||
:+8 dta $4e,a(:1+$0780+#*40)
|
||||
:+8 dta $4e,a(:1+$08C0+#*40)
|
||||
:+8 dta $4e,a(:1+$0A00+#*40)
|
||||
:+8 dta $4e,a(:1+$0B40+#*40)
|
||||
:+8 dta $4e,a(:1+$0C80+#*40)
|
||||
:+8 dta $4e,a(:1+$0DC0+#*40)
|
||||
:+8 dta $4e,a(:1+$0F00+#*40)
|
||||
:+8 dta $4e,a(:1+$1040+#*40)
|
||||
:+8 dta $4e,a(:1+$1180+#*40)
|
||||
:+8 dta $4e,a(:1+$12C0+#*40)
|
||||
:+8 dta $4e,a(:1+$1400+#*40)
|
||||
:+8 dta $4e,a(:1+$1540+#*40)
|
||||
:+8 dta $4e,a(:1+$1680+#*40)
|
||||
:+8 dta $4e,a(:1+$17C0+#*40)
|
||||
:+8 dta $4e,a(:1+$1900+#*40)
|
||||
:+8 dta $4e,a(:1+$1A40+#*40)
|
||||
:+8 dta $4e,a(:1+$1B80+#*40)
|
||||
:+8 dta $4e,a(:1+$1CC0+#*40)
|
||||
:+8 dta $4e,a(:1+$1E00+#*40)
|
||||
; :+4 dta $4e,a(:1+$1F40+#*40)
|
||||
; :+4 dta $4e,a(:1+$1FF0+#*40)
|
||||
; :+8 dta $4e,a(:1+$2090+#*40)
|
||||
; :+8 dta $4e,a(:1+$21D0+#*40)
|
||||
; :+8 dta $4e,a(:1+$2310+#*40)
|
||||
; :+8 dta $4e,a(:1+$2450+#*40)
|
||||
dta $00
|
||||
dta $42,a(mother)
|
||||
dta $41,a(:2)
|
||||
.ENDM
|
||||
|
||||
CL
|
||||
|
||||
.MACRO ZPINIT
|
||||
.ENDM
|
||||
|
||||
ZCOLORS = 0
|
||||
|
||||
;---
|
||||
ini main
|
||||
;---
|
||||
|
||||
opt l-
|
||||
|
||||
.MACRO SPRITES
|
||||
icl "output.png.pmg"
|
||||
.ENDM
|
||||
|
||||
USESPRITES = 1
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
|
||||
.enum @@dmactl
|
||||
blank = %00
|
||||
narrow = %01
|
||||
standard= %10
|
||||
wide = %11
|
||||
missiles= %100
|
||||
players = %1000
|
||||
lineX1 = %10000
|
||||
lineX2 = %00000
|
||||
dma = %100000
|
||||
.ende
|
||||
|
||||
.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
|
||||
|
||||
* ---------------------------------------------------------------------------------------------
|
||||
* --- GTIA
|
||||
* ---------------------------------------------------------------------------------------------
|
||||
|
||||
gtictl = PRIOR ; rejestr kontroli uk³adu GTIA
|
||||
gtiactl = gtictl
|
||||
|
||||
pmcntl = GRACTL ; rejestr kontroli graczy i pocisków
|
||||
|
||||
* ---------------------------------------------------------------------------------------------
|
||||
* --- POKEY
|
||||
* ---------------------------------------------------------------------------------------------
|
||||
|
||||
irqens = $0010 ; rejestr-cieñ IRQEN
|
||||
irqstat = $0011 ; rejestr-cieñ IRQST
|
||||
|
||||
skstres = SKRES ; rejestr statusu z³¹cza szeregowego (Z)
|
||||
|
||||
* ---------------------------------------------------------------------------------------------
|
||||
* --- ANTIC
|
||||
* ---------------------------------------------------------------------------------------------
|
||||
chrctl = CHACTL ; rejestr kontroli wyœwietlania znaków
|
||||
|
||||
@@ -77,7 +77,7 @@ L72 dta d"FAREWELL, CRUEL WORLD."
|
||||
L73 dta d"REMEMBER THE ALAMO!"
|
||||
L74 dta d"OH MAN!"
|
||||
L75 dta d"DOOUGH!"
|
||||
L76 dta d"ANOTHER DAY, ANOTHER BOMB."
|
||||
L76 dta d"NEW DAY, NEW BOMB."
|
||||
L77 dta d"THIS IS THE END, MY ONLY FRIEND."
|
||||
L78 dta d"VERY FUNNY."
|
||||
L79 dta d"THE FAT LADY SANG."
|
||||
@@ -89,7 +89,7 @@ L84 dta d"POW!"
|
||||
L85 dta d"BIF!"
|
||||
L86 dta d"BAM!"
|
||||
L87 dta d"ZONK!"
|
||||
L88 dta d"I SHOULD'VE LISTENED TO MY MOTHER..."
|
||||
L88 dta d"I SHOULD'VE LISTENED TO MY MOTHER."
|
||||
L89 dta d"I WALK THROUGH THE VALLEY OF THE SHADOW..."
|
||||
L90 dta d"WHAT WAS THAT NOISE?"
|
||||
L91 dta d"MAMA SAID THERE'D BE DAYS LIKE THIS."
|
||||
@@ -114,8 +114,8 @@ L109 dta d"I'VE FALLEN AND I CAN'T GET UP!"
|
||||
L110 dta d"911?"
|
||||
L111 dta d"OH NO! HERE I BLOW AGAIN!"
|
||||
L112 dta d"I'LL BE BACK..."
|
||||
L113 dta d"HEY - I'VE GOT LAWYERS."
|
||||
L114 dta d"TIME TO CALL 1-900-SUE-TANK."
|
||||
L113 dta d"I'VE GOT LAWYERS!"
|
||||
L114 dta d"CALL 1-900-SUE-TANK."
|
||||
L115 dta d"YOU BIG DUMMY!" ;(sanford and son)
|
||||
LEND
|
||||
OffensiveTextTableL
|
||||
|
||||
@@ -32,9 +32,13 @@ LevelNameBeginH
|
||||
.by >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84)
|
||||
;--------------
|
||||
TanksWeaponsTableL
|
||||
.by <TanksWeapon1,<TanksWeapon2,<TanksWeapon3,<TanksWeapon4,<TanksWeapon5,<TanksWeapon6
|
||||
.REPT MaxPlayers, #+1
|
||||
.by <TanksWeapon:1
|
||||
.ENDR
|
||||
TanksWeaponsTableH
|
||||
.by >TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6
|
||||
.REPT MaxPlayers, #+1
|
||||
.by >TanksWeapon:1
|
||||
.ENDR
|
||||
;--------------
|
||||
XtankOffsetGO_L
|
||||
.by 6,56,106,156,206,0
|
||||
@@ -55,7 +59,12 @@ LineGameOver
|
||||
seppukuText
|
||||
dta d"# SEPPUKU! #"
|
||||
areYouSureText
|
||||
.IF TARGET = 800
|
||||
dta d"# SURE? Y/N #"
|
||||
.ELIF TARGET = 5200
|
||||
dta d"#END? Y-1/N-0#"
|
||||
.ENDIF
|
||||
|
||||
lineClear
|
||||
dta d" "
|
||||
|
||||
@@ -69,12 +78,12 @@ GradientAddrH
|
||||
.by >dliColorsFore, >dliColorsFore, >dliColorsFore2
|
||||
dliColorsFore2 ; colors for NTSC
|
||||
.by $0a ; one mountains color
|
||||
.by $7e,$7a,$7c,$6a,$6c,$58,$5a,$48,$4a,$38
|
||||
.by $3a,$16,$18,$e6,$e8,$d4,$d6,$b4,$b6,$b6
|
||||
.by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a
|
||||
.by $3a,$1a,$1a,$ea,$ea,$d8,$d8,$b8,$b8,$b8
|
||||
dliColorsFore2PAL ; colors for PAL
|
||||
.by $0a ; one mountains color
|
||||
.by $7e,$7a,$7c,$6a,$6c,$58,$5a,$48,$4a,$38
|
||||
.by $3a,$16,$18,$e6,$e8,$c4,$c6,$a4,$a6,$a6
|
||||
.by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a
|
||||
.by $3a,$1a,$1a,$ea,$ea,$c8,$c8,$a8,$a8,$a8
|
||||
|
||||
;-----------
|
||||
pmtableL ; addressess of the P/M memory for 6 tanks
|
||||
@@ -197,12 +206,9 @@ bittable2
|
||||
;----------------------------
|
||||
disktance ;tanks distance
|
||||
.by 0,0
|
||||
.by screenwidth/3
|
||||
.by screenwidth/4
|
||||
.by screenwidth/5
|
||||
.by screenwidth/6
|
||||
.by screenwidth/7
|
||||
;max number of players=6
|
||||
.REPT MaxPlayers-1, #+3
|
||||
.by screenwidth/:1
|
||||
.ENDR
|
||||
|
||||
; this table is for deciding where a tank should slide
|
||||
; accordingly to what is below the tank
|
||||
@@ -215,120 +221,120 @@ SlideLeftTable
|
||||
.BY %00000101
|
||||
.BY %00000110
|
||||
.BY %00000111
|
||||
.BY %00001100
|
||||
|
||||
; .BY %00001100
|
||||
SlideLeftTableLen = *-SlideLeftTable
|
||||
;-------------------------------------------------
|
||||
TanksNamesDefault
|
||||
dta d"1st.Tank"
|
||||
dta d"2nd.Tank"
|
||||
dta d"3rd.Tank"
|
||||
dta d"4th.Tank"
|
||||
dta d"5th.Tank"
|
||||
dta d"6th.Tank"
|
||||
.REPT MaxPlayers-3, #+4
|
||||
dta d":1th.Tank"
|
||||
.ENDR
|
||||
;-------------------------------------------------
|
||||
TankShapesTable .BYTE char_tank1___________
|
||||
.BYTE char_tank2___________
|
||||
.BYTE char_tank3___________
|
||||
.BYTE char_tank4___________
|
||||
TankShapesTable .BYTE char_tank1
|
||||
.BYTE char_tank2
|
||||
.BYTE char_tank3
|
||||
.BYTE char_tank4
|
||||
;-------------------------------------------------
|
||||
WeaponPriceH ; weapons prices (tables with prices of weapons)
|
||||
.by >price_Baby_Missile___
|
||||
.by >price_Missile________
|
||||
.by >price_Baby_Nuke______
|
||||
.by >price_Nuke___________
|
||||
.by >price_LeapFrog_______
|
||||
.by >price_Funky_Bomb_____
|
||||
.by >price_MIRV___________
|
||||
.by >price_Death_s_Head___
|
||||
.by >price_Napalm_________
|
||||
.by >price_Hot_Napalm_____
|
||||
.by >price_Tracer_________
|
||||
.by >price_Smoke_Tracer___
|
||||
.by >price_Baby_Roller____
|
||||
.by >price_Roller_________
|
||||
.by >price_Heavy_Roller___
|
||||
.by >price_Riot_Charge____
|
||||
.by >price_Riot_Blast_____
|
||||
.by >price_Riot_Bomb______
|
||||
.by >price_Baby_Missile
|
||||
.by >price_Missile
|
||||
.by >price_Baby_Nuke
|
||||
.by >price_Nuke
|
||||
.by >price_LeapFrog
|
||||
.by >price_Funky_Bomb
|
||||
.by >price_MIRV
|
||||
.by >price_Death_s_Head
|
||||
.by >price_Napalm
|
||||
.by >price_Hot_Napalm
|
||||
.by >price_Tracer
|
||||
.by >price_Smoke_Tracer
|
||||
.by >price_Baby_Roller
|
||||
.by >price_Roller
|
||||
.by >price_Heavy_Roller
|
||||
.by >price_Riot_Charge
|
||||
.by >price_Riot_Blast
|
||||
.by >price_Riot_Bomb
|
||||
.by >price_Heavy_Riot_Bomb
|
||||
.by >price_Baby_Digger____
|
||||
.by >price_Digger_________
|
||||
.by >price_Heavy_Digger___
|
||||
.by >price_Baby_Sandhog___
|
||||
.by >price_Sandhog________
|
||||
.by >price_Heavy_Sandhog__
|
||||
.by >price_Dirt_Clod______
|
||||
.by >price_Dirt_Ball______
|
||||
.by >price_Ton_of_Dirt____
|
||||
.by >price_Liquid_Dirt____
|
||||
.by >price_Dirt_Charge____
|
||||
.by >price_Buy_me_________
|
||||
.by >price_Laser__________
|
||||
.by >price_White_Flag_____
|
||||
.by >price_Battery________
|
||||
.by >price_Hovercraft_____
|
||||
.by >price_Parachute______
|
||||
.by >price_Baby_Digger
|
||||
.by >price_Digger
|
||||
.by >price_Heavy_Digger
|
||||
.by >price_Baby_Sandhog
|
||||
.by >price_Sandhog
|
||||
.by >price_Heavy_Sandhog
|
||||
.by >price_Dirt_Clod
|
||||
.by >price_Dirt_Ball
|
||||
.by >price_Ton_of_Dirt
|
||||
.by >price_Liquid_Dirt
|
||||
.by >price_Dirt_Charge
|
||||
.by >price_Buy_me
|
||||
.by >price_Laser
|
||||
.by >price_White_Flag
|
||||
.by >price_Battery
|
||||
.by >price_Hovercraft
|
||||
.by >price_Parachute
|
||||
.by >price_StrongParachute
|
||||
.by >price_Mag_Deflector__
|
||||
.by >price_Shield_________
|
||||
.by >price_Heavy_Shield___
|
||||
.by >price_Force_Shield___
|
||||
.by >price_Bouncy_Castle__
|
||||
.by >price_Long_Barrel____
|
||||
.by >price_Mag_Deflector
|
||||
.by >price_Shield
|
||||
.by >price_Heavy_Shield
|
||||
.by >price_Force_Shield
|
||||
.by >price_Bouncy_Castle
|
||||
.by >price_Long_Barrel
|
||||
.by >price_Nuclear_Winter_
|
||||
.by >price_Lazy_Boy_______
|
||||
.by >price_Lazy_Darwin____
|
||||
.by >price_Auto_Defense___
|
||||
.by >price_Spy_Hard_______
|
||||
.by >price_Lazy_Boy
|
||||
.by >price_Lazy_Darwin
|
||||
.by >price_Auto_Defense
|
||||
.by >price_Spy_Hard
|
||||
WeaponPriceL
|
||||
.by <price_Baby_Missile___
|
||||
.by <price_Missile________
|
||||
.by <price_Baby_Nuke______
|
||||
.by <price_Nuke___________
|
||||
.by <price_LeapFrog_______
|
||||
.by <price_Funky_Bomb_____
|
||||
.by <price_MIRV___________
|
||||
.by <price_Death_s_Head___
|
||||
.by <price_Napalm_________
|
||||
.by <price_Hot_Napalm_____
|
||||
.by <price_Tracer_________
|
||||
.by <price_Smoke_Tracer___
|
||||
.by <price_Baby_Roller____
|
||||
.by <price_Roller_________
|
||||
.by <price_Heavy_Roller___
|
||||
.by <price_Riot_Charge____
|
||||
.by <price_Riot_Blast_____
|
||||
.by <price_Riot_Bomb______
|
||||
.by <price_Baby_Missile
|
||||
.by <price_Missile
|
||||
.by <price_Baby_Nuke
|
||||
.by <price_Nuke
|
||||
.by <price_LeapFrog
|
||||
.by <price_Funky_Bomb
|
||||
.by <price_MIRV
|
||||
.by <price_Death_s_Head
|
||||
.by <price_Napalm
|
||||
.by <price_Hot_Napalm
|
||||
.by <price_Tracer
|
||||
.by <price_Smoke_Tracer
|
||||
.by <price_Baby_Roller
|
||||
.by <price_Roller
|
||||
.by <price_Heavy_Roller
|
||||
.by <price_Riot_Charge
|
||||
.by <price_Riot_Blast
|
||||
.by <price_Riot_Bomb
|
||||
.by <price_Heavy_Riot_Bomb
|
||||
.by <price_Baby_Digger____
|
||||
.by <price_Digger_________
|
||||
.by <price_Heavy_Digger___
|
||||
.by <price_Baby_Sandhog___
|
||||
.by <price_Sandhog________
|
||||
.by <price_Heavy_Sandhog__
|
||||
.by <price_Dirt_Clod______
|
||||
.by <price_Dirt_Ball______
|
||||
.by <price_Ton_of_Dirt____
|
||||
.by <price_Liquid_Dirt____
|
||||
.by <price_Dirt_Charge____
|
||||
.by <price_Buy_me_________
|
||||
.by <price_Laser__________
|
||||
.by <price_White_Flag_____
|
||||
.by <price_Battery________
|
||||
.by <price_Hovercraft_____
|
||||
.by <price_Parachute______
|
||||
.by <price_Baby_Digger
|
||||
.by <price_Digger
|
||||
.by <price_Heavy_Digger
|
||||
.by <price_Baby_Sandhog
|
||||
.by <price_Sandhog
|
||||
.by <price_Heavy_Sandhog
|
||||
.by <price_Dirt_Clod
|
||||
.by <price_Dirt_Ball
|
||||
.by <price_Ton_of_Dirt
|
||||
.by <price_Liquid_Dirt
|
||||
.by <price_Dirt_Charge
|
||||
.by <price_Buy_me
|
||||
.by <price_Laser
|
||||
.by <price_White_Flag
|
||||
.by <price_Battery
|
||||
.by <price_Hovercraft
|
||||
.by <price_Parachute
|
||||
.by <price_StrongParachute
|
||||
.by <price_Mag_Deflector__
|
||||
.by <price_Shield_________
|
||||
.by <price_Heavy_Shield___
|
||||
.by <price_Force_Shield___
|
||||
.by <price_Bouncy_Castle__
|
||||
.by <price_Long_Barrel____
|
||||
.by <price_Mag_Deflector
|
||||
.by <price_Shield
|
||||
.by <price_Heavy_Shield
|
||||
.by <price_Force_Shield
|
||||
.by <price_Bouncy_Castle
|
||||
.by <price_Long_Barrel
|
||||
.by <price_Nuclear_Winter_
|
||||
.by <price_Lazy_Boy_______
|
||||
.by <price_Lazy_Darwin____
|
||||
.by <price_Auto_Defense___
|
||||
.by <price_Spy_Hard_______
|
||||
.by <price_Lazy_Boy
|
||||
.by <price_Lazy_Darwin
|
||||
.by <price_Auto_Defense
|
||||
.by <price_Spy_Hard
|
||||
|
||||
;-------------------------------------------------
|
||||
; how many units (bulletd) of a given weapon we get for a given price
|
||||
@@ -337,54 +343,54 @@ WeaponPriceL
|
||||
; is not present in the game.
|
||||
; This is the slot for adding new weapons.
|
||||
WeaponUnits
|
||||
.by 10 ;Baby_Missile___;_00
|
||||
.by 5 ;Missile________;_01
|
||||
.by 2 ;Baby_Nuke______;_02
|
||||
.by 1 ;Nuke___________;_03
|
||||
.by 2 ;LeapFrog_______;_04
|
||||
.by 3 ;Funky_Bomb_____;_05
|
||||
.by 2 ;MIRV___________;_06
|
||||
.by 1 ;Death_s_Head___;_07
|
||||
.by 4 ;Napalm_________;_08
|
||||
.by 2 ;Hot_Napalm_____;_09
|
||||
.by 20 ;Tracer_________;_10
|
||||
.by 10 ;Smoke_Tracer___;_11
|
||||
.by 5 ;Baby_Roller____;_12
|
||||
.by 3 ;Roller_________;_13
|
||||
.by 2 ;Heavy_Roller___;_14
|
||||
.by 5 ;Riot_Charge____;_15
|
||||
.by 2 ;Riot_Blast_____;_16
|
||||
.by 5 ;Riot_Bomb______;_17
|
||||
.by 10 ;Baby_Missile ;_00
|
||||
.by 5 ;Missile ;_01
|
||||
.by 2 ;Baby_Nuke ;_02
|
||||
.by 1 ;Nuke ;_03
|
||||
.by 2 ;LeapFrog ;_04
|
||||
.by 3 ;Funky_Bomb ;_05
|
||||
.by 2 ;MIRV ;_06
|
||||
.by 1 ;Death_s_Head ;_07
|
||||
.by 4 ;Napalm ;_08
|
||||
.by 2 ;Hot_Napalm ;_09
|
||||
.by 20 ;Tracer ;_10
|
||||
.by 10 ;Smoke_Tracer ;_11
|
||||
.by 5 ;Baby_Roller ;_12
|
||||
.by 3 ;Roller ;_13
|
||||
.by 2 ;Heavy_Roller ;_14
|
||||
.by 5 ;Riot_Charge ;_15
|
||||
.by 2 ;Riot_Blast ;_16
|
||||
.by 5 ;Riot_Bomb ;_17
|
||||
.by 2 ;Heavy_Riot_Bomb;_18
|
||||
.by 10 ;Baby_Digger____;_19
|
||||
.by 5 ;Digger_________;_20
|
||||
.by 2 ;Heavy_Digger___;_21
|
||||
.by 10 ;Baby_Sandhog___;_22
|
||||
.by 5 ;Sandhog________;_23
|
||||
.by 2 ;Heavy_Sandhog__;_24
|
||||
.by 5 ;Dirt_Clod______;_25
|
||||
.by 3 ;Dirt_Ball______;_26
|
||||
.by 1 ;Ton_of_Dirt____;_27
|
||||
.by 4 ;Liquid_Dirt____;_28
|
||||
.by 2 ;Dirt_Charge____;_29
|
||||
.by 1 ;Buy_me_________;_30
|
||||
.by 5 ;Laser__________;_31
|
||||
.by 1 ;White_Flag_____;_32
|
||||
.by 3 ;Battery________;_33
|
||||
.by 2 ;Floating_Tank__;_34
|
||||
.by 3 ;Parachute______;_35
|
||||
.by 10 ;Baby_Digger ;_19
|
||||
.by 5 ;Digger ;_20
|
||||
.by 2 ;Heavy_Digger ;_21
|
||||
.by 10 ;Baby_Sandhog ;_22
|
||||
.by 5 ;Sandhog ;_23
|
||||
.by 2 ;Heavy_Sandhog ;_24
|
||||
.by 5 ;Dirt_Clod ;_25
|
||||
.by 3 ;Dirt_Ball ;_26
|
||||
.by 1 ;Ton_of_Dirt ;_27
|
||||
.by 4 ;Liquid_Dirt ;_28
|
||||
.by 2 ;Dirt_Charge ;_29
|
||||
.by 1 ;Buy_me ;_30
|
||||
.by 5 ;Laser ;_31
|
||||
.by 1 ;White_Flag ;_32
|
||||
.by 3 ;Battery ;_33
|
||||
.by 2 ;Floating_Tank ;_34
|
||||
.by 3 ;Parachute ;_35
|
||||
.by 2 ;StrongParachute;_36
|
||||
.by 2 ;Mag_Deflector__;_37
|
||||
.by 3 ;Shield_________;_38
|
||||
.by 2 ;Heavy_Shield___;_39
|
||||
.by 3 ;Force_Shield___;_40
|
||||
.by 1 ;Auto_Defense___;_41
|
||||
.by 2 ;Long_Barrel____;_42
|
||||
.by 2 ;Mag_Deflector ;_37
|
||||
.by 3 ;Shield ;_38
|
||||
.by 2 ;Heavy_Shield ;_39
|
||||
.by 3 ;Force_Shield ;_40
|
||||
.by 1 ;Auto_Defense ;_41
|
||||
.by 2 ;Long_Barrel ;_42
|
||||
.by 1 ;Nuclear_Winter_;_43
|
||||
.by 2 ;Lazy_Boy_______;_44
|
||||
.by 2 ;Lazy_Darwin____;_45
|
||||
.by 2 ;Auto_Defense___;_46
|
||||
.by 4 ;Spy_Hard_______;_47
|
||||
.by 2 ;Lazy_Boy ;_44
|
||||
.by 2 ;Lazy_Darwin ;_45
|
||||
.by 2 ;Auto_Defense ;_46
|
||||
.by 4 ;Spy_Hard ;_47
|
||||
|
||||
PurchaseMeTable ;weapons good to be purchased by the robot
|
||||
;the comment is an index in the tables
|
||||
@@ -431,54 +437,54 @@ PurchaseMeTable2 ;weapons good to be purchased by the robot (Cyborg)
|
||||
;-------------------------------------------------
|
||||
; Screen codes of icons (chars) representing a given weapon
|
||||
WeaponSymbols
|
||||
.by $40 ;ind_Baby_Missile___ ;_00
|
||||
.by $41 ;ind_Missile________ ;_01
|
||||
.by $42 ;ind_Baby_Nuke______ ;_02
|
||||
.by $43 ;ind_Nuke___________ ;_03
|
||||
.by $44 ;ind_LeapFrog_______ ;_04
|
||||
.by $45 ;ind_Funky_Bomb_____ ;_05
|
||||
.by $46 ;ind_MIRV___________ ;_06
|
||||
.by $47 ;ind_Death_s_Head___ ;_07
|
||||
.by $48 ;ind_Napalm_________ ;_08
|
||||
.by $49 ;ind_Hot_Napalm_____ ;_09
|
||||
.by $4a ;ind_Tracer_________ ;_10
|
||||
.by $4b ;ind_Smoke_Tracer___ ;_11
|
||||
.by $4c ;ind_Baby_Roller____ ;_12
|
||||
.by $4d ;ind_Roller_________ ;_13
|
||||
.by $4e ;ind_Heavy_Roller___ ;_14
|
||||
.by $4f ;ind_Riot_Charge____ ;_15
|
||||
.by $50 ;ind_Riot_Blast_____ ;_16
|
||||
.by $51 ;ind_Riot_Bomb______ ;_17
|
||||
.by $40 ;ind_Baby_Missile ;_00
|
||||
.by $41 ;ind_Missile ;_01
|
||||
.by $42 ;ind_Baby_Nuke ;_02
|
||||
.by $43 ;ind_Nuke ;_03
|
||||
.by $44 ;ind_LeapFrog ;_04
|
||||
.by $45 ;ind_Funky_Bomb ;_05
|
||||
.by $46 ;ind_MIRV ;_06
|
||||
.by $47 ;ind_Death_s_Head ;_07
|
||||
.by $48 ;ind_Napalm ;_08
|
||||
.by $49 ;ind_Hot_Napalm ;_09
|
||||
.by $4a ;ind_Tracer ;_10
|
||||
.by $4b ;ind_Smoke_Tracer ;_11
|
||||
.by $4c ;ind_Baby_Roller ;_12
|
||||
.by $4d ;ind_Roller ;_13
|
||||
.by $4e ;ind_Heavy_Roller ;_14
|
||||
.by $4f ;ind_Riot_Charge ;_15
|
||||
.by $50 ;ind_Riot_Blast ;_16
|
||||
.by $51 ;ind_Riot_Bomb ;_17
|
||||
.by $52 ;ind_Heavy_Riot_Bomb ;_18
|
||||
.by $53 ;ind_Baby_Digger____ ;_19
|
||||
.by $54 ;ind_Digger_________ ;_20
|
||||
.by $55 ;ind_Heavy_Digger___ ;_21
|
||||
.by $56 ;ind_Baby_Sandhog___ ;_22
|
||||
.by $57 ;ind_Sandhog________ ;_23
|
||||
.by $58 ;ind_Heavy_Sandhog__ ;_24
|
||||
.by $59 ;ind_Dirt_Clod______ ;_25
|
||||
.by $5a ;ind_Dirt_Ball______ ;_26
|
||||
.by $5b ;ind_Ton_of_Dirt____ ;_27
|
||||
.by $60 ;ind_Liquid_Dirt____ ;_28
|
||||
.by $7b ;ind_Dirt_Charge____ ;_29
|
||||
.by $1f ;ind_Buy_me_________ ;_30
|
||||
.by $20 ;ind_Laser__________ ;_31
|
||||
.by $5f ;ind_White_Flag_____ ;_32
|
||||
.by $1c ;ind_Battery________ ;_33
|
||||
.by $06 ;ind_Floating_Tank__ ;_34
|
||||
.by $1b ;ind_Parachute______ ;_35
|
||||
.by $53 ;ind_Baby_Digger ;_19
|
||||
.by $54 ;ind_Digger ;_20
|
||||
.by $55 ;ind_Heavy_Digger ;_21
|
||||
.by $56 ;ind_Baby_Sandhog ;_22
|
||||
.by $57 ;ind_Sandhog ;_23
|
||||
.by $58 ;ind_Heavy_Sandhog ;_24
|
||||
.by $59 ;ind_Dirt_Clod ;_25
|
||||
.by $5a ;ind_Dirt_Ball ;_26
|
||||
.by $5b ;ind_Ton_of_Dirt ;_27
|
||||
.by $60 ;ind_Liquid_Dirt ;_28
|
||||
.by $7b ;ind_Dirt_Charge ;_29
|
||||
.by $1f ;ind_Buy_me ;_30
|
||||
.by $20 ;ind_Laser ;_31
|
||||
.by $5f ;ind_White_Flag ;_32
|
||||
.by $1c ;ind_Battery ;_33
|
||||
.by $06 ;ind_Floating_Tank ;_34
|
||||
.by $1b ;ind_Parachute ;_35
|
||||
.by $1b ;ind_StrongParachute ;_36
|
||||
.by $1e ;ind_Mag_Deflector__ ;_37
|
||||
.by $3b ;ind_Shield_________ ;_38
|
||||
.by $3d ;ind_Heavy_Shield___ ;_39
|
||||
.by $3c ;ind_Force_Shield___ ;_40
|
||||
.by $3f ;ind_Bouncy_Castle__ ;_41
|
||||
.by $1d ;ind_Long_Barrel____ ;_42
|
||||
.by $1e ;ind_Mag_Deflector ;_37
|
||||
.by $3b ;ind_Shield ;_38
|
||||
.by $3d ;ind_Heavy_Shield ;_39
|
||||
.by $3c ;ind_Force_Shield ;_40
|
||||
.by $3f ;ind_Bouncy_Castle ;_41
|
||||
.by $1d ;ind_Long_Barrel ;_42
|
||||
.by $7d ;ind_Nuclear_Winter_ ;_43
|
||||
.by $02 ;ind_Lazy_Boy_______ ;_44
|
||||
.by $03 ;ind_Lazy_Darwin____ ;_45
|
||||
.by $5e ;ind_Auto_Defense___ ;_46
|
||||
.by $7c ;ind_Spy_Hard_______ ;_47
|
||||
.by $02 ;ind_Lazy_Boy ;_44
|
||||
.by $03 ;ind_Lazy_Darwin ;_45
|
||||
.by $5e ;ind_Auto_Defense ;_46
|
||||
.by $7c ;ind_Spy_Hard ;_47
|
||||
|
||||
; Names of weapons (16 chars long)
|
||||
NamesOfWeapons ;the comment is an index in the tables
|
||||
@@ -532,7 +538,7 @@ NamesOfWeapons ;the comment is an index in the tables
|
||||
dta d"Auto Defense " ; 46
|
||||
dta d"Spy Hard " ; 47
|
||||
|
||||
DefensiveEnergy = *-(last_offensive_____ - first_offensive____ +1) ; to fake the table for ALL weapons
|
||||
DefensiveEnergy = *-(last_offensive - first_offensive +1) ; to fake the table for ALL weapons
|
||||
.by 00 ; White Flag
|
||||
.by 00 ; Heat Guidance
|
||||
.by 98 ; Let's go!
|
||||
@@ -550,7 +556,22 @@ DefensiveEnergy = *-(last_offensive_____ - first_offensive____ +1) ; to fake th
|
||||
.by 00 ; Auto Defense
|
||||
.by 00 ; Spy Hard
|
||||
weaponsOfDeath ; weapons used in tank death animations
|
||||
dta 1,2,3,7,17,18,19,20,21,22,23,24,25,26,27
|
||||
dta ind_Missile
|
||||
dta ind_Baby_Nuke
|
||||
dta ind_Nuke
|
||||
dta ind_Death_s_Head
|
||||
dta ind_Hot_Napalm ; why not?
|
||||
dta ind_Riot_Bomb
|
||||
dta ind_Heavy_Riot_Bomb
|
||||
dta ind_Baby_Digger
|
||||
dta ind_Digger
|
||||
dta ind_Heavy_Digger
|
||||
dta ind_Baby_Sandhog
|
||||
dta ind_Sandhog
|
||||
dta ind_Heavy_Sandhog
|
||||
dta ind_Dirt_Clod
|
||||
dta ind_Dirt_Ball
|
||||
dta ind_Ton_of_Dirt
|
||||
weaponsOfDeathEnd
|
||||
joyToKeyTable
|
||||
.by $ff ;00
|
||||
@@ -571,7 +592,7 @@ joyToKeyTable
|
||||
.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)
|
||||
.by $3f,$15,$12,$3a,$2a,$38,$3d,$39
|
||||
.by $0d,$01,$05,$00,$25,$23,$08,$0a
|
||||
.by $2f,$28,$3e,$2d,$0b,$10,$2e,$16
|
||||
@@ -584,17 +605,15 @@ scrcodes
|
||||
dta d"ijklmnop"
|
||||
dta d"qrstuvwx"
|
||||
dta d"yz"
|
||||
;-------decimal constans + end of scrcodes
|
||||
zero
|
||||
digits ; decimal constans
|
||||
digits
|
||||
dta d"0123456"
|
||||
dta d"789. " ; "-"
|
||||
;-------decimal constans
|
||||
;zero
|
||||
;digits dta d"0123456789"
|
||||
|
||||
;-----------------------------------
|
||||
gameOverSpritesTop
|
||||
; end of the Gover sprites by number of players
|
||||
; end of the GameOver sprites by number of players
|
||||
; 1 2 3 4 5 6
|
||||
.by 130+7,130+7,136+7,142+7,148+7,154+7
|
||||
;------credits
|
||||
@@ -612,7 +631,7 @@ CreditsStart
|
||||
dta d"SFX, Music and Suppor",d"t"*
|
||||
dta d"Michal 'Miker' Szpilowsk",d"i"*
|
||||
dta d" "*
|
||||
.IF target != 5200
|
||||
.IF TARGET = 800
|
||||
dta d"Additional Musi",d"c"*
|
||||
dta d"Mario 'Emkay' Kri",d"x"*
|
||||
dta d" "*
|
||||
@@ -622,39 +641,45 @@ CreditsStart
|
||||
dta d" "*
|
||||
dta d"Ar",d"t"*
|
||||
dta d"Adam Wachowsk",d"i"*
|
||||
.IF target != 5200
|
||||
dta d"Krzysztof 'Kaz' Ziembi",d"k"*
|
||||
.IF TARGET = 800
|
||||
dta d"Roman 'xorcerer' Fierfa",d"s"*
|
||||
.ENDIF
|
||||
dta d" "*
|
||||
dta d"Ideas, help and Q",d"A"*
|
||||
dta d"Bocianu, Probabilitydragon, EnderDude",d","*
|
||||
dta d"Beeblebrox, KrzysRog, lopezpb, Dracon",d","*
|
||||
dta d"Bocianu, Probabilitydragon",d","*
|
||||
dta d"EnderDude, Dracon",d","*
|
||||
dta d"Beeblebrox, KrzysRog, lopezpb",d","*
|
||||
dta d"brad-colbert, archon800, nowy80",d","*
|
||||
dta d"Shaggy the Atarian, RetroBorsuk, ZPH"
|
||||
.IF target = 5200
|
||||
.IF TARGET = 800
|
||||
dta d" "*
|
||||
.ELIF TARGET = 5200
|
||||
dta d","*
|
||||
dta d"x-usr(1536), Aking, JAC!, phaeron",d","*
|
||||
dta d"RB520",d"0"*
|
||||
.ELSE
|
||||
dta d" "*
|
||||
.ENDIF
|
||||
dta d" "*
|
||||
dta d"Additional testin",d"g"*
|
||||
dta d"Arek and Alex Peck",d"o"*
|
||||
.IF target != 5200
|
||||
dta d" "*
|
||||
dta d"Special thank",d"s"*
|
||||
dta d"Krzysztof 'Kaz' Ziembi",d"k"*
|
||||
.IF TARGET = 800
|
||||
dta d" "*
|
||||
dta d"Stay tuned for the FujiNet version",d"!"*
|
||||
.ENDIF
|
||||
dta d" "*
|
||||
CreditsEnd
|
||||
.IF target = 5200
|
||||
CreditsLines=38
|
||||
.ELSE
|
||||
CreditsLines=42 ; 34 in reality. add 7?
|
||||
.IF TARGET = 800
|
||||
CreditsLines=40 + 7 ; add 7 for scrollout
|
||||
.ELIF TARGET = 5200
|
||||
CreditsLines=34 + 7; add 7 for scrollout
|
||||
.ENDIF
|
||||
.IF target = 5200
|
||||
|
||||
.IF TARGET = 5200
|
||||
; Atari 5200 splash
|
||||
NewSplashText=*
|
||||
dta d"copyright 2023 atari"
|
||||
dta d" 2023 atariage", $4e, "com " ; $4e - non blinking dot
|
||||
.ENDIF
|
||||
.endif
|
||||
|
||||
.endif ; .IF *>0
|
||||
|
||||
@@ -22,4 +22,4 @@ RoundsTable .by 10,20,30,40,50
|
||||
AIForceTable .wo 375,470,630,720,820 ; starting shoot forces for different gravity
|
||||
flyDelayTable .by 255,150,75,35,1
|
||||
seppukuTable .by 255, 45,25,15,9
|
||||
.endif
|
||||
.ENDIF
|
||||
|
||||
@@ -28,123 +28,124 @@ space = 0 ; space in screencodes
|
||||
KeyRepeatSpeed = 10 ; (max 127 !!!)
|
||||
|
||||
;character codes for symbols (tank, parachute, etc. )
|
||||
char_parachute_______ = $02
|
||||
char_flag____________ = $1e
|
||||
char_flame___________ = $14
|
||||
char_clear_flame_____ = $1c
|
||||
char_digger__________ = $04
|
||||
char_sandhog_________ = $0c
|
||||
char_sandhog_offset = char_sandhog_________ - char_digger__________
|
||||
char_tank1___________ = $20
|
||||
char_tank2___________ = $24
|
||||
char_tank3___________ = $2c
|
||||
char_tank4___________ = $28 ; robotank shape
|
||||
char_parachute = $02
|
||||
char_flag = $1e
|
||||
char_flame = $14
|
||||
char_clear_flame = $1c
|
||||
char_digger = $04
|
||||
char_sandhog = $0c
|
||||
char_sandhog_offset = char_sandhog - char_digger
|
||||
char_tank1 = $20
|
||||
char_tank2 = $24
|
||||
char_tank3 = $2c
|
||||
char_tank4 = $28 ; robotank shape
|
||||
|
||||
;Weapon prices (*10 on screen)
|
||||
price_Baby_Missile___ = 0 ;_00
|
||||
price_Missile________ = 96 ;_01
|
||||
price_Baby_Nuke______ = 111 ;_02
|
||||
price_Nuke___________ = 144 ;_03
|
||||
price_LeapFrog_______ = 192 ;_04
|
||||
price_Funky_Bomb_____ = 293 ;_05
|
||||
price_MIRV___________ = 456 ;_06
|
||||
price_Death_s_Head___ = 337 ;_07
|
||||
price_Napalm_________ = 125 ;_08
|
||||
price_Hot_Napalm_____ = 162 ;_09
|
||||
price_Tracer_________ = 102 ;_10
|
||||
price_Smoke_Tracer___ = 291 ;_11
|
||||
price_Baby_Roller____ = 211 ;_12
|
||||
price_Roller_________ = 244 ;_13
|
||||
price_Heavy_Roller___ = 326 ;_14
|
||||
price_Riot_Charge____ = 230 ;_15
|
||||
price_Riot_Blast_____ = 241 ;_16
|
||||
price_Riot_Bomb______ = 259 ;_17
|
||||
price_Baby_Missile = 0 ;_00
|
||||
price_Missile = 96 ;_01
|
||||
price_Baby_Nuke = 111 ;_02
|
||||
price_Nuke = 144 ;_03
|
||||
price_LeapFrog = 192 ;_04
|
||||
price_Funky_Bomb = 293 ;_05
|
||||
price_MIRV = 456 ;_06
|
||||
price_Death_s_Head = 337 ;_07
|
||||
price_Napalm = 125 ;_08
|
||||
price_Hot_Napalm = 162 ;_09
|
||||
price_Tracer = 102 ;_10
|
||||
price_Smoke_Tracer = 291 ;_11
|
||||
price_Baby_Roller = 211 ;_12
|
||||
price_Roller = 244 ;_13
|
||||
price_Heavy_Roller = 326 ;_14
|
||||
price_Riot_Charge = 230 ;_15
|
||||
price_Riot_Blast = 241 ;_16
|
||||
price_Riot_Bomb = 259 ;_17
|
||||
price_Heavy_Riot_Bomb = 272 ;_18
|
||||
price_Baby_Digger____ = 136 ;_19
|
||||
price_Digger_________ = 176 ;_20
|
||||
price_Heavy_Digger___ = 207 ;_21
|
||||
price_Baby_Sandhog___ = 158 ;_22
|
||||
price_Sandhog________ = 191 ;_23
|
||||
price_Heavy_Sandhog__ = 223 ;_24
|
||||
price_Dirt_Clod______ = 104 ;_25
|
||||
price_Dirt_Ball______ = 130 ;_26
|
||||
price_Ton_of_Dirt____ = 171 ;_27
|
||||
price_Liquid_Dirt____ = 330 ;_28
|
||||
price_Dirt_Charge____ = 343 ;_29
|
||||
price_Buy_me_________ = 170 ;_30
|
||||
price_Laser__________ = 277 ;_31
|
||||
price_White_Flag_____ = $0 ;_32
|
||||
price_Battery________ = 300 ;_33
|
||||
price_Hovercraft_____ = 352 ;_34
|
||||
price_Parachute______ = 234 ;_35
|
||||
price_Baby_Digger = 136 ;_19
|
||||
price_Digger = 176 ;_20
|
||||
price_Heavy_Digger = 207 ;_21
|
||||
price_Baby_Sandhog = 158 ;_22
|
||||
price_Sandhog = 191 ;_23
|
||||
price_Heavy_Sandhog = 223 ;_24
|
||||
price_Dirt_Clod = 104 ;_25
|
||||
price_Dirt_Ball = 130 ;_26
|
||||
price_Ton_of_Dirt = 171 ;_27
|
||||
price_Liquid_Dirt = 330 ;_28
|
||||
price_Dirt_Charge = 343 ;_29
|
||||
price_Buy_me = 170 ;_30
|
||||
price_Laser = 277 ;_31
|
||||
price_White_Flag = $0 ;_32
|
||||
price_Battery = 300 ;_33
|
||||
price_Hovercraft = 352 ;_34
|
||||
price_Parachute = 234 ;_35
|
||||
price_StrongParachute = 1000 ;_36
|
||||
price_Mag_Deflector__ = 745 ;_37
|
||||
price_Shield_________ = 224 ;_38
|
||||
price_Heavy_Shield___ = 628 ;_39
|
||||
price_Force_Shield___ = 1100 ;_40
|
||||
price_Bouncy_Castle__ = 512 ;_41
|
||||
price_Long_Barrel____ = 2100 ;_42
|
||||
price_Mag_Deflector = 745 ;_37
|
||||
price_Shield = 224 ;_38
|
||||
price_Heavy_Shield = 628 ;_39
|
||||
price_Force_Shield = 1100 ;_40
|
||||
price_Bouncy_Castle = 512 ;_41
|
||||
price_Long_Barrel = 2100 ;_42
|
||||
price_Nuclear_Winter_ = 1000 ;_43
|
||||
price_Lazy_Boy_______ = 500 ;_44
|
||||
price_Lazy_Darwin____ = 730 ;_45
|
||||
price_Auto_Defense___ = 250 ;_46
|
||||
price_Spy_Hard_______ = 83 ;_47
|
||||
price_Lazy_Boy = 500 ;_44
|
||||
price_Lazy_Darwin = 730 ;_45
|
||||
price_Auto_Defense = 250 ;_46
|
||||
price_Spy_Hard = 83 ;_47
|
||||
;Weapon indexes (numbers)
|
||||
ind_Baby_Missile___ = 0
|
||||
first_offensive____ = ind_Baby_Missile___
|
||||
ind_Missile________ = 1
|
||||
ind_Baby_Nuke______ = 2
|
||||
ind_Nuke___________ = 3
|
||||
ind_LeapFrog_______ = 4
|
||||
ind_Funky_Bomb_____ = 5
|
||||
ind_MIRV___________ = 6
|
||||
ind_Death_s_Head___ = 7
|
||||
ind_Napalm_________ = 8
|
||||
ind_Hot_Napalm_____ = 9
|
||||
ind_Tracer_________ = 10
|
||||
ind_Smoke_Tracer___ = 11
|
||||
ind_Baby_Roller____ = 12
|
||||
ind_Roller_________ = 13
|
||||
ind_Heavy_Roller___ = 14
|
||||
ind_Riot_Charge____ = 15
|
||||
ind_Riot_Blast_____ = 16
|
||||
ind_Riot_Bomb______ = 17
|
||||
ind_Baby_Missile = 0
|
||||
first_offensive = ind_Baby_Missile
|
||||
ind_Missile = 1
|
||||
ind_Baby_Nuke = 2
|
||||
ind_Nuke = 3
|
||||
ind_LeapFrog = 4
|
||||
ind_Funky_Bomb = 5
|
||||
ind_MIRV = 6
|
||||
ind_Death_s_Head = 7
|
||||
ind_Napalm = 8
|
||||
ind_Hot_Napalm = 9
|
||||
ind_Tracer = 10
|
||||
ind_Smoke_Tracer = 11
|
||||
ind_Baby_Roller = 12
|
||||
ind_Roller = 13
|
||||
ind_Heavy_Roller = 14
|
||||
ind_Riot_Charge = 15
|
||||
ind_Riot_Blast = 16
|
||||
ind_Riot_Bomb = 17
|
||||
ind_Heavy_Riot_Bomb = 18
|
||||
ind_Baby_Digger____ = 19
|
||||
ind_Digger_________ = 20
|
||||
ind_Heavy_Digger___ = 21
|
||||
ind_Baby_Sandhog___ = 22
|
||||
ind_Sandhog________ = 23
|
||||
ind_Heavy_Sandhog__ = 24
|
||||
ind_Dirt_Clod______ = 25
|
||||
ind_Dirt_Ball______ = 26
|
||||
ind_Ton_of_Dirt____ = 27
|
||||
ind_Liquid_Dirt____ = 28
|
||||
ind_Dirt_Charge____ = 29
|
||||
ind_Buy_me_________ = 30
|
||||
ind_Laser__________ = 31
|
||||
last_offensive_____ = ind_Laser__________
|
||||
ind_White_Flag_____ = 32
|
||||
first_defensive____ = ind_White_Flag_____
|
||||
ind_Battery________ = 33
|
||||
ind_Hovercraft_____ = 34
|
||||
ind_Parachute______ = 35
|
||||
ind_Baby_Digger = 19
|
||||
ind_Digger = 20
|
||||
ind_Heavy_Digger = 21
|
||||
ind_Baby_Sandhog = 22
|
||||
ind_Sandhog = 23
|
||||
ind_Heavy_Sandhog = 24
|
||||
ind_Dirt_Clod = 25
|
||||
ind_Dirt_Ball = 26
|
||||
ind_Ton_of_Dirt = 27
|
||||
ind_Liquid_Dirt = 28
|
||||
ind_Dirt_Charge = 29
|
||||
ind_Buy_me = 30
|
||||
ind_Laser = 31
|
||||
last_offensive = ind_Laser
|
||||
ind_White_Flag = 32
|
||||
first_defensive = ind_White_Flag
|
||||
ind_Battery = 33
|
||||
ind_Hovercraft = 34
|
||||
ind_Parachute = 35
|
||||
ind_StrongParachute = 36
|
||||
ind_Mag_Deflector__ = 37
|
||||
ind_Shield_________ = 38
|
||||
ind_Heavy_Shield___ = 39
|
||||
ind_Force_Shield___ = 40
|
||||
ind_Bouncy_Castle__ = 41
|
||||
ind_Long_Barrel____ = 42
|
||||
ind_Mag_Deflector = 37
|
||||
ind_Shield = 38
|
||||
ind_Heavy_Shield = 39
|
||||
ind_Force_Shield = 40
|
||||
ind_Bouncy_Castle = 41
|
||||
ind_Long_Barrel = 42
|
||||
ind_Nuclear_Winter_ = 43
|
||||
ind_Lazy_Boy_______ = 44
|
||||
ind_Lazy_Darwin____ = 45
|
||||
ind_Auto_Defense___ = 46
|
||||
ind_Spy_Hard_______ = 47
|
||||
last_defensive_____ = ind_Spy_Hard_______
|
||||
last_real_defensive = ind_Bouncy_Castle__
|
||||
number_of_offensives = last_offensive_____ - first_offensive____+1
|
||||
number_of_defensives = (last_defensive_____ - first_defensive____+1)
|
||||
ind_Lazy_Boy = 44
|
||||
ind_Lazy_Darwin = 45
|
||||
ind_Auto_Defense = 46
|
||||
ind_Spy_Hard = 47
|
||||
last_defensive = ind_Spy_Hard
|
||||
last_real_defensive = ind_Bouncy_Castle
|
||||
number_of_offensives = last_offensive - first_offensive +1
|
||||
number_of_defensives = (last_defensive - first_defensive +1)
|
||||
number_of_weapons = number_of_offensives + number_of_defensives
|
||||
;--------------------------------
|
||||
; names of RMT instruments (sfx)
|
||||
;--------------------------------
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc draw ;;fuxxing good draw :)
|
||||
; xdraw,ydraw (word) - coordinates of first point
|
||||
; xbyte,ybyte (word) - coordinates of last point
|
||||
;--------------------------------------------------
|
||||
;creditz to Dr Jankowski / MIM U.W.
|
||||
; (xi,yi)-----(xk,yk)
|
||||
@@ -291,6 +293,8 @@ EndOfDraw
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc circle ;fxxxing good circle drawing :)
|
||||
; xdraw,ydraw (word) - coordinates of circle center
|
||||
; radius (byte) - radius of circle
|
||||
;--------------------------------------------------
|
||||
;Turbo Basic source
|
||||
; R=30
|
||||
@@ -469,19 +473,6 @@ endcircleloop
|
||||
RTS
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc ClearScreen
|
||||
;--------------------------------------------------
|
||||
mwa #display temp
|
||||
ldy #0
|
||||
@ lda #$ff
|
||||
sta (temp),y
|
||||
inw temp
|
||||
cpw temp #display+screenheight*screenBytes+1
|
||||
bne @-
|
||||
rts
|
||||
.endp
|
||||
|
||||
;-------------------------------*------------------
|
||||
.proc placetanks
|
||||
;--------------------------------------------------
|
||||
@@ -504,7 +495,7 @@ endcircleloop
|
||||
|
||||
|
||||
mwa #0 temptankX
|
||||
mva #0 temptankNr ;player number
|
||||
sta temptankNr ;player number
|
||||
StillRandomize
|
||||
ldx NumberOfPlayers
|
||||
lda random
|
||||
@@ -622,6 +613,11 @@ DrawNextTank
|
||||
rts
|
||||
.endp
|
||||
;---------
|
||||
ClearTankNr
|
||||
mva #1 Erase
|
||||
bne DrawTankNr
|
||||
PutTankNr
|
||||
mva #0 Erase
|
||||
.proc DrawTankNr
|
||||
ldx tankNr
|
||||
; let's check the energy
|
||||
@@ -760,17 +756,17 @@ noTankNoPM
|
||||
; in xdraw, ydraw we have coordinates left LOWER corner of Tank char
|
||||
ldx TankNr
|
||||
lda ActiveDefenceWeapon,x
|
||||
cmp #ind_Shield_________ ; one shot shield
|
||||
cmp #ind_Shield ; one shot shield
|
||||
beq DrawTankSh
|
||||
cmp #ind_Force_Shield___ ; shield with energy and parachute
|
||||
cmp #ind_Force_Shield ; shield with energy and parachute
|
||||
beq DrawTankShieldBold
|
||||
cmp #ind_Heavy_Shield___ ; shield with energy
|
||||
cmp #ind_Heavy_Shield ; shield with energy
|
||||
beq DrawTankShieldBold
|
||||
cmp #ind_Bouncy_Castle__ ; Auto Defence
|
||||
cmp #ind_Bouncy_Castle ; Auto Defence
|
||||
beq DrawTankShieldWihHorns
|
||||
cmp #ind_Mag_Deflector__ ; Mag Deflector
|
||||
cmp #ind_Mag_Deflector ; Mag Deflector
|
||||
beq DrawTankShieldWihHorns
|
||||
cmp #ind_White_Flag_____ ; White Flag
|
||||
cmp #ind_White_Flag ; White Flag
|
||||
beq DrawTankFlag
|
||||
bne NoShieldDraw
|
||||
DrawTankSh
|
||||
@@ -785,7 +781,7 @@ DrawTankShieldBold
|
||||
jsr DrawTankShieldBoldLine
|
||||
jmp NoShieldDraw
|
||||
DrawTankFlag
|
||||
lda #char_flag____________ ; flag symbol
|
||||
lda #char_flag ; flag symbol
|
||||
sta CharCode
|
||||
lda Ytankstable,x
|
||||
sec
|
||||
@@ -920,7 +916,7 @@ tankflash_loop
|
||||
.proc DrawTankParachute
|
||||
;Tank number in X
|
||||
;--------------------------------------------------
|
||||
lda #char_parachute_______ ; parachute symbol
|
||||
lda #char_parachute ; parachute symbol
|
||||
sta CharCode
|
||||
lda Ytankstable,x
|
||||
cmp #16
|
||||
@@ -1032,11 +1028,11 @@ ToHighToParachute
|
||||
; let's check if the given tank has got the parachute
|
||||
ldx TankNr
|
||||
lda ActiveDefenceWeapon,x
|
||||
cmp #ind_Parachute______ ; parachute
|
||||
cmp #ind_Parachute ; parachute
|
||||
beq ParachuteActive
|
||||
cmp #ind_StrongParachute ; strong parachute
|
||||
beq ParachuteActive
|
||||
cmp #ind_Force_Shield___ ; shield witch energy and parachute
|
||||
cmp #ind_Force_Shield ; shield witch energy and parachute
|
||||
bne TankFallsX
|
||||
ParachuteActive
|
||||
inc Parachute
|
||||
@@ -1050,7 +1046,7 @@ TankFallsX
|
||||
NoFallingSound
|
||||
; clear previous position
|
||||
mva #1 Erase
|
||||
jsr DrawTankNr
|
||||
jsr ClearTankNr
|
||||
; and the parachute (if present)
|
||||
lda Parachute
|
||||
and #01
|
||||
@@ -1136,7 +1132,7 @@ OneTimeParachute
|
||||
jmp EndOfFCycle
|
||||
NoFallingDown
|
||||
; check direction (left or right)
|
||||
ldy #7 ; SlideLeftTable length -1 (from 0 to 7)
|
||||
ldy #SlideLeftTableLen-1 ; SlideLeftTable length -1 (from 0 to 7)
|
||||
@ lda SlideLeftTable,y
|
||||
cmp UnderTank1
|
||||
beq FallingLeft
|
||||
@@ -1241,7 +1237,7 @@ EndOfFall
|
||||
bne NoParachuteWeapon
|
||||
; first we check type of parachute
|
||||
lda ActiveDefenceWeapon,x
|
||||
cmp #ind_Parachute______ ; deactivate weapon only if parachute (54)
|
||||
cmp #ind_Parachute ; deactivate weapon only if parachute (54)
|
||||
bne NoParachuteWeapon
|
||||
mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute)
|
||||
NoParachuteWeapon
|
||||
@@ -1251,9 +1247,8 @@ NoParachuteWeapon
|
||||
beq ThereWasNoParachute
|
||||
jsr DrawTankParachute
|
||||
ThereWasNoParachute
|
||||
mva #0 Erase
|
||||
; ldx TankNr
|
||||
jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) )
|
||||
jsr PutTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) )
|
||||
mva #sfx_silencer sfx_effect
|
||||
rts
|
||||
|
||||
@@ -1275,45 +1270,6 @@ ThereWasNoParachute
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc drawmountains
|
||||
;--------------------------------------------------
|
||||
mwa #0 xdraw
|
||||
mwa #mountaintable modify
|
||||
mva #1 color
|
||||
|
||||
drawmountainsloop
|
||||
ldy #0
|
||||
lda (modify),y
|
||||
cmp #screenheight
|
||||
beq NoMountain
|
||||
sta ydraw
|
||||
sty ydraw+1
|
||||
; jsr DrawLine
|
||||
; there was Drawline proc
|
||||
lda #screenheight
|
||||
sec
|
||||
sbc ydraw
|
||||
sta tempbyte01
|
||||
jsr plot.MakePlot
|
||||
; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit)
|
||||
; jmp IntoDraw ; jumps inside Draw routine
|
||||
; because one pixel is already plotted (and who cares? :) )
|
||||
@
|
||||
lda (xbyte),y
|
||||
and bittable2,x
|
||||
sta (xbyte),y
|
||||
;IntoDraw
|
||||
adw xbyte #screenBytes
|
||||
dec tempbyte01
|
||||
bne @-
|
||||
; end of Drawline proc
|
||||
NoMountain
|
||||
inw modify
|
||||
inw xdraw
|
||||
cpw xdraw #screenwidth
|
||||
bne drawmountainsloop
|
||||
rts
|
||||
/*
|
||||
;--------------------------------------------------
|
||||
drawmountainspixel ; never used ?
|
||||
@@ -1332,7 +1288,6 @@ drawmountainspixelloop
|
||||
bne drawmountainspixelloop
|
||||
rts
|
||||
*/
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc SoilDown2
|
||||
;--------------------------------------------------
|
||||
@@ -1464,6 +1419,9 @@ ColumnIsReady
|
||||
bcc FalloutOfLine
|
||||
beq FalloutOfLine
|
||||
|
||||
jsr CheckExitKeys ; Check for O, Esc or Start+Option keys
|
||||
spl:rts ; exit if pressed 'Exit keys'
|
||||
|
||||
lda IsEndOfTheFallFlag
|
||||
; we repeat untill at some point first table reaches
|
||||
; level of the mountains
|
||||
@@ -1472,8 +1430,8 @@ ColumnIsReady
|
||||
sta color ; Pozor! :) we know - now A=1
|
||||
NothingToFall
|
||||
mva #sfx_silencer sfx_effect
|
||||
jsr DrawTanks
|
||||
rts
|
||||
jmp DrawTanks
|
||||
; rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
@@ -1629,419 +1587,6 @@ NotHigher
|
||||
rts
|
||||
.endp
|
||||
|
||||
; -----------------------------------------
|
||||
.proc unPlot
|
||||
; plots a point and saves the plotted byte, reverts the previous plot.
|
||||
; -----------------------------------------
|
||||
ldx #0 ; only one pixel
|
||||
unPlotAfterX
|
||||
stx WhichUnPlot
|
||||
|
||||
; first remake the oldie
|
||||
lda oldplotL,x
|
||||
sta oldplot
|
||||
lda oldplotH,x
|
||||
sta oldplot+1
|
||||
|
||||
lda oldply,x
|
||||
tay
|
||||
lda oldora,x
|
||||
sta (oldplot),y
|
||||
|
||||
|
||||
; is it not out of the screen ????
|
||||
cpw ydraw #screenheight
|
||||
jcc CheckX
|
||||
mwa #0 ydraw
|
||||
CheckX
|
||||
cpw xdraw #screenwidth
|
||||
jcs EndOfUnPlot
|
||||
MakeUnPlot
|
||||
; let's count coordinates taken from xdraw and ydraw
|
||||
mwa xdraw xbyte
|
||||
|
||||
lda xbyte
|
||||
and #$7
|
||||
sta ybit
|
||||
|
||||
lsrw xbyte
|
||||
rorw xbyte
|
||||
rorw xbyte
|
||||
;---
|
||||
ldy xbyte
|
||||
|
||||
ldx WhichUnPlot
|
||||
tya
|
||||
sta oldply,x
|
||||
|
||||
|
||||
ldx ydraw
|
||||
lda linetableL,x
|
||||
sta xbyte
|
||||
sta oldplot
|
||||
lda linetableH,x
|
||||
sta xbyte+1
|
||||
sta oldplot+1
|
||||
ldx ybit
|
||||
|
||||
|
||||
lda color
|
||||
bne ClearUnPlot
|
||||
|
||||
;plotting here
|
||||
lda (xbyte),y
|
||||
sta OldOraTemp
|
||||
ora bittable,x
|
||||
sta (xbyte),y
|
||||
jmp ContinueUnPlot
|
||||
ClearUnPlot
|
||||
lda (xbyte),y
|
||||
sta OldOraTemp
|
||||
and bittable2,x
|
||||
sta (xbyte),y
|
||||
ContinueUnPlot
|
||||
ldx WhichUnPlot
|
||||
lda OldOraTemp
|
||||
sta oldora,x
|
||||
lda oldplot
|
||||
sta oldplotL,x
|
||||
lda oldplot+1
|
||||
sta oldplotH,x
|
||||
; and now we must solve the problem of several plots
|
||||
; in one byte
|
||||
ldx #4
|
||||
ldy WhichUnPlot
|
||||
LetsCheckOverlapping
|
||||
cpx WhichUnPlot
|
||||
beq SkipThisPlot
|
||||
lda oldplotL,x
|
||||
cmp oldplotL,y
|
||||
bne NotTheSamePlot
|
||||
lda oldplotH,x
|
||||
cmp oldplotH,y
|
||||
bne NotTheSamePlot
|
||||
lda oldply,x
|
||||
cmp oldply,y
|
||||
bne NotTheSamePlot
|
||||
; the pixel is in the same byte so let's take correct contents
|
||||
lda oldora,x
|
||||
sta oldora,y
|
||||
NotTheSamePlot
|
||||
SkipThisPlot
|
||||
dex
|
||||
bpl LetsCheckOverlapping
|
||||
EndOfUnPlot
|
||||
rts
|
||||
.endp
|
||||
|
||||
; -----------------------------------------
|
||||
.proc plot ;plot (xdraw, ydraw, color)
|
||||
; color == 1 --> put pixel
|
||||
; color == 0 --> erase pixel
|
||||
; this is one of the most important routines in the whole
|
||||
; game. If you are going to speed up the game, start with
|
||||
; plot - it is used by every single effect starting from explosions
|
||||
; through line drawing and small text output!!!
|
||||
;
|
||||
; Optimized by 0xF (Fox) THXXXX!!!
|
||||
|
||||
; -----------------------------------------
|
||||
; is it not over the screen ???
|
||||
cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1)
|
||||
bcs unPlot.EndOfUnPlot ;nearest RTS
|
||||
CheckX02
|
||||
cpw xdraw #screenwidth
|
||||
bcs EndOfPlot
|
||||
MakePlot
|
||||
; let's calculate coordinates from xdraw and ydraw
|
||||
|
||||
;xbyte = xbyte/8
|
||||
lda xdraw+1
|
||||
lsr
|
||||
lda xdraw
|
||||
ror ;just one bit over 256. Max screenwidth = 512!!!
|
||||
lsr
|
||||
lsr
|
||||
sta xbyte
|
||||
;---
|
||||
ldx ydraw
|
||||
ldy linetableL,x
|
||||
lda linetableH,x
|
||||
sta xbyte+1
|
||||
|
||||
lda xdraw
|
||||
and #$7
|
||||
tax
|
||||
lda color
|
||||
bne ClearPlot
|
||||
|
||||
lda (xbyte),y
|
||||
ora bittable,x
|
||||
sta (xbyte),y
|
||||
EndOfPlot
|
||||
rts
|
||||
ClearPlot
|
||||
lda (xbyte),y
|
||||
and bittable2,x
|
||||
sta (xbyte),y
|
||||
rts
|
||||
.endp
|
||||
|
||||
; -----------------------------------------
|
||||
.proc point_plot
|
||||
; -----------------------------------------
|
||||
; checks state of the pixel (coordinates in xdraw and ydraw)
|
||||
; result is in A (zero or appropriate bit is set)
|
||||
|
||||
; let's calculate coordinates from xdraw and ydraw
|
||||
|
||||
;xbyte = xbyte/8
|
||||
lda xdraw+1
|
||||
lsr
|
||||
lda xdraw
|
||||
ror ;just one bit over 256. Max screenwidht = 512!!!
|
||||
lsr
|
||||
lsr
|
||||
sta xbyte
|
||||
;---
|
||||
ldx ydraw
|
||||
ldy linetableL,x
|
||||
lda linetableH,x
|
||||
sta xbyte+1
|
||||
|
||||
lda xdraw
|
||||
and #$7
|
||||
tax
|
||||
|
||||
lda (xbyte),y
|
||||
eor #$ff
|
||||
and bittable,x
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc TypeChar
|
||||
; puts char on the graphics screen
|
||||
; in: CharCode
|
||||
; in: left LOWER corner of the char coordinates (xdraw, ydraw)
|
||||
;--------------------------------------------------
|
||||
; char to the table
|
||||
lda CharCode
|
||||
sta fontind
|
||||
lda #$00
|
||||
sta fontind+1
|
||||
; char intex times 8
|
||||
aslw fontind
|
||||
rolw fontind
|
||||
rolw fontind
|
||||
|
||||
adw fontind #TankFont
|
||||
|
||||
; and 8 bytes to the table
|
||||
ldy #7
|
||||
CopyChar
|
||||
lda (fontind),y
|
||||
eor #$ff
|
||||
sta char1,y
|
||||
lda #$ff
|
||||
sta char2,y
|
||||
dey
|
||||
bpl CopyChar
|
||||
; and 8 subsequent bytes as a mask
|
||||
adw fontind #8
|
||||
ldy #7
|
||||
CopyMask
|
||||
lda (fontind),y
|
||||
eor #$ff
|
||||
sta mask1,y
|
||||
lda #$00
|
||||
sta mask2,y
|
||||
dey
|
||||
bpl CopyMask
|
||||
|
||||
; calculating coordinates from xdraw and ydraw
|
||||
mwa xdraw xbyte
|
||||
|
||||
lda xbyte
|
||||
and #$7
|
||||
sta ybit
|
||||
|
||||
lsrw xbyte ; div 8
|
||||
rorw xbyte
|
||||
rorw xbyte
|
||||
;---
|
||||
ldy xbyte
|
||||
|
||||
lda ydraw ; y = y - 7 because left lower. shouldn't it be 8?
|
||||
sec
|
||||
sbc #7
|
||||
tax
|
||||
|
||||
lda linetableL,x
|
||||
sta xbyte
|
||||
lda linetableH,x
|
||||
sta xbyte+1
|
||||
; mask preparation and character shifting
|
||||
ldx ybit
|
||||
beq MaskOK00
|
||||
MakeMask00
|
||||
.rept 8
|
||||
lsr mask1+#
|
||||
ror mask2+#
|
||||
.endr
|
||||
sec
|
||||
.rept 8
|
||||
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
|
||||
ror char2+#
|
||||
.endr
|
||||
dex
|
||||
bne MakeMask00
|
||||
MaskOK00
|
||||
; here x=0
|
||||
lda Erase
|
||||
beq CharLoopi ; it works, because x=0
|
||||
lda #$ff
|
||||
ldx #7
|
||||
EmptyChar
|
||||
sta char1,x
|
||||
sta char2,x
|
||||
dex
|
||||
bpl EmptyChar
|
||||
ldx #0
|
||||
CharLoopi
|
||||
lda (xbyte),y
|
||||
ora mask1,x
|
||||
and char1,x
|
||||
sta (xbyte),y
|
||||
iny
|
||||
lda (xbyte),y
|
||||
ora mask2,x
|
||||
and char2,x
|
||||
sta (xbyte),y
|
||||
dey
|
||||
adw xbyte #screenBytes
|
||||
inx
|
||||
cpx #8
|
||||
bne CharLoopi
|
||||
EndPutChar
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc PutChar4x4
|
||||
; puts 4x4 pixels char on the graphics screen
|
||||
; in: dx, dy (LOWER left corner of the char)
|
||||
; in: CharCode4x4 (.sbyte)
|
||||
; in: plot4x4color (0/255)
|
||||
; all pixels are being drawn
|
||||
; (empty and not empty)
|
||||
;--------------------------------------------------
|
||||
cpw dy #(screenheight-1)
|
||||
jcs TypeChar.EndPutChar ;nearest RTS
|
||||
cpw dy #(4)
|
||||
jcc TypeChar.EndPutChar ;nearest RTS
|
||||
cpw dx #(screenwidth-4)
|
||||
jcs TypeChar.EndPutChar ;nearest RTS
|
||||
; checks ommited.
|
||||
; char to the table
|
||||
lda CharCode4x4
|
||||
and #%00000001
|
||||
beq Upper4bits
|
||||
lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
|
||||
Upper4bits
|
||||
sta nibbler4x4
|
||||
lda CharCode4x4
|
||||
lsr
|
||||
sta fontind
|
||||
lda #$00
|
||||
sta fontind+1
|
||||
|
||||
adw fontind #font4x4
|
||||
|
||||
; and 4 bytes to the table
|
||||
ldy #0
|
||||
ldx #3
|
||||
CopyChar
|
||||
lda (fontind),y ; Y must be 0 !!!!
|
||||
bit nibbler4x4
|
||||
bpl GetUpper4bits
|
||||
:4 rol
|
||||
GetUpper4bits
|
||||
ora #$0f
|
||||
sta char1,x
|
||||
lda #$ff
|
||||
sta char2,x
|
||||
; and 4 bytes as a mask
|
||||
lda #$f0
|
||||
sta mask1,x
|
||||
lda #$00
|
||||
sta mask2,x
|
||||
adw fontind #32 ; next byte of 4x4 font
|
||||
dex
|
||||
bpl CopyChar
|
||||
|
||||
; calculating coordinates from xdraw and ydraw
|
||||
mwa dx xbyte
|
||||
|
||||
lda xbyte
|
||||
and #$7
|
||||
sta ybit
|
||||
|
||||
:3 lsrw xbyte ; div 8
|
||||
; rorw xbyte
|
||||
; rorw xbyte
|
||||
;---
|
||||
ldy xbyte ; horizontal byte offet stored in Y
|
||||
lda dy ; y = y - 3 because left lower.
|
||||
sec
|
||||
sbc #3
|
||||
tax
|
||||
|
||||
lda linetableL,x
|
||||
sta xbyte
|
||||
lda linetableH,x
|
||||
sta xbyte+1
|
||||
; mask preparation and character shifting
|
||||
ldx ybit
|
||||
beq MaskOK01
|
||||
MakeMask01
|
||||
.rept 4
|
||||
lsr mask1+#
|
||||
ror mask2+#
|
||||
.endr
|
||||
sec
|
||||
.rept 4
|
||||
ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
|
||||
ror char2+#
|
||||
.endr
|
||||
dex
|
||||
bne MakeMask01
|
||||
MaskOK01
|
||||
ldx #0
|
||||
CharLoopi4x4
|
||||
lda (xbyte),y
|
||||
ora mask1,x
|
||||
bit plot4x4color
|
||||
bpl PutInColor0_1 ; only mask - no char
|
||||
and char1,x
|
||||
PutInColor0_1
|
||||
sta (xbyte),y
|
||||
iny
|
||||
lda (xbyte),y
|
||||
ora mask2,x
|
||||
bit plot4x4color
|
||||
bpl PutInColor0_2 ; only mask - no char
|
||||
and char2,x
|
||||
PutInColor0_2
|
||||
sta (xbyte),y
|
||||
dey
|
||||
adw xbyte #screenBytes
|
||||
inx
|
||||
cpx #4
|
||||
bne CharLoopi4x4
|
||||
EndPut4x4
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------------
|
||||
.proc DisplayOffensiveTextNr ;
|
||||
ldx TextNumberOff
|
||||
@@ -2205,8 +1750,8 @@ end_found
|
||||
iny
|
||||
sty fx
|
||||
ldy tankNr
|
||||
jsr Display4x4AboveTank
|
||||
rts
|
||||
jmp Display4x4AboveTank
|
||||
; rts
|
||||
.endp
|
||||
|
||||
;-------------------------------
|
||||
@@ -2346,19 +1891,6 @@ quit_seppuku
|
||||
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc SetMainScreen
|
||||
; mva #0 dmactls
|
||||
SetDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen
|
||||
mwa #dl dlptrs ; issue #72 (glitches when switches)
|
||||
lda #%00111110
|
||||
; and #$fc
|
||||
; ora #$02 ; 2=normal, 3 = wide screen width
|
||||
sta dmactls
|
||||
mva WallsType COLBAKS ; set color of background
|
||||
jsr WaitOneFrame
|
||||
rts
|
||||
.endp
|
||||
; -------------------------------------
|
||||
.proc SetupXYdraw
|
||||
lda ytankstable,x
|
||||
@@ -2394,8 +1926,8 @@ X lda XtanksTableL,x
|
||||
sta yc ; current tank barrel length
|
||||
lda angleTable,x
|
||||
sta Angle
|
||||
jsr DrawBarrelTech
|
||||
rts
|
||||
jmp DrawBarrelTech
|
||||
; rts
|
||||
.endp
|
||||
|
||||
.proc DrawBarrelTech
|
||||
|
||||
@@ -0,0 +1,444 @@
|
||||
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
|
||||
;C64 8-bit Scorched Earth source code
|
||||
;---------------------------------------------------
|
||||
;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski
|
||||
;Warsaw 2000, 2001, 2002, 2003, 2009, 2012, 2013
|
||||
;Miami & Warsaw 2022, 2023
|
||||
|
||||
;---------------------------------------------------
|
||||
.def TARGET = 64 ; :)
|
||||
;---------------------------------------------------
|
||||
.def XCORRECTION_FOR_PM = 0
|
||||
; if 1 - active x position of tanks correction fo PMG
|
||||
.def FASTER_GRAF_PROCS = 1
|
||||
; if 1 - activates faster graphics routines
|
||||
; (direct writes to screen memory - C64 only :) )
|
||||
;---------------------------------------------------
|
||||
|
||||
|
||||
opt h-f+
|
||||
org $801
|
||||
org [a($801)],$801
|
||||
basic_start(FirstSTART)
|
||||
|
||||
|
||||
;---------------------------------------------------
|
||||
.macro build
|
||||
dta d"1.28" ; number of this build (4 bytes)
|
||||
.endm
|
||||
|
||||
.macro RMTSong
|
||||
lda #:1 ; do nothing in C64
|
||||
.endm
|
||||
|
||||
;---------------------------------------------------
|
||||
icl 'definitions.asm'
|
||||
;---------------------------------------------------
|
||||
|
||||
FirstZpageVariable = $58 ; $57
|
||||
.zpvar DliColorBack .byte = FirstZpageVariable
|
||||
.zpvar GradientNr .byte
|
||||
.zpvar GradientColors .word
|
||||
.zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag - (0 - round only, >0 - each turn)
|
||||
.zpvar JoystickNumber .byte
|
||||
.zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing
|
||||
.zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory
|
||||
.zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on)
|
||||
.zpvar xdraw .word ;= $64 ;variable X for plot
|
||||
.zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen)
|
||||
.zpvar xbyte .word
|
||||
.zpvar ybyte .word
|
||||
.zpvar CharCode .byte
|
||||
.zpvar fontind .word
|
||||
.zpvar tanknr .byte
|
||||
.zpvar TankSequencePointer .byte
|
||||
.zpvar oldplot .word
|
||||
.zpvar xc .word
|
||||
.zpvar temp .word ;temporary word for the most embeded loops only
|
||||
.zpvar temp2 .word ;same as above
|
||||
.zpvar modify .word ;origially used to replace self-modyfying code
|
||||
.zpvar tempXROLLER .word ;same as above for XROLLER routine (used also in result display routine)
|
||||
.zpvar xtempDRAW .word ;same as above for XDRAW routine
|
||||
.zpvar ytempDRAW .word ;same as above for XDRAW routine
|
||||
.zpvar tempor2 .word
|
||||
.zpvar CreditsVScrol .byte
|
||||
;--------------temps used in circle routine
|
||||
.zpvar xi .word ;X (word) in draw routine
|
||||
.zpvar fx .byte
|
||||
.zpvar yi .word ;Y (word) in draw routine
|
||||
.zpvar fy .byte
|
||||
.zpvar xk .word
|
||||
.zpvar fs .byte
|
||||
.zpvar yc .byte ;ycircle - temporary for circle
|
||||
.zpvar dx .word
|
||||
.zpvar dy .word
|
||||
.zpvar dd .word
|
||||
.zpvar di .word
|
||||
.zpvar dp .word
|
||||
;----------------------------
|
||||
.zpvar UnderTank1 .byte
|
||||
.zpvar UnderTank2 .byte
|
||||
;----------------------------
|
||||
.zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight)
|
||||
.zpvar weaponPointer .word
|
||||
.zpvar dliCounter .byte
|
||||
.zpvar pressTimer .byte
|
||||
.zpvar NTSCcounter .byte
|
||||
.zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling
|
||||
.zpvar sfx_effect .byte
|
||||
.zpvar RMT_blocked .byte
|
||||
.zpvar ScrollFlag .byte
|
||||
.zpvar SkStatSimulator .byte
|
||||
.zpvar FloatingAlt .byte ; floating tank altitude
|
||||
.zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen
|
||||
|
||||
; --------------OPTIMIZATION VARIABLES--------------
|
||||
.zpvar Force .word
|
||||
.zpvar Force_ .byte ; Force is 3 bytes long
|
||||
.zpvar Angle .byte
|
||||
.zpvar Parachute .byte ; are you insured with parachute?
|
||||
.zpvar color .byte
|
||||
.zpvar Erase .byte ; if 1 only mask of the character is printed
|
||||
; on the graphics screen. if 0 character is printed normally
|
||||
.zpvar radius .byte
|
||||
.zpvar decimal .word
|
||||
.zpvar NumberOfPlayers .byte ;current number of players (counted from 1)
|
||||
.zpvar Counter .byte ;temporary Counter for outside loops
|
||||
.zpvar ExplosionRadius .byte
|
||||
.zpvar FunkyBombCounter .byte
|
||||
.zpvar ResultY .byte
|
||||
.zpvar xcircle .word
|
||||
.zpvar ycircle .word
|
||||
.zpvar vy .word
|
||||
.zpvar vy_ .word ; 4 bytes
|
||||
.zpvar vx .word
|
||||
.zpvar vx_ .word ; 4 bytes
|
||||
.zpvar HitFlag .byte ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank
|
||||
.zpvar PositionOnTheList .byte ; pointer position on the list being displayed
|
||||
.zpvar XHit .word
|
||||
.zpvar delta .word
|
||||
.zpvar HowMuchToFall .byte
|
||||
.zpvar magic .word
|
||||
.zpvar xtraj .word
|
||||
.zpvar xtraj_ .byte ; 3 bytes
|
||||
.zpvar ytraj .word
|
||||
.zpvar ytraj_ .byte ; 3 bytes
|
||||
.zpvar Wind .word
|
||||
.zpvar Wind_ .word ; 4 bytes
|
||||
.zpvar RangeLeft .word
|
||||
.zpvar RangeRight .word
|
||||
.zpvar NewAngle .byte
|
||||
.zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing
|
||||
.zpvar LineYdraw .byte
|
||||
.zpvar LineXdraw .word
|
||||
.zpvar plot4x4color .byte ; $00 / $ff
|
||||
.zpvar Multiplier .word
|
||||
.zpvar Multiplier_ .byte ; 3 bytes
|
||||
.zpvar HowToDraw .byte
|
||||
.zpvar gravity .byte
|
||||
.zpvar LineLength .word
|
||||
.zpvar tracerflag .byte
|
||||
.zpvar isInventory .byte
|
||||
.zpvar DifficultyLevel .byte
|
||||
.zpvar goleft .byte
|
||||
.zpvar OffsetDL1 .byte
|
||||
.zpvar L1 .byte
|
||||
HotNapalmFlag = FunkyBombCounter ; reuse variable!
|
||||
;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65
|
||||
|
||||
displayposition = modify
|
||||
LineAddress4x4 = xcircle
|
||||
|
||||
;-----------------------------------------------
|
||||
; libraries
|
||||
;-----------------------------------------------
|
||||
icl 'C64/lib/C64_ATARISYS.ASM'
|
||||
icl 'C64/lib/C64SYS.ASM'
|
||||
icl 'C64/lib/MACRO.ASM'
|
||||
|
||||
;-----------------------------------------------
|
||||
; variable declarations in RAM (no code)
|
||||
;-----------------------------------------------
|
||||
|
||||
; Game loading address
|
||||
ORG $4100
|
||||
icl 'variables.asm'
|
||||
|
||||
WeaponFont
|
||||
ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt'
|
||||
|
||||
|
||||
;--------------------------------------------------
|
||||
; Game Code
|
||||
;--------------------------------------------------
|
||||
FirstSTART
|
||||
DL = 0
|
||||
StatusBufferROM = 0
|
||||
;StatusBufferCopy = 0
|
||||
StatusBufferCopyEnd = 0
|
||||
TRACKS = 4
|
||||
DisplayCopyPurchaseEnd = 0
|
||||
DisplayCopyPurchaseStart = 0
|
||||
displayC64 = $2000 ; graphics screen memory start
|
||||
|
||||
SEI ; disable IRQ
|
||||
LDA #$36
|
||||
STA $0001 ; Turn Off BASIC ROM
|
||||
LDA #<NMI ;
|
||||
STA $0318 ; change NMI vector
|
||||
LDA #>NMI ; to our routine
|
||||
STA $0319 ;
|
||||
LDA #$00 ; stop Timer A
|
||||
STA $DD0E ;
|
||||
STA $DD04 ; set Timer A to 0, after starting
|
||||
STA $DD05 ; NMI will occur immediately
|
||||
LDA #$81 ;
|
||||
STA $DD0D ; set Timer A as source for NMI
|
||||
LDA #$01 ;
|
||||
STA $DD0E ; start Timer A -> NMI
|
||||
|
||||
; from here on NMI is disabled
|
||||
|
||||
|
||||
jsr MakeDarkScreen
|
||||
|
||||
; one time zero variables in RAM (non zero page)
|
||||
lda #0
|
||||
ldy #OneTimeZeroVariablesCount-1
|
||||
@ sta OneTimeZeroVariables,y
|
||||
dey
|
||||
bpl @-
|
||||
|
||||
; one time zero variables in RAM (zero page)
|
||||
ldy #FirstZpageVariable
|
||||
@ sta $0000,y
|
||||
iny
|
||||
bne @-
|
||||
|
||||
; initialize variables in RAM (non zero page)
|
||||
ldy #initialvaluesCount-1
|
||||
@ lda initialvaluesStart,y
|
||||
sta variablesToInitialize,y
|
||||
dey
|
||||
bpl @-
|
||||
|
||||
|
||||
; generate linetables
|
||||
jsr GenerateLineTable
|
||||
|
||||
|
||||
; Random INIT
|
||||
InitializeSIDrnd
|
||||
|
||||
;--------------------------------------------------
|
||||
; Main program of the game
|
||||
icl 'game.asm'
|
||||
;--------------------------------------------------
|
||||
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc GetKey
|
||||
; waits for pressing a key and returns pressed value in A
|
||||
; when [ESC] is pressed, escFlag is set
|
||||
; result: A=keycode
|
||||
;--------------------------------------------------
|
||||
jsr WaitForKeyRelease
|
||||
lda #0
|
||||
sta escFlag
|
||||
lda #$ff
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc getkeynowait
|
||||
;--------------------------------------------------
|
||||
jsr WaitForKeyRelease
|
||||
lda kbcode
|
||||
and #$3f ;CTRL and SHIFT ellimination
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc WaitForKeyRelease
|
||||
;--------------------------------------------------
|
||||
StillWait
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc IsKeyPressed
|
||||
; result: A=0 - yes , A>0 - no
|
||||
;--------------------------------------------------
|
||||
lda #1
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc DemoModeOrKey
|
||||
; Waits for the key pressed if at least one human is playing.
|
||||
; Otherwise, waits 3 seconds (demo mode).
|
||||
;--------------------------------------------------
|
||||
;check demo mode
|
||||
ldx numberOfPlayers
|
||||
dex
|
||||
checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE
|
||||
lda skillTable,x
|
||||
beq peopleAreHere
|
||||
dex
|
||||
bpl checkForHuman
|
||||
; no people, just wait a bit
|
||||
;pause 150
|
||||
ldy #75
|
||||
jmp PauseYFrames
|
||||
; rts
|
||||
peopleAreHere
|
||||
jmp getkey ; jsr:rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
MakeDarkScreen
|
||||
;--------------------------------------------------
|
||||
; mva #0 dmactls ; dark screen
|
||||
; and wait one frame :)
|
||||
;--------------------------------------------------
|
||||
.proc WaitOneFrame
|
||||
;--------------------------------------------------
|
||||
wait ; or waitRTC ?
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc PauseYFrames
|
||||
; Y - number of frames to wait (divided by 2)
|
||||
; pauses for maximally 510 frames (255 * 2)
|
||||
;--------------------------------------------------
|
||||
@ jsr WaitOneFrame
|
||||
jsr WaitOneFrame
|
||||
dey
|
||||
bne @-
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc CheckExitKeys
|
||||
;--------------------------------------------------
|
||||
; Checks keyboard and sets appropriate flags for exit procedures
|
||||
; If START+OPTION is pressed - exit to GameOver screen
|
||||
; If 'O' key is pressed - displays "Are you sure?" and - exit to GameOver screen
|
||||
; If 'Esc' key is pressed - displays "Are you sure?" and - exit to Menu screen
|
||||
; Just setting the right flags!!!
|
||||
|
||||
rts
|
||||
;
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc ShellDelay
|
||||
ldx flyDelay
|
||||
DelayLoop
|
||||
lda $d012
|
||||
@ cmp $d012
|
||||
beq @-
|
||||
lda $d012
|
||||
@ cmp $d012
|
||||
beq @-
|
||||
dex
|
||||
bne DelayLoop
|
||||
noShellDelay
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc RmtSongSelect
|
||||
; starting song line 0-255 to A reg
|
||||
;--------------------------------------------------
|
||||
rts
|
||||
.endp
|
||||
.proc CopyFromRom
|
||||
rts
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
icl 'C64/interrupts.asm'
|
||||
;----------------------------------------------
|
||||
icl 'constants.asm'
|
||||
;----------------------------------------------
|
||||
icl 'C64/textproc.asm'
|
||||
;----------------------------------------------
|
||||
icl 'grafproc.asm'
|
||||
icl 'C64/gr_basics.asm'
|
||||
;----------------------------------------------
|
||||
icl 'weapons.asm'
|
||||
;----------------------------------------------
|
||||
icl 'ai.asm'
|
||||
;----------------------------------------------
|
||||
icl 'artwork/talk.asm'
|
||||
;----------------------------------------------
|
||||
TankFont
|
||||
ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only
|
||||
;----------------------------------------------
|
||||
font4x4
|
||||
ins 'artwork/font4x4s.bmp',+62
|
||||
;-------------------------------------------------
|
||||
.proc CheckTankCheat
|
||||
ldy #$07
|
||||
lda TankNr
|
||||
asl
|
||||
asl
|
||||
asl ; 8 chars per name
|
||||
tax
|
||||
@
|
||||
lda CheatName,y
|
||||
sec
|
||||
sbc tanksnames,x
|
||||
cmp #$27
|
||||
bne NoCheat
|
||||
inx
|
||||
dey
|
||||
bpl @-
|
||||
YesCheat
|
||||
ldx TankNr
|
||||
lda TanksWeaponsTableL,x
|
||||
sta temp
|
||||
lda TanksWeaponsTableH,x
|
||||
sta temp+1
|
||||
lda #99
|
||||
@ iny
|
||||
sta (temp),y
|
||||
cpy #(number_of_weapons - 1)
|
||||
bne @-
|
||||
NoCheat
|
||||
rts
|
||||
.endp
|
||||
CheatName
|
||||
dta d" 008.T"+$27
|
||||
;----------------------------------------------
|
||||
.proc DLIinterruptBFG
|
||||
pha
|
||||
lda dliCounter
|
||||
bne EndofBFGDLI
|
||||
lda dliColorsFore
|
||||
bit random
|
||||
bmi @+
|
||||
lda DliColorBack
|
||||
@ sta COLPF2
|
||||
lda dliColorsFore
|
||||
bit random
|
||||
bmi @+
|
||||
lda DliColorBack
|
||||
@ sta COLPF1
|
||||
EndofBFGDLI
|
||||
inc dliCounter
|
||||
pla
|
||||
rti
|
||||
.endp
|
||||
; ------------------------
|
||||
.proc BFGblink
|
||||
; SetDLI DLIinterruptBFG ; blinking on
|
||||
ldy #50
|
||||
jsr PauseYFrames
|
||||
; SetDLI DLIinterruptGraph ; blinking off
|
||||
rts
|
||||
.endp
|
||||
;----------------------------------------------
|
||||
icl 'constants_top.asm'
|
||||
;----------------------------------------------
|
||||
NMI
|
||||
INC $D020 ; change border colour, indication for a NMI
|
||||
RTI ; exit interrupt
|
||||
; (not acknowledged!)
|
||||
@@ -23,7 +23,7 @@ GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4
|
||||
;----------------------------------------------------
|
||||
TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24
|
||||
;:6 dta d" "
|
||||
.ds 6*8
|
||||
.ds MaxPlayers*8
|
||||
;----------------------------------------------------
|
||||
skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30)
|
||||
.DS MaxPlayers
|
||||
@@ -102,9 +102,9 @@ ResultsTable ;the results in the gameeeeee
|
||||
.DS MaxPlayers
|
||||
TempResults
|
||||
.DS MaxPlayers
|
||||
DirectHitsH
|
||||
.DS MaxPlayers
|
||||
DirectHitsL
|
||||
;DirectHitsH ; one byte enough
|
||||
; .DS MaxPlayers
|
||||
DirectHits
|
||||
.DS MaxPlayers
|
||||
EarnedMoneyH
|
||||
.DS MaxPlayers
|
||||
@@ -287,9 +287,9 @@ AfterBFGflag .DS 1
|
||||
; tables with indexes of weapons on the right lists
|
||||
; OK (2022) so, L1 is list of offensive weapons, L2 - defensive
|
||||
IndexesOfWeaponsL1
|
||||
.ds (last_offensive_____ - first_offensive____+1)
|
||||
.ds (last_offensive - first_offensive +1)
|
||||
IndexesOfWeaponsL2
|
||||
.ds (last_defensive_____ - first_defensive____+1)
|
||||
.ds (last_defensive - first_defensive +1)
|
||||
;----------------------------------------------------
|
||||
|
||||
; variables storing amount of weapons on the first and second
|
||||
@@ -341,19 +341,10 @@ LaserCoordinate .DS 8 ; 2,2,2,2
|
||||
; Let 0 be "baby missile"
|
||||
; from $30 the defensive weapons begin
|
||||
TanksWeapons
|
||||
TanksWeapon1
|
||||
.DS [last_defensive_____ - first_offensive____ +1]
|
||||
TanksWeapon2
|
||||
.DS [last_defensive_____ - first_offensive____ +1]
|
||||
TanksWeapon3
|
||||
.DS [last_defensive_____ - first_offensive____ +1]
|
||||
TanksWeapon4
|
||||
.DS [last_defensive_____ - first_offensive____ +1]
|
||||
TanksWeapon5
|
||||
.DS [last_defensive_____ - first_offensive____ +1]
|
||||
TanksWeapon6
|
||||
.DS [last_defensive_____ - first_offensive____ +1]
|
||||
|
||||
.REPT MaxPlayers, #+1
|
||||
TanksWeapon:1
|
||||
.DS number_of_weapons
|
||||
.ENDR
|
||||
mountaintable ;table of mountains (size=screenwidth)
|
||||
.DS [screenwidth]
|
||||
.DS 1 ; additional byte for fallout (sometimes 1 pixel)
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
.IF *>0 ;this is a trick that prevents compiling this file alone
|
||||
;--------------------------------------------------
|
||||
.proc Explosion
|
||||
; xdraw,ydraw (word) - coordinates of explosion center
|
||||
; TankNr - number of shooting tank
|
||||
; ActiveWeapon(TankNr) - weapon that tank fires
|
||||
;--------------------------------------------------
|
||||
;cleanup of the soil fall down ranges (left and right)
|
||||
jsr ClearScreenSoilRange
|
||||
@@ -19,38 +22,38 @@
|
||||
pha
|
||||
rts
|
||||
ExplosionRoutines
|
||||
.word babymissile-1 ;Baby_Missile___;_00
|
||||
.word missile-1 ;Missile________;_01
|
||||
.word babynuke-1 ;Baby_Nuke______;_02
|
||||
.word nuke-1 ;Nuke___________;_03
|
||||
.word leapfrog-1 ;LeapFrog_______;_04
|
||||
.word funkybomb-1 ;Funky_Bomb_____;_05
|
||||
.word mirv-1 ;MIRV___________;_06
|
||||
.word deathshead-1 ;Death_s_Head___;_07
|
||||
.word napalm-1 ;Napalm_________;_08
|
||||
.word hotnapalm-1 ;Hot_Napalm_____;_09
|
||||
.word tracer-1 ;Tracer_________;_10
|
||||
.word tracer-1 ;Smoke_Tracer___;_11
|
||||
.word babyroller-1 ;Baby_Roller____;_12
|
||||
.word roller-1 ;Roller_________;_13
|
||||
.word heavyroller-1 ;Heavy_Roller___;_14
|
||||
.word riotcharge-1 ;Riot_Charge____;_15
|
||||
.word riotblast-1 ;Riot_Blast_____;_16
|
||||
.word riotbomb-1 ;Riot_Bomb______;_17
|
||||
.word babymissile-1 ;Baby_Missile ;_00
|
||||
.word missile-1 ;Missile ;_01
|
||||
.word babynuke-1 ;Baby_Nuke ;_02
|
||||
.word nuke-1 ;Nuke ;_03
|
||||
.word leapfrog-1 ;LeapFrog ;_04
|
||||
.word funkybomb-1 ;Funky_Bomb ;_05
|
||||
.word mirv-1 ;MIRV ;_06
|
||||
.word deathshead-1 ;Death_s_Head ;_07
|
||||
.word napalm-1 ;Napalm ;_08
|
||||
.word hotnapalm-1 ;Hot_Napalm ;_09
|
||||
.word tracer-1 ;Tracer ;_10
|
||||
.word tracer-1 ;Smoke_Tracer ;_11
|
||||
.word babyroller-1 ;Baby_Roller ;_12
|
||||
.word roller-1 ;Roller ;_13
|
||||
.word heavyroller-1 ;Heavy_Roller ;_14
|
||||
.word riotcharge-1 ;Riot_Charge ;_15
|
||||
.word riotblast-1 ;Riot_Blast ;_16
|
||||
.word riotbomb-1 ;Riot_Bomb ;_17
|
||||
.word heavyriotbomb-1 ;Heavy_Riot_Bomb;_18
|
||||
.word babydigger-1 ;Baby_Digger____;_19
|
||||
.word digger-1 ;Digger_________;_20
|
||||
.word heavydigger-1 ;Heavy_Digger___;_21
|
||||
.word babysandhog-1 ;Baby_Sandhog___;_22
|
||||
.word sandhog-1 ;Sandhog________;_23
|
||||
.word heavysandhog-1 ;Heavy_Sandhog__;_24
|
||||
.word dirtclod-1 ;Dirt_Clod______;_25
|
||||
.word dirtball-1 ;Dirt_Ball______;_26
|
||||
.word tonofdirt-1 ;Ton_of_Dirt____;_27
|
||||
.word liquiddirt-1 ;Liquid_Dirt____;_28
|
||||
.word dirtcharge-1 ;Dirt_Charge____;_29
|
||||
.word BFG-1 ;Buy_me_________;_30
|
||||
.word laser-1 ;Laser__________;_31
|
||||
.word babydigger-1 ;Baby_Digger ;_19
|
||||
.word digger-1 ;Digger ;_20
|
||||
.word heavydigger-1 ;Heavy_Digger ;_21
|
||||
.word babysandhog-1 ;Baby_Sandhog ;_22
|
||||
.word sandhog-1 ;Sandhog ;_23
|
||||
.word heavysandhog-1 ;Heavy_Sandhog ;_24
|
||||
.word dirtclod-1 ;Dirt_Clod ;_25
|
||||
.word dirtball-1 ;Dirt_Ball ;_26
|
||||
.word tonofdirt-1 ;Ton_of_Dirt ;_27
|
||||
.word liquiddirt-1 ;Liquid_Dirt ;_28
|
||||
.word dirtcharge-1 ;Dirt_Charge ;_29
|
||||
.word BFG-1 ;Buy_me ;_30
|
||||
.word laser-1 ;Laser ;_31
|
||||
|
||||
VOID
|
||||
tracer
|
||||
@@ -285,10 +288,10 @@ RepeatFlame ; internal loop (draw flames)
|
||||
lda random
|
||||
and #%00000110
|
||||
clc
|
||||
adc #char_flame___________
|
||||
adc #char_flame
|
||||
bne PutFlameChar
|
||||
LastNapalmRepeat
|
||||
lda #char_clear_flame_____ ; clear flame symbol
|
||||
lda #char_clear_flame ; clear flame symbol
|
||||
PutFlameChar
|
||||
sta CharCode
|
||||
; check coordinates
|
||||
@@ -358,29 +361,34 @@ EndNurnedCheckLoop
|
||||
; ------------------------
|
||||
.proc babyroller
|
||||
mva #11 ExplosionRadius
|
||||
GoRoller
|
||||
jmp xroller
|
||||
.endp
|
||||
; ------------------------
|
||||
.proc roller ;
|
||||
mva #21 ExplosionRadius
|
||||
jmp xroller
|
||||
bne babyroller.GoRoller ; 1 byte saved
|
||||
; jmp xroller
|
||||
.endp
|
||||
; ------------------------
|
||||
.proc heavyroller
|
||||
mva #30 ExplosionRadius
|
||||
jmp xroller
|
||||
bne babyroller.GoRoller ; 1 byte saved
|
||||
; jmp xroller
|
||||
.endp
|
||||
; ------------------------
|
||||
.proc riotbomb
|
||||
mva #17 ExplosionRadius
|
||||
GoRiotBomb
|
||||
jsr CalculateExplosionRange
|
||||
jmp xriotbomb
|
||||
.endp
|
||||
; ------------------------
|
||||
.proc heavyriotbomb
|
||||
mva #29 ExplosionRadius
|
||||
jsr CalculateExplosionRange
|
||||
jmp xriotbomb
|
||||
bne riotbomb.GoRiotBomb ; 4 bytes saved - optimization :)
|
||||
; jsr CalculateExplosionRange
|
||||
; jmp xriotbomb
|
||||
.endp
|
||||
; ------------------------
|
||||
.proc babydigger
|
||||
@@ -528,7 +536,7 @@ DiggerCharacter
|
||||
lda random
|
||||
and #$06
|
||||
clc
|
||||
adc #char_digger__________
|
||||
adc #char_digger
|
||||
adc sandhogflag
|
||||
sta CharCode
|
||||
cpw xdraw #(screenwidth-6)
|
||||
@@ -680,6 +688,7 @@ ToHighFill
|
||||
mwa EndOfTheBarrelX xbyte
|
||||
mva EndOfTheBarrelY ybyte
|
||||
mva #0 ybyte+1
|
||||
sta LaserFlag ; turn on gravity and wind after shot :)
|
||||
|
||||
mwa xdraw LaserCoordinate
|
||||
mwa ydraw LaserCoordinate+2
|
||||
@@ -804,15 +813,15 @@ DistanceCheckLoop
|
||||
tay
|
||||
; check shields
|
||||
lda ActiveDefenceWeapon,x
|
||||
cmp #ind_Shield_________ ; one hit shield
|
||||
cmp #ind_Shield ; one hit shield
|
||||
beq UseShield
|
||||
cmp #ind_Force_Shield___ ; shield with energy and parachute
|
||||
cmp #ind_Force_Shield ; shield with energy and parachute
|
||||
beq UseShieldWithEnergy
|
||||
cmp #ind_Heavy_Shield___ ; shield with energy
|
||||
cmp #ind_Heavy_Shield ; shield with energy
|
||||
beq UseShieldWithEnergy
|
||||
cmp #ind_Bouncy_Castle__ ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
|
||||
cmp #ind_Bouncy_Castle ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
|
||||
beq UseShieldWithEnergy
|
||||
cmp #ind_Mag_Deflector__ ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
|
||||
cmp #ind_Mag_Deflector ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
|
||||
beq UseShieldWithEnergy
|
||||
jsr DecreaseEnergyX
|
||||
jmp EndOfDistanceCheckLoop
|
||||
@@ -826,15 +835,13 @@ ShieldCoveredTank
|
||||
jne EndOfDistanceCheckLoop
|
||||
ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :)
|
||||
UseShield
|
||||
mva #1 Erase
|
||||
lda TankNr
|
||||
pha ; store TankNr
|
||||
stx TankNr ; store X in TankNr :)
|
||||
jsr DrawTankNr ; now erase tank with shield (to erase shield)
|
||||
jsr ClearTankNr ; now erase tank with shield (to erase shield)
|
||||
lda #0
|
||||
sta ActiveDefenceWeapon,x ; deactivate defense weapons
|
||||
sta Erase
|
||||
jsr DrawTankNr ; draw tank without shield
|
||||
jsr PutTankNr ; draw tank without shield
|
||||
ldx TankNr ; restore X value :)
|
||||
pla
|
||||
sta TankNr ; restore TankNr value :)
|
||||
@@ -927,11 +934,19 @@ ExplodeNow
|
||||
; finally a little explosion
|
||||
mva #sfx_baby_missile sfx_effect
|
||||
jmp xmissile
|
||||
rts
|
||||
; rts
|
||||
.endp
|
||||
; --------------------------------------------------
|
||||
.proc checkRollDirection
|
||||
; check rolling direction (for roller and other rolling weapons)
|
||||
; xdraw (word) - X coordinate
|
||||
; Y coordinate is taken from mountaintable and go to ydraw (word)
|
||||
; shoot direction is taken from VX+3
|
||||
; result:
|
||||
; HowMuchToFall - direction
|
||||
; $FF - we are in a hole (flying in missile direction)
|
||||
; 1 - right, 2 - left
|
||||
; --------------------------------------------------
|
||||
ldy #0
|
||||
adw xdraw #mountaintable tempXROLLER
|
||||
lda (tempXROLLER),y
|
||||
@@ -951,15 +966,12 @@ PositiveVelocity
|
||||
; 1 - right, 2 - left
|
||||
mva #$ff HowMuchToFall
|
||||
mva ydraw HeightRol
|
||||
;mwa #mountaintable tempXROLLER - It's already done !!!
|
||||
;adw tempXROLLER xdraw
|
||||
SeekLeft
|
||||
cpw tempXROLLER #mountaintable
|
||||
beq GoRightNow ; "bounce" if we have on left end
|
||||
.nowarn dew tempXROLLER
|
||||
lda (tempXROLLER),y ;fukk! beware of Y value
|
||||
cmp HeightRol
|
||||
;bne HowMuchToFallLeft
|
||||
HowMuchToFallLeft
|
||||
bcs GoRightNow
|
||||
mva #1 HowMuchToFall
|
||||
@@ -971,9 +983,7 @@ SeekRight
|
||||
inw tempXROLLER
|
||||
lda (tempXROLLER),y
|
||||
cmp HeightRol
|
||||
;bne HowMuchToFallRight
|
||||
HowMuchToFallRight
|
||||
; check if up or down
|
||||
bcs HowMuchToFallKnown
|
||||
lda HowMuchToFall
|
||||
bpl ItIsLeftAlready
|
||||
@@ -1069,11 +1079,10 @@ ContinueToCheckMaxForce2
|
||||
lda MaxForceTableL,x
|
||||
sta ForceTableL,x
|
||||
@
|
||||
mva #0 Erase
|
||||
jsr DisplayStatus ;all digital values like force, angle, wind, etc.
|
||||
jsr PutTankNameOnScreen
|
||||
; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen
|
||||
|
||||
jsr DrawTankNr
|
||||
jsr PutTankNr
|
||||
|
||||
jsr WaitOneFrame ; best after drawing a tank
|
||||
|
||||
@@ -1089,13 +1098,13 @@ ContinueToCheckMaxForce2
|
||||
; $f3 - shift+key
|
||||
|
||||
notpressed
|
||||
jsr CheckExitKeys ; Check for O, Esc or Start+Option keys
|
||||
spl:rts ; exit if pressed 'Exit keys'
|
||||
|
||||
ldx TankNr ; for optimize
|
||||
; Select and Option
|
||||
lda CONSOL
|
||||
tay
|
||||
and #%00000101 ; Start + Option
|
||||
beq QuitToGameover
|
||||
tya
|
||||
and #%00000100
|
||||
beq callActivation ; Option key
|
||||
tya
|
||||
@@ -1110,24 +1119,6 @@ notpressed
|
||||
lda kbcode
|
||||
and #%10111111 ; SHIFT elimination
|
||||
|
||||
cmp #@kbcode._O ; $08 ; O
|
||||
bne @+
|
||||
jsr AreYouSure
|
||||
bit escFlag
|
||||
bpl notpressed
|
||||
;---O pressed-quit game to game over screen---
|
||||
QuitToGameover
|
||||
mva #$40 escFlag
|
||||
rts
|
||||
@
|
||||
cmp #@kbcode._esc ; 28 ; ESC
|
||||
bne @+
|
||||
jsr AreYouSure
|
||||
bit escFlag
|
||||
bpl notpressed
|
||||
;---esc pressed-quit game---
|
||||
rts
|
||||
@
|
||||
cmp #@kbcode._A ; $3f ; A
|
||||
bne @+
|
||||
callActivation
|
||||
@@ -1373,9 +1364,9 @@ pressedTAB
|
||||
mva #sfx_purchase sfx_effect
|
||||
;ldx TankNr ; optimized
|
||||
lda ActiveWeapon,x
|
||||
cmp #last_offensive_____ ; the last possible offensive weapon
|
||||
cmp #last_offensive ; the last possible offensive weapon
|
||||
bne ?notlasttofirst
|
||||
lda #first_offensive____ ; #0
|
||||
lda #first_offensive ; #0
|
||||
sta ActiveWeapon,x
|
||||
beq @+ ; allways = 0
|
||||
?notlasttofirst
|
||||
@@ -1390,9 +1381,9 @@ CTRLpressedTAB
|
||||
mva #sfx_purchase sfx_effect
|
||||
;ldx TankNr ; optimized
|
||||
lda ActiveWeapon,x
|
||||
cmp #first_offensive____ ; #0
|
||||
cmp #first_offensive ; #0
|
||||
bne ?notfirsttolast
|
||||
lda #last_offensive_____ ; the last possible offensive weapon
|
||||
lda #last_offensive ; the last possible offensive weapon
|
||||
sta ActiveWeapon,x
|
||||
bne @+ ; allways <> 0
|
||||
?notfirsttolast
|
||||
@@ -1461,7 +1452,7 @@ AfterOffensiveText
|
||||
mva #0 LaserFlag ; $ff - Laser
|
||||
ldx TankNr
|
||||
lda ActiveWeapon,x
|
||||
cmp #ind_Laser__________ ; laser
|
||||
cmp #ind_Laser ; laser
|
||||
bne NotStrongShoot
|
||||
; Laser: (not)very strong - invisible - shot for laser beam end coordinates
|
||||
bit Vdebug
|
||||
@@ -1537,7 +1528,7 @@ ShotUnderGround
|
||||
bmi noSmokeTracer ; no Smoke Tracer display
|
||||
ldx TankNr
|
||||
lda ActiveWeapon,x
|
||||
cmp #ind_Smoke_Tracer___ ; Smoke tracer
|
||||
cmp #ind_Smoke_Tracer ; Smoke tracer
|
||||
bne noSmokeTracer
|
||||
iny
|
||||
noSmokeTracer
|
||||
@@ -1716,7 +1707,7 @@ Loopi
|
||||
bmi NoTestForMIRV
|
||||
ldx TankNr
|
||||
lda ActiveWeapon,x
|
||||
cmp #ind_MIRV___________ ; MIRV
|
||||
cmp #ind_MIRV ; MIRV
|
||||
jeq MIRVdownLoop
|
||||
NoTestForMIRV
|
||||
NoGravity
|
||||
@@ -1770,7 +1761,11 @@ nolaserwait
|
||||
bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) )
|
||||
nonowait
|
||||
jsr shellDelay
|
||||
|
||||
;
|
||||
jsr CheckExitKeys ; Check for O, Esc or Start+Option keys
|
||||
spl:rts ; exit if pressed 'Exit keys'
|
||||
ldx TankNr
|
||||
;
|
||||
nowait
|
||||
lda HitFlag
|
||||
bne Hit
|
||||
@@ -1855,25 +1850,25 @@ EndOfFlight2
|
||||
cpx HitFlag ; we don't count suicides :)
|
||||
beq @+
|
||||
dex
|
||||
inc DirectHitsL,x
|
||||
bne @+
|
||||
inc DirectHitsH,x
|
||||
inc DirectHits,x
|
||||
; bne @+ ; one byte enough
|
||||
; inc DirectHitsH,x
|
||||
@
|
||||
; tank hit - check defensive weapon of this tank
|
||||
tax
|
||||
dex ; index of hitted tank in X
|
||||
ldy TankNr
|
||||
lda ActiveWeapon,y
|
||||
cmp #ind_Tracer_________ ; defence not fire by tracers
|
||||
cmp #ind_Tracer ; defence not fire by tracers
|
||||
beq JNoDefence
|
||||
cmp #ind_Smoke_Tracer___
|
||||
cmp #ind_Smoke_Tracer
|
||||
beq JNoDefence
|
||||
cmp #ind_Laser__________ ; Bouncy and Mag not fire by Laser
|
||||
cmp #ind_Laser ; Bouncy and Mag not fire by Laser
|
||||
beq JNoDefence
|
||||
lda ActiveDefenceWeapon,x
|
||||
cmp #ind_Bouncy_Castle__ ; Auto Defence
|
||||
cmp #ind_Bouncy_Castle ; Auto Defence
|
||||
jeq BouncyCastle
|
||||
cmp #ind_Mag_Deflector__ ; Mag Deflector
|
||||
cmp #ind_Mag_Deflector ; Mag Deflector
|
||||
beq MagDeflector
|
||||
JNoDefence
|
||||
jmp NoDefence
|
||||
@@ -1903,16 +1898,14 @@ RightDeflection
|
||||
bcs EndOfMagDeflector ; hit of course but we need RTS
|
||||
sbw XHit #36 ; change to left
|
||||
EndOfMagDeflector
|
||||
mva #1 Erase
|
||||
lda TankNr
|
||||
pha ; store TankNr
|
||||
stx TankNr ; store X in TankNr :)
|
||||
jsr DrawTankNr ; now erase tank with shield (to erase shield)
|
||||
jsr ClearTankNr ; now erase tank with shield (to erase shield)
|
||||
lda #0
|
||||
sta ActiveDefenceWeapon,x ; deactivate used mag deflector weapon
|
||||
sta ShieldEnergy,x
|
||||
sta Erase
|
||||
jsr DrawTankNr ; draw tank without shield
|
||||
jsr PutTankNr ; draw tank without shield
|
||||
ldx TankNr ; restore X value :)
|
||||
pla
|
||||
sta TankNr ; restore TankNr value :)
|
||||
@@ -1926,17 +1919,16 @@ BouncyCastle
|
||||
; now in Y we have number of of the attacking player (TankNr) !
|
||||
lda ActiveWeapon,y
|
||||
; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down
|
||||
cmp #ind_Funky_Bomb_____
|
||||
cmp #ind_Funky_Bomb
|
||||
bne @+
|
||||
jsr SetFullScreenSoilRange
|
||||
@
|
||||
mva #sfx_shield_on sfx_effect
|
||||
; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)!
|
||||
mva #1 Erase
|
||||
lda TankNr
|
||||
pha ; store TankNr
|
||||
stx TankNr ; store X in TankNr :)
|
||||
jsr DrawTankNr ; now erase tank with shield (to erase shield)
|
||||
jsr ClearTankNr ; now erase tank with shield (to erase shield)
|
||||
lda #0
|
||||
sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon
|
||||
sta ShieldEnergy,x
|
||||
@@ -1944,8 +1936,7 @@ BouncyCastle
|
||||
sta ytraj
|
||||
; sta xtraj+2
|
||||
; sta ytraj+2
|
||||
sta Erase
|
||||
jsr DrawTankNr ; draw tank without shield
|
||||
jsr PutTankNr ; draw tank without shield
|
||||
; ldx TankNr ; restore X value :) ... but we don't need X now ..
|
||||
pla
|
||||
sta TankNr ; restore TankNr value :)
|
||||
@@ -2108,6 +2099,15 @@ mrLoopi
|
||||
sta vy+3
|
||||
|
||||
jsr ShellDelay
|
||||
;
|
||||
phx
|
||||
jsr CheckExitKeys ; Check for O, Esc or Start+Option keys
|
||||
bpl ExitnotPressed
|
||||
plx
|
||||
rts ; exit if pressed 'Exit keys'
|
||||
ExitnotPressed
|
||||
plx
|
||||
;
|
||||
|
||||
MIRVdoNotChangeY
|
||||
|
||||
@@ -2370,8 +2370,7 @@ NoWall
|
||||
; -------------------------------------------------
|
||||
mva #sfx_death_begin sfx_effect
|
||||
jsr FlashTank ; first we flash tank
|
||||
mva #1 Erase
|
||||
jsr DrawTankNr ; and erase tank
|
||||
jsr ClearTankNr ; and erase tank
|
||||
lda #0
|
||||
sta Erase
|
||||
ldx TankNr
|
||||
@@ -2385,68 +2384,6 @@ NoWall
|
||||
rts
|
||||
.endp
|
||||
|
||||
; -------------------------------------------------
|
||||
.proc AtomicWinter
|
||||
; -------------------------------------------------
|
||||
; This routine is run from inside of the main loop
|
||||
; and replaces Shoot and Flight routines
|
||||
; X and TankNr - index of shooting tank
|
||||
; -------------------------------------------------
|
||||
mva #sfx_sandhog sfx_effect
|
||||
ldy #0 ; byte counter (from 0 to 39)
|
||||
NextColumn
|
||||
; big loop - we repat internal loops for each column of bytes
|
||||
sty magic
|
||||
ldx #120 ; line counter (from 0 to 60 )
|
||||
; first loop - inverse column of bytes for a while
|
||||
ldy magic
|
||||
NextLine1
|
||||
jsr InverseScreenByte
|
||||
dex
|
||||
dex
|
||||
bpl NextLine1
|
||||
;
|
||||
jsr WaitOneFrame ; wait uses A only
|
||||
; second loop - inverse again and put random "snow" to column of bytes
|
||||
ldx #120
|
||||
ldy magic
|
||||
mva #$55 magic+1
|
||||
NextLine2
|
||||
jsr InverseScreenByte
|
||||
lda random
|
||||
ora magic+1
|
||||
and (temp),y
|
||||
sta (temp),y
|
||||
lda magic+1
|
||||
eor #$ff
|
||||
sta magic+1
|
||||
dex
|
||||
dex
|
||||
bpl NextLine2
|
||||
; and go to next column
|
||||
iny
|
||||
cpy #40
|
||||
bne NextColumn
|
||||
; and we have "snow" :)
|
||||
lda #0
|
||||
ldx TankNr
|
||||
sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter
|
||||
jsr SetFullScreenSoilRange
|
||||
jsr SoilDown2.NoClearTanks
|
||||
rts
|
||||
|
||||
; in order to optimize the fragment repeated in both internal loops
|
||||
; we save 15 bytes :)
|
||||
InverseScreenByte
|
||||
lda LineTableL,x
|
||||
sta temp
|
||||
lda LineTableH,x
|
||||
sta temp+1
|
||||
lda (temp),y
|
||||
eor #$ff
|
||||
sta (temp),y
|
||||
rts
|
||||
.endp
|
||||
; -------------------------------------------------
|
||||
.proc AutoDefense
|
||||
; -------------------------------------------------
|
||||
@@ -2455,8 +2392,8 @@ InverseScreenByte
|
||||
; -------------------------------------------------
|
||||
jsr PrepareAIShoot.WepTableToTemp
|
||||
jsr UseBattery
|
||||
jsr TosserDefensives
|
||||
rts
|
||||
jmp TosserDefensives
|
||||
; rts
|
||||
.endp
|
||||
; -------------------------------------------------
|
||||
.proc SpyHard
|
||||
@@ -2494,15 +2431,15 @@ SelectNextTank
|
||||
beq RepeatSpy
|
||||
SpyHardEnd
|
||||
mvx TargetTankNr TankNr ; restore
|
||||
jsr DisplaySpyInfo
|
||||
rts
|
||||
jmp DisplaySpyInfo
|
||||
; rts
|
||||
.endp
|
||||
.proc DisplaySpyInfo
|
||||
lda TankStatusColoursTable,x
|
||||
sta COLOR2 ; set color of status line
|
||||
jsr PutTankNameOnScreen
|
||||
jsr DisplayStatus
|
||||
rts
|
||||
jmp PutTankNameOnScreen
|
||||
; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen
|
||||
; rts
|
||||
.endp
|
||||
; -------------------------------------------------
|
||||
.proc LazyBoys
|
||||
@@ -2537,8 +2474,8 @@ EndLazy
|
||||
sta ForceTableL,x
|
||||
lda Force+1
|
||||
sta ForceTableH,x
|
||||
jsr MoveBarrelToNewPosition
|
||||
rts
|
||||
jmp MoveBarrelToNewPosition
|
||||
; rts
|
||||
.endp
|
||||
; -------------------------------------------------
|
||||
.proc TankFlying
|
||||
@@ -2561,14 +2498,7 @@ StoreMaxAlt
|
||||
mva #sfx_plasma_2_2 sfx_effect
|
||||
|
||||
; display text 4x4 - fuel full
|
||||
|
||||
mwa #hoverFull LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering
|
||||
mva #hoverFullEnd-hoverFull-1 fx ; length
|
||||
sec
|
||||
lda FloatingAlt
|
||||
sbc #12
|
||||
sta LineYdraw
|
||||
jsr SetFuelFullText
|
||||
jsr TypeLine4x4.variableLength
|
||||
|
||||
ldx TankNr
|
||||
@@ -2581,19 +2511,17 @@ TankGoUp
|
||||
cmp FloatingAlt ; Floating altitude
|
||||
bcc ReachSky
|
||||
; first erase old tank position
|
||||
mva #1 Erase
|
||||
jsr DrawTankNr
|
||||
jsr ClearTankNr
|
||||
lda modify
|
||||
cmp #5
|
||||
bcc NoEngineClear
|
||||
mva #0 color
|
||||
jsr DrawTankRocketEngine
|
||||
NoEngineClear
|
||||
mva #0 Erase
|
||||
dec ytankstable,x
|
||||
inc modify
|
||||
; then draw tank on new position
|
||||
jsr DrawTankNr
|
||||
jsr PutTankNr
|
||||
lda modify
|
||||
cmp #5
|
||||
bcc NoEngine
|
||||
@@ -2611,13 +2539,7 @@ ReachSky
|
||||
jsr DrawTankRocketEngine
|
||||
|
||||
; display text 4x4 - fuel full (clear text)
|
||||
mwa #hoverFull LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering
|
||||
mva #(hoverFullEnd-hoverFull-1) fx ; length
|
||||
sec
|
||||
lda FloatingAlt
|
||||
sbc #12
|
||||
sta LineYdraw
|
||||
jsr SetFuelFullText
|
||||
lda #$00
|
||||
jsr TypeLine4x4.staplot4x4color
|
||||
; and Soildown at the start (for correct mountaintable if tank was buried)
|
||||
@@ -2656,18 +2578,15 @@ KeyboardAndJoyCheck
|
||||
bne LotOfFuel
|
||||
|
||||
; display text 4x4 - low fuel
|
||||
mwa #hoverEmpty LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering
|
||||
mva #hoverEmptyEnd-hoverEmpty-1 fx ; length
|
||||
sec
|
||||
lda FloatingAlt
|
||||
sbc #12
|
||||
sta LineYdraw
|
||||
jsr SetLowFuelText
|
||||
jsr TypeLine4x4.variableLength
|
||||
ldx TankNr
|
||||
|
||||
LotOfFuel
|
||||
notpressed
|
||||
jsr CheckExitKeys
|
||||
spl:rts ;---Exit key pressed-quit game---
|
||||
ldx TankNr
|
||||
|
||||
; let's animate "engine"
|
||||
jsr DrawTankEngine
|
||||
; enimation ends
|
||||
@@ -2681,14 +2600,6 @@ notpressed
|
||||
lda kbcode
|
||||
and #%00111111 ; CTRL and SHIFT elimination
|
||||
|
||||
cmp #@kbcode._esc ; 28 ; ESC
|
||||
bne @+
|
||||
jsr AreYouSure
|
||||
bit escFlag
|
||||
bpl notpressed
|
||||
;---esc pressed-quit game---
|
||||
rts
|
||||
@
|
||||
jumpFromStick
|
||||
cmp #@kbcode._left ; $6
|
||||
jeq pressedLeft
|
||||
@@ -2721,8 +2632,7 @@ pressedRight
|
||||
ldy #1
|
||||
jsr DecreaseShieldEnergyX
|
||||
; first erase old tank position
|
||||
mva #1 Erase
|
||||
jsr DrawTankNr
|
||||
jsr ClearTankNr
|
||||
mva #0 Erase
|
||||
lda XtankstableH,x
|
||||
cmp #>(screenwidth-TankWidth-4) ; tank width correction +4
|
||||
@@ -2745,9 +2655,7 @@ pressedLeft
|
||||
ldy #1
|
||||
jsr DecreaseShieldEnergyX
|
||||
; first erase old tank position
|
||||
mva #1 Erase
|
||||
jsr DrawTankNr
|
||||
mva #0 Erase
|
||||
jsr ClearTankNr
|
||||
lda XtankstableH,x
|
||||
cmp #0
|
||||
bne @+
|
||||
@@ -2765,7 +2673,7 @@ NoLEdge
|
||||
mva #162 AngleTable,x
|
||||
; then draw tank on new position
|
||||
DrawFloatingTank
|
||||
jsr DrawTankNr
|
||||
jsr PutTankNr
|
||||
jsr DisplayStatus
|
||||
jsr WaitOneFrame
|
||||
jsr CalculateSoildown
|
||||
@@ -2773,13 +2681,7 @@ DrawFloatingTank
|
||||
|
||||
pressedSpace
|
||||
; display text 4x4 - low fuel (clear text)
|
||||
mwa #hoverEmpty LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering
|
||||
mva #hoverEmptyEnd-hoverEmpty-1 fx ; length
|
||||
sec
|
||||
lda FloatingAlt
|
||||
sbc #12
|
||||
sta LineYdraw
|
||||
jsr SetLowFuelText
|
||||
lda #$00
|
||||
jsr TypeLine4x4.staplot4x4color
|
||||
ldx TankNr
|
||||
@@ -2843,9 +2745,7 @@ TankBelow
|
||||
; tank below - we must move our tank
|
||||
ldx TankNr
|
||||
; first erase old tank position
|
||||
mva #1 Erase
|
||||
jsr DrawTankNr
|
||||
mva #0 Erase
|
||||
jsr ClearTankNr
|
||||
bit OverTankDir
|
||||
bmi PassLeft
|
||||
PassRight
|
||||
@@ -2861,7 +2761,7 @@ PassLeft
|
||||
mva #162 AngleTable,x
|
||||
Bypassing
|
||||
; then draw tank on new position
|
||||
jsr DrawTankNr
|
||||
jsr PutTankNr
|
||||
jmp CheckForTanksBelow
|
||||
RightFromTheTank
|
||||
LeftFromTheTank
|
||||
@@ -2871,8 +2771,7 @@ ItIsMe
|
||||
bpl CheckCollisionWithTankLoop
|
||||
ldx TankNr
|
||||
mva #sfx_shield_off sfx_effect
|
||||
mva #1 Erase
|
||||
jsr DrawTankNr
|
||||
jsr ClearTankNr
|
||||
mva #0 Erase
|
||||
; x correction for P/M
|
||||
; --
|
||||
@@ -2901,13 +2800,11 @@ FloatDown
|
||||
cmp OverTankDir
|
||||
bcs OnGround
|
||||
; first erase old tank position
|
||||
mva #1 Erase
|
||||
jsr DrawTankNr
|
||||
jsr ClearTankNr
|
||||
jsr DrawTankParachute
|
||||
mva #0 Erase
|
||||
inc ytankstable,x
|
||||
; then draw tank on new position
|
||||
jsr DrawTankNr
|
||||
jsr PutTankNr
|
||||
jsr DrawTankParachute
|
||||
jsr WaitOneFrame
|
||||
jmp FloatDown
|
||||
@@ -2922,6 +2819,7 @@ OnGround
|
||||
lda FloatingAlt
|
||||
cmp #18
|
||||
beq NotHighest
|
||||
SoilDownAfterLanding
|
||||
jsr ClearScreenSoilRange
|
||||
NotHighest
|
||||
; calculate range
|
||||
@@ -2941,8 +2839,25 @@ CalculateSoildown
|
||||
adc #0
|
||||
sta xdraw+1
|
||||
mva #$04 ExplosionRadius
|
||||
jsr CalculateExplosionRange
|
||||
jmp CalculateExplosionRange
|
||||
; rts
|
||||
|
||||
SetFuelFullText
|
||||
mwa #hoverFull LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering
|
||||
mva #hoverFullEnd-hoverFull fx ; length
|
||||
bne SetTextLevel ; !! length<>0
|
||||
SetLowFuelText
|
||||
mwa #hoverEmpty LineAddress4x4
|
||||
mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering
|
||||
mva #hoverEmptyEnd-hoverEmpty fx ; length
|
||||
SetTextLevel
|
||||
sec
|
||||
lda FloatingAlt
|
||||
sbc #12
|
||||
sta LineYdraw
|
||||
rts
|
||||
|
||||
.endp
|
||||
|
||||
; -------------------------------------------------
|
||||
@@ -2970,9 +2885,9 @@ CheckCollisionWithTankLoop
|
||||
; with or without shield ?
|
||||
|
||||
lda ActiveDefenceWeapon,x
|
||||
cmp #ind_Mag_Deflector__ ; first shielded weapon
|
||||
cmp #ind_Mag_Deflector ; first shielded weapon
|
||||
bcc CheckCollisionWithNotShieldedTank
|
||||
cmp #ind_Bouncy_Castle__+1 ; last shielded weapon
|
||||
cmp #ind_Bouncy_Castle +1 ; last shielded weapon
|
||||
bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :)
|
||||
|
||||
;lda ShieldEnergy,x ; there is wrong method to check shield :)
|
||||
@@ -3170,24 +3085,5 @@ noBullets
|
||||
rts
|
||||
.endp
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc ShellDelay
|
||||
lda CONSOL
|
||||
and #%00000101 ; Start + Option
|
||||
bne @+
|
||||
mva #$40 escFlag
|
||||
@ and #%00000001
|
||||
beq noShellDelay
|
||||
ldx flyDelay
|
||||
DelayLoop
|
||||
lda VCOUNT
|
||||
@ cmp VCOUNT
|
||||
beq @-
|
||||
dex
|
||||
bne DelayLoop
|
||||
noShellDelay
|
||||
rts
|
||||
.endp
|
||||
|
||||
.ENDIF
|
||||
|
||||