; ; ; 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 VDMSCP EQU 0FEH ;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