mirror of
https://github.com/pkali/scorch_src.git
synced 2026-05-20 22:34:21 +02:00
352 lines
10 KiB
NASM
352 lines
10 KiB
NASM
icl 'Atari/lib/ATARISYS.ASM'
|
|
icl 'Atari/lib/MACRO.ASM'
|
|
|
|
screenheight = 200
|
|
screenbytes = 40
|
|
screenwidth = screenBytes*8 ; Max screenwidth = 512!!!
|
|
FirstZpageVariable = $50
|
|
.zpvar DliColorBack .byte = FirstZpageVariable
|
|
.zpvar ClearSky .byte ; $ff - Crear sky during drawmountains, 0 - no clear sky
|
|
.zpvar PaddleState .byte ; old state 2nd button for 2 buttons joysticks
|
|
.zpvar GradientNr .byte
|
|
.zpvar GradientColors .word
|
|
.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 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 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 FirstKeypressDelay .byte
|
|
.zpvar IsEndOfTheFallFlag .byte ;for small speedup ground falling
|
|
.zpvar TankSequencePointer .byte
|
|
.zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag
|
|
; (0 - round only, >0 - each turn)
|
|
.zpvar RandomMountains .byte ; mountains type change after each turn flag
|
|
; (0 - round only, >0 - each turn)
|
|
.zpvar FastSoilDown .byte ; 0 - standard, >0 - fast
|
|
.zpvar BlackHole .byte ; 0 - no, >0 - yes
|
|
.zpvar XHit .word
|
|
.zpvar delta .word
|
|
.zpvar HowMuchToFall .byte
|
|
.zpvar magic .word ; worst var name in the whole business
|
|
.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 DrawDirFactor .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
|
|
|
|
;-----------------------------------------------
|
|
; variable declarations in RAM (no code)
|
|
;-----------------------------------------------
|
|
ORG $2000
|
|
; These tebles are at the beginning of memory pages becouse ....
|
|
bittable1_long
|
|
.ds $100
|
|
bittable2_long
|
|
.ds $100
|
|
linetableL
|
|
.ds (screenHeight)
|
|
linetableH
|
|
.ds (screenHeight)
|
|
oldora .DS [5]
|
|
OldOraTemp .DS 1
|
|
oldplotH .DS [5]
|
|
oldplotL .DS [5]
|
|
oldply .DS [5]
|
|
WhichUnPlot .DS 1
|
|
|
|
;--------------------------------------------------
|
|
.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 #screenwidth
|
|
iny
|
|
cpy #0 ;#screenheight+1
|
|
bne @-
|
|
; and bittables for fastest plot and point (thanks @jhusak)
|
|
ldy #0
|
|
lda #$40
|
|
@ asl
|
|
adc #0
|
|
sta bittable1_long,y
|
|
tax
|
|
eor #%11111111
|
|
sta bittable2_long,y
|
|
txa
|
|
dey
|
|
bne @-
|
|
endof
|
|
rts
|
|
.endp
|
|
|
|
|
|
; -----------------------------------------
|
|
.proc unPlot
|
|
; plots a point and saves the plotted byte, reverts the previous plot.
|
|
; -----------------------------------------
|
|
ldx #0 ; only one pixel
|
|
unPlotAfterX
|
|
stx WhichUnPlot
|
|
|
|
; first remake the oldie
|
|
lda oldplotL,x
|
|
sta oldplot
|
|
lda oldplotH,x
|
|
sta oldplot+1
|
|
|
|
ldy oldply,x
|
|
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
|
|
ldx xdraw ; optimization (256 bytes long bittable)
|
|
|
|
lda color
|
|
bne ClearUnPlot
|
|
|
|
;plotting here
|
|
lda (xbyte),y
|
|
sta OldOraTemp
|
|
ora bittable1_long,x
|
|
sta (xbyte),y
|
|
bne ContinueUnPlot ; allways <>0
|
|
ClearUnPlot
|
|
lda (xbyte),y
|
|
sta OldOraTemp
|
|
and bittable2_long,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
|
|
; xdraw (word) - X coordinate
|
|
; ydraw (word) - Y coordinate
|
|
; 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
|
|
ldx xdraw ; optimization (256 bytes long bittable)
|
|
|
|
lda color
|
|
bne ClearPlot
|
|
|
|
lda (xbyte),y
|
|
ora bittable1_long,x
|
|
sta (xbyte),y
|
|
EndOfPlot
|
|
rts
|
|
ClearPlot
|
|
lda (xbyte),y
|
|
and bittable2_long,x
|
|
sta (xbyte),y
|
|
rts
|
|
.endp
|
|
|
|
icl 'circle1.asm'
|
|
;icl 'circle2.asm'
|
|
|
|
start
|
|
;jsr generatelinetable
|
|
halt
|
|
|
|
|
|
run start
|
|
.align $1000
|
|
.ds 10
|
|
display |