@@ -1,7 +1,5 @@
|
||||
.project
|
||||
*.bak
|
||||
scorch.lab
|
||||
scorch.lst
|
||||
textproc.lab
|
||||
textproc.lst
|
||||
*.lab
|
||||
*.lst
|
||||
artwork/talk.as_
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
;-----------------------------------------------
|
||||
; start of "variables" (RAM)
|
||||
;-----------------------------------------------
|
||||
OptionsHere
|
||||
OptionsHere
|
||||
; 0123456789012345678901234567890123456789
|
||||
dta d"Players : 2 3 4 5 6 "
|
||||
dta d"Cash : none 2K 8K 12K 20K "
|
||||
@@ -15,7 +15,7 @@ DLPurTitleAddr
|
||||
.byte $50
|
||||
.byte $42
|
||||
.word purchaseTextBuffer
|
||||
.byte $00+$80
|
||||
.byte $00+$80
|
||||
.byte $20+$80,$10+$80,$42
|
||||
MoreUpdl
|
||||
.word EmptyLine
|
||||
@@ -8,54 +8,54 @@
|
||||
;-----------------------------------------------
|
||||
OptionsScreen
|
||||
dta d"Welcome to Scorch v. "
|
||||
build ; 4 bytes from scorch.asm (fancy method) :)
|
||||
build ; 4 bytes from scorch.asm (fancy method) :)
|
||||
dta d" (un)2000-2023"
|
||||
|
||||
.IF TARGET = 800
|
||||
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 "
|
||||
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 "
|
||||
dta d" Please select option with joystick one "
|
||||
dta d" and press FIRE to proceed "
|
||||
.ENDIF
|
||||
; 0123456789012345678901234567890123456789
|
||||
;-----------------------------------------------
|
||||
NameScreen
|
||||
.IF TARGET = 800
|
||||
dta d" Enter names of players "
|
||||
dta d" Enter names of players "
|
||||
.ELIF TARGET = 5200
|
||||
dta d"Hold "
|
||||
dta d "FIRE"*
|
||||
dta d " to enter player names "
|
||||
dta d"Hold "
|
||||
dta d "FIRE"*
|
||||
dta d " to enter player names "
|
||||
.ENDIF
|
||||
NameScreen3
|
||||
dta d" Human/Atari (difficulty level) "
|
||||
NameScreen5
|
||||
.IF TARGET = 800
|
||||
dta d"TAB"*
|
||||
dta d" - Port nr "
|
||||
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 "
|
||||
dta d"TAB"*
|
||||
dta d" - Port nr "
|
||||
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/Shape "
|
||||
dta d"Joy"*
|
||||
dta d" - Diffic. "
|
||||
dta d" "
|
||||
dta d"FIRE"*
|
||||
dta d" - Proceed "
|
||||
dta d" "
|
||||
dta d"(5)"*
|
||||
dta d" - Port/Shape "
|
||||
dta d"Joy"*
|
||||
dta d" - Diffic. "
|
||||
dta d" "
|
||||
dta d"FIRE"*
|
||||
dta d" - Proceed "
|
||||
.ENDIF
|
||||
;-----------------------------------------------
|
||||
MoreUp
|
||||
@@ -73,51 +73,46 @@ MoreDown
|
||||
WeaponsDescription
|
||||
; 0123456789012345678901234567890123456789
|
||||
.IF TARGET = 800
|
||||
dta d"Tab"*
|
||||
dta d ": Defensive/Offensive weapon "
|
||||
dta d"Tab"*
|
||||
dta d ": Defensive/Offensive weapon "
|
||||
.ELIF TARGET = 5200
|
||||
dta d"Left"*
|
||||
dta d ": Defensive/Offensive weapon"
|
||||
dta d"Left"*
|
||||
dta d ": Defensive/Offensive weapon"
|
||||
.ENDIF
|
||||
PurchaseDescription
|
||||
; 0123456789012345678901234567890123456789
|
||||
.IF TARGET = 800
|
||||
dta d"Space"*
|
||||
dta d": Purchase "
|
||||
dta d"Return"*
|
||||
dta d": Finish "
|
||||
dta d"Space"*
|
||||
dta d": Purchase "
|
||||
dta d"Return"*
|
||||
dta d": Finish "
|
||||
.ELIF TARGET = 5200
|
||||
dta d"Right"*
|
||||
dta d": Purchase "
|
||||
dta d"FIRE"*
|
||||
dta d": Finish "
|
||||
dta d"Right"*
|
||||
dta d": Purchase "
|
||||
dta d"FIRE"*
|
||||
dta d": Finish "
|
||||
.ENDIF
|
||||
ActivateDescription
|
||||
; 0123456789012345678901234567890123456789
|
||||
.IF TARGET = 800
|
||||
dta d"Space"*
|
||||
dta d": Activate "
|
||||
dta d"Return"*
|
||||
dta d": Finish "
|
||||
dta d"Space"*
|
||||
dta d": Activate "
|
||||
dta d"Return"*
|
||||
dta d": Finish "
|
||||
.ELIF TARGET = 5200
|
||||
dta d"Right"*
|
||||
dta d": Activate "
|
||||
dta d"FIRE"*
|
||||
dta d": Finish "
|
||||
dta d"Right"*
|
||||
dta d": Activate "
|
||||
dta d"FIRE"*
|
||||
dta d": Finish "
|
||||
.ENDIF
|
||||
EmptyLine
|
||||
dta d" "
|
||||
;---------------------------------------------------
|
||||
OptionsTitle
|
||||
.IF TARGET = 800
|
||||
dta d" scorch "*
|
||||
dta d" scorch "*
|
||||
.ELIF TARGET = 5200
|
||||
dta d" scorch supersystem "*
|
||||
; dta d" scorch "*
|
||||
; dta d"5"
|
||||
; dta d"k"*
|
||||
; dta d"2"
|
||||
; dta d" "*
|
||||
dta d" scorch supersystem "*
|
||||
.ENDIF
|
||||
DifficultyTitle
|
||||
dta d" difficulty "*
|
||||
@@ -135,7 +130,7 @@ GameOverTitle2
|
||||
|
||||
dl ; MAIN game display list
|
||||
.byte $70
|
||||
.byte $42
|
||||
.byte $42
|
||||
.word statusBuffer
|
||||
.byte $02, $02
|
||||
.byte $10+$80 ; 2 blank lines + DLI
|
||||
@@ -182,19 +177,19 @@ dl ; MAIN game display list
|
||||
;-----------------------------------------------
|
||||
OptionsDL
|
||||
.byte $70
|
||||
.byte $47
|
||||
.word OptionsTitle
|
||||
.byte $47
|
||||
.word OptionsTitle
|
||||
.byte $70,$70
|
||||
.byte $42
|
||||
.word OptionsScreen
|
||||
.byte $30,$02,$02,$70
|
||||
.byte $42
|
||||
.word OptionsHere
|
||||
.byte $10
|
||||
.byte $42
|
||||
.word OptionsHere
|
||||
.byte $10
|
||||
:maxOptions-1 .by $02,$10
|
||||
:(9-maxOptions) .by $70,$10
|
||||
.byte $80
|
||||
.byte $60 ; to match moved sprites
|
||||
:(9-maxOptions) .by $70,$10
|
||||
.byte $80
|
||||
.byte $60 ; to match moved sprites
|
||||
.byte $4f
|
||||
.word (display+140*40)
|
||||
:21 .by $0f ;76
|
||||
@@ -204,25 +199,25 @@ OptionsDL
|
||||
;Enter names of tanks DL
|
||||
NameDL
|
||||
.byte $70
|
||||
.byte $47
|
||||
.word DifficultyTitle
|
||||
.byte $70,$70 ; 16 empty lines
|
||||
.byte $47
|
||||
.word DifficultyTitle
|
||||
.byte $70,$70 ; 16 empty lines
|
||||
.byte $42
|
||||
.word NameScreen
|
||||
.byte $30 ; 4 empty lines
|
||||
.byte $42
|
||||
.word NameScreen2
|
||||
.byte $30+$80 ; 4 empty lines + DLI
|
||||
.byte $42
|
||||
.word NameScreen3
|
||||
.byte $10 ; 2 empty lines
|
||||
.byte $42
|
||||
.word NameScreen4
|
||||
.byte $02,$02
|
||||
.byte $30 ; 4 empty lines
|
||||
.byte $42
|
||||
.word NameScreen5
|
||||
.byte $02
|
||||
.byte $30 ; 4 empty lines
|
||||
.byte $42
|
||||
.word NameScreen2
|
||||
.byte $30+$80 ; 4 empty lines + DLI
|
||||
.byte $42
|
||||
.word NameScreen3
|
||||
.byte $10 ; 2 empty lines
|
||||
.byte $42
|
||||
.word NameScreen4
|
||||
.byte $02,$02
|
||||
.byte $30 ; 4 empty lines
|
||||
.byte $42
|
||||
.word NameScreen5
|
||||
.byte $02
|
||||
.byte $41
|
||||
.word NameDL
|
||||
; -------------------------------------------------
|
||||
@@ -252,8 +247,8 @@ GameOverDL
|
||||
.byte $42
|
||||
.word GameOverResults
|
||||
:5 .byte $00+$80,$02
|
||||
.byte $01
|
||||
.word DLCreditsFragm
|
||||
.byte $01
|
||||
.word DLCreditsFragm
|
||||
; ---------------
|
||||
; end of "constants" (ROM)
|
||||
;-----------------------------------------------
|
||||
@@ -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
|
||||
@@ -1,114 +1,114 @@
|
||||
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
|
||||
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
|
||||
|
||||
.IF *>0 ;this is a trick that prevents compiling this file alone
|
||||
|
||||
;--------------------------------------------------
|
||||
.proc DLIinterruptGraph
|
||||
pha
|
||||
phy
|
||||
ldy dliCounter
|
||||
lda dliColorsBack,y
|
||||
pha
|
||||
phy
|
||||
ldy dliCounter
|
||||
lda dliColorsBack,y
|
||||
.IF TARGET = 800
|
||||
nop ; necessary on 800 because DLIs take less time, jitter visible without it
|
||||
nop
|
||||
nop
|
||||
nop ; necessary on 800 because DLIs take less time, jitter visible without it
|
||||
nop
|
||||
nop
|
||||
.ENDIF
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
sta COLPF1
|
||||
lda GradientNr
|
||||
bne GoGradient
|
||||
ldy #$ff ; one mauntain color
|
||||
lda GradientNr
|
||||
bne GoGradient
|
||||
ldy #$ff ; one mauntain color
|
||||
GoGradient
|
||||
iny
|
||||
lda (GradientColors),y ; mountains colors array
|
||||
sta COLPF2
|
||||
inc dliCounter
|
||||
iny
|
||||
lda (GradientColors),y ; mountains colors array
|
||||
sta COLPF2
|
||||
inc dliCounter
|
||||
ply
|
||||
pla
|
||||
rti
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc DLIinterruptOptions
|
||||
pha
|
||||
phy
|
||||
lda #0 ; background color
|
||||
pha
|
||||
phy
|
||||
lda #0 ; background color
|
||||
sta COLPF1
|
||||
ldy GradientNr
|
||||
beq @+
|
||||
ldy #1
|
||||
@ lda (GradientColors),y ; mountains colors array
|
||||
sta COLPF2
|
||||
ply
|
||||
ldy GradientNr
|
||||
beq @+
|
||||
ldy #1
|
||||
@ lda (GradientColors),y ; mountains colors array
|
||||
sta COLPF2
|
||||
ply
|
||||
pla
|
||||
rti
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc DLIinterruptGameOver
|
||||
pha
|
||||
phy
|
||||
lda dliCounter
|
||||
bne EndofPMG
|
||||
lda #%00100001 ; playfield after P/M - prior=1
|
||||
;STA WSYNC
|
||||
pha
|
||||
phy
|
||||
lda dliCounter
|
||||
bne EndofPMG
|
||||
lda #%00100001 ; playfield after P/M - prior=1
|
||||
;STA WSYNC
|
||||
sta PRIOR
|
||||
bne EndOfDLI_GO
|
||||
bne EndOfDLI_GO
|
||||
EndofPMG
|
||||
cmp #1
|
||||
bne ColoredLines
|
||||
lda #%00100100 ; playfield before P/M
|
||||
;STA WSYNC
|
||||
cmp #1
|
||||
bne ColoredLines
|
||||
lda #%00100100 ; playfield before P/M
|
||||
;STA WSYNC
|
||||
sta PRIOR
|
||||
bne EndOfDLI_GO
|
||||
bne EndOfDLI_GO
|
||||
ColoredLines
|
||||
cmp #9
|
||||
beq CreditsScroll
|
||||
tay
|
||||
lda GameOverColoursTable-3,y ; -2 because this is DLI nr 2 and -1 (labels line)
|
||||
ldy #$0a ; text colour (brightnes)
|
||||
;STA WSYNC
|
||||
sta COLPF2
|
||||
sty COLPF1
|
||||
bne EndOfDLI_GO
|
||||
cmp #9
|
||||
beq CreditsScroll
|
||||
tay
|
||||
lda GameOverColoursTable-3,y ; -2 because this is DLI nr 2 and -1 (labels line)
|
||||
ldy #$0a ; text colour (brightnes)
|
||||
;STA WSYNC
|
||||
sta COLPF2
|
||||
sty COLPF1
|
||||
bne EndOfDLI_GO
|
||||
CreditsScroll
|
||||
lda #$00
|
||||
sta COLPF2
|
||||
lda #$00
|
||||
sta COLPF2
|
||||
EndOfDLI_GO
|
||||
inc dliCounter
|
||||
ply
|
||||
pla
|
||||
rti
|
||||
inc dliCounter
|
||||
ply
|
||||
pla
|
||||
rti
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc DLIinterruptText
|
||||
pha
|
||||
lda dliCounter
|
||||
bne MoreBarsColorChange
|
||||
lda dliCounter
|
||||
bne MoreBarsColorChange
|
||||
lda #TextBackgroundColor
|
||||
;sta WSYNC
|
||||
;sta WSYNC
|
||||
sta COLPF2
|
||||
mva #TextForegroundColor COLPF3
|
||||
bne EndOfDLI_Text
|
||||
bne EndOfDLI_Text
|
||||
MoreBarsColorChange
|
||||
and #%00000001
|
||||
rol
|
||||
sta COLPF2
|
||||
and #%00000001
|
||||
rol
|
||||
sta COLPF2
|
||||
EndOfDLI_Text
|
||||
inc dliCounter
|
||||
inc dliCounter
|
||||
pla
|
||||
DLIinterruptNone
|
||||
rti
|
||||
|
||||
rti
|
||||
|
||||
.endp
|
||||
;--------------------------------------------------
|
||||
.proc VBLinterrupt
|
||||
mva #0 dliCounter
|
||||
mva #$02 DliColorBack
|
||||
|
||||
lda PAL
|
||||
and #%00001110
|
||||
beq itsPAL
|
||||
;it is NTSC here
|
||||
mva #0 dliCounter
|
||||
mva #$02 DliColorBack
|
||||
|
||||
lda PAL
|
||||
and #%00001110
|
||||
beq itsPAL
|
||||
;it is NTSC here
|
||||
dec NTSCcounter
|
||||
bne itsPAL
|
||||
mva #6 NTSCcounter
|
||||
@@ -118,13 +118,13 @@ DLIinterruptNone
|
||||
itsPAL
|
||||
; pressTimer is trigger tick counter. always 50 ticks / s
|
||||
bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s
|
||||
|
||||
|
||||
SkippedIfNTSC
|
||||
|
||||
bit RMT_blocked
|
||||
bmi SkipRMTVBL
|
||||
bit RMT_blocked
|
||||
bmi SkipRMTVBL
|
||||
; ------- RMT -------
|
||||
lda sfx_effect
|
||||
lda sfx_effect
|
||||
bmi lab2
|
||||
asl @ ; * 2
|
||||
tay ;Y = 2,4,..,16 instrument number * 2 (0,2,4,..,126)
|
||||
@@ -138,80 +138,88 @@ SkippedIfNTSC
|
||||
lab2
|
||||
jsr RASTERMUSICTRACKER+3 ;1 play
|
||||
; ------- RMT -------
|
||||
SkipRMTVBL
|
||||
bit ScrollFlag
|
||||
bpl EndOfCreditsVBI
|
||||
SkipRMTVBL
|
||||
bit ScrollFlag
|
||||
bpl EndOfCreditsVBI
|
||||
CreditsVBI
|
||||
inc CreditsVScrol
|
||||
lda CreditsVScrol
|
||||
cmp #32 ;not too fast
|
||||
beq nextlinedisplay
|
||||
:2 lsr ;not too fast
|
||||
sta VSCROL
|
||||
jmp EndOfCreditsVBI
|
||||
inc CreditsVScrol
|
||||
lda CreditsVScrol
|
||||
cmp #32 ;not too fast
|
||||
beq nextlinedisplay
|
||||
:2 lsr ;not too fast
|
||||
sta VSCROL
|
||||
jmp EndOfCreditsVBI
|
||||
nextlinedisplay
|
||||
lda #0
|
||||
sta CreditsVScrol
|
||||
sta VSCROL
|
||||
clc
|
||||
lda DLCreditsAddr
|
||||
adc #40
|
||||
sta DLCreditsAddr
|
||||
bcc @+
|
||||
inc DLCreditsAddr+1
|
||||
lda #0
|
||||
sta CreditsVScrol
|
||||
sta VSCROL
|
||||
clc
|
||||
lda DLCreditsAddr
|
||||
adc #40
|
||||
sta DLCreditsAddr
|
||||
bcc @+
|
||||
inc DLCreditsAddr+1
|
||||
@
|
||||
cmp #<CreditsLastLine
|
||||
bne EndOfCreditsVBI
|
||||
lda DLCreditsAddr+1
|
||||
cmp #>CreditsLastLine
|
||||
bne EndOfCreditsVBI
|
||||
; adw DLCreditsAddr #40
|
||||
; cpw DLCreditsAddr #CreditsLastLine
|
||||
; bne EndOfCreditsVBI
|
||||
mwa #Credits DLCreditsAddr
|
||||
cmp #<CreditsLastLine
|
||||
bne EndOfCreditsVBI
|
||||
lda DLCreditsAddr+1
|
||||
cmp #>CreditsLastLine
|
||||
bne EndOfCreditsVBI
|
||||
; adw DLCreditsAddr #40
|
||||
; cpw DLCreditsAddr #CreditsLastLine
|
||||
; bne EndOfCreditsVBI
|
||||
mwa #Credits DLCreditsAddr
|
||||
EndOfCreditsVBI
|
||||
.IF TARGET = 5200
|
||||
lda SkStatSimulator
|
||||
bmi @+
|
||||
inc SkStatSimulator
|
||||
.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
|
||||
@
|
||||
lda JoystickNumber ; select port
|
||||
ora #%00000100 ; Speaker off, Pots enabled
|
||||
lda JoystickNumber ; select port
|
||||
ora #%00000100 ; Speaker off, Pots enabled
|
||||
sta CONSOL5200
|
||||
|
||||
center = 114 ;Read analog stick and make it look like a digital stick
|
||||
threshold = 60
|
||||
|
||||
lda JoystickNumber
|
||||
asl
|
||||
tax
|
||||
|
||||
lda JoystickNumber
|
||||
asl
|
||||
tax
|
||||
lda paddl0,x ;Read POT0 value (horizontal position)
|
||||
cmp #center+threshold ;Compare with right threshold
|
||||
rol stick0 ;Feed carry into digital stick value
|
||||
cmp #center-threshold ;Compare with left threshold
|
||||
rol stick0 ;Feed carry into digital stick value
|
||||
|
||||
|
||||
lda paddl1,x ;Read POT1 value (vertical position)
|
||||
cmp #center+threshold ;Compare with down threshold
|
||||
rol stick0 ;Feed carry into digital stick value
|
||||
cmp #center-threshold ;Compare with down threshold
|
||||
rol stick0 ;Feed carry into digital stick value
|
||||
|
||||
|
||||
lda stick0 ;0 indicates a press so the right/down values need to be inverted
|
||||
eor #2+8
|
||||
and #$0f
|
||||
sta stick0
|
||||
|
||||
ldx JoystickNumber
|
||||
; check shift key (5200 second fire button)
|
||||
lda SKSTAT
|
||||
:3 lsr ; third bit
|
||||
and trig0,x ; and first button
|
||||
;lda trig0,x
|
||||
sta strig0 ;Move hardware to shadow
|
||||
|
||||
|
||||
ldx JoystickNumber
|
||||
; check shift key (5200 second fire button)
|
||||
lda SKSTAT
|
||||
:3 lsr ; third bit
|
||||
and trig0,x ; and first button
|
||||
;lda trig0,x
|
||||
sta strig0 ;Move hardware to shadow
|
||||
|
||||
mva chbas chbase
|
||||
|
||||
|
||||
lda skstat ;Reset consol key shadow is no key is pressed anymore
|
||||
and #4
|
||||
beq @+
|
||||
@@ -224,44 +232,36 @@ EndOfCreditsVBI
|
||||
pla
|
||||
tax
|
||||
pla
|
||||
rti
|
||||
.ELSE
|
||||
; support for joysticks :)
|
||||
ldx JoystickNumber
|
||||
lda STICK0,x
|
||||
sta STICK0
|
||||
lda STRIG0,x
|
||||
sta STRIG0
|
||||
jmp XITVBV
|
||||
.ENDIF
|
||||
rti
|
||||
.ENDIF
|
||||
.endp
|
||||
.IF TARGET = 5200
|
||||
.proc kb_continue
|
||||
sta kbcode ;Store key code in shadow.
|
||||
mva #0 SkStatSimulator
|
||||
mva #0 SkStatSimulator
|
||||
exit pla
|
||||
tay
|
||||
pla
|
||||
tax
|
||||
pla
|
||||
rti
|
||||
.endp
|
||||
.endp
|
||||
.ENDIF
|
||||
|
||||
;--------------------------------------------------
|
||||
.macro SetDLI
|
||||
; SetDLI #WORD
|
||||
; Initialises Display List Interrupts
|
||||
; SetDLI #WORD
|
||||
; Initialises Display List Interrupts
|
||||
LDY # <:1
|
||||
LDX # >:1
|
||||
jsr _SetDLIproc
|
||||
jsr _SetDLIproc
|
||||
.endm
|
||||
.proc _SetDLIproc
|
||||
LDA #$C0
|
||||
STY VDSLST
|
||||
STX VDSLST+1
|
||||
STA NMIEN
|
||||
rts
|
||||
LDA #$C0
|
||||
STY VDSLST
|
||||
STX VDSLST+1
|
||||
STA NMIEN
|
||||
rts
|
||||
.endp
|
||||
|
||||
.ENDIF
|
||||
@@ -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,
|
||||
@@ -208,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.
|
||||
@@ -28,6 +35,8 @@ Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera zmien
|
||||
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
|
||||
|
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 |
@@ -27,33 +27,51 @@ You can contact us via [AtariAge](https://atariage.com) or [AtariOnLine](https:/
|
||||
|
||||
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 several 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).
|
||||
- `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
|
||||
|
||||
@@ -145,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
|
||||
@@ -158,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
|
||||
@@ -236,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
|
||||
@@ -246,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
|
||||
@@ -262,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
|
||||
@@ -277,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.
|
||||
|
||||
|
||||
@@ -294,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
|
||||
@@ -307,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
|
||||
@@ -336,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!
|
||||
|
||||
@@ -423,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
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
|
||||
icl '../lib/atari.hea'
|
||||
|
||||
|
||||
org $2000
|
||||
joytest
|
||||
joytest
|
||||
mva #0 dmactls
|
||||
|
||||
|
||||
@
|
||||
lda trig0
|
||||
beq pressed
|
||||
@@ -15,6 +15,5 @@ pressed
|
||||
;ora jstick0
|
||||
sta colbak
|
||||
jmp @-
|
||||
|
||||
run joytest
|
||||
|
||||
|
||||
run joytest
|
||||
|
||||
@@ -6,8 +6,8 @@ song_end
|
||||
|
||||
buffers
|
||||
.ds 256 * 9
|
||||
|
||||
POKEY2 = POKEY+$10 ; stereo
|
||||
|
||||
POKEY2 = POKEY+$10 ; stereo
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
; Song Initialization - this runs in the first tick:
|
||||
@@ -15,14 +15,14 @@ POKEY2 = POKEY+$10 ; stereo
|
||||
.proc init_song
|
||||
|
||||
; pokeys init
|
||||
lda #3 ; stereo
|
||||
sta POKEY+$0f ; stereo
|
||||
sta POKEY2+$0f ; stereo
|
||||
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:
|
||||
@@ -32,8 +32,8 @@ 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
|
||||
sta POKEY2,x ; stereo
|
||||
sta stereo_buff,x ; stereo
|
||||
sty chn_copy, x
|
||||
cbuf
|
||||
sta buffers + 255
|
||||
@@ -62,12 +62,12 @@ delay
|
||||
; 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
|
||||
|
||||
ldx #8 ; stereo
|
||||
@ lda stereo_buff,x ; stereo
|
||||
sta POKEY2,x ; stereo
|
||||
dex ;stereo
|
||||
bpl @- ; stereo
|
||||
|
||||
lda #>buffers
|
||||
sta bptr+1
|
||||
|
||||
@@ -110,7 +110,7 @@ do_copy_byte:
|
||||
store:
|
||||
ldy cur_pos
|
||||
sta POKEY,x ; Store to output and buffer
|
||||
sta stereo_buff,x ; stereo
|
||||
sta stereo_buff,x ; stereo
|
||||
sta (bptr), y
|
||||
|
||||
skip_chn:
|
||||
@@ -148,6 +148,5 @@ skip
|
||||
rts
|
||||
.endp
|
||||
|
||||
stereo_buff ; stereo
|
||||
.ds 9 ; stereo
|
||||
|
||||
stereo_buff ; stereo
|
||||
.ds 9 ; stereo
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
/* Mode: GED- (bitmap mode) */
|
||||
/***************************************/
|
||||
|
||||
icl "splash.h"
|
||||
|
||||
icl "splash.h"
|
||||
|
||||
; --- dmsc LZSS player routine on zero page
|
||||
org $80
|
||||
|
||||
@@ -17,265 +17,265 @@ chn_bits .ds 1
|
||||
bit_data .ds 1
|
||||
; ---
|
||||
|
||||
org $00
|
||||
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
|
||||
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
|
||||
zc .ds ZCOLORS
|
||||
|
||||
* --- BASIC switch OFF
|
||||
org $2000\ mva #$ff portb\ rts\ ini $2000
|
||||
* --- 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
|
||||
* --- 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
|
||||
.ifdef nil_used
|
||||
nil :8*40 brk
|
||||
eif
|
||||
|
||||
.ALIGN $0400
|
||||
ant ANTIC_PROGRAM scr,ant
|
||||
.ALIGN $0400
|
||||
ant ANTIC_PROGRAM scr,ant
|
||||
|
||||
fnt
|
||||
|
||||
ift USESPRITES
|
||||
.ALIGN $0800
|
||||
.ds $0300
|
||||
pmg SPRITES
|
||||
eif
|
||||
|
||||
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
|
||||
; 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
|
||||
* --- init PMG
|
||||
|
||||
ift USESPRITES
|
||||
mva >pmg pmbase ;missiles and players data address
|
||||
mva #$03 pmcntl ;enable players and missiles
|
||||
eif
|
||||
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
|
||||
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
|
||||
sei ;stop interrups
|
||||
mva #$00 nmien ;stop all interrupts
|
||||
mva #$fe portb ;switch off ROM to get 16k more ram
|
||||
|
||||
ZPINIT
|
||||
ZPINIT
|
||||
|
||||
////////////////////
|
||||
// RASTER PROGRAM //
|
||||
////////////////////
|
||||
|
||||
; jmp line239
|
||||
jmp raster_program_end
|
||||
; 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
|
||||
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
|
||||
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
|
||||
|
||||
:16 sta wsync
|
||||
|
||||
; wait 13 cycles !!!
|
||||
:4 nop
|
||||
inc byt2
|
||||
|
||||
;--- wait 18 cycles
|
||||
; jsr _rts
|
||||
; inc byt3
|
||||
; jsr _rts
|
||||
; inc byt3
|
||||
|
||||
|
||||
;--- set global offset (23 cycles)
|
||||
jsr _rts
|
||||
cmp byt3\ pha:pla
|
||||
jsr _rts
|
||||
cmp byt3\ pha:pla
|
||||
|
||||
;--- empty line
|
||||
jsr wait54cycle
|
||||
inc byt2
|
||||
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
|
||||
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
|
||||
// EXIT
|
||||
//--------------------
|
||||
|
||||
lda trig0 ; FIRE #0
|
||||
beq stop
|
||||
lda trig0 ; FIRE #0
|
||||
beq stop
|
||||
|
||||
lda trig1 ; FIRE #1
|
||||
beq stop
|
||||
lda trig1 ; FIRE #1
|
||||
beq stop
|
||||
|
||||
lda consol ; START
|
||||
and #1
|
||||
beq stop
|
||||
lda consol ; START
|
||||
and #1
|
||||
beq stop
|
||||
|
||||
lda skctl ; ANY KEY
|
||||
and #$04
|
||||
bne skp
|
||||
lda skctl ; ANY KEY
|
||||
and #$04
|
||||
bne skp
|
||||
|
||||
stop mva #$00 pmcntl ;PMG disabled
|
||||
tax
|
||||
sta:rne hposp0,x+
|
||||
stop mva #$00 pmcntl ;PMG disabled
|
||||
tax
|
||||
sta:rne hposp0,x+
|
||||
|
||||
; silent
|
||||
lda #0
|
||||
; silent
|
||||
lda #0
|
||||
ldx #8
|
||||
@ sta POKEY,x
|
||||
sta POKEY2,x ; stereo
|
||||
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
|
||||
mva #$ff portb ;ROM switch on
|
||||
mva #$40 nmien ;only NMI interrupts, DLI disabled
|
||||
cli ;IRQ enabled
|
||||
|
||||
rts ;return to ... DOS
|
||||
rts ;return to ... DOS
|
||||
skp
|
||||
|
||||
//--------------------
|
||||
jsr play_frame
|
||||
|
||||
jmp LOOP
|
||||
jmp LOOP
|
||||
|
||||
;---
|
||||
|
||||
wait54cycle
|
||||
:2 inc byt2
|
||||
:2 inc byt2
|
||||
wait44cycle
|
||||
inc byt3
|
||||
nop
|
||||
inc byt3
|
||||
nop
|
||||
wait36cycle
|
||||
inc byt3
|
||||
jsr _rts
|
||||
inc byt3
|
||||
jsr _rts
|
||||
wait18cycle
|
||||
inc byt3
|
||||
_rts rts
|
||||
inc byt3
|
||||
_rts rts
|
||||
|
||||
byt3 brk
|
||||
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)
|
||||
.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
|
||||
.MACRO ZPINIT
|
||||
.ENDM
|
||||
|
||||
ZCOLORS = 0
|
||||
ZCOLORS = 0
|
||||
|
||||
;---
|
||||
ini main
|
||||
ini main
|
||||
;---
|
||||
|
||||
opt l-
|
||||
opt l-
|
||||
|
||||
.MACRO SPRITES
|
||||
icl "output.png.pmg"
|
||||
.MACRO SPRITES
|
||||
icl "output.png.pmg"
|
||||
.ENDM
|
||||
|
||||
USESPRITES = 1
|
||||
|
||||
@@ -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,14 +32,18 @@ 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
|
||||
.by 6,56,106,156,206,0
|
||||
XtankOffsetGO_H
|
||||
.by 0,0,0,0,0,1
|
||||
.by 0,0,0,0,0,1
|
||||
;-----4x4 texts-----
|
||||
LineTop
|
||||
dta d"(%%%%%%%%%%%%)"
|
||||
@@ -55,7 +59,12 @@ LineGameOver
|
||||
seppukuText
|
||||
dta d"# SEPPUKU! #"
|
||||
areYouSureText
|
||||
dta d"# SURE? Y/N #"
|
||||
.IF TARGET = 800
|
||||
dta d"# SURE? Y/N #"
|
||||
.ELIF TARGET = 5200
|
||||
dta d"#END? Y-1/N-0#"
|
||||
.ENDIF
|
||||
|
||||
lineClear
|
||||
dta d" "
|
||||
|
||||
@@ -64,17 +73,17 @@ TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$ed
|
||||
TankStatusColoursTable .BYTE $74,$c4,$24,$e4,$54,$94 ; Adam's order
|
||||
;-----------
|
||||
GradientAddrL
|
||||
.by <dliColorsFore, <dliColorsFore, <dliColorsFore2
|
||||
.by <dliColorsFore, <dliColorsFore, <dliColorsFore2
|
||||
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
|
||||
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 >dliColorsFore, >dliColorsFore, >dliColorsFore2
|
||||
dliColorsFore2 ; colors for NTSC
|
||||
.by $0a ; one mountains color
|
||||
.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 $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
|
||||
@@ -222,113 +228,113 @@ 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,75 +343,75 @@ 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
|
||||
PurchaseMeTable ;weapons good to be purchased by the robot
|
||||
;the comment is an index in the tables
|
||||
; "Baby Missile ","Missile ","Baby Nuke ","Nuke "
|
||||
; "LeapFrog ","Funky Bomb ","MIRV ","Death's Head "
|
||||
.by %01111111
|
||||
; "Napalm ","Hot Napalm ","Tracer ","Smoke Tracer "
|
||||
; "Baby Roller ","Roller ","Heavy Roller ","Riot Charge "
|
||||
.by %11001110
|
||||
; "Riot Blast ","Riot Bomb ","Heavy Riot Bomb ","Baby Digger "
|
||||
; "Digger ","Heavy Digger ","Baby Sandhog ","Sandhog "
|
||||
.by %00000000
|
||||
; "Heavy Sandhog ","Dirt Clod ","Dirt Ball ","Ton of Dirt "
|
||||
; "Liquid Dirt ","Dirt Charge ","Buy me! ","Laser "
|
||||
.by %00000000
|
||||
; "White Flag ","Battery ","Hovercraft ","Parachute "
|
||||
; "Baby Missile ","Missile ","Baby Nuke ","Nuke "
|
||||
; "LeapFrog ","Funky Bomb ","MIRV ","Death's Head "
|
||||
.by %01111111
|
||||
; "Napalm ","Hot Napalm ","Tracer ","Smoke Tracer "
|
||||
; "Baby Roller ","Roller ","Heavy Roller ","Riot Charge "
|
||||
.by %11001110
|
||||
; "Riot Blast ","Riot Bomb ","Heavy Riot Bomb ","Baby Digger "
|
||||
; "Digger ","Heavy Digger ","Baby Sandhog ","Sandhog "
|
||||
.by %00000000
|
||||
; "Heavy Sandhog ","Dirt Clod ","Dirt Ball ","Ton of Dirt "
|
||||
; "Liquid Dirt ","Dirt Charge ","Buy me! ","Laser "
|
||||
.by %00000000
|
||||
; "White Flag ","Battery ","Hovercraft ","Parachute "
|
||||
; "Strong Parachute","Mag Deflector ","Shield ","Heavy Shield "
|
||||
.by %01011111
|
||||
; "Force Shield ","Bouncy Castle ","Long Barrel ","Nuclear Winter "
|
||||
; "Lazy Boy ","Lazy Darwin ","Auto Defense ","Spy Hard "
|
||||
.by %11000000
|
||||
; "Force Shield ","Bouncy Castle ","Long Barrel ","Nuclear Winter "
|
||||
; "Lazy Boy ","Lazy Darwin ","Auto Defense ","Spy Hard "
|
||||
.by %11000000
|
||||
|
||||
PurchaseMeTable2 ;weapons good to be purchased by the robot (Cyborg)
|
||||
;the comment is an index in the tables
|
||||
@@ -425,60 +431,60 @@ PurchaseMeTable2 ;weapons good to be purchased by the robot (Cyborg)
|
||||
; "Strong Parachute","Mag Deflector ","Shield ","Heavy Shield "
|
||||
.by %01001101
|
||||
; "Force Shield ","Bouncy Castle ","Long Barrel ","Nuclear Winter "
|
||||
; "Lazy Boy ","Lazy Darwin ","Auto Defense ","Spy Hard "
|
||||
; "Lazy Boy ","Lazy Darwin ","Auto Defense ","Spy Hard "
|
||||
.by %11000000
|
||||
|
||||
;-------------------------------------------------
|
||||
; 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
|
||||
@@ -515,83 +521,83 @@ NamesOfWeapons ;the comment is an index in the tables
|
||||
dta d"Best F...g Gifts" ; 30
|
||||
dta d"Laser " ; 31
|
||||
;------defensives
|
||||
dta d"White Flag " ; 32
|
||||
dta d"Battery " ; 33
|
||||
dta d"Hovercraft " ; 34
|
||||
dta d"Parachute " ; 35 - no energy
|
||||
dta d"Strong Parachute" ; 36 - with energy (earlier Battery)
|
||||
dta d"Mag Deflector " ; 37 - with shield and energy
|
||||
dta d"Shield " ; 38 - shield for one shot - no energy
|
||||
dta d"Heavy Shield " ; 39 - shield with energy
|
||||
dta d"White Flag " ; 32
|
||||
dta d"Battery " ; 33
|
||||
dta d"Hovercraft " ; 34
|
||||
dta d"Parachute " ; 35 - no energy
|
||||
dta d"Strong Parachute" ; 36 - with energy (earlier Battery)
|
||||
dta d"Mag Deflector " ; 37 - with shield and energy
|
||||
dta d"Shield " ; 38 - shield for one shot - no energy
|
||||
dta d"Heavy Shield " ; 39 - shield with energy
|
||||
dta d"Force Shield " ; 40 - shield with energy and parachute
|
||||
dta d"Bouncy Castle " ; 41 - with shield and energy
|
||||
dta d"Long Schlong " ; 42
|
||||
dta d"Bouncy Castle " ; 41 - with shield and energy
|
||||
dta d"Long Schlong " ; 42
|
||||
dta d"Nuclear Winter " ; 43
|
||||
dta d"Lazy Boy " ; 44
|
||||
dta d"Lazy Darwin " ; 45
|
||||
dta d"Auto Defense " ; 46
|
||||
dta d"Spy Hard " ; 47
|
||||
dta d"Lazy Boy " ; 44
|
||||
dta d"Lazy Darwin " ; 45
|
||||
dta d"Auto Defense " ; 46
|
||||
dta d"Spy Hard " ; 47
|
||||
|
||||
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!
|
||||
.by 00 ; Parachute
|
||||
.by 99 ; Strong Parachute
|
||||
.by 99 ; Mag Deflector
|
||||
.by 00 ; Shield
|
||||
.by 99 ; Heavy Shield
|
||||
.by 99 ; Force Shield
|
||||
.by 99 ; Bouncy Castle
|
||||
.by 00 ; Long Barrel
|
||||
.by 00 ; Nuclear Winter
|
||||
.by 00 ; Lazy Boy
|
||||
.by 00 ; Lazy Darwin
|
||||
.by 00 ; Auto Defense
|
||||
.by 00 ; Spy Hard
|
||||
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!
|
||||
.by 00 ; Parachute
|
||||
.by 99 ; Strong Parachute
|
||||
.by 99 ; Mag Deflector
|
||||
.by 00 ; Shield
|
||||
.by 99 ; Heavy Shield
|
||||
.by 99 ; Force Shield
|
||||
.by 99 ; Bouncy Castle
|
||||
.by 00 ; Long Barrel
|
||||
.by 00 ; Nuclear Winter
|
||||
.by 00 ; Lazy Boy
|
||||
.by 00 ; Lazy Darwin
|
||||
.by 00 ; Auto Defense
|
||||
.by 00 ; Spy Hard
|
||||
weaponsOfDeath ; weapons used in tank death animations
|
||||
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____
|
||||
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
|
||||
.by $ff ;01
|
||||
.by $ff ;02
|
||||
.by $ff ;03
|
||||
.by $ff ;04
|
||||
.by $ff ;05
|
||||
.by $ff ;06
|
||||
.by $ff ;00
|
||||
.by $ff ;01
|
||||
.by $ff ;02
|
||||
.by $ff ;03
|
||||
.by $ff ;04
|
||||
.by $ff ;05
|
||||
.by $ff ;06
|
||||
.by @kbcode._right ;07
|
||||
.by $ff ;08
|
||||
.by $ff ;09
|
||||
.by $ff ;0a
|
||||
.by @kbcode._left ;0b
|
||||
.by $ff ;0c
|
||||
.by @kbcode._down ;0d
|
||||
.by @kbcode._up ;0e
|
||||
.by $ff ;0f
|
||||
.by $ff ;08
|
||||
.by $ff ;09
|
||||
.by $ff ;0a
|
||||
.by @kbcode._left ;0b
|
||||
.by $ff ;0c
|
||||
.by @kbcode._down ;0d
|
||||
.by @kbcode._up ;0e
|
||||
.by $ff ;0f
|
||||
|
||||
;-----------------------------------
|
||||
keycodes ;tables for converting KeyCode to Screen Code (38 -1 characters)
|
||||
keycodes ;tables for converting KeyCode to Screen Code (38-1 characters)
|
||||
.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
|
||||
.by $2b,$17
|
||||
.by $32,$1f,$1e,$1a,$18,$1d,$1b
|
||||
.by $32,$1f,$1e,$1a,$18,$1d,$1b
|
||||
.by $33,$35,$30,$22,$21 ;,$0e <-- hyphen removed from the table, sorry hyphen lovers
|
||||
keycodesEnd
|
||||
scrcodes
|
||||
@@ -599,81 +605,81 @@ scrcodes
|
||||
dta d"ijklmnop"
|
||||
dta d"qrstuvwx"
|
||||
dta d"yz"
|
||||
;-------decimal constans + end of scrcodes
|
||||
zero
|
||||
digits ; decimal constans
|
||||
dta d"0123456"
|
||||
digits
|
||||
dta d"0123456"
|
||||
dta d"789. " ; "-"
|
||||
;-------decimal constans
|
||||
;zero
|
||||
;digits dta d"0123456789"
|
||||
|
||||
;-----------------------------------
|
||||
gameOverSpritesTop
|
||||
; end of the Gover sprites by number of players
|
||||
; 1 2 3 4 5 6
|
||||
; 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
|
||||
CreditsStart
|
||||
dta d" "*
|
||||
dta d"You were playin",d"g"*
|
||||
dta d"Scorc",d"h"*
|
||||
dta d"Warsaw, Miam",d"i"*
|
||||
dta d"2000-202",d"3"*
|
||||
dta d" "*
|
||||
dta d"Programmin",d"g"*
|
||||
dta d"Tomasz 'Pecus' Peck",d"o"*
|
||||
dta d"Pawel 'pirx' Kalinowsk",d"i"*
|
||||
dta d" "*
|
||||
dta d"SFX, Music and Suppor",d"t"*
|
||||
dta d"Michal 'Miker' Szpilowsk",d"i"*
|
||||
dta d" "*
|
||||
.IF target != 5200
|
||||
dta d"Additional Musi",d"c"*
|
||||
dta d"Mario 'Emkay' Kri",d"x"*
|
||||
dta d" "*
|
||||
.ENDIF
|
||||
dta d"Code Optimizatio",d"n"*
|
||||
dta d"Piotr '0xF' Fusi",d"k"*
|
||||
dta d" "*
|
||||
dta d"Ar",d"t"*
|
||||
dta d"Adam Wachowsk",d"i"*
|
||||
.IF target != 5200
|
||||
dta d"Roman 'xorcerer' Fierfa",d"s"*
|
||||
.ENDIF
|
||||
dta d" "*
|
||||
dta d"Ideas, help and Q",d"A"*
|
||||
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
|
||||
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"*
|
||||
dta d" "*
|
||||
dta d"Special thank",d"s"*
|
||||
dta d"Krzysztof 'Kaz' Ziembi",d"k"*
|
||||
.IF target != 5200
|
||||
dta d" "*
|
||||
dta d"Stay tuned for the FujiNet version",d"!"*
|
||||
.ENDIF
|
||||
dta d" "*
|
||||
dta d" "*
|
||||
dta d"You were playin",d"g"*
|
||||
dta d"Scorc",d"h"*
|
||||
dta d"Warsaw, Miam",d"i"*
|
||||
dta d"2000-202",d"3"*
|
||||
dta d" "*
|
||||
dta d"Programmin",d"g"*
|
||||
dta d"Tomasz 'Pecus' Peck",d"o"*
|
||||
dta d"Pawel 'pirx' Kalinowsk",d"i"*
|
||||
dta d" "*
|
||||
dta d"SFX, Music and Suppor",d"t"*
|
||||
dta d"Michal 'Miker' Szpilowsk",d"i"*
|
||||
dta d" "*
|
||||
.IF TARGET = 800
|
||||
dta d"Additional Musi",d"c"*
|
||||
dta d"Mario 'Emkay' Kri",d"x"*
|
||||
dta d" "*
|
||||
.ENDIF
|
||||
dta d"Code Optimizatio",d"n"*
|
||||
dta d"Piotr '0xF' Fusi",d"k"*
|
||||
dta d" "*
|
||||
dta d"Ar",d"t"*
|
||||
dta d"Adam Wachowsk",d"i"*
|
||||
.IF TARGET = 800
|
||||
dta d"Roman 'xorcerer' Fierfa",d"s"*
|
||||
.ENDIF
|
||||
dta d" "*
|
||||
dta d"Ideas, help and Q",d"A"*
|
||||
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 = 800
|
||||
dta d" "*
|
||||
.ELIF TARGET = 5200
|
||||
dta d","*
|
||||
dta d"x-usr(1536), Aking, JAC!, phaeron",d","*
|
||||
dta d"RB520",d"0"*
|
||||
.ENDIF
|
||||
dta d" "*
|
||||
dta d"Additional testin",d"g"*
|
||||
dta d"Arek and Alex Peck",d"o"*
|
||||
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=34 + 7; add 7 for scrollout
|
||||
.ELSE
|
||||
.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
|
||||
|
||||
@@ -7,14 +7,14 @@ TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3
|
||||
dliColorsBack
|
||||
:10 .by $02,$00
|
||||
dliColorsFore
|
||||
.by $0a ; one mountains color
|
||||
; .by $0e,$0c,$0c,$0b,$0b,$0a,$0a,$09,$09,$08 ; mountains colors array
|
||||
; .by $08,$08,$07,$07,$07,$06,$06,$06,$06,$05
|
||||
.by $0e,$0c,$0c,$0c,$0c,$0a,$0a,$0a,$0a,$08 ; mountains colors array new
|
||||
.by $08,$08,$08,$06,$06,$06,$06,$06,$06,$04
|
||||
.by $0a ; one mountains color
|
||||
; .by $0e,$0c,$0c,$0b,$0b,$0a,$0a,$09,$09,$08 ; mountains colors array
|
||||
; .by $08,$08,$07,$07,$07,$06,$06,$06,$06,$05
|
||||
.by $0e,$0c,$0c,$0c,$0c,$0a,$0a,$0a,$0a,$08 ; mountains colors array new
|
||||
.by $08,$08,$08,$06,$06,$06,$06,$06,$06,$04
|
||||
CashOptionL ;(one zero less than on the screen)
|
||||
.by 0,<200,<800,<1200,<2000
|
||||
CashOptionH
|
||||
CashOptionH
|
||||
.by 0,>200,>800,>1200,>2000
|
||||
GravityTable .by 10,20,25,30,40
|
||||
MaxWindTable .by 5,20,40,70,99
|
||||
@@ -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
|
||||
|
||||
@@ -4,7 +4,7 @@ screenheight = 200
|
||||
screenBytes = 40
|
||||
screenwidth = screenBytes*8 ; Max screenwidth = 512!!!
|
||||
|
||||
TankWidth = 8
|
||||
TankWidth = 8
|
||||
;----------------------------------------------
|
||||
; Player/missile memory
|
||||
PMGraph = $1800 ; real PM start = PMGraph + $0300
|
||||
@@ -19,7 +19,7 @@ PMOffsetX = $2C ; P/M to graphics offset
|
||||
PMOffsetY = $2A ; P/M to graphics offset
|
||||
napalmRadius = 10
|
||||
StandardBarrel = 6 ; standard tank barrel length
|
||||
LongBarrel = 20 ; long barrel length
|
||||
LongBarrel = 20 ; long barrel length
|
||||
|
||||
TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor
|
||||
TextForegroundColor = $0A
|
||||
@@ -28,123 +28,123 @@ 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_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_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_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_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_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_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)
|
||||
@@ -180,9 +180,9 @@ sfx_liquid_dirt = $1b ;2
|
||||
sfx_battery = $1c ;3
|
||||
sfx_white_flag = $1d ;4
|
||||
sfx_long_barrel = $1e
|
||||
sfx_tank_move = $1f
|
||||
sfx_tank_move = $1f
|
||||
sfx_auto_defense= $2b
|
||||
sfx_lazy_boys = $2c
|
||||
sfx_lazy_boys = $2c
|
||||
;--------------------------------
|
||||
; RMT songs (lines)
|
||||
;--------------------------------
|
||||
|
||||
@@ -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!)
|
||||
@@ -1,4 +1,4 @@
|
||||
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
|
||||
; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
|
||||
|
||||
.IF *>0 ;this is a trick that prevents compiling this file alone
|
||||
;=====================================================
|
||||
@@ -18,12 +18,12 @@ noMusic .ds 1 ;.by 0 ; 0 - play music, $ff - do not play music
|
||||
noSfx .ds 1 ;.by 0 ; 0 - play SFX, $ff - do not play SFX
|
||||
;----------------------------------------------------
|
||||
; Color table for Game Over Screen (created in a gameover routine)
|
||||
.ds 1 ;.by $00 ; labels line color
|
||||
.ds 1 ;.by $00 ; labels line color
|
||||
GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4
|
||||
;----------------------------------------------------
|
||||
TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24
|
||||
;:6 dta d" "
|
||||
.ds 6*8
|
||||
.ds MaxPlayers*8
|
||||
;----------------------------------------------------
|
||||
skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30)
|
||||
.DS MaxPlayers
|
||||
@@ -55,9 +55,9 @@ StatusBufferCopy
|
||||
variablesStart ; zeroing starts here
|
||||
;=====================================================
|
||||
;isInventory .ds 1 ; 0 - purchase, $ff - inventory
|
||||
;--------------
|
||||
;--------------
|
||||
drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V)
|
||||
;--------------
|
||||
;--------------
|
||||
noDeathCounter .ds 1
|
||||
;--------------
|
||||
OptionsY .ds 1 ;vertical position of cursor on Options screen
|
||||
@@ -102,7 +102,7 @@ ResultsTable ;the results in the gameeeeee
|
||||
.DS MaxPlayers
|
||||
TempResults
|
||||
.DS MaxPlayers
|
||||
;DirectHitsH ; one byte enough
|
||||
;DirectHitsH ; one byte enough
|
||||
; .DS MaxPlayers
|
||||
DirectHits
|
||||
.DS MaxPlayers
|
||||
@@ -125,9 +125,9 @@ BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round st
|
||||
.DS MaxPlayers
|
||||
ActiveWeapon ;number of the selected weapon
|
||||
.DS MaxPlayers
|
||||
ActiveDefenceWeapon ;number of the activated defence weapon - 0
|
||||
ActiveDefenceWeapon ;number of the activated defence weapon - 0
|
||||
.DS MaxPlayers
|
||||
AutoDefenseFlag ; 0 - not activated, >$7f - activated
|
||||
AutoDefenseFlag ; 0 - not activated, >$7f - activated
|
||||
.DS MaxPlayers
|
||||
WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile
|
||||
;----------------------------------------------------
|
||||
@@ -149,7 +149,7 @@ WindOrientation .DS 1 ;(0-right,1-left)
|
||||
;----------------------------------------------------
|
||||
;Counter .DS 1 ;temporary Counter for outside loops
|
||||
;HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank
|
||||
WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy
|
||||
WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy
|
||||
;----------------------------------------------------
|
||||
xtankstableL ;X positions of tanks (lower left point)
|
||||
.DS MaxPlayers
|
||||
@@ -159,15 +159,15 @@ ytankstable ;Y positions of tanks (lower left point)
|
||||
.DS MaxPlayers
|
||||
LowResDistances ; coarse tank positions divided by 4 (to be in just one byte)
|
||||
.DS MaxPlayers
|
||||
JoyNumber ; Joystick port number (from 0 to 3)
|
||||
.DS MaxPlayers
|
||||
TankShape ; Tank shape number (from 0 to 2)
|
||||
.DS MaxPlayers
|
||||
JoyNumber ; Joystick port number (from 0 to 3)
|
||||
.DS MaxPlayers
|
||||
TankShape ; Tank shape number (from 0 to 2)
|
||||
.DS MaxPlayers
|
||||
;----------------------------------------------------
|
||||
TargetTankNr ; Target tank index (for AI routines)
|
||||
.DS 1
|
||||
SecondTryFlag ; For precise AI aiming
|
||||
.DS 1
|
||||
TargetTankNr ; Target tank index (for AI routines)
|
||||
.DS 1
|
||||
SecondTryFlag ; For precise AI aiming
|
||||
.DS 1
|
||||
;----------------------------------------------------
|
||||
;Erase .DS 1 ; if 1 only mask of the character is printed
|
||||
; on the graphics screen. if 0 character is printed normally
|
||||
@@ -218,8 +218,8 @@ FallingSoundBit .DS 1
|
||||
PreviousFall .DS 1
|
||||
EndOfTheFallFlag .DS 1 ; in case of the infinite fall
|
||||
;Parachute .DS 1 ; are you insured with parachute?
|
||||
;FloatingAlt .DS 1 ; floating tank altitude
|
||||
FunkyWallFlag = FloatingAlt ; reuse this variable in different weapon (Funky Bomb)!
|
||||
;FloatingAlt .DS 1 ; floating tank altitude
|
||||
FunkyWallFlag = FloatingAlt ; reuse this variable in different weapon (Funky Bomb)!
|
||||
PreferHumansFlag = FloatingAlt ; second reuse in AI Aim proc
|
||||
;----------------------------------------------------
|
||||
;Flight
|
||||
@@ -235,7 +235,7 @@ MirvDown .DS [5] ; is given missile down?
|
||||
MirvMissileCounter .DS 1 ; missile Counter (mainly for X)
|
||||
SmokeTracerFlag .DS 1 ; if Smoketracer
|
||||
LaserFlag .DS 1 ; $ff if Laser
|
||||
XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen)
|
||||
XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen)
|
||||
YposFlag .DS 1 ; bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen)
|
||||
;----------------------------------------------------
|
||||
;CheckCollisionWithTank
|
||||
@@ -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
|
||||
@@ -301,7 +301,7 @@ HowManyOnTheListDef
|
||||
.DS 1
|
||||
;PositionOnTheList ; pointer position on the list being displayed
|
||||
; .DS 1
|
||||
LastWeapon
|
||||
LastWeapon
|
||||
; number of the last previously purchased weapon
|
||||
; it is necessary when after purchase some weapon
|
||||
; is removed from the list (because too expensive)
|
||||
@@ -341,19 +341,10 @@ LaserCoordinate .DS 8 ; 2,2,2,2
|
||||
; Let 0 be "baby missile"
|
||||
; from $30 the defensive weapons begin
|
||||
TanksWeapons
|
||||
TanksWeapon1
|
||||
.REPT MaxPlayers, #+1
|
||||
TanksWeapon:1
|
||||
.DS number_of_weapons
|
||||
TanksWeapon2
|
||||
.DS number_of_weapons
|
||||
TanksWeapon3
|
||||
.DS number_of_weapons
|
||||
TanksWeapon4
|
||||
.DS number_of_weapons
|
||||
TanksWeapon5
|
||||
.DS number_of_weapons
|
||||
TanksWeapon6
|
||||
.DS number_of_weapons
|
||||
|
||||
.ENDR
|
||||
mountaintable ;table of mountains (size=screenwidth)
|
||||
.DS [screenwidth]
|
||||
.DS 1 ; additional byte for fallout (sometimes 1 pixel)
|
||||
@@ -370,9 +361,9 @@ TankTempY
|
||||
;-------------- single round variables --------------
|
||||
;----------------------------------------------------
|
||||
singleRoundVars
|
||||
;--------------
|
||||
;--------------
|
||||
;escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed
|
||||
;--------------
|
||||
;--------------
|
||||
CurrentResult
|
||||
.DS 1
|
||||
;--------------
|
||||
|
||||