/ LINC-8 PING-PONG / PING-PONG FOR THE LINC-8. / MACHINE CODE TO ASSEMBLY LANGUAGE TRANSLATION BY: CHARLES LASNER. / LAST EDIT: 25-JAN-1991 17:00 CJL / MUST BE ASSEMBLED WITH P?S/8 PAL. / MUST BE ASSEMBLED WITH '/8' SWITCH SET. / MAY BE ASSEMBLED WITH '/J' SWITCH SET. / PROGRAM HISTORY. / THE RUNNING BINARY VERSION OF THIS PROGRAM IS TAKEN FROM THE LAP6W SYSTEM TAPE BINARY / FILE NAMED "PONG" FOUND ON TAPE WB1116. NO SOURCE MANUSCRIPT FILE WAS FOUND, SO THIS / FILE IS ENTIRELY "MANUALLY" DISASSEMBLED. THE BINARY FILE PRODUCED BY THIS ASSEMBLY / MATCHES PERFECTLY WITH THE ORIGINAL LAP6W FILE. / TAPE WB1116 IS APPARENTLY A BOOTABLE SYSTEM TAPE, SINCE THE FILING CONVENTIONS ARE / CONSISTENT WITH LAP6W FILING METHODS FOR BOOTABLE SYSTEMS. (THE TAPE INDEX SHOWS ALL / FILES ASSIGNED TO NON-SYSTEM BLOCKS WHICH IS CONSISTENT WITH LAP6W MANAGEMENT OF A SYSTEM / TAPE, NOT A FILES-ONLY TAPE.) THE TAPE IS *NOT* A LINC-8 BOOTABLE SYSTEM TAPE AND MUST BE / USED AS A FILES-ONLY TAPE IN CONJUNCTION WITH A LINC-8 BOOTABLE VERSION OF LAP6W. (THE / WB1116 TAPE BOOTS ON ANOTHER MACHINE SUCH AS LINC, U-LINC 100, U-LINC 300, PDP-12.) / MOST OF THE FILES ON TAPE WB1116 ARE ARCHIVAL FILES TAKEN FROM EARLIER SYSTEMS. SOME / HAVE MANUSCRIPT PSEUDO-SOURCE FILES WHICH ARE IN ACTUALITY SMALL DOCUMENTATION FILES OR / DIS-ASSEMBLED SOURCE FILES CLEARLY INDICATED AS SUCH. MOST FALL INTO THE CATEGORY OF / GAMES OR OTHER DEMONSTRATION PROGRAMS. / PROGRAM OPERATION. / PROGRAM EXECUTION REQUIRES THE PDP-8 PROGRAM "PROGOFOP" TO BE LOADED IN 00000-01777 TO / SIMULATE LINC CONSOLE OPERATIONS, TAPE OPERATIONS, AND PERFORM TERMINAL I/O OPERATIONS. / THIS IS THE STANDARD METHOD OF OPERATING THE LINC-8 FOR USE WITH ANY OF THE SEVERAL LINC / SOFTWARE SYSTEMS COMPATIBLE WITH THE LINC-8. LOADING THIS BINARY FILE FROM ANY OF THE / STANDARD LINC SYSTEMS (LAP4, LAP6, LAP6A, LAP6W, ETC.) WILL ACHIEVE THIS AUTOMATICALLY. / P?S/8 CAN LOAD PROGOFOP AND THIS PROGRAM SIMULTANEOUSLY SINCE P?S/8 OCCUPIES 07600-07777 / WHICH IS OUTSIDE OF THE OCCUPIED MEMORY AREA. / MEMORY MAP. / LOCATION FUNCTION / 00000-01777 PROGOFOP / 02000-03777 PONG CODE / 04000-07577 NOT USED / 07600-07777 P?S/8 (NOT REQUIRED IF RUN FROM A LINC SYSTEM) / ALTERNATE LOADING OPTIONS. / SINCE THIS IS A SMALL PROGRAM, OPERATION IS ALSO POSSIBLE FROM 04000-05777 OR 06000-07777 / (THE LAST IS NOT AVAILABLE FROM P?S/8). IN ALL CASES, PROGOFOP MUST BE LOADED IN / 00000-01777. / ASSEMBLY LANGUAGE CONVENTIONS. / THIS SOURCE FILE WAS CREATED BY "HAND" DIS-ASSEMBLY OF THE BINARY FILE TAKEN FROM TAPE / WB1116 BY OBSERVING AN OCTAL MEMORY DUMP LISTING OF THE FILE "PONG" ONLY. (NO SOURCE / MANUSCRIPT WAS AVAILABLE THERE.) / TO ENHANCE THE ASSEMBLY PROCESS, MORE DESCRIPTIVE SYMBOLS ARE LIBERALLY USED HERE, AS / OPPOSED TO THE TWO-CHARACTER RESTRICTIVE SYMBOLS IMPOSED BY EARLIER LINC SYSTEMS. ALL / SYMBOLS ARE CONSISTENT WITH LAP6-DIAL CONVENTIONS, AND ARE SIGNIFICENT IN THE FIRST SIX / ALPHANUMERICS ONLY (THE REST ARE ALLOWED BUT IGNORED). 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. / SCREEN NOTATION: / THROUGHOUT THIS LISTING THERE WILL BE ABSOLUTE COORDINATE REFERENCES. THESE ARE DEFINED / RELATIVE TO THE SCREEN COORDINATES OF THE LINC DISPLAY HARDWARE. HORIZONTAL COORDINATES / ARE 0000-0777 OCTAL AND VERTICAL COORDINATES ARE 7400-0377 OCTAL. USING ONE'S COMPLEMENT / NOTATION FOR THE VERTICAL VALUES CREATES THE RANGE -377 THROUGH +377. LARGER HORIZONTAL / VALUES MOVE TO THE RIGHT AND LARGER VERTICAL VALUES MOVE UPWARDS. THIS ASSUMES OBSERVING / THE OUTPUT ON AN OSCILLOSCOPE WITH THE INTENDED POLARITY AS IS STANDARD WITH THE NORMAL / LINC OR LINC-8 OR PDP-12 HARDWARE. / A COMMENT ON PROGRAMMING STYLE. / THE CODING ALGORITHMS EMPLOYED IN THIS PROGRAM ARE NOT NECESSARILY REPRESENTATIVE OF / EITHER A "GOOD" WAY TO IMPLEMENT THE CODE, NOR THE WAY CHARLES LASNER COULD HAVE WRITTEN / THE CODE. HOWEVER, THE CODE WAS ORIGINALLY WRITTEN AS REPRESENTED HERE. CLEARLY THERE / ARE INEFICIENCIES WHICH SUGGEST THE POSSIBILITY OF SEVERAL AUTHORS OF DIFFERENT SKILL / LEVELS, SUCH AS MIGHT OCCUR IN A CLASS PROJECT OR OTHER MULTI-PERSON WORK. FURTHERMORE, / THE UNUSUAL MEMORY LAYOUT WHICH LEAVES "HOLES" IN MEMORY SUGGESTS EITHER A MODULAR / APPROACH, WHICH WAS UNCOMMON IN PROGRAMS WRITTEN UNDER LINC-TYPE OPERATING SYSTEMS, OR / THAT A LOT OF PATCHING WAS DONE, WHICH WAS QUITE COMMON IN THOSE DAYS. THE SOURCE / NOTATION USED DOES NOT CONTAIN PURELY OCTAL CONSTRUCTIONS THAT WOULD RESULT FROM SUCH / PATCHING; ORDINARY SYMBOLIC NOTATION IS USED THROUGHOUT. THEREFORE, A LOT OF "SPAGHETTI / CODE" JUMPING OCCURS IN THE CODE THAT CAN BE OPTIMIZED OUT, BUT HAS BEEN LEFT IN BECAUSE / OF THE AUTHENTICITY REQUIREMENTS. / SYMBOL DEFINITIONS. LMODE /WE RUN IN LINC MODE USK= 0467 /UNCONDITIONAL SKIP ON LINC-8 /(NOT PDP-12 VALUE OF 0466) / MRI DEFINITIONS. FIXMRI JSR= 6000 /JUMP SUBROUTINE (WHICH RETURNS) / THE CODE STARTS HERE. SEGMNT 1 /LOADS INTO 0000 ON CLASSIC LINC *0 /START AT THE BEGINNING XR0, JMP STARTUP /GO START IT UP; FOR SYSTEMS THAT START HERE; /ALSO ALPHA REGISTER ZERO XR1, JMP STARTUP /GO START IT UP; THIS IS FOR THE EARLY LINC /SYSTEMS THAT START THE PROGRAM HERE; ALSO /ALPHA/BETA REGISTER ONE XR2, 0 /ALPHA/BETA REGISTER TWO XR3, 0 /ALPHA/BETA REGISTER THREE XR4, 0 /ALPHA/BETA REGISTER FOUR XR5, 0 /ALPHA/BETA REGISTER FIVE XR6, 0 /ALPHA/BETA REGISTER SIX XR7, 0 /ALPHA/BETA REGISTER SEVEN XR10, 0 /ALPHA/BETA REGISTER TEN XR11, 0 /ALPHA/BETA REGISTER ELEVEN XR12, 0 /ALPHA/BETA REGISTER TWELVE XR13, 0 /ALPHA/BETA REGISTER THIRTEEN XR14, 0 /ALPHA/BETA REGISTER FOURTEEN XR15, 0 /ALPHA/BETA REGISTER FIFTEEN XR16, 0 /ALPHA/BETA REGISTER SIXTEEN XR17, 0 /ALPHA/BETA REGISTER SEVENTEEN PMODE /GOTO THE TWO'S COMPLEMENT UNIVERSE FOR THIS ZBLOCK .&1777-20^7777 /GET PAST THE ALPHA/BETA REGISTERS LMODE /BACK TO LINC MODE / ADDITIONAL STORAGE LOCATIONS. A20, 0 A21, 0 A22, 0 A23, 0 A24, 0 /SCORE COUNTER A25, 0 /SCORE COUNTER / THE PROGRAM STARTS HERE. STARTUP,CLR /CLEAN UP AC, L, Z STC A24 /CLEAR THE SCORE STC A25 /CLEAR THE OTHER SCORE LDA I; 3 /GET A 3 STC A21 /STASH IT A34, CLR /CLEAN UP LDA I; -1 /GET A -1 STC A22 /STASH IT STC A23 /CLEAR LDA I; 377 /GET A 377 STC A75 /STASH IT STC A76 /CLEAR STC A573 /CLEAR STC A574 /CLEAR STC A575 /CLEAR JMP A634 /CONTINUE THERE A51, SET XR12; A22 /SETUP COUNT A53, JMP A102 /GO THERE A54, JMP A275 /GO THERE A55, JSR A150 /CALL THIS XSK I XR12 /DONE ENOUGH? JMP A53 /NO, KEEP GOING LDA; A23 /YES, GET THIS AZE /SKIP IF ZERO JMP A326 /ELSE GO THERE KST /KEYBOARD CHARACTER HIT? JMP A51 /NO, KEEP GOING KBD /YES, GET THE CHARACTER LDA I; 1 /GET A 1 STC A23 /STASH IT JMP A326 /GO THERE A73, 0 A74, 0 A75, 0 /BECOMES 0377 A76, 0 /BECOMES 0000 A77, -60 A100, 20 A101, 1 A102, CLR /CLEAN UP SET I XR1; 400 /SETUP INITIAL HORIZONTAL COORDINATE SET I XR4; -20 /SETUP LINE COUNT LDA I; -377 /SETUP INITIAL VERTICAL COORDINATE A111, SET I XR5; -20 /SETUP INNER LOOP COUNT A113, DIS XR1 /DISPLAY A POINT ADA I; 1 /UPDATE VERTICAL COORDINATE XSK I XR5 /DONE WITH INNER DISPLAY LOOP? JMP A113 /NO, KEEP GOING ADA I; 20 /ADD ON SPACING VALUE XSK I XR4 /DONE ENOUGH LINES? JMP A111 /NO, KEEP GOING SET XR1; A75 /SETUP POSITION SET I XR2; -5 /SETUP COUNT A130, SET I XR3; -5 /SETUP COUNT LDA; A76 /GET WHAT'S THERE A134, DIS XR1 /DISPLAY A POINT OF THE BALL ADA I; 6 /UPDATE VERTICAL COORDINATE XSK I XR3 /DONE WITH INNER DISPLAY LOOP? JMP A134 /NO, KEEP GOING LDA I; 6 /YES, GET UPDATE VALUE ADD XR1 /ADD TO HORIZONTAL COORDINATE STC XR1 /STORE BACK XSK I XR2 /DONE WITH OUTER DISPLAY LOOP? JMP A130 /NO, KEEP GOING JMP A54 /YES, RETURN TO CALLER A150, CLR /CLEAN UP ADD XR0 /GET RETURN JUMP STC A242 /STASH IT IN OUR EXIT LDA I; 40 /GET A 40 AS HORIZONTAL COORDINATE STC XR1 /STASH IT LDA; A24 /GET WHAT'S THERE STC XR2 /SETUP SCORE DISPLAY ARGUMENT JSR A243 /CALL SCORE DISPLAY ROUTINE LDA I; 720 /GET A 720 AS HORIZONTAL COORDINATE STC XR1 /STASH IT LDA; A25 /GET WHAT'S THERE STC XR2 /SETUP SCORE DISPLAY ARGUMENT JSR A243 /CALL SCORE DISPLAY ROUTINE SET I XR1; -0 /SET DISPLAY COORDINATE TO LEFT EDGE A173, LDA I; 377 /GET HIGHEST VERTICAL POSITION DIS I XR1 /INCREMENT HORIZONTAL AND DISPLAY LDA I; 7 /GET A 7 ADM; XR1 /ADD AS HORIZONTAL DISPLACEMENT XSK XR1 /SKIP IF HORIZONTAL IS -0 AGAIN JMP A173 /ELSE GO DO IT AGAIN A204, LDA I; -377 /GET LOWEST VERTICAL POSITION DIS I XR1 /INCREMENT HORIZONTAL AND DISPLAY LDA I; 7 /GET A 7 ADM; XR1 /ADD AS HORIZONTAL DISPLACEMENT XSK XR1 /SKIP IF HORIZONTAL IS -0 AGAIN JMP A204 /ELSE GO DO IT AGAIN A215, JMP A242 /EXIT THERE A216, SET I XR1; 0 /SET HORIZONTAL TO LEFT EDGE VALUE LDA I; -377 /GET LOWEST VERTICAL VALUE A222, DIS XR1 /DISPLAY A POINT ADA I; 1 /GO UP A NOTCH SAE I; 377 /SKIP IF AT UPPER LIMIT JMP A222 /ELSE GO DO IT AGAIN SET I XR1; 777 /SET HORIZONTAL TO RIGHT EDGE VALUE LDA I; -377 /GET LOWEST VERTICAL VALUE A234, DIS XR1 /DISPLAY A POINT ADA I; 1 /GO UP A NOTCH SAE I; 377 /SKIP IF AT UPPER LIMIT JMP A234 /ELSE GO DO IT AGAIN A242, JMP 0 /WILL BE JUMP RETURN TO CALLER / SUBROUTINE TO DISPLAY A TWO-DIGIT VALUE. / XR1 MUST BE SET TO THE HORIZONTAL POSITION FOR THE DIGITS. / XR2 CONTAINS THE VALUE FROM 00 THROUGH 77 OCTAL. / CHARACTERS ARE ONLY DISPLAYED AT 0340 VERTICALLY. A243, LDA; XR2 /GET WHAT'S THERE SCR 3 /HIGH OCTAL DIGIT TO LOW-ORDER MUL I; 2 /*2 FOR DOUBLE-WORD TABLE ADA I; NUMCHARS /ADD ON TABLE BASE STC XR3 /STASH THE CHARACTER POINTER LDA I; 340 /GET A 340 AS VERTICAL COORDINATE DSC XR3 /DISPLAY A DSC I XR3 /CHARACTER LDA; XR2 /GET IT AGAIN BCL I; 70 /ISOLATE LOW-ORDER DIGIT MUL I; 2 /*2 FOR DOUBLE-WORD TABLE ADA I; NUMCHARS /ADD ON TABLE BASE STC XR3 /STASH THE CHARACTER POINTER LDA I; 340 /GET A 340 AS VERTICAL COORDINATE DSC XR3 /DISPLAY A DSC I XR3 /CHARACTER JMP 0 /RETURN TO CALLER / SUBROUTINE TO ACQUIRE THE PLAYERS' PADDLE POSITIONS AND DISPLAY THE PADDLE / PATTERN AT THE CORRESPONDING SCREEN POSITION. A275, CLR /CLEAN UP ADD XR0 /GET RETURN JUMP STC A317 /STASH IT IN OUR EXIT SET I XR4; -2 /SETUP PLAYER COUNT SET I XR2; 20 /SETUP LEFT PADDLE HORIZONTAL COORDINATE SET XR1; A77 /SETUP XR1 TO WHAT'S THERE SAM 0 /GET LEFT PLAYER'S KNOB VALUE PADLAGN,JSR LIMITEST /CHECK IF IN LEGAL RANGE A310, DIS XR2 /DISPLAY A PADDLE POINT ADA I; 1 /ADD ONE TO VERTICAL COORDINATE XSK I XR1 /DONE YET? JMP A310 /NO, KEEP GOING XSK I XR4 /DONE IT ALL TWICE? USK /SKIP IF NOT A317, JMP 0 /WILL BE JUMP RETURN TO CALLER SET XR1; A77 /SETUP XR1 TO WHAT'S THERE AGAIN SET I XR2; 760 /SETUP RIGHT PADDLE HORIZONTAL COORDINATE SAM 6 /GET RIGHT PLAYER'S KNOB VALUE JMP PADLAGN /CONTINUE THERE A326, LDA; A75 /GET WHAT'S THERE ADD A21 /ADD THIS STC A75 /STORE BACK JSR A613 /CALL THIS LDA I; 377 /GET A 377 ADD A76 /ADD THIS APO /SKIP IF POSITIVE JMP A346 /ELSE GO THERE LDA I; -340 /GET A -340 ADD A76 /ADD THIS APO I /SKIP IF NEGATIVE JMP A353 /GO THERE JMP A356 /GO THERE INSTEAD A346, LDA I; -377 /GET A -377 A350, STC A76 /STORE AS NEW VALUE JMP A634 /CONTINUE THERE A352, JMP A356 /GO THERE A353, LDA I; 340 /GET A 340 JMP A350 /CONTINUE THERE A356, LDA I; -21 /GET A -21 ADD A75 /ADD TO THIS APO /SKIP IF POSITIVE JMP A371 /JUMP IF NOT LDA I; -722 /GET A -722 ADD A75 /ADD TO THIS APO /SKIP IF POSITIVE JMP A51 /JUMP IF NOT JMP A400 /GO THERE A371, LDA I; -16 /GET A -16 ADD A75 /ADD TO THIS APO /SKIP IF POSITIVE JMP A455 /JUMP IF NOT SAM 0 /GET LEFT PLAYER'S KNOB VALUE JMP A407 /CONTINUE THERE A400, LDA I; -725 /GET A -725 ADD A75 /ADD TO THIS APO I /SKIP IF NEGATIVE JMP A477 /JUMP IF NOT SAM 6 /GET RIGHT PLAYER'S KNOB VALUE JMP A407 /CONTINUE THERE A407, JSR LIMITEST /CHECK IF IN LEGAL RANGE A410, JSR A422 /CALL THIS (MIGHT NOT RETURN) STC A20 /STASH VALUE JMP A523 /CONTINUE THERE / THIS SUBROUTINE CHECKS IF A PADDLE VALUE IS WITHIN THE ALLOWED RANGE. IF THE VALUE IS / TOO LARGE, IT IS FORCED TO THE LARGEST VALUE ALLOWED (0316). THIS PREVENTS VALUES THAT / COULD UPSET THE GAME OPERATION, AND MAKES THE ANALOG INPUT COMPATIBLE WITH LINC, LINC-8, / AND PDP-12 HARDWARE. LIMITES,ADA I; -316 /ADD ON TEST LIMIT APO I /SKIP IF LESS CLR /ELSE THROW IT AWAY ADA I; 316 /RESTORE VALUE JMP 0 /RETURN TO CALLER / THIS SUBROUTINE CHECKS IF KNOB VALUES ARE IN A CERTAIN RANGE. IF THEY ARE NOT, THEN / CONTROL IS RETURNED TO THE MAIN DISPLAY LOOP, *NOT* THE CALLER! A422, STC A20 /STASH THERE ADD XR0 /GET RETURN JUMP STC A454 /STASH IT IN OUR EXIT ADD A20 /GET PASSED VALUE BACK COM /COMPLEMENT IT ADA I; 36 /ADD ON 36 ADD A76 /ADD ON THIS APO /SKIP IF POSITIVE JMP A51 /JUMP IF NOT LDA; A20 /GET WHAT'S THERE COM /COMPLEMENT IT ADD A77 /ADD WHAT'S THERE ADD A76 /ADD WHAT'S THERE APO I /SKIP IF NEGATIVE JMP A51 /JUMP IF NOT LDA; A77 /GET WHAT'S THERE COM /COMPLEMENT IT SCR 1 /%2 ADD A20 /ADD ON AGAIN COM /COMPLEMENT IT AGAIN ADA I; 17 /ADD ON 17 ADD A76 /ADD TO THIS A454, JMP 0 /WILL BE JUMP RETURN TO CALLER A455, LDA; A75 /GET WHAT'S THERE SCR 1 /%2 ROL 1 /*2 AZE /SKIP IF ZERO JMP A51 /JUMP IF NOT LDA I; 377 /GET A 377 STC A75 /STASH NEW VALUE STC A23 /CLEAR THIS LDA I; "G&237 /GET A CHARACTER OPR 14 /OUTPUT A BEEP LDA I; 1 /GET A 1 ADM; A25 /UPDATE THE SCORE JMP A34 /GO BACK TO THE BEGINNING A477, LDA; A75 /GET WHAT'S THERE SCR 1 /%2 ROL 1 /*2 ADA I; -750 /ADD ON -750 APO /SKIP IF POSITIVE JMP A51 /JUMP IF NOT LDA I; 377 /GET A 377 STC A75 /STASH NEW VALUE STC A23 /CLEAR THIS LDA I; "G&237 /GET A CHARACTER OPR 14 /OUTPUT A BEEP LDA I; 1 /GET A 1 ADM; A24 /UPDATE THE SCORE JMP A34 /GO BACK TO THE BEGINNING A523, CLR /CLEAN UP ADD A21 /GET THIS COM /COMPLEMENT IT STC A21 /STORE BACK ADD A21 /GET IT BACK STC A534 /STORE IN-LINE ALSO ADD A20 /GET THIS SCR 4 /%16 MUL I; A534, 0 /MULTIPLY BY WHAT GETS STORED HERE STC A556 /STORE PRODUCT ADD A556 /GET IT BACK SCR 14 /MOVE DOWN TO Z REGISTER STC A555 /STASH THE ARITHMETIC SIGN ADD A573 /GET THIS ADA I; 5 /ADD ON 5 APO /SKIP IF POSITIVE JMP A667 /JUMP IF NOT LDA I; -2 /GET -2 ADD A573 /ADD ON THIS APO I /SKIP IF NEGATIVE JMP A701 /JUMP IF NOT JMP A722 /CONTINUE THERE / ADDITIONAL STORAGE LOCATIONS. A554, 0 A555, 0 A556, 0 A557, 0 A560, 0 A561, 0 A562, 0 A563, 0 A564, 0 A565, 0 A566, 0 A567, 0 A570, 0 A571, 0 A572, 0 A573, 0 A574, 0 A575, 0 A576, 1 A577, 6000 A600, 1 A601, CLR /CLEAN UP ADD A76 /ADD WHAT'S THERE SCR 14 /MOVE DOWN TO Z REGISTER STC A563 /STASH THE ARITHMETIC SIGN ADD A76 /GET WHAT'S THERE STC A564 /STASH IT ADD A75 /GET WHAT'S THERE STC A567 /STASH IT STC A566 /CLEAR THIS JMP 0 /RETURN TO CALLER A613, CLR /CLEAN UP ADD XR0 /GET RETURN JUMP STC A633 /STASH IT IN OUR EXIT JSR A601 /CALL THIS JSR A1147 /CALL THIS 13; 573 5; 565 2; 570 4016; 562 /LAST ARGUMENT LDA; A564 /GET WHAT'S THERE STC A76 /STORE IT THERE A633, JMP 0 /WILL BE JUMP RETURN TO CALLER A634, CLR /CLEAN UP ADD XR0 /GET RETURN JUMP STC A657 /STASH IT IN OUR EXIT JSR A601 /CALL THIS JSR A1147 /CALL THIS 13; 576 6; A644, 573 15; 573 5; 565 6; 576 1; 562 4015; 570 /LAST ARGUMENT A657, JMP 0 /WILL BE JUMP RETURN TO CALLER A660, LDA; A556 /GET WHAT'S THERE APO /SKIP IF POSITIVE COM /ELSE COMPLEMENT IT STC A556 /STORE BACK STC A555 /CLEAR THIS JMP 0 /RETURN TO CALLER A667, JSR A660 /CALL THIS JSR A1147 /CALL THIS 13; 573 5; 554 4015; 0573 /LAST ARGUMENT JMP A634 /CONTINUE THERE A700, JMP A51 /CONTINUE THERE A701, JSR A660 /CALL THIS LDA; A556 /GET WHAT'S THERE AZE /SKIP IF ZERO JMP DONTBMP /JUMP IF NOT ADA I; 2 /ADD ON A 2 STC A556 /STORE BACK DONTBMP,JSR A1147 /CALL THIS 13; 573 7; 554 4015; 573 /LAST ARGUMENT JMP A634 /CONTINUE THERE A721, JMP A51 /CONTINUE THERE A722, JSR A1147 /CALL THIS 13; 573 1; 554 4015; 573 /LAST ARGUMENT JMP A634 /CONTINUE THERE A732, JMP A51 /CONTINUE THERE ZBLOCK 1000-. /EMPTY SPACE / CHARACTER PATTERNS FOR DISPLAYED NUMERALS. / FIRST HALF SECOND HALF DISPLAYED CHARACTER NUMCHAR,4136; 3641 /0 2101; 0177 /1 4523; 2151 /2 4122; 2651 /3 2414; 0477 /4 5172; 0651 /5 1506; 4225 /6 4443; 6050 /7 5126; 2651 /8 5122; 3651 /9 ZBLOCK 1147-. /EMPTY SPACE A1147, LDA; XR0 /GET RETURN JUMP INSTRUCTION ADA I; 1776 /FORM POINTER TO IN-LINE LIST STC XR2 /STASH THE POINTER LDA I; JMP A1157 /GET DEFAULT JMP INSTRUCTION STC A1604 /STASH IT THERE A1157, LDA I XR2 /GET A VALUE FROM THE TABLE ROL I 1 /MOVE UP SCR 1 /MOVE DOWN ADD A1644 /ADD ON WHAT'S THERE STC XR5 /STASH IT THERE LZE I /SKIP IF LINK SET JMP A1172 /JUMP IF NOT ADA I; JMP XR2 /GET JMP INSTRUCTION ADD XR2 /ADD ON TABLE POINTER STC A1604 /STORE THERE A1172, LDA I XR2 /GET A VALUE FROM THE TABLE AZE I /SKIP IF NOT ZERO ADD A1572 /ADD THIS IF ZERO APO I /SKIP IF NEGATIVE JMP A1205 /JUMP IF NOT STC XR3 /STORE ZAP ADDRESS LDA XR3 /GET CURRENT CONTENTS ADD A1246 /ADD WHAT'S THERE STA XR3 /STORE BACK ADA I; -3 /ADD ON -3 A1205, STC XR4 /STASH IT THERE SET XR6; XR4 /SAVE THERE ALSO LDA XR6 /GET WHAT'S THERE STC A1773 /STASH IT LDA I XR6 /GET NEXT VALUE STC A1774 /STASH IT LDA I XR6 /GET NEXT VALUE STC A1775 /STASH IT A1216, SET I XR6; A1771!4000 /SET XR6 TO THIS SET I XR1; A1774!4000 /SET XR1 TO THIS LDA XR6 /GET A VALUE BCO XR1 /XOR WITH OTHER SCR 13 /MOVE DOWN COM /COMPLEMENT STC A1543 /STASH IT HERE ADD A1763 /GET THIS STC A1251 /STORE THERE STC A1510 /CLEAR THERE JMP XR5 /RETURN JUMP IS THERE A1233, JSR A1272 /CALL THIS A1234, ADD A1773 /ADD THIS STC A1770 /STORE THERE ADD A1774 /ADD THIS STC A1771 /STORE THERE ADD A1775 /ADD THIS STC A1772 /STORE THERE JMP A1604 /GO THERE A1243, SET XR4; XR0 /SAVE RETURN JUMP FOR EXIT LATER STA; A1246, XR3 /STASH PASSED VALUE COM /COMPLEMENT IT A1250, SET I XR5; A1251, 0 /SET XR5 TO WHAT GETS STORED HERE ADM XR5 /ADD TO WHAT'S POINTED TO LDA I XR5 /GET THE NEXT SCR I 1 /%2 STA XR5 /STORE BACK LDA I XR5 /GET WHAT'S IN THE NEXT ROR I 1 /%2 STA XR5 /STORE BACK SCR 14 /MOVE TO Z REGISTER XSK I XR3 /DONE ALL YET? JMP A1250 /NO, GO BACK SET XR5; A1251 /SET XR5 TO WHAT'S THERE AGAIN ROR I 1 /%2 BCO I XR5 /XOR THE NEXT STC A1510 /STASH IT THERE JMP XR4 /RETURN TO CALLER A1272, SET XR4; XR0 /SAVE RETURN JUMP FOR EXIT LATER CLR /CLEAN UP ADD A1774 /GET THIS COM /COMPLEMENT IT STC A1774 /STORE BACK ADD A1775 /GET THIS COM /COMPLEMENT IT STC A1775 /STORE BACK JMP XR4 /RETURN TO CALLER A1304, JSR A1272 /CALL THIS ADD A1543 /GET THIS COM /COMPLEMENT IT STC A1543 /STORE BACK ADD A1774 /GET THIS AZE I /SKIP IF NON-ZERO JMP A1604 /ELSE GO THERE LDA XR6 /GET WHAT'S POINTED TO AZE I /SKIP IF NON-ZERO JMP A1234 /ELSE GO THERE CLR /CLEAN UP ADD A1770 /GET THIS COM /COMPLEMENT IT ADD A1773 /COMPARE TO THIS FLO /SKIP IF IT OVERFLOWED JMP A1327 /ELSE GO THERE SCR 14 /MOVE TO Z REGISTER BCO I; 7737 /XOR WITH -40 A1327, SCR I 1 /%2 ROL I 1 /*2 LZE I /SKIP IF LINK SET COM /ELSE COMPLEMENT IT AZE I /SKIP IF NON-ZERO JMP A1344 /ELSE GO THERE STC A1472 /STORE IT IN-LINE THERE ADD A1572 /GET THIS LZE I /SKIP IF LINK SET STC A1251 /ELSE STORE HERE CLR /CLEAN UP ADD A1472 /GET THIS JSR A1243 /CALL THIS A1344, SRO; A1543 /SKIP AND ROTATE ON WHAT'S THERE JMP A1355 /JUMP THERE IF NO SKIP JSR A1363 /CALL THIS COM /COMPLEMENT STC A1543 /STORE THERE LZE /SKIP IF LINK IS CLEAR JMP A1645 /ELSE GO THERE JMP A1515 /GO THERE A1355, JMP A1645 /GO THERE A1356, STC XR0 /STORE THERE LZE /SKIP IF LINK CLEAR STC A1543 /ELSE STORE HERE JSR A1363 /CALL THIS JMP A1515 /GO THERE A1363, SET XR4; XR0 /SAVE RETURN JUMP FOR EXIT LATER CLR /CLEAN UP ADD A1775 /GET THIS LAM; A1772 /TWO'S COMPLEMENT ADD WITH LINK WHAT'S THERE LDA; A1774 /GET WHAT'S THERE LAM XR6 /TWO'S COMPLEMENT ADD WITH LINK TO WHAT'S => STC XR0 /STORE IT THERE LAM; A1772 /TWO'S COMPLEMENT ADD WITH LINK WHAT'S THERE STC XR0 /STORE IT THERE LAM XR6 /TWO'S COMPLEMENT ADD WITH LINK TO WHAT'S => SCR I 14 /MOVE TO Z REGISTER JMP XR4 /RETURN TO CALLER A1403, SET XR3; XR0 /SAVE RETURN JUMP FOR EXIT LATER ADD A1770 /GET THIS SCR I 1 /%2 ROL I 1 /*2 STC A1770 /STORE BACK FLO /SKIP IF IT OVERFLOWED JMP XR3 /RETURN IF NOT LZE /SKIP IF LINK CLEAR A1414, HLT /SHOULDN'T HALT! JMP A1571 /GO THERE A1416, SET XR3; XR0 /SAVE RETURN JUMP FOR EXIT LATER ROL I 1 /*2 STC XR0 /STORE THERE ADD A1772 /GET THIS ROL I 1 /*2 STC A1772 /STORE BACK ADD A1771 /GET THIS ROL I 1 /*2 STC A1771 /STORE BACK JMP XR3 /RETURN A1431, ADD A1773 /GET THIS JSR A1403 /CALL THIS JMP A1645 /GO THERE ZTA /GET Z REGISTER STC A1775 /STORE THERE ADD A1772 /GET THIS SCR 14 /MOVE TO Z REGISTER ZTA /GET Z REGISTER STA; A1772 /STORE THERE MUL XR1 /MULTIPLY BY WHAT'S POINTED TO STC A1472 /STORE HIGH-ORDER PRODUCT IN-LINE THERE ZTA /GET LOW-ORDER PRODUCT STC A1465 /STORE IN-LINE THERE ADD A1775 /GET THIS MUL XR6 /MULTIPLY BY WHAT'S POINTED TO ADD A1472 /ADD ON THIS ROL I 1 /*2 STC A1472 /STORE BACK IN-LINE ROL I 1 /GET THE LINK STC A1510 /STORE THERE ZTA /GET Z REGISTER ADD A1465 /ADD THIS STC A1465 /STORE BACK ADD A1775 /GET THIS MUL; A1772!4000 /MULTIPLY BY WHAT'S THERE LAM I; A1465, 0 /TWO'S COMPLEMENT ADD WITH LINK TO WHAT'S STORED BCL I; 1777 /WANT TWO HIGHEST BITS ONLY ROL I 3 /MOVE UP LAM I; A1472, 0 /TWO'S COMPLEMENT ADD WITH LINK TO WHAT'S STORED STC XR0 /STORE THERE LAM; A1510 /TWO'S COMPLEMENT ADD WITH LINK WHAT'S THERE LDA XR1 /GET WHAT'S POINTED TO MUL XR6 /MULTIPLY BY WHAT'S POINTED TO ADM; A1510 /ADD ON WHAT'S THERE ZTA /GET Z REGISTER ROL 1 /*2 LAM; A1472 /TWO'S COMPLEMENT ADD WITH LINK WHAT'S THERE STC A1772 /STORE BACK LAM I; A1510, 0 /TWO'S COMPLEMENT ADD WITH LINK TO WHAT'S STORED STC A1771 /STORE IT ADD A1465 /GET THIS ROL 2 /*4 STC A1510 /STORE THERE A1515, CLR /CLEAN UP ADD A1771 /GET THIS APO I /SKIP IF NEGATIVE JMP A1554 /JUMP IF NOT A1521, ROR I 1 /%2 STC A1771 /STORE THERE ADD A1772 /GET THIS ROR I 1 /%2 STC A1772 /STORE THERE ADD A1777 /GET THIS JSR A1403 /CALL THIS A1530, ADD A1772 /GET THIS ROR I 1 /%2 STC XR0 /STORE THERE LAM; A1772 /TWO'S COMPLEMENT ADD WITH LINK WHAT'S THERE STC XR0 /STORE THERE LAM; A1771 /TWO'S COMPLEMENT ADD WITH LINK WHAT'S THERE APO /SKIP IF POSITIVE JMP A1521 /JUMP IF NOT SET I XR5; A1543, 0 /SET XR5 TO WHAT GET'S STORED HERE XSK XR5 /SKIP IF AT -0 COM /ELSE COMPLEMENT IT STC A1771 /STORE BACK ADD A1772 /GET THIS XSK XR5 /SKIP IF AT -0 COM /ELSE COMPLEMENT IT STC A1772 /STORE BACK JMP A1604 /GO THERE A1554, SET I XR1; -30 /SET XR1 TO -30 A1556, CLR /CLEAN UP ADD A1771 /GET THIS SCR I 13 /MOVE DOWN LZE /SKIP IF LINK IS CLEAR JMP A1530 /JUMP IF NOT ADD A1510 /GET THIS JSR A1416 /CALL THIS ADD A1776 /GET THIS JSR A1403 /CALL THIS XSK I XR1 /BUMP AND SKIP IF ZERO JMP A1556 /KEEP GOING A1571, SET I XR4; A1572, 1770 /SET XR4 TO 1770 STC A1770 /CLEAR THIS STC A1771 /CLEAR THIS STC A1772 /CLEAR THIS ADD A1770 /GET THIS STA XR4 /STORE WHERE THIS POINTS TO LDA XR6 /GET WHAT'S POINTED TO STA I XR4 /STORE WHERE POINTED TO LDA I XR6 /GET THE NEXT STA I XR4 /STORE THE NEXT A1604, 0 /WILL BE A JUMP SOMEWHERE / TABLE? -36 -467 -36 -473 -36 -346 -36 -106 -204 -36 -543 -544 -201 A1622, SET XR6; XR4 /SAVE XR4 IN XR6 ADD A1771 /GET THIS STC A1774 /STORE THERE ADD A1772 /GET THIS STC A1775 /STORE THERE ADD A1770 /GET THIS APO /SKIP IF POSITIVE CLR /ELSE CLEAR IT ADD A1742 /GET THIS APO I /SKIP IF NEGATIVE A1635, HLT /ELSE BARF AZE /SKIP IF ZERO JSR A1243 /ELSE CALL THIS LDA XR1 /GET WHAT'S THERE STA I XR6 /STORE WHERE POINTED TO LDA I XR1 /GET WHAT'S POINTED TO STA I XR6 /STORE WHERE POINTED TO A1644, JSR A1604 /CALL THIS A1645, SET XR4; XR0 /SET XR4 TO WHAT'S THERE SET I XR3; A1771-2 /SET XR3 TO THIS A1651, XSK I XR3 /BUMP XR3 LDA I XR3 /GET NEXT VALUE SCR I 1 /%2 ROL I 1 /*2 APO /SKIP IF POSITIVE COM /ELSE COMPLEMENT IT STA XR3 /STORE BACK LDA I XR3 /GET NEXT LZE /SKIP IF LINK CLEAR COM /ELSE COMPLEMENT IT STA XR3 /STORE BACK SRO I; 2525 /SKIP AND ROTATE JMP A1651 /GO BACK SCR 14 /MOVE DOWN JMP XR4 /RETURN A1671, JSR A1645 /CALL THIS ADD A1773 /ADD THIS COM /COMPLEMENT IT JSR A1403 /CALL THIS ADD A1774 /ADD THIS AZE I /SKIP IF NON-ZERO A1677, HLT /ELSE BARF CLR /CLEAN UP STC A1472 /CLEAR THIS ADD A1771 /GET THIS COM /COMPLEMENT STC A1771 /STORE BACK ADD A1772 /GET THIS COM /COMPLEMENT STC A1772 /STORE BACK SET I XR1; -30 /SET XR1 T0 -30 A1712, JSR A1363 /CALL THIS APO /SKIP IF POSITIVE JMP A1720 /JUMP IF NOT JSR A1272 /CALL THIS JSR A1363 /CALL THIS JSR A1272 /CALL THIS A1720, STC XR0 /STORE THERE LAM; A1472 /TWO'S COMPLEMENT ADD WITH LINK WHAT'S THERE XSK I XR1 /DONE ENOUGH? JMP A1731 /GO THERE STC A1772 /STORE THERE ADD A1510 /GET THIS STC A1771 /STORE THERE JMP A1515 /GO THERE A1731, ROL I 1 /*2 STC A1472 /STORE BACK ADD A1510 /GET THIS ROL I 1 /*2 STC A1510 /STORE BACK ADD A1771 /GET THIS JSR A1416 /CALL THIS JMP A1712 /CONTINUE THERE A1741, SET I XR1; A1742, -27 /SET XR1 TO -27 LDA I; 27 /GET A 27 A1745, STC A1773 /STORE THERE ADD A1774 /GET THIS SCR 12 /MOVE DOWN AZE /SKIP IF ZERO JMP A1766 /ELSE GO THERE SCR I 1 /%2 ADD A1775 /ADD THIS ROL I 1 /*2 STC A1775 /STORE BACK ADD A1774 /GET THIS ROL I 1 /*2 STC A1774 /STORE BACK ADD A1776 /GET THIS ADM; A1763, A1773 /ADD TO THIS XSK I XR1 /DONE YET? JMP A1745 /NO, KEEP GOING A1766, XSK I XR5 /BUMP XR5 JMP A1216 /GO THERE A1770, 0 A1771, 0 A1772, 0 A1773, 0 A1774, 0 A1775, 0 A1776, -1 A1777, 1 / END PINGPONG $ /THAT'S ALL FOLK!