https://github.com/virtualagc/virtualagc
Revision 078c79d8734a9ed2860303a7c1662004284fe853 authored by Ron Burkey on 07 August 2022, 15:04:04 UTC, committed by Ron Burkey on 07 August 2022, 15:04:04 UTC
assembly listings from yaASM and yaLEMAP. Added some debugging messages
to 'make install'.  Tweaked debugging messages that VirtualAGC embeds in
'simulate'.  Verified buildability in Mint 21, 20, 19, 17, and verified
buildability using clang in Mint 17.
1 parent 6bb1acc
Raw File
Tip revision: 078c79d8734a9ed2860303a7c1662004284fe853 authored by Ron Burkey on 07 August 2022, 15:04:04 UTC
Fixed a potential string-overflow bug in yaASM. Removed timestamps from
Tip revision: 078c79d
TRIM_GIMBAL_CONTROL_SYSTEM.agc
### FILE="Main.annotation"
## Copyright:   Public domain.
## Filename:    TRIM_GIMBAL_CONTROL_SYSTEM.agc
## Purpose:     A log section of Zerlina 56, the final revision of
##              Don Eyles's offline development program for the variable 
##              guidance period servicer. It also includes a new P66 with LPD 
##              (Landing Point Designator) capability, based on an idea of John 
##              Young's. Neither of these advanced features were actually flown,
##              but Zerlina was also the birthplace of other big improvements to
##              Luminary including the terrain model and new (Luminary 1E)
##              analog display programs. Zerlina was branched off of Luminary 145,
##              and revision 56 includes all changes up to and including Luminary
##              183. It is therefore quite close to the Apollo 14 program,
##              Luminary 178, where not modified with new features.
## Reference:   pp. 1460-1472
## Assembler:   yaYUL
## Contact:     Ron Burkey <info@sandroid.org>.
## Website:     www.ibiblio.org/apollo/index.html
## Mod history: 2017-07-28 MAS  Created from Luminary 210.
##              2017-08-29 MAS  Updated for Zerlina 56.
##              2021-05-30 ABS  GTSGO+DN -> GTSGO+ON

## Page 1460
                BANK            21
                EBANK=          QDIFF
                SETLOC          DAPS4
                BANK

                COUNT*          $$/DAPGT

# CONTROL REACHES THIS POINT UNDER EITHER OF THE FOLLOWING TWO CONDITIONS ONCE THE DESCENT ENGINE AND THE DIGITAL
# AUTOPILOT ARE BOTH ON:
#          A) THE TRIM GIMBAL CONTROL LAW WAS ON DURING THE PREVIOUS Q,R-AXIS TIME5 INTERRUPT (OR THE DAPIDLER
#             INITIALIZATION WAS SET FOR TRIM GIMBAL CONTROL AND THIS IS THE FIRST PASS), OR
#          B) THE Q,R-AXES RCS AUTOPILOT DETERMINED THAT THE VEHICLE WAS ENTERING (OR HAD JUST ENTERED) A COAST
#             ZONE WITH A SMALL OFFSET ANGULAR ACCELERATION.

# GTS IS THE ENTRY TO THE GIMBAL TRIM SYSTEM FOR CONTROLLING ATTITUDE ERRORS AND RATES AS WELL AS ACCELERATIONS.

GTS             CAF             NEGONE                  # MAKE THE NEXT PASS THROUGH THE DAP BE
                TS              COTROLER                #   THROUGH RCS CONTROL,
                CAF             FOUR                    #   AND ENSURE THAT IT IS NOT A SKIP.
                TS              SKIPU
                TS              SKIPV

                CAF             TWO
                TS              INGTS                   # SET INDICATOR OF GTS CONTROL POSITIVE.
                TS              QGIMTIMR                # SET TIMERS TO 200 MSEC TO AVOID BOTH
                TS              RGIMTIMR                # RUNAWAY AND INTERFERENCE BY NULLING.

# THE DRIVE SETTING ALGORITHM

# DEL = SGN(OMEGA + ALPHA*ABS(ALPHA)/(2*K))

