perm filename FORCE.COO[3,VDS] blob sn#299720 filedate 1977-04-22 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00040 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00005 00002	∂19-Apr-77  0943	BES  	FORCE WRIST   INTRODUCTION
C00008 00003	   VALID 00009 PAGES   WRIST.SAI
C00009 00004	BEGIN "WRIST"
C00012 00005	STRING PROCEDURE GETTIM
C00014 00006	⊃ MATRIX SOLVERS:  DECOMPOSE, SOLVE
C00021 00007	⊃ MISC ROUTINES:  SOLVER, TYPEFORCE
C00023 00008	⊃ MATRIX INVERSION ROUTINES: INVERT, PINVERSE
C00026 00009	⊃ START OF MAIN PROGRAM, INITIALIZE KEY VARIABLES
C00030 00010	⊃ ASK WHAT WE ARE TO DO WITH THE DATA
C00034 00011	⊃ SAVE DATA ON DISK FILE
C00038 00012	   VALID 00004 PAGES    TLKEF6.FAI
C00039 00013	TITLE TLKEF6
C00041 00014	START OF EXECUTABLE CODE
C00045 00015		[LOCAL STORAGE AREA]
C00047 00016	   VALID 00017 PAGES        IO.PAL
C00049 00017	IO - TELETYPE IO AND STRING MANIPULATION ROUTINES
C00051 00018	"INSTR" - VT05 INPUT ROUTINE 
C00054 00019	"HOLD" - VT05 ROUTINE TO TEMPORARILY SUSPEND PRINTING
C00055 00020	"RELSCN"- STRING TO FLOATING POINT NUMBER ROUTINE
C00058 00021		   [CONTINUATION OF "RELSCN"]
C00061 00022		   [CONTINUATION OF "RELSCN"]
C00064 00023	"INTSCN"- STRING TO INTEGER NUMBER ROUTINE
C00066 00024	"CLRCMA"- ROUTINE TO CLEAR COMMA BREAK CHARACTER FROM STRING 
C00067 00025	"FORMAT"&"RSTFOR" - ROUTINES TO SET AND RESTORE OUTPUT FORMAT 
C00069 00026	"CVF"   - FLOATING POINT NUMBER TO "F" FORMAT STRING ROUTINE 
C00072 00027	"CVE"   - FLOATING POINT NUMBER TO "E" FORMAT STRING ROUTINE 
C00075 00028	 	   [CONTINUATION OF "CVE"]
C0007↔ 00029	"CVG"   - FLOATING POINT NUMBER TO "E" OR "F" FORMAT STRING  
C00079 00030	"PRTF"  - PRINTING ROUTINE USED BY "CVF", "CVE", & "CVG"
C00082 00031	"CVI"&"CVO"   - INTEGER NUMBER TO ASC STRING 
C00085 00032	LOCAL STORAGE AREA
C00089 00033	   VALID 00008 PAGES       INTFAC.PAL
C00090 00034	.TITLE INTFAC
C00092 00035	DAC TEST SECTION
C00094 00036	ADC TEST SECTION
C00096 00037	CONT. OF ADC ROUTINE
C00097 00038	SUBRS AND CLOCK INTERRUPT ROUTINE
C00100 00039	SECTION TO READ FORCE WRIST AND RETURN INFORMATION TO PDP10
C00102 00040	LOCAL STORAGE
C00104 ENDMK
C⊗;
∂19-Apr-77  0943	BES  	FORCE WRIST   INTRODUCTION
THE PROGRAMS N@πM'β%2↓)≡Aπ¬→∪¬%¬)
A)!
A
∨Iπ
A/I∪'(A¬%αA/I∪'(]Mβ∪7+@Y¬'tX~∃)1↔l9
β∪6DbY¬M:XA∪<]!β→lfY¬M:XAβ9λA∪≥Q
βε]Aβ→6f1¬':8@A∩A⊃∨≤O(↓↔≥∨.4∃/⊃βPA↔∪≥⊂A∨AM⊃β!
↓)⊃
AA%∨∂%¬≠&AβI
A∪≤↓'∪≥π∀A∩A⊃¬-≤OPA→∂∨-λAβPA)⊃4A
∨$4∃#+∪Q
AαA]⊃∪→
↓¬+(A$A'+'Aπ(AQ⊃2A⊃∨≥(AI!%M≥(AM∨≠
A=A≠2↓¬))∃$A/∨I⊗~∃'%≥π
A$A)⊃%∃.A)⊃∃~A)∨≥)⊃HA)∞AQ'(A=+(A≠dAπβ→%¬%β)%∨≤A!I∨π	U%
\@↓)⊃%∀~∃∪&↓!%∨¬¬¬→2A∧A→∨(↓)⊃β(↓π∨+→⊂Aβ≥λ↓'⊃∨+1λA¬
↓π⊃β≥≥λA∪8Aβπ A∨AQ⊃'
4∃!%∨≥%β≠&↓'≡A)!
Aπ∨9-%'%∨≤A)¬'⊗A'!∨+→λ↓¬
Aα↓∂∨∨λ↓!%∨∃∃π(A
=$A'∨5∨≥
↓)≡~∃]∨%⊗A=≤\@A!∨/-∃$XA∩↓)⊃∪≥,A)⊃βPA3∨*↓'⊃∨+1λA≠β%_AαA1∪')∪9∞A∨↓βπ⊂↓∨A)!'
~)!%∨∂Iβ≠&AQ∨∂)!$A/%)⊂Aα↓π∨!2↓∨A)!
A'
)∪∨≤↓∪≤A∨U$A→βM(A!%=∂%'LA%!=%(~∃]⊃%
↓)⊃
A
β→∪¬Iβ)∪∨8A!%∨
	+%∀A/β&↓	'πI∪¬λ↓∪≤Aβ⊃	∪)∪=≤A)≡↓'≥	%≥∞A)!
