From 0acc90549f5c533d6039042aea515ffc0ae27074 Mon Sep 17 00:00:00 2001 From: Charles Mangin Date: Tue, 19 Jun 2018 14:23:56 -0400 Subject: [PATCH] added win/lose messages. clears adjacent squares. --- MINESWEEPER.dsk | Bin 143360 -> 143360 bytes MINESWEEPER.s | 174 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 166 insertions(+), 8 deletions(-) diff --git a/MINESWEEPER.dsk b/MINESWEEPER.dsk index 44d1f08a2defd83b8625b48d2fd05c9b771aef48..c976db357b8e802b44b3db0327d5acf25bb35892 100644 GIT binary patch delta 10486 zcmeHMeQXow8NYK9+gX7)an1_16Ap--HI!oLG=(tAtHfW4qHQ2?a8`^~*rE$|MC-*!RhRfzWoK1`%_b@Ps=l>O z-Z~W*!!zO8_}$?tIZ+$04$qQl3Qyq@_sJ2Nv0>Iy+{b*}9h(`0QPzq60G!z|ni-oN zst#Qnn~BZ9{w-b>o{2BP56bBG$`j(p+Feq=v+jFOr{fj!Po{nzI@8>|)+N1=c;`Uk zt*G<--qdNA6rN^Ng455H$-8P_NW6C-aWU=;r_QDDfBIZn-sFy@6Cb?a5#1D**`JAc zCnLV{g{^f%vk719-RpJT;$On=%Ij)Q3(p@GB16tlg=~}Jo0T(u&mD z;Q;X;}H#gUHrca&* zOy3?a3BgJg!94PsQgbgy@xH*`yaXVzN~7B!$?zxS@2=B;KQNd!{~!Q%z{6x1|JRuACEWJ zlwk_~cBwG<5*K`l4}PzC@C!meQ8e@w+0ZBTp?4tkxxhb6fnSfnH&Wn}CV@|?fyb!) zfg1RvMd1IQ3;dWG_zI)ICt2WOw7|omz{BVRpJahgs)2_?fyd*`1D{mI++7%WHy3y} zANU^g!1D<|NoDGNb!WBe&QQ4mMdhI_i-cEVBsf9x&?tu_PGzV@a59a_%4z@nYOmCB zB7I=UF>WW;bk!1T+JKlB1BR8rD=B^cyX+X2*GkGS{ecFrWL^tG(!ivD4iy92Qc3x8 zRlTiE-CHYPg1wSjf?+h&;1Fssdepp*9nyR5ep(s=7=<*rkl%%NF$6$Fd8Iq2oe}QBqNMSBPx;L5F&WIIU*xOr0#}7 zKpHqe8hAjyX%0xHdYFPTT2#<#vv`c^12QjYlUwEu?iIl}NcQZ((h zX45XntM}^C)Vn^Ir{2idamRT|Q>NtWNXaqDP|1T#$uTT{iYa-}LdjQaO8yB3*;XUS zf($Yk4Kg?c8H^sXAcG96ASH)KkYNSpx`C+#Syv%sT^wXxJY;7qAUo>&sQqPv>@b7u zXi>=8vycUN$X1mGnLl6vnJO#{u~tG1a|{s!390sCSbm5h2F{wQ$0`l6dl_QwDq{46 zCX*+C74!rQ%j?xAYy^o+pRk7CbFregEgQNfK6H71#;jLqz^Zfwva9w)dc5-dxTvLj z%m1_>-YWe-bsKVyI91>gxVil^)7n0zH z_zhB7@jKVO{~wjX=GJy|1vS_i;tNk1y(PSQPbJ(ubL1 zNs!&v(IPr}i~2Af`=Fy)_7P$?)`vA)_hI@^F-q8XpZx-rj8|C62Ig7*3wN89x5OzH7$w_hT>FEG4&isQXMi+4MZ zcTb6Ux8DHXS@|(9{;{j<%)99i1IL5%2N(ZFvd?X#=|4VPgpS?Q>iyt?kPAwUGCAJpDy=s zADzArIVdWvG-{eK>M?U+Cpf4q?V{V^f& z-o2_@OAm!G1 zl-GQBFVmg+JwTmdgZ}6g-{jf3ty4}R@8}&LN4J%Onbdm;pNQq)b+XUCb zz9nYFCU4U@u`!>biA_Mh-`!sm|2pkcz1p9G;C zmAE2buEBw|+)#sa^0*LAh0}7cQdjk9+nZ|M&r9LqFT2}*Q2ngyjC`H`_KIG22RZxP z_~JZt%!L4&}X5E{YL*Zp)?#V5KsNAd?9^Cir3|oba_TJr1(Z$ zsY+V1dM@)oJs)T4Ii0VbZjTSr!CYo6NLix z?D_Z9)5WrR+0DvkWA&V7>ItK%Cmd2w7`=KWQhOo@)x#a}B4S zYk2jf_a=*8LrMCUM!d=YI<4}lv`5#IfJt*QO-YVQtDYd*cYD<1%Tk+?#YC&e7_BDq tY2_%9RudmmT47y=v_cO`1pvdcq|$0JT2|9WIunJb&K~^n*@NQ3e*sx^xzPXs delta 906 zcmbtSO=#3W6rM?%HY(beU98(u+7T5+Ssj(In#Oe2DivB(w3ofeBAym6d)k}bOCtVM z#D!cfse&UETK6D=#Ui+ngV2ljhQcD`(4IV0mpIuh{y?>e1M}YFoA1qg^UbTSs?}9> z7QgDp5@b+&jYgeS*W_dBh>E(!fx>bac zfzZjt-6<8VQ8~NVv!`C!bx-y(Snk=ev!>yerzvw9#ui5}mk?~|_U32dU%Ww@{nc*y z(MtEskUW!?8?F0xM36k6mIbKtT~dxM<05jB4DeY10pab_DDe;}j#7b`%ZUpCC7fLqt}R0Xe3FPK@?x zlz7pHr7(!O1~EZrhIqG&FLbmU`Bl50%KgyuFABbk6?}`QzpV$K{G~d7>OOMrRLZ4W zHwsf%CdS7`%`^I`6WODO4;|P)JTy4azprm^IvI_BO4)`y{d<9J*#AS``f6!>EdIxH z{Jb4Vi5ynb>!P%_~ Z{6R@EPP5)a`7ZS0*U&3%5MeP?zXL9(KxqH~ diff --git a/MINESWEEPER.s b/MINESWEEPER.s index 7383665..3e5161c 100644 --- a/MINESWEEPER.s +++ b/MINESWEEPER.s @@ -29,10 +29,9 @@ ************************************************** * -* TO DO: win message when progress = 64 and all bombs marked +* TO DO: win message when progress = 64 and/or all bombs marked * lose message when clearing a cell with bomb -* sounds? -* +* clear adjacent cells when clearing a 0 ************************************************** @@ -94,7 +93,7 @@ STROUT EQU $DB3A ;Y=String ptr high, A=String ptr low * START ************************************************** - ORG $1000 ; PROGRAM DATA STARTS AT $1000 + ORG $2000 ; PROGRAM DATA STARTS AT $2000 ************************************************** * Draws the blank board borders, corners, borders @@ -523,7 +522,12 @@ PRINTPROGRESS ; prints number of bombs marked STA CH JSR VTAB LDA PROGRESS - JSR $FDDA ; prints HEX of Accumulator + + CMP #$64 + BNE PROGRESSGO + JMP YOUWIN + +PROGRESSGO JSR $FDDA ; prints HEX of Accumulator RTS ************************************************** @@ -756,6 +760,7 @@ DRAWSOLVEDSQUARE ; puts number in selected/solved square BMI SOLVENOBOMB JSR BONK ; BONK! LDA #$52 ; FOUND BOMB. YOU LOSE. + JSR YOULOSE SOLVENOBOMB CLC ADC #$30 ; add #$30 (becomes #) @@ -771,7 +776,13 @@ SOLVENOBOMB CLC ROL ; ROW * 2, COLUMN * 2 STA PLOTCOLUMN JSR PLOTCHAR - RTS + + LDA SOLVEORIGIN,X ; if solution is zero + BNE SOLVEDADJACENT ; mark adjacent squares as solved as well + JSR SOLVEADJACENTSQUARES +SOLVEDADJACENT RTS + + SOLVEBOMB LDA #$FF ; unmark as bomb STA PROGRESSORIGIN,X ; @@ -799,8 +810,155 @@ SOLVEBOMB LDA #$FF ; unmark as bomb + + + + + +SOLVEADJACENTSQUARE ; puts number in adjacent squares + JSR CLICK ; little sound clicks + LDA ROW ; get ROW and COLUMN + CLC + ROL + ROL ; offset = ROW * 8 + COLUMN + ROL + CLC + ADC COLUMN + TAX + LDA PROGRESSORIGIN,X ; check if it hasn't been solved yet, + CLC + CMP #$FF ; put the solution in the square, + BNE SOLVENOBOMB2 ; increment the progress + + LDA PROGRESS ; inc as decimal for printy printy. + SED + CLC + ADC #1 + CLD + STA PROGRESS + JSR PRINTPROGRESS + + LDA SOLVEORIGIN,X ; get SOLVEORIGIN + offset + STA PROGRESSORIGIN,X ; store progress + +SOLVENOBOMB2 CLC + ADC #$30 ; add #$30 (becomes #) + STA CHAR ; store as CHAR + LDA ROW + CLC + ADC #$01 ; zero-based to 1-based + ROL ; ROW * 2, COLUMN * 2 + STA PLOTROW + LDA COLUMN + CLC + ADC #$01 ; zero-based to 1-based + ROL ; ROW * 2, COLUMN * 2 + STA PLOTCOLUMN + JSR PLOTCHAR + RTS + +;/SOLVEADJACENTSQUARE + + + + ************************************************** -* solves squares for adjacent bombs, updates solved map, increments bomb count +* solves adjacent squares if solved square is 0 +************************************************** +SOLVEADJACENTSQUARES + +SOLVERIGHT LDA COLUMN ; column + 1 unless col=7 + CLC + CMP #$07 + BEQ SOLVELEFT ; = 7 skip ahead + INC COLUMN + JSR SOLVEADJACENTSQUARE ; solve with col + 1 + + LDA ROW ; solve lower right + CMP #$07 + BEQ SOLVEUR + INC ROW + JSR SOLVEADJACENTSQUARE ; solve with col + 1, row + 1 + DEC ROW +SOLVEUR LDA ROW ; solve upper right + BEQ SOLVERIGHTDONE ; if ROW = 0, skip ahead + DEC ROW + JSR SOLVEADJACENTSQUARE ; solve with col + 1, row - 1 + INC ROW + +SOLVERIGHTDONE DEC COLUMN ; reset column + +SOLVELEFT LDA COLUMN + BEQ SOLVEDOWN ; if column = 0, skip ahead + DEC COLUMN ; solve with col - 1 + JSR SOLVEADJACENTSQUARE + + LDA ROW ; solve lower left + CMP #$07 + BEQ SOLVEUL + INC ROW + JSR SOLVEADJACENTSQUARE ; solve with col - 1, row + 1 + DEC ROW +SOLVEUL LDA ROW ; solve upper right + BEQ SOLVELEFTDONE ; if ROW = 0, skip ahead + DEC ROW + JSR SOLVEADJACENTSQUARE ; solve with col - 1, row - 1 + INC ROW + +SOLVELEFTDONE INC COLUMN ; reset column + +SOLVEDOWN LDA ROW + CLC + CMP #$07 + BEQ SOLVEUP + INC ROW + JSR SOLVEADJACENTSQUARE ; solve with row + 1 + DEC ROW ; reset row +SOLVEUP LDA ROW + BEQ ADJDONE ; if row = 0, skip ahead + DEC ROW ; solve with row - 1 + JSR SOLVEADJACENTSQUARE + INC ROW ; reset column + +ADJDONE + RTS +;/SOLVEADJACENTSQUARES + + + +************************************************** +* WIN or LOSE? +************************************************** + +WINNER ASC "YOU WIN! ",00 +LOSER ASC "YOU LOSE! ",00 +RESETLINE ASC "Press R to Reset. ",00 + + +YOUWIN LDA #$13 + STA CV ; jump down + JSR LEFTCOLUMN + LDY #>WINNER + LDA #LOSER + LDA #RESETLINE + LDA #