#                                             2               1/2                  2       3/2
# NEGUSUM = ERROR*K + ALPHA*(DEL*OMEGA + ALPHA /(3*K)) + DEL*K   (DEL*OMEGA + ALPHA /(2*K))

# DRIVE = -SGN(NEGUSUM)

                CA              SR                      # SAVE THE SR.  SHIFT IT LEFT TO CORRECT
                AD              A                       # FOR THE RIGHT SHIFT DUE TO EDITING.
                TS              SAVESR

GTSGO+ON        CAF             TWO                     # SET INDEXER FOR R-AXIS CALCULATIONS.
                TCF             GOQTRIMG        +1

GOQTRIMG        CAF             ZERO                    # SET INDEXER FOR Q-AXIS CALCULATIONS
                TS              QRCNTR

                INDEX           QRCNTR                  # AOS SCALED AT PI/2
                CA              AOSQ
                EXTEND
                MP              BIT2                    # RESCALE AOS TO PI/4

## Page 1461
                EXTEND
                BZF             GTSQAXIS        -3      # USE FULL SCALE FOR LARGER AOS ESTIMATES.

                INDEX           A
                CS              LIMITS                  # LIMITS +1 CONTAINS NEGMAX.
                XCH             L                       # LIMITS -1 CONTAINS POSMAX.

                CCS             QRCNTR                  # PICK UP RATE FOR THIS AXIS.  RATE CELLS
                INDEX           A                       # ARE ADJACENT, NOT SEPARATED.  AT PI/4
                CA              EDOTQ
GTSQAXIS        DXCH            WCENTRAL

                INDEX           QRCNTR                  # COLLECT K FOR THIS AXIS
                CA              KQ
                TS              KCENTRAL

                EXTEND                                  # CONTROL AUTHORITY  ZERO.  AVOID DRIVING
                BZF             POSDRIVE        +1      # ENGINE BELL TO THE STOPS.

                INDEX           QRCNTR                  # QDIFF, RDIFF ARE STORED IN D.P.
                CAE             QDIFF

ALGORTHM        EXTEND                                  # Q(R)DIFF IS THETA (ERROR) SCALED AT PI.
                MP              KCENTRAL                # FORM K*ERROR AT PI(2)/2(8), IN D.P.
                LXCH            K2THETA
                EXTEND
                MP              BIT5                    # RESCALE TO 4*PI(2)
                DXCH            K2THETA
                EXTEND
                MP              BIT5                    # FIRST TERM OF NEGUSUM IN K2THETA.
                ADS             K2THETA         +1      # NO CARRY NEEDED    D.P. AT 4*PI(2)

                CS              ACENTRAL                # FORM ALPHA(2)/(2*K) AT 16*PI, IN D.P.,
                EXTEND                                  # LIMITING QUOTIENT TO AVOID OVERFLOW.
                MP              BIT14                   # -ALPHA/2 IN A, SCALED AT PI/4
                EXTEND
                MP              ACENTRAL                # -ALPHA(2)/2 IN A,L, SCALED AT PI(2)/16
                AD              KCENTRAL
                EXTEND
                BZMF            HUGEQUOT                # K-ALPHA(2)/2 SHOULD BE PNZ FO DIVISION

                EXTEND
                DCS             A                       # ALPHA(2)/2 - K
                AD              KCENTRAL
                EXTEND
                DV              KCENTRAL                # HIGH ORDER OF QUOTIENT.
                XCH             A2CNTRAL
                CA              L                       # SHIFT UP THE REMAINDER.
                LXCH            7                       # ZERO LOW-ORDER DIVIDEND.
                EXTEND
## Page 1462
                DV              KCENTRAL
                XCH             A2CNTRAL        +1      # QUOTIENT STORED AT 16*PI, D.P.
                TCF             HAVEQUOT

HUGEQUOT        CA              POSMAX
                TS              L
                DXCH            A2CNTRAL                # LIMITED QUOTIENT STORED AT 16*PI, D.P.