~∃π=	
A∨Y$A)!
A≥P\@A)!∪&A∪LA¬π¬+'
AM∨≠
A=A)⊃∀Aπ⊃βIβπ)I&A∪≤↓)⊃
AA%∨∂%¬≠&~∃5β2A≥=(A¬
↓	∪%
)→2AQ%β≥'1β)β¬1
Q' }RA∪9)≡A/!β)-∃$Aπ⊃¬%βπ)∃$A'PAπ∨∨,A∪&~)+'∪≥≤\@Aβ1'≡XA	
∨%∀A	∨∪9∞Aβ≥dA)%β9'
%%≥∞A∨Y$A)!
A≥PXA!→∃β'
A
∨!2A¬→_~∃=A)⊃∃'
A!I∨∂%β5&A∪≥Q≡A∨≥∀A∨Ae∨+$A¬%ββ&8~∃¬%Uπ
~∀4∀∪)Q∀ACE←YJASf↓iQJA5KggC≥JA¬eUGJAg∃]hAi<A[JAIKGK]QYr\@↓→←←V↓iQS]≥f~∃←YKdAC9HAYKPA[JA-]←nA!←nAs=jAMK∃XACE=khAi!KZ\@A%K[	K[EKHAiQCPAiQJbb↑hT~∃QCLAISM→KeK]PAMY←¬iS]N↓a←S]PAS]gQekGi%←]fAQQC\AQQJ@bD↑h`A¬]HA→M∩Zbb8@@A∩4∃CYg<AQCm∀ABAG=arA←_A∪≥)→βε]!¬_@Ao!SGPAIk]fA=\AiQ∀A→'∩4bb\@↓∪hASLA]C[∃H@~∃%≥)
β]→'∩↓S\@f1mIf\@A)Q∃eJACIJA←]1rAYS5SiKH↓G←[[∃]ifA]SiPA%hXAEUhASiL@~∃C1[←gh↓SIK]QSGCX↓i↑A∪9)
βε9!β_A]eSii∃\AM←HAiQJbb↑hT\@@~(∪-SF8~∀→π∨≠5≥(@X@@A-¬→∪λ@@```r↓!β∂L@@A/I∪'(]Mβ∩~∃A%εA!β∂∀@@A	∃'π%∪A)∪∨≤4∃ε``@`b@`@``b~)ε```@d@``@`d∪¬∃∂∪≤@	/%∪'PD~∃ε@```j````L∪')%%≥∞A!I∨π	U%
A∂∃))∪~4∃ε``@`n@`@``h∩DA≠β)I∪0A'=→-%Lt@A	∃π∨≠!='
XAM∨→-
4∃ε``@bh@`@``j∩DA≠∪'A%∨+Q∪≥&h@A'∨1-$X↓)3!→∨%π
4∃ε``@bl@`@``l∩DA≠β)I∪0A∪9-%'%∨≤A%=+)∪≥∃&tA∪9-%(0A!∪≥Y%'
4∃ε``@br@`@``n∩DA')βI(A∨↓≠β∪≤↓!%∨∂Iβ~XA%≥∪)∪¬→∪5
↓↔2AYβ%∪β	→&~)ε```Hf@``@`p∩"↓β'⊗A]⊃β(A]
Aβ%∀A)≡A⊃≡A/∪Q⊂A)⊃∀A	β)∧~∃ε`@`dn@@```r$"A'βY
A	βQαA∨≤↓	∪'⊗↓
∪→
4∃ε``@fbA9	≠⊗~)ε,v~(→¬∂%≤@E/I∪'(D4∀~∃π=≠≠≥P@ZA)!∪&A!I∨∂%β4A∪&AU'λAQ≡Aπβ1∪¬%βQ
A)⊃∀A'π⊃∃∪≥≠β8A
∨%
A'9'∪≥∞4∀∩@A]%∪'(8v~∀~)	
∪9
@"z	π∨≠≠∃≥(DY
$zDNDjDY→_zDNbHDYπ%1zDP≤bjLNDdRDY→zDNDhDv~)	
∪9
A≥'¬≠!&zD`v~∀4∃∪≥)∃∂$A$Y∀Y⊗1	'(l~∃∪≥Q∂$↓	+~Y
⊃β≤Y
π⊃β≤1
→β∞1%$v4∃¬∨∨1β≤AQ%'
1β'↔β≥β∪≤v4∃¬∨∨1β≤A%'πβ_1	∨≥)M)∨ v4∃')%%≥∞Aπ=~bv~)')%∪9∞Aβ≥LY≠&1→∪≥⊂v~∃'Q%∪≥∞↓')∨!%(Y∨+Q¬+Y=+)¬+_dY∨+Q¬+fl~∃%¬_A	01	2Y	hv~∀~)'β
↓∪≥)≥$AβI%β2AA'6btTa:v~)∪≥)≥$AβI%β2AIβ	∪9∂'6bi≥'β≠A&Pbta:v~∃%≥)∂∃$Aβ%Iβ2A∪	β'6Dtq:v4∃%β0Aβ%%¬2Aβ-∃%6bta:YπβY%6bhq:Y¬¬'6bhq:Y'⊃6btqtv~∀~)!%→=βλ1/%)⊂@∩D\`X@@\`X@@\`X@@\`X@@\`X@@\`X~(@@@@@@@@@@@@@`\`0@b\`0@`\`0@`\`0@`\`0@`\`0~∀@@@@@@@@@@@@@`8`X@`8`X@b8`X@`8`X@`8`X@`8`X~∀@@@@@@@@@@@@`\`X`\`X`\`Xb\`X`\`X`\`X4∀@@@@@@@@@@@@@`\@X@`\@X@`\@X@`\@X@b\@X@`\@X~∀@@@@@@@@@@@@@@\`X@@\`X@@\`X@@\`X@@\`X@D\`v~)%β_↓β%%βdA≠!%%≠6bhlXbtY:v~∀$~∃!%∃→∨βλa/∪)⊂4∀@@@@@@b@\`X@@\`X@@\`X@`\`XZn\j0@@`\@X~∀∩@\`Xb@\`X@@\`X@n\jX@`\`0@@`\@X~∀@@@@@b`\`0@`\`0@`\`0@@`\@XZnb8jX@@@\`X~(∩`\`0@j\`0@`\`0fj\nTX@@`8`X@@@\`X~(∩`\`0@`\`0@h\h0@@`\@X@@`8`X@@@\`X~(∩`\`0b`\`0@`\`0@@n\TX@@`8`XZh@\`v~)∨/≤AIβ_A¬%%β2↓
6btXXbtmtv~∀~)!%→=βλ1/%)⊂~∀4bdh\@X@Zn8`X@@Zb\p0@@@jL\`X@@bbj8lX@@4bd\j0@@Zp0,   -65.20,
20.0,   82.0,   134.7,  -9.0,   14.0,   -83.0,  -111.0, 1.00,
-115.0, 8.00,   8.00,   791.0,  119.0,  -21.0,  -43.0,  -789.20,
25.0,   409.0,  58.0,   -19.1,  23.0,   -398.5, -64.0,  15.1,
3.00,   39.10, 0.00,   35.00,   -3.20,  45.00,  2.30,   47.00,
-265.0, 83.0,  -138.90, 13.0,  -255.20, -73.00, -396.00,  -12.00;
OWN REAL ARRAY EPS[1:6,1:8];

REAL ARRAY M[1:6,1:8],MI[1:8,1:6];


EXTERNAL INTEGER PROCEDURE TLKEF6(INTEGER ARRAY READINGS);
REQUIRE "TLKEF6.REL" LOAD_MODULE;
STRING PROCEDUR@
A∂∃))β~l~∀~∀DA	)∃%≠∪≥∃&A)⊃∀Aπ+%I≥(A⊃β2Aβ9λA)∪5
XAπ=≥-%Q&A)⊃∃~A)≡↓β'εAM)%∪≥≤~∃π∨9')β≥Q&Aβ≥⊂A%)U%≥&AQ⊃
Aπ=≠!∨'%)
A'Q%∪≥∞8v~∀~(∪¬∂%≤@E∂∃))∪~λ~∀∪∪9)∂HA	β21⊃∨+$1(Y/∪⊂Y	∪∞13β$1≠∨≤v4∀∪!%∃→∨βλa/∪)⊂E∃β≤λXE
λDXE≠¬$DXE¬!$DX	≠β2D0E∃+≥∀DXE∃U→2DX4∀∩∩@@@@E¬+∞DX	'!(λXE∨πPDXE≥=,DXE⊃εDv4∀∪∨/8A')%%≥∞AβI%β2A5∨≥)⊃M6btbI:v~∀%')%∪9∞A)∪5
v~∀4∀∩"A≥(A)!
Aπ+I%≥(↓)∪≠
l~∀~∀%∂)
=%≠β(!/∪λY⊃∪∞Rv4∀∪'Q
∨%≠¬(PZd0`Rv~(∪)∪≠∃>Eπ+I%≥(↓)∪≠
↓β≥λA⊃β)
tDv~∀%#+∪π,1π∨	∀~∀∩∩≤hnjh@h``b@bv~∀$∪⊃→%h∩Nbh0Nbfv4∀∩∪⊃I%4∩NDfXNbLv~∀∩%≠∨-4∩Nbf1⊃∨+$l~∀∩∪5∨-~$NbhY⊃β2v~(∪≥λl~∀~∀$"Aπ∨5!+)
↓β≥λA
∨≥-I(A)⊃∀A)β≠∀A∨A⊃β2v~(~∀∪)⎇⊃∨+$<l`v~(∪⊃∨+I?(↑l@v~∀∪Q?([⊃=+$Tl@v~∀∪Q∪≠?Q∪≠
M
-&Q⊃=+$RLλtDMπY&Q(R_D@@Dl~∀~∀$"Aπ∨5!+)
↓β≥λA
∨≥-I(A)⊃∀A	β2↓∨A)!
A3¬$v~∀4∀∪≠∨9?	β2<fbv~(∪	β3|Q	β2↓≠∨λ@LbRVbl~∀∪3∃β%>Q5∨≤↑bHRVlhl~∀∪≠=≥>Q≠=≤A≠∨⊂@bdR,bv~∀%)∪≠⎇)∪≠
→π-&Q⊃β2RM5∨≥)⊃M7≠∨≥tMπ-&!3β$$Mπ%→_v~∀~(∪')→∨%≠βPQ/∪λ1	∪∞Rl~∀∪%∃)+%≤!)∪≠
$v~∀∪∃≥λ@E≥))∪4Dv~∀_"A≠¬)%∪0↓'∨→-∃%&t@↓	π∨5!∨'
0A'∨→Y
v~∀4∃!%∨
	+%∀A	π=≠!∨'∀Q∪≥)∃∂$A8w'β
∀A%β0Aβ%%¬2AαY1*Rv~(~∀"A	←iPA∧AC]H↓→*ACIJA6bi≤X@bi≥:\@↓+gKf↓OY←E¬XACeICrA!L\@Aπ=[aki∃f~∃iISC]OUYCdA5CieS
KfA_↓C]HATAC]H↓aKe[UiCiS=\A[CQeSpAA&Ag↑↓iQCh↓→*{!∧\~∃'Q←eKfQ_[∩$AC]H↓*AE←QPAS\↓→*\@↓)QJA
CYXA⊃π∨≠A∨'
Q8YαYα$AoSY0~∃←m∃eoeSQJAαA]SiPA1*\@v4∀@~∀%¬∂∪8@EIK
←[a←MJD~∀%∪≥)≥$A∩0A∀XA,XA!∪Y∨)∪≥⊃0v~(∪%β0A≥∨%5%∨.X↓!∪-∨PXA'∪i
XA¬%∂∂'PXA≠+1(v~∀%'β
↓∨/≤AIβ_A¬%%β2↓%6btTa:v~(~∀@@@@@@↓'∪≠!1
A!%=π	+I
A∪→=∨ Q∪9)∂HA+_wI
%∃≥π
AIβ_AHbY$d$v~∀∩@@@"A≠CG!S]J[
←IKH↓M←dA∃MMSG%K]Grl~∀@@@@@@@@@AM)β%(aπ∨	
4∀∩@@A→β¬∃_A→ 1*v~(@@@@@@@@@@@@@@@@↓≠∨-
bXZb NbnRl~∀@@@@@@@@@@@@@@@A≠∨Y
@dX4dPNb\Rv~∀@@@@@@@@@@@@@@@A5∨-
@LXZfP≤bnRv4∀@@@@@@@@@@@@@@@A'+∧fY⊗v4∀@@@@@@@@@@@`@@@A∃+≠A→
@f1*v~(@@@@@@@@@A→ h@@@@↓β∨∀@DXv~∀@@@@@@@@@@@@@@@A¬∨∀@d0v~∀@@@@@@@@@@@@@@@A≠=-≤@h1≠+→(l~∀@@@@@@@@@@@@@@@A
≠A$@hX bRv~(@@@@@@@@@@@@@@@@↓
β	%4@hXPHRv~∀@@@@@@@@@@@@@@@AM∨∃∞@LY→ v4∀@@@@@@@@@ATt@@@A≥λl~∀~∀%∪A≤|@j`4∀∪)⊃∃≤A+'∃%%$ `XbX		π∨5!∨'
↓GC\OPAQC]⊃YJAB↓[Cie%pACf↓YCeO∀ACfDLAπ-LQ≤RRl~∀~∀$"@A∪9SiSC1SuJAA&Y→*↓C]HAHv~∀@@@@@A
∨$↓∪>bAM) @DA+≥)%_A≤A⊃≡~∀@@@@@@@@@↓¬∂∪8~∀@@@@@@@@@AA'7∪;⎇∩v~∀@@@@@@@@A≥∨%5%∨/>@v~∀@@@@@@@@@↓
∨$A)>bA'Q @b↓+≥)∪0A≤A	<~∀@@@@@@@@@@@@A¬∃∂∪≤~(@@@@@@@@@@@@A→+7$Y∃;?¬7∩Y∃tv~∀@@@@@@@@@@@@A%@Q≥=%≠%∨\yβ¬&!→+7∩1∃:RR↓)⊃≤↓≥∨%≠I∨/?β	&Q→+m∩Y∃:$v~∀@@@@@@@@@@@@A∃≥λv~(∩@@@↓∪@Q9∨%≠%=.6`R4∀∩@@A)⊃8A%7∪u>b←≥=%≠%∨\~∀∩@@A→M
A¬≥∪≤~∀$∪%7∪u>`v@4∀∩∪+M%%HP`Xb0E5Ke<Ae←n↓S\A	∃π∨≠!='
DRl~∀∩∪∃≥λv~(∩@@@↓≥λv4∀~∀∩DA∂CkMgSC\↓KYS[%]CiS=\AoSQPAaCIiSCX↓aSm←QS]Nv4∀∪
∨HA↔>b↓') bA+≥Q∪_A≤4bA	≡4∀∩@@A¬∂%≤@EW1←←`Dl~∀@@@@@@@@@A	∪∂∂M(A>@@v~∀@@@@@@@@@↓
∨$A$A>A⊗↓') bA+≥Q∪_A≤↓	≡~∀@@@@@@@@@@@@↓¬∂∪8~∀@@@@@@@@@@@@A'%5?β	&Q→+m!'7∪tY↔:R)%7!'m∪;:v4∀@@@@@@@@@@@@A∪Q¬∪∂≥'(yM∪5
R4∀∩∪)!≤A¬∃∂∪≤~(∩∩@@A¬∪∂≥')?M∪5
v4∀∩∩@@A!∪Y∨)∪≥⊃1?∩l~∀∩∩@@A9λv~∀@@@@@@@@@@@@↓≥λv4∀@@@@@@@@@A∪_A¬∪∂≥'(@t@`~∀$@@@AQ⊃≤A	∂∪≤~∀@@@@@@@@@@@@A+M%%HP`Xb0E'S]≥kYCd↓[Cie%pAS\↓	π∨5!∨'
λRv~∀@@@@@@@@@@@@↓	∨≥
EWY←=`Dv~(∩∪≥⊂v~∀∩@@A∪_A!∪-=)∪≥	∃0@6A,~∀∩@@A)⊃∃≤A¬≥∪≤~∀@@@@@@@@@@@@↓∃?!'m↔:v~(∩∪!'m↔;?!M7!∪-=)∪≥	∃1:v~(∩∪!'m!∪-∨Q∪≥	a;?∀v4∀@@@@@@@@@@@@A≥⊂v~∀@@@@@@@@@↓!∪-∨Q?→+7A'7↔:1↔:v~(@@@@@@@@@A
∨HA∪?⊗,bA')∃ @bAU≥)∪_↓≤A	≡4∀∩∪¬∃∂∪≤~(@@@@@@@@@@@@A→+7A'7∪:1↔;?≠U→)>Q1+7!'m∪:Y↔t←!∪-=(Rv~(@@@@@@@@@@@@A∪A5+→(@l@`~∀$∪)⊃8A∪→∨= Q≤Y1+7!'m∪:Y↔tY→+7A'7↔:1↔:Rv4∀@@@@@@@@@@@@@@@@"A)!JAM←1Y←oS9NASf↓iQJAIKgkYPA←LAQQJA[¬GQS]∀AG←I∀t~∀@@@@@@@@@@@@@@@@@@A
∨HA∀A>↓⊗VbAM) @DA+≥)%_A≤A⊃≡~∀@@@@@@@@@@@@@@@@@@@@@A→+7A'7∪:1∃;?→U7!'7%:Y∃:5≠+→()→+7!M7↔:Y):v~∀@@@@@@@@@@@@↓≥λv4∀∩@@A≥λEWY←=`Dv~(@@@@@@A∪_@Q→+m!'7≥tY≥:z@R~∀∪Q⊃≤AU'%I$P`XDXE'S9OkYCHA[CiISpAS8A	π=≠!∨'∀DRv~(@@@@@@A9λ@EI∃G←[a=gJDv4∀~∀~(~∃'∪5!→
AA%∨π⊃+%
AM∨→-
!∪≥)≥$A≤m'β
↓%β_↓β%%βdA→*YλY0Rv4∀~∀"↓βeeCefA→+lbu≤XDu≥:X↓¬6bu9:XA1lbu≥:8@A+g∃fAOY=ECXAMCMJA%]iKO∃dACeICr~∃A&\@AM←YmKLAβ0{λAkgS9NA→*↓Me←Z↓	π∨5!∨'
8@@v~(~∀@@@@@@↓¬∂∪8@Eg←1mJD~(@@@@@@A∪9)∂HA∩Y∀l~∀@@@@@@↓%β_↓	∨(v4∀~∀@@@@@A'∪≠A→
A!I∨π	U%
A∪1∨∨ Q%≥)∂∃$A→_1+_w%∃
%9π
A%∃β_A$DY$dRl~∀∩@@@"A5CGQS9J[G←⊃KHAM=dAKM→SGSK9Grv~(@@@@@@@@@A')¬%(1π=	
~∀$@@@A1β¬_↓→ YTv~∀@@@@@@@@@@@@@@@A≠=-
@b0ZbPNDnRv~(@@@@@@@@@@@@@@@@↓≠∨-
dXZd NbnRl~∀@@@@@@@@@@@@@@@A≠∨Y
@fX4fPNb\Rv~∀@@@@@@@@@@@@@@@AM+∧@f0ZhPNDnRv~(@@@@@@@@@@@@@@@@↓')4hXv~(@@@@@@@@@@@@@@@@↓∃+≠!0@fYTv~∀@@@@@@@@@↓→ t@@@A≠=-
@j0PbRv4∀@@@@@@@@@@@@@@@A
≠!H@jXPHRv~∀@@@@@@@@@@@@@@@A→β	$@PXjv~(@@@@@@@@@@@@@@@@↓β∨∀@DXv~∀@@@@@@@@@@@@@@@A¬∨∀@d0v~∀@@@@@@@@@@@@@@@A'=∃∂
@LY→ v4∀@@@@@@@@@ATt@@@A≠∨-∃~@hY⊃∨(v~(@@@@@@@@@A≥⊂v~∀~(@@@@@@A
=$A∩A|@bA'Q @b↓+≥)∪0A≤A	<~∀@@@@@@@@@A	∂∪≤4∀∩@@A∪→∨= PbY$ZbY→U7!'7%:Xc:116c:$v~∀∩@@@"↓⊃CfAQQSfA∃MMKGPt~∀∩%	∨)>@@~∀∩@@@@@A
∨HA∃>b↓') bA+≥Q∪_A∩4bA	≡4∀@@@@@@@@@@@@@@@A	∨)⎇	∨(W1+7!'m∪:Y∃tU17∃tv~∀@@@@@@@@@↓17∪;⎇¬7!'m∪;:[⊃∨(v~(@@@@@@@@@A≥⊂v~∀~(@@@@@@A1m≥:A>↓17≥:↑A→+m!'7≥tY≥:v4∀@@@@@@A→∨$A∩↓>A≤ZDA')@@ZbAU≥)∪_bA	≡4∀@@@@@@@@@A¬∃∂∪≤@"A%hA∩AG!C]OK⊂AY←←@Akaa∃dAS]⊃KpAMI←ZA≤0Ai↑A¬m←SH~∀∩∪MkEgGISahA∃ee←eLv~∀@@@@@@@@@↓∪→∨∨@Q∩Vb1≤Y→+m!'7∪tY∩VctY17∩,c:Rv4∀∩@@@"@A!CfAi!SfAK→MKGhh~∀∩∪⊃∨)>`4∀∩∪
=$A∃?$VbA'Q @b↓+≥)∪0A≤A	<~∀∩∩@@A	=)?	∨PW→+7A'7∪:1∃:U1m∃:v~(@@@@@@@@@A17%;>Q1m∪:[	=(R←→U7!'7%:Y∪:l~∀@@@@@@@@@A∃≥λv~(∪≥λEg←YYJDv~(⊃ MISC ROUTINES:  SOLVER, TYPEFORCE;

PROCEDURE SOLVER(REAL ARRAY MI,EPS,F);

	BEGIN "SOLVER"
	INTEGER I,J,K;
	REAL ARRAY LU[1:6,1:6],E[1:6],M[1:6];

	⊃ TRIANGULARIZE THE FORCE MATRIX;

	DECOMPOSE(6,F,LU);

	⊃ COPY THE SIX READINGS FOR EACH GAGE AND SOLVE FOR A 
	  ROW OF THE INVERSE CALIBRATION MATRIX.  REPEAT FOR
	  ALL EIGHT STRAIN GAGE PAIRS.;

	FOR I ← 1 STEP 1 UNTIL 8 DO 
		BEGIN "SOLOOP"
		FOR J ← 1 STEP 1 UNTIL 6 DO E[J]←EPS[J,I];
		SOLVE(6,LU,E,M);
		FOR J ← 1 STEP 1 UNTIL 6 DO MI[I,J]←M[J];
		END "SOLOOP";

	END "SOLVER";


PROCEDURE TYPEFORCE(REAL ARRAY F);
	
	BEGIN "TYPEFORCE"
	REAL MAG;
	OUTSTR(CRLF&"THE RESULTING FORCE VECTOR IS ("&CVF(F[1])&
		","&CVF(F[2])&","&CVF(F[3])&")"&CRLF&
	       "THE RESULTING MOMENT VECTOR IS("&CVF(F[4])&
		","&CVF(F[5])&","&CVF(F[6])&")"&CRLF);
	MAG← ( F[1]↑2 + F[2]↑2 + F[3]↑2 )↑0.5;
	OUTSTR("THE MAGNITUDE OF THE FORCE IS "&CVF(MAG)&CRLF);
	END "TYPEFORCE";
⊃ MATRIX INVERSION ROUTINES: INVERT, PINVERSE;


PROCEDURE INVERT (INTEGER N; REAL ARRAY A );

⊃ COMPUTES THE INVERSE OF THE NxN MATRIX "A" AND RETURNS THE INVERTED
MATRIX IN "A".  THE PROCEDURES "SOLVE" AND "DECOMPOSE" ARE USED TO
COMPUTE THE INDIVIDUAL ROWS OF THE INVERSE MATRIX.;
 
	BEGIN "INVERT"
	INTEGER I,J;
	REAL ARRAY LU[1:N,1:N],IDENT[1:N],X[1:N];

	⊃ COPY THE ARRAY AND TRIANGULARIZE IT;

	ARRTRAN(LU,A);
	DECOMPOSE(N,LU,LU);
	
	⊃ COMPUTE THE ROWS OF THE INVERSE ONA BY ONE;

	FOR I ← 2 STEP 1 UNTIL N DO IDENT[I]←0.0;
	FOR I ← 1 STEP 1 UNTIL N DO
		BEGIN "INVLOOP"
		IDENT[I]←1.0;
		SOLVE(N,LU,IDENT,X);
		FOR J ← 1 STEP 1 UNTIL N DO A[J,I]←X[J];
		IDENT[I]←0.0;
		END "INVLOOP";
	END "INVERT";



PROCEDURE PINVERSE(REAL ARRAY M,MI);

⊃ COMPUTES THE PSQEDO INVERSE OF A NON-SQUARE 6x8 MATRIX, MI, AND 
RETURNS THE INVERTED 8x6 MATRIX IN M.  THE EQUATION IMPLEMENTED BY
THIS ROUTINE IS	AS FOLLOWS:

		        T      -1    T
		M ← ( MI * MI )  * MI

WHERE THE "*" DENOTES MATRIX MULTIPLICATION;

	BEGIN "PINVERSE"
	REAL ARRAY A[1:6,1:6];
	REAL STOTAL;
	INTEGER I,J,K;

	⊃ COMPUTE THE PRODUCT OF MI AND ITS TRANSPOSE;

	FOR I ← 1 STEP 1 UNTIL 6 DO 
	   FOR J ← 1 STEP 1 UNTIL 6 DO
		BEGIN "PMULT"
		STOTAL←0.0;
		FOR K ← 1 STEP 1 UNTIL 8 DO
			STOTAL←STOTAL+MI[K,I]*MI[K,J];
		A[I,J]←STOTAL;
		END "PMULT";

	⊃ INVERT THE PRODUCT AND MULTIPLY BY THE TRANSPOSE AGAIN;

	INVERT(6,A);
	FOR I ← 1 STEP 1 UNTIL 6 DO
	   FOR J ← 1 STEP 1 UNTIL 8 DO
		BEGIN "FMULT"
		STOTAL←0.0;
		FOR K ←1 STEP 1 UNTIL 6 DO
			STOTAL←STOTAL+A[I,K]*MI[J,K];
		M[I,J]←STOTAL;
		END "FMULT";

	END "PINVERSE";
⊃ START OF MAIN PROGRAM, INITIALIZE KEY VARIABLES;

OUTSTR(CRLF&CRLF&"*** FORCE BALANCE RESOLUTION PROGRAM ***"&CRLF);
DX← DY← DZ ← 0.0;
TERSE←TRUE;
LINED←""; COM1←"";

⊃ READ IN THE CALIBRATION TABLE IF IT EXISTS, AND TYPE AN APPROPRIATE
  MESSAGE.;

CCHAN←1;
OPEN(CCHAN,"DSK",0,2,0,DUM,DUM,DUM);
LOOKUP(CCHAN,"FORCAL.CAL",FLAG);
IF FLAG=0 THEN BEGIN
	FOR I ← 1 STEP 1 UNTIL 6 DO
	   FOR J ←1 STEP 1 UNTIL 8 DO M[I,J]←REALIN(CCHAN);
	OUTSTR("CALIBRATION TABLE READ FROM DISK"&CRLF);
	ISCAL←TRUE;
   END ELSE BEGIN
	OUTSTR("NO CALIBRATION DATA FOUND ON DISK"&CRLF);
	ISCAL←FALSE;
	END;
RELEASE(CCHAN);

⊃ MAIN LOOP, CHECK FOR TERMINATION OR WAIT TO TAKE READING;

DONTSTOP←TRUE;
WHILE DONTSTOP DO
	BEGIN "MAIN"
	ERR←1;
	WHILE ERR≠0 DO
		BEGIN
	       	OUTSTR(CRLF&"Type CR to read strain gages: ");
		INCHWL;
	        ERR←TLKEF6(READINGS);
		END;

⊃ COMPUTE STATISTICS FOR READINGS.;


	FOR I←1 STEP 1 UNTIL 8 DO 
		BEGIN
		AVER[I]←0.0;
		SD[I]←0.0;
		END;
	FOR I←1 STEP 1 UNTIL NSAMPS DO 
	   FOR J←1 STEP 1 UNTIL 8 DO 
		BEGIN
		AVER[J]←AVER[J]+READINGS[I,J];
		SD[J]←SD[J]+READINGS[I,J]↑2;
		END;
	FOR I←1 STEP 1 UNTIL 8 DO 
		BEGIN
		AVER[I]←AVER[I]/NSAMPS;
		CAVER[I]WAVER[I]-BASE[I];
		SD[I]←((SD[I]-NSAMPS*AVER[I]↑2)/(NSAMPS-1))↑0.5;
		END;

⊃ PRINT THE DATA.  SAVE OUTPUT STRING FOR LATER.;

	SETFORMAT(9,2);
	OUTBUF←GETTIM&
               "Strain Gage Readings: Mean, Corrected Mean, Standard Dev."&
		CRLF;
	OUTBUF2←OUTBUF3←"";
	FOR I ← 1 STEP 1 UNTIL 8 DO
		BEGIN
		OUTBUF←OUTBUF&CVF(AVER[I]);
		OUTBUF2←OUTBUF2&CVF(CAVER[I]);
		OUTBUF3←OUTBUF3&CVF(SD[I]);
		END;
↓OUTBUF←OUTBUF"CRLF&OUTBUF2&CRLF&OUTBUF3&CRLF&CRLF;
	OUTSTR(OUTBUF);
	IF ¬TERSE THEN 
		BEGIN
		OUTBUF2←"Raw Data:"&CRLF;
		FOR I ←1 STEP 1 UNTIL NSAMPS DO
			BEGIN~∀$∩@@@%
∨$A(A>@b↓') bA+≥Q∪_@p↓	≡@~(∩∩∩∪=+)¬+_e?∨+Q¬+d→π-&QIβ	∪9∂'7∩1∃:RLλ@@Dv4∀∩∩∪=+)¬+_e?∨+Q¬+d→π%→l~∀∩∩%≥λv4∀∩∪∨U)')$!∨+)¬UdMπI→Rv4∀∩∪9λv~∀_"AβM⊗A/⊃¬(A/
↓β%
AQ≡A	≡↓/∪)⊂↓)⊃
A⊃β)αv4∀~∀∪¬'↔β∂¬∪≥?)I+
v~(∪/⊃∪1
Aβ'-β∂β∪8A	≡~(∩∪¬≥∪≤@E⊃β)β→=∨ D~(∩∪∨+Q')$P	/QCh↓I↑As=jAoC9hAi↑↓I↑}@!αY∧YYλY∞1$Y&YPY0YπHX}RzDRv~(∩∪→∨⊃λQ→%≥λM
$Rv~(∩∪→∪9λA>↓∪≥π⊃]_v~∀$∪∪A∃#*Q→%≥λXλ}DRAQ⊃≤@4∀∩∩∪=+)')HP@D@↓α@ZAAeS]h↓CYXA⊃CiBA
←YYK
iKHD→π%→_~∀∩∩$∩D@Aλ@ZA'∃hA]K\AICi∧AECg∀A←MMMKhDM
%→L4∀∩∩∩@@@@@@D@↓ε@ZAUgJAI¬iBAM=dAGC1SEeCQS←\D→π%→_~∀∩∩$∩D@A⊂@ZA⊃¬YhAKaKGki%←\A←_A/%∪M(DMπI→L~(∩∩∩∩λ@A∞@4A∂↑AIKCHAMieCS8AOCO∃fACO¬S\DM
%→L4∀∩∩∩$D@A$ZA%KM←YmJ↓M←eG∃fAC]⊂A[←[∃]ifD→π%→_~∀∩∩$∩D@AL@ZA've data set on disk"&CRLF&
				"  T - Terse output"&CRLF&
				"  X - Resolve at external location"&CRLF&
				"  ? - Print this message"&CRLF)
		ELSE IF EQU(LINED,"G") THEN ASKAGAIN←FALSE
		ELSE IF EQU(LINED,"D") THEN ASKAGAIN←DONTSTOP←FALSE

⊃ SET OUTPUT TERSE/FULL MODE;

		ELSE IF EQU(LINED,"A") THEN TERSE←FALSE
		ELSE IF EQU(LINED,"T") THEN TERSE←TRUE

⊃ USER WANTS TO SET NEW DATA OFFSET;

		ELSE IF EQU(LINED,"B") THEN 
			BEGIN
			FOR I←1 STEP 1 UNTIL 8 DO 
				BEGIN
				BASE[I]←AVER[I];
				IBASE[I]←READINGS[1,I];
				END;
			OUTSTR("New data base offset set"&CRLF);
			ASKAGAIN←FALSE;
			END

⊃ RESOLVE FORCES AND MOMENTS AT AN EXTERNAL LOCATION;

		ELSE IF EQU(LINED,"X") THEN
			BEGIN
			OUTSTR("Type Dx,Dy,Dz = ");
			ANS ← INCHWL;
			DX ← REALSCAN(ANS,DUM);
			DY ← REALSCAN(ANS,DUM);
			DZ ← REALSCAN(ANS,DUM);
			MPRIME[4,2]←-DZ;
			MPRIME[4,3]←DY;
			MPRIME[5,1]←DZ;
			MPRIME[5,3]←-DX;
			MPRIME[6,1]←-DY;
			MPRIME[6,2]←DX;
			END

⊃ FORCE AND MOMENT COMPUTATION;

		ELSE IF EQU(LINED,"R") THEN
		    IF ¬ISCAL THEN 
			OUTSTR("NO CALIBRATION DATA"&CRLF)
		    ELSE BEGIN "RESOLVE"
			REAL ARRAY F[1:6],FPRIME[1:6];
			SETFORMAT(8,2);
			FOR I←1 STEP 1 UNTIL 6 DO 
				BEGIN
				F[I]←0.0;
				FOR J←1 STEP 1 UNTIL 8 DO 
				   F[I]←F[I]+M[I,J]*(READINGS[1,J]-IBASE[J]);
				END;
			TYPEFORCE(F);
			FOR I←1 STEP 1 UNTIL 6 DO
				BEGIN
				FPRIME[I]←0.0;
				FOR J←1 STEP 1 UNTIL 6 DO
				   FPRIME[I]←FPRIME[I]+MPRIME[I,J]*F[J];
				END;
			OUTSTR(CRLF&"FORCE/MOMENTS RECOMPUTED AT ("&CVF(DX)&
				","&CVF(DY)&","&CVF(DZ)&")"&CRLF);
			TYPEFORCE(FPRIME);
			ASKAGAIN←FALSE;
			END "RESOLVE"
⊃ SAVE DATA ON DISK FILE;

		ELSE IF EQU(LINED,"S") THEN
			BEGIN "SAVEIT"
			INTEGER CHAN;
			OUTSTR("OUTPUT COMMENT =");
			LODED(COM1&CR);
 			COM1←INCHWL;
			CHAN←3;
			OPEN(CHAN,"DSK",0,2,2,DUM,DUM,DUM);
			LOOKUP(CHAN,"FORCAL.DAT",DUM);
			ENTER(CHAN,"FORCAL.DAT",DUM);
			QUICK_CODE¬
				UGETF	3,DUM;
			END;
			OUT(CHAN,COM1&CRLF&OUTBUF&CRLF&FF);
			RELEASE(CHAN);
			END "SAVEIT"
¬
⊃ USE DATA FOR FORCE CALIBRATION, PRINT CURRENT DATA;

		ELSE IF EQU(LINED,"C") THEN
			BAGIN "CALIB"
			OUTSTR("CURRENT CALIBRATAON DATA:"&CRLF&
			  " TEST #         FORCES AND MOMENTS"&CRLF);
			SETFORMAT(8,3);
			FOR @∩A|@bA'Q @b↓+≥)∪0@lA	<@~∀∩$∩∪¬≥∪≤4PH$$&rN}∞5→"%%2⊃↓↓	Xh($$HJ~>I∧Qα⎇↓
αNR⊗α↓EαVu"&1↓2α∩<4PH$$$L
2N}rM~∞41"~nJb*u%Xh($$HJ>VR≥"I"εu→~∞Jd1%l4PH$$&,r⊃l4Ph(Eα∀*B2ε≤)α>2"α∩εR
α↑&RBα:⊗]Xh(4(HH&>V%~RI!∃∩⊗B2~∃α∩
"¬αN-!↓!Alr>:∃J↓u↓	KX4($HJε:M¬yα&:≤B↑1lhP$$&%~⊗R}LrRN∞q"ε:~b∩V5KX4($HJ&→α%~⊗PmααR"⊗ph($$HJ
ε≡Lp4($HH&ε:≥y		lhP$$$L2>IαJα⎇↓E¬~R⊗Aβ	αV:$J1↓Y∧"<4(HH$$&rN}εu→~∞Z2B~n∩≤*Q2&jIl4(HH$&>-"NBIB∩:⊗]∧2>J∞-→>6>l*:RMβi	%lhP$$$Lb>∩⊗"Bε:M4~I%LhP$$$L
:Mα|J:∞"<al4(HH$&~⎇⊃α%αz↓EαN$*A↓E¬*:R&b↓Yα∩z4($HH$&~β8E≤-EI∃m⎇(X∀e≤8→bDj5D%,U↔0hP⊃⊃⊂L4z$∧J¬tε∩¬≥HZαβ

Ye$LDπα∧$t↓PPH⊃⊃⊂L-
;4%≤ZADMmβpp*h4Vr+Wc"B!⊃"13HGc"B!⊃#"D$λ4rh	_H∃∩λT⊂p3	_TP5	→sH∪(~∀R6∧	4h∃	t⊂Q(λ9s4∃*H1∞c!!""#!!""3jZ∀u∀E∧Pss*
5⊃(	h5h⊂h→∩0TH~⊂3sD	05∀I≠λ
⊗%IJ/h∧%.c"A⊃"03J;r3Pi
s∞c!!""2(d⊃45%λ3Tk∧+(J(
I⊃3C!!"""((1r3AQB""!~ss∃HZJ∪2%H4∀kλe.c"A⊃""4	→UQ4J8*∪+	Y*.c!!""")~pp3z∀U1'1"B"!⊃13Qπ1"C"B∀∀p5HT∪Q5dλp3∩(*P5∩)yH∪sD
∩⊃(λI4rog1"C"A⊃"3u*Ju∀J∧*p5Q$	Q5h	X5∀R+∧∪sH
I⊃(⊃	~rh
∃∪J/d∧J.c!!""0)jwr3H9∃s∞aQB"")_H⊃4*U⊂3TeDV(B$
∩⊃3AQB""!_Q1r)a"B"!⊃0r⊂)klnc!!""")z⊃3Jλ9⊂3K∧(∀rhEFε%,L¬H∃3+λJ3*.aQB""!_3U⊃*%⊂r⊂)eλQSj(p3H83λKλJ3*.aQB""!~q5⊃IzS05¬ε-+
e↔c"B!⊃"1Sj$∩7l$
u⊃4∧ε(∃3JI3λ
Dλ∪hβ!!"""$∧λ⊃Sj$∩H↔dε(∀uλZλ
λ
YU∩3∧ε(⊃∪aQB""!⊃0Q1i→HλT	I3Q(AQB""!⊃314ktHNc!!"""!_St@	4↔h∩D
u⊃4∧ε(∃3JI3λ∩E6h⊃∪d↓#"H↓⊃"""!→14wiX4iPjh*∪6i∃∩w*$dHλλG1"B"!⊃"3u*E⊂r⊂)e∪14dhtS⊃E↔c"B!⊃""1)hλλT	I3Q(G1"B"!⊃3u5¬λr⊂3EHtS⊃DhtS⊃DdPp3	_TP5	→sH∪(~∀R6π$λIQhZ∃∩3%↔c"B!⊃"4Q)H04q%λr⊂3E↔c"B!⊃"13HGc"B!⊃13Q∧∧Pp3	_HNc!!"13HDλQ⊂*H3∪sj∧Nc"A_3Qλ∧)023D'c"C!"(⊃6	~λ⊂sλX3S⊗'1"C"Iz5∀u
%λR(
:4Q(		t⊃(
I⊃(λh∧(hh	~h⊂p)I0TP*H1λ($∀(IPj)⊃J.aQC"Q)hλλUj)4uλAQ@↓Hss3(YUλ¬D∧λ∃P)I1λεε
λ
λ1q4d∧λλ∃	Iq1MEhP2#!(h∀Q(4λ∀⊂(x(λλλH4ptI~∃∩3ia"Plεε ⊂____CE!X__→⊂___→∧U$j&"H* KEF6
C00004 00003	START OF EXECUTABLE CODE
∃ε@```p````P∩∪7→=πβ_AM)∨%β≥
Aβ%∃β:4T→AAAλε∩∧,hITXh(2cXh e$~ID*¬II4,3aQ$LuHZ$tD
Dd\Xf`hPQ'2∃$I8T32$	∃~∧∀
4LDλ4dH_$d*

$|≤XJU∀
λiu∩¬(X∀$Lht¬$DTλd⎇∀8T¬≤,j9∀t:
z$M≥AQ#]≥J(∀Lrλx∀<-4λe∀|Tλ∩¬¬)xu∀T
DD
D
%,u4	tr¬IλR¬∧Jε∪
{FUbα∧∀
4m	HPhS:8∀Lbλ8∀db	~2∧
4λd|dIzu≠PQ'0hS1_U∃∀z+u$d8Xc2D→jD,<Z$∧
∃(≠∩¬∀X_DLtz5∪Zα↓Q#]<λZ$(h'1∀-∃)z"βjε∧∧L2∧*Dd\Xfb∩¬x~2¬≥X84-≥8jTbbβ6α∧⎇IλU∃<~8PhS1~$,I→d=~πTβππ∧∧
∃(≠∩∧Ld
tDL9∧¬$DT
5%∀→→b∧<_xU~¬(X∀$Lhz2∧
(T¬∀-JZ$t,AQ#Xh':DDM4
$⎇-I→d*¬K~∧-~	~B=~	ztr∧Z*$⎇∩	XU≥≤_xU~∧yd¬$DT
E%JaQ hS8HT4Li~DL|j1PPh*s8⊃↔5¬-9∧¬≥$_92¬∀Xy∃≥$Z!PTl~9D|≥vFβββ↓↔4l
:HU∩∧jYT∀-$	∀r∧YH`hTH~D$KvCββε⊃∪]≥H~%"∧_HE∀-:4¬$z
(T"λH∃$
λj$|JλYD0h)X∃≥$Z+sβVfpK\9λT≤Z	jTl∀Z$∧5∀yT∧,dd	∀2∧Iyd*¬(X∀$LhqPT$*Xdb¬wWβK9jTl∀Z$∧|2
yu∀%4
Dz¬J(∀u≤hZ"∧5)yRπ$λT∧,daQ ;START OF EXECUTABLE CODE

TLKEF6:	SETZ	1,		;CLEAR ERROR FLAG
       	MOVEM	16,HOLD+16	;SAVE THE REGISTERS
	HRRZI	16,HOLD
	BLT	16,HOLD+15

;INTIALIZE THE ELF AND CLEAR THE MASTER NUMBER.  THIS INSURES THAT
;WE READ CURRENT DATA

	IOPUSH	1,		;CALLER MIGHT WANT THIS CHANNEL
	JRST	[   OUTSTR CM0	;IOPDLOV MESSAGE
		    JRST   ERR  ]
	INIT	1,17  		;INITIALIZE THE ELF
	SIXBIT	/ELF/
	0
	JRST	[   OUTSTR CM1		;ERROR RETURN
ERR:		    AOS    HOLD+1	;RETURN ERROR VALUE
		    JRST   TLKDNE  ]
	GETSTS	1,1		;GET THE ELF STATUS WORD
	TRNE	1,777700	;CHECK FOR ERROR CONDITAON
	JRST	[   OUTSPR CM2		;INDICATE STATUS ERROR
		    JRST   ERR    ]
	MTAPE	1,MASADR	;ZERO MASTER NUMBER
	JRST	[   OUTSTR↓π~f@@∩wI%∨$AI)+¬8~∀∩∩@@A∃I'(@@↓%$@↓:~∀~(w'β∪PA)&daα⊗22α∞>2d*∞@%4
DD*λH∃$λQ!⊂hP→Yu4,⊃⊗2ck⊗↓⊂K]J+∩¬∀X_DLttλTd2λH∃$
ε∩α¬$α31*1"TQ(_∪∀∞A~q1⊗A⊗+α"':s⊃1*∧⊂Q1IzQ(∃
+23Qdλ1p2)a"B4iH14α&∃β"B)Z⊂4⊃!⊗+⊃∪HX1⊃α'8q5λ
I⊃(⊃	yQ(∃izQλ⊃J)s(∃	λ(⊃3λa"B2J*uα6d∧λ∪u*Ju∀@⊂⊂f[∧DNbi)'T⊂)"j∃i'εEαDP⊂⊂λ%))jλ⊂⊂"i∀⊂⊂.FB∧fgk⊃DY⊗"∪"ki"α]f'`Q⊂+ f∃bP$g∃'P)"Qdij"TεE∧e∃fh#@αY⊗"f⊃"'"DNa) g⊂d⊂$cλ*$"P⊃f#⊂)Rcg f∀P"'g⊃FE∧iSe#DYK)"`b∪(∧]i⊃h"`jλ$c⊂&Si"P*∩dbP&⊃c*εEαgjj)U)∧afM⊂∧D]Qd)bP∃"f&⊂∪h"a U'i⊂"S#⊂*'SeP*'SP&jaR⊂*$fQFE∧e∀)j∧bT)εEεB≥j) S)c"iλ*$"P⊃ j P⊂ ae@∃'P"$⊃P&`dS⊂()'Qi fP∩c⊂ f∪⊂+bg∃⊂+bf∪εE∧FB"f#"∪"]∧aPdbDY&`ij⊃i∧]fPebP)Ui"P+QP#gjλ*$"P∀$cd*λ&`ij⊃i⊂'*Sa"iεB∧e))U∧mP⊂λ'jj)U)⊂!fMD]idQe f⊂⊃i)'iβE∧P⊂λ⊂⊂⊂⊂λ⊂⊂⊂⊂∩))jλ⊂"i)αnBE∧Sgk"DL⊗⊗XT∀∀DD]Qbj⊂ Q")"iTP*'P∃) g)Q"i⊂"⊂j FEαice∧L⊗⊂⊂⊂λ⊂∧D]Q"ai"Sbg*⊂⊂i) lH('dg∃"iεEαd)&$BY⊗⊗b⊂*c&⊂α]ibjλ('dg∃"i⊂*∪P*) S)c"iλ" j CE∧fgU"fDY$g&)UεE⊂⊂λ⊂⊂∧jTbj$DLV#`cQP⊂∧]Tbj⊂*T⊂$g(∃j⊂)j∀ dg⊂⊃`cbP⊃ j FB⊂⊂⊂⊂λ∧dg∧LV g&∀j∧D]T"`b⊂∩g⊂ P⊂&'aeH'c⊂"⊂j FEαe))jαW∃Y∧B]g'i∪`f⊂)⊃j*i'βE∧e)∀j∧mPλ⊂'jj∀j)⊂!S\∧D]Qi)'iλ)"j*T'εE∧BP⊂⊂⊂∩))j   ERR  ]

;BETURN TO CALLANG PROGRAM

TLKDNE:	IOPOP	1,		;RELEASE THE ELF & RESTORE CHANNEL 1
	JFCL			;JUST CANNOT HAPPEN
       	HRLZI	16,HOLD		;RESTORE THE REGISTERS
	BLT	16,16
	SUB	P,[2(2)]	;POP ARGUMENTS OFF STACK
	JRST	@2(P)		;RETURN
;	[LOCAL STORAGE AREA]

HOLD:	BLOCK	17

;I/O DATA AREAS

GAGE:	400004,,400000+DATADD	;MODE AND ADDRESS FOR "IN" OF STRAIN GAGE DATA

INLST:	0			;PT. TO DATA ARRAY
	0

MASADR:	003000,,MASLOC		;CLEAR MASTER WORD
	0

DNEADD:	002004,,MASLOC		;MODE AND ADDRESS FOR MASTER DONE WORD
DNEWRD:	0			;VALUE OF DONE WORK

;OUTPUT STRINGS

CM0:	ASCIZ/IOPDLOV WHEN TRY TO SAVE CHANNEL 1 FOR "ELF"
/

CM1:	ASCIZ/CANNOT INIT "ELF"
/
CM2:	ASCIZ/"ELF" STATUS WORD INDICATES ERROR CONDITION
/
CM3:	ASCIZ/UNABLE TO ZERO MASTER NUMBER IN "ELF"
/
CM4:	ASCIZ/"ELF" NOT TRANSFERING STRAIN GAGE READINGS
/
CM5: 	ASCIZ/BAD READ FROI "ELF" DURING POSITION DATA TRANSFER
/
CM6:	ASCIZ/ELF READ ERROR WHILE WAITING FOR ADC READING TO COMPLETE
/
CM7:	ASCIZ/ELF MASTER NUMBER INCORRECT, CAN'T READ THE DATA
/
CM8:	ASCIZ/ERROR IN TRANSFERING STRAIN GAGE DATA
/

END         
COMMENT ⊗   VALID 00017 PAGES        IO.PAL
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	IO - TELETYPE IO AND STRING MANIPULATION ROUTINES
C00006 00003	"INSTR" - VT05 INPUT ROUTINE 
C00009 00004	"HOLD" - VT05 ROUTINE TO TEMPORARILY SUSPEND PRINTING
C00010 00005	"RELSCN"- STRING TO FLOATING POINT NUMBER ROUTINE
C00013 00006		   [CONTINUATION OF "RELSCN"]
C00016 00007		   [CONTINUATION OF "RELSCN"]
C00019 00008	"INTSCN"- STRING TO INTEGER NUMBER ROUTINE
C00021 00009	"CLRCMA"- ROUTINE TO CLEAR COMMA BREAK CHARACTER FROM STRING 
C00022 00010	"FORMAT"&"RSTFOR" - ROUTINES TO SET AND RESTORE OUTPUT FORMAT 
C00024 00011	"CVF"   - FLOATING POINT NUMBER TO "F" FORMAT STRING ROUTINE 
C00027 00012	"CVE"   - FLOATING POINT NUMBER TO "E" FORMAT STRING ROUTINE 
C00030 00013	 	   [CONTINUATION OF "CVE"]
C00032 00014	"CVG"   - FLOATING POINT NUMBER TO "E" OR "F" FORMAT STRING  
C00034 00015	"PRTF"  - PRINTING ROUTINE USED BY "CVF", "CVE", & "CVG"
C00037 00016	"CVI"&"CVO"   - INTEGER NUMBER TO ASC STRING 
C00040 00017	LOCAL STORAGE AREA
C00044 ENDMK
C⊗;
;IO - TELETYPE IO AND STRING MANIPULATION ROUTINES

.TITLE  IO 

;***NOTE: ALL OF THE REGISTER DEFINITIONS REQUIRED BY THESE ROUTINES****
;***	CAN BE FETCHED BY DOING A ".INSRT HALHED[HAL,HE]"	********


;"CRLF" IS A SUBROUTINE FOR TYPING OUT ONE CARRIAGE RETURN AND LINE FEED 
;ON THE TELETYPE.

CRLF:	MOV	#CRLFX,SG	
	JSR	PC,TYPSTR
	RTS	PC

CRLFX:  .BYTE	15,12,0,0

;"TYPSTR" OUTPUTS A STRING, ENDING WITH A ZERO CHARACTER.  A POINTER TO
;THE START OF THE STRING MUST BE LOADED INTO R5.  CALLED USING THE PC.

TYPSTR:	MOV 	R0,-(SP)	
	BR	2$
1$:	JSR	PC,TYPCHR	;TYPE THIS CHARACTER
2$:	MOVB	(SG)+,R0	;GET A CHARACTER
	BNE	1$		;END OF LINE?
	MOV	(SP)+,R0
	RTS 	PC		;Done

TYPCHR:	TST 	OUTSW		;VT05 or console?
	BEQ 	TYPCH1	
	TSTB 	KBOS		;VT05: Is it available?
	BPL	TYPCHR		;No
	MOVB 	R0,KBOR		;Output a byte to it.
	CMP 	#12,R0		;Was it a line feed?
	BNE 	TYPRET		;If not that code, then done.
	CLR 	R0		;Otherwise, output 3 nulls.
	JSR 	PC,TYPCHR	;
	JSR 	PC,TYPCHR	;
	BR	TYPCHR		;Direct jump; it will return to caller.
TYPCH1:	TSTB 	OREG		;Console:  Ready?
	BNE 	TYPCHR		;No.
	MOVB 	R0,OREG		;Yes.  t a byte to it.
	MOV	#1,172566	;Wake up pdp10 by generating interrupt
TYPRET:	RTS 	PC		;Return.
;"INSTR" - VT05 INPUT ROUTINE 

;STRING BYTE POINTER MUST BE  IN SG.  A CARRIAGE RETURN  IS ASSUMED TO
;BE  THE  ACTIVATIOJ CHARACTER.  A  RUB OUT  IS  A  DELETING BACKSPACE
;CHARACTER.  AT  THE COMPLETION OF  THIS ROUTINE  A NULL CHARACTER  IS
;PLACED IN THE INPUT STRING.  SG IS LEFT UNCHANGED.

;REGISTERS USED:
;
; 	SG PASSES ARGUMENT AND IS NOT MODIFIED

INSTR:	MOV	R0,-(SP)
	MOV	SG,-(SP)
IN2:	TST 	OUTSW		;VT05 OR CONSOLE?
	BEQ 	CONSIN	
	TSTB	KBIS		;TEST IF KEYBOARD READY
	BEQ	IN2		;WAIT TILL IT IS
	MOVB	KBIR,R0		;GET A CHARACTER
	BR	GOTCAR
CONSIN:	MOV	IREG,R0		;BYTE FROM PDP10?
	BEQ	IN2		;NO
	CLR	IRAG
GOTCAR:	BIC     #177600,R0	;MASK OFF - MAKE IT 7 BITS
	CMP	R0,#177		;COMPARE TO BS CHARACTER
	BNE	IN3		;SKIP IF ITS NOT
	CMP	SG,(SP)		;CHECK IF ANY CHARACTERS IN BUFFER
	BEQ	IN2		;FORGET BACK SPACE IF NO CHAR.
	DEC     SG   		;REMOVE LAST CHARACTER IN BUFFER
	MOV	SG,-(SP)
	MOV	#DBS,SG		;PERFORM A DELETING BACKSPACE
	JSR	PC,TYPSTR
	MOV	(SP)+,SG
	BR      IN2
IN3:	CMP	R0,#15		;COMPARE TO CR CHARACTER
	BEQ     IN4   		;CONTINUE READING IF ITS NOT A CR
	CMP	R0,#40		;CHECK IF CHARACTER LEGAL
	BLT	IN2		;IGNOR IF IT IS
    	MOVB	R0,(SG)+	;SAVE THE CHARACTER
	JSR	PC,TYPCHR	;ECHO CHARACTER
	BR 	IN2		;CONTINUE READING
IN4:	MOVB	R0,(SG)+	;END OF STRING,PUT IN A CR 
	CLRB	(SG)		;PUT IN A NULL CHARACTER
      	JSR	PC,CRLF		;TYPE CR/LF
	MOV	(SP)+,SG
	MOV	(SP)+,R0
	RTS	PC		;RETURN

DBS:	.BYTE	10,40,10,0
;"HOLD" - VT05 ROUTINE TO TEMPORARILY SUSPEND PRINTING

;IF A CHARACTER HAS BEEN TYPED ON THE VT05 KEYBOARD, THIS ROUTINE GOES
;INTO A BUSY WAIT LOOP UNTIL ANOTHER CHARACTER IS TYPED.  BOTH CHARACTERS
;ARE LOST.  IF NO CHARACTER HAS BEEN TYPED, THIS ROUTINE RETURNS 
;IMMEDIATELY.

;REGISTERS USED:
;
;	NONE

HOLD:	TSTB	KBIS		;TEST IF CHARACTER TYPED
	BEQ	HLDDNE		;RETURN IF NO CHARACTER
	CLRB	KBIR
	TSTB	KBIS		;ELSE WAIT TILL ANOTHER CHARACTER TYPED
	BEQ	.-4
	CLRB	KBIR
HLDDNE:	RTS	PC



;END OF "HOLD"
;"RELSCN"- STRING TO FLOATING POINT NUMBER ROUTINE

;THE FLOATING POINT NUMBER MUST BE OF THE FORM SIII.DDDESXX WHERE S IS
;THE SIGN OF THE NUMBER, III IS THE INTEGER FIELD,  DDD IS THE DECIMAL
;FIELD,  AND SXX  IS THE EXPONENT  AND ITS SIGN.   THE LENGTH OF  EACH
;FIELD IS VARIABLE  BUT ONLY THE FIRST 8 DIGITS  ARE USED IN COMPUTING
;THE F.P.   NUMBER.  EMPTY FIELDS ARE PERMITTED AND ALL LEADING SPACES
;AND ZEROS ARE IGNORED.  THE LOCATION OF THE FIRST  BYTE OF THE STRING
;MUST  BE LOADED INTO  SG BEFORE  CALLING "RELSCN".   AFTER EXECUTION,
;THIS ROUTINE LEAVES THE F.P. NUMBER IN REGISTER AC0 AND SG POINTS  TO
;THE BYTE FOLLOWING THE LAST DIGIT.  THE C BIT IS USED TO INDICATE AN 
;ERROR CONDITION.  IF NO NUMBER WAS FOUND BEFORE ENCOUNTERING A COMMA
;OR NULL CHARACTER, THE C BIT IS SET OTHERWISE THE C BIT IS CLEARED ON
;EXITING THIS ROUTINE.  "RELSCN" IS CALLED USING THE PC.

;REGISTERS USED:
;
;	AC0,SG PASS ARGUMENTS, NO OTHER REGISTERS AFFECTED


;"DIGIT" CHECKS FOR ASC DIGIT AND CONVERTS TO INTEGER IF IT IS

.MACRO DIGIT NOTDIG
	CMP	R0,#60		;COMPARE TO ASC ZERO
	BLT	NOTDIG		;SKIP IF OUT OF RANGE
	CMP	R0,#71		;COMPARE TO ASC 9
	BGT	NOTDIG		;SKIP IF OUT OF RANGE
	BIC	#60,R0		;MASK OUT ASC BASE
.ENDM

;"CKSIGN" CHECKS FOR A - OR + CHARACTER AND SETS SIGN APPROPRIATELY

.MACRO CKSIGHA∪M'∪∂≤1≥)'∪≥≤Y'∪≥≤~∀∪
≠ ∩FTfY$`$∩w∪∂9∨$@D,DAπ⊃¬%βπ)∃$~∀∪	"∪∪M'∪∂≤4∀∪π≠@∩Fjj1$`∩∩mπ⊃π,A∪A%)&AαDZDA
⊃β$\4∀∪¬≥∀∪≥)'%∂≤∩∩m1∪(↓∪A∪Q&A≥∨P~∀∪∪9ε∪'∪≥≤∩∩w∃→'
AM(A'%∂∀A≥=≤[5I≡~∀∪	$@∪∪M'∪∂≤4∀]≥⊃~~∀~(w')βI(A∨E%→Mπ≤D~(~∃%1'π≤t%≠∨,∪H`XZQM R∩wMβ-
AI∂∪'Q%&~(∪≠∨,%$bXZ!' R~(∪≠∨,%$dXZ!' R~(@@@@@∪≠∨X∪$fX4Q' R$~∀@@@@@∪
→$∪$H@∩∩wI'(↓	∪∂∪PAπ∨+9(~∀∪5∨,∩FDY$f∩$w'(↓	βπ∪5β_A!=∪≥(A→→β∞~(_∩@@↓7π∨≥Q∪≥+βQ∪∨≤A=@E%∃→'π≤	:~∀~(∪≠∨,$FZbYHb∩∩w%≥	∪π¬)αA≥<A	∪∂%)&A9π∨+≥Q%λ4∀@∪π1%∪β`∩∩w
→β$↓)⊃
A9+≠¬HAβππU~~∀∪
→$∪≠M∪∂≤∩$wβ''U≠
A≠¬≥)∪'MαA!∨M∪)∪-∀~∀~∀m!∪π⊗↓+ Aα↓π⊃β%¬π)$↓β≥λA
⊃π⊗↓
∨$AM∪∂~(~∃!∪
⊗t∪≠=-∧∩QM∞RVYH`∩w!%π⊗A+@AαAπ!β%βπQ$~∀%)'(∪Hb∩∩w
⊃π⊗↓∪A	%∂∪(A∃≥π∨+9)%⊂~∀∪¬∃"∪π⊃-	∞∩∩m'↔∪ ↓∪A)I+
~∀%π↔'∪≥≤∪!∪
⊗Yπ⊃-	∞Y≠M∪∂8KZ∞"⊗≤Yα~>⊂↓-α>∩↓5αNL:84(hQn∞",~-α&2α∞"ε∀
J∞R-⊃α&M∧	α∩&<JP4(hR∞".$9h&∩L:&P&≤B.∩@HInN.M↓αRtλ4D\J∧∧L2	iu"∧∀λDL<~APPLZYD0MHYbd6↓⊂K\XYE"∧I_tM"
:Tj∧+∀βQ!∀
≤↓∀3∩e&↓⊂K\ZYE$M	K∩∧LhHUB∧+∀β h!_∀$$a_D<E:E¬∪α∃H∀≠↔8∀$"
I∧*∧ejαr¬It∧≤:YPhP_9E∩α∧∧α¬∪∀∧αα⊃↔4LtI_4
$TλDL<~D∧,t9zTu$Z(T h!~5,∩∧∧ααα6EE∪⊂⊃↔4$,:(Tl,jD∧$Ly~B∧≤zYe h!→$m~	∀≤X⊃↔4<zλxU"∧→iu$DZ$∧≤D~(∀≥$Z!PPh'84D,94∧L2
I∧*∧9λ∃∀:HU∩∧~4∧
∧HX4Ll→D¬∧|→j@hPQ(4D\Jπ L≤X↓∩≠+eJ#H↔84|mλ~$*∧9λ∃∀:HU∩¬It∧$,9→Tb

@hP_)d(M)iu∀h⊃↔5≤\~∧∧L2	iu"∧Ejαph$∧ααα∧↓∃%≥A~#_H↔84D,94∧L2λHT≤LX→B¬∧y→e"∧→J$,K∀¬≤-AQ L∀Z⊃∃∀tz)PHK9_b¬∀Z8U"¬I	∃~∧ZZ5"∧(T∧
¬IλR∧,hD∧|2
I∧*∧X→e"pQ!∀≤E!~#⊂H↔:5$
*D∧≤⎇YjDLttλe∀:I∀|t→D∧$Ly~E_h!_4e⊂~&0HK9→d$L8~D*∧Ejαr¬8Z@hP_9E⊂M&⊃⊂K\→hDL≤~HR∧$_y∃"∧Yh4⎇,jHU∀AQ LTZ↓∃∧L91⊂K\yt∧<-Dλ∀t⎇IλU∩∧9λ∃∀:HU⊂h!Q#\≤z*$,≥D	e,l(Z"∧4z$¬∧⎇xZ"∧|d
D,r	_b∧$_y∃%~λiu,tAQ hU)iu∀k!~E≥ ~&⊂HK89∧,≤4	∀2∧I_tM%4λd⎇,hAPPL)hPL≤	8U@H↔:4\M∧	∀2∧iyd(h!~E≥ ~&0HK89∧,≤4	∀2∧HX4Ll→D¬∧|→jB¬≤ZAPPL)hPL≤	8U@H↔8D|uD	d⎇∀X→DMTT	∀2∧it∧"u¬aPRα∧∧LmYH`M$YiE≥"
&"Jd_6K\9z%∀,:D∧$,9→Tb
	tLuAQ hS89∧,≤4	∀2∧T
4L<dλTt≤zYe$-(X@hPQ(4D\[π L≤X↓∩≠εUE∪⊃↔4≤|Zλ∃∀*
Ir∧*λ9∧
∀_:D-⊂Q!∀∀tQ_4D\Ia⊂K]99∃α∧_d∧t⎇DλPhP~J5 M&⊂λ∧∧α".h9⊃0rd	1H∪It⊃∩1i~∀h⊂HXStQ$λ#"B((4"1+λsC"A→⊃⊃B*H3S∀jE⊂0l↓↔tq5∧λ0l∂&∀∩1Hλ[∀∪sHYUλ⊂JZλ∪Sdλ∩1r*Jc"@	   [CONTINUATION OF "RELSCN"]

	CLR	R1		;INDICATE DIGITS ENCOUNTERED
EXCN:	CLR	ESIGN		;ASSUME EXPONENT POSITIVE
	CLR	R3		;CLEAR EXPONENT ACCUMULATOR
	MOVB	(SG)+,R0	;GET NEXT CHARACTER
	CKSIGN	PIC2,DIG2,ESIGN	;CHECK FOR SIGN CHARACTER
PIC2:	MOVB	(SG)+,R0	;SIGN INCOUNTERED, GET NEXT CHAR.
DIG2:	DIGIT	NORM		;EXTRACT DIGIT 
	MUL	#10.,R3		;MULT EXPON REG BY 10.
	ADD	R0,R3		;ADD DIGIT TO EXPONENT REG
	JMP	PIC2		;GO GET ANOTHER CHARACTER

NORM:	TST	ESIGN		;CHECK SIGN OF EXPONENT
	BEQ	.+4
	NEG	R3		;COMPLEMENT EXPONENT IF - SIGN
	ASH	#2,R3		;MULT. INDEX BY 4 FOR F.P. NUMBERS
	MULF	TENLST(R3),AC0	;ADJUST EXPONENT OF NUMBER
	JMP	CDONE		;EXIT ROQTINE

;CHECK IF END OF STRING OR COMMA ENCOUNTERED

CHKDN:	TST     R0		;COMPARE CHARACTER T@≡A∧A≥+→0Aπ⊃βIβπ)H~∀∪¬∃"∪π	=≥
∩∩m1∪(↓∪A∪PA∪&X↓)⊃∪&↓∪&A)!
A≥⊂A∨AQ⊃
A'Q$~∀∪
≠ ∩FThY$`$∩wπ∨5!β%
↓)≡@D0D~∀∪	"∪π⊃∨≥
∩$w1∪PA∪A%(A∪&4∀∪)'P∪$b∩$w)'PA∪A¬≥2A	%∂∪)&↓3(~(∪¬→(%!∪π⊗$∩w∪↓≥∨≥
0A↔@A'πβ9≥∪≥∞4∀~∀w9≡A≠∨I
A	∪≥∪)&@4Aβ!!12Aπ∨I%π(↓'∪∂≤↓)≡A≥U≠¬$4∀~∃π⊃∨≥
t%	ε∪M∞∩∩wA∨∪≥(↓)≡A¬Iβ⊗A
⊃β%β
)$~(@@@@%)'(∪5'∪∂≤$∩w)M(A'∪≥≤A∨↓≠β≥)%''α~(∪¬"$\Vh~(∪≥∂_∪βε`$∩wπ∨5!→≠∃≥(A≥U≠¬$↓∪A'%∂≤A≥∃∂β)∪Y
~∀@@@@@∪)'(%$b∩∩m)'(↓∪A≥<A≥+≠	$A9π∨+≥Q%λ4∀∪¬D∩\Vh4∀∪'∩∩∩wM(Aε↓%∂∪M)$A%A≥≡↓≥+≠¬∃$A
∨U≥λ~∀@@@@@∪≠∨X∩Q' $VY$f$w%'Q∨%
AI∂∪'Q%&~(∪≠∨,$Q' R,Y$d~(@@@@∪≠∨,$Q' R,Y$b~(@@@@∪≠∨,$Q' R,Y$`~(∪%)&%!ε∩∩m%)+I≤~∀~(~∀w9λA∨E%→Mπ≤D~(_vE∪9)'π≤λZA')I∪≥∞AQ≡A∪≥Q∂$↓≥+≠¬∃$A%∨U)∪≥
4∀~∀wQ⊃
A∪9)∂HA≥+≠	$A≠U'(A¬∀A∨AQ⊃
A
=%~A'%∪∩A/!%
ALA∪&AQ⊃
A'%∂∀A∨_A)⊃
4∀w≥+5¬$X↓β≥λA%∪∩A∪LA)⊃
↓∪≥)≥$A
%→λ\Aβ→_↓→β	%≥∞A'Aβπ&↓β≥λ@↓5%∨L~∀wβI
A∪∂9∨%λ8@A)⊃∀A→>≤
R&>rα>→α$B∃α~M∩NQα∃JR∃α|1αR"*αNRJLr≥α6-~Qα
*4)ndzε∩⊗"α&:RzαJ⊗≡M~R⊗I¬~≥α
,2>J∃∧~ε22Lr≥↓
LrRN∞r⊃9↓α2R⊗I∧*b⊗∞-"&>9`h)nRDJMαJ⎇*R&:*α2⊗ε4*MαRD)α&:$*≡⊗I∧rV6
-⊃α&9¬⊃Aαεt!αN≥¬α>&:%→αR<hQnR"*α
fR*α~>2dz↑&::αR"∃∧bεNQ∧"&≡&"q↓αRD)α
α∀JQα&~αVN⊗"αR=αLr∩&∞
"∃αεr4)n-∩J>I∧~>:∩M"&>9r↓α&→∧r=α:,j
⊗I¬:εMα4zV:⊃∧∩⊗~>∀)α⊗:≤zV:R-∩&:≥∧	α∞>lj∧4)\zIα:,b1α∞D
Jε∞$*I1α$B∃α
∧∩&QαM→αN⊗"q↓αεe~=1αL1αR"*α&:R,:⊗Iαu*6
⊗∩α&L4SZR>=∧bεJ≡*aαR"*α
α
M!α&M¬~⊗QD	u$DZ*tM≤T
DD*λ4∧∀MD	∃~∧9HT
∀XD∧|rλ[∧M$→hphS8I∧M~
)u-$→hRrα∧)∀u%89b∩∧~4∧≤IHT"¬Z9∀t:
I∧*¬λ5`hPQ'5∀,y~5$-*4¬-≤XG hS1Q#XM&¬E≤:
λ∃≥~λ~$=,XYe%~λ→d"∧~(R∧JHU∀AQ#XL_6α∧M4λt
∀(_t, Q!PTLjJ4≤s!→%≥⊂~λ2e∀YJ4≤p↔84|uhZ%"¬:J$Ltt	e,l(Z"¬$tλdd|~I∀t:
	tLuAQ L∀81∩r[AQ M∃J1∃∧_⊃↔4-D~D∧L2	ir∧uYX$-∩λiu,tAQ M≥H8dHL_6αe∪↓⊃∪\,J8R∧≤yjd-∃D	e,l(Z"¬$t	∀u$XxU⊂h!_44≤1⊃⊂K]J(∀u≤hZ"∧≤xI∃$Lyh∀b∧9xD-_Q!∃∃%1~∧_H↔:$-%Z)`hPQ!PS\YhB∧|d∧$LuJ84r⊂Q cZ(9E∀≤X∀"j¬)zU$LhT¬$zλ9D,
$λ4|lX∀∧∃∀X→2∧≤λ~$≥HZ"∧5)yR¬≥J)∀t:↓Q hS4(4e∀9X∩∩∧8→b∧∀Tλ4dHXB∧4yID⎇<→hrα∃(YE≤≤d ¬$zλ_DU-:D¬$DT
5%∀→hphS:	tLuHZ"∧Ld
4:¬It¬≤\~∧∧⎇4Z$¬$DTλ4|lX∀∧≤D~(∀≥$Z$¬<D_9α∧M4
U≤,AQ#]$t
4-∧~(∃$*	jTl∀Z*2∧Ld
DD*
8∀l*	→e¬-D
5%∀→hrrα
8r∧mZ:B∧∀T↓PS]	y∀u$→hr∧
D
DD*	→e¬-D
5%∀→hrrα	ir∧⎇IλU∩¬(XtM≥HZ%~∧~(R∧,hhT≥$XE`hPQ(4e∀9X∪PMJ:D⊂J
8rHH↔84D,94∧L2λ~B∧,hD∧|2
:E∀LhqPPL)hPJr6A⊂hP~*E_Mλ1⊂K](ZE-∀d	∀2∧YhB∧|d
5%∀→hphP_9U∧⊂∀6S"b
8rJX↔84|mλ~$*¬It∧≤|YX∩∧≤λ~$≥HZ hP_)d(L9J$≤L⊃⊃∪\∃(→d≤B	_b∧MD	∃≤@Iuβ!!4U∀a~⊂b"!QC"C!'q3Q∧	qHλH9∀Ps(∀C"@↓GhQSj)05λDdTTuλitHH¬T∀Su*I3Q4d
⊃h∀hZλ⊂3HD∀Q4jItQ(	z5∀∃*D⊃StIX5λβ!!"Nu	λ(∃∪jH3λ∪JY0Q4D	qH⊂iλ4P0jH4Th
Ih⊂Q$
tR5
H3H

y1∃∩¬∀∀r∪jY⊃λ⊂HQ"Ns	x1⊃1∧	3U∪d
Lλ⊂)hλ∃∩λT∪U3((4H∪hd⊃⊃0i→03λλI1r5
4
⊃∩(y5∀j$
r∪u)Hβ"Nh((∪∪h_⊃1λ	→U∪h
&(⊂Q(itQ(λ83∪∩)hh∃∩	~h∀SjZ∩3Q%dλ∩3Dλ3∪λλ84q4eA"Nui_∃∩λ
9∪u3λD⊂Q(λzQ05λZH∃∩λ→H∪tDλ450)D∃∪hλI1r5¬6KHλ∧(StS(~λH∩*1"Nph→∪⊃1∧λV(∃*93Qh
I⊃(∀λ5C"C!'tQ1i~u⊃4J4∃4q(GC"NaQNb4F¬∀L(
λ4thλ~Qu3(YU∀c!'b3Sd	u∩⊃*$∀Q1i~u⊃4J4⊂1QHXu⊃1↓QC"QIzS05π!33uA~r1∃	¬⊃s⊃
q.tp*h(∃∩λT∪s⊃∧
r1∃	↓"B3)zB1∩(u∪s⊃λA.hλ∧λ3QλλI1c"A~u0B$6K∀L↓⊃.tu(*∀P0jD∀t⊂(84h⊃IzH∀r(yH⊂3HDH⊃J)s(∃i_∃∩β!!33uA~L∃i_∃∩α':p5Q$
r1∃	∧∪qH	∃sh∀jJR3Qd¬(C!!33uA~L+⊃	_b".j85Q(
I⊃(∪JY0Q4D	qH⊃λXr+HλI1r5
1"B0iZα4L¬JL""'8r⊃0i4∃∪h
81(∃	λ5λ∃i_∃∩Hx+Q∩(y5
lAQB0QhQ3QQ*!".ti94λ∩(d∀t⊂(8(⊂3	Iuq1¬D⊃3∀hT⊂stJ(0uβ!!33uA~qk%
t
"':⊗4⊃$	u5λλZTStD	14th_q#"A→3uB$8Q4S%Jqc"A→TtB*λk∃⊗*
u∀C!!33uA∃∀t
%5∀qc!!33uA~L+∃i_∃∩α':q5λ
y1∃∩πX∩1jf!"SQHZNB4JJb4⊂a⊃.tQ*J4SC!!"QQ*).B+H~pr6D¬c"QIzS05
I3QhλZTStAQKc"A∃Q5Q)a"C"AQNhTJ:⊃StD$(∀Iz5∩3HT∃∪h
(4u∪j((∪⊂*:λ⊃Sj)05β!!"Nu	λ(∀∀HZR3u*4⊃StIX5λ⊂HXss1*4∃∩⊃$λu4THYUλ⊃IzS05¬dλ∃∩λT⊂u4J(3Uβ!'qStIX5λ∩*4∪∪tjD⊃StHZQ4KD∧λTTjHStHD	4h⊂h→∪⊃1∧	3H∃*93Qh
I⊃(∀λ5C"C!'tQ1i~u⊃4J4∃4q(GHλ∪IyQ#"AQTTuλitNB)YuB3iH∃k∃i_∃∩α':Q4u	zQ(∃i_∃∩β!!33uA→s⊃⊃¬H∩1b':Q4u	zQ(⊃	_c"B**∀b4λ1".tHZ∃4SAQC"C!'q3Q∧	qHλHitS0*DH	HJ*u⊃Sj$C"@↓GhPuHdHλλ¬T⊃S∪h~∩3Qd
∪r3JD∪U3((4H∃	tλQHDλStS(~λ∀u
)3Qh
)u5∩)h(β"AQNhPjhHH$
∩⊃(
:∀R3Ht⊃q3HZP5⊃(D⊂V(
I∩4h
)u5∩)h(∩4d
r32)H4H∃	tλQHDλStS(~β"Ni→Hλ⊃IzU∀P)eHλ∩*Dλ∩4dλ4tu)X1λλ
I⊂5λ
I⊃(∪JY0Q4D∧∃∪hλ((⊂sijQ4UλXλλ∩*4∩3C!'tQ1i~u⊃4Dλ0lλ∧λ3Qλ
8hλ⊂iyU⊂2)jh⊂(∧
∪r3JH4H∃	tλ∃∩λT⊃R4J:λλ⊂K~⊃(∪hdλ∃∩λQ"NsjZ∀∃5∧
u∀R)hkHλ
I⊃(∪JY0Q4D	qHλλ9⊂4P(:⊃4Td
tR5
H3H∀i	u3⊃∧λR4TjD⊂Q(
85β"G93Hλλ∀⊂p3	Dλ∃∪d∧QStIX5λK∧λ3∀q$∧∃∩⊃$λ⊃1P*Y∃λ∃H→∃14d∧⊂4Q$
4q1¬dλλ∩(d∃∩⊃!QNr3JH1q4D
⊂4U∧∧∪qH∧
∩⊃(∧	U30HZH⊃6λ811∀d∧∃∩⊃$∧⊃StIX5λ∪	→25∀d∧∃∩⊃$∧⊃R4J:β"Nh9⊂4P(:⊃4H
zR5∃λYHλ∩*4⊂(λGdKHλ∧λ1U⊃*$⊂ss*	⊃5∩)yKλλH:QHH∧	⊃05HZh⊂(	j3∪β!'pr⊂*(0u⊃*$⊃Ss	Iur3Ht∃∩⊃$	U30HZH∀u
)3QkD∧∀Q1i~u⊃4D
qh∩*4∪⊃1JDλ∀∪i→U∩3Hq"Np*D∃∩⊃$	U3∪∧λr⊂4H_u⊃4Ea"C"G:Q1r*:⊃4Td
4q1π!"Nc!'b4qeH0lλ
λ4thλ~Qu3(YU∀hλ→Qλ⊂*((⊂3
H4Q1↓QNb0(6(∩4dλp4PH_q1β!!"PuHgB33ja4L+¬U∀t
!↔tp5HT∀Q1i~u⊃4AQHλλ∧↓33uA~r1∃	¬∀L"'8q5λ
I⊃(∃	z⊂3λ	j30Q*$∪qHλ9⊂4@
Ih⊂Q$
tR5
H3C"A~u0B(I1k∀F⊃".qλZ⊃4S)→Q(∃	λ(∪0(uH∪qD
∩⊃(	UTkHλI1r5↓QB33ja4L+

α".iiuh∩λ~Q(λd	qH⊃	_r5∀dλQ1Sj((⊃⊃(9303∧
∪r3JA"B0*9α(lEJL""';λ
∧
4q(λ~h∩3HH6λ∩)j∪h⊃EjH∃λ_S⊃#!!1∩5Ha5⊃3IJu
∀F∃+⊂0f↓.sSj)03∩+((∪U)XQ4H
Ih⊂Q*Jq13Dελ⊂3HDN.'↔...'⊃"B3)zB5r(J∩∀F⊃.u∪jH3λλd	qH⊃	_r5∀d
∪h∀F⊃"B3)zB4LEE)	;SAVE THE REGISTERS
	MOV	R3,-(SP)
	JSR	PC,PRTF		;TYPE OUT THE DIGITS
	MOVB	#0,(SG)		;PUT A NULL CHARACTER AFTER THE STRING
	MOV	(SP)+,R3	;RESTORE THE REGISTERS
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	RTS	PC		;RETURN



;END OF "CVF"
;"CVE"   - FLOATING POINT NUMBER TO "E" FORMAT STRING ROUTINE 

;"CVE" - SAME OPERATAON AS "CVF" EXCEPT THAT OUTPUT IN FORTRAN "E" FORMAT

CVE:	MOV	R1,-(SP)
     	MOV	R2,-(SP)	;SAVE THE REGISTERS
	MOV 	R3,-(SP)
        CLR     EXPON		;@%∃'(A∃1!∨≥∃≥(Aπ=+≥(~(∪≠∨,$FbY!P∩∩w'∃(Aπ∨U≥(A)<A!%∪9(@bA9+≠¬HA¬
=%∃α$*∞&6aαBPhP&6>0J↑&∩$A2IDKZN⊗Q∧~>V:"α~>I¬">Rεbα:V6∀*Iα>2α∩&≡M"MαRzα
¬α≤*:P4PJN@,!∀3"e&⊃⊂K\_I%-≥Dλd⎇∩λ[¬∧|hYe h!~E≥$a_∀≠⊃↔4≤DX92∧Ld	e,l(Z"∧M4$-∀qQ L≤h80HH↔:E∀j8d-∩λ9tt∧~I∀|t→D∧≤|HZ2¬$βh⊂j
 εE∧P"hDbT)*∧DNij i∃⊂()$S*$g#H$c⊂'∃fa"iλ$iP__εE⊂λ⊂⊂⊂∧Tj#∧`PX⊗'*SDD]cQj⊂"$⊃P'*fP"i⊂*∪P!"P⊂gg+"T*"bεB∧b"aBbl('S∧D]`Q%*ijλ"l('S"g*⊂⊃'i⊂(∀$g*$S#P_P∩g*↔⊂⊃$cdjβE∧fgU∧g*fK)→∧DNf'`bλ*$"P⊃l('g⊃g*⊂ S"⊂&iP⊂#c⊂∃$"P'∃da"iβEa$PDQXX___⊗∀→∧]aSg+"i∃⊂*'P⊂a)gf∃j"P+⊂d∧UE
	SUB	#150,R2		8πβ	∃U'(Aa!∨≥9(A	∨]≤∩∀∪	∂
∩\,h~∀∪
→$∪$H∩∩w→∃β ~∃∧JQαB⎇~&R&4(4(&m*0%
⊂ε3~@∀LB!↔u4q$λ6∀∪ih3Uλλ→Qλ∪*8H⊂4d	3Q⊃+∧⊂3U	T∃⊃3D
⊂0SλQ"B0iZα4DEDmmKA⊃.psiZ⊂4Q$
⊂πP_K_ →\βEa&⊃DW∃[βE∧fgU∧Q[K⊗)→∧B]dc⊂∪ i#bT⊗⊂!"T& abH!(P_K_ →\βE⊂⊂⊂λ⊂⊂∧iUa∧QYN↔⊗)2		;@'!∪
(A%≥	0↓∪≥)≡↓%β≥∂∀A∨@4fpA)<@Vfp4∀∪β	⊂∪$dY∃1!∨≤$wβ	∃U'(Aa!∨≥9(Aπ∨U≥(~∀%β'∩dY$d$∩w≠+1(A∪≥⊃0A¬d@hA
=$A
→=β)β≥≤A!∨∪9(A≥+5¬%&4∀∪	∪Y∪)9→'(QHdRYβ`∩w≥=%≠β→%5∃αu*6
⊗⊂α&:RzαJε:<)↓A9ααR=↓αqeeeHh(&N$0&ε
αbε
DHIn≡⊗"αε
N|bVR∃¬2ε"V*α>→αu*6
⊗⊂h(&ε∃~_&ε≠λ4(&≤jB_&$*:2N bε
DKZ∞"⊗≤Yα&→∧rV6
-⊃α2⊗≥→αR"q↓E9h(&∞4~$$KZRJεu~~⊗I∧~>:∩M"&>:aα∞>$*MαRzα∞BThP&
≡ J⊗BJ H%n&2α&RM∧∩⊗R↑,*9↓As↓αε:"↓9eeKIe1α<yαR≥¬α:R_hP&∩&40&R⊗rbε
@HIn⊗2≤)α6Ve!9α
J↓A9E∧
:⊃α"*VN"α⊗bB|r⊗:PhQ↓↓↓α↓↓↓αLr&⊗Eα>84P1%α↓αn∞|rR&:,
R&>rα>→↓∀~Z∃
hh(4*-αJQhLRNH&∧→2BJ$0$%n<yαBJLrQα6rR&N≤λ4(&lzZλ%≠	AU1E~≥%,KZBVQ∧	↓
∃∩α∞"ε∩α&:RzαR"∃¬~RJ&t84(&lzZλ%≠)M1"≤9%,%\
NNVl)α⊗b∧z:⊗:"αB>NM"&Z∃∧	α>V%αVQα
↓	-λhP&6>0J⊗bB|q2ILKZR⊗N"αN&≡rα>→α-BB>:,rP4(L∩≡∀&EαJP$KZN.&αα&→α∧zN&RM2∀4(Lj>ZλJ→UU1k	"N≥HInJ⊗∧bε∞∃α⊃-	α<JR!↓∩iλ4(Lr⊗≤&∪→↓↓↓H%n6Z∃α⊗Eα>:⊗u!αB>≤JR&Z(h*bB∃!h&∞e⊂&IHHIn∞2,
Iα~⎇⊃α∩&4JN&>ph)↓↓α↓&∩M0%
Eαq2IHHInN⊗∧
JεR-→αR⊗u→αε:"αV:&%→α∩&<JP4(L∩&L%≠1A2I⊂H%n∞|rZ⊗J"αR=α
~
αεt!αBV"α&9αJz=α
,2~⊗HhP&6>4⊂&IIbBN≥%Xh(&
M_%
YαbIL4PJ6>Z⊂JIM1E~≥%,hP&6>4⊂%
AbBN≥$HInBV"α&9α
α:V2bα∞"ε∀
∞R⊗⊂h(&6⎇0%"NαI-2I_InJ⊗≥">J∃¬""∃α∀*≡&N$*JL4PJ6>XJBNA%ZbIH4PJ6>XJBNA%ZbID4PJJRLMα$%]∩⊗RV∀p4(4Ph(4)\*:⊃α|1↓
∞4)λ4(1m
≥2≥	↓α↓5α~dzεR&t9αB>LrQα:,j
⊗I¬"=↓
*⊃α>Iα∩→	α4zJ6ε"αNRJLr≥↓hP4)m∀~Z≥	αiα∩⊗$*J6&t*Mα&2αR"∃∧rV6
-⊃α&9∧

Aα≤
9α
*α↑J&%"⊗9α∃I↓
∞41	1αL04)nM!α∞εraαR",qα∞Z2α&Mα≤
22⊗"aα⊗2≤)αR"*α:V6∀*Iα&~αBJ&u"⊗⊃α-~&:≥α∩∞Z∃∩p4(4T~Z≥hLj>X&∪	15"≥↓$4)α↓↓&d"_&ε≠↓2ε
λH%n∞⎇αeαRD)↓α:,j
⊗HhP&∞~≤_$$%]"Jε:≤2⊗Iα$B∃α∞|r∩&RLz:ε1∧~>∩⊗~αR=α≥αT4(L

N_L

D$KZ∞>:4*JQαu*6
⊗∩αR=α∩N>2-"∃αZbV⊗LhP&
⊗λJJV:0H%n&2α:V6∀*I↓uβ↓9A1∧*b⊗∞-"∃α∞404(&lzX&∩L92IDHIn≡⊗"αR"∃∧rV6
-⊃α>→∧"⊗∞&l
1α∩L:&RM¬"=α
*αRfB, 4(&
~ %
∩bID$KZ6V2"α
e↓"αR=α-~∃α¬∧22>ε$J:≥α∧z&:Q∧J:∩⊗@h(&6,b_&R,r2NQE⊃E%2→D%n≤B⊗∞-∧J→α:,j
⊗I¬~6ε2d*IαRD
9↓Esα↓6∩L84(&≤jB_&$*:2N"bε
DKZ∞>6∧
J∃α$y↓E9h(&∞4~$$KZRJεu~~⊗I∧~>:∩M"&>:aα∞>$*MαRzα∞BThP&
≡ JJV:(H%n&2α2⊗N~αR"εr↓E9Bαj∩&≥bαBJ&u!αVNLr≥α∞4(4(&lzX&↑L"R!2∪λ%n≡-!αR"*αR>Raα:Vl∩⊗Iα|1α∩&<JRMα$yα
∃¬αJ&:$*⊂4(L
N %≠⊃2IDHInVN*αR"&~αεMα
α→:Arα&:∩-@4(&t*≤&Iλh(&6,b_&R,r2NQE⊃E%2→D%n≤B⊗∞-∧J→α≡∀*εR⊗∩αR"εrα↑&∩$A6∩&:α2>:8h(&∞mα_&R,r2NQd

D%\~>6B
∩∃αRz↓E9@hP&∞~≤_$$%]"Jε:≤2⊗Iα≤z:∩&$J>:εbα∞>∩-_4(&∀:∀&J,r_$%\J→αR|yα2ε∀:∃1α-~∃α∞4(4*J,r∃h&U~H&B~b∞Z∀hP&6>0I"NAJY2IDhP&JR_JB4U∩V:→PJ*NHMα
2∞404(&lzX%"≥↓%-2∪λ4(&∃"L&B_h(4(hQn⊗:"α>→↓∀~Z≥λhP1m
¬∩R→	α↓5αB∀J:R&t9αJ>-"&:∃¬*N⊗⊃∧∩e↓
≥2→	1α∩∞Z∃∩a↓→↓∀~Z≥λhP4*B∃"→h&%~R_&→@$%]"⊗NQ¬""∃α≤J≡9α|1αR"*α:V6∀*H4(Lj>ZλJ→QA2m~&≡8KZεNN,j∃αNL:9αB⎇~&R&4(4(&≤2∞$HInRJrN~⊗∩αR"∃∧~>:∩M"&>:aα∞>$*MαRzα∞BThP&ε
≤0&ε
H%n∞d*εIα$B∃αNL:9α>2αR"∃∧rV6
-⊂4(&∀:∀%9[	@$$hQ↓&lzZλ%≠)U26≤J≡8%\J→α:,:εR&4)αBV"α&9↓∩i	αNL:84(Lj>∩_M"⊗92→@$%\~>6B-"∃α5u→9α&u"⊗≡⊗∩α∩&≡M 4(&≤bH&I_H%n&t"&∞ε$)αN&<qα:>"αf⊗Q¬:J&R$*84*$J≡2APJRNPMαP$%\~"⊗∞Zα&→α$J6∃α$yαBJLrQα∩,~&6εbαB>&u 4(&∀r∀&≡-"∩≤$KZN.&αα&→αtzP4(M"NP&∪_$%nD
Z∃α<)αBJLrR⊗⊃¬~&≡9¬J⊗Q|hP&
:(J↑R∩H%nN\JAα&2α↑∃αD
Z∀4PJ6>Z⊂J6N&<q1"N:I,%n,bN∃α¬∩&:Q¬~&≡9∧∩⊗~>∀)α∩⊗≤J6ε1¬α>&: h(&&t_&ILHIn&:$J∞εR*αN&≡rαBJ&u"⊗⊂4U:R∩APJ6>Z⊂I
UYbBN≥%XInBJLrQα∩,~&6εbαB>&u 4*≡-"∩≥hM~R∞~HJε
Ee⊃I$KZNεZ*α5:Mrα&:R,:⊗Iα$J≡&PhP&∞~≤_$$%\~"⊗∞Zα~>I∧rV6
-⊃αR>zα2εJ<)αR=∧J:R⊗<*J&j(h(&
≤_&∞"]~h4*$z2≡∃PJε∩∩0Jε
Ed

@$KZ&→α%:=α2
∩≡∃1¬αVQαM!α
ε≤YαR><*R"⊗⊂h(&6|"_&R,rR!2→@%n≤~ε2∃∧">↑9∧
:⊃α%∩eα&u"⊗≡⊗∀Jj&::αε≡εLp4(&Lr&IλH%nB∀J:Qα⎇*Qα>t)α6>∀)α∩&<JP4(LJ:&¬ $%n≤B&~Q∧"⊗∞&l
1αB|J:Qα$yαBV"α&9α-BRJ¬∧"&≡& h(&R≥ &ILHIn∞",~-α&2αN&≡rαε:⊃∧!:A9∧
2J⊗"eα↑∀JRR⊗ph(&
-λ&≡⊗$"≤$%\:=α∞D*∞-αL1α&9¬∩ε:≡*α&→αtzQα↑∀JRR⊗ph(&∞e⊂&ILHIn∞2,
IαNL:9αεt!α⊃:SG		;ADJUST BYTE POINTER
	JMP	GETDG		;GO CHECK IF IN RANGE AGAIN
CHKSZ:	TST     R2              ;TEST INTEGER
	BLT	TOLGE		;IF TOO LARGE, GO SCALE AGAIN
	CMP	R2,#9.		;CHECK IF LESS THAN 9
	BGT	TOLGE		;SCALE IF GREATER THAN 9
      	MODF	TEN,AC0		;START COMPUTING NEXT INTEGER DIGIT
	TST	R3		;HAVE WE PRINTED SIGN YET?
	BNE	SETBS		;SKIP IF WE HAVE
	TST	R2		;CHECK IF LEADING ZERO
	BEQ	WTSP		;IF IT IS GO WRITE A SPACE CHARACTER
	MOVB	MSIGN,(SG)+	;FIRST CHARACTER, NOW PRINT SIGN
	INC	R3		;INDICATE SIGN PRINTED
SETBS:	BIS	#60,R2		;SET ASC ZERO BASE
	JMP	WTCH
WTSP:	MOVB	#40,R2		;WRITE A SPACE CHARACTER
WTCH:	MOVB	R2,(SG)+	;PUT CHARACTER IN I/O BUFFER
	DEC	PT		;DECREMENT DECIMAL POINT COUNT
	SOB	R1,DIGLP	;DONE WITH CHARACTERS?
	RTS	PC		;RETURN


;END OF "PRTF"
;"CVI"&"CVO"   - INTEGER NUMBER TO ASC STRING 

;"CVI"&"CVO" CONVERT THE INTEGER LOADED INTO R0 INTO A ASCII STRING 
;AND APPEND THE NUMBER STRING TO THE STRING POINTED TO BY SG.  SG IS
;LEFT POINTING AT A NULL CHARACTER.  A SAMPLE CALLING SEQUENCE
;FOLLOWS:
;
;		MOV	#NUM,R0		;LOAD NUMBER TO BE CONVERTED
;		MOV	#STRG,SG	;POINT TO OUTPUT STRING
;		JSR	PC,CVI
;
;"CVI" DOES A DECIMAL CONVERSION, WHILE "CVO" WORKS IN BASE 8.

;REGISTERS USED:
;
;	R0, SG PASS ARGUMENTS AND ARE ALTERED

CVI:	MOV	R2,-(SP)	;SAVE REGISTER
	MOV	#10.,R2		;DO A DECIMAL CONVERSION
	BR	CVV

CVO:	MOV	R2,-(SP)	;SAVE REGISTER
	MOV	#8.,R2		;DO A OCTAL CONVERSION

CVV:	MOV	R1,-(SP)	;SAVE REGISTER
	TST	R0		;CHECK SIGN OF NUMBER
	BGE	ITISPL		;BRANCH IF POSITIVE
	NEG	R0		;ELSE COMPLEMENT
	MOVB	#55,(SG)+	;PUSH A "-" INTO STRING
ITISPL:	JSR	PC,DIVLP	;GO FORM STRING RECURSIVELY
	CLRB	(SG) 		;POINT TO A NULL CHARACTER AT END OF STG
	MOV	(SP)+,R1	;RESTORE REGISTERS
	MOV	(SP)+,R2
	RTS	PC		;ALL DONE

DIVLP:	MOV	R0,R1		;POSITION NUMBER FOR DIVISIOF
       	CLR	R0		;CLEAR FOR DIVISION
	DIV	R2,R0		;GET LSD
	ADD	#60,R1		;OR ASC BASE
	MOVB	R1-(SP)	;SAVE DIGIT
	TST	R0
	BEQ	.+6		;SKIP IF ALL DONE
	JSR	PC,DIVLP	;REPEAT RECURSIVELY
	MOVB	(SP)+,(SG)+	;PUT DIGITS IN STRING
	RTS	PC


;END OF "CVI"
;LOCAL STORAGE AREA

MSIGN:	0		;SIGN OF CURRENT NUMBER
ESIGN:	0		;SIGN OF EXPONENT
EXPON:	0
NUM:	.WORD  0,0
WIDTH:	8. 		;DEFAULT NUMBER OF CHARACTERS IN OUTPUT STRING
DIG:	3		;DEFAULT NUMBER OF DECIMAL DIGITS
OLDW:	8.		;OLD VALUES OF WIDTH AND DIG
OLDD:	3
PT:	0		;NUMBER OF DIGITS BEFORE DECIMAL POINT

;SYSTEM LIJE BUFFERS

INBUF:	.BLKW	42.
OUTBUF:	.BLKW	42.

;TABLE OF F.P. DIGITS FROM 0.0 TO 9.0

DGLST:	.WORD        0,     0, 40200,     0, 40400,     0, 40500,     0
	.WORD    40600,     0, 40640,     0, 40700,     0, 40740,     0
	.WORD    41000,     0, 41020,     0

;TABLE OF POWERS OF TEN

	.WORD      531,143735,  1410, 16352,  2252, 22045,  3124,126456
	.WORD	  4004,166075,  4646, 23514,  5517,130437,  6401,147263
	.WORD	  7242, 41140, 10112,151370, 10775,103666, 11636, 72322
	.WORD	 12506, 11006, 13367,113210, 14232,137025, 15101, 66632
	.WORD	 15761,144400, 16627, 16640, 17474,162410, 20354, 17113
	.WORD	 21223,111357, 22070, 73652, 22746,112625, 23620, 16575
	.WORD	 24464, 22334, 25341, 27023, 26214,136314, 27057,165777
	.WORD	 27733,163377, 30611, 70137, 31453,146167, 32326,137625
	.WORD	 33206, 33675, 34047,142654, 34721,133427, 35603, 11157
	.WORD	 364∀3(153412
TENTH:	.WORD	 37314,146315 
TENLST:	.WORD	 40200,     0 
TEN:	.WORD	 41040,     0
	.WORD	 41710,     0, 42572,     0, 43434, 40000, 44303, 50000
	.WORD	 45164, 22000, 46030,113200, 46676,136040, 47556, 65450
	.WORD	 50425,  1371, 5127∩, 41667, 52150,152245, 53021,102347
	.WORD	 53665,163041, 54543, 57651, 55416, 1571∩, 56261,121274
	.WORD	 57136,  5553, 60012,143443, 60655, 74354 61530,153447
	.WORD	 62407,103170, 63251, 64026, 64123,141034, 65004, 54521
	.WORD	 65645, 67646, 66516,145617, 67401, 37∀72, 702411074⊃0
	.WORD	 71111,171312, 7177PX@lnTnhX@\dlfj0bhdlTlX@nLj`jXffhfD~∀∩]]∨%λ∩n`flXXb`dLfnX@\jdfd0@bbhβ	Q1↓;1EAAc	EM]λεrbβvfs3αF⊗33;ε!PPJhyu∀ ∀εs;∪&eBβ;6&3λh!Q hS8Yd"∧xdα∀Lt$¬¬∀xz$hQ d≤yYT,uDαbαα
h∀dLDεβββπ¬∧xZ2αα∧∧αα∧→jD45j∧`Q(2¬∀X4α¬∧_xRααλHU≤≥)~¬$LyaPT≠εεββ
εεβββ⊃Q$≠βεεβ∩βεεββ⊂∃jDM$HT∧LuHh∀_h(6βββε@λεεa_⊂0h
H4uλ
80u∩)yC"Pfε
dεεA01⊂d
⊃4u∧
q0u	→pπεE⊂X___∞P___~@agS*↔⊂'Q⊂ b!H)'jj∩g"FE⊂X___L⊂___≠∧ijP))P S"⊂!f∪aeP$S*"i)∃h*⊂)∪jj$g⊃FA!X__YP___≠Bibaj∩gg⊂*∪P)"`Q⊂#'i⊂bP+i∩ij⊂ S"⊂)"U*i'⊂∩g#'i∪`j$gS⊂*'P∀"(_XβE!X__ZP___≤∧S'a`fλ)j'i⊂cbFE⊂X___MP"g"∪eFE!E≥FEβ↔*$j∪"P$g∃# aFB↔$g)T*⊂$ S$"b↔∀ f-d⊂f⊗$"WFEεE≡XX_⊂⊂εEβE↔$g∀i*⊂$SW( f⊗YV!"TnFEεB") j∀(∧↑↑MYX⊂⊂αD]b)XP P∃"aj'T⊂∧FE⊃)!*)∀∧↑↑ZLZ⊂⊂∧B]b)_LP!⊂+⊃aj'iαDFE"∀_XiDOX[≠[MX⊂∧]Q)_XP∀j j*TP+gi⊃⊂εE"∀_XgDOX[≠[MY∧D]Q)_XP∪jj(*U⊂)"cRij"iλεE")XdD↑L[≠[[M⊂∧]b∀_XP$S(*j⊂∀"cdiU"i⊂⊂λεE( S$aa∧OY__εB2g a∪"D↑Z_∧D]Rg*"i⊃ abP⊃g a&⊃FEεE∞agffUg$a`U$gg)H&$g%H* ∂ PDP10

MASTER==10567
MASLOC=100000
αFDATA=100002

; program initialization

.EVEN
START:	RESET
	MOV #1000,SP	;initialtack
	CLR PS		;initialize processor status
      	CLR CLKCNT	;clear clock registers- trap restart
	CLR CLKSET
	CLR CLKS
	LDFPS	#0
	MOV	#9,R0		;SET TTY OUTPUT FORMAT
	MOV	#2,R1
	JSR	PC,FORMAT
	MOV	#CLKSER,CLKTRP	;SET CLOCK INTERRUPT ROUTINE
	MOV	#340,CLKTRP+2
 
;ASK IF DAC OR ADC CHECK
 
	MOV	#COM1,SG	;ASK IF ADC OR DAC
	JSR	PC,GETNUM
	TST	R0
	BNE	ISADC
;DAC TEST SECTION
 
DACSEC:	CLR	DR11S		;SET DR11 DAC MODE
	MOV	#COM2,SG	;GET DAC CHANNEL
	JSR	PC,GETNUM
	MOVB	BRK(R0),R1	;GET BRAKE MASK BIT
	BIS	#ENABLE,R1	;ADD ON INTERFACE ENABLE BIT
	MOV	R1,BRKMSK
	MOVB	DNE(R0),R1	;GET DONE BIT MASK
	SWAB	R1
	MOV	R1,DNEMSK
	ASH	#13.,R0
	MOV	R0,R3
	MOV	#COM3,SG	;CHECK IF POSITION OR TORQUE MODE
	JSR	PC,GETNUM
	TST	R0
	BEQ	ISCUR		;BRANCH IF CURRENT MODE
	MOV	#1,STPDNE	;ASSUME DONE MASK TO BE CHECKED
	MOV	#COM11,SG	;ASK IF DONE BIT TO BE CHECKED
	JSR	PC,GETNUM
	TST	R0
	BNE	WILCHK		;SKIP IF DONE BIT TEST REQUESTED
	BR	.+6
ISCUR:	BIS	#10000,R3	;SET CURRENT MODE BIT
	CLR	STPDNE     	;DON'T EVER STOP ON DONE CONDITION
WILCHK:	MOV	R3,DACCHN	;SAVE DAC CHANNEL
	MOV	#COM4,SG	;GET DC DAC VALUE
	JSR	PC,GETNUM
	MOV	R0,DACDC
	MOV	#COM5,SG
	JSR	PC,GETNUM	;GET DAC RAMP VALUE
	MOV	R0,DACCHG
	CLR	COUNT
	CLR	DR11S		;RESET DR11
	CLR	PDAC		;START AT BOTTOM OF RAMP
	CLR	PTIME		;INDICATE FIRST PASS THROUGH
	MOV	#10.,CLKSET	;SET CLOCK TO INTERRUPT EVERY 100USEC
	MOV	#111,CLKS
CLKWT:	TST	DNEMSK		;CHECK IF DONE BIT ON
	BNE	.+6
	JMP	RUG		;EXIT IF ALL DONE
	TSTB	KBIS		;ELSE CHECK IF SOMEONE HIT THE TTY
	BEQ	CLKWT		;LOOP TILL SOMETHING HAPPENS
	CLR	CLKS		;STOP THE DAC ROUTINE
	JMP	RUG
;ADC TEST SECTION
  
ISADC:	MOV	#2,DR11S	;SET DR11 ADC MODE
	MOV	#COM6,SG	;ASK IF TYPE OUT REQUESTED
	JSR	PC,GETNUM
	MOV	R0,TYPADC
	MOV	#COM7,SG	;SINGLE CHANNEL OR INDEX?
	JSR	PC,GETNUM
	BIC	#177776,R0
	MOV	R0,IJDX
	BEQ	SNGCHN
	MOV	#TOPCLR,SG
	JSR	PC,TYPSTR
	CLR	ODDEVN
	BR	ADCSTR
SNGCHN:	MOV	#COM8,SG	;GET STARTING CHANNEL
	JSR	PC,GETFUM
	BIA	#1↔7340,R0
	MOV	R0,ADCCHF	;SAVE START CHANNEL
 
;ADC LOOP
 
ADCSP	$t%≠∨,∩dY	$Dc&∩wI#+M(Aβ	Aπ∨≥Y%'∪=≤~∃β⊃π→ t%≠∨,∪¬	ππ⊃8Y↓$bE~∩w%∃#+'PAβ	ε↓π∨≥-∃%'∪∨8~∀β≠=,∩Fb@`\Y$D∩w/β%(A	∨= Aπ∨U≥(~∃]β∪)→@t∪¬∪P∩Fd`@Y↓$bE&~∀∪	≥
∪β⊃π	≥
$∩w¬%¬≥π⊂A%A	∨9
~∀∪⊃ε∪$D~∀∪¬≥
∪/β%)→ ∩$w%!∃β(A∪_A')∪1_A≠∨I
A)∪5
A→→(~∀∪5∨,∩G
∨~rYM∞~∀∪)'$∪!Y)3!M)$~∀%∃≠ ∪I+∞~∃¬	π	≥∀t∪≠∨X∪	$bE∩Y$`$w∂(↓β	εAIβ	∪9∞~∀∪Q'(∪)e!β	ε$∩wπ⊃∃π⊗A∪_A)3!∀A∨+(↓%#+%%λ~(∪¬"%∂)≥a(∩∩wM↔∪ A%A≥≡4∀∪≠∨X∩G∪∨	+Y'≤~∀f∪¬	λ∩FH`hp\1$`~∀%∃'$∪AεYπ-$∩∩wπ=≥-%PA)=∧
N∞&Hh(&6⎇2λ%
#↓1"N:I,4(Lj>ZλJ→QA1E~≥%,hP&6>4⊂%
Qαa"N≥JX4(&lzZλ%≠!A1"≤9%,4PJ∞2J⊂I"N≥Hh(&6⎇0%∞&|∩V→2≤8%nRMα∃α>-!αJ⊗"&:≤hP&*N⊂JB
2%JBNR⊂h(&*≥⊂&B
d~J2_hP1n∞|rQ9α|1αε∩~αJ>V$J:∀4Ph*≡⊗$rbQhM"NP&Lr∩`$KZ∞"⊗≤Yα&→∧J:∩⊗DJ:≥α⎇⊃αN&t:2¬α≤Bε::,`4(&∀*D&R≥"∩:∀hP&∞>hJ>∩∩-28$%\~"⊗∞Zα&→α$JNB2
Iα&9¬∩&≡""α>Iαd*~Qα∧
JQα|1αN∞∀*⊗84PJ
⊗DL
∩∩ε%@$%n≤Z&AαL1α6>4J:≥α$yα2⊗5 4(&lzX%∞∀J≡"Qe~≤4(LRNH&∧→2Rf¬~RH4T
∩∩ε%Ah&ε$ &&:%A2ε∩≤~"8%]α>&:"αR=αt*bQα≤Bε::,`4(&≤j@&6
B∞"9d
∩∞∞Dp%n∞D*∞-αL1α↑J
↓αεJ⎇*:⊃α$J6∀∀PJ
≡∀M"NR∩t($%nα94Mα	_b¬≥I→Db∧y1PPL9J LH84Dp⊃↔4,E8T¬≥$~*B¬<~Iα∧≤λ→dt,Dεα∧x→∀ph!_4e⊂→xD$-iaPPMJ:@M%~λ∀$_⊃↔4≤DX92∧Ld
EM∧T	u-"
(U
,~(T h!_$-λ~J5$$hQPPLYz`J≥Izαe≤qQ LU:!∃∧~JK∃¬≥J!PU%:HDt+!~E≥$!→4∀M1⊃∪\≤λX4Z∧_d¬5#εT∧DMAQ L∀Z⊃∀$9JhP→)UM*XphPc]:X%∃~λ→d"∧9It≤Z	→e$-**U¬"
)u-$→hPhR↓Q$<-IjTkP→*5⊂Mλ5E%M
:E⊂h!→T⎇0∀9∀|∃XeE≤8Q!∀U≥!~∧~d→j5%⊂Q!∀l⎇a∀4L|*Xbe≤qQ LU:!∃∧~I→e%≤9aPPM*J0M∧1Q"h!Q$≤D:8U∪P→Yu0LH_4$~J&K\xZB∧$_4∧⎇-J
U"¬h→E,(β"B(_⊃α4λH0k∀F↓"B3)zB4L¬JL#"A_Qq"%emα"'8r⊃0i4∩1H	→H∀P)hq#"A→Q1b*&#"B(94α(fF
&#"B((q"5H→∪rb!↔pTP)hrλ∩(d∪rc!!33uA_⊂0qλ5∀Lα'83∀q$
u⊂4JD∪uQ*$⊂5λλHh∃P)J1#"A→3uB(H0prλuα(" PFE∧g⊃cDh"⊂aFE≥CE≥DfSk∧QXK")_XTD]jiQP*$$TP*'P∀lg!P∪g⊂+d⊃g⊂*"Tj$g#CE≥DfSk∧a)∩fieV⊃)_XgBFE≥FB+ f'R]∧a$PDQX[L___⊗∀_εE∧P$iDb⊂aad')_∧]Pb"⊂"⊂aP!d⊂g'"fβE∧af∀∧b)_LiFE∧Sgk∧i⊗")_LgFE∧Pb"∧b⊂aad#K(" aCE∧j)U∧h*$SbDD]Pd"aeH$c⊂'∪j⊂#$T)j⊂(⊂iiP*∩)'jcRεA∧a∪"Dad∩b'"DB]a) S!d⊂$Q⊂''jλ( iiH'g"FB∧fgkαQXV"∀_XiDNbf)bH)bj⊂⊂) ebH&gb"CE∧fgU∧a)%SieV"∀_XgDNh*i'λ'c#⊂⊂) ebH g"⊂⊃g a&⊃P$g*⊃i# aQFE∧fSk∧QXK(*$fQD]dg⊃$a`j⊃P"g"λ'c⊂#∩i)j⊂∀ iiFB∧i*$CE!d%Q'"]∧Sgk∧QLV")_LiD]cQj⊂ i∪P)j U*iP!∩j)P⊂λ⊂⊂εEαfgk∧Q)_XdK)_∧FB⊂∧a$U∧Qh S$aa⊗∀_∧]aR"aeP∩c⊂( S$aP!∃j*'gλ$$jεB⊂∧a"TDij(∩j∧D]Tj'h⊂∀bi+$Pdg#P∩c⊂!*U*'g⊂∩$jεEαj)j∧Th("'⊃DD]aR"aeP∩c⊂$gλ) g#QP!d"Pedg#H*#P!⊃P"'g⊃FE∧a∪"DW∃M∧DFEαi*$DBD]a"U*i'⊂∩c⊂''U⊂!d"Pedg#H)"hjRi"bεB∧a$jαb'"fTeV)_α]ad"PeP$cλ$g⊂)⊂g#bFB∧a'"Bdg!'⊃bFE∧Pd)∧aSjg*⊂αD]af⊃`i⊂$S⊂) g⊃bP!gUg*εEαi*$DBD]bl∩j⊂$cλ)j$f∪⊂''jλ"'g"CE$g)∪#b]∧Rg!DaSjg*⊂αD]dg⊂i"fbS*⊂'*Sa"i⊂∪c⊂)bTjbg!QP*$fQiPεEαaf`∧HYV!gUg*⊂∧Nad"aRP$c⊂⊂j⊂&"Pij⊂→H*$fbTFE∧a∪"DW∃MεE∧i∃$FE)U($j≥λ∧af)αaf%iBD]bf∀bP)j∪h⊂*$⊃P!f'PeFE∧Pd)∧b∪"fieCE∧fgU∧QXV⊃)_XiB]ibjλ*$"P⊂) ebTFE∧aS)∧b)XgFEαi*$FBβ≥ibaU$gg⊂∃'P)"Pb⊂#'T!bP+T$ij⊂⊂g"⊂)⊃j*i'λ$g#'T&`j$Sg⊂*'H("(_LεEεE⊃'i!bNεE#≥αfgk∧Hf`ij⊃i⊗&`Tf'aDNdg"$P`j"P∀"`b,H*'P)⊃`b⊂#∪i!bP∃i$ijβEεE≥U`dj⊂∪'gh⊂∪'gedS#P jλ!gffPg"⊂!∪'aeP⊃)'fP∀"(_XβEεE+U&(≥⊂λ⊂*)jαea$iBD]ad⊃aeP$Q⊂ g,Sg"P$∩j⊂+*~P%bVa'`i⊃εE∧a⊃hDad∩fijεB∧af)⊂∧ea$TεE∧e∪h∧i*QDD]bV$j⊂*∪P""*βE!d%Sij≥∧Pfh∧QS`ij"T⊗&`iS'aD]Pd"aeH$c⊂'∪P'g"H f*"T"b⊂*∩"P&W∪*fa"T⊂,bjβE∧a"TDkj&∀εE∧fSk∧Qc⊃ j V∀_FE∧Sgk∧QLX↔⊗)∧D]i⊃`b⊂_L⊂)bj∀P'c⊂⊃ j FBεE)bU&(≥∧Sgk∧QN↔⊗)→BD]bdQd*⊂)U GAGES IN ALL
	CLR	R4		;START WITH CHANNEL 0

REDLP: 	MOV	#2,DR11S	;REQUEST ADC CONVERSION
      	MOV	R4,DR11O	
	MOV	#100.,R0	;WAIT LOOP COUNT
WLP:   	BIT	#200,DR11S
	BNE	CNVDNE		;BRANCH IF DONE
	DEC	R0
	BGE	WLP    		;REPEAT IF STILL MORE TIME LEFT
	MOV	#COM9,SG
	JSR	PC,TYPSTR
	JMP	RUG
CNVDNE:	MOV	DR11I,R0	;GET ADC READING
	ADD	#2048.,R0
	MOV	R0,(R1)+	;SAVE READING
	INC	R4		;POINT TO NEXT CHANNEL
	SOB	R3,REDLP	;REPEAT UNTIL DONE
	SOB	R2,SETLP
	BR	F		;REPEAT
;LOCAL STORAGE
 
ODDEVN:	0
DACCHN:	0
DACDC:	0
DACCHG:	0
PDAC:	0
TYPADC:	0
ADCCHN:	0
INDX:	0
MAXCHN:	31.
BRK:	.BYTE	1,2,4,10,20,40,100,0
DNE:	.BYTE	1,2,4,10,20,40,100,0
BRKMSK:	0
DNEMSK:	0
STPDNE:	0
COUNT:	0
PTIME:	0
 
;OUTPUT STRINGS
 
COM1:	.ASCIZ	/DAC OR ADC(0:1) = /
COM2:	.ASCIZ	/DAC NUMBER (0:7) = /
COM3:	.ASCIZ	/CURRENT OR POSITION MODE (0:1) = /
COM11:	.ASCIZ	/CHECK DONE BIT (0=NO,1=YES) = /
COM4:	.ASCIZ	/DAC DC VALUE (-2048 : 2047) = /
COM5:	.ASCIZ	/DAC CHANGE EVERY 100 USEC = /
COM6:	.ASCIZ	/TYPE ADC READINGS (0:1)? = /
COM7:	.ASCIZ	/SINGLE CHANNEL OR INDEX (0:1) = /
COM8:	.ASCIZ	/ADC CHANNEL (0:31) = /
COM9:	.ASCIZ	/**ERROR** NO ADC DONE SIGNALED
/
TOP:	.BYTE	35,10,10,10,0
TOPCLR:	.BYTE	35,35,37,37,37,10,10,10,0
RIGHT:	.BYTE	32,10,10,10,30,30,30,30,30,30,30
	.BYTE	30,30,30,30,0
IOBUF:	.BLKW	100.
PBUF:	.BLKW	300.


.END START