PSA 2020 version

Version for PSA 2020 virtual compo.
This commit is contained in:
Pawel Kalinowski
2020-05-13 01:59:43 -04:00
parent 041d0259ab
commit 9b42d4622f
15 changed files with 2141 additions and 0 deletions
+32
View File
@@ -0,0 +1,32 @@
; MODE 9++
org $2000
mwa #dli $200
mva #$22 $22f
mwa #dl $230
mva #$40 $26f
mva #$c0 $d40e
jmp *
dli pha
sta $d40a
lda #13
sta $d405
lda #3
sta $d405
pla
rti
dl dta $90,$6f,a($f000) ; 2 puste linie, 1 linia trybu
:29 dta a($2f8f) ; $8f,$2f powtorzone 29 razy => 58 linii
dta $41,a(dl)
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+1048
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.
+964
View File
@@ -0,0 +1,964 @@
;Acid Breakout - a break from the daily acid
;build 006, 2010-05-12
;CLEAR!
;あめでと
;---------------------------------------------------
icl '../lib/atari.hea'
icl '../lib/system.hea'
display=$a000
screenWidth = 256 ;in pixels
maxLines = 210 ; number of lines on the screen
spawnProbability = (256*1/5)
margin = 8 ; top and bottom screen safety margin
racquetPosMin = $8 ; min position of the paddle moved by the user
racquetPosMax = $e8 ; max position of the paddle moved by the user
racquetSize = 4*8
maxSpeed = 4; maximum speed of a ball. must be power of 2 ('and #' used)
maxBalls = 64 ; maximum number of moving balls, <$80 (bpl used!)
maxMemory = 8 ; number of saved pixel positions
;Beware! For easier calc somewhere it uses "modulo maxMemory"
;calculations and therefore this value must be a power of 2!
maxBrickLines = 80 ; maximum number of lines of bricks to be eradicated
.zpvar xpos ypos .word = $80 ; position of the ball
.zpvar deXpos deYpos .byte ;position for deletion
.zpvar dX dY .word ;main loop shortcuts to the table values
;.zpvar dx dy .word ;delta
;xpos, dx - "static point precision" - [dx+1].[dx] (big endian!)
;this static point precision is emulated with .word calcs, just a result is the high byte
.zpvar currBall collisionCheck racquetPos MyClok eXistenZstackPtr .byte
.zpvar xMemAddr yMemAddr .word ; address where to store memories of the current ball
.zpvar temp .word
.zpvar clearCount clearBallNr .byte
org $2000
;---------------------------------------------------
dl
.by $70,$30
;.by $42
;.wo statusBar
;.wo eXistenZstack+1
;.by $02
;.by 0
.by $4f ; 1 line
.wo display
:127 .by $0f ;128 lines here
.by $4f
.wo display+$1000
.by $0f ; 130 lines here
:maxlines-130 .byte $0f ; maxLines lines total
.by $4f+$10 ;Hscroll
DLracquetAddr0
.wo racquetDispEven
.by $4f+$10 ;Hscroll
DLracquetAddr1
.wo racquetDispEven
.by $4f+$10 ;Hscroll
DLracquetAddr2
.wo racquetDispEven
.by $4f+$10 ;Hscroll
DLracquetAddr3
.wo racquetDispEven
.by $41
.wo dl
;---------------------------------------------------
racquetDispEven
:34 .byte $0
.byte $ff, $ff, $ff, $ff
:28 .byte $0
main
jsr initialize
loop
mva #maxBalls-1 currBall
flight
ldx currBall
lda BalleXistenZ,x
jeq ballDoesNotexist
lda xposTableL,x
sta xpos
lda xposTableH,x
sta xpos+1
lda yposTableL,x
sta ypos
lda yposTableH,x
sta ypos+1
lda dxTableL,x
sta dX
lda dxTableH,x
sta dX+1
lda dyTableL,x
sta dY
lda dYTableH,x
sta dY+1
; now, delete the oldest pixel
;
lda memCycleTable,x
clc
adc #1 ;next position in the table
and #maxMemory-1 ; this is the tricky part (mod #maxMemory)
; due to this AND maxMemory MUST be power of 2!!!
sta memCycleTable,x ; memCycleTable saved
tax
lda xposMemTableAdrL,x
sta xMemAddr
lda xposMemTableAdrH,x
sta xMemAddr+1
lda yposMemTableAdrL,x
sta yMemAddr
lda yposMemTableAdrH,x
sta yMemAddr+1
;now on zero page I've got the addressess to store the old xPos and yPos
ldy currBall
lda (yMemAddr),y
tax
lda (xMemAddr),y
sta dexpos
; and erase the last point in the "snake"
;jsr deplot
;--------------------------------------------------
;deplot
; moved here for the speeeeeed
; deyxpos, deypos (.byte) - pixel position
;--------------------------------------------------
; let's calculate coordinates from xpos and ypos
;lda dexpos
lsr
lsr
lsr
tay
;---
;ldx deypos
lda lineAdrL,x
sta temp
lda lineAdrH,x
sta temp+1
lda dexpos
and #$07
tax
lda (temp),y
and debittable,x
sta (temp),y
;move the ball!!!
adw xpos dX xpos
adw ypos dY ypos
;top bounce
; if ypos<margin then bounce
lda ypos+1
cmp #margin
bcs noTop
; assuming that here a plot can get only from below, so it is enough to switch dy sign
; sbw #$ffff dy dy ;this does not compile :(
negw dY
mva #margin+1 ypos+1
noTop
;bottom bounce
; if ypos>maxLines+margin then bounce
lda ypos+1
cmp #maxLines+margin
bcc noBottom
; check if the ball hits the racquette
;jmp noBallOut ; turns off the ball kill
lda ypos+1
cmp #maxLines+margin+maxSpeed*2 ; that makes the ball below the racquet
bcs flyDown2 ;kinda lame optimisation as A carries ypos+1
lda racquetPos
sec
sbc #racquetPosMin
cmp xpos+1
jcs flyDown
clc
adc #racquetSize-1
cmp xpos+1
jcs bottomBounce
flyDown
lda ypos+1
flyDown2
cmp #255-margin ;maximum depth
bcc noBottom
ballOut
lda currBall
eXistenZdEstroy
;destroys ball number A
;pushes one free slot to the eXistenZstack
;ends with !number of balls in X (maxBalls == end of the game)
;txa
ldy eXistenZstackPtr
iny
sta eXistenZstack,y
sty eXistenZstackPtr
;ldx currBall
tax
lda #0
sta balleXistenZ,x
jmp flightLoopEnd
bottomBounce
; assuming that here a plot can get only from below,
; so it is enough to switch dy sign
; sbw #$ffff dy dy ;this does not compile :(
negw dY
mva #maxLines+margin-2 ypos+1
noBottom
;left bounce
lda xpos+1
cmp #0+maxSpeed+1
bcs noLeft
negw dX
mva #0+maxSpeed+3 xpos+1
noLeft
;right border bounce
lda xpos+1
.if $100-maxSpeed > $ff
.error "maxSpeed too low!!!"
.endif
cmp #$100-maxSpeed-1
bcc noRight
negw dX
mva #$ff-maxSpeed-3 xpos+1
noRight
;jsr plot
; the full plot copied here to get few cycles and collision
; high byte is the integer position
; low byte is the "fractional" part
; let's calculate coordinates from xpos and ypos
lda xpos+1
lsr
lsr
lsr
tay
;---
ldx ypos+1
lda lineAdrL,x
sta temp
lda lineAdrH,x
sta temp+1
lda xpos+1
and #$07
tax
lda (temp),y
sta collisionCheck
ora bittable,x ;eor
sta (temp),y
cmp collisionCheck
; when final byte and the original bytes are equal, it means it is a collision (plot in the place of a dot)
jne noCollision
lda ypos+1
cmp #maxLines+margin-2-1
jcs noCollision ;ball is outside the screen!
;switch direction, Charles
; an idea for assuming which direction to switch - dX or dY?
; on a diagram below in the middle there is an approached brick
/*
\ /
\-dY /
\ /
-dX [] -dX
/ \
/-dY \
/ \
*/
; it means:
; if |dX|>|dY| then dX == -dX
; else dY == -dY
; get absolute values
lda dX+1
bpl dXpositive
;dX is negative here
lda dY+1
bpl dXneg_dYpos
;dX and dY are negative here
cmp dX+1
bcc dX_gr_dY__dX_dYneg
; |dY| >= |dX| ; hour 5
negw dY
jmp bounceDone
dX_gr_dY__dX_dYneg
; hour 4
negw dX
jmp bounceDone
dXneg_dYpos
; dY in A
clc
adc dX+1
bpl dY_gr_dX__dXneg_dYpos
; |dX| > |dy|; hour 2
negw dX
jmp bounceDone
dY_gr_dX__dXneg_dYpos
; hour 1
negw dY
jmp bounceDone
dXpositive
lda dY+1
bpl dX_dYpositive
;dX positive, dY negative
clc
adc dX+1
bpl dX_gr_dY__dXpos_dYneg
; hour 7
negw dY
jmp bounceDone
dX_gr_dY__dXpos_dYneg
; hour 8
negw dX
jmp bounceDone
dX_dYpositive
;(dY+1)* is in A
cmp dX+1
bcc dX_gr_dY__dX_dYpos
; dY > dX ; hour 11
negw dY
jmp bounceDone
dX_gr_dY__dX_dYpos
; dY < dX ; hour 10
negw dX
bounceDone
;spawn the new bally
; if there is still an empty slot for a new ball somewhere...
lda RANDOM
cmp #spawnProbability
bcs noCollision
eXistenZcReate
;creates a new ball
;removes one free slot from the eXistenZstack
;ends with ball number in X
;ends with zero when there is no free slot for a ball
ldy eXistenZstackPtr
beq noMoreSlots
lda eXistenZstack,Y
dey
sty eXistenZstackPtr
tax
;OK, in X there is an empty slot for a ball
;spawn it
lda #1
sta balleXistenZ,x
lda xPos
sta xPosTableL,x
lda xPos+1
sta xPosTableH,x
lda yPos
sta yPosTableL,x
lda yPos+1
sta yPosTableH,x
; random initial speed and direction
lda random
bpl dXplus
;A carries a random number
and #maxSpeed-1 ;a variable speed limiter
clc
adc #$FF-(maxSpeed-1)
sta dxTableH,x
bne dXlower
dXplus
clc
;A carries a random number
and #maxSpeed-1 ;a variable speed limiter
adc #1
sta dxTableH,x
dXlower
lda random
sta dxTableL,x
randomize 1 maxSpeed-1 ;dy can not be too small or the game would take forever
sta dyTableH,x
lda random
sta dyTableL,x
; sound
;lda random
;and #%00001000
lda #%00000000
sta consol
noCollision
noMoreSlots
flightLoopEnd
;end of the cycle for one ball
;save the changes now
ldx currBall
; let's save the position for the future erase
; old position of ball(currBall) is saved here
; in table nr memCycleTable(currBall)
ldy currBall
lda xpos+1 ;high byte is the integer position
sta (xMemAddr),y
lda ypos+1
sta (yMemAddr),y
; saved
lda xpos
sta xposTableL,x
lda xpos+1
sta xposTableH,x
lda ypos
sta yposTableL,x
lda ypos+1
sta yposTableH,x
lda dX
sta dxTableL,x
lda dX+1
sta dxTableH,x
lda dY
sta dyTableL,x
lda dY+1
sta dYTableH,x
endOfBallzLoop
dec currBall
jpl flight
;deaD Ball erasing
; if clearPtr (pointer for lazy crearing)
; is lower than eXistenZstackPtr
; then erase 1 memory ball and increase the pointer
; the pointer gets lowered with eXistenZstackPtr
/*
ldx clearPtr
dex
cpx eXistenZstackPtr
bcS clearPrt_GREQ_eXistenZstackPtr
lda eXistenZstack,x
sta clearBallNr
jsr clearDeadBall
inc clearPtr
clearPrt_GREQ_eXistenZstackPtr
*/
lda eXistenZstackPtr
cmp #maxBalls
bne gameIsNotOver
;game over
zzz
inc colbak
jmp zzz
gameIsNotOver
jmp loop
;-------------------
ballDoesNotexist
;a delay loop for a ball that does not really exist (yet)
ldx #75
delayLoop
dex
bne delayLoop
jmp endOfBallzLoop
;--------------------------------------------------
plot
; xpos, ypos (.byte) - pixel position
;--------------------------------------------------
; let's calculate coordinates from xpos and ypos
lda xpos
lsr
lsr
lsr
tay
;---
ldx ypos
lda lineAdrL,x
sta temp
lda lineAdrH,x
sta temp+1
lda xpos
and #$07
tax
lda (temp),y
ora bittable,x ;eor
sta (temp),y
rts
;--------------------------------------------------
deplot
; deyxpos, deypos (.byte) - pixel position
;--------------------------------------------------
; let's calculate coordinates from xpos and ypos
lda dexpos
lsr
lsr
lsr
tay
;---
ldx deypos
lda lineAdrL,x
sta temp
lda lineAdrH,x
sta temp+1
lda dexpos
and #$07
tax
lda (temp),y
and debittable,x
sta (temp),y
rts
;--------------------------------------------------
byteDePlot
; deyxpos, deypos (.byte) - byte-pixel position 32xmaxlines screen
;--------------------------------------------------
; let's calculate coordinates from xpos and ypos
;---
ldx deypos
lda lineAdrL,x
sta temp
lda lineAdrH,x
sta temp+1
ldy dexpos
lda #0
sta (temp),y
rts
;--------------------------------------------------
clearDeadBall
;--------------------------------------------------
;dead ball in clearBallNr
ldx #maxMemory-1
stx clearCount
clearDeadLoop
ldx clearCount
lda xposMemTableAdrL,x
sta xMemAddr
lda xposMemTableAdrH,x
sta xMemAddr+1
lda yposMemTableAdrL,x
sta yMemAddr
lda yposMemTableAdrH,x
sta yMemAddr+1
;now on zero page I've got the addressess to store the old xPos and yPos
ldy clearBallNr
lda (xMemAddr),y
sta dexpos
lda (yMemAddr),y
sta deypos
jsr deplot
dec clearCount
bpl clearDeadLoop
rts
;--------------------------------------------------
clearScreen
;--------------------------------------------------
lda #0
tax
Loopi1
:(maxLines*32/256+1) sta display+$100*#,x
inx
bne Loopi1
rts
;--------------------------------------------------
drawBricks
;--------------------------------------------------
; solid maxBrickLines field
lda #%11111111
ldx #0
loopi2
:(maxBrickLines+margin)*32/256-1 sta display+screenWidth+$100*#,x
inx
bne loopi2
; empty borders
mva #margin deypos
loopi3
mva #0 dexpos
jsr byteDePlot
mva #1 dexpos
jsr byteDePlot
mva #30 dexpos
jsr byteDePlot
mva #31 dexpos
jsr byteDePlot
inc deypos
lda deypos
cmp #maxBrickLines+margin*2
bne loopi3
rts
;--------------------------------------------------
randomStart
; X - ball number
;--------------------------------------------------
lda #1
sta balleXistenZ,x
randomize margin $ff-margin
sta xposTableH,x
randomize margin*2+maxBrickLines maxLines-margin*4
sta yposTableH,x
; random initial speed and direction
;randomize 0 maxSpeed-1
lda #1 ;easy start
sta dxTableH,x
lda random
sta dxTableL,x
;randomize 1 maxSpeed-1 ;dy can not be too small or the game would take forever
lda #-2 ;easy start
sta dyTableH,x
lda random
sta dyTableL,x
rts
;--------------------------------------------------
initialize
;--------------------------------------------------
;mva 0 COLPF2S
jsr clearscreen
jsr drawBricks
lda dmactls
and #$fc
;ora #$02 ; normal screen width
ora #$01 ; narrow screen width
sta dmactls
mwa #dl dlptrs
; prepare mem address tables (for "snake" routine)
;first address initialized
mva #<xposMemTable xposMemTableAdrL
mva #>xposMemTable xposMemTableAdrH
mva #<yposMemTable yposMemTableAdrL
mva #>yposMemTable yposMemTableAdrH
;now add maxBalls to the following addresses
;just take the previous one and add "maxBalls"
ldx #0
initLoop1
clc
lda xposMemTableAdrL,x
adc #<maxBalls ; maxBalls <$80
sta xposMemTableAdrL+1,x
lda xposMemTableAdrH,x
adc #>maxBalls ; maxBalls <$80, so it is == 0
sta xposMemTableAdrH+1,x
clc
lda yposMemTableAdrL,x
adc #<maxBalls ; maxBalls <$80
sta yposMemTableAdrL+1,x
lda yposMemTableAdrH,x
adc #>maxBalls ; maxBalls <$80, so it is == 0
sta yposMemTableAdrH+1,x
inx
cpx #maxMemory-1
bne initLoop1
;snake memory addressess initialized!
;clear the balleXistenZ (nothing is bouncing!)
;and other tables
ldx #0
txa
eXistenZclearLoop
sta balleXistenZ,x
sta dxTableL,x
sta dxTableH,x
sta dyTableL,x
sta dyTableH,x
sta xposTableL,x
sta xposTableH,x
sta yposTableL,x
sta yposTableH,x
sta memCycleTable,x
inx
cpx #maxBalls
bne eXistenZclearLoop
sta balleXistenZcatch
dex
; X == maxBalls-1
txa
eXistenZstackFill
sta eXistenZstack+1,x
dex
txa
bne eXistenZstackFill
ldy #maxBalls
sty eXistenZstackPtr
;sty clearPtr
;OK, one ball starts!
;ldy eXistenZstackPtr
lda eXistenZstack,Y
dey
sty eXistenZstackPtr
tax
jsr randomStart ;just one random pixxxel
;previously the whole band of ballz
;VBI
mva #$b0 racquetPos
vmain vint,7
rts
;--------------------------------------------------
vint
;------------JOY-------------
;happy happy joy joy
;check for joystick now
/*
inc MyClok
lda MyClok
and #$07
bne jNotRight
*/
ldy PORTA
/*
tya
and #$01 ;up
bne jNotUp
ldx joystickConversion ;up
lda #1
sta keyboardGrid,x
jNotUp
tya
and #$02 ;down
bne jNotDown
ldx joystickConversion+1 ;up
lda #1
sta keyboardGrid,x
jNotDown
*/
tya
and #$04 ;left
bne jNotLeft
ldx racquetPos
cpx #racquetPosMin+1
bcc jNotLeft
dex
dex
stx racquetPos
jNotLeft
tya
and #$08 ;right
bne jNotRight
ldx racquetPos
cpx #racquetPosMax
bcs jNotRight
inx
inx
stx racquetPos
jNotRight
/*
;fire
lda TRIG0
bne JNotFire
...
JNotFire
*/
lda racquetPos
sec
lda #screenWidth-1
sbc racquetPos
:3 lsr
clc
adc #<racquetDispEven
sta dlracquetAddr0
lda #>racquetDispEven
adc #0
sta dlracquetAddr0+1
lda dlracquetAddr0
sta dlracquetAddr1
sta dlracquetAddr2
sta dlracquetAddr3
lda dlracquetAddr0+1
sta dlracquetAddr1+1
sta dlracquetAddr2+1
sta dlracquetAddr3+1
lda racquetPos
lsr
and #$03
sta HSCROL
lda racquetPos
:4 lsr
tax
lda hexconv,x
sta hexDump
lda racquetPos
and #$0F
tax
lda hexconv,x
sta hexDump+1
jmp XITVBV
;--------------------------------------------------
hexConv
dta d"0123456789abcdef"
marginLine :32 .byte 0
lineAdrL
:margin .byte <marginLine ;8 lines of margin space
:maxLines .byte <(display+32*#)
;:margin .byte <marginLine ;8 lines of margin space
:256-maxLines-1*margin .by <marginLine; (display+32*#) ;just to let the plot smear on full .byte ypos
lineAdrH
:margin .byte >marginLine
:maxLines .byte >(display+32*#)
;:margin .byte >marginLine
:256-maxLines-1*margin .by >marginLine; (display+32*#) ;just to let the plot smear on full .byte ypos
; $E000 is an address in ROM - the trick to avoid spawning new balls!
bittable
.byte $80,$40,$20,$10,$08,$04,$02,$01
debittable
.byte %01111111
.byte %10111111
.byte %11011111
.byte %11101111
.byte %11110111
.byte %11111011
.byte %11111101
.byte %11111110
dxTableL :maxBalls .byte 0
dxTableH :maxBalls .byte 0
dyTableL :maxBalls .byte 0
dyTableH :maxBalls .byte 0
; xpos and ydaw are "decimal" parts of static point precision .word
xposTableL :maxBalls .byte 0 ; "fractional" part
xposTableH :maxBalls .byte 0 ; "fractional" part
yposTableL :maxBalls .byte 0 ;
yposTableH :maxBalls .byte 0 ;
;ball position memory tables - the ball trace works like a "snake"
; (one set, one erased)
; there are "maxMemory" number of tables, "maxballs" length each
; too bad their addressess are not known in advance,
; so a short subrourine must calculate them and place to XposMemTableAdrL, etc.
balleXistenZ :maxBalls .byte 0 ; 0-dead, 1-alive!
balleXistenZcatch
.byte 0 ; catch last ball byte
eXistenZstack ; goes from index [1..maxBalls]. maxBalls[0] is unused
; keeps the list of free slots for balls
; goes from down to top. ptr==0 means stack is empty (all balls playing)
:maxBalls+1 .byte 0
xposMemTable
:maxBalls*maxMemory .byte 0
yposMemTable
:maxBalls*maxMemory .byte 0
;addressess of the tables with
xposMemTableAdrL
:maxMemory .byte 0
xposMemTableAdrH
:maxMemory .byte 0
yposMemTableAdrL
:maxMemory .byte 0
yposMemTableAdrH
:maxMemory .byte 0
;table for keeping the count on the last position to be deleted from the "snake"
memCycleTable
:maxBalls .byte 0
statusBar
dta d"rc$"
hexDump
dta d" dx$"
dxDisp
dta d" dy$"
dyDisp
dta d" balls$"
ballDisp
dta d" "
RUN main
Binary file not shown.
+97
View File
@@ -0,0 +1,97 @@
TODO
T021: balls are ferking stick to the right part of the screen...
T023: find and set few nice starting points and speeds to be rotated (remove not really sexy random start)
T025: do nice game over (when not clear)
T026: do nice "ALL CLEAR" screen
T028: (idea) spinning the ball - when ball bounces the racquette when it is moving, dX adds or subs
Changes:
2012-02-16
Fork to the colour version. (averybreakout.asm) Graphics mode tests.
build 023: 2010-06-26
+ idle ball delay loop shortened to 75 loops for a smoother experience
T027: when ball is down out of the screen and the racquette is over it, it bounces.
Need to add a check for it! (no bounces when out of the screen)
build 022: 2010-06-24
T022: when balls disappear, their traces should disappear, too, even when a new ball is NOT created
now the dead pixels disappear only when a new ball is created.
It has been done by expanding the bottom area, so the balls are going down.
Screen had to been cut 10 lines. Not a big deal.
T024: detect the ending
Detected (gameIsNotOver label).
build 021: 2010-06-21
+ apparently the slowest part of the engine is eXistenZcheck - rewrite as a simple stack!
as usual, it was not as simple as thought previously... But works now!
Will be easier to clear traces of the dead balls now.
build 020: 2010-06-02
+ when the racquette is max to the right it does not bounce balls!
+ still problems with racquet
solved - pos+size was >$ff
+ very fast balls get through the left-right side borders
solved by a better usage of "maxSpeed"
build 019: 2010-05-27
+ alive balls are somewhere in the outer space - check where and fix
where: YposTableH -- 00 -- 08 most 01, XposTableH - FF, FE, 00, 01
basicaly these are places where a ball should never be!
One fix let other "outer-space" related buggies die, too.
The problem was that bouncing ball got behind the border and started to bounce
there and forth outside the screen. Fix - bring it back on the playfield.
+ balls are created somewhere outside the screen
+ when balls disappear, their traces should disappear, too (now 1 pixel stays on screen)
+ high dX balls were sticking to Vborders. Fixed by increasing the margin
build 018: 2010-05-26
+ 1 pixel out of the deleted bunch stays forever (erase/store sequence was invalid)
build 017: 2010-05-25
+ too few high dX balls
x low-priority: rewrite memorytables to use lda (zpage,x) addressing (cool:)
Turned out not to be such a low-priority job as wrong sequence of writes
to memorytables make one pixel staying on the screen. Rewrite to simplify!
Turned out that indirect X addressing is not good for it and this is closed.
build 016: 2010-05-24
Forgot about documenting updates...
Basically the game is close to the end, but number of small issues emerged.
+ racquette is too slow (and it was such a work to make it 1-px smooth...)
build 006: 2010-05-12
Collision detection
Ough... turned out to be way more difficult than expected, but now collisions are detected and balls are bouncing!
build 005: 2010-05-10
Snake like plot memory! Lots and lots of pixels, less balls (64 is the max...)
build 004: 2010-05-09
Multiple ballz
build 003: 2010-05-08
Feeling bouncy
simple boundary bounces work nicely.
Unfrtunately number of draws per frame dropped to circa 70.
I guess 64 will be an achievement for 2 frames.
build 002: 2010-05-06
MADS rewrite :-]
;bare plots get circa 320 pixels per frame. I will go for 128 pix max now
build 001: 2010-05-04
First try:
Strip scorch sources to get clean gr.8 screen.
(and PLOT)
Basic idea: http://wonderfl.net/c/tNGi/fullscreen