|
1 .include "DS.S" |
|
2 .text |
|
3 #----------------------------------------------- |
|
4 # C O N S T R U C T O R |
|
5 #----------------------------------------------- |
|
6 ARGS |
|
7 DS thisP # -->Data inst |
|
8 DS callerDeP # -->originator's Debug |
|
9 PROLOC |
|
10 DL deP # -->Debug |
|
11 EPILOC |
|
12 #----------------------------------------------- |
|
13 .global Data |
|
14 Data: |
|
15 PROLOG |
|
16 mov thisP(bp), b # -->Data inst |
|
17 lea Da.debug(b), a # -->Debug |
|
18 mov a, deP(bp) # init local -->Debug |
|
19 # construct debug ID from originator debID |
|
20 mov callerDeP(bp), a # -->caller's Debug |
|
21 lea D.id(a), a |
|
22 push a # -->caller's DebugId |
|
23 DEBID "%s DATA", 1 |
|
24 # calculate container size |
|
25 mov C.csP,a |
|
26 push C.txtP(a) |
|
27 call strlen |
|
28 addl $HeaderL, a |
|
29 addl $PayloadL, a |
|
30 inc a |
|
31 mov thisP(bp), b # -->Data inst |
|
32 mov a, Da.datalen(b) # save container length |
|
33 # allocate container |
|
34 push a |
|
35 call malloc |
|
36 test a, a |
|
37 jnz 0f |
|
38 SYSERR "malloc" |
|
39 0: |
|
40 mov thisP(bp), b # -->Data inst |
|
41 mov a, Da.contP(b) # save -->container |
|
42 # initialize container |
|
43 mov Da.contP(b), c # -->Container |
|
44 lea Co.hdr(c), a # -->Header |
|
45 movl $0, H.ttl(a) |
|
46 movl $0, H.ts(a) |
|
47 push $0f |
|
48 lea Co.payl(c), a # -->Payload |
|
49 lea Pa.text(a), a |
|
50 push a |
|
51 call strcpy # init Payload.text |
|
52 LOG 5, "Data instance established" |
|
53 EPILOG |
|
54 0: .asciz "EMPTY" |
|
55 #----------------------------------------------- |
|
56 # L O A D P A Y L O A D |
|
57 #----------------------------------------------- |
|
58 # returns -->data container |
|
59 M_ARGS |
|
60 DS ttl |
|
61 DS loadP # -->text to be sent |
|
62 M_LOCAL |
|
63 DL t, timevalL # timestamp buf |
|
64 M_PROLOG Da, load |
|
65 LOG 5, "loading..." |
|
66 mov Da.contP(b), c # -->Container |
|
67 # fill header |
|
68 lea Co.hdr(c), d # -->containner header |
|
69 mov ttl(bp), a |
|
70 mov a, H.ttl(d) # init TTL in header |
|
71 # get timestamp |
|
72 call D.getTs # get timestamp |
|
73 mov a, H.ts(d) # timestamp to header |
|
74 # init payload |
|
75 push loadP(bp) # -->loaded text |
|
76 lea Co.payl(c), a # -->Payload |
|
77 lea Pa.text(a), a |
|
78 push a |
|
79 call strcpy # copy text to payload |
|
80 # return -->Data |
|
81 push Da.datalen(b) |
|
82 LOG 5, "payload loaded to container, len=%u" |
|
83 mov Da.contP(b), a # return -->container |
|
84 EPILOG_R |
|
85 #----------------------------------------------- |
|
86 # G E T D A T A C O N T A I N E R L E N G T H |
|
87 #----------------------------------------------- |
|
88 # returns length of container filled with data |
|
89 M_ARGS |
|
90 M_LOCAL |
|
91 M_PROLOG Da, getDataLen |
|
92 mov Da.datalen(b), a |
|
93 EPILOG_R |
|
94 #----------------------------------------------- |
|
95 # G E T D A T A C O N T A I N E R P O I N T E R |
|
96 #----------------------------------------------- |
|
97 M_ARGS |
|
98 M_LOCAL |
|
99 M_PROLOG Da, getContP |
|
100 mov Da.contP(b), a |
|
101 EPILOG_R |
|
102 #----------------------------------------------- |
|
103 # C H E C K P A Y L O A D |
|
104 #----------------------------------------------- |
|
105 # returns boolean: original text == received text |
|
106 M_ARGS |
|
107 M_LOCAL |
|
108 M_PROLOG Da, chk |
|
109 # get original payload |
|
110 mov C.csP, c # -->CS |
|
111 pushl C.txtP(c) # -->orig text |
|
112 # get payload from container |
|
113 mov Da.contP(b), a # -->Container |
|
114 lea Co.payl(a), a # -->Payload |
|
115 lea Pa.text(a), a # -->payload text |
|
116 push a |
|
117 call strcmp |
|
118 xor c, c |
|
119 test a, a # 0 = texts are equal |
|
120 setz %cl |
|
121 mov c, a |
|
122 EPILOG_R |
|
123 #----------------------------------------------- |
|
124 # U N L O A D P A Y L O A D |
|
125 #----------------------------------------------- |
|
126 # returns -->payload text |
|
127 M_ARGS |
|
128 M_LOCAL |
|
129 M_PROLOG Da, unl |
|
130 mov thisP(bp), b # -->Data inst |
|
131 lea Da.debug(b), a |
|
132 mov a, deP(bp) |
|
133 # get payload from container |
|
134 mov Da.contP(b), a # -->Container |
|
135 lea Co.payl(a), a # -->Payload |
|
136 lea Pa.text(a), a # -->Payload.text |
|
137 EPILOG_R |
|
138 #----------------------------------------------- |
|
139 # D E C R E M E N T T T L |
|
140 #----------------------------------------------- |
|
141 # decrement TTL in data container header, save it and return it |
|
142 M_ARGS |
|
143 M_LOCAL |
|
144 M_PROLOG Da, dttl |
|
145 mov Da.contP(b), a # -->Container |
|
146 lea Co.hdr(a), a # -->container header |
|
147 decl H.ttl(a) # TTL-- |
|
148 mov H.ttl(a), a # return TTL |
|
149 EPILOG_R |
|
150 #----------------------------------------------- |
|
151 # G E T T T L |
|
152 #----------------------------------------------- |
|
153 M_ARGS |
|
154 M_LOCAL |
|
155 M_PROLOG Da, ttl |
|
156 mov Da.contP(b), a # -->Container |
|
157 lea Co.hdr(a), a # -->container header |
|
158 mov H.ttl(a), a # return TTL |
|
159 EPILOG_R |
|
160 #----------------------------------------------- |
|
161 # P U T l I S T E N P O R T T O H E A D E R |
|
162 #----------------------------------------------- |
|
163 ARGS |
|
164 DS thisP # -->Data inst |
|
165 DS port |
|
166 # returns port value |
|
167 PROLOC |
|
168 DL deP # -->Debug |
|
169 EPILOC |
|
170 #----------------------------------------------- |
|
171 .global Da.putPort |
|
172 Da.putPort: |
|
173 PROLOG |
|
174 mov thisP(bp), b # -->Data inst |
|
175 lea Da.debug(b), a |
|
176 mov a, deP(bp) # -->Debug |
|
177 |
|
178 mov Da.contP(b), c # -->Container |
|
179 lea Co.hdr(a), c # -->container header |
|
180 mov port(bp), a |
|
181 mov a, H.lport(c) |
|
182 EPILOG_R |
|
183 #----------------------------------------------- |
|
184 # G E T l I S T E N P O R T F R O M H E A D E R |
|
185 #----------------------------------------------- |
|
186 M_ARGS |
|
187 M_LOCAL |
|
188 M_PROLOG Da, getPort |
|
189 mov Da.contP(b), c # -->Container |
|
190 lea Co.hdr(c), c # -->container header |
|
191 mov H.lport(c), a |
|
192 EPILOG_R |
|
193 #----------------------------------------------- |
|
194 # G E T T I M E S T A M P F R O M H E A D E R |
|
195 #----------------------------------------------- |
|
196 M_ARGS |
|
197 M_LOCAL |
|
198 M_PROLOG Da, getTs |
|
199 mov Da.contP(b), a # -->Container |
|
200 lea Co.hdr(a), a # -->container header |
|
201 mov H.ts(a), a # return timestamp |
|
202 EPILOG_R |
|
203 #----------------------------------------------- |
|
204 # S A B O T A G E T E X T |
|
205 #----------------------------------------------- |
|
206 ARGS |
|
207 DS thisP # -->Data inst |
|
208 PROLOC |
|
209 DL deP # -->Debug |
|
210 EPILOC |
|
211 #----------------------------------------------- |
|
212 .global Da.sabotage |
|
213 Da.sabotage: |
|
214 PROLOG |
|
215 lea Da.contP(b), a # -->Container |
|
216 lea Co.payl(a), a # -->Payload |
|
217 lea Pa.text(a), a # -->Payload.text |
|
218 movl $'?', (a) |
|
219 EPILOG |
|
220 #----------------------------------------------- |
|
221 # C R E A T E D I G E S T F R O M T E X T |
|
222 #----------------------------------------------- |
|
223 # returns -->24 chars payload text digest |
|
224 M_ARGS |
|
225 DS digestP # -->text digest buffer |
|
226 M_LOCAL |
|
227 DL textP |
|
228 M_PROLOG Da, digest24 |
|
229 # check length of payload text |
|
230 mov Da.contP(b), a # -->Container |
|
231 lea Co.payl(a), a # -->Payload |
|
232 lea Pa.text(a), a # -->Payload.text |
|
233 mov a, textP(bp) |
|
234 push a |
|
235 call strlen |
|
236 cmp $24, a # payload text length < 24 ? |
|
237 jl Da.digest24Direct # yes, direct copy |
|
238 # create digest from longer text |
|
239 push $8 |
|
240 push textP(bp) |
|
241 push digestP(bp) |
|
242 call strncpy # copy beg. of text |
|
243 push $0f |
|
244 mov digestP(bp), a # -->digest |
|
245 add $8, a |
|
246 push a # -->digest+8 |
|
247 call strcpy |
|
248 jmp 1f |
|
249 0: .asciz "-------" |
|
250 1: push textP(bp) |
|
251 call strlen |
|
252 mov textP(bp), c |
|
253 add a, c |
|
254 lea -8(c), c # -->end of text - 8 |
|
255 push c |
|
256 mov digestP(bp), a |
|
257 lea 15(a), a # -->digest+15 |
|
258 push a |
|
259 call strcpy |
|
260 jmp Da.digest24Ex |
|
261 # directly copy shorter text |
|
262 Da.digest24Direct: |
|
263 push textP(bp) |
|
264 push digestP(bp) |
|
265 call strcpy |
|
266 Da.digest24Ex: |
|
267 mov digestP(bp), a # -->digest |
|
268 EPILOG_R |
|
269 #----------------------------------------------- |
|
270 .end |