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
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
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 section of LUM69 revision 2.
## It is part of the reconstructed source code for the flown
## version of the flight software for the Lunar Module's (LM)
## Apollo Guidance Computer (AGC) for Apollo 10. The code has
## been recreated from a copy of Luminary revsion 069, using
## changes present in Luminary 099 which were described in
## Luminary memos 75 and 78. The code has been adapted such
## that the resulting bugger words exactly match those specified
## for LUM69 revision 2 in NASA drawing 2021152B, which gives
## relatively high confidence that the reconstruction is correct.
## Reference: pp. 1467-1478
## Assembler: yaYUL
## Contact: Ron Burkey <info@sandroid.org>.
## Website: www.ibiblio.org/apollo/index.html
## Mod history: 2019-07-27 MAS Created from Luminary 69.
## 2021-05-30 ABS GTSGO+DN -> GTSGO+ON
## MAXISHIFT -> MAXISHFT
## MINISHIFT -> MINISHFT
## Page 1467
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*K + ALPHA*ABS(ALPHA)/2).
#
# NEGUSUM = ERROR.K(2) + DEL(OMEGA.K.DEL + ALPHA(2)/2)(3/2) + ALPHA(OMEGA.K.DEL + ALPHA(2)/3)
#
# 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.
TS QRCNTR
CA AOSR
EXTEND
MP BIT3
CA EDOTR
TCF GTSQAXIS
GOQTRIMG CAF ZERO # SET INDEXER FOR Q-AXIS CALCULATIONS
TS QRCNTR
## Page 1468
CA AOSQ
EXTEND
MP BIT3
CA EDOTQ
GTSQAXIS DXCH WCENTRAL
EXTEND
INDEX QRCNTR # PICK UP K AND K(2) FOR THIS AXIS
DCA KQ
DXCH KCENTRAL
INDEX QRCNTR # QDIFF, RDIFF ARE STORED IN D.P.
CAE QDIFF
ALGORTHM EXTEND # Q(R)DIFF IS THETA (ERROR) SCALED AT PI.
MP K2CNTRAL # FORM K(2)*THETA IN D.P.
LXCH K2THETA
EXTEND # FORM K(2)*THETA*SF2 IN D.P.
MP BIT9
DXCH K2THETA
EXTEND
MP BIT9
ADS K2THETA +1
CAE WCENTRAL # GET OMEGA
EXTEND
MP KCENTRAL # FORM K*OMEGA IN D.P.
LXCH OMEGA.K
EXTEND # FORM OMEGA*K*SF1 IN D.P.
MP BIT12
DXCH OMEGA.K
EXTEND
MP BIT12
ADS OMEGA.K +1
CAE ACENTRAL # FORM ALPHA(2)/2 IN D.P.
EXTEND
SQUARE
DXCH A2CNTRAL
CAE ACENTRAL # GET ALPHA*ABS(ALPHA)/2, IF ALPHA GREATER
# THAN 0. OTHERWISE TAKE NEGATIVE OF ABOVE
EXTEND
BZMF +4
EXTEND
DCA A2CNTRAL
TCF +3
EXTEND
DCS A2CNTRAL
DXCH FUNCTION # SAVE AS SGN(ALPHA)*ALPHA(2)/2
## Page 1469
EXTEND
DCA OMEGA.K
DAS FUNCTION # FORM FUNCT1
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 # MAKE OMEGA*K REALLY DEL*OMEGA*K
TCF FUNCT2 # (NOTHING NEED BE DONE)
TCF FUNCT2
EXTEND
DCS OMEGA.K
DXCH OMEGA.K # CHANGE SIGN OF OMEGA*K
FUNCT2 EXTEND
DCA OMEGA.K
DXCH FUNCTION # DEL*OMEGA*K
EXTEND
DCA A2CNTRAL
DAS FUNCTION # DEL*OMEGA*K + ALPHA(2)/2
FUNCT3 CAE A2CNTRAL # CALCULATE (2/3)*ALPHA(2)/2 = ALPHA(2)/3
EXTEND
MP .66667
DXCH A2CNTRAL
XCH L
EXTEND
MP .66667
ADS A2CNTRAL +1
TS L
TCF +2
ADS A2CNTRAL
DXCH OMEGA.K # DEL*OMEGA*K + ALPHA(2)/3 = G
DAS A2CNTRAL
CAE A2CNTRAL # G*ALPHA IN D.P.
EXTEND
MP ACENTRAL
DXCH A2CNTRAL
XCH L
EXTEND
MP ACENTRAL
ADS A2CNTRAL +1
TS L
## Page 1470
TCF +2
ADS A2CNTRAL
DXCH A2CNTRAL # FIRST AND THIRD TERMS
DAS K2THETA # SUMMED IN D.P.
TCF RSTOFGTS
.66667 DEC .66667
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 1471
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 1472
# 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 1473
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 1474
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 1475
# 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.
RSTOFGTS CCS FUNCTION
TCF GOODARG # FUNCTION IS POSITIVE. GET 3/2 POWER.
TCF +2 # HIGH ORDER WORD IS ZERO. TRY THE LOWER.
TCF ZEROOT # NEGATIVE. USE ZERO FOR 3/2 POWER.
CS FUNCTION +1 # IF ARG IS LESS THAN 2(-18), THEN THE 3/2
AD BIT11 # POWER IS LESS THAN 2(-27). USE ZERO.
EXTEND
BZMF ZEROHIGH # BRANCH IF ARG NOT LESS THAN 2(-18).
ZEROOT EXTEND
DCA ZERO
TCF NEGUSUM
ZEROHIGH CA FOURTEEN # ARG LESS THAN 2(-14) MEANS 3/2 POWER
# WILL BE LESS THAN 2(-21).
TS SHFTFLAG
CA TWO
TS ININDEX # INITIALIZE THE SHIFT LOOP.
# COLLECT THE 14 MOST SIGNIFICANT BITS OF
XCH FUNCTION +1 # THE 28 INTO THE HIGH ORDER WORD.
XCH FUNCTION
TCF SCALLOOP
GOODARG CA TWELVE
TS ININDEX # INITIALIZE THE SHIFT LOOP.
CA ZERO # THERE ARE SIGNIFICANT BITS IN THE HIGH
TS SHFTFLAG # ORDER WORD, SO SET SHFTFLAG TO ZERO.
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.
INDEX ININDEX
## Page 1476
CA BIT15 # THIS IS THE SCALE MAGNITUDE
XCH Q # 2**(-ININDEX) IS THE SHIFT DIVISOR.
EXTEND # RESCALE ARGUMENT.
DCA FUNCTION
EXTEND
DV Q
TS FUNCTION # ININDEX AND SHFTFLAG PRESERVE INFO FOR
# RESCALING AFTER ROOT PROCESS.
SCALDONE EXTEND # AFTER 3/2 POWER IS TAKEN, SCALE FACTOR
MP BIT13 # OF SQRT(1/2) WILL BE NEEDED, SO FACTOR
TS HALFARG # OF 1/2 IS INCLUDED NOW, BEFORE SQRT.
CA STARTER # INITIAL GUESS FOR SQRT ALGORITHM.
TC ROOTCYCL
TC ROOTCYCL
TC ROOTCYCL
EXTEND # SQRT(1/2)*SQRT(ARG) IN A.
MP FUNCTION # SQRT(1/2)*ARG*SQRT(ARG) IN A,L.
DXCH FUNCTION
DOSHIFT CA SHFTFLAG # HOW MANY SHIFT BITS ARE THERE?
AD ININDEX # 2**(-ININDEX) WAS SHIFT DIVISOR.
TS SR
AD SR # THIS MANY SHIFTS ARE REQUIRED.
SAVESHFT TS Q # Q BOUNDS ARE ZERO AND 24 (DECIMAL).
EXTEND
BZMF SUMNEGU # BRANCH IF SHIFTING IS UNNECESSARY.
CS FOURTEEN
AD Q
EXTEND # Q = 0(MOD 3), SO A REG IS NON-ZERO.
BZMF MINISHFT # BRANCH IF SMALL SHIFT SUFFICES.
MAXISHFT TS Q # 14 BIT SHIFT RIGHT NOW.
CA ZERO
XCH FUNCTION
TS FUNCTION +1
MINISHFT INDEX Q # C(Q) ARE GREATER THAN ZERO.
CA BIT15
TS Q # 2**(-Q) WILL BE SHIFT MULTIPLIER.
EXTEND
MP FUNCTION +1
XCH L
CA ZERO
DXCH FUNCTION # LOWER WORD SHIFTED NOW.
EXTEND
BZMF SUMNEGU # BRANCH IF UPPER WORD WAS ZERO.
## Page 1477
EXTEND # SHIFT UPPER WORD.
MP Q
DAS FUNCTION # NO OVERFLOW POSSIBLE.
SUMNEGU CS DEL # INCLUDE DEL FACTOR IN PRODUCT TERM.
EXTEND
BZMF SUMTERMS
EXTEND # DEL FACTOR IS MINUS ONE.
DCS FUNCTION
TCF NEGUSUM -1 # NOW ADD IN THE K2THETA TERM.
SUMTERMS EXTEND
BZF NEGUSUM # BRANCH IF DEL IS ZERO.
EXTEND # DEL FACTOR IS +1.
DCA FUNCTION
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
## Page 1478
ADS RCSFLAGS
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
GMBLBITA OCTAL 01400 # INDEXED WRT GMBLBITB DO NOT MOVE ******
STARTER DEC .53033 # INITIAL VALUE FOR SQRT ALGORITHM.
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
Computing file changes ...