Compucolor.org – Virtual Media

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