home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpmug
/
cpmug041.ark
/
PONG.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
7KB
|
551 lines
;
;
; PONG
;
; 08/17/76 20:12
; BY ROBERT A. VAN VALZAH
; EXTENSIVELY MODIFIED
; BY WARD CHRISTENSEN
;
; REPLY TO 'ENTER OPTION':
; S TO PLAY SOLO (WALLS REFLECT
; NO COMPUTER PADDLE)
; W TO PLAY WARM UP; WALLS STILL
; REFLECT, BUT YOU PLAY AGAINST
; THE COMPUTER PADDLE
; P PLAY AGAINST THE COMPUTER
; SERVE CHANGES EVERY 5, MUST
; WIN BY 2.
;
; HIT RUBOUT AT ANY TIME TO GO BACK
; TO ENTER OPTION
;
; HIT CONTROL-C TO RETURN TO CP/M
;
VDMST EQU 0CC00H ;VDM SCREEN STARTING ADDRESS
VDMEP EQU VDMST/256+4 ;VDM ENDING PAGE (PAGE PAST VDM)
VDMSCP EQU 0C8H ;VDM SCROLL PORT
LSCOR EQU VDMST+8 ;LEFT SCORE PLACE ON VDM
RSCOR EQU VDMST+54 ;RIGHT " " "
CURS EQU 47H ;VDM CURSOR STORE LOACTION
;
;
ORG 100H
PONG: LXI SP,STACK
LXI H,VDMST
SHLD CURS
XRA A
OUT VDMSCP
LXI H,RECVR
MVI M,-4 AND 255 ;RECEIVE LEFT
LXI H,OPMSG
CALL TYPEN
CALL KEYIN
PUSH PSW
CALL TYPE
POP PSW
STA OPTN
CPI 'S'
JNZ TRYP
MVI A,'I'
STA LEFT
STA RIGHT
JMP OK
SINIT: LXI H,LSCOR
MVI M,'0'
INX H
MVI M,'0'
LXI H,RSCOR
MVI M,'0'
INX H
MVI M,'0'
LXI H,0
SHLD SCORE
RET ;FROM SINIT
;
TRYP CPI 'P'
JNZ TRYW
USEP: MVI A,']'
STA LEFT
MVI A,'['
STA RIGHT
JMP OK
TRYW: CPI 'W'
JZ USEP
CPI 'A' ;AUTO
JZ OK
MVI A,13
CALL TYPE
JMP PONG
;
OK: LXI H,VDMST
SHLD CURS
CLERB: MVI A,' '
CLEAR: MOV M,A
INR L
JNZ CLEAR
INR H
MOV A,H
CPI VDMEP
JNZ CLERB
LHLD CURS
LXI D,64
DAD D
TOPB: MVI M,'-'
INX H
MOV A,L
ANI 3FH
JNZ TOPB
MVI B,VDMEP
LEFT: EQU $+1
SIDS: MVI M,'I'
MOV A,L
ORI 3FH
MOV L,A
RIGHT EQU $+1
MVI M,'I'
INX H
MOV A,H
CMP B
JNZ SIDS
LXI D,-64
DAD D
BOTB: MVI M,'-'
INX H
MOV A,L
ANI 3FH
JNZ BOTB
LXI H,VDMST+450
SHLD PADL
CALL PDON
LDA OPTN
CPI 'S'
JZ REST
CPI 'W'
JZ REST
CALL SINIT
REST: LHLD PADL
CALL POFF
LXI H,VDMST+450
SHLD PADL
CALL PDON
LXI H,XPOS
MVI M,128
INX H
MVI M,60
INX H
RECVR EQU $+1 ;RECIEVE SERVE
MVI M,-4 AND 255
INX H
MVI M,0
MORE: CALL CSTS
ANI 0000$0001B
CNZ MVPA
CALL AUTO
CALL OFF
ADVL EQU $ ;ADD VELOCITY
LXI H,XPOS
LXI D,XVEL
LDAX D
ADD M
MOV M,A
INX D
INX H
LDAX D
ADD M
MOV M,A
; ;PLACE BAALL
LXI H,VDMST
LDA XPOS
RAR
RAR
ANI 3FH
ADD L
MOV L,A
LDA YPOS
RAR
RAR
RAR
ANI 1FH
MOV E,A
MVI D,0
XCHG
DAD H
DAD H
DAD H
DAD H
DAD H
DAD H
DAD D
MOV A,M
CPI '-'
JZ HHIT
CPI 'I'
JZ VHIT
CPI '/'
JZ HIHT
CPI '\'
JZ LOHT
CPI ']'
JZ SCORR
CPI '['
JZ SCORL
CPI ' '
JNZ REST
SHLD CURS
MOV A,M
ORI 1000$0000B
MOV M,A
DELY LXI B,801H
WAIT DCX B
MOV A,B
ORA C
JNZ WAIT
JMP MORE
; SCORING ROUTINES
SCORL EQU $
LDA OPTN
CPI 'W'
JZ VHIT
LXI H,SCORE
INR M
LXI D,LSCOR+2
CALL INRSC
MOV B,M
INX H ;POINT TO RITHT
MOV C,M
; ROUINNE TO DETERMINE
; WIN, AND CHANGE OF SERVE
; ON ENTRY, B= LEFT SCORE,
; C=RIGHT SCORE
TEST EQU $
LXI H,0
MVI D,3
HOLD: DCX H
MOV A,H
ORA L
JNZ HOLD
DCR D
JNZ HOLD
; DETERMINE SERVER
MOV A,B
ADD C
SUB10: SUI 10
JM END10
JMP SUB10
END10: ADI 10
LXI D,3CFDH ;'<', -4
CPI 5
JC SETSV
LXI D,3E03H ;'>', 4
SETSV: LXI H,RECVR
MOV M,E
MOV A,D
STA VDMST+32
; POINT DIFFERENCE >1?
MOV A,B
SUB C
JZ REST
CPI 1
JZ REST
CPI -1 AND 255
JZ REST
; DIFF >1; ANYONE WIN?
MOV A,B
CPI 21
JNC TEST2
MOV A,C
CPI 21
JC REST
; GOT A WINNER
TEST2: MOV A,B
SUB C
LXI H,LSCOR
JNC LWIN
; RIGHT WIN
LXI H,RSCOR
LWIN: MVI B,6
SON: MOV A,M
ORI 1000$0000B
MOV M,A
INX H
MOV A,M
ORI 1000$0000B
MOV M,A
CALL SWAIT
MOV A,M
ANI 0111$1111B
MOV M,A
DCX H
MOV A,M
ANI 0111$1111B
MOV M,A
CALL SWAIT
DCR B
JNZ SON
JMP PONG
;
INRSC: DCX D
LDAX D
INR A
STAX D
CPI ':'
RC
MVI A,'0'
STAX D
JMP INRSC
SCORR EQU $
LDA OPTN
CPI 'W'
JZ VHIT
LXI H,SCORE+1
INR M
LXI D,RSCOR+2
CALL INRSC
MOV D,M
DCX H
MOV B,M
JMP TEST
; MOVE PADDLE
MVPA: CALL KEYIN
LXI D,-67
CPI 'U'
JZ PDLMV
INX D
INX D
INX D
CPI 'I'
JZ PDLMV
INX D
INX D
INX D
CPI 'O'
JZ PDLMV
LXI D,-3
CPI 'J'
JZ PDLMV
LXI D,3
CPI 'L'
JZ PDLMV
LXI D,61
CPI 'M'
JZ PDLMV
INX D
INX D
INX D
CPI ','
JZ PDLMV
INX D
INX D
INX D
CPI '.'
JZ PDLMV
CPI 127
JNZ TRY09
POP H
JMP PONG
TRY09: EQU $
CPI 'C' - 40H
JZ BOOT
SUI '0'
RC
CPI '9' -'0' +1
RNC
RAL
STA DELY+2
RET
;
PDLMV: PUSH D
LHLD PADL
CALL POFF
POP D
DAD D
; PREVENT BORDER OVERLAY
MOV A,M
CPI ' '
JNZ LPADL
LXI D,-64
DAD D
MOV A,M
CPI ' '
JNZ LPADL
LXI D,128
DAD D
MOV A,M
CPI ' '
JNZ LPADL
LXI D,-64
DAD D
SHLD PADL
LPADL LHLD PADL
PDON: MVI A,'/'
MVI B,'I'
MVI C,'\'
JMP PDTG
POFF: MVI A,' '
MOV B,A
MOV C,A
PDTG: PUSH H
MOV M,B
LXI D,-64
DAD D
MOV M,A
LXI D,128
DAD D
MOV M,C
POP H
RET
;
; TOP OR BOTTOM HIT
;
HHIT: LDA YVEL
CMA
INR A
STA YVEL
JMP ADVL
;
; SIDE HIT
;
VHIT: LDA XVEL
CMA
INR A
STA XVEL
JMP ADVL
;
; HIGH PADDLE HIT
;
HIHT: LDA YVEL
CMA
INR A
INR A
HIHT1: STA YVEL
JMP VHIT ;BOUNCE
;
LOHT: LDA YVEL
CMA
JMP HIHT1
;
; TURN CURSOR OFF
;
OFF: LHLD CURS
MOV A,M
ANI 0111$1111B
MOV M,A
RET
;
; AUTO PADDLE
;
AUTO LDA OPTN
CPI 'S'
RZ
LDA XPOS
CPI 0C0H ;<-- HOW FAR AWAY COMPUTER SEES
RC
LDA XVEL
ORA A
RM
LDA XPOS
ANI 0000$0100B
RZ ;<-- COMPUTER MOVES 1/2 BALL SPEED
LHLD APADL
CALL POFF
;
; CALCULATE BALL Y POSITION
;
DAD H
DAD H
MOV A,H
ANI 0000$1111B ;LEAVE ONLY LINE NUMBER
MOV H,A
LDA YPOS
RAR
RAR
RAR
ANI 0000$1111B ;LEAVE ONLY LINE NUMBER
LXI D,0
SUB H
LHLD APADL
JZ AMOVE
CPI 1
JZ AMOVE
CPI -1 AND 255
JZ AMOVE
LXI D,-64
ORA A
JM AMOVE
LXI D,64
AMOVE: DAD D
SHLD APADL
MVI A,'\'
MVI B,'I'
MVI C,'/'
CALL PDTG
RET
;
TYPEN: MOV A,M
CPI 13
RZ
CALL TYPE
INX H
JMP TYPEN
;
; WAIT SUBROUTINE
;
SWAIT: PUSH H
LXI H,0
SLOOP: DCX H
MOV A,H
ORA L
JNZ SLOOP
POP H
RET
;
; I/0 ROUTINES
;
CSTS: PUSH H! PUSH D! PUSH B
CALL CSTSCP
POP B! POP D! POP H
RET
;
CSTSCP: LHLD 1
INX H! INX H! INX H
PCHL
;
;
KEYIN: PUSH H! PUSH D! PUSH B
CALL CICPM
POP B! POP D! POP H
RET
;
CICPM: LHLD 1
LXI D,6
DAD D
PCHL
;
;
TYPE: PUSH H! PUSH D! PUSH B
PUSH PSW
MVI C,2
MOV E,A
CALL 5
POP PSW
POP B! POP D! POP H
RET
;
;
; CONSTATNTS
;
APADL DW VDMST+509
PADL DW 0
XPOS DB 0
YPOS DB 0
XVEL DB 0
YVEL DB 0
SCORE DW 0 ;LEFT,RIGHT SCORE
OPTN DB 'W'
OPMSG DB 'ENTER OPTION (S, W, P)?',13
BOOT EQU 0 ;ADDRESS OF CPM RE-BOOT ROUTINE
DS 50
STACK EQU $
END PONG