Listing of file='TT2J.MAC;1C' on disk='vmedia/table_tennis_for_two-sector.ccvf'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; PING-PONG GAME FOR TWO PLAYERS ; EXTRN DECOUT,DELAY,DRWSYM,RANDOM,XHGCHR,XYADDR EXTRN SNDSET,FINFLG,PING,PONG,WARBLE EXTRN JMPVEC,CO,OSTR,SAVE EXTRN JOYSTK,PSHBUT INPCRT EQU 81C5H KBDFL EQU 81DFH KBRDY EQU 81FFH BAT1 EQU 1 BAT2 EQU 0 BATWID EQU 2 BATHGT EQU 5 XMAX EQU 63 ;MAX HORIZ BALL COORD YMAX EQU 30 ;MAX VERT BALL COORD XMIN EQU 0 ;SIMILARLY FOR MIN YMIN EQU 1 XBAT1 EQU 1 ;HORIZ BAT1 POSITION XBAT2 EQU 62 PADMAX EQU YMAX ;MAX VERT BAT POSITION PADMIN EQU YMIN-BATHGT+1 ;MIN VERT BAT POSITION BLUE EQU 20H GREEN EQU 02H MAGNTA EQU 28H ORANGE EQU 0BH RED EQU 01H WHITE EQU 38H ESC EQU 27 ;ESCAPE FROM GAME ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; TT2: DI LXI H,0 ;SAVE FCS STACK POINTER DAD SP SHLD FCSSP LXI SP,STACK CIINIT: MVI A,31 ;SET UP TO INTERCEPT KEYBOARD STA KBDFL MVI A,0C3H STA INPCRT LXI H,CHRINT SHLD INPCRT+1 CALL JMPVEC XRA A STA KBRDY STA CHARIN LXI H,300 MVI A,15 CALL SNDSET ; ; MAIN REPEAT LOOP ; NEWGAM: EI LXI H,BEGMSG CALL OSTR MVI A,XBAT1+1 STA XSTRT MVI A,1 STA XDIRN STA STDIRN STA SERVER STA FINFLG ; ; SEE IF PLAYING THE COMPUTER ; PLAYME: XRA A STA PLAY STA CHARIN INR A STA BATSPD LXI H,PLYMSG CALL OSTR PLAY10: LDA CHARIN ORA A JZ PLAY10 CALL CO CPI 'Y' JNZ READXV MVI A,0FFH STA PLAY CALL PONG ; ; ASK USER FOR BAT SPEED ; LXI H,SKLMSG CALL OSTR CALL DIGIN ORA A JZ EXIT ADI 1 STA SKILL MOV B,A MVI A,11 SUB B STA BATSPD ; ; ASK FOR HORIZONTAL BALL SPEED ; READXV: CALL PING LXI H,XVMSG CALL OSTR CALL DIGIN ORA A JZ READXV MOV B,A MVI A,10 SUB B STA XVEL STA XSPD CALL PING ; ; GET VERTICAL SPEED ; READYV: LXI H,YVMSG CALL OSTR CALL DIGIN ORA A JZ READYV MOV B,A MVI A,10 SUB B STA YVEL STA YSPD CALL PING REPT: XRA A STA SCR1 STA SCR2 MVI A,5 STA SRVCNT LXI H,SETUP ;SET UP THE SCREEN CALL OSTR MVI A,12 STA BATY1 ;PADDLES START IN MIDDLE STA BATY2 MOV C,A MVI B,XBAT1 LXI D,BAT MVI H,BATWID MVI L,BATHGT CALL DRWSYM MVI B,XBAT2 LDA BATY2 MOV C,A LXI D,BAT MVI H,BATWID MVI L,BATHGT CALL DRWSYM SERVE: LDA BATSPD STA DEBNC1 STA DEBNC2 LDA XSPD STA XVEL STA XVCNT LDA YSPD STA YVEL STA YVCNT LDA PLAY ORA A JP SERV10 LDA STDIRN ORA A JM SERV20 MVI A,150 ;WAIT BEFORE COMPUTER SERVES CALL DELAY MVI A,YMAX-YMIN ;CHOOSE STARTING POSITION FOR CALL RANDOM ; BALL FOR COMPUTER'S SERVE ADI YMIN STA Y STA LASTY MVI A,3 CALL RANDOM SUI 1 STA YDIRN JMP SERV50 SERV10: LDA STDIRN ORA A JM SERV20 SERV15: CALL BCKGND MVI A,BAT1 CALL PSHBUT JNZ SERV15 LDA MOVED1 STA YDIRN MVI A,BAT1 JMP SERV30 SERV20: CALL BCKGND MVI A,BAT2 CALL PSHBUT JNZ SERV20 LDA MOVED2 STA YDIRN MVI A,BAT2 SERV30: CALL SCAN ADI BATHGT/2 CPI YMIN JP SERV35 MVI A,YMIN JMP SERV40 SERV35: CPI YMAX+1 JC SERV40 MVI A,YMAX SERV40: STA Y STA LASTY SERV50: LDA XSTRT STA X STA LASTX LDA STDIRN STA XDIRN MVI A,96 ;INITIAL SCREEN REPLACEMENT CHR STA BALCHR MVI A,GREEN STA BALCCI CALL PONG ; ; ITERATION LOOP FOR THE BOUNCING BALL ; LOOP: CALL BCKGND CALL MOVBAL JC LOOP CHKSCR: LDA SCR1 CPI 21 JZ PROMPT LDA SCR2 CPI 21 JZ PROMPT JMP NEWBAL BCKGND: CALL MVBAT1 CALL MVBAT2 LDA CHARIN CPI ESC JZ RESIGN RET RESIGN: POP PSW ;SCRAP RETURN ADDRESS PROMPT: XRA A STA CHARIN LXI H,OPTION CALL OSTR PROMP1: LDA CHARIN ORA A JZ PROMP1 CPI 'N' ;NEW GAME JZ NEWGAM CPI 'R' JZ REPT CPI 'E' ;EXIT JZ EXIT JMP PROMPT NEWBAL: LDA SRVCNT DCR A STA SRVCNT JNZ SERVE MVI A,5 STA SRVCNT LDA SERVER ORA A JM NEW10 MVI A,XBAT2-1 STA XSTRT MVI A,-1 STA STDIRN STA SERVER LXI H,LEFT CALL OSTR JMP NEW20 NEW10: MVI A,XBAT1+1 STA XSTRT MVI A,1 STA STDIRN STA SERVER LXI H,RIGHT CALL OSTR NEW20: MVI A,250 CALL DELAY JMP SERVE EXIT: LXI H,ENDMSG CALL OSTR MVI B,0 LHLD FCSSP SPHL RET MVBAT1: LXI H,DEBNC1 DCR M JNZ MVB50 LDA BATSPD MOV M,A INX H MVI B,BATDAT LXI D,BATX CALL MOVDH LDA PLAY ;PLAYING AGAINST THE COMPUTER ? ORA A JZ MVB30 LDA BATSPD STA DEBNC1 LDA SKILL CALL RANDOM ;RANDOMLY "FORGET" TO MOVE ORA A RZ LDA BATY ADI BATHGT/2 MOV B,A LDA Y SUB B JZ PAD30 JM MVB20 MVB10: LDA BATY INR A CALL PADD JMP MVB40 MVB20: LDA BATY DCR A CALL PADD JMP MVB40 MVB30: MVI A,BAT1 CALL PADDLE MVB40: MVI B,BATDAT LXI D,BATX1 LXI H,BATX CALL MOVDH RET MVB50: MVI A,5 CALL DELAY RET MVBAT2: LXI H,DEBNC2 DCR M JNZ MVB50 LDA BATSPD MOV M,A INX H MVI B,BATDAT LXI D,BATX CALL MOVDH MVI A,BAT2 CALL PADDLE MVI B,BATDAT LXI D,BATX2 LXI H,BATX CALL MOVDH RET PADDLE: CALL SCAN PADD: MOV B,A LDA BATY MOV C,A MOV A,B CMP C JZ PAD30 JM PAD10 MVI A,1 STA MOVED MOV A,B ORA A JP PAD05 CPI PADMIN JP PAD20 JMP PAD07 PAD05: CPI PADMAX+1 JC PAD20 PAD07: MVI A,PADMAX JMP PAD20 PAD10: MVI A,-1 STA MOVED MOV A,B ORA A CPI PADMIN JP PAD20 MVI A,PADMIN PAD20: PUSH PSW ;PADDLE POSN MUST BE IN A REG LDA BATX MOV B,A LDA BATY MOV C,A LXI D,FILL MVI H,BATWID MVI L,BATHGT CALL DRWSYM POP PSW STA BATY MOV C,A LDA BATX MOV B,A LXI D,BAT MVI H,BATWID MVI L,BATHGT CALL DRWSYM JMP PAD40 PAD30: MVI A,5 ;EVEN UP TIMING IF BAT NOT CALL DELAY ; MOVED XRA A STA MOVED PAD40: RET ;.............................................................. ; ; UPDATE BALL POSITION ; MOVBAL: XRA A STA UPDBAL BALL00: LDA YDIRN ORA A JZ BALL03 ; ; CHECK IF BALL NEEDS TO MOVE IN Y-DIRN ; LDA YVCNT DCR A STA YVCNT JNZ BALL03 MVI A,0FFH STA UPDBAL LDA YVEL STA YVCNT LXI H,Y LDA YDIRN ADD M MOV M,A CPI YMIN JP BALL02 MOV B,A MVI A,2*YMIN SUB B BALL01: MOV M,A LDA YDIRN CMA ADI 1 STA YDIRN CALL PING JMP BALL03 BALL02: CPI YMAX+1 JC BALL03 SUI YMAX MOV B,A MVI A,YMAX SUB B JMP BALL01 ; ; NOW THE X-DIRECTION ; BALL03: CALL CHKBAT ;SEE IF USER MOVED BAT OVER THE BALL JZ FUDGE ; AND BE KIND TO HIM - IT'S A HIT LDA XVCNT ;TIME FOR BALL TO MOVE? DCR A STA XVCNT JNZ DRAW ;NO LXI H,X ;YES, UPDATE POSN LDA XDIRN ADD M MOV M,A FUDGE: LDA XVEL STA XVCNT MVI A,0FFH ;MARK BALL AS MOVED STA UPDBAL LDA X CPI XMIN JP BALL04 LDA SCR2 INR A STA SCR2 LXI H,SCORE2 CALL DECOUT LXI H,SCMSG2 CALL OSTR JMP BALL08 BALL04: CPI XBAT1+1 JP BALL06 CALL CHKBAT JNZ DRAW MVI A,XBAT1+2 STA X LDA MOVED1 BALL05: ORA A ;A CONTAINS BAT MOVEMENT JZ REVRSE MOV B,A LDA YDIRN ORA A JNZ TSTDRN MOV A,B STA YDIRN JMP OKSPIN TSTDRN: CMP B JNZ SPINDN OKSPIN: LDA YVEL DCR A DCR A JZ FIXIT JM FIXIT JMP SPIN FIXIT: MVI A,1 JMP SPIN SPINDN: LDA YVEL INR A INR A CPI 10 JC SPIN XRA A STA YDIRN MVI A,9 SPIN: STA YVEL REVRSE: LDA XDIRN CMA ADI 1 STA XDIRN LDA XVEL DCR A JNZ SPDUP MVI A,1 SPDUP: STA XVEL CALL PONG JMP DRAW BALL06: CPI XMAX+1 JNC BALL07 CPI XBAT2 JC DRAW CALL CHKBAT JNZ DRAW MVI A,XBAT2-2 STA X LDA MOVED2 JMP BALL05 BALL07: LDA SCR1 INR A STA SCR1 LXI H,SCORE1 CALL DECOUT LXI H,SCMSG1 CALL OSTR BALL08: CALL WARBLE ;LET DUMMY KNOW HE MISSED CALL REPLAC ;ERASE BALL STC CMC RET DRAW: LDA UPDBAL ;SEE IF BALL MOVED ORA A JZ DRAW10 CALL REPLAC ;RESTORE SCREEN CHR LDA X ;PUT THE BALL ON THE SCREEN MOV B,A LDA Y MOV C,A MVI D,' ' ;MAGENTA SPACE MVI E,MAGNTA CALL XHGCHR MOV A,D ;SAVE THE CHARACTER THAT WAS STA BALCHR ; ALREADY THERE MOV A,E STA BALCCI LDA X ;UPDATE LAST BALL POSN STA LASTX LDA Y STA LASTY DRAW10: STC ;INDICATE SUCESSFUL MOVE RET REPLAC: LDA LASTX ;EXCHANGE THE BALL WITH WHAT MOV B,A ; WAS ON THE SCREEN BEFORE LDA LASTY MOV C,A CALL CHKB10 RZ ;DON'T REPLACE IN MIDDLE OF A BAT! LDA BALCHR MOV D,A LDA BALCCI MOV E,A CALL XHGCHR RET CHKBAT: LDA X MOV B,A LDA Y MOV C,A CHKB10: CALL XYADDR INX H MOV A,M CPI ORANGE RET SCAN: CALL JOYSTK MOV A,C RRC RRC RRC ANI 1FH MOV B,A MVI A,YMAX SUB B RET ; ; KEYBOARD INTERRUPT ROUTINE ; CHRINT: PUSH H PUSH PSW MOV A,E ANI 127 STA CHARIN POP PSW POP H EI RET ; ; ROUTINE TO GET A VALID DIGIT (0-9) FROM KEYBOARD ; DIGIN: LDA CHARIN ORA A JZ DIGIN PUSH PSW XRA A STA KBRDY STA CHARIN POP PSW CPI 48 JC DIGIN CPI 58 JNC DIGIN CALL CO SUI 48 RET MOVDH: MOV A,M STAX D INX H INX D DCR B JNZ MOVDH RET ;.............................................................. ; ; GENERAL DATA STORAGE AREA ; ; MESSAGES ; BEGMSG: DB 29,17,30,16,14,12 DB 'TABLE TENNIS FOR TWO PLAYERS OR ONE',13,10,15 DB 6,3,'COPYRIGHT (C)',6,6,' 1980',6,3,' BY',6,5 DB ' TREVOR TAYLOR',6,2,13,10,10 DB ' SERVICE CHANGES DIRECTION EVERY 5 POINTS.' DB ' FIRST TO 21 WINS.',13,10,10 DB ' SERVE BY PRESSING THE PUSH-BUTTON ON THE' DB ' JOYSTICK. MOVE THE',13,10 DB ' BAT WHILE SERVING TO SELECT THE INITIAL' DB ' BALL DIRECTION.',13,10,10 DB ' HORIZONTAL BALL SPEED INCREASES WITH EVERY' DB ' HIT, AND THE',13,10 DB ' VERTICAL BALL SPEED CHANGES IF THE BAT IS' DB ' MOVING WHEN THE',13,10 DB ' BALL IS HIT.',13,10,10 DB ' TO RESIGN, HIT <ESCAPE>',13,10,10,239 XVMSG: DB 13,10,6,6 DB 'INITIAL HORIZONTAL BALL SPEED (1-9): ',239 YVMSG: DB 13,10 DB 'INITIAL VERTICAL BALL SPEED (1-9): ',239 PLYMSG: DB 13,10,6,3,'PLAY AGAINST THE COMPUTER ? (Y/N) ' DB 239 SKLMSG: DB 'SKILL LEVEL (1-9): ',239 OPTION: DB 3,10,31,'OPTION (N=NEW GAME, R=REPEAT, E=EXIT)' DB ' : ',26,239 SETUP: DB 29,6,GREEN,12,27,25,96,27,24 ;GREEN BKGND DB 6,BLUE,8,237,64,' ',238 ;BLUE EDGES DB 3,0,31,237,64,' ',238 DB 6,WHITE,3,31,0,237,64,' ',10,26,238 DB 3,32,0,237,64,' ',10,26,238 DB 14,3,30,5,6,RED,'SERVE',3,31,7,'->',6,GREEN DB 15,239 LEFT: DB 14,6,RED,3,31,7,'<-',15,6,GREEN,239 RIGHT: DB 14,6,RED,3,31,7,'->',15,6,GREEN,239 SCMSG1: DB 14,6,RED,3,15,5 SCORE1: DB 0,0,0,6,GREEN,15,239 SCMSG2: DB 14,6,RED,3,45,5 SCORE2: DB 0,0,0,6,GREEN,15,239 FILL: DB 96,GREEN,96,GREEN,96,GREEN,96,GREEN,96,GREEN BAT: DB 96,ORANGE,96,ORANGE,96,ORANGE,96,ORANGE DB 96,ORANGE ENDMSG: DB 6,GREEN,12,27,11,239 BALCHR: DB 96 BALCCI: DB GREEN ; ; DATA VALUES ; PLAY: DB 0 SKILL: DB 1 SCR1: DB 0 SCR2: DB 0 SERVER: DB 1 SRVCNT: DB 5 STDIRN: DB 1 XSTRT: DB XBAT1+1 WINNER: DB 0 XSPD: DB 0 YSPD: DB 0 ; ; BAT DATA ; BATSPD: DB 9 BATX: DB 0 BATY: DB 0 MOVED: DB 0 BATDAT EQU $-BATX DEBNC1: DB 9 BATX1: DB XBAT1 BATY1: DB 12 MOVED1: DB 0 DEBNC2: DB 9 BATX2: DB XBAT2 BATY2: DB 12 MOVED2: DB 0 ; ; BALL DATA ; X: DB 0 Y: DB 31 LASTX: DB 0 LASTY: DB 31 UPDBAL: DB 0 XVEL: DB 1 YVEL: DB 1 XVCNT: DB 1 YVCNT: DB 1 XDIRN: DB 1 YDIRN: DB -1 CHARIN: DB 0 FCSSP: DS 2 DS 100 STACK: DS 2 END TT2