From 35d31a4edafd6f1cd0e20606820c9ec6067acd03 Mon Sep 17 00:00:00 2001 From: Charles Mangin Date: Wed, 12 Dec 2018 13:38:57 -0500 Subject: [PATCH] fix for GS, 1 and 2 player on one DSK --- DROPBLOCK.dsk | Bin 143360 -> 143360 bytes DROPBLOCKS.s | 456 ++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 347 insertions(+), 109 deletions(-) diff --git a/DROPBLOCK.dsk b/DROPBLOCK.dsk index ec75d1d815cfa3c43e7dd51715d3ec1a77568a71..b752bb5506b30814d979618ef3bea9472d78bce6 100644 GIT binary patch delta 12453 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 CQay+O delta 11172 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 diff --git a/DROPBLOCKS.s b/DROPBLOCKS.s index b281fe1..ff5351f 100644 --- a/DROPBLOCKS.s +++ b/DROPBLOCKS.s @@ -1,9 +1,7 @@ - DSK DROPBLOCKS + DSK ONEPLAYER ************************************************** -* To Do: -* * two-player mode -* +* single-player mode - add 1 or 2 switch? ************************************************** * Variables ************************************************** @@ -15,20 +13,23 @@ PLOTROW EQU $FE ; row/col in text page PLOTCOLUMN EQU $FF RNDSEED EQU $EA ; +eb +ec BLOCKCHAR EQU $CE ; color of current dropping block +NEXTBLOCK EQU $CD ; color of next block to drop BLOCKROW EQU $1D ; dropping block row BLOCKCOLUMN EQU $1E ; dropping block column ATTRACTING EQU $40 ; in attract mode? PROCESSING EQU $41 ; do we need to loop again? BORDERCOLOR EQU $09 ; border color changes to indicate level up -;HISCORE EQU $0A +SWITCHSIDE EQU $0A PROGRESS EQU $FD ; cleared blocks +PROGRESSBARL EQU $1F ; length of the progress bar + +BUMPFLAG EQU $1C ; whether to bump up opponent's pixels -PROGRESSBARL EQU $1F ; length of the progress bar -FIELDORIGIN EQU $1C ; where to draw the playfield FIELDLEFT EQU $ED FIELDRIGHT EQU $EF +LOSEFLAG EQU $CC ; lose the game ************************************************** @@ -85,33 +86,33 @@ SPEED EQU $F1 LDA #$00 STA BLINK ; blinking text? no thanks. -; STA BGCHAR STA LORES ; low res graphics mode -; STA HISCORE + STA MIXCLR ; For IIGS STA PLAYERSCORE STA PLAYERSCORE+1 STA BORDERCOLOR ; border starts pink (BB) from BORDERCOLORS LUT + STA SWITCHSIDE + STA BUMPFLAG + STA LOSEFLAG LDA #$00 ; all the way to the left side - STA FIELDORIGIN STA FIELDLEFT CLC ADC #$14 ; 20 columns wide to start STA FIELDRIGHT - JSR CLRLORES ; clear screen - JSR DRAWBOARD LDA #$01 STA ATTRACTING ; in ATTRACT mode - + JSR RANDOMBLOCK ; get a block color + STA NEXTBLOCK ; get initial block color ************************************************** -* MAIN LOOP -* waits for keyboard input, moves cursor, etc +* ATTRACT LOOP +* waits for keyboard input, plays at random ************************************************** ATTRACT @@ -119,9 +120,15 @@ ATTRACT * attract loop animation? instructions? JSR NEXTSCREEN + LDA LOSEFLAG ; did the game end? + BNE LOSEGAME + LDA KEY ; check for keydown CMP #$A0 ; space bar - BEQ GOTSPACE ; advance to game on SPACE + BEQ STARTGAME ; advance to game on SPACE + + CMP #$9B ; ESC + BEQ END ; exit on ESC? LDA SPEED ; let's do an interframe delay JSR WAIT @@ -129,48 +136,99 @@ ATTRACT JMP ATTRACT STARTGAME STA STROBE - ;JMP MAIN ; back to waiting for a key + JMP PLAYBALL + +LOSEGAME LDA ATTRACTING ; in attract mode or not? + BEQ STARTOVER ; start at level 1 + JMP GOTRESET ; reset in attract mode + +STARTOVER JMP PLAYBALL ; + +END STA STROBE + STA ALTTEXTOFF + STA TXTSET + JSR HOME + RTS ; END + + ************************************************** * MAIN LOOP -* waits for keyboard input, moves cursor, etc +* waits for keyboard input ************************************************** MAIN MAINLOOP LDA KEY ; check for keydown -; CMP #$A0 ; space bar -; BEQ GOTSPACE ; advance frame on SPACE - - CMP #$CA ; J - BEQ GOTLEFT - - CMP #$CC ; L - BEQ GOTRIGHT CMP #$D2 ; R to reset - BEQ GOTRESET + BEQ PLAYBALL CMP #$9B ; ESC BEQ END ; exit on ESC? + LDA FIELDLEFT + BEQ LEFTSIDE - LDA SPEED ; let's do an interframe delay + LDA KEY ; check for keydown + +RIGHTSIDE CMP #$CA ; J + BEQ GOTLEFT + CMP #$EA ; J + BEQ GOTLEFT + + CMP #$CC ; L + BEQ GOTRIGHT + CMP #$EC ; L + BEQ GOTRIGHT + + CMP #$CB ; K + BEQ NODELAY + CMP #$EB ; K + BEQ NODELAY + + JMP LOADDELAY + + + +LEFTSIDE + LDA KEY ; check for keydown + CMP #$C1 ; A + BEQ GOTLEFT + CMP #$E1 ; A + BEQ GOTLEFT + + CMP #$C4 ; D + BEQ GOTRIGHT + CMP #$E4 ; D + BEQ GOTRIGHT + + CMP #$F3 ; S + BEQ NODELAY + CMP #$D3 ; S + BEQ NODELAY + + +LOADDELAY LDA SPEED ; let's do an interframe delay CMP #$40 BCC GOFAST ; #$40 is plenty fast JSR WAIT - JMP GOSLOW + JMP NODELAY GOFAST LDA #$40 ; if it's gone below #$40, then reset to 40 (#01 is no delay) STA SPEED JSR WAIT -GOSLOW JSR NEXTSCREEN ; animate one frame per loop +NODELAY + JSR NEXTSCREEN ; animate one frame per loop + + LDA LOSEFLAG ; did the game end? + BNE LOSEGAME GOLOOP JMP MAINLOOP ; loop until a key - - + + ************************************************** * keyboard input handling ************************************************** @@ -183,13 +241,22 @@ GOTRIGHT STA STROBE JSR MOVEBLOCKRIGHT JMP MAINLOOP -GOTRESET -GOTSPACE STA STROBE - LDA #$00 - STA BORDERCOLOR +PLAYBALL LDA #$00 STA ATTRACTING ; leave ATTRACT mode + JSR RESTART + JMP MAINLOOP + +GOTRESET LDA #$01 + STA ATTRACTING ; ATTRACT mode + JSR RESTART + JMP ATTRACT ; otherwise, attract loop. + + +RESTART LDA #$00 + STA STROBE + STA BORDERCOLOR + STA LOSEFLAG - LDA FIELDORIGIN ; all the way to the left side STA FIELDLEFT CLC ADC #$14 ; 20 columns to start @@ -197,14 +264,14 @@ GOTSPACE STA STROBE JSR DRAWBOARD JSR RESETSCORE - JMP MAINLOOP + + LDA #$01 + STA PLOTROW ; stop the current block from polluting the new game + STA BLOCKROW -END STA STROBE - STA ALTTEXTOFF - STA TXTSET - JSR HOME - RTS ; END + RTS + ************************************************** @@ -216,8 +283,6 @@ END STA STROBE ************************************************** MOVEBLOCKLEFT ; got left - ;LDA PROCESSING ; is PROCESSING == 0? - ;BEQ DONEMOVING LDA FIELDLEFT CLC ADC #$02 ; if BLOCKCOLUMN = #02, can't move left @@ -246,8 +311,6 @@ MOVEBLOCKLEFT ; got left JMP DONEMOVING MOVEBLOCKRIGHT ; got left - ;LDA PROCESSING ; is PROCESSING == 0? - ;BEQ DONEMOVING LDA FIELDRIGHT SEC SBC #$04 ; if BLOCKCOLUMN = #12, can't move right @@ -322,7 +385,6 @@ FALLBLOCK LDA BLOCKCHAR ; store block color to CHAR DEC PLOTCOLUMN DEC PLOTROW JSR CLEARBLOCKL - ;INC PROCESSING ; not sure why, but i'm keeping track of this still. INC BLOCKROW ; drop down to do it again RTS ; shortcut. @@ -333,44 +395,117 @@ PROCESSPIXELS LDA PROCESSING ; PROCESSING updated with each combine action BNE PROCESSPIXELS ; keep combining until done. +*** TOURNAMENT MODE or 2 PLAYER MODE +; LDA SWITCHSIDE +; BEQ DRAWNEXTBLOCK ; with each new point, switch sides +; +; LDA #$0 +; STA SWITCHSIDE ; reset for next turn +; +; JSR SWITCHSIDES +*** + DRAWNEXTBLOCK ; all done PROCESSING/combining, add new block at top of screen - LDA #$01 + ; draw upcoming block at 0, move previous upcoming down to 1 + STA STROBE ; clear out the keyboard buffer from fast drop + LDA #$0 STA PLOTROW STA BLOCKROW - - LDA ATTRACTING + + LDA ATTRACTING ; if ATTRACTING, do random column. BEQ MIDDLETOP ; 0=done attracting, now playing with block in middle JSR RANDOMCOLUMN ; gets random column from 2-18 for attract mode JMP RANDOMTOP -MIDDLETOP LDA FIELDRIGHT ; move drop location to between left/right borders +MIDDLETOP JSR CENTERCOLUMN + +RANDOMTOP STA PLOTCOLUMN + STA BLOCKCOLUMN + + LDA NEXTBLOCK + STA BLOCKCHAR ; transfer upcoming block to current + + JSR RANDOMBLOCK ; get a block color + STA CHAR + STA NEXTBLOCK ; color of upcoming block + JSR PLOTQUICK + INC PLOTCOLUMN + JSR PLOTQUICK + + INC PLOTROW ; down to row 1 + INC BLOCKROW ; set falling block position + DEC PLOTCOLUMN + +GETNEXTBLOCK LDA BLOCKCHAR ; take current block color and draw the dropping block + STA CHAR + JSR PLOTQUICK + INC PLOTCOLUMN + JSR PLOTQUICK + + +NEXTSCREENDONE RTS + +;/NEXTSCREEN + + + + +************************************************** +* TOURNAMENT / 2 PLAYER MODE +************************************************** + +SWITCHSIDES + + ; clear the upcoming block from current side + JSR CENTERCOLUMN ; get center COLUMN + STA PLOTCOLUMN + LDA #$0 + STA PLOTROW + STA CHAR + JSR PLOTQUICK + INC PLOTCOLUMN + JSR PLOTQUICK ; clear upcoming block + + LDA FIELDLEFT + BNE NEXTSIDE ; if FIELDORIGIN is 0, set it to 20 + LDA #$14 ; else set to 0 + JMP NEXTSIDE2 +NEXTSIDE LDA #$00 +NEXTSIDE2 STA FIELDLEFT + + CLC + ADC #$14 ; move right border as well + STA FIELDRIGHT + + LDA BUMPFLAG ; flagged to bump up? + BEQ NEXTSIDE3 ; 0 skip + JSR BUMPPIXELS ; bump pixels up if flagged + +NEXTSIDE3 RTS +;/SWITCHSIDES + + + +************************************************** +* returns with "middle" column in accumulator +************************************************** + +CENTERCOLUMN LDA FIELDRIGHT ; move drop location to between left/right borders SEC SBC FIELDLEFT ; get width as right-LEFT CLC LSR ; divide by 2 AND #$FE ; divisible by 2 CLC - ADC FIELDORIGIN ; add left offset. - -RANDOMTOP STA PLOTCOLUMN - STA BLOCKCOLUMN - - JSR GETCHAR ; check to see if row1 is blank - BEQ GETNEXTBLOCK ; if not, jump to reset. - RTS ; otherwise, continue - - -GETNEXTBLOCK JSR RANDOMBLOCK ; get a block color - STA CHAR - STA BLOCKCHAR - JSR PLOTQUICK - INC PLOTCOLUMN - JSR PLOTQUICK + ADC FIELDLEFT ; add left offset. + RTS +;/CENTERCOLUMN -NEXTSCREENDONE RTS -;/NEXTSCREEN - + +************************************************** +* Draw the playfield(s) +************************************************** DRAWBOARD JSR HOME @@ -385,18 +520,13 @@ DRAWBOARD JSR HOME STA PROCESSING - - -************************************************** -* blanks the screen -************************************************** ; FOR EACH ROW/COLUMN - LDA #$18 ; X = 24 + LDA #$18 ; STA PLOTROW -ROWLOOP2 ; (ROW 24 to 0) - DEC PLOTROW ; start columnloop (COLUMN 0 to 20) - LDA FIELDRIGHT +ROWLOOP2 ; (ROW 40 to 0) + DEC PLOTROW ; start columnloop (COLUMN 0 to 40) + LDA #$28 STA PLOTCOLUMN COLUMNLOOP2 DEC PLOTCOLUMN @@ -415,9 +545,19 @@ PLOTLINE STA CHAR ; /rowloop2 + JSR DRAWBORDER + LDA #$14 + STA FIELDLEFT + CLC + ADC #$14 ; move right border as well + STA FIELDRIGHT + + JSR DRAWBORDER + + RTS ************************************************** -* Draws the pink border, clears score +* Draws the pink border ************************************************** DRAWBORDER ; draws the pink border line @@ -495,20 +635,26 @@ BASELINE LDA #$17 ; row 24 ORA #$50 ; adds dark grey to bottom STA CHAR - LDA FIELDORIGIN + LDA FIELDLEFT CLC ADC #$14 ; baseline is 20px wide + STA PLOTCOLUMN BASELINELOOP DEC PLOTCOLUMN JSR PLOTQUICK ; PLOT CHAR LDA PLOTCOLUMN ; last COLUMN? - CMP FIELDORIGIN + CMP FIELDLEFT BNE BASELINELOOP ; draw next column of line RTS ;/DRAWBORDER +************************************************** +* clears score +************************************************** + + RESETSCORE LDA #$00 STA PLAYERSCORE @@ -522,13 +668,11 @@ RESETSCORE ************************************************** PROGRESSBAR - LDA PLAYERSCORE+1 ; score+1 = 0 to #99, divide by 8 to get 1-#14 + LDA PLAYERSCORE+1 ; score+1 = 0 to #99, divide by 4 to get 1-#26 CLC ROR ; divide by 2 CLC ROR ; 4 - CLC - ROR ; 8 STA PROGRESSBARL ; new length for progress bar ; draw baseline from border with *color* @@ -543,12 +687,11 @@ DRAWBAR LDA #$17 ; row 24 LDA PROGRESSBARL BEQ NOBAR CLC - ADC FIELDORIGIN STA PLOTCOLUMN -DRAWBARLOOP DEC PLOTCOLUMN +DRAWBARLOOP JSR PLOTQUICK ; PLOT CHAR - LDA PLOTCOLUMN ; last COLUMN? - CMP FIELDORIGIN + ;LDA PLOTCOLUMN ; last COLUMN? + DEC PLOTCOLUMN BNE DRAWBARLOOP ; draw next column of line NOBAR RTS @@ -619,12 +762,16 @@ RESETPROGRESS LDA #$00 ; reset progress LDA BLOCKCHAR ; if the pixel checked was blank, BEQ COLUMNSHORT ; done with the column + + DONECHECKING LDA #$01 ; at row 1? CMP ROW BNE CHECKROWLOOP ; loopty rows + + STA LOSEFLAG ; made it to ROW 1 - LOSE GAME ;/CHECKROWLOOP COLUMNSHORT LDA FIELDLEFT @@ -640,6 +787,90 @@ COLUMNSHORT LDA FIELDLEFT +************************************************** +* loops through columns/rows +* bumps each pixel up by one +************************************************** + +BUMPPIXELS + LDA #$0 + STA BUMPFLAG ; just do this once (for now) + +BUMPCOLUMN LDX FIELDRIGHT + DEX + DEX ; column 20 to 0 + STX COLUMN +BUMPCOLUMNLOOP DEC COLUMN + +BUMPROW LDA #$0 ; start at row 0 + STA ROW +BUMPROWLOOP INC ROW + + JSR BUMPPIXEL ; move pixels up by one + +DONEBUMPING + + LDA #$16 ; at row 22? + CMP ROW + BNE BUMPROWLOOP ; loopty rows +;/BUMPROWLOOP + +BUMPSHORT DEC COLUMN ; every other column + LDA FIELDLEFT + CLC + ADC #$02 ; at COLUMN 2? + CMP COLUMN + BNE BUMPCOLUMNLOOP ; loopty columns +;/BUMPCOLUMNLOOP + + + LDA #$16 ; row 23 needs random blocks + STA ROW +RANDCOLUMN LDX FIELDRIGHT + DEX + DEX ; column 20 to 0 + STX COLUMN +RANDCOLUMNLOOP DEC COLUMN + JSR RESETPIXEL + LDA #$55 ; shorten the playfield + STA CHAR ; store px color + JSR PLOTQUICK ; plot over pixel. + DEC PLOTCOLUMN + JSR PLOTQUICK ; plot over pixel. + DEC COLUMN + + LDA COLUMN + SEC + SBC #$02 + CMP FIELDLEFT + BNE RANDCOLUMNLOOP + + RTS +;/BUMPPIXELS + + + +************************************************** +* bumps each pixel up by one +************************************************** + +BUMPPIXEL JSR RESETPIXEL + + JSR GETCHAR ; current pixel value to A + STA BLOCKCHAR ; store current color + BNE BUMPINGPX ; not blank, check on. + RTS ; ==0, DONE CHECKING + +BUMPINGPX DEC PLOTROW ; go up 1 ROW + LDA BLOCKCHAR ; get pixel color + STA CHAR ; store px color + JSR PLOTQUICK ; plot over pixel above. + DEC PLOTCOLUMN + JSR PLOTQUICK ; plot over pixel-1 above. + + RTS + + ************************************************** * for each pixel position, checks neighbors for matches. @@ -649,8 +880,11 @@ CHECKPIXEL ; get pixel color JSR GETCHAR ; current pixel value to A STA BLOCKCHAR ; store current color + CMP #$55 + BEQ CHECKSHORT ; skip grey pixels. + LDA BLOCKCHAR BNE CHECKINGPX ; not blank, check on. - RTS ; ==0, DONE CHECKING +CHECKSHORT RTS ; ==0, DONE CHECKING CHECKINGPX CHECKABOVE DEC PLOTROW ; check above @@ -659,7 +893,6 @@ CHECKABOVE DEC PLOTROW ; check above BNE CHECKLEFT ; not equal, move on to check left side CLEARABOVE JSR CLEARBLOCKR INC PROGRESS - ;DEC SPEED CHECKUPLEFT JSR RESETPIXEL ; if the above pixel is a match, check diagonal DEC PLOTCOLUMN @@ -670,7 +903,6 @@ CHECKUPLEFT JSR RESETPIXEL ; if the above pixel is a match, check diagonal BNE CHECKLEFT CLEARUPLEFT JSR CLEARBLOCKR INC PROGRESS - ;DEC SPEED CHECKLEFT JSR RESETPIXEL @@ -681,7 +913,6 @@ CHECKLEFT JSR RESETPIXEL BNE CHECKPROGRESS ; not equal, skip checking left+1 CLEARLEFT JSR CLEARBLOCKR INC PROGRESS - ;DEC SPEED CHECKLEFT2 JSR RESETPIXEL DEC PLOTCOLUMN @@ -693,7 +924,6 @@ CHECKLEFT2 JSR RESETPIXEL BNE CHECKLEFTDOWN ; not equal, check diagonal CLEARLEFT2 JSR CLEARBLOCKR INC PROGRESS - ;DEC SPEED CHECKLEFTDOWN JSR RESETPIXEL DEC PLOTCOLUMN @@ -704,26 +934,38 @@ CHECKLEFTDOWN JSR RESETPIXEL BNE CHECKPROGRESS CLEARLEFTDOWN JSR CLEARBLOCKR INC PROGRESS - ;DEC SPEED CHECKPROGRESS LDA PROGRESS ; if PROGRESS then clear the check block, too BEQ DONECHECKINGPX - CMP #$03 ; if progress == 3, then clear both lines? + CMP #$02 ; if progress == 2, then drop a grey block on opponent + BNE COMBINE4 + LDX #$55 + STX NEXTBLOCK + +COMBINE4 CMP #$03 ; if progress == 3, then clear both lines? BNE CLEARBLOCK JSR CLEAR2LINES + INC BUMPFLAG ; move everything up 1 line on next go-around + ; this prevents confusion with which columns are + ; bumping/clearing + JSR INCSCORE10 ; bump up score by 10 JSR PROGRESSBAR JSR BONK CLEARBLOCK JSR RESETPIXEL JSR CLEARBLOCKR - ;DEC SPEED ; speed up with every successful cleared block? INC PROCESSING ; set the PROCESSING so we loop again JSR CLICK JSR INCSCORE - JSR PROGRESSBAR + JSR PROGRESSBAR + + INC SWITCHSIDE + + + DONECHECKINGPX RTS @@ -858,7 +1100,6 @@ PLOTQUICK STA $0 LDA LoLineTableH,Y STA $1 ; now word/pointer at $0+$1 points to line - ;JMP LOADQUICK LOADQUICK LDY PLOTCOLUMN @@ -886,7 +1127,6 @@ GETCHAR LDA LoLineTableL,Y STA $0 LDA LoLineTableH,Y - ;JMP STORECHAR STORECHAR STA $1 ; now word/pointer at $0+$1 points to line LDY PLOTCOLUMN @@ -915,18 +1155,15 @@ LEVELUP INC BORDERCOLOR ; change border to indicate level up ; make play field shorter, narrower with each levelup? ; add to difficulty? - INC FIELDLEFT - INC FIELDLEFT - DEC FIELDRIGHT - DEC FIELDRIGHT - - JSR DRAWBORDER + LDA SPEED ; Increase speed? SEC SBC #$10 STA SPEED + INC BUMPFLAG ; next frame, bump up the base. (oontz oontz) + JSR BUMPPIXELS ; bump pixels up if flagged SCOREDONE CLD ; clear decimal mode @@ -1060,7 +1297,8 @@ RND16 JSR RND ; limits RND output to 0-F ************************************************** ; Apple logo colors :) BLOCKCOLORS HEX 11,99,DD,CC,66,33,11,99,DD,CC,66,11,33,99,DD,CC - + HEX 11,99,DD,CC,66,33,11,99,DD,CC,66,11,33,99,DD,CC + ;Goes up to 16 - hard mode? ;BLOCKCOLORS HEX 11,22,33,44,55,66,77,88,99,AA,BB,CC,DD,EE,FF,11 @@ -1068,7 +1306,7 @@ BLOCKCOLORS HEX 11,99,DD,CC,66,33,11,99,DD,CC,66,11,33,99,DD,CC PLAYERSCORE HEX 00,00 -BORDERCOLORS HEX BB,77,88,EE,AA,FF,44,22,55 +BORDERCOLORS HEX BB,77,EE,AA,FF,44,22,33 **************************************************