From 9b42d4622f850b0900e3921ac882f562e76998e2 Mon Sep 17 00:00:00 2001 From: Pawel Kalinowski Date: Wed, 13 May 2020 01:59:43 -0400 Subject: [PATCH] PSA 2020 version Version for PSA 2020 virtual compo. --- MODE9pp.txt | 32 ++ art/CLEAR.docx | Bin 0 -> 10511 bytes art/WIZ.xex | Bin 0 -> 8794 bytes art/WIZs.xex | Bin 0 -> 8794 bytes art/clear.PNG | Bin 0 -> 21155 bytes art/clear2.PNG | Bin 0 -> 33704 bytes art/clear2.bmp | Bin 0 -> 3614 bytes art/clear3.bmp | Bin 0 -> 3486 bytes art/levels.xlsx | Bin 0 -> 17135 bytes art/wizd.xex | Bin 0 -> 9911 bytes averybreakout.asm | 1048 +++++++++++++++++++++++++++++++++++++++ averybreakout_2012.xex | Bin 0 -> 4652 bytes backup/acidbreakout.asm | 964 +++++++++++++++++++++++++++++++++++ backup/acidbreakout.obx | Bin 0 -> 3971 bytes changes.txt | 97 ++++ 15 files changed, 2141 insertions(+) create mode 100644 MODE9pp.txt create mode 100644 art/CLEAR.docx create mode 100644 art/WIZ.xex create mode 100644 art/WIZs.xex create mode 100644 art/clear.PNG create mode 100644 art/clear2.PNG create mode 100644 art/clear2.bmp create mode 100644 art/clear3.bmp create mode 100644 art/levels.xlsx create mode 100644 art/wizd.xex create mode 100644 averybreakout.asm create mode 100644 averybreakout_2012.xex create mode 100644 backup/acidbreakout.asm create mode 100644 backup/acidbreakout.obx create mode 100644 changes.txt diff --git a/MODE9pp.txt b/MODE9pp.txt new file mode 100644 index 0000000..be044fd --- /dev/null +++ b/MODE9pp.txt @@ -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) \ No newline at end of file diff --git a/art/CLEAR.docx b/art/CLEAR.docx new file mode 100644 index 0000000000000000000000000000000000000000..d0142894db1f52306f84b8143a24fd690dfd53a2 GIT binary patch literal 10511 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 I()_&pe=s*t<^TWy literal 0 HcmV?d00001 diff --git a/art/WIZ.xex b/art/WIZ.xex new file mode 100644 index 0000000000000000000000000000000000000000..2821db4a42592cbf6a716b37039c29900ca65758 GIT binary patch literal 8794 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 Ru6=e2Ro2{M-)1Az{{s=FR`LJ< literal 0 HcmV?d00001 diff --git a/art/WIZs.xex b/art/WIZs.xex new file mode 100644 index 0000000000000000000000000000000000000000..652f0d877b11cfa9324d13f6d6f394ff757f9acd GIT binary patch literal 8794 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 G=l=z2txW|0 literal 0 HcmV?d00001 diff --git a/art/clear2.bmp b/art/clear2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..24d3daf336d741a0d42b2b88d2acf5dc5d25c78c GIT binary patch literal 3614 zcmcJSzpmvp5QiNikpe9#XsB>YxetJ_M9;Ip8`xL3*m56ZX_+L5B0P5yHP>t-uko`^jBkDaTa z6>nOnG~q73Z(KTpfog#AD8oPejus8^i;1f|qXqcH<-^mm#ZRFUum!~J>1nO;Ke03e zQ+7(|O8ZU0NmC0i%2#-?FY`E=jbbk4n5fz|#qLaG`#nKehIAf}D6r4GR*ZfK& zrd;!0@-;uF;hpin&2h;OiqpixW>B_(qbw>g;v>I8B}Z{41zm?_EV;M*^%H!h(z7`A zqU%6PPdJg#!E-55TQ<3odSr~!a6uehnvb`dThdTeuf_*)4Q^c1@Z`J3o0FEB|1gt0 zlNM&v&`-zXLhRU@$X(^jC7+dQ-RdQ1^0sePUTH7~_DcmIHRz+A_2V0XA)J(+qSCl6 ztq%Tvjw}dQl%$V#1?K4Ih2HgwIaIyqn4klRhYSTf`6w2kUi zxYM+IuQYZnTao8L;I*}!#DN_x9O(%+Rlh=4oHwg+FPSs{3;EvUd5ap4@O0n_KB0do zvvKeXJd0aG?efnIF^oKKb#WEQLH@Z+jr+<~00;i*%!4W|p++ZvU{Y51iC|C;=nu6D zsBy}bXCkdMXO8@(hHF?^#`&GsG8U&8)w~S8;wQL1Ow_bYf0wuISM42mWO>Q!c-J{w zcUPt{NGFc*>`kuRmU)@SD;|(vkk?0(^uNHFrP#yG%w4}HGRVX6>psWw`y8Rk^EFfX zt$uOd9gR2p4(nI04+-h#bK`1#<7MN^T|U4klUIsf`X~8;^A}G1@AICoHF4#~J$dmY zj-$p8@t6L-ylcF`(@p%l@@wT}sW_Upt+!ior_qgD8X9W+w;O)UFIWCV!sL_mduAW= z^OjRXY1dBzUdd1HSRZgKWogx z<#msIJ0Fhn7rdP>JGZZU$t#3OFWgK09ve(QFC_8!5}zygaQVC0uLH&8bHnww3lKx{^#A|> literal 0 HcmV?d00001 diff --git a/art/clear3.bmp b/art/clear3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7349c5f5ea7752188b9ee65a003f531046033611 GIT binary patch literal 3486 zcmaKuKdvM-5Qp7riH@LCGN*)l0E8uS?yxxtH?W^xK)5&HDp-04StA0{MkI~s9rOLl z?wOu{&(gSUf39-5s%+1XKmGQ#v+@J=cWMpJ{cIl^l#iWT=TOyJo%881@}L=)2ZM*9 zx;l62{crd24|~H6b#rsgtsnYuK*qVq`gyD;=WAahWScNbryIdFPuLjLpEe}gJZ~J* zd1MXeF+yL8_0ej4iLSB+O5n}VYV#VOOMEdNYht3rSy+04$mL}K;j@|7jYa--a}gf?S%zASCu$e7YUy8HOv6cHwn5)^VQaamgk*dZ4|0H2 zC``27w1o7*g*0pve3s)v5s*z3afaYyUECzz7T)>V`6}b&WQ?KO<;U&9vm3>m;=cZP z636~k1H*wgHAC%u8^jfW7KCobP=A*^l6Sl?m(>tsN!g#9Y?tqDP~3(iw>1z9+AAOU zcw*&={b}u;D`6;#=|uC6&uyPGZc{|68oT^g2)1A=Ti)+V0fO28Hnx8B><{C{F;2FOGEz!eo=UplXD zww1|aDG0Ap&uqBGH#)!m!iWx_c%ssF6N;rNrg_0s<0v?D3~%|BW=y%|qvTtD=IK}C z|JlYRKgmy-h0UO14o6v(W5j2Em6IIBnH2P$*149^^4Dkh#z`;YoELp3QaZDVgbw<( zMujZ9ne)gPN5chibZI`j)!dqT&^P%|8=PsXc6C34rDZ(~E=)!%1bI%t>RWOPA!tFR5c#GqOOXeu=hH@n@ zPU!-zbMA(89$=e?a;+a=*?F0;^Slq;@}^FkZ)GaI(LR>UY&P$sx)mOjnXtWAB54uu zc~SLuEvVcA5v^S5NGby#ab8yA%CIa^lV2nsCC@8r-0!G!LK9c`R2SoC(K}v@$7}hB zJQ-=Px^Zw@y2(epX58!XPAwq~H6C^zbkdTx$MFlh5^3foq7Lm8=+A&xUv5#wOykim zF>S+52kv*yVN{uL$Z*SZ;JJ}DvZ!X~9&!vdp7;lKS)W@~{!>%R0Z;FV3CXdAHBp-1gTw zoj{Yg+}PK6>3n_2xob%g$ty*#_a}LHgya7wJnFh*iO6&GNFL6`&u!Q_b9Vok{nywUmC|=omcsn)`G#b)hvx`1MU%5Y|+nyY5BCvJGzobOXG^t)ABzo CZT2bv literal 0 HcmV?d00001 diff --git a/art/levels.xlsx b/art/levels.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..338268e7bdf7a7f5a45f65072c5e07b991c3e461 GIT binary patch literal 17135 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 z^5*_racquetDisp + adc #0 + sta dlracquetAddr0+1 + + lda racquetPos + lsr + and #$01 + ;sta HSCROL + + ;pos print + lda racquetPos + :4 lsr + clc + adc #'0' + sta hexDump + + lda racquetPos + and #$0F + clc + adc #'0' + sta hexDump+1 + + mva #0 dliCount + mva #13 VSCROL + jmp XITVBV + +;-------------------------------------------------- +DLI + sta DLI_A + stx DLI_X + ldx dliCount + sta WSYNC + + lda #13 + sta VSCROL + + lda #3 + sta VSCROL + + txa + asl + asl + ;lda brickColourTab,x + sta COLBAK + + inx + stx dliCount + ldx DLI_X + lda DLI_A + rti +;-------------------------------------------------- +main + jsr initialize + +loop + + mva #maxBalls-1 currBall + jsr cycleColours + +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 + cmp #maxMemory + bne notMaxMem + lda #0 +notMaxMem + 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 + tay +;--- + ;ldx deypos + lda lineAdrL,x + sta temp + lda lineAdrH,x + sta temp+1 + + lda dexpos + and #$01 + tax + + lda (temp),y + and debittable,x + sta (temp),y + + ;move the ball!!! + adw xpos dX xpos + + adw ypos dY ypos + + + +;top bounce + ; if yposmaxLines+margin then bounce + lda ypos+1 + cmp #maxLines+margin + bcc noBottom + + ; check if the ball hits the racquette + lda CONSOL + and #%00000100 ; OPTION + bne bounceNormally + jmp bottomBounce ; turns off the ball kill +bounceNormally + + lda ypos+1 + cmp #maxLines+margin*2+maxSpeed*2 ; that makes the ball below the racquet + bcs flyDown2 ;kinda lame optimisation as A carries ypos+1 + + + + lda racquetPos + sec + sbc #racquetPosMin+1 + bpl racquettePlus + lda #0 +racquettePlus + cmp xpos+1 + + jcs flyDown + + clc + adc #racquetSize-1 + cmp xpos+1 + jcs bottomBounce + +flyDown + lda ypos+1 +flyDown2 + cmp #maxLines+margin*6+maxSpeed*2 ;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 #margin + bcs noLeft + negw dX + mva #margin+1 xpos+1 + +noLeft + + +;right border bounce + lda xpos+1 + cmp #screenWidth-margin + bcc noRight + negw dX + mva #screenWidth-margin-1 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 + tay +;--- + ldx ypos+1 + lda lineAdrL,x + sta temp + lda lineAdrH,x + sta temp+1 + + ldx colour + + lda xpos+1 + and #$01 + bne pRightNibble +pLeftNibble + lda (temp),y + sta collisionCheck + and #$0F + ora LNColtable,x + sta (temp),y + lda collisionCheck + and #$F0 + cmp #%10000000 + jne noCollision + jmp plotEnd ;unconditional branch + +pRightNibble + lda (temp),y + sta collisionCheck + and #$F0 + ora RNColtable,x + sta (temp),y + lda collisionCheck + and #$0F + cmp #%00001000 + jne noCollision + +plotEnd + + 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 + lda colour + cmp #1 + bne 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 + + lda #-1 + sta dxTableH,x + bne dXlower + +dXplus + lda #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 + lda #1 + 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 + ;pause + + dec currBall + jpl flight + + + pause 0;all balls + + lda eXistenZstackPtr + cmp #maxBalls + jne loop + + ;game over +gameOver + lda RANDOM + and #$07 + sta COLPM0 + jmp gameOver + +;------------------- +ballDoesNotexist + ;a delay loop for a ball that does not really exist (yet) + ldx #70 +delayLoop + dex + bne delayLoop + jmp endOfBallzLoop +;-------------------------------------------------- +fatplot +; xpos, ypos (.byte) - pixel position +; xpos<80 +; pixel colour in "colour" +;-------------------------------------------------- + ; let's calculate coordinates from xpos and ypos + lda xpos + lsr + tay +;--- + ldx ypos + lda lineAdrL,x + sta temp + lda lineAdrH,x + sta temp+1 + + ldx colour + + lda xpos + and #$01 + bne fpRightNibble +fpLeftNibble + lda (temp),y + and #$0F + ora LNColtable,x + sta (temp),y + rts + +fpRightNibble + lda (temp),y + and #$F0 + ora RNColtable,x + sta (temp),y + rts +;-------------------------------------------------- +fatdeplot +; deyxpos, deypos (.byte) - pixel position +;-------------------------------------------------- + ; let's calculate coordinates from xpos and ypos + lda dexpos + lsr + tay +;--- + ldx deypos + lda lineAdrL,x + sta temp + lda lineAdrH,x + sta temp+1 + + lda dexpos + and #$01 + tax + + lda (temp),y + and debittable,x + 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 fatdeplot + + dec clearCount + bpl clearDeadLoop + + rts +;-------------------------------------------------- +clearScreen +;-------------------------------------------------- + lda #0 + tax +Loopi1 + :(maxLines*40/256+1) sta display+$100*#,x + inx + bne Loopi1 + rts +;-------------------------------------------------- +cycleColoursReset + ldy #6 +cycleRloop + lda colourCycleTabReset,y + sta colourCycleTab,y + dey + bpl cycleRloop + mva #0 colour +;-------------------------------------------------- +cycleColours +;-------------------------------------------------- + inc colour + lda colour + cmp #8 + bne noColourReset + mva #1 colour +noColourReset + ldy #6 +cycleCloop + lda colourCycleTab,y + ;sta COLPM1,y + sta COLPM1S,y + dey + bpl cycleCloop + +;shift colours +/* + 2 + 2 4 + 2 4 6 + 2 4 6 8 + 2 4 6 8 10 + 2 4 6 8 10 12 +2 4 6 8 10 12 14 +4 6 8 10 12 14 2 +6 8 10 12 14 2 4 +8 10 12 14 2 4 6 +10 12 14 2 4 6 8 +12 14 2 4 6 8 10 +14 2 4 6 8 10 12 +2 4 6 8 10 12 14 +4 6 8 10 12 14 +6 8 10 12 14 +8 10 12 14 +10 12 14 +12 14 +14 +261 262 263 264 265 266 267 +*/ +cct = colourCycleTab + ldx cct+6 + mva cct+5 cct+6 + mva cct+4 cct+5 + mva cct+3 cct+4 + mva cct+2 cct+3 + mva cct+1 cct+2 + mva cct+0 cct+1 + stx cct+0 + + rts +colourCycleTab + + .by 14,2,4,6,8,10,12 + +colourCycleTabReset + .by 14,2,4,6,8,10,12 +brickColourTab + .by 0 +;-------------------------------------------------- +initialize +;-------------------------------------------------- + + mva #$00 COLPM0S ; = $02C0 ;- - rejestr-cień COLPM0 + + jsr cycleColoursReset + + mva #$7C COLBAKS + + mva #0 dliCount + jsr clearscreen + jsr drawBricks + + lda dmactls + and #$fc + ora #$02 ; normal screen width + ;ora #$01 ; narrow screen width + sta dmactls + mwa #dl dlptrs + vdli DLI + + + +; prepare mem address tables (for "snake" routine) + + ;first address initialized + mva #xposMemTable xposMemTableAdrH + 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, so it is == 0 + sta xposMemTableAdrH+1,x + clc + lda yposMemTableAdrL,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 #screenWidth/2 racquetPos + vmain vint,7 + lda #$80 ;+GTIACTLBITS + sta GTIACTL + sta GTICTLS + + mva #1 colour + + rts +;-------------------------------------------------- +drawBricks +;-------------------------------------------------- + +; solid maxBrickLines field +; for x=margin to screenWidth-margin: +; for y=margin to maxBrickLines+margin: +; fatplot(x,y) + mva #8 colour + mva #margin*2 ypos +drawBricksLoopY + mva #margin*3 xpos +drawBricksLoop + jsr fatplot + inc xpos + lda xpos + cmp #screenWidth-margin*3 + bne drawBricksLoop + inc ypos + lda ypos + cmp #maxBrickLines+margin*2 + bne drawBricksLoopY + + rts +;-------------------------------------------------- +randomStart +; X - ball number +;-------------------------------------------------- + lda #1 + sta balleXistenZ,x + + ;randomize margin $ff-margin + lda #40 + sta xposTableH,x + ;randomize margin*2+maxBrickLines maxLines-margin*4 + lda #30 + 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 #-1 ;easy start + sta dyTableH,x + lda #1 + sta dyTableL,x + rts +;-------------------------------------------------- + +lineAdrL + :margin .byte marginLine + :maxLines .byte >(display+40*#) + ;:margin .byte >marginLine + :256-maxLines-1*margin .by >marginLine; (display+40*#) ;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 %11110000 + .byte %00001111 +RNColtable ; Right Nibble Colour Table + .byte %00000000 + .byte %00000001 + .byte %00000010 + .byte %00000011 + .byte %00000100 + .byte %00000101 + .byte %00000110 + .byte %00000111 + .byte %00001000 +LNColtable ; Left Nibble Colour Table + .byte %00000000 + .byte %00010000 + .byte %00100000 + .byte %00110000 + .byte %01000000 + .byte %01010000 + .byte %01100000 + .byte %01110000 + .byte %10000000 +debittable + .byte %00001111 + .byte %11110000 + +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" " +marginLine :40 .byte 0 + + RUN main diff --git a/averybreakout_2012.xex b/averybreakout_2012.xex new file mode 100644 index 0000000000000000000000000000000000000000..83e16c77b301fa3ef1670e46e7e59fcd95a71dde GIT binary patch literal 4652 zcmeHIO-vg{6dtdQZBQGW2vts#G)q{D7o_6tiKDM{E7N4n95*kA z$*5>IRu`tt`7oiRg}w8Xv^#xm>;z5vz-{#}Y$$oV`dY zRylp|;H~kWj^vvvlLKghfHm9!= z9>>A+c3hyb)WFi1zbP~@1!bOW^4zN1f94x-rvI;0y|@=rMQ{XC`N7-~H!9dQUo4v2 zC)2^**GY${Uo`2*v%|PwtUmQKycO*i3pu4=hGd@pGlrvZDqnI`=j?_9%4>-iBWT2N zkwzWDLL~0kSDMFdl)94~)=qE4VFc|p{(Tc1R=*RtL*49=vQomXdX+XW)NQ3H3W2WkRhmCEivP-XkAlU^5b+ZAcF0nYBcco*g81)av zX>f4ppc7~>#M20DrF{@iqp))^<~Dmy)Y6)Tn!+X>$aMm9HMMY_Xd}mT&thHj{IdRs zXS$9m(38Nvo+!|hs_gJ~M`W0lS|C#pV>-MWyH}2K(i$E~j~poFuZlX(4&g9gAuNtK zR%M2!RFqKBgo=_Xx~rm;il~axD!Qkl$-MqpPFU|R31f3Y#PKU!%g}lV2({}LX2KzG z&4G&p*Ein^nMHxXxFC>4Au}(K1tIfLAoD`zfj}M#nK^+x5N^*2@)6ErwO75c{Xh(n zS&r`(*e$XI;>Y8BhrmzNXPP;2vyvmtU?Xmh@kHVhg(S~r`w@5B#E~N_Y@J+@SQGI| zEJ?Z~_8RGtlE?`!?(0-Pkl-5okouA2gsTjOPb9d_VE9bRuUYlgB#MFzpk2@`XcaUH z1OajYF@O}{TaaJt)PEvM({fY|z@Yz@=nM^PONgJVXD&<=j70S7}>N2CU~@^2P>oUAmE2 zDmYs|j?b*w-R~)r`UZcYdvrGMXptk+KmMbC<9UE2B}$kukSyV@fs_GSLfXK+5+;j~ zo(B}Fk%==~Dy%j;a`5ifOLDhTT{z5NaXF^UK$(Fu17!xv43rrtGf-yW|HQzj*DO$O a=M7{0yf|L{u&b-5I5{NNxJTU4+CKr`X1po@ literal 0 HcmV?d00001 diff --git a/backup/acidbreakout.asm b/backup/acidbreakout.asm new file mode 100644 index 0000000..4407bf4 --- /dev/null +++ b/backup/acidbreakout.asm @@ -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 yposmaxLines+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 xposMemTableAdrH + 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, so it is == 0 + sta xposMemTableAdrH+1,x + clc + lda yposMemTableAdrL,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 + 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 + :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 + + \ No newline at end of file diff --git a/backup/acidbreakout.obx b/backup/acidbreakout.obx new file mode 100644 index 0000000000000000000000000000000000000000..a60b70fcb5170a6ebc1b840c0813aee75207ae06 GIT binary patch literal 3971 zcmeH{O>7%Q6vxLOiJeHLZXv}*3fag`@LE+ih)bmiVGdkUquw|mB%HKHveE;hQU&q> zJNEdi-oz#ZmBUD`>v6Mg+&WF$G;vq$B~_i%3XmXCtC-RfBP8erwUwKM=glOzC`v9! z2;`qu^Jd@7yqWpGx4XWMxKqN%y+=`M@4w4YRQSga@Zk!#^}LNZv@7etPLnuGm-H5n zWn;3}uIQY%EV7r!KDo$azg*?p2WX&VEbKchp@$J1fi{YxQj6+dN;qKfeqle2AO6KS?=Kk4 zo(?bv!TUI2rLoM&ov&}$gCjW!5wG2O%JO`aA0Udq)U**ighLQKjKh)v`@vmJsC)k9 zeo}MSE|3k>UBRzj0iSLkf=kSwex!q4VEgYAYA0-Zmqtz2`EbJY+}6%E^(b4x;oa;G zo7745&c82$U|m}ix8&F++O9k1TfZs2QFuQy^60(U8}>*|BMoRoeZ(uwD z>Z{tjs9IfFTsK@-U#|LrOi)6}F<06U8qbbzTd-f%s&y)fF}Gs5J#JcbNhn89ilDOu zr3pGmP=+8%P?n(c1Wgbmk=ld{1Wgi@C+H$Umk25lG)2&5f~E<&LeN!$t`Rgt&~<`l z37V@YlP+mJjdqS&QI;hm#uCCouGuPSHq5IVrb9J9V~R^I<*rN3VJ#&_NXZjONwJoa zk_+CZYYDQ$gw4!JYg-9(aqn0;V$BO${#lDg6ts}RUaiE5uWO}MakWRXi%kOb_6X7; zu}w%LGl=GKkhLE8&^?GW3ugG(!SR9s-#a)C2$ixySxloC)D+|yHiaC+eo$R-Ca5ep z3;ZoAWruQ4EZP@hM21FrnsNk3SUqyTTBQPxr|zV?Bm?)s1J@+__6)CATC?$TOG3Y} z5Q?ASjp}Qqps!Ryarg~L>ks2lC1%fxxX4MI2Z>8uevuRJa^f;4-skd5oOq8D%bfTV zN8|mxPSk$~7Rbqc-J(mNaelAb9T1#@4@~>^zxYzyftSq(2L_KFcYn0g-?KJ$gn>AR z%a^)U{{Ps`o9%4787anDMw)Sskzr6qmT{gj!H^g^#s$VCBhR?VxWp(hrWltQ(~K*O ztBh-m8OC+SEMsnN^JY6+pMx_Q^;*s6H$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