HAVEQUOT        CA              WCENTRAL
                EXTEND
                MP              BIT9                    # RESCALE OMEGA AT 16*PI IN D.P.
                DXCH            K2CNTRAL                # LOWER WORD OVERLAYS OMEGA IN WCENTRAL

                EXTEND
                DCA             K2CNTRAL
                DXCH            FUNCTION

                CA              ACENTRAL                # GET ALPHA*ABS(ALPHA)/(2*K)
                EXTEND
                BZMF            +4

                EXTEND
                DCA             A2CNTRAL
                TCF             +3

                EXTEND
                DCS             A2CNTRAL

                DAS             FUNCTION                # OMEGA + ALPHA*ABS(ALPHA)/2*K) AT 16*PI

                CCS             FUNCTION                # DEL = +1 FOR FUNCT1 GREATER THAN ZERO.
                TCF             POSFNCT1                # OTHERWISE DEL = -1
                TCF             +2
                TCF             NEGFNCT1

                CCS             FUNCTION        +1      # USE LOW ORDER WORD SINCE HIGH IS ZERO
POSFNCT1        CAF             BIT1
                TCF             +2
NEGFNCT1        CS              BIT1
                TS              DEL

                CCS             DEL                     # REPLACE OMEGA BY DEL*OMEGA
                TCF             FUNCT2                  # POSITIVE DEL VALUE.  PROCEED.
                TCF             DEFUNCT
                TCF             NEGFNCT2

DEFUNCT         TS              K2CNTRAL
                TS              K2CNTRAL        +1
                TCF             FUNCT2

## Page 1463
NEG1/3          DEC             -.33333

NEGFNCT2        EXTEND
                DCS             K2CNTRAL
                DXCH            K2CNTRAL

FUNCT2          EXTEND
                DCA             A2CNTRAL
                DAS             K2CNTRAL                # DEL*OMEGA + ALPHA(2)/(2*K) AT 16*PI,D.P.

FUNCT3          CA              A2CNTRAL
                EXTEND
                MP              NEG1/3
                DXCH            A2CNTRAL
                CA              L
                EXTEND
                MP              NEG1/3
                ADS             A2CNTRAL        +1
                TS              L
                TCF             +2                      # A2CNTRAL NOW CONTAINS  -ALPHA(2)/(6*K),
                ADS             A2CNTRAL                # SCALED AT 16*PI, IN D.P.

                EXTEND
                DCA             K2CNTRAL                # DEL*OMEGA + ALPHA(2)/(3*K) IN A2CNTRAL,
                DAS             A2CNTRAL                # SCALED AT 16*PI, D.P.

                CA              A2CNTRAL
                EXTEND
                MP              ACENTRAL
                DAS             K2THETA
                CA              A2CNTRAL        +1
                EXTEND
                MP              ACENTRAL                # ACENTRAL MAY NOW BE OVERLAID.
                ADS             K2THETA         +1
                TS              L
                TCF             +2                      # TWO TERMS OF NEGUSUM ACCUMULATED, SO FAR
                ADS             K2THETA                 # SCALED AT 4*PI(2), IN D.P.

GETROOT         CA              K2CNTRAL                # K*(DEL*OMEGA + ALPHA(2)/(2*K)) IS THE
                EXTEND                                  # TERM FOR WHICH A SQUARE ROOT IS NEEDED.
                MP              KCENTRAL                # K AT PI/2(8)
                DXCH            FUNCTION
                CA              K2CNTRAL        +1
                EXTEND
                MP              KCENTRAL
                ADS             FUNCTION        +1
                TS              L
                TCF             +2
                ADS             FUNCTION                # DESIRED TERM IN FUNCTION, AT PI(2)/16
## Page 1464
                CCS             DEL
                TCF             RSTOFGTS
                TCF             NEGUSUM
                TCF             NEGATE
                TCF             NEGUSUM

NEGATE          EXTEND
                DCS             K2CNTRAL
                DXCH            K2CNTRAL
                TCF             RSTOFGTS

                BANK            16
                EBANK=          NEGUQ
                SETLOC          DAPS1
                BANK

