00020 *BREAKOUT GAME - BY DAN PINAL 00030 *ZERO PAGE EQUATES 00F0: 00040 WINDOW EQ $F0 00F2: 00050 MSG EQ $F2 00F4: 00060 LINE2 EQ $F4 00F6: 00070 PO EQ $F6 00080 *MISC EQUATES 0014: 00090 RTCLOC EQ $14 0041: 00100 ATRACT EQ $41 0230: 00110 SDLSTL EQ $230 0278: 00120 STICKO EQ $278 0284: 00130 STRIGO EQ $284 D200: 00140 AUDF1 EQ $D200 PITCH I D201: 00150 AUDC1 EQ $D201 DISTORTION/VOLUME I D20A: 00160 RANDOM EQ $D20A E45C: 00170 SETVBV EQ $E45C SET VBLANK ROUTINE E462: 00180 XITVBV EQ $E462 DEFFERED VBLANK EXIT D01F: 00190 CONSOL EQ $D01F 00200 * EQUATES FOR CIO E456: 00210 CIOV EQ $E456 ; ENTRY VECTOR 00220 * COMMANDS * 0003: 00230 OPEN EQ $03 ; OPEN FOR INPUT/OUTPUT 0005: 00240 GETREC EQ $05 ; GET RECORD 0007: 00250 GETCHR EQ $07 ; GET CHARACTER(S) 0009: 00260 PUTREC EQ $09 ; PUT RECORD 000B: 00270 PUTCHR EQ $OB ; PUT CHARACTER(S) 000C: 00280 CLOSE EQ $OC ; CLOSE DEVICE 000D: 00290 STATIS EQ $01) ; STATUS REQUEST 000E: 00300 SPECIL EQ $OE ; BEGINNING OF SPECIAL ENTRY COMMANDS 00310 * 00320 * SPECIAL COMMANDS 00330 * 0011: 00340 DRAWLN EQ $11 ; DRAW LINE 0012: 00350 FILLIN EQ $12 ; DRAW LINE WITH RIGHT FILL 00360 * 00370 * AUX1 VALUES 00380 * 0001: 00390 APPEND EQ $01 OPEN FOR WRITE APPEND 0004: 00400 OPNIN EQ $04 OPEN FOR INPUT 0008: 00410 OPNOT EQ $08 OPEN FOR OUTPUT 000C: 00420 OPNINO EQ OPNIN+OPNOT OPEN FOR INPUT AND OUTPUT 0010: 00430 MXDMOD EQ $10 OPEN FOR MIXED MODE (E:,S:) 0020: 00440 INSCLR EQ $20 OPEN WITHOUT CLEARING SCREEN (E:,S:) 00450 * 00460 * O.S. RAM EQUATES 00470 *1/0 CONTROL BLOCK EQUATES 0054: 00480 ROWCRS EQ $54 CURRENT GRAPHICS CURSOR ROW 0055: 00490 COLCRS EQ $55 & $56. LSB MSB OF CURRENT GRAPHICS CURSOR COLUMN 02FB: 00500 ATACHR EQ $2FB LAST GRAPHICS CHARACTER READ OR WRITTEN 00510 * 0340: 00520 ICHID EQ $340 HANDLER INDEX SET BY O.S. 0341: 00530 ICDNO EQ $341 DEVICE # AS IN D1:,D2: ETC 0342: 00540 ICCOM EQ $342 COMMAND 0343: 00550 ICSTA EQ $343 STATUS RETURNED 0344: 00560 ICBAL EQ $344 BUFFER ADDRESS LO 0345: 00570 ICBAH EQ $345 BUFFER ADDRESS HI 0346: 00580 ICPTL EQ $346 PUT ONE BYTE VECTOR LO 0347: 00590 ICPTH EQ $347 PUT ONE BYTE VECTOR HI 0348: 00600 ICBLL EQ $348 BUFFER LENGTH LO 0349: 00610 ICBLH EQ $349 BUFFER LENGTH HI 034A: 00620 ICAUX1 EQ $34A AUXI 034B: 00630 ICAUX2 EQ $34B AUX2 00640 * 4000: 4C 30 42 00650 JMP START SKIP PAST SUBROUTINES 00660 * GRAPHICS CALLS TO O.S. 00670 * 00680 * GRAPHICS 00690 * ACC=GR. MODE 4003: 48 00700 GRAPHICS PHA SAVE MODE 4004: A2 60 00710 LDX #$60 IOCB #6 FOR GRAPHICS 4006: A9 0C 00720 LDA #CLOSE ;CLOSE #6 FOR SAFETY (CAN'T OPEN AN ALREADY OPEN DEVICE) 4008: 9D 42 03 00730 STA ICCOM,X 400B: 20 56 E4 00740 JSR CIOV 400E: A9 03 00750 LDA #OPEN 4010: 9D 42 03 00760 STA ICCOM,X 4013: A9 AC 00770 LDA #FNAME FILENAME IS S: 4015: 9D 44 03 00780 STA ICBAL,X 4018: A9 41 00790 LDA /FNAME 401A: 9D 45 03 00800 STA ICBAH,X 401D: 68 00810 PLA GR. MODE 401E: 9D 4B 03 00820 STA ICAUX2,X 4021: 29 F0 00830 AND #$F0 KEEP UPPER NIBBLE FOR FULLSCREEN 00835 ;& NO SCREEN ERASE FLAGS(+16 & +32) 00840 *O.S. FULL SCREEN FLAG IS THE OPPOSITE OF THE WAY BASIC USES IT. 00845 *i.e. +16 = SPLIT SCREEN NOT FULL SCREEN 4023: 49 10 00850 EOR #$10 FLIP-FLOP IT LIKE BASIC 4025: 09 0C 00860 ORA #OPNINO OPEN S: FOR READING & WRITING 4027: 9D 4A 03 00870 STA ICAUXI,X 402A: 4C 56 E4 00880 imp Clov GO DO IT IT WILL RTS FROM THERE 00890 ; 00900 * POSITION 00910 * EVEN THOUGH THIS IS SIMPLE IT IS HERE AS A SUBROUTINE 00920 * BECAUSE IT IS USED OFTEN BY OTHER ROUTINES 00930 * ACC. = VERT. 00940 * X = HORIZ. HI : Y HORIZ. LO 00950 POSITION 402D: 84 55 00960 STY COLCRS CURSOR COLUMN LO 402F: 86 56 00970 STX COLCFS+l ;CURSOR COLUMN HI 4031: 85 54 00980 STA ROWCRS ; CURSOR ROW 4033: 60 00990 RTS 01000 ; 01010 * PLOT 01020 * ENTRY REG. ARE SAME AS POSITION 01030 * WILL PLOT A POINT USING VALUE IN COLOR 01040 4034: 20 2D 40 01050 PLOT JSR POSITION 4037: A2 60 01060 LDX #$60 IOCB #6 4039: A9 0B 01070 LDA #PUTCHR 403B: 9D 42 03 01080 STA ICCOM,X 403E: A9 00 01090 LDA #$0 0 BUFFER LENGTH 4040: 9D 48 03 01100 STA ICBLL,X 4043: 9D 49 03 01110 STA ICBLH,X 4046: AD 15 42 01120 LDA COLOR CIO WILL DEFAULT TO VALUE IN ACC 4049: 4C 56 E4 01130 imp Ciov & SEND IT TO SCREEN (IT WILL RTS To PROGRAM FROM CIO 01140 01150 *DRAWTO 01160 * ENTRY SETUP SAME AS POSITION 404C: 20 2D 40 01170 DRAWTO JSR POSITION 404F: AD 15 42 01180 LDA COLOR 4052: 8D FB 02 01190 STA ATACHR TELL O.S. 4055: A2 60 01200 LDX #$60 IOCB #6 4057: A9 11 01210 LDA #DRAWLN DRAWTO HAS ITS OWN SPECIAL COMMAND 4059: 9D 42 03 01220 STA ICCOM,X 405C: A9 0C 01230 LDA #OPNINO 405E: 9D 4A 03 01240 STA ICAUXI,X; MAKE SURE O.S. KNOWS WHAT IT IS SUPPOSED TO DO 4061: A9 00 01250 LDA #$0 4063: 9D 4B 03 01260 STA ICAUX2,X 4066: 4C 56 E4 01270 imp CIOV GO DO IT & RTS TO PROGRAM FROM THERE 01280 01290 *LOCATE 01300 * SETUP SAME AS POSITION 01310 * ACC. & COLOR HAVE VALUE LOCATED 4069: 20 2D 40 01320 LOCATE JSR POSITION 406C: A2 60 01330 LDX #$60 IOCB #6 406E: A9 07 01340 LDA #GETCHR 4070: 9D 42 03 01350 STA ICCOM,X 4073: A9 00 01360 LDA #$0 0 OUT BUFFER LENGTH 4075: 9D 48 03 01370 STA ICBLL,X 4078: 9D 49 03 01380 STA ICBLH,X 407B: 20 56 E4 01390 JSR CIOV THIS WORKS EXACTLY THE OPPOSITE OF PLOT 407E: 8D 15 42 01400 STA COLOR 4081: 60 01410 RTS 01420 01430 * MISC. ROUTINES 01440 * 8 BIT DIVISION 01450 * X= NUM TO DIVIDE BY 01460 * A= LOBYTE OF NUM TO DIVIDE INTO 01470 * Y= HIBYTE OF NUM TO DIVIDE INTO 01480 * RESULT & REMAIN HAVE ANSWER ON EXIT 01490 * A=REMAINDER 4082: 8D 16 42 01500 DIVIDE STA RESULT 4085: 8E 18 42 01510 STX DIVISOR 4088: 98 01520 TYA 4089: A2 08 01530 LDX #$08 408B: 0E 16 42 01540 .1 ASL RESULT 408E: 2A 01550 ROL 408F: CD 18 42 01560 CMP DIVISOR 4092: 90 06 01570 BCC .2 4094: ED 18 42 01580 SBC DIVISOR 4097: EE 16 42 01590 INC RESULT 409A: CA 01600 .2 DEX 409B: D0 EE 01610 BNE .1 409D: 8D 17 42 01620 STA REMAIN 40A0: 60 01630 RTS 01640 ; 01650 * 8 BIT MULTIPLY 01660 * MULTIPLIES ACC BY X REG. 01670 * STORES RESULT (L,H) IN RESULT & RESULT+l 40A1: 8D 19 42 01680 MULTIPLY STA Ml MULTIPLIER 40A4: 8E 1A 42 01690 STX M2 MULTIPLICAND 40A7: A9 00 01700 LDA #$0 40A9: 8D 16 42 01710 STA RESULT 40AC: 8D 17 42 01720 STA RESULT+l 40AF: A2 08 01730 LDX #$08 40B1: 0E 16 42 01740 .1 ASL RESULT 40B4: 2E 17 42 01750 ROL RESULT+l 40B7: 0E 1A 42 01760 ASL M2 40BA: 90 0F 01770 BCC .2 40BC: 18 01780 CLC 40BD: AD 16 42 01790 LDA RESULT 40C0: 6D 19 42 01800 ADC MI 40C3: 8D 16 42 01810 STA RESULT 40C6: 90 03 01820 BCC .2 40C8: EE 17 42 01830 INC RESULT+l 40CB: CA 01840 .2 DEX 40CC: D0 E3 01850 BNE .1 40CE: 60 01860 RTS 01870 ; 40CF: A9 01 01880 NEWBALL LDA #$Ol BALL COLOR 40D1: 8D 15 42 01890 STA COLOR 40D4: 18 01900 CLC 40D5: AD 0A D2 01910 LDA RANDOM 40D8: 29 7F 01920 AND #$7F 0-128 40DA: 69 10 01930 ADC #$10 16-144 40DC: 8D 20 42 01940 STA BALLX; BALL HORIZ. POS. IS DOUBLED SO IT CAN BE MOVED IN HALF INC 40DF: 4A 01950 LSR /2 FOR ACTUAL BALL POSITION 40E0: 8D 25 42 01960 STA OLDX 40E3: A8 01970 TAY 40E4: A2 00 01980 LDX #$00 40E6: A9 11 01990 LDA #$11 17 40E8: 8D 21 42 02000 STA BALLY 40EB: 8D 26 42 02010 STA OLDY 40EE: 20 34 40 02020 JSR PLOT PUT NEW BALL STARTING POS. ON SCREEN 40F1: A9 01 02030 LDA #$Ol 40F3: 8D 23 42 02040 STA DY SET FOR DOWN 40F6: AD 0A D2 02050 LDA RANDOM 40F9: 29 03 02060 AND #$03 0-3 40FB: AA 02070 TAX 40FC: BD 0D 42 02080 LDA VX,X PICK RANDOM HORIZ. VECTOR 40FF: 8D 22 42 02090 STA DX SAVE IT 4102: A9 26 02100 LDA #$26 38 4104: 8D 27 42 02110 STA PADDLE REPOSITION TO MIDDLE OF SCREEN 4107: 20 17 41 02120 .1 JSR DOPADDLE 410A: AD 78 02 02130 LDA STICKO 410D: C9 0F 02140 CMP #$0F STICK CENTER? 410F: D0 F6 02150 BNE .1 WAIT TILL IT IS. 4111: AD 84 02 02160 LDA STRIGO BUTTON PRESSSED? 4114: D0 F1 02170 BNE .1 WAIT TILL TRIGGER PRESSED 4116: 60 02180 RTS 02190 4117: AE 78 02 02200 DOPADDLE LDX STICKO GET STICK VALUE 411A: AD 84 02 02210 LDA STRIGO BUTTON PRESSED 411D: D0 06 02220 BNE .1 USE NORMAL SPEED PADDLE MOVEMENT 411F: BD FD 41 02230 LDA FHOFFS,X TRIPLE SPEED TABLE 4122: 4C 28 41 02240 JMP .2 4125: BD ED 41 02250 .1 LDA HOFFS,X NORMAL SPEED TABLE 4128: A2 00 02260 .2 LDX #$00 PADDLE MINIMUM 412A: A0 4C 02270 LDY #$4C 76 PADDLE MAXIMUM 412C: 18 02280 CLC 412D: 6D 27 42 02290 ADC PADDLE 4130: 10 01 02300 BPL .3 4132: 8A 02310 TXA PADDLE H. CAN'T GO LESS THAN 0 SO SET IT TO 0 4133: C9 4D 02320 .3 CMP #$4D 77 GONE PAST UPPER LIMIT 4135: 90 01 02330 BCC .4 OK IF < 4137: 98 02340 TYA 4138: 8D 27 42 02350 .4 STA PADDLE 02360 * NOW ERASE OLD PADDLE & DRAW NEW 413B: A9 00 02370 * LDA #$00 413D: 8D 15 42 02380 * STA COLOR 4140: 20 52 41 02390 * JSR DRPADDLE 4143: AD 27 42 02400 * LDA PADDLE 4146: 8D 28 42 02410 * STA PX 4149: A9 01 02420 * LDA #$Ol 414B: 8D 15 42 02430 * STA COLOR 414E: 20 52 41 02440 * JSR DRPADDLE, 4 4151: 60 02450 * RTS 02460 02470 * DRAW PADDLE 4152: A9 24 02480 DRPADDLE LDA #$24 36TH ROW 4154: AC 28 42 02490 LDY PX PADDLE H. 4157: A2 00 02500 LDX #$00 HI BYTE OF PADDLE H. ALWAYS 0 UNLESS GR. 8 4159: 20 34 40 02510 JSR PLOT 415C: 18 02520 CLC 415D: AD 28 42 02530 LDA PX 4160: 69 03 02540 ADC #$03 END OF PADDLE IS PADDLE H. + 3 4162: A8 02550 TAY SET UP FOR DRAWTO CALL 4163: A2 00 02560 LDX #$00 4165: A9 24 02570 LDA #$24 4167: 20 4C 40 02580 JSR DRAWTO 416A: 60 02590 RTS 02600 02610 *EBRICK 02620 * ERASES BRICK ONE LINE AT A TIME 416B: A2 00 02630 EBRICK LDX #$00 416D: 8E 15 42 02640 STX COLOR 4170: AD 2C 42 02650 LDA BRICKY 4173: AC 2B 42 02660 LDY BRICKX 4176: 20 34 40 02670 JSR PLOT 4179: 18 02680 CLC 417A: AD 2B 42 02690 LDA BRICKX 417D: 69 04 02700 ADC #$04 417F: A8 02710 TAY 4180: A2 00 02720 LDX #$00 4182: AD 2C 42 02730 LDA BRICKY 4185: 20 4C 40 02740 JSR DRAWTO 4188: 60 02750 RTS 02760 * 4189: A5 14 02770 JDELAY LDA RTCLOC 418B: C5 14 02780 .1 CMP RTCLOC 418D: F0 FC 02790 BEQ .1 418F: CA 02800 DEX 4190: D0 F7 02810 BNE JDELAY 4192: 60 02820 RTS 02830 * 02840 * VBI ROUTINE IS USED SO SOUND DOES NOT INTERFERE WITH PLAY 02850 *VBI 4193: D8 02860 CLD 4194: AD 2F 42 02870 LDA TIMER SOUND TO DO 4197: F0 10 02880 BEQ XVBI NO. LEAVE 4199: CE 2F 42 02890 DEC TIMER COUNTDOWN 419C: AD 2F 42 02900 LDA TIMER USE TIMER AS VOLUME 419F: 09 A0 02910 ORA #$AO DISTORTION 10 41A1: 8D 01 D2 02920 STA AUDCI TELL POKEY 41A4: A9 20 02930 LDA #$20 41A6: 8D 00 D2 02940 STA AUDFI 02950 XVBI 41A9: 4C 62 E4 02960 JMP XITVBV 02970 * 02980 * PROGRAM DATA 02990 41AC: 53 3A 03000 FNAME AS "S:" 41AE: 9B 03010 HS 9B 41AF: 27 21 2D 41B2: 25 00 2F 41B5: 36 25 32 03020 MSGO AT "GAME OVER" 41B8: 00 30 25 41BB: 32 26 25 41BE: 23 34 01 03030 MSGI AT " PERFECT!" 41C1: AF 41 B8 41C4: 41 03040 MSGTAB DA MSGO,MSGI 41C5: 00 00 22 41C8: 21 2C 2C 41CB: 1A 00 10 41CE: 00 00 00 41D1: 00 00 00 41D4: 00 00 00 41D7: 00 00 03050 TOPLINE AT BALL: 0 41D9: 00 00 00 41DC: 00 00 00 41DF: 00 00 33 41E2: 23 2F 32 41E5: 25 1A 00 41E8: 10 10 10 41EB: 10 00 03060 AT SCORE: 0000 41ED: 00 00 00 41F0: 00 00 01 41F3: 01 01 03070 HOFFS HS 0000000000010101 41F5: 00 FF FF 41F8: FF 00 00 41FB: 00 00 03080 HS OOFFFFFF0OOOOOOO 41FD: 00 00 00 4200: 00 00 03 4203: 03 03 03090 FHOFFS HS 0000000000030303 4205: 00 FD FD 4208: FD 00 00 420B: 00 00 03100 HS OOFDFDFDOOOOOOOO 420D: FE FF 01 4210: 02 03110 VX HS FEFF0102 4211: 00 10 05 4214: 03 03120 POINTS HS 00100503 4215: 00 03130 COLOR BS 1 4216: 00 03140 RESULT BS 1 RESULT & REMAIN MUST STAY 4217: 00 03150 REMAIN BS 1 NEXT TO EACH OTHER 4218: 00 03160 DIVISOR BS 1 4219: 00 03170 MI BS 1 421A: 00 03180 M2 BS 1 421B: 00 03190 TEMPI BS 1 421C: 00 03200 TEMP2 BS 1 421D: 00 03210 TEMP3 BS 1 421E: 00 03220 TEMP4 BS 1 421F: 00 03230 ROW BS 1 4220: 00 03240 BALLX BS 1 ;BALL'S X POSITION (DOUBLED) 4221: 00 03250 BALLY BS 1 ;BALL'S Y POSITION 4222: 00 03260 DX BS 1 ;DOUBLED HORIZONTAL DIRECTION VALUE 4223: 00 03270 DY BS 1 ;VERTICAL DIRECTION VALUE 4224: 00 03280 TX BS 1 ;TRUE HORIZONTAL DIRECTION VALUE 4225: 00 03290 OLDX BS 1 ;BALL'S OLD HORIZ POSITION 4226: 00 03300 OLDY BS 1 ;BALL'S OLD VERTICAL POSITION 4227: 00 03310 PADDLE BS 1 ;HORIZ PADDLE POSITION 4228: 00 03320 PX BS 1 ;NEW HORIZ PADDLE POSITION 4229: 00 03330 BALLS BS 1 422A: 00 03340 BRICKS BS 1 422B: 00 03350 BRICKX BS 1 ;HORIZ POSITION OF BRICK TO BE REMOVED 422C: 00 03360 BRICKY BS 1 ;VERTICAL POSITION 422D: 00 00 03370 SCORE BS 2 422F: 00 03380 TIMER BS 1 03390 ; 03400 *BEGINNING OF 14AIN PROGRAM 4230: A9 07 03410 START LDA #$07 DEFFERED 4232: A0 93 03420 LDY #VBI 4234: A2 41 03430 LDX /VBI 4236: 20 5C E4 03440 JSR SETVBV ENABLE SOUND ROUTINE 4239: A9 05 03450 LDA #$05 START WITH GRAPHICS 5 423B: 20 03 40 03460 JSR GRAPHICS 423E: AD 30 02 03470 LDA SDLSTL FIND DISPLAY LIST 4241: 85 F6 03480 STA PO 4243: AD 31 02 03490 LDA SDLSTL+l 4246: 85 F7 03500 STA PO+l 4248: A0 2F 03510 LDY #$2F 424A: B1 F6 03520 LDA (PO),Y FIND OUT WHERE IT PUT TEXT WINDOW 424C: 85 F1 03530 STA WINDOW+l 424E: 85 F5 03540 STA LINE2+1 4250: 88 03550 DEY 4251: B1 F6 03560 LDA (PO),Y 4253: 85 F0 03570 STA WINDOW 4255: 18 03580 CLC 4256: 69 38 03590 ADC #$38 56 ALMOST HALFWAY INTO 2ND LINE OF TEXT WINDOW 4258: 85 F4 03600 STA LINE2 425A: 90 02 03610 BLT .1 425C: E6 F5 03620 INC LINE2+1 425E: A0 27 03630 .1 LDY #$27 39 4260: B9 C5 41 03640 .2 LDA TOPLINE,Y BLOCK MOVE THE TOPLINE INTO TEXT WINDOW 4263: 91 F0 03650 STA (WINDOW),Y 4265: 88 03660 DEY 4266: 10 F8 03670 BPL .2 03680 * NOW DRAW BRICKS 4268: A9 03 03690 DOBRICKS LDA #$03 426A: 8D 1B 42 03700 STA TEMPI 426D: AD 1B 42 03710 .1 LDA TEMPI 4270: 8D 15 42 03720 STA COLOR 4273: A9 02 03730 LDA #$02 4275: 8D 1C 42 03740 STA TEMP2 4278: AD 1B 42 03750 .2 LDA TEMPI 427B: 0A 03760 ASL X 2 427C: 0A 03770 ASL X 4 427D: 18 03780 CLC 427E: 6D 1C 42 03790 ADC TEMP2 4281: 8D 1F 42 03800 STA 4284: A9 02 03810 LDA #$02 4286: 8D 1D 42 03820 STA TEMP3 4289: AD 1F 42 03830 .3 LDA ROW 428C: A2 00 03840 LDX #$00 428E: A0 00 03850 LDY #$00 4290: 20 34 40 03860 JSR PLOT PLOT O,ROW 4293: AD 1F 42 03870 LDA ROW 4296: A2 00 03880 LDX #$0 4298: A0 4F 03890 LDY #$4F 79 429A: 20 4C 40 03900 JSR DRAWTO DRAWTO 79,ROW 429D: EE 1F 42 03910 INC ROW 42A0: CE 1D 42 03920 DEC TEMP3 42A3: D0 E4 03930 BNE .3 TWO ROWS PER BRICK 42A5: CE 1C 42 03940 DEC TEMP2 42A8: CE 1C 42 03950 DEC TEMP2 42AB: 10 CB 03960 BPL .2 TWO ROWS OF BRICKS PER COLOR 42AD: CE 1B 42 03970 DEC TEMPI 42B0: D0 BB 03980 BNE .1 3 COLORS OF BRICKS 42B2: A9 01 03990 LDA #$Ol 42B4: 8D 29 42 04000 STA BALLS 42B7: 09 10 04010 ORA #$10 MAKE INTERNERNAL CHR 42B9: A0 08 04020 LDY #$08 42BB: 91 F0 04030 STA (WINDOW),Y 42BD: A9 60 04040 LDA #$60 96 6 ROWS OF 16 BRICKS 42BF: 8D 2A 42 04050 STA BRICKS 42C2: A9 00 04060 LDA #$00 42C4: 8D 2D 42 04070 STA SCORE 42C7: 8D 2E 42 04080 STA SCORE+l 04090 * MAIN GAME LOOP BEGINS HERE 04100 * 42CA: 20 CF 40 04110 CAME JSR NEWBALL INITIALIZE NEW BALL DATA WAIT FOR BUTTON PRESS 42CD: A2 08 04120 GAMELDOP LDX #$08 42CF: 86 4D 04130 STX ATRACT 42D1: 20 89 41 04140 JSR JDELAY 42D4: 20 17 41 04150 JSR DOPADDLE UPDATE PADDLE POS. 04160 * GET NEW BALL POS. 42D7: 18 04170 DOBALL CLC 42D8: AD 20 42 04180 LDA BALLX 42DB: 6D 22 42 04190 ADC DX HORIZONTAL CHANCE. -2 TO +2 42DE: C9 F0 04200 CMP #$F0 42E0: 90 02 04210 BCC .0 42E2: A9 00 04220 LDA #$00 42E4: C9 A0 04230 .0 CMP #$AO 42E6: 90 02 04240 BCC .10 42E8: A9 9F 04250 LDA #$9F 42EA: 8D 20 42 04260 .10 STA BALLX 42ED: 4A 04270 LSR TRUE H. POS. 42EE: 8D 24 42 04280 STA TX 42F1: F0 04 04290 BEQ .1 42F3: C9 4F 04300 CMP #$4F 79 AT RIGHT EDGE? 42F5: 90 10 04310 BLT .2 OK IF 42F7: CE 22 42 04320 .1 DEC DX 42FA: AD 22 42 04330 LDA DX 42FD: 49 FF 04340 EOR #$FF REVERSE HORIZONTAL 42FF: 8D 22 42 04350 STA DX 4302: A9 10 04360 LDA #$10 4304: 8D 2F 42 04370 STA TIMER PING! 4307: 18 04380 .2 CLC 4308: AD 21 42 04390 LDA BALLY 430B: 6D 23 42 04400 ADC DY 430E: 8D 21 42 04410 STA BALLY 4311: C9 02 04420 CMP #$02 4313: B0 0C 04430 BGE .3 4315: A9 01 04440 LDA #$Ol AT TOP 4317: 8D 23 42 04450 STA DY SET VERTICAL DIRECTION TO DOWN 431A: A9 10 04460 LDA #$10 431C: 8D 2F 42 04470 STA TIMER PING! 431F: D0 07 04480 BNE HITCK BRANCH ALWAYS 4321: C9 27 04490 .3 CMP #$27 PAST PADDLE? 4323: 90 03 04500 BLT HITCK OK IF < 4325: 4C ED 43 04510 JMP ENDBALL 04520 ; ACC HAS V. 4328: A2 00 04530 HITCK LDX #$00 432A: AC 24 42 04540 LDY TX 432D: 20 69 40 04550 JSR LOCATE ACC. HAS COLOR VALUE OF PIXEL 4330: C9 00 04560 CMP #$00 4332: D0 03 04570 BNE .1 4334: 4C C4 43 04580 JMP XHITCK 4337; A0 10 04590 .1 LDY #$10 4339: 8C 2F 42 04600 STY TIMER PING! 433C: AC 21 42 04610 LDY BALLY 433F: C0 20 04620 CPY #$20 HAS IT HIT PADDLE OR BRICKS? 4341: 90 15 04630 BCC .2 BRICKS 4343: AD 24 42 04640 LDA TX COMPARE PADDLE H. TO BALL H. 4346: ED 28 42 04650 SBC PX DIFFERENCE IS 0-3 4349: AA 04660 TAX AND WILL DECIDE NEW HORIZ. VELOCITY 434A: BD 0D 42 04670 LDA VX,X 434D: 8D 22 42 04680 STA DX ;STORE NEW HORIZ VELOCITY 4350: A9 FF 04690 LDA #$FF 4352: 8D 23 42 04700 STA DY SET VERTICAL DIRECTION TO UP 4355: 4C C4 43 04710 JMP XHITCK LEAVE 04720 *ACC. STILL HAS COLOR VALUE HIT. USE IT TO GET BRICK VALUE 4358: AA 04730 .2 TAX 4359: F8 04740 SED 435A: AD 2E 42 04750 LDA SCORE+l ;LOAD TWO LOW DIGITS 435D: 7D 11 42 04760 ADC POINTS,X ;ADD POINT VALUE OF BRICK 4360: 8D 2E 42 04770 STA SCORE+l 4363: A9 00 04780 LDA #$00 ;WILL ALSO ADD CARRY BIT IF NECESSARY 4365: 6D 2D 42 04790 ADC SCORE 4368: 8D 2D 42 04800 STA SCORE 436B: D8 04810 CLD 04820 * NOW PRINT NEW SCORE ON SCREEN 04830 DOSCORE 436C: A2 00 04840 LDX #$00 436E: A0 23 04850 LDY #$23 4370: BD 2D 42 04860 .1 LDA SCORE,X 4373: 4A 04870 LSR EACH BYTE HOLDS 2 NUMBERS 4374: 4A 04880 LSR SHIFT UPPER NIBBLE OVER 4375: 4A 04890 LSR AND DO IT 4376: 4A 04900 LSR FIRST. 4377: 09 10 04910 ORA #$10 TRANSLATE NUMBER INTO INTERNAL CHARACTER 4379: 91 F0 04920 STA (WINDOW),Y ;STORE HIGHER DIGIT OF PAIR IN TEXT AREA 437B: C8 04930 INY ;NEXT 437C: BD 2D 42 04940 LDA SCORE,X 437F: 29 0F 04950 AND #$OF NOW DO LOWER NIBBLE 4381: 09 10 04960 ORA #$10 MAKE A CHR 4383: 91 F0 04970 STA (WINDOW),Y ;STORE LOWER DIGIT OF PAIR IN TEXT AREA 4385: C8 04980 INY 4386: E8 04990 INK 4387: E0 02 05000 CPX 002 DONE BOTH BYTES? (ALL 4 SCORE DIGITS) 4389: D0 E5 05010 BNE .1 05020 *NOW CALCULATE BRICK POSITION 05030 * BRICK HORIZONTAL IS THE INTEGER OF TX/5 438B: AD 24 42 05040 LDA TX 438E: A0 00 05050 LDY #$00 TX HAS NO HIBYTE SO Y=O 4390: A2 05 05060 LDX #$05 TO DIVIDE BY 4392: 20 82 40 05070 JSR DIVIDE 4395: AD 16 42 05080 LDA RESULT 4398: A2 05 05090 LDX #$05 439A: 20 A1 40 05100 JSR MULTIPLY 439D: AD 16 42 05110 LDA RESULT 43A0: 8D 2B 42 05120 STA BRICKX 43A3: AD 21 42 05130 LDA BALLY BALL VERT. 43A6: 4A 05140 LSR /2 43A7: 0A 05150 ASL X2 THIS INSURES AN EVEN NUMBER 43A8: 8D 2C 42 05160 STA BRICKY THE 'FOP OF ANY BRICK IS AN EVEN ROW. 43AB: 20 6B 41 05170 JSR EBRICK ERASE TOP 1,INE OF BRICK 43AE: EE 2C 42 05180 INC BRICKY BRICKS ARE 2 [,INES HIGH 43B1: 20 6B 41 05190 JSR EBRICK ERASE SECOND LINE 05200 * BRICK IS GONE 05210 * FLIP FLOP VERTICAL DIRECTION 43B4: CE 23 42 05220 DEC DY 43B7: AD 23 42 05230 LDA DY 43BA: 49 FF 05240 EOR #$FF 43BC: 8D 23 42 05250 STA DY 43BF: CE 2A 42 05260 DEC BRICKS ONE LESS BRICK 43C2: F0 4A 05270 BEQ ENDGAME IF ALL ARE GONE END GAME 05280 *XHITCK 43C4: A9 00 05290 LDA #$0 43C6: 8D 15 42 05300 STA COLOR 43C9: AD 26 42 05310 LDA OLDY 43CC: A2 00 05320 LDX #$00 43CE: AC 25 42 05330 LDY OLDX 43D1: 20 34 40 05340 JSR PLOT ERASE OLD BALL 43D4: A9 01 05350 LDA #$Ol 43D6: 8D 15 42 05360 STA COLOR 43D9: AD 21 42 05370 LDA BALLY 43DC: 8D 26 42 05380 STA OLDY 43DF: A2 00 05390 LDX #$00 43E1: AC 24 42 05400 LDY TX 43E4: 8C 25 42 05410 STY OLDX 43E7: 20 34 40 05420 JSR PLOT PUT BALL ON IN NEW POSITION 43EA: 4C CD 42 05430 JMP GAMELOOP DO IT AGAIN 43ED: A2 00 05440 ENDBALL LDX #$00 43EF: 8E 15 42 05450 STX COLOR 43F2: AC 25 42 05460 LDY OLDX 43F5: AD 26 42 05470 LDA OLDY 43F8: 20 34 40 05480 JSR PLOT ERASE BALL 43FB: EE 29 42 05490 INC BALLS 43FE: AD 29 42 05500 LDA BALLS 2-6 4401: C9 06 05510 CMP #$06 4403: B0 09 05520 BCS ENDGAME 4405: 09 10 05530 ORA #$10 MAKE INTO CHR. 4407: A0 08 05540 LDY #$08 4409: 91 F0 05550 STA (WINDOW),Y 440B: 4C CA 42 05560 JMP GAME GO BACK TO NEWBALL ROUTINE 05570 ENDGAME 440E: A2 00 05580 LDX #$00 4410: AD 2A 42 05590 LDA BRICKS 4413: D0 01 05600 BNE .1 4415: E8 05610 INX THEN 2ND MESSAGE 4416: 8A 05620 .1 TXA 4417: 0A 05630 ASL 4418: AA 05640 TAX 4419: BD C1 41 05650 LDA MSGTAB,X 441C: 85 F2 05660 STA MSG 441E: BD C2 41 05670 LDA MSGTAB+1,X 4421: 85 F3 05680 STA MSG+l 4423: A0 08 05690 LDY #$08 4425: B1 F2 05700 .2 LDA (MSG),Y 4427: 91 F4 05710 STA (LINE2),Y 4429: 88 05720 DEY 442A: 10 F9 05730 BPL .2 442C: AD 1F D0 05740 .3 LDA CONSOL 442F: C9 06 05750 CMP #$06 4431: D0 F9 05760 BNE .3 4433: 4C 30 42 05770 JMP START