/ LINC PING-PONG / PING-PONG FOR THE CLASSIC LINC / FROM THE LAP6 MANUSCRIPT ATTRIBUTED TO: / MARK DIONNE MARCH MCMLXXIII / TRANSLATED BY: CHARLES LASNER 19-NOV-1990 / LAST EDIT: 19-NOV-1990 20:00 / MUST BE ASSEMBLED WITH P?S/8 PAL. / MUST BE ASSEMBLED WITH '/8' AND '/J' SWITCHES SET. / THIS IS A VISUAL PING-PONG PROGRAM WRITTEN ENTIRELY IN LINC CODE FOR THE / CLASSIC LINC. IT DEPENDS ON AN INTERRUPT CONDITION ARISING FROM SOME EXTERNAL / SOURCE. THE PLAYER PARAMETERS ARE UPDATED ON AN INTERRUPT-ONLY BASIS. / HAND-MADE CHANGES ON THE ORIGINAL MANUSCRIPT LISTING WILL BE INCORPORATED / WHERE FEASIBLE. / THIS LISTING IS FOR REFERENCE ONLY; IT IS BEYOND THE SCOPE OF THIS FILE TO / ACTUALLY TRANSFER THE BINARY TO A CLASSIC LINC. USING P?S/8, IT IS POSSIBLE / TO TRANSFER THE BINARY FROM A LINC-8 SYSTEM TO A LINCTAPE FOR SUBSEQUENT / LOADING ON THE CLASSIC LINC. TOWARDS THAT END, AND FOR POSSIBLE LINC-8 / EXECUTION, THE BINARY WILL BE LOADED USING LINC-8 CONVENTIONS. / ALL SYMBOLS ARE REVERSED AS PER LAP6-DIAL CONVENTIONS. THE SOURCE CONVENTIONS / ARE CONSISTENT WITH LAP6-DIAL, DIAL10, PAL-12, AND P?S PAL. ERROR-FREE / ASSEMBLY MAY ONLY BE POSSIBLE WITH P?S PAL. / SYMBOL DEFINITIONS. LMODE /WE RUN IN LINC MODE ENI= 0004 /ENABLE LINC INTERRUPTS / MRI DEFINITIONS. FIXMRI JSR= 6000 /JUMP SUBROUTINE (WHICH RETURNS) / THE CODE STARTS HERE. SEGMNT 1 /LOADS INTO 0000 ON CLASSIC LINC *1 /EARLY LINC OPERATING SYSTEMS START IT HERE ENI /ENABLE INTERRUPTS / CHECK WHAT STATE SENSE SWITCH 5 IS IN. IF IT IS CURRENTLY SET, THEN MAKE THE / EXIT CONDITION THE CHANGE OF SENSE SWITCH 5 TO *OFF* ELSE LEAVE IT ALONE SO IT / EXITS WITH SENSE SWITCH 5 *ON*. SNS 5 /IS SENSE SWITCH 5 SET NOW? JMP START /NO, JUST START IT LDA I SNS I 5 /GET REVERSING INSTRUCTION STC A6A /STORE OVER EXIT CODE JMP START /GO START IT UP *20 /GET PAST ALPHA, BETA REGISTERS START, JMP A1A /GOTO *REAL* START / INTERRUPT LOCATION. JMP A1I /HANDLE INTERRUPTS THERE / DISPLAY LOOP A1A, SET I 3 A1B, 400 LDA I 30 SET I 2 -67 /THE NET A2L, DIS 3 ADA I 57 XSK I 2 JMP A2L / SCORES SET 3 A1S JSR A5C SET I 1 154 /**** WAS 10 **** LDA I 300 DSC 2 DSC I 2 SET I 1 200 /**** WAS 34 **** DSC 3 DSC I 3 SET 3 A2S JSR A5C SET I 1 554 /**** WAS 724 **** LDA I 300 DSC 2 DSC I 2 SET I 1 604 /**** WAS 750 **** DSC 3 DSC I 3 / PADDLES SET I 3 24 SAM 1 /LEFT COM ROL 2 /**** WAS ROL 3 **** ADD A1B BCL I 7000 STC A1P SAM 7 /RIGHT ROL 2 /WAS ROL 3 **** ADD A1B BCL I 7000 STC A2P SET 2 A1P JSR A7P SET 2 A2P SET I 3 754 JSR A7P LDA A1F AZE JMP A1A LDA A3H /HORIZONTAL POSTION ROR 3 BCL I 7000 ADA I -4 STA 3 STA 4 ADA I 10 STC 7 ADD A3V ROR 3 BCL I 7000 ADA I -4 STA 5 SET I 6 -10 DIS 4 DIS 7 ADD A1Z XSK I 6 JMP .-4 SET I 6 -10 A7Q, LDA 5 DIS 3 ADA I 10 DIS 3 LDA I 1 ADM 3 XSK I 6 JMP A7Q JMP A1A /TO BEGINNING OF DISPLAY LOOP / DISPLAY PADDLE SUBROUTINE A7P, SET 17 0 LDA 2 ADA I -20 SET I 2 -20 DIS 3 ADA I 2 XSK I 2 JMP .-4 JMP 17 / INTERRUPT ROUTINE A1I, SET 16 0 STC A1X ADD A1Z ADM A2C AZE JMP A1J LDA I -1000 STC A2C A6A, SNS 5 /LAP6 JMP .+6 SET I 15 RCG SET I 16 7300 JMP 15 ADD A1F AZE I SNS 4 /NEW GAME JMP A1K ADD A2S COM ADD A1S SCR 13 STC A9H LDA I 10 STC A2V ADD A9H BCO I -20 STC A2H STC A1S STC A2S ADD A1W STA A2F STC A1F / STC A1F /**** DELETED **** A1K, SAM 0 SCR 2 ADA I -42 /**** WAS -24 **** STC A2E A1J, LDA I 1 ADM A2F AZE I JMP A1N A1D, LDA I /EXIT A1X, 0 ENI JMP 16 A1N, ADD A2E STC A2F ADD A1F AZE JMP A3S /NO BALL, WE HAVE WAITED, SO SERVE ADD A2V ADM /MOVE BALL A3V FLO I /TEST BOUNCE JMP A6B A6C, LDA A2H ADM A3H ROR 3 BCL I 7000 ADA I /TEST FOR PADDLE LINES -400 APO COM ADA I -350 APO I COM /NEGATIVE DISTANCE FROM PADDLE LINE ADD A9V AZE /COMPARE TOLERANCE APO I JMP A1V /JUMP + TST IF NEAR VERTICALLY LDA A9H /SEE IF A MISS AZE JMP A1D /EXIT IF NOT LDA A3H SCR 13 SAE A9H /COMPARE TO MISS SIDE JSR A1H /SCORE AND SETUP SERVE A3P, JMP A1D / CHECK FOR A HIT A1V, LDA A3H APO I /GET PADDLE HEIGHT JMP .+4 LDA A2P JMP .+3 /**** SHOULD THIS CHANGE? **** LDA A1P ROL 3 SCR 3 COM STC 10 LDA A3V AZE I CLR SCR 3 / BCL I / 7000 ADD 10 APO COM ADA I -30 /WAS -24 APO I JMP A1M /A MISS ADA I /TEST FOR EDGE HIT 7 /WAS 6 APO I JMP A5E /EDGE HIT A6E, LDA A2H COM STA A2H ROL 1 ADM A3H / STC A2H /BOUNCE JMP A1D / SCORE POINT A1H, LDA I A1W, -3400 /WAIT STC A2F ADD A9H APO JMP .+6 LDA I 1 ADM A1S JMP .+5 LDA I 1 ADM A2S / STA / A9H STC A1F /TURN OFF BALL JMP A1D / HE MISSED A1M, LDA A3H COM SCR 13 STC A9H JMP A1D / EDGE HIT PADDLE A5E, LDA A3V SCR 3 /WAS ROR 3 / BCL I / 7000 ADD 10 SCR 13 /WAS SCR 11 STC A5F ADD A2H APO COM BCO I A5F, 0 MUL I 3 SCR 3 ADM A2V JSR A1C JMP A6E / COMPUTE HIT TOLERANCE A1C, LDA A2V APO COM STC 10 ADD A2H APO COM ADD 10 SCR 4 /APPROXIMATE VELOCITY^2 / APO / COM ADA I -4 APO CLR ADA I 4 STC A9V JMP 0 / CONVERT 2 DECIMAL DIGITS A5C, LDA 0 STC A5Y+6 SET I 2 /TENS COUNTER A5X A5D, LDA 3 /THE NUMBER ADA I -12 AZE I JMP .+3 APO JMP A5Y STC 3 LDA I A3Q, 2 ADM /BUMP TENS 2 JMP A5D A5Y, LDA 3 ROL 1 ADA I A5X STC 3 JMP .-. /RETURN STORED HERE / SERVE BALL A3S, CLR STC A1F ADD A9H BCO I 360 /WAS ? STA A9H STC A3H / ETC ADD A2V SCR 1 COM ADM A2V LDA I 4000 ADM A3V JSR A1C JMP A1D / BOUNCE BALL A6B, LDA A2V COM STA A2V ADM A3V JMP A6C / DATA *1400 A1P, 0 /PADDLE COORDINATES A2P, 0 A1Z, 1 /CONSTANT A2V, 10 /VERTICAL SPEED A3V, 0 /VERTICAL POSITION A2H, 20 /HORIZONTAL SPEED A3H, 0 /HORIZONTAL POSITION A2C, -1000 A1S, 0 /SCORE A2S, 0 /SCORE A2F, -1000 /SPEED A2E, -1000 /SPEED RESET A9V, 4 /HIT TOLERANCE / = ABS[MAX[VELOCITY^2,4]] A9H, 1 /MISS FLAG A1F, 1 /NO BALL ON SCREEN IF NONZERO SEGMNT 3 /AVAILABLE LINC-8 DATA SEGMENT / NUMBER PATTERNS A5X, 4136 3641 2101 /1 0177 4523 /2 2151 4122 /3 2651 2414 /4 0477 5172 /5 0651 1506 /6 4225 4443 /7 6050 5126 /8 2651 5120 /9 3651 / END PINGPONG $ /THAT'S ALL FOLK!