home *** CD-ROM | disk | FTP | other *** search
- ;
- ;
- ; 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
-