Listing of file='TT2K.MAC;05' on disk='vmedia/table_tennis_for_two-sector.ccvf'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; TABLE TENNIS GAME FOR TWO PLAYERS ; PUBLIC FCSSP EXTRN DECOUT,DELAY,DRWSYM,RANDOM,XHGCHR,XYADDR EXTRN SOUND,PITCH,DURN,NSTEPS,STEP1,STEP2 EXTRN JMPVEC,CO,OSTR,SAVE EXTRN FILVEC EXTRN CPYRGT INPCRT EQU 81C5H KBDFL EQU 81DFH KBRDY EQU 81FFH 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 TT2K: DI LXI H,0 ;SAVE FCS STACK POINTER DAD SP SHLD FCSSP LXI SP,STACK CALL JMPVEC CIINIT: MVI A,31 ;SET UP TO INTERCEPT KEYBOARD STA KBDFL MVI A,0C3H STA INPCRT LXI H,CHRINT SHLD INPCRT+1 CALL FILVEC XRA A STA KBRDY STA CHARIN ; ; MAIN REPEAT LOOP ; NEWGAM: EI LXI H,IDMSG CALL OSTR CALL CPYRGT LXI H,INSMSG CALL OSTR MVI A,XBAT1+1 STA XSTRT MVI A,1 STA XDIRN STA STDIRN STA SERVER ; ; ASK USER FOR BAT SPEED ; LXI H,BATMSG CALL OSTR CALL DIGIN ORA A JZ EXIT MOV B,A MVI A,10 SUB B ADI 1 STA BATSPD ; ; ASK FOR HORIZONTAL BALL SPEED ; READXV: LXI H,XVMSG CALL OSTR CALL DIGIN ORA A JZ READXV MOV B,A MVI A,10 SUB B STA XVEL STA XSPD ; ; 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 PLAYME: XRA A STA PLAY STA CHARIN LXI H,PLYMSG CALL OSTR PLAY10: LDA CHARIN ORA A JZ PLAY10 CPI 'Y' JNZ REPT MVI A,0FFH STA PLAY 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: MVI A,150 CALL DELAY LDA BATSPD STA DEBNC1 STA DEBNC2 LDA XSPD STA XVEL STA XVCNT LDA YSPD STA YVEL STA YVCNT MVI A,YMAX-YMIN CALL RANDOM ADI YMIN STA Y LDA XSTRT ;STARTING BALL POSITION STA X LDA STDIRN STA XDIRN MVI A,2 CALL RANDOM ORA A JNZ SERV10 CMA SERV10: STA YDIRN MVI A,96 ;INITIAL SCREEN REPLACEMENT CHR STA BALCHR MVI A,GREEN STA BALCCI ; ; ITERATION LOOP FOR THE BOUNCING BALL ; LOOP: LDA CHARIN CPI ESC JZ PROMPT CALL MVBAT1 CALL MVBAT2 CALL MOVBAL JC LOOP CHKSCR: LDA SCR1 CPI 21 JZ PROMPT LDA SCR2 CPI 21 JZ PROMPT JMP NEWBAL 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 PAD30 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 ;COMPUTER'S BAT MOVES SLOWER MOV B,A ; BY 50% RRC ANI 7FH ADD B STA DEBNC1 MVI A,12 ;RANDOMLY "FORGET" TO MOVE CALL RANDOM CPI 7 RZ LDA BATY1 ADI BATHGT/2 MOV B,A LDA Y SUB B JZ PAD30 JM MVB10 XRA A JMP MVB20 MVB10: MVI A,1 ORA A MVB20: CALL PADD JMP MVB40 MVB30: CALL PADDLE MVB40: MVI B,BATDAT LXI D,BATX1 LXI H,BATX CALL MOVDH RET MVBAT2: LXI H,DEBNC2 DCR M JNZ PAD30 LDA BATSPD MOV M,A INX H MVI B,BATDAT LXI D,BATX CALL MOVDH CALL PADDLE MVI B,BATDAT LXI D,BATX2 LXI H,BATX CALL MOVDH RET PADDLE: CALL SCAN JNC PAD30 PADD: JNZ PAD10 MVI A,1 STA MOVED LDA BATY INR 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 LDA BATY DCR 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: LDA X ;EXCHANGE THE BALL WITH WHAT MOV B,A ; WAS ON THE SCREEN BEFORE LDA Y MOV C,A LDA BALCHR MOV D,A LDA BALCCI MOV E,A CALL XHGCHR LDA YVCNT ;CHECK IF BALL NEEDS TO MOVE DCR A STA YVCNT JNZ BALL03 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 SOUND JMP BALL03 BALL02: CPI YMAX+1 JC BALL03 SUI YMAX MOV B,A MVI A,YMAX SUB B JMP BALL01 BALL03: LDA XVCNT DCR A STA XVCNT JNZ DRAW LDA XVEL STA XVCNT LXI H,X LDA XDIRN ADD M MOV M,A CPI XMIN JP BALL05 LDA SCR2 INR A STA SCR2 LXI H,SCORE2 CALL DECOUT LXI H,SCMSG2 CALL OSTR JMP BALL08 BALL04: ORA A JZ REVRSE MOV B,A LDA YDIRN CMP B JNZ SPINDN LDA YVEL DCR A CPI 1 JP SPIN MVI A,1 JMP SPIN SPINDN: LDA YVEL INR A CPI 10 JC SPIN MVI A,9 SPIN: STA YVEL REVRSE: LDA XDIRN CMA ADI 1 STA XDIRN MVI A,200 STA PITCH MVI A,8 STA DURN CALL SOUND JMP DRAW BALL05: CPI XBAT1+1 JP BALL06 LDA X MOV B,A LDA Y MOV C,A CALL XYADDR INX H MOV A,M CPI ORANGE JNZ DRAW MVI A,XBAT1+2 STA X LDA MOVED1 JMP BALL04 BALL06: CPI XMAX+1 JNC BALL07 CPI XBAT2 JC DRAW LDA X MOV B,A LDA Y MOV C,A CALL XYADDR INX H MOV A,M CPI ORANGE JNZ DRAW MVI A,XBAT2-2 STA X LDA MOVED2 JMP BALL04 BALL07: LDA SCR1 INR A STA SCR1 LXI H,SCORE1 CALL DECOUT LXI H,SCMSG1 CALL OSTR BALL08: LXI H,767 SHLD PITCH MVI A,3 STA DURN MVI A,20 STA NSTEPS MVI A,129 STA STEP1 MVI A,127 STA STEP2 CALL SOUND STC CMC RET DRAW: 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 STC ;INDICATE SUCESSFUL MOVE RET SCAN: DI LDA DWNLIN OUT 07 IN 01 MOV B,A LDA DWNCOD ANA B STC JZ SC01 LDA UPLINE OUT 07 IN 01 MOV B,A LDA UPCODE ANA B STC JZ SC02 CMC SC01: EI RET SC02: MVI A,1 ORA A STC EI RET ; ; KEYBOARD INTERRUPT ROUTINE ; CHRINT: PUSH PSW MOV A,E ANI 7FH STA CHARIN POP PSW 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 ; IDMSG: DB 29,6,3,14,12 DB 'TABLE TENNIS GAME FOR TWO PLAYERS',13,10,239 INSMSG: DB 6,2,' LEFT BAT USES "A"=UP AND "Z"=DOWN',13,10 DB ' RIGHT BAT USES ":"=UP AND "/"=DOWN',13,10,10 DB ' TO RESIGN, HIT <ESCAPE>',13,10,10,239 BATMSG: DB 29,18,'BAT SPEED (1-9, 0=END GAME): ',239 XVMSG: DB 13,10,'HORIZONTAL BALL SPEED (1-9): ',239 YVMSG: DB 13,10,'VERTICAL BALL SPEED (1-9): ',239 PLYMSG: DB 13,10,'PLAY AGAINST THE COMPUTER ? (Y/N) ',239 OPTION: DB 3,10,31,'OPTION (N=NEW GAME, R=REPEAT, E=EXIT)' DB ' : ',26,239 SETUP: DB 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 PLAY: DB 0 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 UPLINE: DB 0 UPCODE: DB 0 DWNLIN: DB 0 DWNCOD: DB 0 BATDAT EQU $-BATX DEBNC1: DB 9 BATX1: DB XBAT1 BATY1: DB 12 MOVED1: DB 0 UPLN1: DB 0EH ;'A' KEY UPCD1: DB 02H DNLN1: DB 05H ;'Z' KEY DNCD1: DB 04H DEBNC2: DB 9 BATX2: DB XBAT2 BATY2: DB 12 MOVED2: DB 0 UPLN2: DB 05H ;':' KEY UPCD2: DB 01H DNLN2: DB 00H ;'/' KEY DNCD2: DB 01H ; ; BALL DATA ; X: DB 0 Y: DB 31 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 300 STACK: DS 2 END TT2K