include "hdr1.html"; ?>
Line | Address | Object Code | Label | F1 | N1 | B | F2 | N2 | Comments | Check |
---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | ; convert.t2 | ||||||||
2 | 0 | ;-------------------------------------------------------------------- | ||||||||
3 | 0 | ; flpt->integer conversions, round is called by int := flpt | ||||||||
4 | 0 | ; while entier is standard procedure | ||||||||
5 | 0 | ; difference is round rounds to nearest integer, entier rounds towards down | ||||||||
6 | 0 | =6899 | ||||||||
7 | 6899 | Round:: | ; | |||||||
8 | 6899 | Round: | ; | |||||||
9 | 6899 | 1415132 | fad | FP0.5 | ;add 0.5 for rounding | @6899 | ||||
10 | 6899+ | Entier: | ; | |||||||
11 | 6899+ | 0400015 | sto | Link1 | ;save value | |||||
12 | 6900 | 0075133 | and | W6747 | ;=511 mask off exponent | @6900 | ||||
13 | 6900+ | 0560015 | o27 | Link1 | ;remove from value | |||||
14 | 6901 | 0135134 | sub | W6748 | ;=257 | @6901 | ||||
15 | 6901+ | 1135370 | jn | .1 | ;got to be less than 1.0 | |||||
16 | 6902 | 0175135 | bus | W6749 | ;=36 | @6902 | ||||
17 | 6902+ | 1020013 | jn | IntOflo | ;will overflow integer range | |||||
18 | 6903 | 1000067200001 | exa | Link1 | / | sra | 1 | ;ok, shift right by exp | @6903 | |
19 | 6904 | 1015212 | jmp | CkoRet | ;check oflo and return | @6904 | ||||
20 | 6904+ | ; | ||||||||
21 | 6904+ | .1: | ; | |||||||
22 | 6904+ | 0600015 | lod | Link1 | ;small value, just get sign | |||||
23 | 6905 | 1200046 | sra | 38 | ;shift right to get 0 or -1 | @6905 | ||||
24 | 6905+ | 1015212 | jmp | CkoRet | ;and return it | |||||
25 | 6906 | ;-------------------------------------------------------------------- | ||||||||
26 | 6906 | ; divide two integers | ||||||||
27 | 6906 | ; problem is that Algol divide doesn't match hardware if either | ||||||||
28 | 6906 | ; argument is negative. make both arguments positive, noting | ||||||||
29 | 6906 | ; original sign, then adjust result afterwards | ||||||||
30 | 6906 | ; | ||||||||
31 | 6906 | Div:: | ; | |||||||
32 | 6906 | Div: | ; | |||||||
33 | 6906 | 0600016 | lod | arg1 | ;divisor | @6906 | ||||
34 | 6906+ | 1040013 | jz | IntOflo | ;trap divide by zero | |||||
35 | 6907 | 1135374 | jn | .1 | ; | @6907 | ||||
36 | 6907+ | 0600015 | lod | Link1 | ;get dividend | |||||
37 | 6908 | 1115375 | jmp | .2 | ; | @6908 | ||||
38 | 6908+ | ; | ||||||||
39 | 6908+ | .1: | ; | |||||||
40 | 6908+ | 0420016 | stn | arg1 | ;complement divisor | |||||
41 | 6909 | 0620015 | lcs | Link1 | ;complement dividend also | @6909 | ||||
42 | 6909+ | .2: | ; | |||||||
43 | 6909+ | 0020000 | neg | 0 | ;complement dividend | |||||
44 | 6910 | 1135375 | jn | .2 | ;make it positive | @6910 | ||||
45 | 6910+ | 1200046 | sra | 38 | ;shift into AR | |||||
46 | 6911 | 1340016 | div | arg1 | ;divide | @6911 | ||||
47 | 6911+ | 0200015 | exa | Link1 | ;swap with dividend | |||||
48 | 6912 | 1135401 | jn | .3 | ;negative? | @6912 | ||||
49 | 6912+ | 0600015 | lod | Link1 | ;no, reload result | |||||
50 | 6913 | 1015212 | jmp | CkoRet | ;and return, checking oflo | @6913 | ||||
51 | 6913+ | ; | ||||||||
52 | 6913+ | .3: | ; | |||||||
53 | 6913+ | 0220015 | o11 | Link1 | ;re-load complement of result | |||||
54 | 6914 | 1015212 | jmp | CkoRet | ;and return that | @6914 | ||||
55 | 6914+ | ; | ||||||||
56 | 6914+ | 0000000 | o00 | 0 | ; | |||||
57 | 6915 | ;-------------------------------------------------------------------- | ||||||||
58 | 6915 | ; IPower, raise number to integer power | ||||||||
59 | 6915 | ; | ||||||||
60 | 6915 | IPower:: | ; | |||||||
61 | 6915 | IPower: | ; | |||||||
62 | 6915 | 0600015 | lod | Link1 | ;get number | @6915 | ||||
63 | 6915+ | 1155423 | jz | .7 | ;answer will be zero | |||||
64 | 6916 | 0555121 | cls | W6737 | ;clear flag | @6916 | ||||
65 | 6916+ | 1220000 | srl | 0 | ;clear AR | |||||
66 | 6917 | 0615136 | lod | FP1.0 | ;initial factor | @6917 | ||||
67 | 6917+ | 0415120 | sto | W6736 | ;save it | |||||
68 | 6918 | 0600016 | lod | arg1 | ;get power | @6918 | ||||
69 | 6918+ | 1155422 | jz | .5 | ;zero, return 1.0 | |||||
70 | 6919 | 1035410 | jn | .1 | ;negative, invert | @6919 | ||||
71 | 6919+ | 1015411 | jmp | .2 | ;positive, normal | |||||
72 | 6920 | ; | ||||||||
73 | 6920 | .1: | ; | |||||||
74 | 6920 | 0455121 | inc | W6737 | ;bump flag | @6920 | ||||
75 | 6920+ | 0620016 | lcs | arg1 | ;complement power | |||||
76 | 6921 | .2: | ; | |||||||
77 | 6921 | 0600016 | lod | arg1 | ;get power | @6921 | ||||
78 | 6921+ | 1200001 | sra | 1 | ;divide by 2 | |||||
79 | 6922 | 0400016 | sto | arg1 | ;and save | @6922 | ||||
80 | 6922+ | 1360000 | ara | 0 | ;get remainder | |||||
81 | 6923 | 1055415 | jz | .3 | ;zero, ignore | @6923 | ||||
82 | 6923+ | 0615120 | lod | W6736 | ;get factor | |||||
83 | 6924 | 1460015 | fmu | Link1 | ;multiply by number | @6924 | ||||
84 | 6924+ | 0415120 | sto | W6736 | ;and save | |||||
85 | 6925 | .3: | ; | |||||||
86 | 6925 | 0600016 | lod | arg1 | ;load power | @6925 | ||||
87 | 6925+ | 1055420 | jz | .4 | ;zero, finished | |||||
88 | 6926 | 0600015 | lod | Link1 | ;load number | @6926 | ||||
89 | 6926+ | 1460015 | fmu | Link1 | ;square it | |||||
90 | 6927 | 0400015 | sto | Link1 | ;and save it | @6927 | ||||
91 | 6927+ | 1015411 | jmp | .2 | ;repeat loop | |||||
92 | 6928 | ; | ||||||||
93 | 6928 | .4: | ; | |||||||
94 | 6928 | 0615121 | lod | W6737 | ;finished, test flag | @6928 | ||||
95 | 6928+ | 1155422 | jz | .5 | ;zero, done | |||||
96 | 6929 | 0615136 | lod | FP1.0 | ;need to take reciprocal | @6929 | ||||
97 | 6929+ | 1515120 | fdv | W6736 | ;divide 1.0 by result | |||||
98 | 6930 | 1015423 | jmp | .6 | ;and return that | @6930 | ||||
99 | 6930+ | ; | ||||||||
100 | 6930+ | .5: | ; | |||||||
101 | 6930+ | 0615120 | lod | W6736 | ;reload result | |||||
102 | 6931 | .6: | ; | |||||||
103 | 6931 | 1015212 | jmp | CkoRet | ;and exit, checking overflow | @6931 | ||||
104 | 6931+ | ; | ||||||||
105 | 6931+ | .7: | ; | |||||||
106 | 6931+ | 0600016 | lod | arg1 | ;get power | |||||
107 | 6932 | 1040013 | jz | IntOflo | ;overflow if zero?? | @6932 | ||||
108 | 6932+ | 1115370 | jmp | Round.1 | ;round | |||||
109 | 6933 | ;-------------------------------------------------------------------- | ||||||||
110 | 6933 | ; return sign(arg1) -1, 0, +1 | ||||||||
111 | 6933 | ; | ||||||||
112 | 6933 | Sign: | ; | |||||||
113 | 6933 | 0600016 | lod | arg1 | ;get argument | @6933 | ||||
114 | 6933+ | 1135427 | jn | SignNeg | ;negative, return -1 | |||||
115 | 6934 | 1040052 | jz | retlnk1 | ;zero, return 0 | @6934 | ||||
116 | 6934+ | 0040000 | o02 | 0 | ;=1 | |||||
117 | 6935 | 1000052 | jmp | retlnk1 | ;positive, return +1 | @6935 | ||||
118 | 6935+ | ; | ||||||||
119 | 6935+ | SignNeg: | ; | |||||||
120 | 6935+ | 0040000 | o02 | 0 | ;=1 | |||||
121 | 6936 | 0020000 | neg | 0 | ;negate it | @6936 | ||||
122 | 6936+ | 1000052 | jmp | retlnk1 | ;and return |