C PROGRAM MANUAL.FT C ----------------- C C C GERSON GROSFELD C IMAGE PROCESSING UNIT,DCBD C NATIONAL CANCER INSTITUTE C BETHESDA, MARYLAND 20014 C C WRITTEN 11 JUN 1975 C REVISED 22 JUL 1975 C REVISED 12 AUG 1975 C REVISED 29 AUG 1975 C REVISED 3 SEP 1975 C REVISED 12 SEP 1975 C REVISED 16 SEP 1975 C REVISED 24 SEP 1975 C REVISED 1 OCT 1975 C REVISED 10 OCT 1975 C REVISED 20 OCT 1975 C REVISED FEB 23, 1976 - LEMKIN, AT 1.1 MANUAL, AND(0777 ==>AND (0777 C REVISED APR 20, 1976 : LEMKIN, DON'T CALL CLOCK IF 1/200 SEC. C C C INTRODUCTION C ------------ C "MANUAL.FT" IS THE RTPP STEPPING MOTORS PACKAGE, CONSISTING C OF THE EXTERNALLY CALLABLE SUBROUTINES: "MANUAL", "MOTORS", C AND "MVMTR". C C C ERRORS C ------ C C 901: MISSED FBW SIGNALS (MANUAL) C 921: ILLEGAL MOTOR NUMBER (MOTORS) C 922: ILLEGAL OPERATION (MOTORS) C 923: DESIRE > UPPER LIMITS (MOTORS) C 924: DESIRE < LOWER LIMITS (MOTORS) C C C C COMPILE AS: C ---------- C .MUNG GUBED,MANUAL.FT C .COMPILE MANUAL.RL,MANUAL.LS, MODE B (ALSO DOES AN MQL) S OPDEF SWBA 7447 /MODE B ==> MODE A S OPDEF DLD 7663 /DOUBLE PRECISION LOAD S OPDEF DAD 7443 /DOUBLE PRECISION ADD S OPDEF DST 7445 /DOUBLE PRECISION STORE S OPDEF DPIC 7573 /DOUBLE PRECISION INCREMENT (ADD 1) S OPDEF DCM 7575 /DOUBLE PRECISION 2'S COMPLIMENT S SKPDF DPSZ 7451 /DOUBLE PRECISION SKIP ON ZERO (AC & MQ) C C C OPDEF'S FOR RTPP MOTOR CONTROLS C ------------------------------- S OPDEF FBW1 6341 S OPDEF FBW10 6350 S OPDEF FBW11 6351 S OPDEF FBW12 6352 S OPDEF MSTAG 6366 S OPDEF STEP 6305 S OPDEF DETB 6420 S OPDEF DETC 6421 S OPDEF DET1 6422 S OPDEF DET2 6423 S OPDEF DET34 6424 C C C SPECIAL INSTRUCTIONS C -------------------- S OPDEF TADI 1400 /"FAKED" INDIRECT S OPDEF DCAI 3400 /"FAKED" INDIRECT S ABSYM LOLIM 130 /LO-ORDER LOWER MOTOR LIMIT S ABSYM UPLIM 132 /LO-ORDER UPPER LIMIT S ABSYM DESIRE 134 /LO-ORDER DESIRED MOTOR POSITION S ABSYM CURRENT 136 /LO-ORDER CURRENT POSITION C C C*******DEBUG C@C OPDEF'S FOR DEBUGGING FEATURE C@C ----------------------------- C@S OPDEF FBW4 6344 C@S OPDEF FBW5 6345 C@S OPDEF FBW6 6346 C@S OPDEF FBW7 6347 C@S OPDEF RKYPDL 6353 C@S SKPDF SKPKPD 6313 C@S OPDEF DISP1 6435 C@S OPDEF DISP2 6436 C@S OPDEF QSTAT 6374 C@S OPDEF CLKACK 6302 C@S SKPDF CLKSKP 6303 C******* C C C*********************************************************************** C SUBROUTINE MANUAL C*********************************************************************** C C C PURPOSE C ------- C THE FUNCTION OF "MANUAL" IS TO READ IN THE SWITCHES C ASSOCIATED WITH THE 10 'MOTORS' OF THE RTPP, ASSEMBLE C THE BIT PATTERNS OF THE SWITCHES IN THE ORDER C REQUIRED BY THE HARDWARE, CALL "MOTORS" FOR EACH ACTIVE C MOTOR, DETERMINE THE APPROPRIATE MOTOR SPEED, AND CALL C "MVMTR" ACCORDINGLY. C C C ARGUMENTS C --------- C NONE (EXCEPT CONTROL DESK KEYS LISTED BELOW) C C C C OUTLINE ("MANUAL") C ------------------ C C [0.0] INITIALIZE C C C [1.0] READ IN THE FBW'S (FUNCTION BOX WORDS) AND TEST C FOR MISSED SIGNALS. C C THE FOLLOWING 4 FBW'S ARE SERVICED: C C FBW1: Z (FOCUS),Y AND X STAGE POSITIONS C FBW10: THRESHOLD B, THRESHOLD C, AND ZOOM C FBW11: WAVELENGTH,NEUTRAL DENSITY, AND SPARE 1 C FBW12: SPARE 2, (NOT USED), (NOT USED) C C THE BIT PATTERNS ARE AS FOLLOWS: C C BITS CONTENTS C ----- ----------------------------------- C 0-2 UNUSED C 3-5 SPEED BITS (IN SAME ORDER AS ABOVE) C 6-11 "+" & "-" MOVEMENT RESPECTIVELY C FOR EACH IN THE ABOVE ORDER C C C C [2.0] DO THE REQUIRED BIT SHIFTING TO SET UP THE MOTOR C WORDS WITH THE CORRECT BIT PATTERNS. C C THERE ARE SIX STEPPING MOTORS (CURRENTLY) AMONG C THE ABOVE 10. THE 'MSTAG' INSTRUCTION IN HARDWARE C REQUIRES THE "+" & "-" BITS FOR EACH MOTOR TO BE IN C THE FOLLOWING SEQUENCE: C C WAVELENGTH,NEUTRAL DENSITY,ZOOM,Z,Y,X C C THEREFORE, THE BITS FROM MW1,MW10, AND MW11 MUST C BE DIDDLED AROUND TO FORM THE APPROPRIATE PATTERN. C FURTHER, A SECOND WORD IS FORMED USING C THRESHOLDS B AND C, AND SPARE WORDS 1 AND 2, C (JUST IN CASE ADDITIONAL STEPPING MOTOR HARDWARE IS C IMPLEMENTED). THE WORD IS ASSEMBLED IN THE C GIVEN ORDER. C C THE STEPPING MOTOR WORD IS 'MTRWRD' C THE THRESHOLD AND SPARE MOTOR WORD IS 'MTHSPWD' C BOTH ARE IN COMMON C C C C [3.0] CALL "MOTORS" TO CHANGE THE TARGET POSITION C IN SOFTWARE, AND TO SET UP THE ACTIVE MOTOR C WORD. C C FOR EACH MOTOR IN 'MTRWRD' AND 'MTHSPWD' WHICH C REQUIRES A + OR - CHANGE, THE APPROPRIATE CALL C TO "MOTORS" IS MADE TO CHANGE THE SOFTWARE TARGET C POSITION AND TO SET A BIT IN THE 'MACTIVE' WORD. C IF THE CHANGE WOULD EXCEED THE POSITION LIMITS, NO C CHANGE IS MADE AND THE 'MACTIVE' BIT IS NOT SET FOR C THAT MOTOR. C C THE CALLS ARE MADE THRU THE "SETUP" SUBROUTINE C WHICH IS DESCRIBED IN DETAIL IN THE SUBROUTINE SECTION. C 'IHOLD' IS A HOLDING VARIABLE, 'IHI' AND 'ILO' C ARE THE BIT RANGES OF THE 'MACTIVE' WORD FOR C 'MTRWRD' (1-6) AND 'MTHSPWD' (7-12). C C C C [4.0] ASSEMBLE THE MOTOR SPEED WORD WITH THE CORRECT C BIT PATTERN. C C THERE IS A SPEED BIT ASSOCIATED WITH EACH OF C THE 12 MOTORS. WHEN THIS BIT IS SET, THE ASSOCIATED C MOTOR SHOULD MOVE AT IT'S "FAST" RATE RATHER THAN THE C NORMAL RATE. THESE SPEED BITS WERE THROWN AWAY WHEN C THE MOTOR WORDS (MTRWRD & MTHSPWD) WERE FORMED AND MUST C NOW BE RETRIEVED AND ASSEMBLED INTO A SINGLE 12 BIT C LOCAL MOTOR SPEED WORD ('MSPDWRD') IN THE FOLLOWING C ORDER:WL,ND,ZM,Z,Y,X,THB,THC,SP1,SP2,@,@ C C (NOTE: @ = UNUSED BITS) C C C C [5.0] DETERMINE THE MAXIMUM MOTOR SPEED, WHICH IS C EQUAL TO THE SPEED OF THE SLOWEST ACTIVE MOTOR. C C WHEN MORE THAN ONE MOTOR IS ACTIVE, THE SPEED C AT WHICH THE MOTORS MAY MOVE MUST BE EQUAL TO THE C SLOWEST MOTOR ACTIVE. AS THE SLOWER MOTORS BECOME C INACTIVE (I.E. REACH THEIR GOAL) THE SPEED THEN C BECOMES THAT OF THE NEXT SLOWEST MOTOR, ETC. C THE ACTIVE MOTORS ARE CHECKED AND A MAXIMUM IS C DETERMINED. THIS THEN BECOMES THE MOTOR RATE. C THE MAXIMUM IS INITALLY SET ZERO. C THE ACTIVE MOTOR WORD IS COPIED IN 'IHOLD' SO AS C TO PROTECT THE BIT PATTERN DURING THE SHIFTING. C C C C [6.0] CALL "MVMTR" TO CHANGE THE SOFTWARE MOTOR POSITION C AND TO PHYSICALLY MOVE THE MOTORS. C C C C [7.0] RETURN C C CLEAR ALL MOTOR BITS AND RETURN C PROGRAM C ------- C C C [0.0] INITIALIZE C S ENTRY MANUA S CPAGE 2 S MANUA,BLOCK 2 C C*******DEBUG C@S CLA C@S TAD \IDEVICE C@S SNA CLA /IS THE OUTPUT DEVICE SET C@S JMP \1 /NO C@ WRITE(IDEVICE,1001) C@1001 FORMAT(/,' ENTRY MANUAL',/) C@C CALL MDUMP C******* C S CLA CLL C C C [0.1] CLEAR PERTINENT VARIABLES C 1 IERRNUM=0 MW1=0 MW10=0 MW11=0 MW12=0 MSPDWRD=0 C C C [1.0] READ AND TEST FBW'S C C [1.1] GET & STORE FBW'S LOCALLY C S FBW1 S AND (0777 /Z,Y,X S DCA \MW1 /STORE IN 'MW1' FOR LATER USE S FBW10 S AND (0777 /THB, THC, ZM S DCA \MW10 /STORE S FBW11 S AND (0777 /WL, ND, SP1 S DCA \MW11 /STORE S FBW12 S AND (0460 /SP2,@,@ S DCA \MW12 /STORE C C (NOTE: @ = UNUSED BITS) C C C [1.2] TEST FOR MISSED SIGNALS C S TAD \MW1 /ADD ALL WORDS TOGETHER...... S TAD \MW10 S TAD \MW11 S TAD \MW12 S SNA CLA /IF AC IS NOT ZERO, THEN SKIP, A-OK S JMP \901 /MISSED SIGNAL:ERROR RETURN C C C C [2.0] SET UP MOTOR WORDS C C [2.1] ASSEMBLE 'MTRWRD' C S TAD \MW11 /LOAD WL,ND,SP1 S AND (74 /CLEAR OUT SPEED BITS & SP1 S MQL /HOLD IT IN MQ BITS 6-9 S TAD \MW10 /LOAD THB,THC,ZM S AND (3 /ONLY SAVE ZM BITS (10-11) S MQA /TACK ON WL & ND TO FRONT S BSW /MOVE BITS 6-11 TO BITS 0-5 S MQL /HOLD IN MQ S TAD \MW1 /LOAD Z,Y,X S AND (77 /CLEAR SPEED BITS S MQA /ADD MQ BITS 0-5 TO FORM WORD S DCA \MTRWRD /WL,ND,ZM,Z,Y,X (+ & -) C C C [2.2] FORM 'MTHSPWD' C S TAD \MW10 /LOAD THB,THC,ZM S AND (74 /LEAVE ONLY THB & THC S MQL /PUT IN MQ BITS 6-9 S TAD \MW11 /LOAD WL,ND,SP1 S AND (3 /LEAVE ONLY SP1 IN BITS 10-11 S MQA /ADD MQ BITS 6-9 S BSW /MOVE BITS 6-11 TO BITS 0-5 S MQL /PUT BACK IN MQ BITS 0-5 S TAD \MW12 /LOAD SP2 S AND (60 /CLEAR OUT SPEED BIT S MQA /ADD MQ BITS 0-5 TO FRONT TO FORM WORD S DCA \MTHSPWD /THB,THC,SP1,SP2,@,@ C C (NOTE: @ = UNUSED BITS) C C C C [3.0] CALL "MOTORS" C IHOLD=MTRWRD IHI=1 ILO=6 S JMS SETUP /JUMP TO SUBROUTINE C IHOLD=MTHSPWD IHI=7 ILO=12 S JMS SETUP /JUMP TO SUBROUTINE C C C [4.0] ASSEMBLE THE MOTOR SPEED WORD C S TAD \MW12 /LOAD SP2 S AND (100 /ONLY KEEP SPEED BIT THIS TIME S RTR;RAR /MOVE BIT 3 TO BIT 6 S MQL /STASH AWAY IN MQ S TAD \MW11 /LOAD WL,ND,SP1 S AND (100 /KEEP ONLY SP1 SPEED BIT S MQA /ADD ON MQ BIT (SP2) S MQL /PUT SPARES BACK IN MQ S TAD \MW10 /LOAD THB,THC,ZM S AND (600 /KEEP ONLY THB & THC SPEED BITS S MQA /TACK ON MQ BITS 5-6 TO AC BITS 3-4 S RTR;RAR /MOVE TO BITS 6-9 S MQL /STORE IN MQ (HALFWAY THERE!) S TAD \MW1 /Z,Y,X S AND (700 /ONLY KEEP SPEED BITS S MQA /TACK ON MQ BITS 6-9 S MQL /STORE IN MQ BITS 3-9 S TAD \MW10 /THB,THC,ZM S AND (100 /ONLY KEEP ZM SPEED BIT S RTL;RAL /ROTATE BIT 5 LEFT TO BIT 2 S MQA /TACK ON MQ BITS 3-9 S MQL /STORE IN MQ AGAIN (BITS 2-9) S TAD \MW11 /WL,ND,SP1 S AND (600 /KEEP WL & ND SPEED BITS THIS TIME S RTL;RAL /MOVE BITS 3-4 LEFT TO BITS 0-1 S MQA /TACK ON MQ BITS 3-9 TO FORM 'MSPDWRD' S DCA \MSPDWRD /WL,ND,ZM,Z,Y,X,THB,THC,SP1,SP2,@,@ GOTO 500 C C (NOTE: @ = UNUSED BITS) C C C C [5.0] SET MAXIMUM SPEED C S PSLOW, \MSLOW /POINTER TO TOP OF SLOW MOTOR SPEED ARRAY S PFAST, \MFAST /POINTER TO TOP OF FAST MOTOR SPEED ARRAY C 500 MAXIMUM=0 MTRSPD=0 IHOLD=MACTIVE C DO 599 N=1,12 S TAD \IHOLD /LOAD ACTIVE MOTOR WORD S RAL /MOVE HI-ORDER BIT INTO LINK S DCA \IHOLD /REPLACE BODY OF WORD S SNL /SKIP IF LINK IS SET (I.E. MOTOR ACTIVE) S JMP NOPE /IF NOT, CONTINUE TESTING S CLL /CLEAR THE LINK S TAD \MSPDWRD /LOAD THE MOTOR SPEED WORD S RAL /MOVE THE SAME MOTOR BIT INTO THE LINK S DCA \MSPDWRD /REPLACE THE ROTATED BODY S SNL /SKIP IF LINK SET (I.E. SPEED SET) S JMP NORMAL /NOPE, NORMAL SPEED FOR THIS MOTOR S CLL CMA /SET AC=-1 S TAD \N /ADD MOTOR OFFSET S TAD PFAST /ADD MFAST ARRAY POINTER (IN COMMON) S DCA 127 /ADDRESS OF DESIRED ARRAY ELEMENT (TEMP. STORAGE) C S CPAGE 5 S 6211 /CDF 10 FOR COMMON (FIELD 1) S TADI 127 /GET SPEED S JMS 45 /RESTORE DATA FIELD S NOP /REQUIRED 2ND LOCATION C S DCA \MTRSPD /SAVE SPEED LOCALLY S JMP \525 /GO TEST AGAINST MAXIMUM C S NORMAL, CLL CMA /SET AC=-1 S TAD \N /ADD MOTOR OFFSET S TAD PSLOW /ADD MSLOW ARRAY POINTER (IN COMMON) S DCA 127 /ADDRESS OF DESIRED ARRAY ELEMENT C S CPAGE 5 S 6211 /CDF 10 FOR COMMON (FIELD 1) S TADI 127 /GET SPEED S JMS 45 /RESTORE DATA FIELD S NOP /REQUIRED 2ND INSTRUCTION C S DCA \MTRSPD /STORE SPEED LOCALLY S JMP \525 /GO TEST AGAINST MAXIMUM S NOPE, TAD \MSPDWRD /LOAD SPEED BIT WORD S RAL /ROTATE TO KEEP IN STEP WITH 'IHOLD' S CLL /LINK SHOULD BE 0, BUT MAKE SURE! S DCA \MSPDWRD /REPLACE FOR NEXT PASS;SET DUMMY SPEED MTRSPD=0 525 IF(MAXIMUM-MTRSPD)550,599,599 550 MAXIMUM=MTRSPD 599 CONTINUE C C C C [6.0] CALL MVMTR ACCORDING TO MAXIMUM SPEED, C UNLESS NO MOTORS ARE ACTIVE ('MACTIVE'= 0) C IF(MACTIVE)600,799,600 600 IF(MAXIMUM)610,610,620 610 MAXIMUM=1 C 620 CONTINUE C*******DEBUG C@S FBW6 /SEE IF ALTERNATE SPEED SET C@S AND (7700 /ONLY KEEP SPEED BITS C@S BSW /SWAP BYTES C@S SZA /ANYTHING SET? C@S DCA \MAXIMUM /YES, STORE IT C******* C C DO NOT CALL THE CLOCK IF MAXIMUM < 2 SINCE IT WILL BE CALLED C ONCE OUTSIDE! IF(MAXIMUM-1)652,652,651 651 DO 650 INTERVAL=1,MAXIMUM CALL CLOCK 650 CONTINUE C C 652 CALL MVMTR C C*******DEBUG C@S CLA C@S TAD \IDEVICE /GET I/O SWITCH C@S SNA CLA /SKIP IF SET C@S JMP \799 /NO, DON'T PRINT C@ WRITE(IDEVICE,1002) C@1002 FORMAT(/,' RETURN MANUAL',/) C@ CALL MDUMP C******* C C C C [7.0] CLEAR ACTIVE BITS AND RETURN C MACTIVE=0 MTRWRD=0 MTHSPWD=0 C C S \799, RETRN MANUA /RETURN C C C ******************************************************** C SUBROUTINE "SETUP" C ******************************************************** C C SETUP ASSUMES A 12 BIT WORD STORED IN 'IHOLD' C CONSISTING OF A + AND - BIT FOR EACH OF SIX MOTORS. C C IF EITHER BIT FOR A MOTOR IS SET, "MOTORS" IS C CALLED TO CHANGE THE TARGET ACCORDINGLY, AND TO SET C THE CORRECT BIT IN THE 'MACTIVE' ACTIVE MOTOR WORD. C FOR 'MTRWRD' THE BIT RANGE SHOULD BE 1 THRU 6 (IE IHI=1, C ILO=6) AND FOR 'MTHSPWD' IT SHOULD BE 7 THRU 12 FOR THE C OUTER (MTRNUM) "DO-LOOP" C THE INNER (MTROP) LOOP CHECKS BOTH THE + AND - BITS C FOR EACH MOTOR, THUS PROVIDING "MOTORS" WITH THE C APPROPRIATE OPERATION CODE (IE 1=INCREMENT, 2= C DECREMENT). C C TWO CONSECUTIVE CALLS TO THIS ROUTINE ARE NECESSARY C (ONE WITH MTRWRD AND ONE WITH MTHSPWD) TO COMPLETE THE C ACTIVE MOTOR WORD 'MACTIVE'. C C THE 'MACTIVE' BIT SEQUENCE IS AS FOLLOWS: C (WL,ND,ZM,Z,Y,X,THB,THC,SP1,SP2,@,@) C C (NOTE: @ = UNUSED BIT) C ******************************************************** S CPAGE 3 /KEEP THE NEXT TWO INSTRUCTIONS TOGETHER S RSET, JMP I SETUP /RETURN S SETUP,0000 /ENTRY POINT S CLA CLL /CLEAR AC & LINK AT START DO 888 MTRNUM=IHI,ILO DO 888 MTROP=1,2 S TAD \IHOLD /LOAD WORD S RAL /MOVE HI-ORDER BIT INTO LINK S DCA \IHOLD /REPLACE REST OF ROTATED WORD S SNL /SKIP IF LINK SET (IE BIT ON) S JMP \888 /IF NOT, CHECK OTHER DIRECTION (+ OR -) C CALL MOTORS C C*******DEBUG C@S CLA C@S TAD \IDEVICE C@S SNA CLA /IO SWITCH SET? C@S JMP \888 C@ WRITE(IDEVICE,1002) C@ CALL MDUMP C******* C 888 CONTINUE S CLA CLL /CLEAN OUT ANY GARBAGE S JMP RSET /GO TO RETURN C C********END "MANUAL"******** C*********************************************************************** C SUBROUTINE MOTORS C*********************************************************************** C C C PURPOSE C ------- C THE FUNCTION OF "MOTORS" IS TO SET THE DESIRED C SOFTWARE MOTOR POSITION FOR A GIVEN MOTOR AND C TO TEST THAT POSITION AGAINST THE SOFTWARE LIMITS C (BOTH UPPER AND LOWER) BEFORE CHANGING THE VALUES C IN COMMON. IF THE DESIRED POSTION IS OUTSIDE THE C SET LIMITS, NO CHANGE IS MADE AND AN ERROR FLAG IS SET. C C C ARGUMENTS C --------- C THERE ARE TWO ARGUMENTS TO MOTORS: MTRNUM & MTROP C MTRNUM IS THE MOTOR NUMBER (FROM 1 THRU 12) C MTROP IS THE OPERATION NUMBER (FROM 1 THRU 4) C C BOTH ARGUMENTS ARE PASSED THRU COMMON. C C C OUTLINE ("MOTORS") C ------------------ C C [0.0] INTIALIZE. C C C [1.0] TEST FOR LEGAL MOTOR (1-12). C C LEGAL MOTORS ARE NUMBERED AS FOLLOWS: C C MOTOR MOVES C ----- ------ C 1 WAVELENGTH (ALIAS FREQUENCY) C 2 NEUTRAL DENSITY (ALIAS INTENSITY) C 3 ZOOM C 4 Z (FOCUS) C 5 Y (STAGE) C 6 X (STAGE) C 7 THRESHOLD B C 8 THRESHOLD C C 9 SPARE 1 C 10 SPARE 2 C 11 (NOT USED) C 12 (NOT USED) C C C [2.0] TEST FOR LEGAL OPERATION (1-4). C C LEGAL OPERATIONS ARE AS FOLLOWS: C C OPERATION MEANS C --------- --------------------------- C 1 ADD 1 TO DESIRE C 2 SUBTRACT 1 FROM DESIRE C 3 ADD TO DESIRE, RELATIVE C 4 SET DESIRE, ABSOLUTE C C FOR THE ABSOLUTE AND RELATIVE CHANGE, THE HIGH AND LOW C ORDER WORDS USED ('MHIVAL' & 'MLOVAL') ARE PASSED THRU C COMMON. C C C [3.0] SET UP LOCAL DOUBLE PRECISION DATA. C C THE LOWER AND UPPER LIMITS AND THE DESIRED MOTOR C POSITION ARE COPIED LOCALLY FROM THE DOUBLE PRECISION C ARRAY 'MDPDATA' IN COMMON. ASSEMBLY LANGUAGE IS C USED RATHER THAN FORTRAN TO CONSERVE TIME, SINCE THE C DOUBLE SUBSCRIPTING IN FORTRAN USES AN INTERPRATIVE C MULTIPLY TO DECODE THE SUBSCRIPTS WHICH TAKES FOREVER! C C A POINTER IS SET TO THE BEGINNING OF THE ARRAY C AND THE OFFSET IS CALCULATED ACCORDING TO THE MOTOR C NUMBER ('MTRNUM'). THIS OFFSET = (MTRNUM*8)-8. C THE POINTER ADDRESS IS THEN AT THE TOP OF THE COLUMN C OF OF THE FOUR DOUBLE PRECISION VALUES FOR THAT C PARTICULAR MOTOR. THE ADDRESS IS THEN STEPPED THRU C USING INDIRECT "TAD'S" TO EXTRACT THE LOW AND HIGH ORDER C DOUBLE PRECISION VALUES FROM COMMON FOR LOCAL STORAGE. C C C [4.0] CHANGE MODES AND PERFORM DESIRED CHANGE C IN SOFTWARE MOTOR TARGET. C C CHANGE FROM MODE A TO MODE B FOR THE DOUBLE C PRECISION INSTRUCTIONS, THEN DO A GOTO ON THE OPERATOR. C C C [5.0] TEST NEW TARGET AGAINST LIMITS. C C IF THE LOCAL DESIRE IS OUTSIDE THE RANGE C OF THE LIMITS, THEN SET AN ERROR FLAG AND RETURN C WITHOUT CHANGING THE TARGET IN COMMON. C C C [6.0] UPDATE DESIRE IN COMMON, IF VALID. C C AGAIN, AS IN [3.0] ABOVE, ASSEMBLY LANGUAGE MUST BE USED C TO TRANSFER THE DATA RATHER THAN FORTRAN II. C 'ADDRESS' WAS LEFT POINTING TO THE HIGH ORDER TARGET C POSITION WORD, SO BY SUBTRACTING ONE THE CORRECT C ADDRESS POSITION IS ACHIEVED. (IE LOW ORDER TARGET POS.) C C C [7.0] SET ACTIVE MOTOR BIT, IF VALID. C C ONE BIT OF A 12 BIT WORD ('MACTIVE') IN COMMON IS SET C FOR EACH MOTOR WHOSE DESIRED SOFTWARE MOTOR POSITION C WAS CHANGED. THIS IS DONE BY LOOPING 'MTRNUM' TIMES C WHILE ROTATING 'MACTIVE'; SETTING THE LINK BIT (WHICH C WILL THEN CORRESPOND TO 'MTRNUM'); AND CONTINUING C THE LOOP TO RESTORE THE CORRECT 'MACTIVE' BIT C SEQUENCE (A TOTAL OF 13 ROTATIONS). C THE TWO "DO-LOOPS" ARE HAND CODED IN SABR TO PRESERVE THE C ORIGINAL CONTENTS OF THE LINK BIT, WHICH WOULD BE LOST C IF THE FORTRAN II STATEMENTS WERE USED. C C C [8.0] RETURN. C C C PROGRAM C ------- C C [0.0] INITIALIZE C S ENTRY MOTOR S CPAGE 2 S MOTOR, BLOCK 2 C C*******DEBUG C@S CLA C@S TAD \IDEVICE C@S SNA CLA /SKIP IF SWITCH SET C@S JMP \2 /NO, CONTINUE C@ WRITE(IDEVICE,1003) C@1003 FORMAT(/,' ENTRY MOTORS',/) C@ CALL MDUMP C******* C C [0.1] CLEAR ERROR FLAG C 2 IERRNUM=0 MOFFSET=0 C C C [1.0] TEST FOR LEGAL MOTOR C IF(MTRNUM)921,921,10 10 IF(MTRNUM-12)20,20,921 C C C C [2.0] TEST FOR LEGAL OPERATION C 20 IF(MTROP)922,922,21 21 IF(MTROP-4)30,30,922 C C C C [3.0] SET UP LOCAL DOUBLE PRECISION DATA C S PDATA,\MDPDATA /POINTER TO TOP OF DP DATA ARRAY IN COMMON C S \30, CLA CLL /CLEAN UP S TAD \MTRNUM /LOAD MOTOR NUMBER (1-12) S RTL;RAL /ROTATE LEFT 3 TIMES (N<==N*8) S TAD (-10 /SUBTRACT 8 (N<==N-8) [8=10 OCTAL] S DCA \MOFFSET /TOP OF COLUMN IN TABLE FOR GIVEN MOTOR. S CMA /LOAD "-1" (OFFSET FOR AUTO-INDEXING) S TAD PDATA /TOP OF D.P. DATA ARRAY S TAD \MOFFSET /OFFSET FOR GIVEN MOTOR NUMBER S DCA 15 /ADDRESS OF 1ST DATA ITEM FOR THAT MOTOR. C S CPAGE 15 S 6211 /CDF 10 (COMMON IN FIELD 1) C S TADI 15 /GET LOW ORDER LOWER LIMIT (AND AUTO-INDEX!) S DCA LOLIM /STORE ON PAGE 0 S TADI 15 /GET HIGH ORDER LOWER LIMIT (INDEX TOO) S DCA LOLIM# /STORE SECOND WORD (PAGE 0) C S TADI 15 /GET LOW ORDER UPPER LIMIT (INDEX) S DCA UPLIM /STORE ON PAGE 0 S TADI 15 /GET HIGH ORDER UPPER LIMIT (INDEX) S DCA UPLIM# /STORE 2ND WORD (PAGE 0) C S TADI 15 /GET LOW ORDER TARGET POSITION (INDEX) S DCA DESIRE /STORE ON PAGE 0 S TADI 15 /GET HIGH ORDER WORD (AUTO-INDEX) S DCA DESIRE# /STORE ON PAGE 0 C S CPAGE 3 S JMS 45 /RESTORE CURRENT FIELD S NOP /NECESSARY S CLA CLL /JUST TO BE TIDY C C C C [4.0] CHANGE MODES AND CHANGE DESIRE C S SWAB /SWITCH MODE A TO MODE B GOTO(41,42,43,44)MTROP C C C [4.1] ADD 1 TO DESIRE C S CPAGE 2 /KEEP THE NEXT 2 INSTRUCTIONS TOGETHER S \41, DLD /LOAD S DESIRE /DESIRE S DPIC /INCREMENT (ADD 1) C (DESIRE<=DESIRE+1) GOTO 45 C C C [4.2] SUBTRACT 1 FROM DESIRE C S \42, CAM /CLEAR OUT AC & MQ S DPIC /LOAD +1 S DCM /NEGATE (2'S COMPLIMENT) S CPAGE 2 /KEEP NEXT 2 TOGETHER S DAD /ADD S DESIRE /(DESIRE<=DEISRE-1) GOTO 45 C C C [4.3] ADD TO DESIRE, RELATIVE C S \43, CAM /CLEAR OUT AC & MQ S TAD \MLOVAL S MQL /PUT IN MQ (DBL PR. CONVENTION) S TAD \MHIVAL /LOAD HI-ORDER VALUE INTO AC S CPAGE 3 /KEEP NEXT TWO WORDS TOGETHER S JMS 45 /RESTORE CURRENT FIELD S NOP C S CPAGE 2 S DAD /ADD S DESIRE /(DESIRE<=DESIRE+VALUE) GOTO 45 C C C [4.4] SET DESIRE, ABSOLUTE C S \44, CAM /CLEAR OUT AC & MQ S TAD \MLOVAL /LOAD LO-ORDER VALUE S MQL /PUT IN MQ S TAD \MHIVAL /LOAD HI-ORDER VALUE C (DESIRE<=VALUE) S CPAGE 3 S JMS 45 /RESTORE CURRENT FIELD S NOP GOTO 45 C C C [4.5] REPLACE DESIRE (LOCAL) C S CPAGE 2 /KEEP NEXT 2 TOGETHER S \45, DST /STORE S DESIRE /INTO DESIRE S CAM /CLEAR OUT AC & MQ C C C C [5.0] TEST AGAINST LIMITS C C [5.1] TEST IF DESIRE > UPPER LIMIT C S CPAGE 2 /KEEP NEXT 2 WORDS TOGETHER S DLD /LOAD S DESIRE S DCM /NEGATE (2'S COMPLIMENT) S CPAGE 2 /KEEP NEXT 2 TOGETHER S DAD /ADD S UPLIM /UPPER LIMIT S SPA /IF AC IS NEG.,THEN DESIRE>LIMIT:ERROR GOTO 923 C C C [5.2] TEST IF DESIRE < LOWER LIMIT C S CPAGE 2 /KEEP NEXT TWO TOGETHER S DLD /LOAD S LOLIM /LOWER LIMIT S DCM /NEGATE (2'S COMPLIMENT) S CPAGE 2 /KEEP NEXT 2 TOGETHER S DAD /ADD S DESIRE S SPA /IF AC IS NEG.,THEN DESIREDESIRE, THEN DECREMENT DESIRE C C C [1.2.1] IF CURRENT=DESIRE, CLEAR MOTOR C BITS AND ACTIVE BIT C C DETERMINE WHICH MOTOR WORD TO C CLEAR; CLEAR MOTOR DIRECTION BITS C USING THE "CLEAR" SUBROUTINE. C NOTE: BY JUMPING TO 299 C INSTEAD OF 298 THE APPROPRIATE C MACTIVE ACTIVE MOTOR BIT IS C ALSO CLEARED. C C C [1.3] RESTORE CURRENT IN COMMON C C AFTER RESTORING THE CURRENT POSITION LOCALLY, C THE SAME ASSEMBLY LANGUAGE TECHNIQUE MUST BE C USED TO RESTORE THE CURRENT POSTION IN COMMON AS C WAS USED IN [1.1] ABOVE. THE ADDRESS POINTER C WAS LEFT AT THE HIGH ORDER CURRENT WORD, C SO SUBTRACTING ONE FROM THE ADDRESS WILL C RETURN IT TO THE PROPER POSITION. C C C [1.4] STORE THRESHOLDS IF ACTIVE C C C [2.0] END LOOP C C IF CURRENT WAS CHANGED IN THIS PASS, THE LINK C BIT IS SET, OTHERWISE IT IS CLEAR FOR THE NEXT ROTATION C OF THE MACTIVE WORD. C C C [3.0] RESTORE ACTIVE WORD BIT PATTERN C C C [4.0] UPDATE APPROPRIATE THRESHOLDS C C ANY ONE OF THREE QUANTIMET MODULES MAY BE USED, EACH C HAVING ITS OWN PAIR OF THRESHOLDS. ALL ARE OPERATED BY C THE SAME TWO 5-POSITION SWITCHES ON THE CONTROL DESK C BUT REQUIRE DIFFERENT 'OPR' INSTRUCTIONS TO SET THEM. C THE 'MODET' SWITCH IIN COMMON IS SET ACCORDING TO WHICH C MODULE IS BEING USED: C C MODET THRESHOLDS C ---- ---------- C -1 TH1 & TH2 (DET1 & DET2) C 0 THB & THC (DETB & DETC) [STANDARD] C +1 TH3 & TH4 (DET34) C C THRESHOLDS 3 & 4 ARE 6-BIT VALUES WHICH MUST BE C COMBINED INTO ONE 12 BIT WORD TO SET. C C C [5.0] EXECUTE MOTOR WORDS IF NON-ZERO C C C [6.0] RETURN C C C [0.0] INITIALIZE C S ENTRY MVMTR S CPAGE 2 S MVMTR,BLOCK 2 C S CLA CLL C C*******DEBUG C@S CLA C@S TAD \IDEVICE C@S SNA CLA /SWITCH SET? C@S JMP \3 /NO, DON'T PRINT C@ WRITE(IDEVICE,1004) C@1004 FORMAT(/,' ENTRY MVMTR',/) C@ CALL MDUMP C******* C C NOTE: NECESSARY ARRAY POINTERS USABLE FROM "MOTOR" ROUTINE C C C [1.0] BEGIN MOTOR LOOP C S \3, CLA CLL /TIDY UP FIRST S DCA \MTRNUM /CLEAR COUNTER S \101, ISZ \MTRNUM /INDEX COUNTER S TAD \MTRNUM /LOAD COUNTER S CIA /NEGATE S TAD (14 /ADD 12 (CAUSES OVERFLOW INTO LINK) S CML /COMPLIMENT LINK TO RESTORE CONTENTS S SPC /SKIP IF AC>=0, AND ALWAYS CLEAR AC S JMP \300 C C (END OF HAND CODING) C S TAD \MACTIVE /LOAD ACTIVE WORD S RAL /MOVE HI-ORDER BIT INTO LINK S DCA \MACTIVE /RESTORE ROTATED BODY OF WORD S SNL /SKIP IF LINK BIT SET (IE ACTIVE MOTOR) S JMP \299 /LINK=0;MOTOR NOT ACTIVE;CONTINUE LOOP S JMP \110 /LINK WAS 1;MOTOR ACTIVE;GO PROCESS C C C [1.1] GET CURRENT & DESIRE FROM COMMON LOCALLY C S \110, CLL /CLEAR LINK BIT S TAD \MTRNUM /GET PRESENT MOTOR NUMBER S RTL;RAL /MOVE LEFT 3 TIMES (MTR<=MTR*8) S TAD (-10 /SUBTRACT 8 (8=10 OCTAL) S DCA \MOFFSET /TABLE OFFSET FOR MOTOR NUMBER S CMA RAL /LOAD "-2" FOR AUTO-INDEX OFFSET S TAD PDATA /TOP OF ARRAY S TAD \MOFFSET /TOP OF APPROPRIATE COLUMN S TAD (4 /MOVE DOWN TO LO-ORDER TARGET S DCA 15 /SAVE ADDRESS IN AUTO-INDEX REG. C S 6211 /CDF 10 (FIELD 1 FOR COMMON) C S TADI 15 /GET LO-ORDER TARGET (AND INDEX) S DCA DESIRE /STORE ON PAGE 0 S TADI 15 /GET HI-ORDER TARGET POS. (INDEX) S DCA DESIRE# /STORE 2ND WORD (PAGE 0) C S TADI 15 /GET LO-ORDER CRN POS. (INDEX) S DCA CURRENT /STORE ON PAGE 0 S TADI 15 /GET HI-ORDER CURRENT (INDEX) S DCA CURRENT# /STORE (PAGE 0) C S CPAGE 3 S JMS 45 /RESTORE CURRENT FIELD S NOP /REQUIRED SAFETY LOCATION S CLA CLL /TIDY UP C C C [1.2] COMPARE CURRENT & DESIRE C S SWAB /CHANGE TO MODE B FOR DBL. PRECISION S CPAGE 2 /KEEP THE NEXT 2 INSTRUCTIONS TOGETHER S DLD /LOAD S CURRENT S DCM /NEGATE (2'S COMPLIMENT) S CPAGE 2 /KEEP NEXT 2 TOGETHER S DAD /ADD S DESIRE /AC MQ <=DESIRE-CURRENT S SPA /SKIP IF AC >=0 S JMP \123 /IF AC<=0,THEN DESIRE0, THEN DESIRE>CURRENT C C C [1.2.1] DESIRE=CURRENT C S SWBA /CHANGE BACK TO NORMAL MODE A S CAM;CLL /CLEAR OUT AC, MQ & LINK S TAD \MTROP /GET OPERATION S TAD (-3 /IS IS 3 OR 4? S SPC /IF SO SKIP (AND CLEAR) S JMP \299 /IF NOT, NO NEED TO CLEAR S JMS GETBIT /GET "+" BIT INTO LINK S CLL;RAL /CLEAR IT, AND GET "-" BIT IN LINK S CLL;RAL /CLEAR IT AND ROTATE S JMS REPLACE /REPLACE CORRECT BIT ORDER S JMP \299 /GO CLEAR ACTIVE BIT C C C [1.2.2] DESIRE > CURRENT C INCREMENT CURRENT C S CPAGE 2 /KEEP NEXT 2 TOGETHER S \122, DLD /LOAD S CURRENT S DPIC /INCREMENT (ADD 1) S CPAGE 2 /KEEP NEXT 2 TOGETHER S DST /STORE S CURRENT /CURRENT S CAM /CLEAR OUT AC&MQ S TAD \MTROP /GET OPERATION S TAD (-3 /A 3 OR 4? S SPC /IF SO, SKIP (AND CLEAR) S JMP \130 /IF NOT, SCRAM S JMS GETBIT /GET "+" BIT S CLL CML;RAL /SET LINK & ROTATE S CLL;RAL /CLEAR "-" BIT & ROTATE S JMS REPLACE /REPLACE CORRECT BIT ORDER S JMP \130 /CONTINUE C C C [1.2.3] DESIRE < CURRENT, C SUBTRACT 1 FROM CURRENT C S \123, CAM /CLEAR AC & MQ S DPIC /LOAD +1 S DCM /NEGATE (=-1) S CPAGE 4 /KEEP NEXT 4 TOGETHER S DAD /ADD S CURRENT /CURRENT<=CURRENT-1 S DST /STORE S CURRENT /CURRENT S CAM /CLEAN UP AC & MQ S TAD \MTROP /GET OPERATION S TAD (-3 /SEE IF IT'S 3 OR 4 S SPC /IF SO, SKIP (AND CLEAR) S JMP \130 /IF NOT, JUMP OUT S JMS GETBIT /GET "+" BIT INTO LINK S CLL;RAL /CLEAR "+" BIT & GET "-" BIT S CLL CML;RAL /SET "-" BIT AND ROTATE S JMS REPLACE /REPLACE CORRECT BIT ORDER S JMP \130 /CONTINUE C C C [1.3] RESTORE CURRENT IN COMMON C S \130, SWBA /CHANGE TO MODE A (NORMAL) S CMA RAL /SET AC TO -2 FOR AUTO-INDEXING S TAD 15 /ADD ADDRESS (NOW AT CURRENT#) S DCA 15 /ADDRESS NOW BEFORE CURRENT C S 6211 /CDF 10 (COMMON FIELD 1) C S TAD CURRENT /LOAD CURRENT S DCAI 15 /REPLACE IN COMMON (AND INDEX) S TAD CURRENT# /LOAD HI-ORDER CURRENT S DCAI 15 /REPLACE (& INDEX) C S CPAGE 3 S JMS 45 /RESTORE CURRENT FIELD S NOP /REQUIRED 2ND LOCATION C*******DEBUG C@S FBW5 C@S CIA C@S TAD \MTRNUM C@S SZA C@S JMP \139 C@S TAD CURRENT C@S DISP2 C******* S \139, CLA CLL /KEEP THINGS TIDY C C C [1.4] IF THRESHOLDS ACTIVE, STORE NEW VALUES C IF (MTRNUM-7)298,141,142 S \141, TAD CURRENT /LOAD LO-ORDER CURRENT S DCA \MVAL1 /STORE FOR LATER UPDATE GOTO 298 C 142 IF(MTRNUM-8)298,143,298 S \143, TAD CURRENT /LOAD LO-ORDER CURRENT S DCA \MVAL2 /STORE FOR LATER UPDATE GOTO 298 C C C C [2.0] BOTTOM OF LOOP C S \298, CLL CML /SET LINK: JUMP HERE AFTER CHANGING CURRENT S CAM /CLEAR AC & MQ JUST TO BE SURE C C (HAND CODED BOTTOM OF LOOP) S \299, JMP \101 /CONTINUE LOOP C C (END OF HAND CODING) C C [3.0] DO FINAL ROTATION OF MACTIVE TO MAINTAIN BIT PATTERN S \300, CML /NECESSARY TO COMLIMENT TO RESTORE CONTENTS S TAD \MACTIVE S RAL S DCA \MACTIVE C C C [4.0] CHANGE THRESHOLDS IF ACTIVE S TAD \MACTIVE /LOAD ACTIVE WORD S AND (60 /LEAVE ONLY THRESHOLDS S SNA CLA /SKIP IF EITHER ACTIVE GOTO 501 IF(MODET)420,410,430 C 4.1 UPDATE THRESHOLDS B & C S \410, TAD \MVAL1 /LOAD THRESHOLD VALUE S DETB /CHANGE THRESHOLD S TAD \MVAL2 /LOAD SECOND THRESHOLD S DETC /UPDATE GOTO 501 C C 4.2 UPDATE THRESHOLDS 1 & 2 S \420, TAD \MVAL1 /LOAD THRESHOLD VALUE S AND (7700 /ONLY KEEP HI-ORDER 6 BITS S BSW /SWAP TO BITS 6-11 S DET1 /UPDATE S TAD \MVAL2 /LOAD SECOND THRESHOLD S AND (7700 /ONLY KEEP HI-ORDER 6 BITS S BSW /SWAP TO BITS 6-11 S DET2 /UPDATE GOTO 501 C C 4.3 UPDATE THRESHOLDS 3 & 4 S \430, TAD \MVAL1 /GET 6-BIT THRESHOLD VALUE S AND (7700 /ONLY KEEP HI-ORDER 6 BITS S MQL /STORE IN MQ S TAD \MVAL2 /GET 2ND 6-BIT VALUE S AND (7700 /ONLY KEEP HI-ORDER 6 BITS S BSW /SWAP TO BITS 6-11 S MQA /TACK ON VAL1 TO FRONT S DET34 /SET THRESHOLDS 3 & 4 GOTO 501 C C C [5.0] LOAD AND EXECUTE THE MOTOR WORDS IF NON-ZERO C 501 CONTINUE C*******DEBUG C@S FBW6 /ALTERNATE DELAY SET? C@S AND (0077 C@S SNA C@S JMP \503 /NO, USE STANDARD DELAYS C@S CIA /YES, NEGATE C@S DCA 125 /PUT IN SHORT DELAY ON PAGE 0 C@S CMA /LOAD -1 C@S DCA 126 /PUT HERE FOR CONTINUITY C@S JMP \505 C******* S\503, TAD (-3 /C. 10.2 USEC DELAY S DCA 125 /STORE ON PAGE 0 S TAD (-10 /C. 29.2 USEC DELAY S DCA 126 /STORE ON PAGE 0 C#S TAD(??? /LOAD NECESSARY EXTRA TIME DELAY C#S DCA 127 /STORE ON PAGE 0 C# NOTE: LOC 20 ON PAGE 0 CAN BE USED FOR AN EXTRA DELAY C# TIMER IF NEEDED. S \505, TAD \MTRWRD /LOAD MOTOR WORD S AND (0360 /LEAVE ONLY ZOOM & Z (FOCUS) S SNA /SKIP IF ANY BITS ARE ON S JMP LITES /NO ZM OR Z, NO NEED TO STEP;TEST REST S MSTAG /LOAD BITS INTO BUFFER S STEP /AND STEP MOTORS S LITES,TAD \MTRWRD /RELOAD MOTOR WORD S AND (7417 /ANYTHING ELSE? S SNA /SKIP IF YES S JMP OFF /NOPE, GO RETURN S MSTAG /PULSE ALL OTHER MOTORS S WAIT1,ISZ 125 /WAIT...................[10.2 USEC] S JMP WAIT1 /KEEP WAITING S TAD \MTRWRD /RELOAD MOTOR WORD [ 5.0 USEC] S AND (0017 /CHECK Y & X [ 2.6 USEC] S SNA /SKIP IF BITS ON [ 1.2 USEC] S JMP OFF /NO MORE; SHUT OFF [ 1.2 USEC] C [TOTAL SO FAR: 20.2 USEC] S WAIT2,ISZ 126 /WAIT SOME MORE.........[29.2 USEC] S JMP WAIT2 /KEEP WAITING S OFF, CLA CLL /CLEAN OUT AC,ETC. S MSTAG /ZERO BUFFER C C# NOTE: THE 'SMOTOR' INSTRUCTION TO PULSE SPARES 1 & 2 C# CAN BE WORKED INTO THE ABOVE CODE DEPENDING ON THE C# TYPE OF MOTOR USED AND DELAY NECESSARY IF ANY. C# ......TAD \MTHSPWD C# ......AND (14 /ONLY SPARES 1 & 2 C# ......SNA /SKIP IF BITS ON C# ......JMP ELSEWHERE C# ......SMOTOR /PULSE C# ......(WAIT OR STEP, DEPENDING ON MOTOR TYPE)... C# ................................................ C C C C C C C 6.0 RETURN C S \699, RETRN MVMTR /RETURN C C ******************************************************** C SUBROUTINE GETBIT C ******************************************************** C S CPAGE 3 S RBITS,JMP I GETBIT S GETBIT,0000 /ENTRY POINT S CLA IF(MTRNUM-6)2001,2001,2002 2001 MTMPWD=MTRWRD NROT1=1-(MTRNUM+MTRNUM) GOTO 2003 C 2002 MTMPWD=MTHSPWD NROT1=13-(MTRNUM+MTRNUM) C 2003 NROT2=-(12+NROT1) C S CLL /CLEAR LINK AT START S TAD \MTMPWD /LOAD WORD C S LEFT, RAL /MOVE 1 BIT LEFT (INTO LINK) S ISZ \NROT1 /TEST 1ST ROTATION COUNTER S JMP LEFT /KEEP ROTATING S JMP RBITS /"+" BIT IN LINK, RETURN C C C C ******************************************************** C SUBROUTINE REPLACE C ******************************************************** C S CPAGE 3 S RWRD, JMP I REPLACE S REPLACE,0000 /ENTRY POINT S TEST, ISZ \NROT2 /TEST 2ND ROTATION COUNTER FIRST S SKP /OK TO CONTINUE S JMP DONE /DONE ALREADY, CLEAN UP AND RETURN S RAL /ROTATE LEFT 1 BIT S JMP TEST S DONE, DCA \MTMPWD /REPLACE HOLDING WORD C IF(MTRNUM-6)2004,2004,2005 2004 MTRWRD=MTMPWD S CLL /KEEP LINK CLEAN S JMP RWRD /RETURN C 2005 MTHSPWD=MTMPWD S CLL /KEEP LINK CLEAN S JMP RWRD /RETURN C C C C C -------------------------------------------------------- C E R R O R R O U T I N E S C -------------------------------------------------------- C ERRORS C ------ C C 901: MISSED FBW SIGNALS (MANUAL) - ***NOT USED*** C 921: ILLEGAL MOTOR NUMBER (MOTORS) C 922: ILLEGAL OPERATION (MOTORS) C 923: DESIRE > UPPER LIMITS (MOTORS) C 924: DESIRE < LOWER LIMITS (MOTORS) C S \901, CAM /CLEAR OUT AC & MQ S CLL /CLEAR LINK BIT TOO C***** NOT USED***** IERRNUM=901 GO TO 799 C C S \921, JMS CLEAN /CLEAN UP AC & MQ IERRNUM=921 GOTO 80 C S \922, JMS CLEAN /CLEAN UP IERRNUM=922 GOTO 80 C S \923, JMS CLEAN /CLEAN UP IERRNUM=923 GOTO 80 C S \924, JMS CLEAN /CLEAN UP IERRNUM=924 GOTO 80 C C C C*******DEBUG C@C SPECIAL CLOCK ROUTINE C@C C@S ENTRY CLOCK C@S CPAGE 2 C@S CLOCK,BLOCK 2 C@C C@C C@S TICK, CLKSKP C@S JMP TICK C@S CLKACK C@C C@C C@S RETRN CLOCK C******* END