# THE WRCHN12 SUBROUTINE SETS BITS 9,10,11,12 OF CHANNEL 12 ON THE BASIS OF THE CONTENTS OF NEGUQ,NEGUR WHICH ARE
# THE NEGATIVES OF THE DESIRED ACCELERATION CHANGES.  ACDT+C12 SETS Q(R)ACCDOT TO REFLECT THE NEW DRIVES.

# WARNING:  ACDT+C12 AND WRCHN12 MUST BE CALLED WITH INTERRUPT INHIBITED.

BGIM            OCTAL           07400
CHNL12          EQUALS          ITEMP6
ACDT+C12        CS              NEGUQ
                EXTEND                                  # GIMBAL DRIVE REQUESTS.
                MP              ACCDOTQ
                LXCH            QACCDOT
                CS              NEGUR
                EXTEND
                MP              ACCDOTR
                LXCH            RACCDOT

                CCS             NEGUQ
                CAF             BIT10
                TCF             +2
                CAF             BIT9
                TS              CHNL12

                CCS             NEGUR
                CAF             BIT12
                TCF             +2
                CAF             BIT11
                ADS             CHNL12                  # (STORED RESULT NOT USED AT PRESENT)

                CS              BGIM
                EXTEND
                RAND            CHAN12
                AD              CHNL12
                EXTEND
                WRITE           CHAN12

## Page 1465
                CS              CALLGMBL                # TURN OFF REQUEST FOR ACDT+C12 EXECUTION.
                MASK            RCSFLAGS
                TS              RCSFLAGS

                TC              Q                       # RETURN TO CALLER.

                BANK            21
                EBANK=          QDIFF
                SETLOC          DAPS4
                BANK

## Page 1466
# SUBROUTINE TIMEGMBL:  MOD 0,  OCTOBER 1967, CRAIG WORK

# TIMEGMBL COMPUTES THE DRIVE TIME NEEDED FOR THE TRIM GIMBAL TO POSITION THE DESCENT ENGINE NOZZLE SO AS TO NULL
# THE OFFSET ANGULAR ACCELERATION ABOUT THE Q (OR R) AXIS.  INSTEAD OF USING AOSQ(R), TIMEGMBL USES .4*AOSQ(R),
# SCALED AT PI/8.                         FOR EACH AXIS, THE DRIVE TIME IS COMPUTED AS ABS(ALPHA/ACCDOT).  A ZERO
# ALPHA OR ACCDOT OR A ZERO QUOTIENT TURNS OFF THE GIMBAL DRIVE IMMEDIATELY.  OTHERWISE, THE GIMBAL IS TURNED ON
# DRIVING IN THE CORRECT DIRECTION. THE Q(R)GIMTIMR IS SET TO TERMINATE THE DRIVE AND Q(R)ACCDOT
# IS STORED TO REFLECT THE NEW ACCELERATION DERIVATIVE.  NEGUQ(R) WILL CONTAIN +1,+0,-1 FOR A Q(R)ACCDOT VALUE
# WHICH IS NEGATIVE, ZERO, OR POSITIVE.

# INPUTS:  AOSQ,AOSR, SCALED AT P1/2, AND ACCDOTQ, ACCDOTR AT PI/2(7).    PI/2(7).

# OUTPUTS:   NEW GIMBAL DRIVE BITS IN CHANNEL 12,NEGUQ,NEGUR,QACCDOT AND RACCDOT, THE LAST SCALED AT PI/2(7).
#            Q(R)GIMTIMR WILL BE SET TO TIME AND TERMINATE GIMBAL DRIVE(S)

# DEBRIS:  A,L,Q, ITEMPS 2,3,6, RUPTREG2 AND ACDT+C12 DEBRIS.

# EXITS:  VIA TC Q.

# ALARMS, ABORTS, :  NONE

# SUBROUTINES:  ACDT+C12, IBNKCALL

# WARNING:  THIS SUBROUTINE WRITES INTO CHANNEL 12 AND USES THE ITEMPS.  THEREFORE IT MAY ONLY BE CALLED WITH
# INTERRUPT INHIBITED.

# ERASABLE STORAGE CONFIGURATION (NEEDED BY THE INDEXING METHODS):

