File: indexing.t2

For general comments see here
LineAddressObject Code LabelF1N1BF2N2CommentsCheck
1 0  ; tape2/indexing.t2
2 0  ;--------------------------------------------------------------------
3 0  ; index1 - first stage of indexing
4 0  ; acc points at array info
5 0  Indexing::; 
6 0  Index1:; 
7 0 2070636577777 sto ARptr/lod -1;store address, get bound list @6937
8 1 0416150 sto BLptr   ;save bound list @6938
9 1+0555121 cls W6737   ;clear partial index
10 2  .ret:; 
11 2 2200007000000 inc T2Link/jmp 0;return after bumping return @6939
12 3  ;--------------------------------------------------------------------
13 3  ; index2 - intermediate stage,
14 3  ; acc contains subscript value, assume Index1 done
15 3  Index2:; 
16 3 2270642120000 inc BLptr/sub 0;remove lower bound @6940
17 4 1120011 jn SubOflo   ;out-of range @6941
18 4+0515121 ads W6737   ;add to index
19 5 2270642120000 inc BLptr/sub 0;check upper bound @6942
20 6 1120014 jn .2A   ;OK, @6943
21 6+1100011 jmp SubOflo   ;over the top, abort
22 7  ;--------------------------------------------------------------------
23 7  ; index3 - final subscript to indexing operation
24 7  ; acc contains final subscript, return with address of element
25 7  ;
26 7  Index3:; 
27 7 0070642120001 o00 BLptr/sub 1;remove lower bnd @6944
28 8 1120011 jn SubOflo   ;out of range @6945
29 8+0515121 ads W6737   ;add to index
30 9 0070642120002 o00 BLptr/sub 2;check upper limit @6946
31 10 1020013 jn .3A   ;OK, skip @6947
32 10+1100011 jmp SubOflo   ;report out of range
33 11  ;
34 11  .3A:; 
35 11 0615121 lod W6737   ;get index value @6948
36 11+0116147 add ARptr   ;add base address
37 12 1000002 jmp .ret   ;return address of element @6949
38 12+ ;--------
39 12+ ; from Index2, subscript OK
40 12+ .2A:; 
41 12+0615121 lod W6737   ;present index
42 13 0070643240002 o00 BLptr/mul 2;multiply by stride @6950
43 14 1360000 ara 0   ; @6951
44 14+0415121 sto W6737   ;updated index
45 15 1000002 jmp .ret   ; @6952
46 15+ ;
47 15+0000000 o00 0   ;
48 16  =7109 
49 7109  ;--------------------------------------------------------------------
50 7109  ; Size: get size of array (address in arg1)
51 7109  Size:; 
52 7109 0000072577777 o00 arg1/lod -1;get address of store used @7109
53 7110 2000072600000 sto arg1/lod 0;size is top half of word @7110
54 7111 1220024 srl 20   ;shift down to normal @7111
55 7111+0116210 add N1   ;=-1 less overhead
56 7112 1000052 jmp retlnk1   ;and return it @7112
57 7112+ ;--------------------------------------------------------------------
58 7112+ ;
59 7112+ Range:; 
60 7112+0455120 inc W6736   ;set flag for lowbound
61 7113  Lowbound:; 
62 7113 0000072577777 o00 arg1/lod -1;address of array descriptor @7113
63 7114 2000022600000 sto 4/lod 0; @7114
64 7115 0076222 and K127   ;=127 @7115
65 7115+0120017 sub arg2   ;
66 7116 1120011 jn SubOflo   ;arg2 > no dims @7116
67 7116+0600017 lod arg2   ;reload arg2
68 7117 1120011 jn SubOflo   ;arg2 <= 0 @7117
69 7117+1140011 jz SubOflo   ;
70 7118 0100004 add 4   ;add base address @7118
71 7118+0115120 add W6736   ;add flag (0/1)
72 7119 2400076577777 ads arg2/lod -1;get range/lowbound @7119
73 7120 1000052 jmp retlnk1   ;return it @7120
74 7120+ ;
75 7120+0000000 o00 0   ;
76 7121  ; no refs
77 7121  ;L7121:
78 7121 1000052 jmp retlnk1   ; @7121
79 7121+ ;
80 7121+0000000 o00 0   ;
81 7122  ;--------------------------------------------------------------------