COMPILATION LISTING OF SEGMENT tape_reader Compiled by: Multics PL/I Compiler, Release 32f, of October 9, 1989 Compiled at: Bull HN, Phoenix AZ, System-M Compiled on: 11/11/89 0949.5 mst Sat Options: optimize map 1 /****^ *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Bull Inc., 1987 * 4* * * 5* * Copyright, (C) Honeywell Information Systems Inc., 1984 * 6* * * 7* * Copyright (c) 1972 by Massachusetts Institute of * 8* * Technology and Honeywell Information Systems, Inc. * 9* * * 10* *********************************************************** */ 11 12 13 14 15 /****^ HISTORY COMMENTS: 16* 1) change(86-06-05,GJohnson), approve(86-06-05,MCR7387), 17* audit(86-06-10,Martinson), install(86-07-11,MR12.0-1091): 18* Correct error message documentation. 19* END HISTORY COMMENTS */ 20 21 22 /* TAPE_READER - Multics Standard Tape Reading Procedure for Initialization. 23* recoded into PL/1 - 8/27/73 by N. I. Morris */ 24 /* BIM 7/82 tape_io renamed to boot_tape_io */ 25 26 tape_reader: proc (p, n); 27 28 dcl p ptr, /* pointer to target data buffer */ 29 n fixed bin (18); /* # of words to read */ 30 31 dcl (cur_p, cur_dp, cur_tp) ptr, /* ptrs to current record header, data, trailer */ 32 exprec fixed bin (18), /* next expected record number */ 33 datap ptr, /* ptr to current position in target data */ 34 count fixed bin (18), /* # of words remaining to be transferred */ 35 words_left fixed bin (18), /* # of words remaining in tape buffer */ 36 copy_words fixed bin (18), /* # of words to be copied */ 37 nrecs fixed bin, /* # of records read before good record encountered */ 38 retries fixed bin, /* # of times tape backspaced to retry */ 39 majstat fixed bin (5), /* major status from tape I/O operation */ 40 checksum bit (36) aligned, /* tape record checksum */ 41 i fixed bin; /* iteration variable */ 42 43 dcl tape_count fixed bin static; /* count of tape drives used */ 44 45 dcl data (copy_words) fixed bin (35) based; /* structure for copying data */ 46 47 dcl 1 physical_record_buffer$ ext, /* physical record buffer */ 48 ( 2 index fixed bin (17), /* index into current buffer */ 49 2 pad fixed bin (17)) unal, 50 2 cur_rec (1040) fixed bin; /* current record */ 51 52 dcl (addr, addrel, divide, min, substr) builtin; 53 54 dcl syserr ext entry options (variable), 55 (boot_tape_io$read, 56 boot_tape_io$backspace, 57 boot_tape_io$rewind, 58 tape_checksum_ entry (ptr, ptr), 59 (boot_tape_io$init_tape, 60 boot_tape_io$final_tape)) entry; 61 62 1 1 1 2 /* Begin include file ...... mstr.incl.pl1 */ 1 3 /* Modified 2/11/74 by N. I. Morris */ 1 4 /* Modified 12/30/80 by J. A. Bush for bootable tape labels */ 1 5 /* Modified 12/14/82 by J. A. Bush to add version number to the record header */ 1 6 1 7 /* format: style4,delnl,insnl,indattr,ifthen,declareind10,dclind10 */ 1 8 dcl mstrp ptr; /* pointer to MST record */ 1 9 1 10 dcl 1 mstr based (mstrp) aligned, /* Multics standard tape mstr */ 1 11 2 head like mstr_header, /* tape record header */ 1 12 2 data bit (36864 refer (mstr.head.data_bit_len)), 1 13 /* record body */ 1 14 2 trail like mstr_trailer; /* record trailer */ 1 15 1 16 dcl 1 mst_label based (mstrp) aligned, /* bootable label structure */ 1 17 2 xfer_vector (4), /* bootload interrupt transfer vector */ 1 18 3 lda_instr bit (36), /* this will be a "LDA 4" instruction */ 1 19 3 tra_instr bit (36), /* a "TRA" instruction to start of boot pgm */ 1 20 2 head like mstr_header, /* standard record header */ 1 21 2 vid like volume_identifier, /* tape volume info */ 1 22 2 fv_overlay (0:31), /* overlay for fault vectors when tape booted */ 1 23 3 scu_instr bit (36), /* an "SCU" instruction to address of fault_data */ 1 24 3 dis_instr bit (36), /* a "DIS" instruction, with Y field = to its own addr */ 1 25 2 fault_data (8) bit (36), /* SCU data for unexpected faults goes here */ 1 26 2 boot_pgm_path char (168) unaligned, /* path name of boot program */ 1 27 2 userid char (32) unaligned, /* Storage for Person.Project.Instance of creator of tape */ 1 28 2 label_version fixed bin, /* defined by LABEL_VERSION constant below */ 1 29 2 output_mode fixed bin, /* mode in which tape was written with */ 1 30 2 boot_pgm_len fixed bin, /* length in words of boot program */ 1 31 2 copyright char (56), /* Protection notice goes here if boot pgm is written */ 1 32 2 pad (13) bit (36), /* pad out to 192 (300 octal) */ 1 33 2 boot_pgm (0 refer (mst_label.boot_pgm_len)) bit (36), 1 34 /* boot program */ 1 35 2 trail like mstr_trailer; /* standard record trailer */ 1 36 1 37 dcl 1 mstr_header based aligned, /* Multics standard tape record header */ 1 38 ( 2 c1 bit (36), /* constant = 670314355245(8) */ 1 39 2 uid bit (72), /* unique ID */ 1 40 2 rec_within_file fixed bin (17), /* phys. rec. # within phys. file */ 1 41 2 phy_file fixed bin (17), /* phys. file # on phys. tape */ 1 42 2 data_bits_used fixed bin (17), /* # of bits of data in record */ 1 43 2 data_bit_len fixed bin (17), /* bit length of data space */ 1 44 2 flags, /* record flags */ 1 45 3 admin bit (1), /* admin record flag */ 1 46 3 label bit (1), /* label record flag */ 1 47 3 eor bit (1), /* end-of-reel record flag */ 1 48 3 pad1 bit (11), 1 49 3 set bit (1), /* ON if any of following items set */ 1 50 3 repeat bit (1), /* repeated record flag */ 1 51 3 padded bit (1), /* record contains padding flag */ 1 52 3 eot bit (1), /* EOT reflector encountered flag */ 1 53 3 drain bit (1), /* synchronous write flag */ 1 54 3 continue bit (1), /* continue on next reel flag */ 1 55 3 pad2 bit (4), 1 56 2 header_version fixed bin (3) unsigned, /* current header version number */ 1 57 2 repeat_count fixed bin (8), /* repetition count */ 1 58 2 checksum bit (36), /* checksum of header and trailer */ 1 59 2 c2 bit (36) 1 60 ) unal; /* constant = 512556146073(8) */ 1 61 1 62 dcl 1 mstr_trailer based aligned, /* Multics standard tape record trailer */ 1 63 ( 2 c1 bit (36), /* constant = 107463422532(8) */ 1 64 2 uid bit (72), /* unique ID (matches header) */ 1 65 2 tot_data_bits fixed bin (35), /* total data bits written on logical tape */ 1 66 2 pad_pattern bit (36), /* padding pattern */ 1 67 2 reel_num fixed bin (11), /* reel sequence # */ 1 68 2 tot_file fixed bin (23), /* phys. file number */ 1 69 2 tot_rec fixed bin (35), /* phys. record # for logical tape */ 1 70 2 c2 bit (36) 1 71 ) unal; /* constant = 265221631704(8) */ 1 72 1 73 dcl 1 volume_identifier based aligned, /* tape volume info */ 1 74 ( 2 installation_id char (32), /* installation that created tape */ 1 75 2 tape_reel_id char (32), /* tape reel name */ 1 76 2 volume_set_id char (32) 1 77 ) unaligned; /* name of the volume set */ 1 78 1 79 dcl ( 1 80 header_c1 init ("670314355245"b3), 1 81 header_c2 init ("512556146073"b3), 1 82 trailer_c1 init ("107463422532"b3), 1 83 trailer_c2 init ("265221631704"b3), 1 84 label_c1 init ("000004235000"b3) 1 85 ) bit (36) static; 1 86 1 87 dcl LABEL_VERSION fixed bin static options (constant) init (3); 1 88 /* current label version */ 1 89 dcl HEADER_VERSION fixed bin static options (constant) init (1); 1 90 /* current header version */ 1 91 1 92 /* End of include file ...... mstr.incl.pl1 */ 1 93 63 64 65 66 67 /* */ 68 69 datap = p; /* Get pointer to data target. */ 70 count = n; /* Get # of words to be read. */ 71 72 cur_p = addr (physical_record_buffer$.cur_rec); /* Get pointer to current record header. */ 73 cur_dp = addr (cur_p -> mstr.data); /* Get pointer to current record data. */ 74 75 reader_loop: 76 words_left = divide (cur_p -> mstr_header.data_bits_used, 36, 18, 0) - physical_record_buffer$.index; 77 /* Compute # of words remaining in tape buffer. */ 78 if words_left = 0 then do; /* If current buffer is used up ... */ 79 cur_tp = addr (cur_p -> mstr.trail); /* Get a pointer to current record trailer. */ 80 exprec = cur_tp -> mstr_trailer.tot_rec + 1; /* Compute next expected record number. */ 81 call get_next_buffer; /* Refill the record buffer. */ 82 physical_record_buffer$.index = 0; /* Reset index to buffer. */ 83 go to reader_loop; /* Now use new record. */ 84 end; 85 86 copy_words = min (count, words_left); /* Copy as many words as possible. */ 87 count = count - copy_words; /* Decrement count of remaining words to copy. */ 88 if copy_words > 0 then datap -> data = addrel (cur_dp, physical_record_buffer$.index) -> data; 89 /* Copy the data. */ 90 physical_record_buffer$.index = physical_record_buffer$.index + copy_words; 91 /* Increment tape buffer index. */ 92 datap = addrel (datap, copy_words); /* Bump the target data pointer. */ 93 if count > 0 then go to reader_loop; /* Continue, if any words remaining. */ 94 95 return; /* All finsihed. Return to caller. */ 96 97 98 /* */ 99 100 get_next_buffer: proc; 101 102 103 retries = 0; /* Initialize retry count. */ 104 105 retry: if retries > 64 then /* Give up after 64 tries. */ 106 call syserr (1, "tape_reader: Unable to read system tape."); 107 nrecs = 0; /* Initialize record count. */ 108 109 again: nrecs = nrecs + 1; /* Count one record. */ 110 111 eof: call do_io (boot_tape_io$read, "001100000010000"b); /* Read a tape record. */ 112 if majstat ^= 0 then do; /* If non-zero major status ... */ 113 if majstat = 3 then /* If device data alert ... */ 114 go to again; /* Try reading again. */ 115 if majstat = 4 then /* If EOF ... */ 116 go to eof; 117 if majstat = 11 then /* If MPC device data alert ... */ 118 go to again; 119 end; 120 121 if cur_p -> mstr_header.c1 ^= header_c1 | /* Compare check bit patterns. */ 122 cur_p -> mstr_header.c2 ^= header_c2 | 123 cur_tp -> mstr_trailer.c1 ^= trailer_c1 | 124 cur_tp -> mstr_trailer.c2 ^= trailer_c2 then 125 go to again; 126 127 call tape_checksum_ (cur_p, addr (checksum)); /* Compute record checksum. */ 128 if checksum ^= cur_p -> mstr_header.checksum then 129 go to again; /* Check the checksum. */ 130 if cur_p -> mstr_header.flags.admin then /* If administrative record ... */ 131 go to admin_record; /* Handle it properly. */ 132 validate: 133 if cur_tp -> mstr_trailer.tot_rec < exprec then 134 go to retry; /* If we backspaced too much. */ 135 if cur_tp -> mstr_trailer.tot_rec > exprec then 136 go to back_up; /* If we read too much. */ 137 138 return; /* Record OK. Return. */ 139 140 141 admin_record: 142 if cur_p -> mstr_header.flags.eor then /* If end of reel ... */ 143 go to validate; 144 go to again; /* Otherwise, ignore as spurious. */ 145 146 147 back_up: retries = retries + 1; /* Count another attempt. */ 148 do i = 1 to nrecs + 2; /* Back the tape up. */ 149 call do_io (boot_tape_io$backspace, "000110000000000"b); 150 if majstat = 5 then go to retry; /* If at BOT, retry reading. */ 151 end; 152 go to retry; 153 154 end get_next_buffer; 155 156 /* */ 157 158 init: entry; 159 160 call boot_tape_io$init_tape; /* Initialize tape I/O package. */ 161 tape_count = 0; /* Initialize count of tapes. */ 162 return; /* Return to caller. */ 163 164 165 final: entry; 166 167 call do_io (boot_tape_io$rewind, (15)"0"b); /* Rewind the last tape. */ 168 call boot_tape_io$final_tape; /* Turn off the tape I/O package. */ 169 return; 170 171 172 173 do_io: proc (e, s); 174 175 dcl e entry (fixed bin (5)), /* boot_tape_io entry to call */ 176 s bit (15) aligned; /* control bits for examining major status */ 177 178 179 call: call e (majstat); /* Call boot_tape_io routine. */ 180 181 if majstat ^= 0 then /* If tape error ... */ 182 if majstat >= 16 then /* If power off bit is on ... */ 183 go to call; /* Try over again. */ 184 else if substr (s, majstat, 1) then /* If control bit on ... */ 185 return; /* Let caller handle this. */ 186 else if majstat <= 2 then /* If attention or busy ... */ 187 go to call; /* Try again. */ 188 else /* Otherwise ... */ 189 call syserr (1, "tape_reader: bad major status = ^o", majstat); 190 191 return; 192 193 194 end do_io; 195 196 /* BEGIN MESSAGE DOCUMENTATION 197* 198* Message: 199* tape_reader: unable to read system tape 200* 201* S: $crash 202* 203* T: $init 204* 205* M: The bootload tape is unreadable. 206* 207* A: $boot_tape 208* 209* Message: 210* tape_reader: bad_major_status: SSS 211* 212* S: $crash 213* 214* T: $init 215* 216* M: The bootload tape is unreadable. 217* 218* A: $boot_tape 219* Try another tape drive. 220* 221* END MESSAGE DOCUMENTATION */ 222 223 end tape_reader; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 11/11/89 0816.1 tape_reader.pl1 >spec>install>1112>tape_reader.pl1 63 1 12/20/82 1113.8 mstr.incl.pl1 >ldd>include>mstr.incl.pl1 NAMES DECLARED IN THIS COMPILATION. IDENTIFIER OFFSET LOC STORAGE CLASS DATA TYPE ATTRIBUTES AND REFERENCES (* indicates a set context) NAMES DECLARED BY DECLARE STATEMENT. addr builtin function dcl 52 ref 72 73 79 127 127 addrel builtin function dcl 52 ref 88 92 admin 5 based bit(1) level 3 packed packed unaligned dcl 1-37 ref 130 boot_tape_io$backspace 000020 constant entry external dcl 54 ref 149 149 boot_tape_io$final_tape 000030 constant entry external dcl 54 ref 168 boot_tape_io$init_tape 000026 constant entry external dcl 54 ref 160 boot_tape_io$read 000016 constant entry external dcl 54 ref 111 111 boot_tape_io$rewind 000022 constant entry external dcl 54 ref 167 167 c1 based bit(36) level 2 in structure "mstr_header" packed packed unaligned dcl 1-37 in procedure "tape_reader" ref 121 c1 based bit(36) level 2 in structure "mstr_trailer" packed packed unaligned dcl 1-62 in procedure "tape_reader" ref 121 c2 7 based bit(36) level 2 in structure "mstr_header" packed packed unaligned dcl 1-37 in procedure "tape_reader" ref 121 c2 7 based bit(36) level 2 in structure "mstr_trailer" packed packed unaligned dcl 1-62 in procedure "tape_reader" ref 121 checksum 000120 automatic bit(36) dcl 31 in procedure "tape_reader" set ref 127 127 128 checksum 6 based bit(36) level 2 in structure "mstr_header" packed packed unaligned dcl 1-37 in procedure "tape_reader" ref 128 copy_words 000114 automatic fixed bin(18,0) dcl 31 set ref 86* 87 88 88 90 92 count 000112 automatic fixed bin(18,0) dcl 31 set ref 70* 86 87* 87 93 cur_dp 000102 automatic pointer dcl 31 set ref 73* 88 cur_p 000100 automatic pointer dcl 31 set ref 72* 73 75 79 121 121 127* 128 130 141 cur_rec 1 000012 external static fixed bin(17,0) array level 2 dcl 47 set ref 72 cur_tp 000104 automatic pointer dcl 31 set ref 79* 80 121 121 132 135 data based fixed bin(35,0) array dcl 45 in procedure "tape_reader" set ref 88* 88 data 10 based bit level 2 in structure "mstr" dcl 1-10 in procedure "tape_reader" set ref 73 data_bit_len 4(18) based fixed bin(17,0) level 3 packed packed unaligned dcl 1-10 ref 73 79 data_bits_used 4 based fixed bin(17,0) level 2 packed packed unaligned dcl 1-37 ref 75 datap 000110 automatic pointer dcl 31 set ref 69* 88 92* 92 divide builtin function dcl 52 ref 75 e parameter entry variable dcl 175 ref 173 179 eor 5(02) based bit(1) level 3 packed packed unaligned dcl 1-37 ref 141 exprec 000106 automatic fixed bin(18,0) dcl 31 set ref 80* 132 135 flags 5 based structure level 2 packed packed unaligned dcl 1-37 head based structure level 2 dcl 1-10 header_c1 000003 constant bit(36) initial packed unaligned dcl 1-79 ref 121 header_c2 000002 constant bit(36) initial packed unaligned dcl 1-79 ref 121 i 000121 automatic fixed bin(17,0) dcl 31 set ref 148* index 000012 external static fixed bin(17,0) level 2 packed packed unaligned dcl 47 set ref 75 82* 88 90* 90 majstat 000117 automatic fixed bin(5,0) dcl 31 set ref 112 113 115 117 150 179* 181 181 184 186 188* min builtin function dcl 52 ref 86 mstr based structure level 1 dcl 1-10 mstr_header based structure level 1 dcl 1-37 mstr_trailer based structure level 1 dcl 1-62 n parameter fixed bin(18,0) dcl 28 ref 26 70 nrecs 000115 automatic fixed bin(17,0) dcl 31 set ref 107* 109* 109 148 p parameter pointer dcl 28 ref 26 69 physical_record_buffer$ 000012 external static structure level 1 unaligned dcl 47 retries 000116 automatic fixed bin(17,0) dcl 31 set ref 103* 105 147* 147 s parameter bit(15) dcl 175 ref 173 184 substr builtin function dcl 52 ref 184 syserr 000014 constant entry external dcl 54 ref 105 188 tape_checksum_ 000024 constant entry external dcl 54 ref 127 tape_count 000010 internal static fixed bin(17,0) dcl 43 set ref 161* tot_rec 6 based fixed bin(35,0) level 2 packed packed unaligned dcl 1-62 ref 80 132 135 trail based structure level 2 dcl 1-10 set ref 79 trailer_c1 000001 constant bit(36) initial packed unaligned dcl 1-79 ref 121 trailer_c2 000000 constant bit(36) initial packed unaligned dcl 1-79 ref 121 volume_identifier based structure level 1 dcl 1-73 words_left 000113 automatic fixed bin(18,0) dcl 31 set ref 75* 78 86 NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. HEADER_VERSION internal static fixed bin(17,0) initial dcl 1-89 LABEL_VERSION internal static fixed bin(17,0) initial dcl 1-87 label_c1 internal static bit(36) initial packed unaligned dcl 1-79 mst_label based structure level 1 dcl 1-16 mstrp automatic pointer dcl 1-8 NAMES DECLARED BY EXPLICIT CONTEXT. admin_record 000336 constant label dcl 141 ref 130 again 000246 constant label dcl 109 set ref 113 117 121 128 144 back_up 000342 constant label dcl 147 ref 135 call 000374 constant label dcl 179 ref 181 186 do_io 000372 constant entry internal dcl 173 ref 111 149 167 eof 000247 constant label dcl 111 ref 115 final 000172 constant entry external dcl 165 get_next_buffer 000216 constant entry internal dcl 100 ref 81 init 000154 constant entry external dcl 158 reader_loop 000062 constant label dcl 75 ref 83 93 retry 000220 constant label dcl 105 ref 132 150 152 tape_reader 000042 constant entry external dcl 26 validate 000330 constant label dcl 132 ref 141 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 610 642 464 620 Length 1036 464 32 160 123 2 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME tape_reader 158 external procedure is an external procedure. get_next_buffer internal procedure shares stack frame of external procedure tape_reader. do_io internal procedure shares stack frame of external procedure tape_reader. STORAGE FOR INTERNAL STATIC VARIABLES. LOC IDENTIFIER BLOCK NAME 000010 tape_count tape_reader STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME tape_reader 000100 cur_p tape_reader 000102 cur_dp tape_reader 000104 cur_tp tape_reader 000106 exprec tape_reader 000110 datap tape_reader 000112 count tape_reader 000113 words_left tape_reader 000114 copy_words tape_reader 000115 nrecs tape_reader 000116 retries tape_reader 000117 majstat tape_reader 000120 checksum tape_reader 000121 i tape_reader THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. call_ent_var call_ext_out_desc call_ext_out return_mac ext_entry THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. boot_tape_io$backspace boot_tape_io$final_tape boot_tape_io$init_tape boot_tape_io$read boot_tape_io$rewind syserr tape_checksum_ THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. physical_record_buffer$ LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 26 000036 69 000047 70 000053 72 000055 73 000060 75 000062 78 000074 79 000075 80 000104 81 000110 82 000111 83 000115 86 000116 87 000122 88 000124 90 000137 92 000144 93 000150 95 000152 158 000153 160 000161 161 000166 162 000170 165 000171 167 000177 168 000210 169 000215 100 000216 103 000217 105 000220 107 000245 109 000246 111 000247 112 000260 113 000262 115 000264 117 000266 121 000270 127 000306 128 000321 130 000325 132 000330 135 000334 138 000335 141 000336 144 000341 147 000342 148 000343 149 000353 150 000364 151 000367 152 000371 173 000372 179 000374 181 000403 184 000407 186 000416 188 000420 191 000445 ----------------------------------------------------------- Historical Background This edition of the Multics software materials and documentation is provided and donated to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. as a contribution to computer science knowledge. This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL and BULL HN Information Systems Inc. to the development of this operating system. Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture for managing computer hardware properly and for executing programs. Many subsequent operating systems incorporated Multics principles. Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . ----------------------------------------------------------- Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without fee is hereby granted,provided that the below copyright notice and historical background appear in all copies and that both the copyright notice and historical background and this permission notice appear in supporting documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining to distribution of the programs without specific prior written permission. Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. Copyright 2006 by BULL HN Information Systems Inc. Copyright 2006 by Bull SAS All Rights Reserved