#                                         NEGUQ    ERASE    +2            NEGATIVE OF Q-AXIS GIMBAL DRIVE
#                                         (SPWORD) EQUALS  NEGUQ +1       ANY S.P. ERASABLE NUMBER, NOW THRSTCMD
#                                         NEGUR    EQUALS  NEGUQ +2       NEGATIVE OF R-AXIS GIMBAL DRIVE

#                                         ACCDOTQ  ERASE    +2            Q-JERK TERM SCALED AT PI/2(7) RAD/SEC(3)
#                                         (SPWORD) EQUALS  ACCDOTQ +1     ANY S.P. ERASABLE NUMBER  NOW QACCDOT
#                                         ACCDOTR  EQUALS  ACCDOTQ +2     R-JERK TERM SCALED AT PI/2(7) RAD/SEC(3)
#                                                                         ACCDOTQ,ACCDOTR ARE MAGNITUDES.
#                                         AOSQ     ERASE   +4             Q-AXIS ACC.,D.P. AT PI/2 R/SEC(2)
#                                         AOSR     EQUALS  AOSQ +2        R-AXIS ACCELERATION SCALED AT PI/2 R/S2

QRNDXER         EQUALS          ITEMP6
OCT23146        OCTAL           23146                   # DECIMAL .6
NZACCDOT        EQUALS          ITEMP3

TIMEGMBL        CAF             ONE                     # INITIALIZE ALLOWGTS.
                TS              ALLOWGTS

                CAF             TWO                     # SET UP LOOP FOR R AXIS.
                LXCH            Q                       # SAVE RETURN ADDRESS.
                LXCH            RUPTREG2
## Page 1467
                TCF             +2
TIMQGMBL        CAF             ZERO                    # NOW DO THE Q-AXIS
                TS              QRNDXER
                INDEX           QRNDXER
                CA              ACCDOTQ                 # ACCDOT IS PRESUMED TO BE AT PI/2(7).
                EXTEND
                BZMF            TGOFFNOW                # IS ACCDOT LESS THAN OR EQUAL TO 0?
                TS              NZACCDOT                # NO.  STORE NON-ZERO, POSITIVE ACCDOT.

ALPHATRY        INDEX           QRNDXER
                CS              AOSQ
                EXTEND
                BZF             TGOFFNOW                # IS ALPHA ZERO?

                TS              Q                       # SAVE A COPY OF  -AOS.
                EXTEND                                  # NO.  RESCALE FOR TIMEGMBL USE.
                MP              OCT23146                # OCTAL 23146 IS DECIMAL .6
                AD              Q                       # -1.6*AOS AT PI/2 = -.4*AOS AT PI/8.
                TS              L                       # WAS THERE OVERFLOW?
                TCF             SETNEGU                 # NO.  COMPUTE DRIVE TIME.

                CS              A                       # RECOVER  -SGN(AOS) IN THE A REGISTER.
                INDEX           QRNDXER                 # YES.  START DRIVE WITHOUT WAITLIST.
                XCH             NEGUQ
                TCF             NOTALLOW                # KNOCK DOWN THE ALLOWGTS FLAG.

SETNEGU         EXTEND
                BZMF            POSALPH

                COM
                TS              ITEMP2                  # STORE  -ABS(.4*AOS) SCALED AT PI/8.
                CS              BIT1
                TCF             POSALPH         +2
POSALPH         TS              ITEMP2                  # STORE  -ABS(.4*AOS) SCALED AT PI/8.
                CA              BIT1
 +2             INDEX           QRNDXER                 # SGN(AOS) INTO NEGU
                TS              NEGUQ                   # STORE SGN(APLHA) AS NEGU

                CA              NZACCDOT
                EXTEND
                MP              BIT12                   # 2*ACCDOT, SCALED AT PI/8.
                AD              ITEMP2                  # -ABS(ALPHA) + 2*ACCDOT, AT PI/8.
                EXTEND
                BZMF            NOTALLOW                # IS DRIVE TIME MORE THAN TWO SECONDS?
                CS              ITEMP2                  # NO.  COMPUTE DRIVE TIME.
                EXTEND                                  # ABS(ALPHA) AT PI/8.
                MP              OCT00240                # DECIMAL 10/1024
                EXTEND                                  # QUOTIENT IS DRIVE TIME AT WAITLIST.
                DV              NZACCDOT                # ABS(ALPHA)/ACCDOT AT 2(14)/100

