source:
rtems/c/src/ada-tests/tmtests/tm20/tmtest.adb
@
2226a03c
Last change on this file since 2226a03c was 2226a03c, checked in by Joel Sherrill <joel.sherrill@…>, on 09/04/03 at 18:43:40 | |
---|---|
|
|
File size: 13.8 KB |
Line | |
---|---|
1 | -- |
2 | -- TMTEST / BODY |
3 | -- |
4 | -- DESCRIPTION: |
5 | -- |
6 | -- This package is the implementation of Test 20 of the RTEMS |
7 | -- Timing Test Suite. |
8 | -- |
9 | -- DEPENDENCIES: |
10 | -- |
11 | -- |
12 | -- |
13 | -- COPYRIGHT (c) 1989-1997. |
14 | -- On-Line Applications Research Corporation (OAR). |
15 | -- |
16 | -- The license and distribution terms for this file may in |
17 | -- the file LICENSE in this distribution or at |
18 | -- http://www.rtems.com/license/LICENSE. |
19 | -- |
20 | -- $Id$ |
21 | -- |
22 | |
23 | with INTERFACES; use INTERFACES; |
24 | with RTEMS; |
25 | with RTEMS_CALLING_OVERHEAD; |
26 | with TEST_SUPPORT; |
27 | with TEXT_IO; |
28 | with TIME_TEST_SUPPORT; |
29 | with UNSIGNED32_IO; |
30 | |
31 | package body TMTEST is |
32 | |
33 | --PAGE |
34 | -- |
35 | -- INIT |
36 | -- |
37 | |
38 | procedure INIT ( |
39 | ARGUMENT : in RTEMS.TASK_ARGUMENT |
40 | ) is |
41 | STATUS : RTEMS.STATUS_CODES; |
42 | begin |
43 | |
44 | TEXT_IO.NEW_LINE( 2 ); |
45 | TEXT_IO.PUT_LINE( "*** TIME TEST 20 ***" ); |
46 | |
47 | RTEMS.TASK_CREATE( |
48 | RTEMS.BUILD_NAME( 'T', 'I', 'M', '1' ), |
49 | 128, |
50 | 2048, |
51 | RTEMS.DEFAULT_MODES, |
52 | RTEMS.DEFAULT_ATTRIBUTES, |
53 | TMTEST.TASK_ID( 1 ), |
54 | STATUS |
55 | ); |
56 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TASK1" ); |
57 | |
58 | RTEMS.TASK_START( |
59 | TMTEST.TASK_ID( 1 ), |
60 | TMTEST.TASK_1'ACCESS, |
61 | 0, |
62 | STATUS |
63 | ); |
64 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TASK1" ); |
65 | |
66 | RTEMS.TASK_CREATE( |
67 | RTEMS.BUILD_NAME( 'T', 'I', 'M', '2' ), |
68 | 129, |
69 | 2048, |
70 | RTEMS.DEFAULT_MODES, |
71 | RTEMS.DEFAULT_ATTRIBUTES, |
72 | TMTEST.TASK_ID( 2 ), |
73 | STATUS |
74 | ); |
75 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_CREATE OF TASK2" ); |
76 | |
77 | RTEMS.TASK_START( |
78 | TMTEST.TASK_ID( 2 ), |
79 | TMTEST.TASK_2'ACCESS, |
80 | 0, |
81 | STATUS |
82 | ); |
83 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_START OF TASK2" ); |
84 | |
85 | RTEMS.TASK_DELETE( RTEMS.SELF, STATUS ); |
86 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" ); |
87 | |
88 | end INIT; |
89 | |
90 | --PAGE |
91 | -- |
92 | -- TASK_1 |
93 | -- |
94 | |
95 | procedure TASK_1 ( |
96 | ARGUMENT : in RTEMS.TASK_ARGUMENT |
97 | ) is |
98 | BUFFER_COUNT : RTEMS.UNSIGNED32; |
99 | INDEX : RTEMS.UNSIGNED32; |
100 | PREVIOUS_MODE : RTEMS.MODE; |
101 | PREVIOUS_PRIORITY : RTEMS.TASK_PRIORITY; |
102 | OVERHEAD : RTEMS.UNSIGNED32; |
103 | STATUS : RTEMS.STATUS_CODES; |
104 | begin |
105 | |
106 | TMTEST.PARTITION_NAME := RTEMS.BUILD_NAME( 'P', 'A', 'R', 'T' ); |
107 | |
108 | TIMER_DRIVER.INITIALIZE; |
109 | |
110 | RTEMS.PARTITION_CREATE( |
111 | TMTEST.PARTITION_NAME, |
112 | TMTEST.PARTITION_AREA'ADDRESS, |
113 | 2048, |
114 | 128, |
115 | RTEMS.DEFAULT_ATTRIBUTES, |
116 | TMTEST.PARTITION_ID, |
117 | STATUS |
118 | ); |
119 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
120 | |
121 | TIME_TEST_SUPPORT.PUT_TIME( |
122 | "PARTITION_CREATE", |
123 | TMTEST.END_TIME, |
124 | 1, |
125 | 0, |
126 | RTEMS_CALLING_OVERHEAD.PARTITION_CREATE |
127 | ); |
128 | |
129 | TMTEST.REGION_NAME := RTEMS.BUILD_NAME( 'R', 'E', 'G', 'N' ); |
130 | |
131 | TIMER_DRIVER.INITIALIZE; |
132 | |
133 | RTEMS.REGION_CREATE( |
134 | TMTEST.REGION_NAME, |
135 | TMTEST.REGION_AREA'ADDRESS, |
136 | 2048, |
137 | 16, |
138 | RTEMS.DEFAULT_ATTRIBUTES, |
139 | TMTEST.REGION_ID, |
140 | STATUS |
141 | ); |
142 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
143 | |
144 | TIME_TEST_SUPPORT.PUT_TIME( |
145 | "REGION_CREATE", |
146 | TMTEST.END_TIME, |
147 | 1, |
148 | 0, |
149 | RTEMS_CALLING_OVERHEAD.REGION_CREATE |
150 | ); |
151 | |
152 | TIMER_DRIVER.INITIALIZE; |
153 | RTEMS.PARTITION_GET_BUFFER( |
154 | TMTEST.PARTITION_ID, |
155 | TMTEST.BUFFER_ADDRESS_1, |
156 | STATUS |
157 | ); |
158 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
159 | |
160 | TIME_TEST_SUPPORT.PUT_TIME( |
161 | "PARTITION_GET_BUFFER (available)", |
162 | TMTEST.END_TIME, |
163 | 1, |
164 | 0, |
165 | RTEMS_CALLING_OVERHEAD.PARTITION_GET_BUFFER |
166 | ); |
167 | |
168 | BUFFER_COUNT := 0; |
169 | loop |
170 | |
171 | RTEMS.PARTITION_GET_BUFFER( |
172 | TMTEST.PARTITION_ID, |
173 | TMTEST.BUFFER_ADDRESSES( BUFFER_COUNT ), |
174 | STATUS |
175 | ); |
176 | |
177 | exit when RTEMS.ARE_STATUSES_EQUAL( STATUS, RTEMS.UNSATISFIED ); |
178 | |
179 | BUFFER_COUNT := BUFFER_COUNT + 1; |
180 | |
181 | end loop; |
182 | |
183 | TIMER_DRIVER.INITIALIZE; |
184 | RTEMS.PARTITION_GET_BUFFER( |
185 | TMTEST.PARTITION_ID, |
186 | TMTEST.BUFFER_ADDRESS_2, |
187 | STATUS |
188 | ); |
189 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
190 | |
191 | TIME_TEST_SUPPORT.PUT_TIME( |
192 | "PARTITION_GET_BUFFER (not available)", |
193 | TMTEST.END_TIME, |
194 | 1, |
195 | 0, |
196 | RTEMS_CALLING_OVERHEAD.PARTITION_GET_BUFFER |
197 | ); |
198 | |
199 | TIMER_DRIVER.INITIALIZE; |
200 | RTEMS.PARTITION_RETURN_BUFFER( |
201 | TMTEST.PARTITION_ID, |
202 | TMTEST.BUFFER_ADDRESS_1, |
203 | STATUS |
204 | ); |
205 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
206 | |
207 | TIME_TEST_SUPPORT.PUT_TIME( |
208 | "PARTITION_RETURN_BUFFER", |
209 | TMTEST.END_TIME, |
210 | 1, |
211 | 0, |
212 | RTEMS_CALLING_OVERHEAD.PARTITION_RETURN_BUFFER |
213 | ); |
214 | |
215 | for INDEX in 0 .. BUFFER_COUNT - 1 |
216 | loop |
217 | |
218 | RTEMS.PARTITION_RETURN_BUFFER( |
219 | TMTEST.PARTITION_ID, |
220 | TMTEST.BUFFER_ADDRESSES( INDEX ), |
221 | STATUS |
222 | ); |
223 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "PARTITION_RETURN_BUFFER" ); |
224 | |
225 | end loop; |
226 | |
227 | TIMER_DRIVER.INITIALIZE; |
228 | RTEMS.PARTITION_DELETE( TMTEST.PARTITION_ID, STATUS ); |
229 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
230 | |
231 | TIME_TEST_SUPPORT.PUT_TIME( |
232 | "PARTITION_DELETE", |
233 | TMTEST.END_TIME, |
234 | 1, |
235 | 0, |
236 | RTEMS_CALLING_OVERHEAD.PARTITION_DELETE |
237 | ); |
238 | |
239 | RTEMS.REGION_GET_SEGMENT( |
240 | TMTEST.REGION_ID, |
241 | 400, |
242 | RTEMS.DEFAULT_OPTIONS, |
243 | RTEMS.NO_TIMEOUT, |
244 | TMTEST.BUFFER_ADDRESS_2, |
245 | STATUS |
246 | ); |
247 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_GET_SEGMENT" ); |
248 | |
249 | TIMER_DRIVER.INITIALIZE; |
250 | RTEMS.REGION_GET_SEGMENT( |
251 | TMTEST.REGION_ID, |
252 | 400, |
253 | RTEMS.DEFAULT_OPTIONS, |
254 | RTEMS.NO_TIMEOUT, |
255 | TMTEST.BUFFER_ADDRESS_3, |
256 | STATUS |
257 | ); |
258 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
259 | |
260 | TIME_TEST_SUPPORT.PUT_TIME( |
261 | "REGION_GET_SEGMENT (available)", |
262 | TMTEST.END_TIME, |
263 | 1, |
264 | 0, |
265 | RTEMS_CALLING_OVERHEAD.REGION_GET_SEGMENT |
266 | ); |
267 | |
268 | TIMER_DRIVER.INITIALIZE; |
269 | RTEMS.REGION_GET_SEGMENT( |
270 | TMTEST.REGION_ID, |
271 | 1998, |
272 | RTEMS.NO_WAIT, |
273 | RTEMS.NO_TIMEOUT, |
274 | TMTEST.BUFFER_ADDRESS_4, |
275 | STATUS |
276 | ); |
277 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
278 | |
279 | TIME_TEST_SUPPORT.PUT_TIME( |
280 | "REGION_GET_SEGMENT (NO_WAIT)", |
281 | TMTEST.END_TIME, |
282 | 1, |
283 | 0, |
284 | RTEMS_CALLING_OVERHEAD.REGION_GET_SEGMENT |
285 | ); |
286 | |
287 | RTEMS.REGION_RETURN_SEGMENT( |
288 | TMTEST.REGION_ID, |
289 | TMTEST.BUFFER_ADDRESS_3, |
290 | STATUS |
291 | ); |
292 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_RETURN_SEGMENT" ); |
293 | |
294 | TIMER_DRIVER.INITIALIZE; |
295 | RTEMS.REGION_RETURN_SEGMENT( |
296 | TMTEST.REGION_ID, |
297 | TMTEST.BUFFER_ADDRESS_2, |
298 | STATUS |
299 | ); |
300 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
301 | |
302 | TIME_TEST_SUPPORT.PUT_TIME( |
303 | "REGION_RETURN_SEGMENT (no tasks waiting)", |
304 | TMTEST.END_TIME, |
305 | 1, |
306 | 0, |
307 | RTEMS_CALLING_OVERHEAD.REGION_RETURN_SEGMENT |
308 | ); |
309 | |
310 | RTEMS.REGION_GET_SEGMENT( |
311 | TMTEST.REGION_ID, |
312 | 400, |
313 | RTEMS.DEFAULT_OPTIONS, |
314 | RTEMS.NO_TIMEOUT, |
315 | TMTEST.BUFFER_ADDRESS_1, |
316 | STATUS |
317 | ); |
318 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_GET_SEGMENT" ); |
319 | |
320 | TIMER_DRIVER.INITIALIZE; |
321 | RTEMS.REGION_GET_SEGMENT( |
322 | TMTEST.REGION_ID, |
323 | 1998, |
324 | RTEMS.DEFAULT_OPTIONS, |
325 | RTEMS.NO_TIMEOUT, |
326 | TMTEST.BUFFER_ADDRESS_2, |
327 | STATUS |
328 | ); |
329 | |
330 | -- execute TASK_2 |
331 | |
332 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
333 | |
334 | TIME_TEST_SUPPORT.PUT_TIME( |
335 | "REGION_RETURN_SEGMENT (preempt)", |
336 | TMTEST.END_TIME, |
337 | 1, |
338 | 0, |
339 | RTEMS_CALLING_OVERHEAD.REGION_RETURN_SEGMENT |
340 | ); |
341 | |
342 | RTEMS.REGION_RETURN_SEGMENT( |
343 | TMTEST.REGION_ID, |
344 | TMTEST.BUFFER_ADDRESS_2, |
345 | STATUS |
346 | ); |
347 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "REGION_RETURN_SEGMENT" ); |
348 | |
349 | RTEMS.TASK_MODE( |
350 | RTEMS.NO_PREEMPT, |
351 | RTEMS.PREEMPT_MASK, |
352 | PREVIOUS_MODE, |
353 | STATUS |
354 | ); |
355 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_MODE" ); |
356 | |
357 | RTEMS.TASK_SET_PRIORITY( RTEMS.SELF, 254, PREVIOUS_PRIORITY, STATUS ); |
358 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_SET_PRIORITY" ); |
359 | |
360 | RTEMS.REGION_GET_SEGMENT( |
361 | TMTEST.REGION_ID, |
362 | 400, |
363 | RTEMS.DEFAULT_OPTIONS, |
364 | RTEMS.NO_TIMEOUT, |
365 | TMTEST.BUFFER_ADDRESS_1, |
366 | STATUS |
367 | ); |
368 | |
369 | RTEMS.REGION_GET_SEGMENT( |
370 | TMTEST.REGION_ID, |
371 | 1998, |
372 | RTEMS.DEFAULT_OPTIONS, |
373 | RTEMS.NO_TIMEOUT, |
374 | TMTEST.BUFFER_ADDRESS_2, |
375 | STATUS |
376 | ); |
377 | |
378 | -- execute TASK_2 |
379 | |
380 | RTEMS.REGION_RETURN_SEGMENT( |
381 | TMTEST.REGION_ID, |
382 | TMTEST.BUFFER_ADDRESS_2, |
383 | STATUS |
384 | ); |
385 | |
386 | TIMER_DRIVER.INITIALIZE; |
387 | RTEMS.REGION_DELETE( TMTEST.REGION_ID, STATUS ); |
388 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
389 | |
390 | TIME_TEST_SUPPORT.PUT_TIME( |
391 | "REGION_DELETE", |
392 | TMTEST.END_TIME, |
393 | 1, |
394 | 0, |
395 | RTEMS_CALLING_OVERHEAD.REGION_DELETE |
396 | ); |
397 | |
398 | TIMER_DRIVER.INITIALIZE; |
399 | for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT |
400 | loop |
401 | TIMER_DRIVER.EMPTY_FUNCTION; |
402 | end loop; |
403 | OVERHEAD := TIMER_DRIVER.READ_TIMER; |
404 | |
405 | TIMER_DRIVER.INITIALIZE; |
406 | for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT |
407 | loop |
408 | RTEMS.IO_INITIALIZE( |
409 | 1, |
410 | 0, |
411 | RTEMS.NULL_ADDRESS, |
412 | STATUS |
413 | ); |
414 | end loop; |
415 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
416 | |
417 | TIME_TEST_SUPPORT.PUT_TIME( |
418 | "IO_INITIALIZE", |
419 | TMTEST.END_TIME, |
420 | TIME_TEST_SUPPORT.OPERATION_COUNT, |
421 | 0, |
422 | RTEMS_CALLING_OVERHEAD.IO_INITIALIZE |
423 | ); |
424 | |
425 | TIMER_DRIVER.INITIALIZE; |
426 | for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT |
427 | loop |
428 | RTEMS.IO_OPEN( |
429 | 1, |
430 | 0, |
431 | RTEMS.NULL_ADDRESS, |
432 | STATUS |
433 | ); |
434 | end loop; |
435 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
436 | |
437 | TIME_TEST_SUPPORT.PUT_TIME( |
438 | "IO_OPEN", |
439 | TMTEST.END_TIME, |
440 | TIME_TEST_SUPPORT.OPERATION_COUNT, |
441 | 0, |
442 | RTEMS_CALLING_OVERHEAD.IO_OPEN |
443 | ); |
444 | |
445 | TIMER_DRIVER.INITIALIZE; |
446 | for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT |
447 | loop |
448 | RTEMS.IO_CLOSE( |
449 | 1, |
450 | 0, |
451 | RTEMS.NULL_ADDRESS, |
452 | STATUS |
453 | ); |
454 | end loop; |
455 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
456 | |
457 | TIME_TEST_SUPPORT.PUT_TIME( |
458 | "IO_CLOSE", |
459 | TMTEST.END_TIME, |
460 | TIME_TEST_SUPPORT.OPERATION_COUNT, |
461 | 0, |
462 | RTEMS_CALLING_OVERHEAD.IO_CLOSE |
463 | ); |
464 | |
465 | TIMER_DRIVER.INITIALIZE; |
466 | for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT |
467 | loop |
468 | RTEMS.IO_READ( |
469 | 1, |
470 | 0, |
471 | RTEMS.NULL_ADDRESS, |
472 | STATUS |
473 | ); |
474 | end loop; |
475 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
476 | |
477 | TIME_TEST_SUPPORT.PUT_TIME( |
478 | "IO_READ", |
479 | TMTEST.END_TIME, |
480 | TIME_TEST_SUPPORT.OPERATION_COUNT, |
481 | 0, |
482 | RTEMS_CALLING_OVERHEAD.IO_READ |
483 | ); |
484 | |
485 | TIMER_DRIVER.INITIALIZE; |
486 | for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT |
487 | loop |
488 | RTEMS.IO_WRITE( |
489 | 1, |
490 | 0, |
491 | RTEMS.NULL_ADDRESS, |
492 | STATUS |
493 | ); |
494 | end loop; |
495 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
496 | |
497 | TIME_TEST_SUPPORT.PUT_TIME( |
498 | "IO_WRITE", |
499 | TMTEST.END_TIME, |
500 | TIME_TEST_SUPPORT.OPERATION_COUNT, |
501 | 0, |
502 | RTEMS_CALLING_OVERHEAD.IO_WRITE |
503 | ); |
504 | |
505 | TIMER_DRIVER.INITIALIZE; |
506 | for INDEX in 1 .. TIME_TEST_SUPPORT.OPERATION_COUNT |
507 | loop |
508 | RTEMS.IO_CONTROL( |
509 | 1, |
510 | 0, |
511 | RTEMS.NULL_ADDRESS, |
512 | STATUS |
513 | ); |
514 | end loop; |
515 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
516 | |
517 | TIME_TEST_SUPPORT.PUT_TIME( |
518 | "IO_CONTROL", |
519 | TMTEST.END_TIME, |
520 | TIME_TEST_SUPPORT.OPERATION_COUNT, |
521 | 0, |
522 | RTEMS_CALLING_OVERHEAD.IO_CONTROL |
523 | ); |
524 | |
525 | RTEMS.SHUTDOWN_EXECUTIVE( 0 ); |
526 | |
527 | end TASK_1; |
528 | |
529 | --PAGE |
530 | -- |
531 | -- TASK_2 |
532 | -- |
533 | |
534 | procedure TASK_2 ( |
535 | ARGUMENT : in RTEMS.TASK_ARGUMENT |
536 | ) is |
537 | STATUS : RTEMS.STATUS_CODES; |
538 | begin |
539 | |
540 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
541 | |
542 | TIME_TEST_SUPPORT.PUT_TIME( |
543 | "REGION_GET_SEGMENT (blocking)", |
544 | TMTEST.END_TIME, |
545 | 1, |
546 | 0, |
547 | RTEMS_CALLING_OVERHEAD.REGION_GET_SEGMENT |
548 | ); |
549 | |
550 | TIMER_DRIVER.INITIALIZE; |
551 | RTEMS.REGION_RETURN_SEGMENT( |
552 | TMTEST.REGION_ID, |
553 | TMTEST.BUFFER_ADDRESS_1, |
554 | STATUS |
555 | ); |
556 | |
557 | -- preempt back to TASK_1 |
558 | |
559 | TIMER_DRIVER.INITIALIZE; |
560 | RTEMS.REGION_RETURN_SEGMENT( |
561 | TMTEST.REGION_ID, |
562 | TMTEST.BUFFER_ADDRESS_1, |
563 | STATUS |
564 | ); |
565 | TMTEST.END_TIME := TIMER_DRIVER.READ_TIMER; |
566 | |
567 | TIME_TEST_SUPPORT.PUT_TIME( |
568 | "REGION_RETURN_SEGMENT (ready -- return)", |
569 | TMTEST.END_TIME, |
570 | 1, |
571 | 0, |
572 | RTEMS_CALLING_OVERHEAD.REGION_RETURN_SEGMENT |
573 | ); |
574 | |
575 | RTEMS.TASK_DELETE( RTEMS.SELF, STATUS ); |
576 | TEST_SUPPORT.DIRECTIVE_FAILED( STATUS, "TASK_DELETE OF SELF" ); |
577 | |
578 | end TASK_2; |
579 | |
580 | end TMTEST; |
Note: See TracBrowser
for help on using the repository browser.