rem 8 Tanks rem by Fort Apocalypse rem written in bB 1.5 rem A game for 8 players with a Quadtari and rem 4 sets of paddles, each player using the rem paddle button to control their tank. rem To compile: ensure you are in a directory rem that has the Quadtari DPCplus_kernel.asm rem from: rem https://atariage.com/forums/topic/316896-quadtari-sample-code-for-bb/ include div_mul.asm set kernel DPC+ set tv ntsc goto __Bank_2 bank2 bank 2 temp1=temp1 __Bank_2 rem Quadtari magic dim qtcontroller=y rem Quadtari detection for Stella data quadtari_detection $1B, $1F, $0B, $0E, $1E, $0B, $1C, $13 end DF4FRACINC = 0 pfcolors: $0E end DF6FRACINC = 0 bkcolors: $00 end scorecolors: $00 $00 $00 $00 $00 $00 $00 $00 end player0color: $44 $44 $44 $44 $44 $44 $44 $44 $44 $44 end player1color: $84 $84 $84 $84 $84 $84 $84 $84 $84 $84 end player2color: $CC $CC $CC $CC $CC $CC $CC $CC $CC $CC end player3color: $3E $3E $3E $3E $3E $3E $3E $3E $3E $3E end player4color: $FE $FE $FE $FE $FE $FE $FE $FE $FE $FE end player5color: $5A $5A $5A $5A $5A $5A $5A $5A $5A $5A end player6color: $AE $AE $AE $AE $AE $AE $AE $AE $AE $AE end player7color: $1E $1E $1E $1E $1E $1E $1E $1E $1E $1E end player8color: $A1 $A1 $A1 $A1 $A1 $A1 $A1 $A1 $A1 $A1 end player9color: $0E end DF0FRACINC = 128 ; Column 0. DF1FRACINC = 128 ; Column 1. DF2FRACINC = 128 ; Column 2. DF3FRACINC = 128 ; Column 3. const pfscore=1 dim player0dir=a dim player1dir=b dim player2dir=c dim player3dir=d dim player4dir=e dim player5dir=f dim player6dir=g dim player7dir=h rem persist button presses by setting bits on fires. rem for example, fires{0} is set to persist button press of player 0 dim fires=i dim b0dir=j dim b1dir=k dim b2dir=l dim b3dir=m dim timern=n dim b4dir=o dim b5dir=p dim b6dir=q dim b7dir=r dim bxalt1=s dim byalt1=t dim bxalt2=u dim byalt2=v dim bxalt3=w dim byalt3=x dim bxalt4=y dim byalt4=z goto __Bank_3 bank3 bank 3 temp1=temp1 __Bank_3 init1 missile0height=2 missile1height=2 ballheight=2 player9: %10000000 end playfield: .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. .X............................X. .X............................X. XX............................XX XX............................XX X.............X................X X.............X................X X.............X................X X.............X................X X.............X................X X.............X................X X.............X................X X.....X..........X......X......X X.....X..........X......X......X X.....X..........X......X......X X.....X..........X......X......X X.....XXX........X....XXX......X X.....XXX........X....XXX......X X.......X........X....X........X X.......X........X....X........X X.......X........XX...X........X X.......X........XX...X........X X.......X.............X........X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X.....................XXX......X X.....................XXX......X X.....XXX......................X X.....XXX......................X X..............................X X..............................X X.............X................X X.............X..........XXXX..X X........................XXXX..X X..............................X X..............................X X.....X...X.........XX.........X X.....X...X.........XX.........X X.....X...X.........X..........X X..XXXX...XX........X..........X X..XXXX...XX........X..........X X...................X..........X X...................X..........X X..............................X X................X.....XXXX....X X................X.....XXXX....X X................X........X....X X................X........X....X X....X..X.................X....X X....X..X................XX....X X....X..X................XX....X X....XXXX......................X X....XXXX......................X X...XX.........................X X...XX.........................X X..............................X X..............................X X..............................X X..............................X X..............XX..............X X.....X........XX........X.....X X.....X.........X........X.....X X.....X.........X........X.....X X.....X..................X.....X X.....X..................X.....X X.....X..................X.....X X.....X..................X.....X X.....X....X.......X.....X.....X X.....X....X.......X.....X.....X X.....XXX..X.......X...XXX.....X X.......X..X.......X...X.......X X.......X..X...X...X...X.......X X.......X..X...X...X...X.......X X..............X...............X X..............X...............X X..............X...............X X..............X...............X X..............X...............X XX.............X..............XX XX............................XX .X............................X. .X............................X. .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. end playfieldpos=8 initgame initround gosub player0home gosub player1home gosub player2home gosub player3home gosub player4home gosub player5home gosub player6home gosub player7home mainloop n=n+1 pfscorecolor=$9C rem Quadtari registers paddle buttons as joystick rem going left or right (corresponding to each paddle). rem you can only check two (pairs) at a time. rem the idea here is that you can control the tank rem by holding the button down to move forward or rem by releasing the button to turn clockwise. if qtcontroller then goto paddleset3and4 if joy0left then fires{0}=1 else player0dir=player0dir+1 : fires{0}=0 if joy0right then fires{1}=1 else player1dir=player1dir+1 : fires{1}=0 if joy1left then fires{2}=1 else player2dir=player2dir+1 : fires{2}=0 if joy1right then fires{3}=1 else player3dir=player3dir+1 : fires{3}=0 qtcontroller=1 AUDV1=0 goto aftercheckpaddles paddleset3and4 if joy0left then fires{4}=1 else player4dir=player4dir+1 : fires{4}=0 if joy0right then fires{5}=1 else player5dir=player5dir+1 : fires{5}=0 if joy1left then fires{6}=1 else player6dir=player6dir+1 : fires{6}=0 if joy1right then fires{7}=1 else player7dir=player7dir+1 : fires{7}=0 qtcontroller=0 AUDV0=0 aftercheckpaddles goto playerdirs bank4 afterplayerdirs temp5=ballx : temp6=bally : ballx=bxalt1 : bally=byalt1 : bxalt1=temp5 : byalt1=temp6 temp5=missile0x : temp6=missile0y : missile0x=bxalt2 : missile0y=byalt2 : bxalt2=temp5 : byalt2=temp6 temp5=missile1x : temp6=missile1y : missile1x=bxalt3 : missile1y=byalt3 : bxalt3=temp5 : byalt3=temp6 temp5=player9x : temp6=player9y : player9x=bxalt4 : player9y=byalt4 : bxalt4=temp5 : byalt4=temp6 if n&1=1 then goto bset2 if b0dir<8 then on b0dir gosub ballu ballur ballr balldr balld balldl balll ballul if b2dir<8 then on b2dir gosub missile0u missile0ur missile0r missile0dr missile0d missile0dl missile0l missile0ul if b4dir<8 then on b4dir gosub missile1u missile1ur missile1r missile1dr missile1d missile1dl missile1l missile1ul if b6dir<8 then on b6dir gosub player9u player9ur player9r player9dr player9d player9dr player9dl player9l player9ul goto afterbset bset2 if b1dir<8 then on b1dir gosub ballu ballur ballr balldr balld balldl balll ballul if b3dir<8 then on b3dir gosub missile0u missile0ur missile0r missile0dr missile0d missile0dl missile0l missile0ul if b5dir<8 then on b5dir gosub missile1u missile1ur missile1r missile1dr missile1d missile1dl missile1l missile1ul if b7dir<8 then on b7dir gosub player9u player9ur player9r player9dr player9d player9dr player9dl player9l player9ul afterbset gosub checkbounds if n&1=0 then gosub beven else gosub bodd drawscreen goto mainloop ballu bally=bally-4 return ballur ballx=ballx+2 : bally=bally-2 return ballr ballx=ballx+4 return balldr ballx=ballx+2 : bally=bally+2 return balld bally=bally+4 return balldl ballx=ballx-2 : bally=bally+2 return balll ballx=ballx-4 return ballul ballx=ballx-2 : bally=bally-2 return missile0u missile0y=missile0y-4 return missile0ur missile0x=missile0x+2 : missile0y=missile0y-2 return missile0r missile0x=missile0x+4 return missile0dr missile0x=missile0x+2 : missile0y=missile0y+2 return missile0d missile0y=missile0y+4 return missile0dl missile0x=missile0x-2 : missile0y=missile0y+2 return missile0l missile0x=missile0x-4 return missile0ul missile0x=missile0x-2 : missile0y=missile0y-2 return missile1u missile1y=missile1y-4 return missile1ur missile1x=missile1x+2 : missile1y=missile1y-2 return missile1r missile1x=missile1x+4 return missile1dr missile1x=missile1x+2 : missile1y=missile1y+2 return missile1d missile1y=missile1y+4 return missile1dl missile1x=missile1x-2 : missile1y=missile1y+2 return missile1l missile1x=missile1x-4 return missile1ul missile1x=missile1x-2 : missile1y=missile1y-2 return player9u player9y=player9y-4 return player9ur player9x=player9x+2 : player9y=player9y-2 return player9r player9x=player9x+4 return player9dr player9x=player9x+2 : player9y=player9y+2 return player9d player9y=player9y+4 return player9dl player9x=player9x-2 : player9y=player9y+2 return player9l player9x=player9x-4 return player9ul player9x=player9x-2 : player9y=player9y-2 return player0home player0x=52 : player0y=18 : player0dir=127 return player1home player1x=98 : player1y=18 : player1dir=127 return player2home player2x=123 : player2y=45 : player2dir=195 return player3home player3x=125 : player3y=125 : player3dir=195 return player4home player4x=98 : player4y=152 : player4dir=0 return player5home player5x=52 : player5y=152 : player5dir=0 return player6home player6x=27 : player6y=123 : player6dir=63 return player7home player7x=25 : player7y=45 : player7dir=63 return checkbounds if player0x<19 then player0x=19 if player1x<19 then player1x=19 if player2x<19 then player2x=19 if player3x<19 then player3x=19 if player4x<19 then player4x=19 if player5x<19 then player5x=19 if player6x<19 then player6x=19 if player7x<19 then player7x=19 if player0x>133 then player0x=133 if player1x>133 then player1x=133 if player2x>133 then player2x=133 if player3x>133 then player3x=133 if player4x>133 then player4x=133 if player5x>133 then player5x=133 if player6x>133 then player6x=133 if player7x>133 then player7x=133 if player0y<2 then player0y=2 if player1y<2 then player1y=2 if player2y<2 then player2y=2 if player3y<2 then player3y=2 if player4y<2 then player4y=2 if player5y<2 then player5y=2 if player6y<2 then player6y=2 if player7y<2 then player7y=2 if player0y>171 then player0y=171 if player1y>171 then player1y=171 if player2y>171 then player2y=171 if player3y>171 then player3y=171 if player4y>171 then player4y=171 if player5y>171 then player5y=171 if player6y>171 then player6y=171 if player7y>171 then player7y=171 return beven if ballx<19 || ballx>133 then bally=240 : b0dir=255 if missile0x<19 || missile0x>133 then missile0y=240 : b2dir=255 if missile1x<19 || missile1x>133 then missile1y=240 : b4dir=255 if player9x<19 || player9x>133 then player9y=240 : b6dir=255 if bally<1 || bally>171 then bally=240 : b0dir=255 if missile0y<1 || missile0y>171 then missile0y=240 : b2dir=255 if missile1y<1 || missile1y>171 then missile1y=240 : b4dir=255 if player9y<1 || player9y>171 then player9y=240 : b6dir=255 return bodd if ballx<19 || ballx>133 then bally=240 : b1dir=255 if missile0x<19 || missile0x>133 then missile0y=240 : b3dir=255 if missile1x<19 || missile1x>133 then missile1y=240 : b5dir=255 if player9x<19 || player9x>133 then player9y=240 : b7dir=255 if bally<1 || bally>171 then bally=240 : b1dir=255 if missile0y<1 || missile0y>171 then missile0y=240 : b3dir=255 if missile1y<1 || missile1y>171 then missile1y=240 : b5dir=255 if player9y<1 || player9y>171 then player9y=240 : b7dir=255 return goto __Bank_4 bank4 bank 4 temp1=temp1 __Bank_4 playerdirs temp5=player0dir/32 : temp4=player0x : temp7=player0y if temp5>4 then temp6=255 : REFP0=8 else temp6=1 if n&3>0 then goto afterdirplayer7 on temp5 goto player0u player0ur player0r player0dr player0d player0dr player0r player0ur afterdirplayer0 temp5=player1dir/32 : temp4=player1x : temp7=player1y if temp5>4 then temp6=255 : _NUSIZ1{3}=1 else temp6=1 : _NUSIZ1{3}=0 on temp5 goto player1u player1ur player1r player1dr player1d player1dr player1r player1ur afterdirplayer1 temp5=player2dir/32 : temp4=player2x : temp7=player2y if temp5>4 then temp6=255 : NUSIZ2{3}=1 else temp6=1 : NUSIZ2{3}=0 on temp5 goto player2u player2ur player2r player2dr player2d player2dr player2r player2ur afterdirplayer2 temp5=player3dir/32 : temp4=player3x : temp7=player3y if temp5>4 then temp6=255 : NUSIZ3{3}=1 else temp6=1 : NUSIZ3{3}=0 on temp5 goto player3u player3ur player3r player3dr player3d player3dr player3r player3ur afterdirplayer3 temp5=player4dir/32 : temp4=player4x : temp7=player4y if temp5>4 then temp6=255 : NUSIZ4{3}=1 else temp6=1 : NUSIZ4{3}=0 on temp5 goto player4u player4ur player4r player4dr player4d player4dr player4r player4ur afterdirplayer4 temp5=player5dir/32 : temp4=player5x : temp7=player5y if temp5>4 then temp6=255 : NUSIZ5{3}=1 else NUSIZ5{3}=0 on temp5 goto player5u player5ur player5r player5dr player5d player5dr player5r player5ur afterdirplayer5 temp5=player6dir/32 : temp4=player6x : temp7=player6y if temp5>4 then temp6=255 : NUSIZ6{3}=1 else temp6=1 : NUSIZ6{3}=0 on temp5 goto player6u player6ur player6r player6dr player6d player6dr player6r player6ur afterdirplayer6 temp5=player7dir/32 : temp4=player7x : temp7=player7y if temp5>4 then temp6=255 : NUSIZ7{3}=1 else temp6=1 : NUSIZ7{3}=0 on temp5 goto player7u player7ur player7r player7dr player7d player7dr player7r player7ur afterdirplayer7 goto afterplayerdirs bank3 player0u player0: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{0} then player0y=player0y-2 : gosub shoot0 goto afterdirplayer0 player0ur player0: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{0} then player0x=player0x+temp6 : player0y=player0y-1 : gosub shoot0 goto afterdirplayer0 player0r player0: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{0} then player0x=player0x+temp6+temp6 : gosub shoot0 goto afterdirplayer0 player0dr player0: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{0} then player0x=player0x+temp6 : player0y=player0y+1 : gosub shoot0 goto afterdirplayer0 player0d player0: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{0} then player0y=player0y+2 : gosub shoot0 goto afterdirplayer0 player1u player1: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{1} then player1y=player1y-2 : gosub shoot1 goto afterdirplayer1 player1ur player1: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{1} then player1x=player1x+temp6 : player1y=player1y-1 : gosub shoot1 goto afterdirplayer1 player1r player1: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{1} then player1x=player1x+temp6+temp6 : gosub shoot1 goto afterdirplayer1 player1dr player1: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{1} then player1x=player1x+temp6 : player1y=player1y+1 : gosub shoot1 goto afterdirplayer1 player1d player1: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{1} then player1y=player1y+2 : gosub shoot1 goto afterdirplayer1 player2u player2: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{2} then player2y=player2y-2 : gosub shoot2 goto afterdirplayer2 player2ur player2: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{2} then player2x=player2x+temp6 : player2y=player2y-1 : gosub shoot2 goto afterdirplayer2 player2r player2: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{2} then player2x=player2x+temp6+temp6 : gosub shoot2 goto afterdirplayer2 player2dr player2: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{2} then player2x=player2x+temp6 : player2y=player2y+1 : gosub shoot2 goto afterdirplayer2 player2d player2: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{2} then player2y=player2y+2 : gosub shoot2 goto afterdirplayer2 player3u player3: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{3} then player3y=player3y-2 : gosub shoot3 goto afterdirplayer3 player3ur player3: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{3} then player3x=player3x+temp6 : player3y=player3y-1 : gosub shoot3 goto afterdirplayer3 player3r player3: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{3} then player3x=player3x+temp6+temp6 : gosub shoot3 goto afterdirplayer3 player3dr player3: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{3} then player3x=player3x+temp6 : player3y=player3y+1 : gosub shoot3 goto afterdirplayer3 player3d player3: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{3} then player3y=player3y+2 : gosub shoot3 goto afterdirplayer3 player4u player4: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{4} then player4y=player4y-2 : gosub shoot4 goto afterdirplayer4 player4ur player4: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{4} then player4x=player4x+temp6 : player4y=player4y-1 : gosub shoot4 goto afterdirplayer4 player4r player4: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{4} then player4x=player4x+temp6+temp6 : gosub shoot4 goto afterdirplayer4 player4dr player4: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{4} then player4x=player4x+temp6 : player4y=player4y+1 : gosub shoot4 goto afterdirplayer4 player4d player4: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{4} then player4y=player4y+2 : gosub shoot4 goto afterdirplayer4 player5u player5: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{5} then player5y=player5y-2 : gosub shoot5 goto afterdirplayer5 player5ur player5: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{5} then player5x=player5x+temp6 : player5y=player5y-1 : gosub shoot5 goto afterdirplayer5 player5r player5: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{5} then player5x=player5x+temp6+temp6 : gosub shoot5 goto afterdirplayer5 player5dr player5: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{5} then player5x=player5x+temp6 : player5y=player5y+1 : gosub shoot5 goto afterdirplayer5 player5d player5: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{5} then player5y=player5y+2 : gosub shoot5 goto afterdirplayer5 player6u player6: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{6} then player6y=player6y-2 : gosub shoot6 goto afterdirplayer6 player6ur player6: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{6} then player6x=player6x+temp6 : player6y=player6y-1 : gosub shoot6 goto afterdirplayer6 player6r player6: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{6} then player6x=player6x+temp6+temp6 : gosub shoot6 goto afterdirplayer6 player6dr player6: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{6} then player6x=player6x+temp6 : player6y=player6y+1 : gosub shoot6 goto afterdirplayer6 player6d player6: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{6} then player6y=player6y+2 : gosub shoot6 goto afterdirplayer6 player7u player7: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{7} then player7y=player7y-2 : gosub shoot7 goto afterdirplayer7 player7ur player7: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{7} then player7x=player7x+temp6 : player7y=player7y-1 : gosub shoot7 goto afterdirplayer7 player7r player7: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{7} then player7x=player7x+temp6+temp6 : gosub shoot7 goto afterdirplayer7 player7dr player7: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{7} then player7x=player7x+temp6 : player7y=player7y+1 : gosub shoot7 goto afterdirplayer7 player7d player7: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{7} then player7y=player7y+2 : gosub shoot7 goto afterdirplayer7 rem for the shoot subroutines: rem temp5 is the 0-7 direction. temp4,temp7 is x,y of firing location. shoot0 if b0dir<255 then return AUDC0=8 : AUDF0=n : AUDV0=8 b0dir=temp5 if bally=240 then ballx=temp4+5 : bally=temp7+2 : return if byalt1=240 then bxalt1=temp4+5 : byalt1=temp7+2 : return return shoot1 if b1dir<255 then return AUDC1=8 : AUDF1=n+4 : AUDV1=8 b1dir=temp5 if bally=240 then ballx=temp4+5 : bally=temp7+2 : return if byalt1=240 then bxalt1=temp4+5 : byalt1=temp7+2 : return return shoot2 if b2dir<255 then return AUDC0=8 : AUDF0=n+8 : AUDV0=8 b2dir=temp5 if missile0y=240 then missile0x=temp4+5 : missile0y=temp7+2 : return if byalt2=240 then bxalt2=temp4+5 : byalt2=temp7+2 : return return shoot3 if b3dir<255 then return AUDC1=8 : AUDF1=n+12 : AUDV1=8 b3dir=temp5 if missile0y=240 then missile0x=temp4+5 : missile0y=temp7+2 : return if byalt2=240 then bxalt2=temp4+5 : byalt2=temp7+2 : return return shoot4 if b4dir<255 then return AUDC0=8 : AUDF0=n+16 : AUDV0=8 b4dir=temp5 if missile1y=240 then missile1x=temp4+5 : missile1y=temp7+2 : return if byalt3=240 then bxalt3=temp4+5 : byalt3=temp7+2 : return return shoot5 if b5dir<255 then return AUDC1=8 : AUDF1=n+20 : AUDV1=8 b5dir=temp5 if missile1y=240 then missile1x=temp4+5 : missile1y=temp7+2 : return if byalt3=240 then bxalt3=temp4+5 : byalt3=temp7+2 : return return shoot6 if b6dir<255 then return AUDC0=8 : AUDF0=n+24 : AUDV0=8 b6dir=temp5 if player9y=240 then player9x=temp4+5 : player9y=temp7+2 : return if byalt4=240 then bxalt4=temp4+5 : byalt4=temp7+2 : return return shoot7 if b7dir<255 then return AUDC1=8 : AUDF1=n+28 : AUDV1=8 b7dir=temp5 if player9y=240 then player9x=temp4+5 : player9y=temp7+2 : return if byalt4=240 then bxalt4=temp4+5 : byalt4=temp7+2 : return return