## Page 1468
                EXTEND
                BZF             TGOFFNOW                # DRIVE TIME MUST BE GREATER THAN ZERO.

                TCF             DRIVEON

TGOFFNOW        CAF             ZERO                    # TURN OFF GIMBAL NOW.
                INDEX           QRNDXER
                TS              NEGUQ

                TCF             DONEYET

NOTALLOW        CAF             OCT31
                INDEX           QRNDXER
                TS              QGIMTIMR
                CAF             ZERO                    # DRIVE TIME IS MORE THAN 2 SECONDS, SO
                TS              ALLOWGTS                # DO NOT PERMIT FURTHER GTS ATTITUDE-RATE
                                                        # CONTROL UNTIL AOSTASK APPROVES.
                TCF             DONEYET                 # NO WAITLIST CALL IS MADE.

DRIVEON         INDEX           QRNDXER
                TS              QGIMTIMR                # CHOOSE Q OR R AXIS.

DONEYET         CCS             QRNDXER
                TCF             TIMQGMBL

                DXCH            RUPTREG3                # PROTECT IBNKCALL ERASABLES.  ACDT+C12
                DXCH            ITEMP2                  # LEAVES ITEMPS2,3 ALONE.

                TC              IBNKCALL                # TURN OF CHANNEL BITS, SET Q(R)ACCDOTS.
                CADR            ACDT+C12

                DXCH            ITEMP2                  # RESTORE ERASABLES FOR IBNKCALL.
                DXCH            RUPTREG3

                TC              RUPTREG2                # RETURN TO CALLER.

OCT00240        OCTAL           00240                   # DECIMAL 10/1024

## Page 1469
# THE FOLLOWING SECTION IS A CONTINUATION OF THE TRIM GIMBAL CONTROL FROM THE LAST GTS ENTRY. THE QUANTITY NEGUSUM
# IS COMPUTED FOR EACH AXIS (Q,R), .707*DEL*FUNCTION(3/2) + K2THETA = NEGUSUM.  NEW DRIVES ARE ENTERED TO CH 12.

# THE SUBROUTINE GTSQRT ACCEPTS A DOUBLE PRECISION VALUE IN FUNCTION, FUNCTION +1 AND RETURNS A SINGLE-PRECISION
# SQUARE ROOT OF THE FOURTEEN MOST SIGNIFICANT BITS OF THE ARGUMENT.  ALSO, THE CELL SHFTFLAG CONTAINS A BINARY
# EXPONENT S, SUCH THAT THE SQUARE ROOT (RETURNED IN THE A REGISTER) MUST BE SHIFTED RIGHT (MULTIPLIED BY 2 TO THE
# POWER (-S)) IN ORDER TO BE THE TRUE SQUARE ROOT OF THE FOURTEEN MOST SIGNIFICANT BITS OF FUNCTION, FUNCTION +1.
# SQUARE ROOT ERROR IS NOT MORE THAN 2 IN THE 14TH SIGNIFICANT BIT.  CELLS CLOBBERED ARE A,L,SHFTFLAG,ININDEX,
# HALFARG,SCRATCH,SR,FUNCTION, FUNCTION +1.  GTSQRT IS CALLED BY TC GTSQRT AND RETURNS VIA TC Q OR TC FUNCTION +1.
# ZERO OR NEGATIVE ARGUMENTS YIELD ZERO FOR SQUARE ROOTS.

GTSQRT          CCS             FUNCTION
                TCF             GOODARG                 # FUNCTION IS POSITIVE.  TAKE SQUARE ROOT.
                TCF             +2                      # HIGH ORDER WORD IS ZERO.  TRY THE LOWER.
                TCF             ZEROOT                  # NEGATIVE.  USE ZERO FOR 1/2 POWER.

                CA              FUNCTION        +1
                EXTEND
                BZMF            ZEROOT

                TCF             ZEROHIGH                # PROCEED.
