00010 *LIST OFF 00020 ;"PONG" BY JIM BATTLE '82 --- 3/82 00030 ; 00040 ; 00050 ; 00060 ORG 7000H 00070 VIDEO EQU 3C00H 00080 CLS EQU 1C9H 00090 DELAY EQU 60H 00100 KBSCAN EQU 2BH 00110 PORT EQU 0FFH ;CASSETTE PORT 00120 WSPEED EQU 5 ;SPEED TO MOVE WALL 00130 ; 00140 ;========== INITIALIZATION =========== 00150 START LD SP,8000H ;TOP OF MEMORY 00160 CALL CLS ;CLEAR SCREEN 00170 CALL TITLE 00180 CALL CLS 00190 LD DE,MESSG 00200 LD HL,VIDEO 00210 CALL SCRIBE 00220 ISPD CALL KBSCAN ;GET KEY 00230 CP 1 ;? 00240 JR NZ,ISPD1 00250 CALL CLS 00260 JP 402DH ;TO "DOS READY" 00270 ISPD1 CP '1' 00280 JR C,ISPD 00290 CP '9'+1 00300 JR NC,ISPD 00310 LD (VIDEO+MESLEN),A 00320 SUB '0' 00330 LD (GAMSPD),A ;GAME SPEED 00340 ; 00350 ; 00360 LD DE,MESS2 00370 LD HL,VIDEO+64 00380 CALL SCRIBE ;"WALL OPTION?" 00390 IWALL CALL KBSCAN 00400 LD B,A 00410 CP 1 00420 JP Z,START ; 00430 CP 'Y' 00440 JR Z,IWALL1 00450 CP 'N' 00460 JR NZ,IWALL 00470 XOR A 00480 LD (USEWAL),A 00490 JR IWALL2 00500 IWALL1 LD A,1 00510 LD (USEWAL),A 00520 IWALL2 LD A,B 00530 LD (VIDEO+64+LEN2),A 00540 ; 00550 ; 00560 LD DE,MESS3 ;GET PADDLE SIZE 00570 LD HL,VIDEO+128 00580 CALL SCRIBE ;"PADDLE SIZE?" 00590 ISIZE CALL KBSCAN 00600 CP 1 ;? 00610 JP Z,START 00620 CP '1' 00630 JR C,ISIZE 00640 CP '5'+1 00650 JR NC,ISIZE 00660 LD (VIDEO+128+LEN3),A 00670 SUB '1' 00680 ADD A,A 00690 LD H,A 00700 ADD A,A 00710 ADD A,A 00720 ADD A,H 00730 LD H,0 00740 LD L,A ;HL=A*10 00750 LD BC,PTABLE 00760 ADD HL,BC 00770 LD (IYNDEX),HL ;FOR LATER REFERENCE 00780 ; 00790 ; 00800 LD D,2 00810 LUP LD BC,0 00820 CALL DELAY 00830 DEC D 00840 JR NZ,LUP 00850 LD HL,VIDEO 00860 LD DE,VIDEO+1 00870 LD BC,1023 00880 LD (HL),80H 00890 LDIR ;CLEAR SCREEN 00900 LD HL,VIDEO+960 ;BOTTOM LINE 00910 LD DE,VIDEO+961 00920 LD BC,63 00930 LD (HL),80H+1+2 00940 LDIR 00950 LD HL,VIDEO+64 ;SECOND LINE 00960 LD DE,VIDEO+65 00970 LD BC,63 00980 LD (HL),80H+16+32 00990 LDIR 01000 LD HL,VIDEO 01010 LD DE,MESS 01020 CALL SCRIBE ;PRINT "SCORE:" FOR #1 01030 LD HL,VIDEO+48 ;PLAYER 2 "SCORE" 01040 LD DE,MESS 01050 CALL SCRIBE 01060 LD DE,PONGW1 01070 LD HL,VIDEO+27 01080 CALL SCRIBE 01090 LD HL,VIDEO+91 01100 LD DE,PONGW2 01110 CALL SCRIBE ;WRITE "PONG" 01120 XOR A 01130 LD (SCORE1),A 01140 LD (SCORE2),A 01150 LD (CCYCLE),A ;WALL MOVE SPEED 01160 LD A,1 01170 LD (WALDIR),A 01180 LD HL,1 01190 LD (MOVYET),HL 01200 LD (CYCLE),A ;WALL POSITION 01210 LD IY,(IYNDEX) 01220 LD A,(IY) ;DRAW PADDLE #1 01230 LD (VIDEO+384),A 01240 LD A,(IY+1) 01250 LD (VIDEO+448),A 01260 LD A,(IY+2) 01270 LD (VIDEO+512),A 01280 ; 01290 LD A,(IY+3) ;DRAW PADDLE #2 01300 LD (VIDEO+447),A 01310 LD A,(IY+4) 01320 LD (VIDEO+511),A 01330 LD A,(IY+5) 01340 LD (VIDEO+575),A 01350 ; 01360 LD A,22 ;GRAPHIC ROW #22 01370 LD (PADL1),A 01380 LD (PADL2),A 01390 LD HL,18F7H ;INITIALIZE RND SEED 01400 LD DE,4080H 01410 LD BC,39 01420 LDIR 01430 CALL 1D3H ;RANDOMIZE SEED 01440 CALL SCORE ;PRINT ZEROS 01450 JP NEWBAL 01460 ; 01470 MESS DEFM 'SCORE:' 01480 DEFB 0 01490 MESSG DEFM 'WHAT GAME SPEED (1-9, 1=FAST)? ' 01500 DEFB 0 01510 MESLEN EQU $-MESSG 01520 ; 01530 MESS2 DEFM 'WALL OPTION (Y/N)? ' 01540 DEFB 0 01550 LEN2 EQU $-MESS2 01560 ; 01570 MESS3 DEFM 'PADDLE SIZE (1-5, 1=SMALL)? ' 01580 DEFB 0 01590 LEN3 EQU $-MESS3 01600 ; 01610 ;-------------------------------------------------------- 01620 ; 01630 ;GRAPHICS "PONG" 01640 PONGW1 DEFB 183 01650 DEFB 187 01660 DEFB 170 01670 DEFB 131 01680 DEFB 149 01690 DEFB 157 01700 DEFB 186 01710 DEFB 170 01720 DEFB 131 01730 DEFB 145 01740 DEFB 0 01750 ; 01760 PONGW2 DEFB 177 01770 DEFB 176 01780 DEFB 178 01790 DEFB 179 01800 DEFB 177 01810 DEFB 177 01820 DEFB 178 01830 DEFB 178 01840 DEFB 179 01850 DEFB 177 01860 DEFB 0 01870 ; 01880 ; 01890 ;-------------------------------------------------------- 01900 ;PADDLE SIZE INFORMATION. 01910 ;THE TABLE IS IN THE FOLLOWING FORMAT: 01920 ;IY+ 0:LEFT 01930 ; + 1:...PADDLE 01940 ; + 2:...CHARACTERS 01950 ; + 3:RIGHT 01960 ; + 4:...PADDLE 01970 ; + 5:...CHARACTERS 01980 ; + 6:LEAST PADDLE Y-COORDINATE 01990 ; + 7:MOST PADDLE Y-COORDINATE 02000 ; + 8:PADDLE SIZE*2 - 1 02010 ; + 9:PADDLE SIZE INPUT 02020 ; 02030 PTABLE DEFB 128 ;SIZE = 1 02040 DEFB 132 02050 DEFB 128 02060 DEFB 128 02070 DEFB 136 02080 DEFB 128 02090 DEFB 6 02100 DEFB 44 02110 DEFB 1 02120 DEFB 1 02130 ; 02140 DEFB 128 ;SIZE = 2 02150 DEFB 149 02160 DEFB 128 02170 DEFB 128 02180 DEFB 170 02190 DEFB 128 02200 DEFB 7 02210 DEFB 43 02220 DEFB 3 02230 DEFB 2 02240 ; 02250 DEFB 144 ;SIZE = 3 02260 DEFB 149 02270 DEFB 129 02280 DEFB 160 02290 DEFB 170 02300 DEFB 130 02310 DEFB 8 02320 DEFB 42 02330 DEFB 5 02340 DEFB 3 02350 ; 02360 DEFB 148 ;SIZE = 4 02370 DEFB 149 02380 DEFB 133 02390 DEFB 168 02400 DEFB 170 02410 DEFB 138 02420 DEFB 9 02430 DEFB 41 02440 DEFB 7 02450 DEFB 4 02460 ; 02470 DEFB 149 ;SIZE = 5 02480 DEFB 149 02490 DEFB 149 02500 DEFB 170 02510 DEFB 170 02520 DEFB 170 02530 DEFB 10 02540 DEFB 40 02550 DEFB 9 02560 DEFB 5 02570 ; 02580 ;-------------------------------------------------------- 02590 ; 02600 ;PRINT TITLE PAGE 02610 ; 02620 TITLE LD HL,PAGE 02630 LD DE,VIDEO 02640 LD BC,1024 02650 LDIR ;DRAW TITLE PAGE 02660 LD A,50 02670 LD (XBALL),A 02680 LD A,19 02690 LD (YBALL),A 02700 LD A,1 02710 LD (XDIREC),A 02720 LD (YDIREC),A 02730 ; 02740 LD A,20 ;OTHER BALL 02750 LD (XBALL2),A 02760 LD A,12 02770 LD (YBALL2),A 02780 LD A,1 02790 LD (XDIR2),A 02800 LD (YDIR2),A 02810 ; 02820 CALL KBSCAN ;IN CASE ONE IS WAITING 02830 TLOOP CALL BALMOV 02840 CALL SWAP 02850 CALL KBSCAN ;KEY HIT? 02860 OR A 02870 JR Z,TLOOP 02880 RET 02890 ; 02900 SWAP LD HL,(XBALL) ;H=YBALL, L=XBALL 02910 LD DE,(XBALL2) ;E=YBALL2, D=XBALL2 02920 LD (XBALL),DE ;SWAP 02930 LD (XBALL2),HL 02940 LD HL,(XDIREC) 02950 LD DE,(XDIR2) 02960 LD (XDIR2),HL 02970 LD (XDIREC),DE ;SWAP 02980 RET 02990 ; 03000 ; 03010 BALMOV LD A,(XBALL) 03020 LD B,A 03030 LD A,(YBALL) 03040 CALL RESET ;CLEAR BALL 03050 ; 03060 LD A,(XBALL) 03070 LD B,A 03080 LD A,(XDIREC) 03090 ADD A,B 03100 LD B,A 03110 LD (XBALL),A 03120 LD A,(YBALL) 03130 LD C,A 03140 LD A,(YDIREC) 03150 ADD A,C 03160 LD (YBALL),A 03170 CALL SET ;PRINT IN NEW POSITION 03180 ; 03190 ; SEE IF BALL NEEDS TO CHANGE DIRECTION: 03200 LD A,(XBALL) 03210 LD B,A 03220 LD A,(XDIREC) 03230 ADD A,B 03240 LD B,A 03250 LD A,(YBALL) 03260 CALL POINT 03270 JR NC,TITL1 03280 LD A,(XDIREC) 03290 NEG 03300 LD (XDIREC),A 03310 CALL HIGH 03320 ; 03330 TITL1 LD A,(XBALL) 03340 LD B,A 03350 LD A,(YBALL) 03360 LD C,A 03370 LD A,(YDIREC) 03380 ADD A,C 03390 CALL POINT 03400 JR NC,TITL2 03410 LD A,(YDIREC) 03420 NEG 03430 LD (YDIREC),A 03440 CALL LOW 03450 ; 03460 TITL2 LD BC,200H 03470 CALL DELAY 03480 RET 03490 ; 03500 ;-------------------------------------------------------- 03510 ; 03520 ;SEND (DE) TO CONSECUTIVE (HL) UNTIL 00 IS REACHED 03530 ; 03540 SCRIBE LD A,(DE) 03550 OR A 03560 RET Z 03570 LD (HL),A 03580 INC HL 03590 INC DE 03600 JR SCRIBE 03610 ; 03620 ;-------------------------------------------------------- 03630 ; 03640 ; 03650 ;PRINT SCORES IN THEIR PROPER PLACES 03660 ; 03670 SCORE PUSH HL 03680 PUSH DE 03690 PUSH BC 03700 PUSH AF 03710 LD A,(SCORE1) 03720 LD H,0 03730 LD L,A ;HL=(SCORE1) 03740 CALL 0A9AH ;PUT IN FPA1 03750 CALL 0FBDH ;CONVERT TO ASCII 03760 INC HL 03770 EX DE,HL 03780 LD HL,VIDEO+6 03790 CALL SCRIBE 03800 LD A,(SCORE2) 03810 LD H,0 03820 LD L,A ;HL=(SCORE2) 03830 CALL 0A9AH 03840 CALL 0FBDH ;CONVERT TO ASCII 03850 INC HL 03860 EX DE,HL 03870 LD HL,VIDEO+54 03880 CALL SCRIBE 03890 LD A,(SCORE1) ;END OF GAME? 03900 CP 15 03910 JP Z,LWIN 03920 LD A,(SCORE2) 03930 CP 15 03940 JP Z,RWIN 03950 POP AF 03960 POP BC 03970 POP DE 03980 POP HL 03990 RET 04000 ; 04010 ; 04020 LWIN LD HL,VIDEO+451 04030 JR DRAWW 04040 RWIN LD HL,VIDEO+486 04050 ; 04060 DRAWW LD B,5 ;FLASH 5 TIMES 04070 DRW1 PUSH BC 04080 PUSH HL 04090 LD D,H 04100 LD E,L 04110 INC DE 04120 LD (HL),80H 04130 LD BC,WINLEN 04140 LDIR ;ERASE TOP LINE 04150 POP HL 04160 PUSH HL 04170 LD DE,64 04180 ADD HL,DE 04190 LD D,H 04200 LD E,L 04210 INC DE 04220 LD (HL),80H 04230 LD BC,WINLEN 04240 LDIR ;ERASE LOWER LINE 04250 LD BC,0 04260 CALL DELAY 04270 POP HL 04280 ; 04290 PUSH HL 04300 LD DE,WINM1 ;GRAPHICS "WINNER" 04310 CALL SCRIBE 04320 POP HL 04330 PUSH HL 04340 LD DE,64 04350 ADD HL,DE 04360 LD DE,WINM2 04370 CALL SCRIBE 04380 POP HL 04390 ; 04400 LD BC,0 04410 CALL DELAY 04420 POP BC 04430 DJNZ DRW1 04440 ; 04450 LD D,5 04460 DRAWW2 LD BC,0 04470 CALL DELAY 04480 DEC D 04490 JR NZ,DRAWW2 04500 JP START 04510 ; 04520 ; 04530 ;GRAPHICS DATA FOR "WINNER" 04540 ; 04550 WINM1 DEFB 149 04560 DEFB 128 04570 DEFB 128 04580 DEFB 149 04590 DEFB 131 04600 DEFB 171 04610 DEFB 131 04620 DEFB 129 04630 DEFB 159 04640 DEFB 180 04650 DEFB 128 04660 DEFB 149 04670 DEFB 159 04680 DEFB 180 04690 DEFB 128 04700 DEFB 149 04710 DEFB 183 04720 DEFB 147 04730 DEFB 131 04740 DEFB 129 04750 DEFB 183 04760 DEFB 179 04770 DEFB 187 04780 DEFB 0 04790 ; 04800 WINM2 DEFB 181 04810 DEFB 134 04820 DEFB 164 04830 DEFB 149 04840 DEFB 176 04850 DEFB 186 04860 DEFB 176 04870 DEFB 144 04880 DEFB 149 04890 DEFB 130 04900 DEFB 173 04910 DEFB 149 04920 DEFB 149 04930 DEFB 130 04940 DEFB 173 04950 DEFB 149 04960 DEFB 181 04970 DEFB 176 04980 DEFB 176 04990 DEFB 144 05000 DEFB 149 05010 DEFB 138 05020 DEFB 180 05030 DEFB 0 05040 ; 05050 WINLEN EQU $-WINM2 05060 ; 05070 ;-------------------------------------------------------- 05080 ; 05090 ;SCAN THE KEYBOARD AND MOVE PADDLES IF KEYS HIT 05100 ; 05110 SCAN PUSH BC 05120 PUSH AF 05130 PUSH DE 05140 LD IY,(IYNDEX) 05150 LD A,(3840H) ;LOOK AT KEYS 05160 AND 24 ;PLAYER #1's KEYS 05170 JP PE,SCAN3 ;BOTH OR NEITHER 05180 AND 8 05190 LD A,(PADL1) 05200 JR Z,SCAN2 05210 ; 05220 CP (IY+6) ;UP ARROW IS HIT 05230 JR Z,SCAN3 ;AT TOP OF SCREEN? 05240 SUB (IY+9) 05250 LD B,0 05260 CALL SET 05270 ADD A,(IY+8) 05280 CALL RESET 05290 SUB (IY+9) 05300 LD (PADL1),A 05310 JR SCAN3 05320 ; 05330 SCAN2 CP (IY+7) ;DOWN ARROW IS HIT 05340 JR Z,SCAN3 ;AT BOTTOM ALREADY? 05350 ADD A,(IY+9) 05360 LD B,0 05370 CALL SET 05380 SUB (IY+8) 05390 CALL RESET 05400 ADD A,(IY+9) 05410 LD (PADL1),A 05420 ; 05430 SCAN3 LD A,(3840H) ;PLAYER #2's KEYS 05440 AND 66 05450 JP PE,SCAN5 ;BOTH OR NEITHER HIT 05460 AND 64 05470 LD A,(PADL2) 05480 JR Z,SCAN4 05490 CP (IY+6) ;UP KEY IS HIT 05500 JR Z,SCAN5 ;AT TOP ALREADY? 05510 LD B,127 05520 SUB (IY+9) 05530 CALL SET 05540 ADD A,(IY+8) 05550 CALL RESET 05560 SUB (IY+9) 05570 LD (PADL2),A 05580 JR SCAN5 05590 ; 05600 ; 05610 SCAN4 CP (IY+7) ;DOWN (CLEAR) KEY IS HIT 05620 JR Z,SCAN5 ;ALREADY THERE 05630 ADD A,(IY+9) 05640 LD B,127 05650 CALL SET 05660 SUB (IY+8) 05670 CALL RESET 05680 ADD A,(IY+9) 05690 LD (PADL2),A 05700 ; 05710 ; 05720 SCAN5 LD A,(GAMSPD) ;GAME SPEED 05730 LD D,A 05740 SCAN6 LD BC,100H 05750 CALL DELAY 05760 DEC D 05770 JR NZ,SCAN6 05780 LD A,(14400) ; HIT? 05790 AND 4 05800 JP NZ,START 05810 POP DE 05820 POP AF 05830 POP BC 05840 RET 05850 ; 05860 ;-------------------------------------------------------- 05870 ; 05880 SET PUSH IY 05890 PUSH HL 05900 PUSH DE 05910 PUSH BC 05920 PUSH AF 05930 LD HL,SET2 05940 PUSH HL ;SET RETURN ADDRESS 05950 LD HL,NULL 05960 LD C,A 05970 LD A,128 05980 PUSH AF ;INDICATE SET 05990 LD A,B 06000 PUSH AF ;SAVE X-COORDINATE 06010 LD A,C 06020 JP 150H ;PERFORM SET 06030 ; 06040 SET2 POP AF 06050 POP BC 06060 POP DE 06070 POP HL 06080 POP IY 06090 RET 06100 NULL DEFB ')' ;NEEDED FOR SYNTAX 06110 ; 06120 ; 06130 ;-------------------------------------------------------- 06140 ; 06150 RESET PUSH IY 06160 PUSH HL 06170 PUSH DE 06180 PUSH BC 06190 PUSH AF 06200 LD HL,RESET2 06210 PUSH HL ;RETURN ADDRESS 06220 LD HL,NULL 06230 LD C,A 06240 LD A,1 06250 PUSH AF ;INDICATE 'RESET' 06260 LD A,B 06270 PUSH AF ;X-COORDINATE 06280 LD A,C ;Y-COORDINATE 06290 JP 150H 06300 ; 06310 RESET2 POP AF 06320 POP BC 06330 POP DE 06340 POP HL 06350 POP IY 06360 RET 06370 ; 06380 ; 06390 ;-------------------------------------------------------- 06400 ; 06410 ;TEST IF POINT (B,A) IS SET. SET CARRY IF PIXEL SET. 06420 ; 06430 POINT PUSH BC 06440 PUSH DE 06450 PUSH HL 06460 PUSH IY 06470 LD HL,POINT1 06480 PUSH HL ;RETURN ADDRESS 06490 LD HL,NULL 06500 LD C,A 06510 XOR A 06520 PUSH AF ;INDICATE 'POINT' 06530 LD A,B 06540 PUSH AF ;X-COORDINATE 06550 LD A,C 06560 JP 150H ;PERFORM RESET 06570 ; 06580 POINT1 CALL 0A7FH ;CONVERT TO INTEGER 06590 LD A,(4122H) ;LSB 06600 CP 1 06610 CCF 06620 POP IY 06630 POP HL 06640 POP DE 06650 POP BC 06660 RET 06670 ; 06680 ; 06690 ;-------------------------------------------------------- 06700 ; 06710 ; DRAW A WALL FROM (IY) TO BOTTOM OF SCREEN 06720 ;... WITH (CYCLE) WALL POSITION 06730 ; 06740 WALL PUSH IY 06750 PUSH HL 06760 PUSH DE 06770 PUSH BC 06780 PUSH AF 06790 ; 06800 LD A,(USEWAL) ;OPTION ACTIVE? 06810 OR A 06820 JR Z,WEXIT 06830 ; 06840 LD HL,(MOVYET) ;CHANGE WALL DIRECTION? 06850 DEC HL 06860 LD (MOVYET),HL 06870 LD A,H 06880 OR L 06890 JR NZ,JR1 ;DOWN TO ZERO? 06900 LD A,(WALDIR) ;WALL DIRECTION 06910 NEG 06920 LD (WALDIR),A 06930 LD HL,1000 06940 CALL 0A9AH ;HL TO ACCUMULATOR 06950 CALL 14C9H ;RANDOMIZE 06960 CALL 0A7FH ;TO HL 06970 LD DE,100 06980 ADD HL,DE 06990 LD (MOVYET),HL 07000 ; 07010 JR1 LD A,(CCYCLE) ;TIME TO MOVE WALL? 07020 INC A 07030 LD (CCYCLE),A 07040 CP WSPEED 07050 JP NZ,JR3 07060 LD BC,120H ;DELAY 07070 CALL DELAY 07080 JP WEXIT 07090 ; 07100 JR3 XOR A 07110 LD (CCYCLE),A ;RESTORE COUNTER 07120 LD B,13 07130 LD A,(CYCLE) 07140 ADD A,A ;(CYCLE)*2 07150 LD D,0 07160 LD E,A 07170 LD HL,TABLE 07180 ADD HL,DE 07190 LD E,(HL) 07200 INC HL 07210 LD D,(HL) ;INDEX WALL DATA 07220 EX DE,HL 07230 LD DE,64 07240 ; 07250 WALL1 LD A,(HL) ;DRAW WALL 07260 INC HL 07270 LD (IY),A 07280 ADD IY,DE 07290 DJNZ WALL1 07300 ; 07310 LD A,(WALDIR) 07320 LD C,A 07330 LD A,(CYCLE) 07340 ADD A,C ;MOVE WALL DOWN (C=1) OR UP (C=FF) 07350 CP -1 07360 JR NZ,WALL2 07370 LD A,8 ;CYCLED BELOW ZERO 07380 JR WALL3 07390 WALL2 CP 9 07400 JR NZ,WALL3 07410 XOR A ;CYCLED PAST 9 07420 WALL3 LD (CYCLE),A 07430 ; 07440 WEXIT POP AF 07450 POP BC 07460 POP DE 07470 POP HL 07480 POP IY 07490 RET 07500 ; 07510 ; 07520 ;-------------------------------------------------------- 07530 ; 07540 ;INDEXING TABLE: 07550 ; 07560 TABLE DEFW LINE1 07570 DEFW LINE4 07580 DEFW LINE7 07590 DEFW LINE3 07600 DEFW LINE6 07610 DEFW LINE9 07620 DEFW LINE2 07630 DEFW LINE5 07640 DEFW LINE8 07650 ; 07660 ;-------------------------------------------------------- 07670 ; 07680 ;DATA INDEXED BY TABLE 07690 ; 07700 LINE1 DEFB 80H+1+4+16 07710 LINE2 DEFB 80H 07720 LINE3 DEFB 80H 07730 DEFB 80H+1+4+16 07740 DEFB 80H 07750 DEFB 80H 07760 DEFB 80H+1+4+16 07770 DEFB 80H 07780 DEFB 80H 07790 DEFB 80H+1+4+16 07800 DEFB 80H 07810 DEFB 80H 07820 DEFB 80H+1+4+16 07830 DEFB 80H 07840 DEFB 80H 07850 ; 07860 LINE4 DEFB 80H+4+16 07870 LINE5 DEFB 80H+1 07880 LINE6 DEFB 80H 07890 DEFB 80H+4+16 07900 DEFB 80H+1 07910 DEFB 80H 07920 DEFB 80H+4+16 07930 DEFB 80H+1 07940 DEFB 80H 07950 DEFB 80H+4+16 07960 DEFB 80H+1 07970 DEFB 80H 07980 DEFB 80H+4+16 07990 DEFB 80H+1 08000 DEFB 80H 08010 ; 08020 LINE7 DEFB 80H+16 08030 LINE8 DEFB 80H+1+4 08040 LINE9 DEFB 80H 08050 DEFB 80H+16 08060 DEFB 80H+1+4 08070 DEFB 80H 08080 DEFB 80H+16 08090 DEFB 80H+1+4 08100 DEFB 80H 08110 DEFB 80H+16 08120 DEFB 80H+1+4 08130 DEFB 80H 08140 DEFB 80H+16 08150 DEFB 80H+1+4 08160 DEFB 80H 08170 ; 08180 ;-------------------------------------------------------- 08190 ; 08200 NEWBAL LD D,100 ;DELAY A WHILE 08210 LOOP1 CALL SCAN 08220 LD IY,VIDEO+160 08230 CALL WALL 08240 DEC D 08250 JR NZ,LOOP1 08260 LD HL,25 08270 CALL 0A9AH ;SAVE RANGE 08280 CALL 14C9H ;MAKE INTEGER 08290 CALL 0A7FH 08300 LD A,L 08310 ADD A,10 ;(10< A <36) 08320 LD (YBALL),A ;SAVE Y-COORD OF BALL 08330 LD A,63 08340 LD (XBALL),A ;SAVE X-COORD OF BALL 08350 XOR A 08360 LD (RMNDR),A 08370 LD L,5 08380 CALL 0A9AH 08390 CALL 14C9H 08400 CALL 0A7FH 08410 LD A,L 08420 LD (SPEED),A ;(0< SPEED <6) 08430 LD L,2 08440 CALL 0A9AH 08450 CALL 14C9H 08460 CALL 0A7FH 08470 LD A,L 08480 CP 1 08490 JR NZ,BALLA 08500 LD (YDIREC),A ;SERVE DOWN 08510 JR BALL2 08520 BALLA LD A,-1 08530 LD (YDIREC),A ;SERVE UP 08540 BALL2 LD L,2 08550 CALL 0A9AH 08560 CALL 14C9H 08570 CALL 0A7FH 08580 LD A,L 08590 CP 1 08600 JR NZ,BALL3 08610 LD (XDIREC),A ;SERVE TO PLAYER #2 08620 JR BALL4 08630 BALL3 LD A,-1 08640 LD (XDIREC),A ;SERVE TO PLAYER #1 08650 ; 08660 BALL4 LD A,(XBALL) ;SET BALL 08670 LD B,A 08680 LD A,(YBALL) 08690 CALL SET 08700 ; 08710 ; 08720 LOOP CALL SCAN ;MOVE PADDLES 08730 LD IY,VIDEO+160 08740 CALL WALL 08750 LD A,(XBALL) 08760 LD B,A 08770 LD A,(YBALL) 08780 CALL RESET ;ERASE BALL 08790 LD A,(SPEED) 08800 LD B,A 08810 LD A,(RMNDR) 08820 INC A 08830 CP B 08840 JR Z,BALL5 08850 LD (RMNDR),A 08860 JR BALL6 08870 BALL5 XOR A ;INCREMENT Y-COORDINATE 08880 LD (RMNDR),A 08890 LD A,(YBALL) 08900 LD B,A 08910 LD A,(YDIREC) 08920 ADD A,B 08930 LD (YBALL),A 08940 BALL6 LD A,(XDIREC) ;UPDATE X-COORDINATE 08950 LD B,A 08960 LD A,(XBALL) 08970 ADD A,B 08980 LD (XBALL),A 08990 LD B,A 09000 LD A,(YBALL) 09010 CALL SET ;NEW BALL POSITION 09020 ; 09030 ; 09040 ;DID THE BALL HIT PLAYER #1's PADDLE? 09050 LD IY,(IYNDEX) 09060 LD A,(XBALL) 09070 LD B,A 09080 CP 1 09090 JR NZ,BALL9 09100 LD A,(PADL1) 09110 LD B,A 09120 LD A,(YBALL) 09130 SUB B 09140 JR NC,BALL7 09150 NEG 09160 BALL7 CP (IY+9) ;HIT OR MISS? 09170 JR C,BALL8 09180 LD A,(SCORE2) ;MISS 09190 INC A 09200 LD (SCORE2),A 09210 CALL SCORE ;UPDATE SCORE LINE 09220 CALL BUZZ 09230 LD B,1 09240 LD A,(YBALL) 09250 CALL RESET ;CLEAR BEFORE NEWBAL 09260 JP NEWBAL 09270 ; 09280 BALL8 LD A,1 09290 LD (XDIREC),A ;BOUNCE IT BACK 09300 LD A,(YBALL) 09310 LD B,A 09320 LD A,(PADL1) 09330 SUB B 09340 JR NC,BALLB 09350 NEG 09360 BALLB SRA A ;DIVIDE DIFFERENCE BY 2 09370 LD B,A 09380 LD A,(SPEED) 09390 SUB B 09400 LD (SPEED),A 09410 JR Z,BALLD 09420 CP 6 ;SPEED OK 09430 JR C,BALLE 09440 LD A,5 09450 LD (SPEED),A 09460 JR BALLE 09470 BALLD INC A 09480 LD (SPEED),A 09490 BALLE XOR A 09500 LD (RMNDR),A 09510 CALL HIGH ;TONE 09520 JP BORDER 09530 ; 09540 ; 09550 BALL9 CP 126 ;BALL HIT PADDLE #2? 09560 JP NZ,BALL12 09570 LD A,(PADL2) 09580 LD B,A 09590 LD A,(YBALL) 09600 SUB B 09610 JR NC,BALL10 09620 NEG 09630 BALL10 CP (IY+9) ;HIT OR MISS? 09640 JR C,BALL11 09650 LD A,(SCORE1) ;MISSED 09660 INC A 09670 LD (SCORE1),A 09680 CALL SCORE ;UPDATE SCORE LINE 09690 CALL BUZZ 09700 LD B,126 09710 LD A,(YBALL) 09720 CALL RESET 09730 JP NEWBAL 09740 ; 09750 ; 09760 BALL11 LD A,-1 ;HIT 09770 LD (XDIREC),A 09780 LD A,(YBALL) 09790 LD B,A 09800 LD A,(PADL2) 09810 SUB B 09820 JR NC,BALLC 09830 NEG 09840 BALLC SRA A ;DIVIDE BY 2 09850 LD B,A 09860 LD A,(SPEED) 09870 SUB B 09880 LD (SPEED),A 09890 JR Z,BALLF 09900 CP 6 09910 JR C,BALLG 09920 LD A,5 09930 LD (SPEED),A 09940 JR BALLG 09950 BALLF INC A 09960 LD (SPEED),A 09970 BALLG XOR A 09980 LD (RMNDR),A 09990 CALL HIGH 10000 JP BORDER 10010 ; 10020 ; 10030 BALL12 LD A,(XDIREC) ;HIT MIDDLE WALL? 10040 CP 1 10050 JR NZ,BALL13 10060 LD A,(XBALL) 10070 INC A 10080 LD B,A 10090 LD A,(YBALL) 10100 CALL POINT 10110 JR NC,BORDER 10120 LD A,-1 ;BOUNCE IT BACK 10130 LD (XDIREC),A 10140 CALL HIGH 10150 JP BORDER 10160 ; 10170 BALL13 LD A,(XDIREC) ;RIGHT TO LEFT MOTION 10180 CP -1 10190 JR NZ,BORDER 10200 LD A,(XBALL) 10210 DEC A 10220 LD B,A 10230 LD A,(YBALL) 10240 CALL POINT 10250 JR NC,BORDER 10260 LD A,1 ;BOUNCE IT BACK 10270 LD (XDIREC),A 10280 CALL HIGH 10290 ; 10300 BORDER LD A,(YBALL) ;SIDE WALL HIT? 10310 CP 6 10320 JR NZ,BALL14 10330 LD A,(YDIREC) ;GOING UP? 10340 CP -1 10350 JR NZ,BALL14 10360 LD A,1 10370 LD (YDIREC),A ;BOUNCE 10380 CALL LOW 10390 JP LOOP 10400 ; 10410 BALL14 CP 44 ;BOTTOM WALL BOUNCE? 10420 JP NZ,LOOP 10430 LD A,(YDIREC) ;GOING DOWN? 10440 CP 1 10450 JP NZ,LOOP 10460 LD A,-1 10470 LD (YDIREC),A 10480 CALL LOW 10490 JP LOOP 10500 ; 10510 ;-------------------------------------------------------- 10520 ; 10530 ;MAKE A BUZZING SOUND 10540 ; 10550 BUZZ LD B,0 10560 BUZZ1 LD A,1 10570 OUT (PORT),A 10580 LD A,100 10590 BUZZ2 NOP 10600 DEC A 10610 JR NZ,BUZZ2 10620 ; 10630 XOR A 10640 OUT (PORT),A 10650 LD A,100 10660 BUZZ3 NOP 10670 DEC A 10680 JR NZ,BUZZ3 10690 ; 10700 DJNZ BUZZ1 10710 RET 10720 ; 10730 ;-------------------------------------------------------- 10740 ; 10750 ;MAKE A HIGH TONE 10760 ; 10770 HIGH LD B,50 10780 HIGH1 LD A,1 10790 OUT (PORT),A 10800 LD A,25 10810 HIGH2 NOP 10820 DEC A 10830 JR NZ,HIGH2 10840 ; 10850 XOR A 10860 OUT (PORT),A 10870 LD A,25 10880 HIGH3 NOP 10890 DEC A 10900 JR NZ,HIGH3 10910 ; 10920 DJNZ HIGH1 10930 RET 10940 ; 10950 ;-------------------------------------------------------- 10960 ; 10970 ;MAKE A MID-RANGE TONE 10980 ; 10990 LOW LD B,25 11000 LOW1 LD A,1 11010 OUT (PORT),A 11020 LD A,45 11030 LOW2 NOP 11040 DEC A 11050 JR NZ,LOW2 11060 ; 11070 XOR A 11080 OUT (PORT),A 11090 LD A,45 11100 LOW3 NOP 11110 DEC A 11120 JR NZ,LOW3 11130 ; 11140 DJNZ LOW1 11150 RET 11160 ; 11170 ;-------------------------------------------------------- 11180 ; 11190 SCORE1 DEFB 0 11200 SCORE2 DEFB 0 11210 PADL1 DEFB 0 11220 PADL2 DEFB 0 11230 CYCLE DEFB 0 11240 XBALL DEFB 0 11250 YBALL DEFB 0 11260 XDIREC DEFB 0 11270 YDIREC DEFB 0 11280 SPEED DEFB 0 11290 RMNDR DEFB 0 11300 GAMSPD DEFB 0 11310 CCYCLE DEFB 0 11320 MOVYET DEFW 0 11330 WALDIR DEFB 0 11340 USEWAL DEFB 0 11350 IYNDEX DEFW 0 11360 XBALL2 DEFB 0 11370 YBALL2 DEFB 0 11380 XDIR2 DEFB 0 11390 YDIR2 DEFB 0 11400 *LIST ON 11410 PAGE EQU $ 11420 ; 11430 END START