Compucolor.org – Virtual Media

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