ZEROOT          CA              ZERO
                TS              SHFTFLAG
                TC              Q

ZEROHIGH        XCH             FUNCTION                # 14 MOST SIGNIFICANT BITS ARE IN THE
                XCH             FUNCTION        +1      # LOWER WORD.  EXCHANGE THEM.
                CA              SEVEN
                TCF             GOODARG         +1

GOODARG         CA              ZERO
                TS              SHFTFLAG
                CA              TWELVE                  # INITIALIZE THE SCALING LOOP.
                TS              ININDEX
                TCF             SCALLOOP

SCALSTRT        CA              FUNCTION
                TCF             SCALDONE

MULBUSH         CA              NEG2                    # IF ARG IS NOT LESS THAN 1/4, INDEX IS
                ADS             ININDEX                 # ZERO, INDICATING NO SHIFT NEEDED.
                EXTEND                                  # BRANCH IF ARG IS NOT LESS THAN 1/4.
                BZMF            SCALSTRT                # OTHERWISE COMPARE ARG WITH A REFERENCE
                                                        # WHICH IS 4 TIMES LARGER THAN THE LAST.
SCALLOOP        CS              FUNCTION
                INDEX           ININDEX
                AD              BIT15                   # REFERENCE MAGNITUDE LESS OR EQUAL TO 1/4
                EXTEND
                BZMF            MULBUSH                 # IF ARG IS NOT LESS THAN REFERENCE, GO
                                                        # AROUND THE MULBERRY BUSH ONCE MORE.

## Page 1470
                INDEX           ININDEX
                CA              BIT15                   # THIS IS THE SCALE MAGNITUDE
                XCH             HALFARG                 # 2**(-ININDEX) IS THE SHIFT DIVISOR.
                EXTEND                                  # RESCALE ARGUMENT.
                DCA             FUNCTION
                EXTEND
                DV              HALFARG
                                                        # ININDEX AND SHFTFLAG PRESERVE INFO FOR

                                                        # RESCALING AFTER ROOT PROCESS.
SCALDONE        EXTEND
                QXCH            FUNCTION        +1      # SAVE Q FOR RETURN
                EXTEND
                MP              BIT14
                TS              HALFARG
                MASK            BIT13
                CCS             A
                CA              OCT11276
                AD              ROOTHALF                # INITIAL GUESS IS ROOT 1/2 OR POSMAX

                TC              ROOTCYCL
                TC              ROOTCYCL
                TC              ROOTCYCL

                TC              FUNCTION        +1

# ****************************************************************************************************************


RSTOFGTS        TC              GTSQRT
PRODUCT         XCH             K2CNTRAL
                EXTEND
                MP              K2CNTRAL
                DXCH            K2CNTRAL
                EXTEND                                  #             THE PRODUCT OF
                MP              L                       #  1/2                   2       1/2
                ADS             K2CNTRAL        +1      # K   *(DEL*OMEGA + ALPHA /(2*K))
                TS              L                       #                 AND
                TCF             +2                      #                        2
                ADS             K2CNTRAL                #  DEL*(DEL*OMEGA + ALPHA /(2*K)) NOW IN
                                                        # K2CNTRAL

DOSHIFT         CA              ININDEX
                EXTEND                                  # MULTIPLY IN THE FACTOR 2(-S), RETURNED
                MP              BIT14                   # BY THE GTSQRT SUBROUTINE
                ADS             SHFTFLAG
                EXTEND
                BZF             ADDITIN
                INDEX           SHFTFLAG
                CA              BIT15
## Page 1471
                XCH             K2CNTRAL
                EXTEND
                MP              K2CNTRAL
                DAS             K2THETA
                XCH             K2CNTRAL
                EXTEND
                MP              K2CNTRAL        +1
                ADS             K2THETA         +1
                TS              L
                TCF             +2
                ADS             K2THETA

                TCF             NEGUSUM

