the cutting room mirror

3D Tennis (MSX)

This article has a talk page!
view on tcrf.net

This page contains notes for the game 3D Tennis (MSX).

MSX-BASIC Listing#

This is the de-tokenized form of the MSX-BASIC code contained in the ROM.

1000 '********************************
1010 '***                          ***
1020 '*** Three dimensional tennis ***
1030 '***                          ***
1040 '*** Copyright (C) 1983 by    ***
1050 '*** ASCII / Toshiki Fujiwara ***
1060 '***                          ***
1070 '***  Any code in  this  pro- ***
1080 '*** gram  may  not  be  used ***
1090 '*** in any form without per- ***
1100 '*** missions.                ***
1110 '***                          ***
1120 '********************************
1130 '
1140 CLEAR 300:DEFSNG A-Z
1150 SCREEN 0,0,0,2,0:WIDTH 38
1160 DIM RF%(3),SC$(2),GF$(2),SL%(2),SR%(2),KN$(3),KC%(3)
1170 RF%(0)=1:RF%(1)=2:RF%(2)=3:RF%(3)=2
1180 TRUE%=(0=0):FALSE%=NOT TRUE%
1190 KN$(0)="WDSAQ ·°"
1200 KN$(1)="¶°¿Ù ·°"
1210 KN$(2)="ŒÞ®²œÃš¯ž #1"
1220 KN$(3)="ŒÞ®²œÃš¯ž #2"
1230 KEY 1,"screen0:width40"
1240 KEY 6,"color 1,11,11"+CHR$(13)
1250 KEY OFF
1260 DM=RND(-TIME)
1270 OPEN "GRP:" AS #1
1280 TM$="A GAME BY ASCII (C) 1983"
1290 PLAY "V15","V15","V15"
1300 '
1310 'Define USR functions
1320 DEFUSR0=&HB000:'Call subroutine
1330 DEFUSR1=&HB003:'Setup sprite
1340 DEFUSR2=&HB006:'Setup PCG pattern
1350 DEFUSR3=&HB009:'Setup player, ball
1360 DEFUSR4=&HB00C:'Write score board
1370 DEFUSR5=&HB00F:'Main loop
2000 '
2010 '******************
2020 '* Demonstrations *
2030 '******************
2040 SCREEN 2,2:COLOR 1,11,11:CLS
2050 PLAY"V15","V15","V15":DM%=USR1(0)
2060 ON STRIG GOSUB 4270,4270,4270
2070 STRIG(0) ON:STRIG(1) ON:STRIG(2) ON
2080 FOR I%=0 TO 6
2090 C%=2+2*I%
2100 SP%=1+4*I%
2110 XF%=170-24*I%
2120 Y%=20*I%
2130 FOR X%=-64 TO XF% STEP 8
2140 IF X%+48<0 THEN 22828
2150 IF X%+32<0 THEN 22828
2160 IF X%+16<0 THEN 22828
2170 PUT SPRITE SP%,(X%,Y%),1,11
2180 PUT SPRITE SP%+1,(X%+16,Y%),C%,12
2190 PUT SPRITE SP%+2,(X%+32,Y%),C%,13
2200 PUT SPRITE SP%+3,(X%+48,Y%),C%,14
2210 NEXT X%
2220 LINE(XF%,Y%+17)-(XF%+63,Y%+17),1
2230 NEXT I%
2240 '
2250 COLOR 4
2260 XI%=0:XL%=240:MD%=0:GOSUB 41274
2270 COLOR 1
2280 XI%=240:XL%=150:MD%=1:GOSUB 41274
2290 PUT SPRITE 30,(150,160),1,1
2300 TI%=0:TL%=-80:X%=256:SP%=0:GOSUB 61984
2310 TI%=80:TL%=70:X%=95:GOSUB 61984
2320 PUT SPRITE 30,(150,160),1,4
2330 FOR W%=1 TO 10:NEXT W%
2340 PUT SPRITE 30,(150,160),1,5
2350 FOR T%=157 TO 248
2360 PUT SPRITE 31,(T%,166),15,0
2370 NEXT T%
2380 XI%=150:XL%=0:MD%=1:GOSUB 41274
2390 PUT SPRITE 30,(0,209)
2400 TI%=0:TL%=-80:X%=256:SP%=15:GOSUB 61984
2410 TI%=80:X%=96:GOSUB 61984
2420 TL%=50:X%=-64:GOSUB 61984
2430 PUT SPRITE 31,(0,209)
3000 '
3010 '********************
3020 '* Select game mode *
3030 '********************
3040 STOP OFF
3050 PUT SPRITE 30,(209,0)
3060 PUT SPRITE 31,(209,0)
3070 LINE(0,140)-(255,191),11,BF
3080 GOSUB 8758
3090 PSET(5,148),11
3100 COLOR 12:PRINT #1,"ÌßÚ²Ô° Ó°ÄÞ † œã’ œã ˜àޛ’¡";
3110 PSET(20,160),11
3120 COLOR 1:PRINT #1,"[1]";
3130 COLOR 6:PRINT #1," ŒÝžÞÙœ: ";
3140 COLOR 1:PRINT #1,"MSX VS æý™Þý";
3150 PSET(20,168),11
3160 PRINT #1,"[2]";
3170 COLOR 6:PRINT #1," ŒÝžÞÙœ: ";
3180 COLOR 1:PRINT #1,"æý™Þý VS æý™Þý";
3190 PSET(20,176),11
3200 PRINT #1,"[3]";
3210 COLOR 6:PRINT #1," ÀÞÌÞÙœ: ";
3220 COLOR 1:PRINT #1,"æý™Þý ìàø äޓœ";
3230 '
3240 PM%=2:IT=TIME
3250 PUT SPRITE 31,(10,152+8*PM%),4,17
3260 IF TIME-IT>500 THEN 36571
3270 GOSUB 65312:IF TP% THEN 19792
3280 GOSUB 61481:IF DR%=0 THEN 40960
3290 FOR W%=1 TO 100:NEXT W%
3300 IF DR%=1 THEN PM%=PM%-1:IF PM%<1 THEN PM%=1
3310 IF DR%=5 THEN PM%=PM%+1:IF PM%>3 THEN PM%=3
3320 GOTO 19792
3330 '
3340 PLAY"L32O5C":POKE &HEF00,PM%
3350 PUT SPRITE 31,(209,0)
3360 LINE(0,140)-(255,191),11,BF
3370 GOSUB 8758
3380 PSET(2,140),11:COLOR 1
3390 PRINT #1,"ŒÞ®²œÃš¯ž † ”÷ýãÞ ˜àޛ’¡";
3400 ON PM% GOSUB 14996,8337,10533
3410 FOR W%=1 TO 500:NEXT W%
3420 '
3430 LINE(0,140)-(255,191),11,BF
3440 GOSUB 8758
3450 PSET(5,140),11
3460 PRINT #1,"ÎÞ°Ù é œËß°ÄÞ † ”÷ýãÞ ˜àޛ’¡";
3470 PSET(4,152),11
3480 PRINT #1,"(•Ÿ’)                    (êô’)";
3490 PSET(20,160),11
3500 PRINT #1,"1    2    3    4    5    6";
3510 PSET(20,168),11
3520 PRINT #1,"�T�W�W�W�W�U�W�W�W�W�U�W�W�W�W�U�W�W�W�W�U�W�W�W�W�S";
3530 DF%=11
3540 LINE(20,176)-(107,183),4,BF
3550 '
3560 FOR W%=1 TO 50:NEXT W%
3570 GOSUB 65312:IF TP% THEN 14866
3580 GOSUB 61481:IF DR%=0 THEN 24832
3590 IF DR%=7 THEN 3640
3600 IF DR%=3 THEN 27278
3610 GOTO 24832
3620 '
3630 IF DF%=1 THEN 24832
3640 DF%=DF%-1:X0%=20+8*DF%:Y0%=176
3650 LINE(X0%,Y0%)-(X0%+7,Y0%+7),11,BF
3660 GOTO 24832
3670 '
3680 IF DF%=26 THEN 24832
3690 DF%=DF%+1:X0%=12+8*DF%:Y0%=176
3700 LINE(X0%,Y0%)-(X0%+7,Y0%+7),4,BF
3710 GOTO 24832
3720 '
3730 PLAY"L32O5C":POKE &HEF0F,1:POKE &HEF10,26-DF%
3740 GOTO 22784
3750 '
3760 PM%=0:POKE &HEF00,PM%
3770 DF%=26:GOTO 14866
4000 '
4010 '************************
4020 '* Group of subroutines *
4030 '************************
4040 FOR T%=TI% TO TL% STEP -1
4050 Y%=-T%*T%/320+20
4060 PUT SPRITE 31,(X%+T%,170-Y%),15,SP%
4070 NEXT T%
4080 RETURN
4090 '
4100 IF MD%=0 THEN ST%=4 ELSE ST%=-4
4110 FOR X%=XI% TO XL% STEP ST%
4120 SP%=RF%((X%\4)MOD4)+MD%*5
4130 PUT SPRITE 30,(X%,160),1,SP%
4140 ON MD%+1 GOSUB 11,22767
4150 NEXT X%
4160 RETURN
4170 '
4180 PSET(8*(X%\8),160),11
4190 IF X%<8 THEN 61221
4200 PRINT #1,MID$(TM$,X%\8,1);
4210 RETURN
4220 '
4230 X1%=8*(X%\8):X2%=X1%+7
4240 LINE(X1%,160)-(X2%,167),11,BF
4250 RETURN
4260 '
4270 STRIG(0) OFF:STRIG(1) OFF:STRIG(2) OFF
4280 RETURN 53519
4290 '
4300 P0%=0:P1%=0:P2%=0:P3%=0
4310 GOTO 3084
4320 '
4330 PSET(10,150),11:GOSUB 28962:P1%=PN%
4340 PLAY"L32O5C":PRINT #1,"‘åàê ";KN$(P1%);" ãÞ ¹Þ°Ñ œï¡";
4350 P0%=0:P2%=0:P3%=0:GOTO 3084
4360 '
4370 PSET(10,150),11
4380 PRINT #1,"ëàÞø–Þü ÌßÚ²Ô°: ";
4390 GOSUB 28962:P0%=PN%
4400 PLAY"L32O5C":PRINT #1,KN$(P0%);
4410 PSET(10,158),11
4420 PRINT #1," ð—Þ–Þü ÌßÚ²Ô°: ";
4430 GOSUB 28962:P1%=PN%:IF P0%=P1% THEN 12368
4440 PLAY"L32O5C":PRINT #1,KN$(P1%);
4450 P2%=0:P3%=0:GOTO 3084
4460 '
4470 FOR I%=0 TO 3:KC%(I%)=0:NEXT I%
4480 PSET(10,150),11
4490 PRINT #1,"ëàÞø àޒ1 ÌßÚ²Ô°: ";
4500 GOSUB 28962:P0%=PN%
4510 PLAY"L32O5C":PRINT #1,KN$(P0%);:KC%(P0%)=1
4520 PSET(10,158),11
4530 PRINT #1," ð—Þ àޒ1 ÌßÚ²Ô°: ";
4540 GOSUB 28962:P1%=PN%:IF P0%=P1% THEN 12368
4550 PLAY"L32O5C":PRINT #1,KN$(P1%);:KC%(P1%)=1
4560 PSET(10,166),11
4570 PRINT #1,"ëàÞø àޒ2 ÌßÚ²Ô°: ";
4580 GOSUB 28962:P2%=PN%:IF P0%=P2% OR P1%=P2% THEN 12368
4590 PLAY"L32O5C":PRINT #1,KN$(P2%);:KC%(P2%)=1
4600 PSET(10,174),11
4610 PRINT #1," ð—Þ àޒ2 ÌßÚ²Ô°: ";
4620 I%=0
4630 IF KC%(I%)=0 THEN P3%=I%:GOTO 13460
4640 I%=I%+1:GOTO 61221
4650 PRINT #1,KN$(P3%);
4660 '
4670 POKE &HEF0B,P0%
4680 POKE &HEF0C,P1%
4690 POKE &HEF0D,P2%
4700 POKE &HEF0E,P3%
4710 RETURN
4720 '
4730 KY$=INKEY$
4740 IF KY$="q" OR KY$="Q" THEN PN%=0:RETURN
4750 IF STRIG(0) THEN PN%=1:RETURN
4760 IF STRIG(1) THEN PN%=2:RETURN
4770 IF STRIG(2) THEN PN%=3:RETURN
4780 GOTO 28962
4790 '
4800 TP%=FALSE%
4810 IF STRIG(0) THEN TP%=TRUE%
4820 IF STRIG(1) THEN TP%=TRUE%
4830 IF STRIG(2) THEN TP%=TRUE%
4840 RETURN
4850 '
4860 DR%=0
4870 IF STICK(0)<>0 THEN DR%=STICK(0)
4880 IF STICK(1)<>0 THEN DR%=STICK(1)
4890 IF STICK(2)<>0 THEN DR%=STICK(2)
4900 RETURN
4910 '
4920 PLAY"V15L16","V15L16","V15L16"
4930 PLAY"O4CEGO5C","O4CCGE","O4EGCC"
4940 RETURN
4950 '
4960 PLAY"V15L16","V15L16","V15L16"
4970 PLAY"O5FO4ACF","O3FO2ACF","O4CCCC"
4980 RETURN
5000 '
5010 '************************
5020 '* Draw the main screen *
5030 '************************
5040 SCREEN 2,2:COLOR 1,3,10:CLS
5050 DM%=USR0(&H41):DM%=USR1(0)
5060 FOR SP%=0 TO 31
5070 PUT SPRITE SP%,(0,209),1,0
5080 NEXT SP%
5090 LINE(0,0)-(255,63),13,BF
5100 LINE(0,64)-(255,79),6,BF
5110 LINE(0,80)-(255,80),15
5120 FOR Y%=15 TO 63 STEP 16
5130   LINE(0,Y%)-(255,Y%),15
5140 NEXT Y%
5150 DRAW"C15BM30,63"
5160 DRAW"U5E17D5E20D5E21D5E15"
5170 DRAW"C15BM225,63"
5180 DRAW"U5H17D5H20D5H21D5H15"
5190 LINE(131,0)-(131,51),15
5200 '
5210 LINE(104,52)-(159,66),1,BF
5220 LINE(104,52)-(159,66),15,B
5230 LINE(131,52)-(131,66),15
5240 LINE(132,52)-(132,66),15
5250 '
5260 LINE(112,36)-(151,50),1,BF
5270 LINE(112,36)-(151,50),15,B
5280 LINE(129,43)-(133,43),15
5290 LINE(112,20)-(151,34),1,BF
5300 LINE(112,20)-(151,34),15,B
5310 LINE(129,27)-(133,27),15
5320 LINE(112,4)-(151,18),1,BF
5330 LINE(112,4)-(151,18),15,B
5340 LINE(129,11)-(133,11),15
5350 '
5360 DM%=USR2(0)
5370 '
5380 LINE(66,88)-(191,88),15
5390 LINE(6,183)-(251,183),15
5400 LINE(66,88)-(6,183),15
5410 LINE(191,88)-(251,183),15
5420 LINE(66,135)-(190,135),15
5430 LINE(128,88)-(128,183),15
5440 LINE(130,81)-(130,176),15
5450 LINE(128,88)-(130,81),15
5460 LINE(128,183)-(130,176),15
5470 '
5480 IF PM%=3 THEN 3884
5490 LINE(86,88)-(46,183),15
5500 LINE(170,88)-(210,183),15
5510 GOTO 3884
5520 '
5530 LINE(83,95)-(50,175),15
5540 LINE(173,95)-(206,175),15
5550 LINE(61,95)-(196,95),15
5560 LINE(11,175)-(246,175),15
5570 '
5580 LINE(24,68)-(223,76),11,BF
5590 LINE(24,68)-(20,64),11
5600 LINE(223,68)-(230,64),11
5610 LINE(24,76)-(18,80),11
5620 LINE(223,76)-(226,80),11
5630 PSET(30,69),12:COLOR 1
5640 PRINT #1,"MSX Challenge cup series";
5650 DM%=USR1(0):DM%=USR0(&H44)
6000 '
6010 '******************
6020 '* Play the match *
6030 '******************
6040 SL%=0:SR%=0:ML%=0:MR%=0
6050 FOR ST%=0 TO 2
6060 SL%(ST%)=0:SR%(ST%)=0
6070 NEXT ST%
6080 GOSUB 1036
6090 SP%=INT(RND(7)*2):SC%=0
6100 ST%=0
6110 IF PM%=0 THEN 524
6120 PSET(22,184),3:COLOR 1
6130 PRINT #1,"THE BEST OF THREE SET MATCH";
6140 GOSUB 37
6150 PSET(112,184),3:PRINT #1,"PLAY !";
6160 GOSUB 37
6170 '
6180 'A game
6190 POKE &HEF01,SP%
6200 POKE &HEF02,SC%
6210 FL%=FALSE%
6220 '
6230 FOR W%=1 TO 1000:NEXT W%
6240 DM%=USR3(0)
6250 PLAY"V15L4O5C","V15L4O5G"
6260 RS%=USR5(0):IF PM%=0 THEN 159
6270 IF RS%<>2 THEN 6360
6280 PSET(110,184),3
6290 PRINT #1,"FAULT !";
6300 FOR W%=1 TO 1000:NEXT W%
6310 LINE(0,184)-(255,191),3,BF
6320 IF NOT FL% THEN FL%=TRUE%:GOTO 37
6330 RS%=1-(SP% MOD 2)
6340 '
6350 IF RS%=1 THEN 21306
6360 PLAY"V15L16FEDL8C":SL%=SL%+1
6370 IF SL%=3 THEN 14869
6380 IF SL%=4 THEN 37
6390 IF SL%=5 THEN 14869
6400 IF SL%=6 THEN 37
6410 GOSUB 1036
6420 SC%=(SC%+1) MOD 2
6430 IF PM%=3 THEN SP%=(SP%+1) MOD 4
6440 GOTO 524
6450 '
6460 PLAY"V15L16CEGEL8C":SR%=SR%+1
6470 IF SR%=3 THEN 14869
6480 IF SR%=4 THEN 37
6490 IF SR%=5 THEN 14869
6500 IF SR%=6 THEN 37
6510 GOTO 9539
6520 '
6530 IF SL%=SR% THEN SL%=4:SR%=4
6540 GOTO 9539
6550 '
6560 FOR W%=1 TO 1000:NEXT W%
6570 GOSUB 8758
6580 IF SL%>SR% THEN SL%(ST%)=SL%(ST%)+1 ELSE SR%(ST%)=SR%(ST%)+1
6590 SL%=0:SR%=0:GOSUB 1036
6600 IF PM%<>3 THEN SP%=(SP%+1) MOD 2 ELSE SP%=(SP%+1) MOD 4
6610 SC%=0
6620 IF SL%(ST%)<>4 AND SR%(ST%)<>4 THEN 524
6630 '
6640 IF SL%(ST%)>SR%(ST%) THEN ML%=ML%+1:WP$="LEFT" ELSE MR%=MR%+1:WP$="RIGHT"
6650 ST%=ST%+1:IF ST%=3 THEN 19490
6660 IF ST%=2 AND ML%-MR%<>0 THEN 19490
6670 '
6680 PSET(52,184),3
6690 COLOR 1:PRINT #1,"A SET WON BY ¢";
6700 COLOR 15:PRINT #1,WP$;
6710 COLOR 1:PRINT #1,"£";
6720 GOSUB 37:SC%=0:GOTO 524
6730 '
6740 IF ML%>MR% THEN WP$="LEFT" ELSE WP$="RIGHT"
6750 PSET(42,184),3
6760 COLOR 1:PRINT #1,"A MATCH WON BY ¢";
6770 COLOR 15:PRINT #1,WP$;
6780 COLOR 1:PRINT #1,"£";
6790 GOSUB 37
6800 PSET(20,184),3
6810 PRINT #1,"ó“’áäÞ ôøï– ? ";
6820 IT=TIME
6830 IF TIME-IT>500 THEN 159
6840 GOSUB 65312:IF TP% THEN 22784
6850 GOTO 7680
6860 '
6870 FOR W%=1 TO 1500:NEXT W%
6880 LINE(0,184)-(255,191),3,BF
6890 RETURN
6900 '
6910 'Draw score board
6920 POKE &HEF03,SL%
6930 POKE &HEF04,SR%
6940 FOR I%=0 TO 2
6950 POKE &HEF05+2*I%,SL%(I%)
6960 POKE &HEF06+2*I%,SR%(I%)
6970 NEXT I%
6980 DM%=USR4(0)
6990 RETURN
7000 '
7010 'This is the end of this program !
7020 'Special thanks to M. Mazda.