ADDITIN         EXTEND
                DCA             K2CNTRAL
                DAS             K2THETA                 # NOW ADD IN THE K2THETA TERM.
NEGUSUM         CCS             K2THETA                 # TEST SIGN OF HIGH ORDER PART.
                TCF             NEGDRIVE
                TCF             +2
                TCF             POSDRIVE

                CCS             K2THETA         +1      # SIGN TEST FOR LOW ORDER PART.
NEGDRIVE        CA              BIT1
                TCF             +2                      # STOP GIMBAL DRIVE FOR A ZERO NEGUSUM.
POSDRIVE        CS              BIT1
                TS              L                       # SAVE FOR DRIVE REVERSAL TEST.
                INDEX           QRCNTR
                XCH             NEGUQ

                EXTEND
                MP              L                       # MULTIPLY OLD NEGU AND NEW NEGU.
                CCS             L
                TCF             LOUPE                   # NON-ZERO GIMBAL DRIVE BEING CONTINUED.

                TCF             ZEROLOUP                # NO REVERSAL PROBLEM HERE.

                TCF             REVERSAL                # NON-ZERO GIMBAL DRIVE BEING REVERSED.
                TCF             ZEROLOUP                # NO REVERSAL PROBLEM HERE.

REVERSAL        INDEX           QRCNTR                  # A ZERO-DRIVE PAUSE IS NEEDED HERE.  ZERO
                TS              QACCDOT                 # IS IN A REGISTER FROM CCS ON (-1).
                INDEX           QRCNTR
                CS              GMBLBITA
                EXTEND
                WAND            CHAN12

ZEROLOUP        CS              RCSFLAGS                # SET UP REQUEST FOR ACDT+C12 CALL.
                MASK            CALLGMBL
                ADS             RCSFLAGS

## Page 1472
LOUPE           CCS             QRCNTR                  # HAVE BOTH AXES BEEN PROCESSED?
                TCF             GOQTRIMG                # NO.  DO Q AXIS NEXT.

                CA              SAVESR                  # RESTORE THE SR
                TS              SR

GOCLOSE         EXTEND                                  # TERMINATE THE JASK.
                DCA             CLOSEADR
                DTCB

                EBANK=          AOSQ
CLOSEADR        2CADR           CLOSEOUT                # TERMINATE THE JASK.

TWELVE          EQUALS          OCT14
ROOTHALF        OCTAL           26501                   # SQUARE ROOT OF 1/2
GMBLBITA        OCTAL           01400                   # INDEXED WRT GMBLBITB   DO NOT MOVE******
OCT11276        OCTAL           11276                   # POSMAX - ROOTHALF
GMBLBITB        OCTAL           06000                   # INDEXED WRT GMBLBITA   DO NOT MOVE******

# SUBROUTINE ROOTCYCL:  BY CRAIG WORK,3 APRIL 68
# ROOTCYCL IS A SUBROUTINE WHICH EXECUTES ONE NEWTON SQUARE ROOT ALGORITHM ITERATION.  THE INITIAL GUESS AT THE
# SQUARE ROOT IS PRESUMED TO BE IN THE A REGISTER AND ONE-HALF THE SQUARE IS TAKEN FROM HALFARG.  THE NEW APPROXI-
# MATION TO THE SQUARE ROOT IS RETURNED IN THE A REGISTER.  DEBRIS:   A,L,SR,SCRATCH.  ROOTCYCL IS CALLED FROM
# LOCATION (LOC) BY A TC ROOTCYCL, AND RETURNS (TC Q) TO LOC +1.

# WARNING:  IF THE INITIAL GUESS IS NOT GREATER THAN THE SQUARE, DIVIDE OR ADD OVERFLOW IS A REAL POSSIBILITY.

ROOTCYCL        TS              SCRATCH                 # STORE X
                TS              SR                      # X/2 NOW IN SR
                CA              HALFARG                 # ARG/2 IN THE A REG
                ZL                                      # PREPARE FOR DIVISION
                EXTEND
                DV              SCRATCH                 # (ARG/X)/2
                AD              SR                      # (X + ARG/X)/2 IN THE A REG
                TC              Q
back to top