COMPILATION LISTING OF SEGMENT tape_mult_labeler_ 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 1004.7 mst Sat Options: optimize map 1 /****^ *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Bull Inc., 1987 * 4* * * 5* * Copyright, (C) Honeywell Information Systems Inc., 1982 * 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-10-13,GWMay), approve(86-10-13,MCR7552), 17* audit(86-10-13,Martinson), install(86-10-20,MR12.0-1189): 18* Moved density determining code to tape_mult_read_$label. Added the tmdb 19* initialization code, removed from tape_mult_read_ to this module. 20* 2) change(86-10-22,GWMay), approve(86-10-22,PBF7552), 21* audit(86-10-24,Martinson), install(86-11-21,MR12.0-1223): 22* removed added init values which caused some operations to not work. 23* The above comment (1) is in error. The density determining code was not 24* removed from this module. The actual movement of code was from 25* tape_mult_open_.pl1 to tape_mult_read_.pl1 26* 3) change(87-01-07,GWMay), approve(87-01-07,PBF7552), audit(87-01-08,Farley), 27* install(87-01-12,MR12.0-1268): 28* move init of tmdb.opt.blp to before read of tape label. 29* END HISTORY COMMENTS */ 30 31 32 /* format: style4,delnl,insnl,indattr,ifthen,declareind10,dclind10 */ 33 tape_mult_labeler_: 34 procedure; 35 36 /* This program is part of the Multics standard tape I/O module, tape_mult_. 37* * 38* * Created on 10/26/74 by Bill Silver. 39* * Modified 3/80 by R.J.C. Kissel to fix a label writing bug. 40* * Modified 1/2/81 by J. A. Bush for bootable tape labels 41* * Modified 8/13/81 by J. A. Bush for pre-MR9.0 label compatibility 42* * Modified 8/82 by S. Krupp to change from tdcm_ to tape_ioi_ interface. 43* * Modified 12/14/82 by J. A. Bush to add header label version 44* * Modified 1985-05-14, BIM: reset record length to full after writing 45* * label. 46* * Modified 1985-05-17, BIM: don't do an FSF command since its results 47* * can be unpredictable. 48* * 49* * This program is called to write or read the label of a Multics standard tape. 50**/ 51 52 /* ARGUMENTS */ 53 54 dcl arg_error_code fixed bin (35), /* (O) Standard system error code. */ 55 arg_tmdbp ptr, /* (I) Pointer to tseg set up by tape_. */ 56 arg_volid char (*); /* (I/O) Tape reel ID. */ 57 58 59 /* AUTOMATIC DATA */ 60 61 dcl act_length fixed bin (21), /* Actual length of buffer allocated. */ 62 act_number fixed bin, /* Actual number of buffers allocated. */ 63 dummy_arrayp ptr, /* Designates array of pointers to newly alocated I/O buffers. */ 64 error_code fixed bin (35), /* Standard system error code. */ 65 n_bufs fixed bin, /* Number of buffers currently being allocated. */ 66 record_data_len fixed bin, /* Number of chars in data portion of label record. */ 67 record_data_size fixed bin, /* Number of words in data portion of label record. */ 68 record_size fixed bin (21), /* Number of words in the physical label record. */ 69 tioi_id bit (36) aligned, /* Id for this tape_ioi_ activation. */ 70 tl_ptr ptr; /* Pointer to our tape label data. */ 71 72 /* BASED */ 73 74 dcl dummy_array (n_bufs) ptr based (dummy_arrayp); 75 76 /* EXTERNAL ENTRIES */ 77 78 dcl (addr, divide, hbound, null, size, string) 79 builtin; 80 81 dcl (error_table_$bad_label) 82 external fixed bin (35); 83 84 85 86 dcl tape_mult_read_$label entry (ptr, ptr, fixed bin, fixed bin (35)), 87 tape_mult_write_$eof entry (ptr, fixed bin (35)), 88 tape_mult_write_$label entry (ptr, fixed bin (35)); 89 1 1 /* START OF: tape_ioi_dcls.incl.pl1 * * * * * * * * * * * * * * * * */ 1 2 1 3 /* Written 22 April 1982 by Chris Jones */ 1 4 /* Modified September 1983 by Chris Jones for reserve_buffer and release_buffer */ 1 5 /* format: style4,delnl,insnl,indattr,ifthen,declareind10,dclind10 */ 1 6 1 7 /* call tape_ioi_$activate (rsc_ptr, tioi_info_ptr, tioi_id, code); */ 1 8 dcl tape_ioi_$activate entry (ptr, ptr, bit (36) aligned, fixed bin (35)); 1 9 1 10 /* call tape_ioi_$allocate_buffers (tioi_id, req_length, req_number, act_length, act_number, buffer_ptrs, code); */ 1 11 dcl tape_ioi_$allocate_buffers 1 12 entry (bit (36) aligned, fixed bin (21), fixed bin, fixed bin (21), fixed bin, 1 13 dim (*) ptr, fixed bin (35)); 1 14 1 15 /* call tape_ioi_$allocate_work_area (tioi_id, req_size, act_size, work_area_ptr, code); */ 1 16 dcl tape_ioi_$allocate_work_area 1 17 entry (bit (36) aligned, fixed bin (19), fixed bin (19), ptr, fixed bin (35)); 1 18 1 19 /* call tape_ioi_$buffer_status (tioi_id, buffer_ptr, tbs_ptr, code); */ 1 20 dcl tape_ioi_$buffer_status 1 21 entry (bit (36) aligned, ptr, ptr, fixed bin (35)); 1 22 1 23 /* call tape_ioi_$check_order (tioi_id, ocount, rx, code); */ 1 24 dcl tape_ioi_$check_order entry (bit (36) aligned, fixed bin, fixed bin, fixed bin (35)); 1 25 1 26 /* call tape_ioi_$check_read (tioi_id, buffer_ptr, data_len, rx, code); */ 1 27 dcl tape_ioi_$check_read entry (bit (36) aligned, ptr, fixed bin (21), fixed bin, fixed bin (35)); 1 28 1 29 /* call tape_ioi_$check_write (tioi_id, buffer_ptr, rx, code); */ 1 30 dcl tape_ioi_$check_write entry (bit (36) aligned, ptr, fixed bin, fixed bin (35)); 1 31 1 32 /* call tape_ioi_$deactivate (tioi_id, error_ptr, code); */ 1 33 dcl tape_ioi_$deactivate entry (bit (36) aligned, ptr, fixed bin (35)); 1 34 1 35 /* call tape_ioi_$deallocate (tioi_id, code); */ 1 36 dcl tape_ioi_$deallocate entry (bit (36) aligned, fixed bin (35)); 1 37 1 38 /* call tape_ioi_$deallocate_buffers (tioi_id, code); */ 1 39 dcl tape_ioi_$deallocate_buffers 1 40 entry (bit (36) aligned, fixed bin (35)); 1 41 1 42 /* call tape_ioi_$get_mode (tioi_id, mode, data_ptr, code); */ 1 43 dcl tape_ioi_$get_mode entry (bit (36) aligned, char (*), ptr, fixed bin (35)); 1 44 1 45 /* call tape_ioi_$get_statistics (tioi_id, tec_ptr, code); */ 1 46 dcl tape_ioi_$get_statistics 1 47 entry (bit (36) aligned, ptr, fixed bin (35)); 1 48 1 49 /* call tape_ioi_$hardware_status (tioi_id, ths_ptr, code); */ 1 50 dcl tape_ioi_$hardware_status 1 51 entry (bit (36) aligned, ptr, fixed bin (35)); 1 52 1 53 /* call tape_ioi_$list_buffers (tioi_id, state, buffer_ptrs, num_buffers, code); */ 1 54 dcl tape_ioi_$list_buffers entry (bit (36) aligned, fixed bin, dim (*) ptr, fixed bin, fixed bin (35)); 1 55 1 56 /* call tape_ioi_$order (tioi_id, order, count, data_ptr, ocount, rx, code); */ 1 57 dcl tape_ioi_$order entry (bit (36) aligned, char (4), fixed bin, ptr, fixed bin, fixed bin, fixed bin (35)); 1 58 1 59 /* call tape_ioi_$queue_order (tioi_id, order, count, data_ptr, code); */ 1 60 dcl tape_ioi_$queue_order entry (bit (36) aligned, char (4), fixed bin, ptr, fixed bin (35)); 1 61 1 62 /* call tape_ioi_$queue_read (tioi_id, buffer_ptr, code); */ 1 63 dcl tape_ioi_$queue_read entry (bit (36) aligned, ptr, fixed bin (35)); 1 64 1 65 /* call tape_ioi_$queue_write (tioi_id, buffer_ptr, data_len, code); */ 1 66 dcl tape_ioi_$queue_write entry (bit (36) aligned, ptr, fixed bin (21), fixed bin (35)); 1 67 1 68 /* call tape_ioi_$read (tioi_id, buffer_ptr, data_len, rx, code); */ 1 69 dcl tape_ioi_$read entry (bit (36) aligned, ptr, fixed bin (21), fixed bin, fixed bin (35)); 1 70 1 71 /* call tape_ioi_$release_buffer (tioi_id, buffer_ptr, code); */ 1 72 dcl tape_ioi_$release_buffer 1 73 entry (bit (36) aligned, ptr, fixed bin (35)); 1 74 1 75 /* call tape_ioi_$reserve_buffer (tioi_id, buffer_ptr, code); */ 1 76 dcl tape_ioi_$reserve_buffer 1 77 entry (bit (36) aligned, ptr, fixed bin (35)); 1 78 1 79 /* call tape_ioi_$reset_statistics (tioi_id, code); */ 1 80 dcl tape_ioi_$reset_statistics 1 81 entry (bit (36) aligned, fixed bin (35)); 1 82 1 83 /* call tape_ioi_$set_buffer_ready (tioi_id, buffer_ptr, code); */ 1 84 dcl tape_ioi_$set_buffer_ready 1 85 entry (bit (36) aligned, ptr, fixed bin (35)); 1 86 1 87 /* call tape_ioi_$set_mode (tioi_id, mode, data_ptr, code); */ 1 88 dcl tape_ioi_$set_mode entry (bit (36) aligned, char (*), ptr, fixed bin (35)); 1 89 1 90 /* call tape_ioi_$stop_tape (tioi_id, count, rx, code); */ 1 91 dcl tape_ioi_$stop_tape entry (bit (36) aligned, fixed bin, fixed bin, fixed bin (35)); 1 92 1 93 /* call tape_ioi_$write (tioi_id, write_buffer_ptrs, data_len, buffer_ptr, rx, code); */ 1 94 dcl tape_ioi_$write entry (bit (36) aligned, (*) ptr, fixed bin (21), ptr, fixed bin, fixed bin (35)); 1 95 1 96 /* END OF: tape_ioi_dcls.incl.pl1 * * * * * * * * * * * * * * * * */ 90 91 2 1 /* Begin include file ... tmdb.incl.pl1 2 2* * 2 3* * Created by Bill Silver on 10/20/74 2 4* * Modified by J. A. Bush 12/30/80 for bootable tape labels 2 5* * Modified by J. A. Bush 12/15/81 for re-write of read error recovery 2 6* * Modified 8/82 by S.Krupp for change from tdcm_ to tape_ioi_ 2 7* * This include file describes the work variables used by the Multics standard 2 8* * tape I/O module, tape_mult_. This include file must be used with the include 2 9* * file: mstr.incl.pl1 2 10**/ 2 11 2 12 2 13 /****^ HISTORY COMMENTS: 2 14* 1) change(86-10-13,GWMay), approve(86-10-13,MCR7552), 2 15* audit(86-10-13,Martinson), install(86-10-20,MR12.0-1189): 2 16* added fields to the tmdb structure that will add support for the use of 2 17* rcp in determining the density and format of a tape. 2 18* END HISTORY COMMENTS */ 2 19 2 20 2 21 /* format: style4,delnl,insnl,indattr,ifthen,declareind10,dclind10 */ 2 22 dcl tmdb_ptr ptr; /* Pointer to tape_mult_ data block. */ 2 23 2 24 dcl 1 tmdb based (tmdb_ptr) aligned, /* tape_mult_ data block. */ 2 25 2 attach, /* Attach description. */ 2 26 3 length fixed bin, /* Actual length of attach description. */ 2 27 3 description char (64), /* Attach description string. */ 2 28 2 open, /* Open description. */ 2 29 3 length fixed bin, /* Actual length of open description. */ 2 30 3 description char (32), /* Open description string. */ 2 31 2 opt, /* Attach options. */ 2 32 3 flags, /* Flags set from user input and options. */ 2 33 ( 4 com_err bit (1), /* ON => call com_err_ if there is an error. */ 2 34 4 ring bit (1), /* ON => use writ ring, OFF => no write ring. */ 2 35 4 system bit (1), /* ON => user wants to be a system process. */ 2 36 4 err_tal bit (1), /* ON => user wants error report */ 2 37 4 begin bit (1), /* ON => begin processing tape */ 2 38 4 write_sw bit (1), /* ON => write allowed */ 2 39 4 async_sw bit (1) /* ON => user is prepared for errors to imply that previous put_chars failed. */ 2 40 ) unaligned, /* ON => user wants error tally displayed on closing */ 2 41 3 reel_name char (32) unal, /* Tape reel slot ID. */ 2 42 3 volume_set_id char (32) unal, /* volume set name */ 2 43 3 mount_mode char (7), /* Mount mode: "writing" or "reading". */ 2 44 3 tracks fixed bin, /* Either 9 or 7. */ 2 45 3 density fixed bin, /* Either 1600 or 800. */ 2 46 3 tbpp ptr, /* If not null, ptr to temp seg containing boot program */ 2 47 3 blp ptr, /* Ptr to buffer containing boot label record (READ ONLY) */ 2 48 3 speed bit (36), /* bits are 75, 125, 200 ips */ 2 49 3 comment char (64), /* User comment to operator. */ 2 50 2 head like mstr_header, /* Dummy tape record header. */ 2 51 2 trail like mstr_trailer, /* Dummy tape record trailer. */ 2 52 2 work, /* Work variables used. */ 2 53 3 flags, /* Flags we need that aren't in head.flags. */ 2 54 ( 4 eod bit (1), /* ON => end of good data. */ 2 55 4 eof bit (1), /* ON => End of File. */ 2 56 4 bot bit (1), /* ON => beginning of tape */ 2 57 4 retry_read bit (1), /* ON => try reread recovery */ 2 58 4 read_fwd bit (1), /* ON => want to read forward (recovery) */ 2 59 4 fatal_read_error bit (1), /* ON => read error recovery failed. */ 2 60 4 data_loss bit (1) /* ON => read something, but with evidence that we lost something */ 2 61 ) unaligned, 2 62 3 rcp_id bit (36), /* Id of current tape drive attachment */ 2 63 3 tioi_id bit (36), /* Id of current tape_ioi_ activation */ 2 64 3 label_uid bit (72), /* Unique ID of label record. */ 2 65 3 label_version fixed bin, /* version of label, returned on read */ 2 66 3 output_mode fixed bin, /* output mode tape was written with */ 2 67 3 buf_pos fixed bin, /* Current position within current bufffer. */ 2 68 3 curr_buf ptr, /* Current buffer being processed. */ 2 69 3 next_buf ptr, /* Next buffer to be processed. */ 2 70 3 rec_length fixed bin (21), /* Length of data record in characters. */ 2 71 3 n_full fixed bin, /* Number of buffers ready to write. */ 2 72 3 n_recs_to_eof fixed bin, /* Num recs to write pre eof mark. */ 2 73 3 n_bufs fixed bin, /* Total number of buffers. */ 2 74 3 bufs_per_subset fixed bin, /* Number of buffers per subset. */ 2 75 3 buf_len fixed bin (21), /* Length of a buffer. */ 2 76 3 buffer (8) ptr, /* Pointers to a subset of I/O buffers. */ 2 77 2 meters, 2 78 3 fwd_rd_recovery fixed bin, 2 79 3 reposition_recovery 2 80 fixed bin, 2 81 2 channels, 2 82 3 rcp fixed bin(71), /* Regular, used by rcp. */ 2 83 3 ioi fixed bin(71), /* Fast, used by ioi. */ 2 84 2 buffer (1040) fixed bin (35), /* Work buffer (currently used for label I/O). */ 2 85 2 volume_density fixed bin, /* either the input from -den or the value */ 2 86 2 87 /* returned by rcp_$check_attach in tape_info */ 2 88 2 volume_format char (16); /* determined by rcp_ */ 2 89 /* End of include file ... tmdb.incl.pl1 */ 92 93 3 1 3 2 /* Begin include file ...... mstr.incl.pl1 */ 3 3 /* Modified 2/11/74 by N. I. Morris */ 3 4 /* Modified 12/30/80 by J. A. Bush for bootable tape labels */ 3 5 /* Modified 12/14/82 by J. A. Bush to add version number to the record header */ 3 6 3 7 /* format: style4,delnl,insnl,indattr,ifthen,declareind10,dclind10 */ 3 8 dcl mstrp ptr; /* pointer to MST record */ 3 9 3 10 dcl 1 mstr based (mstrp) aligned, /* Multics standard tape mstr */ 3 11 2 head like mstr_header, /* tape record header */ 3 12 2 data bit (36864 refer (mstr.head.data_bit_len)), 3 13 /* record body */ 3 14 2 trail like mstr_trailer; /* record trailer */ 3 15 3 16 dcl 1 mst_label based (mstrp) aligned, /* bootable label structure */ 3 17 2 xfer_vector (4), /* bootload interrupt transfer vector */ 3 18 3 lda_instr bit (36), /* this will be a "LDA 4" instruction */ 3 19 3 tra_instr bit (36), /* a "TRA" instruction to start of boot pgm */ 3 20 2 head like mstr_header, /* standard record header */ 3 21 2 vid like volume_identifier, /* tape volume info */ 3 22 2 fv_overlay (0:31), /* overlay for fault vectors when tape booted */ 3 23 3 scu_instr bit (36), /* an "SCU" instruction to address of fault_data */ 3 24 3 dis_instr bit (36), /* a "DIS" instruction, with Y field = to its own addr */ 3 25 2 fault_data (8) bit (36), /* SCU data for unexpected faults goes here */ 3 26 2 boot_pgm_path char (168) unaligned, /* path name of boot program */ 3 27 2 userid char (32) unaligned, /* Storage for Person.Project.Instance of creator of tape */ 3 28 2 label_version fixed bin, /* defined by LABEL_VERSION constant below */ 3 29 2 output_mode fixed bin, /* mode in which tape was written with */ 3 30 2 boot_pgm_len fixed bin, /* length in words of boot program */ 3 31 2 copyright char (56), /* Protection notice goes here if boot pgm is written */ 3 32 2 pad (13) bit (36), /* pad out to 192 (300 octal) */ 3 33 2 boot_pgm (0 refer (mst_label.boot_pgm_len)) bit (36), 3 34 /* boot program */ 3 35 2 trail like mstr_trailer; /* standard record trailer */ 3 36 3 37 dcl 1 mstr_header based aligned, /* Multics standard tape record header */ 3 38 ( 2 c1 bit (36), /* constant = 670314355245(8) */ 3 39 2 uid bit (72), /* unique ID */ 3 40 2 rec_within_file fixed bin (17), /* phys. rec. # within phys. file */ 3 41 2 phy_file fixed bin (17), /* phys. file # on phys. tape */ 3 42 2 data_bits_used fixed bin (17), /* # of bits of data in record */ 3 43 2 data_bit_len fixed bin (17), /* bit length of data space */ 3 44 2 flags, /* record flags */ 3 45 3 admin bit (1), /* admin record flag */ 3 46 3 label bit (1), /* label record flag */ 3 47 3 eor bit (1), /* end-of-reel record flag */ 3 48 3 pad1 bit (11), 3 49 3 set bit (1), /* ON if any of following items set */ 3 50 3 repeat bit (1), /* repeated record flag */ 3 51 3 padded bit (1), /* record contains padding flag */ 3 52 3 eot bit (1), /* EOT reflector encountered flag */ 3 53 3 drain bit (1), /* synchronous write flag */ 3 54 3 continue bit (1), /* continue on next reel flag */ 3 55 3 pad2 bit (4), 3 56 2 header_version fixed bin (3) unsigned, /* current header version number */ 3 57 2 repeat_count fixed bin (8), /* repetition count */ 3 58 2 checksum bit (36), /* checksum of header and trailer */ 3 59 2 c2 bit (36) 3 60 ) unal; /* constant = 512556146073(8) */ 3 61 3 62 dcl 1 mstr_trailer based aligned, /* Multics standard tape record trailer */ 3 63 ( 2 c1 bit (36), /* constant = 107463422532(8) */ 3 64 2 uid bit (72), /* unique ID (matches header) */ 3 65 2 tot_data_bits fixed bin (35), /* total data bits written on logical tape */ 3 66 2 pad_pattern bit (36), /* padding pattern */ 3 67 2 reel_num fixed bin (11), /* reel sequence # */ 3 68 2 tot_file fixed bin (23), /* phys. file number */ 3 69 2 tot_rec fixed bin (35), /* phys. record # for logical tape */ 3 70 2 c2 bit (36) 3 71 ) unal; /* constant = 265221631704(8) */ 3 72 3 73 dcl 1 volume_identifier based aligned, /* tape volume info */ 3 74 ( 2 installation_id char (32), /* installation that created tape */ 3 75 2 tape_reel_id char (32), /* tape reel name */ 3 76 2 volume_set_id char (32) 3 77 ) unaligned; /* name of the volume set */ 3 78 3 79 dcl ( 3 80 header_c1 init ("670314355245"b3), 3 81 header_c2 init ("512556146073"b3), 3 82 trailer_c1 init ("107463422532"b3), 3 83 trailer_c2 init ("265221631704"b3), 3 84 label_c1 init ("000004235000"b3) 3 85 ) bit (36) static; 3 86 3 87 dcl LABEL_VERSION fixed bin static options (constant) init (3); 3 88 /* current label version */ 3 89 dcl HEADER_VERSION fixed bin static options (constant) init (1); 3 90 /* current header version */ 3 91 3 92 /* End of include file ...... mstr.incl.pl1 */ 3 93 94 95 4 1 /* Begin include file ..... iox_modes.incl.pl1 */ 4 2 4 3 /* Written by C. D. Tavares, 03/17/75 */ 4 4 /* Updated 10/31/77 by CDT to include short iox mode strings */ 4 5 4 6 dcl iox_modes (13) char (24) int static options (constant) aligned initial 4 7 ("stream_input", "stream_output", "stream_input_output", 4 8 "sequential_input", "sequential_output", "sequential_input_output", "sequential_update", 4 9 "keyed_sequential_input", "keyed_sequential_output", "keyed_sequential_update", 4 10 "direct_input", "direct_output", "direct_update"); 4 11 4 12 dcl short_iox_modes (13) char (4) int static options (constant) aligned initial 4 13 ("si", "so", "sio", "sqi", "sqo", "sqio", "squ", "ksqi", "ksqo", "ksqu", "di", "do", "du"); 4 14 4 15 dcl (Stream_input initial (1), 4 16 Stream_output initial (2), 4 17 Stream_input_output initial (3), 4 18 Sequential_input initial (4), 4 19 Sequential_output initial (5), 4 20 Sequential_input_output initial (6), 4 21 Sequential_update initial (7), 4 22 Keyed_sequential_input initial (8), 4 23 Keyed_sequential_output initial (9), 4 24 Keyed_sequential_update initial (10), 4 25 Direct_input initial (11), 4 26 Direct_output initial (12), 4 27 Direct_update initial (13)) fixed bin int static options (constant); 4 28 4 29 /* End include file ..... iox_modes.incl.pl1 */ 96 97 98 write: 99 entry (arg_tmdbp, arg_error_code); 100 101 /* This entry is called to write the label record of a Multics standard tape. It 102* * must also write an EOF record after the label record. tape_mult_ will only 103* * write records of size 1024 words. 104**/ 105 106 tmdb_ptr = arg_tmdbp; 107 tioi_id = tmdb.work.tioi_id; 108 error_code = 0; 109 110 record_data_size = 1024 - /* must subtract length of transfer vector */ 111 (hbound (arg_tmdbp -> mst_label.xfer_vector, 1) * 2); 112 record_size = 113 record_data_size + size (mstr_header) + size (mstr_trailer) 114 + (hbound (arg_tmdbp -> mst_label.xfer_vector, 1) * 2); 115 116 call INIT_TMDB; /* Set up data in the TMDB. */ 117 if error_code ^= 0 then 118 goto WRITE_RETURN; 119 120 tmdb.head.flags.admin, tmdb.head.flags.label = "1"b; 121 /* Turn ON label flags. */ 122 call tape_mult_write_$label (tmdb_ptr, error_code); 123 if error_code ^= 0 then 124 go to WRITE_RETURN; 125 126 string (tmdb.head.flags) = "0"b; /* Turn OFF all flags. */ 127 call tape_mult_write_$eof (tmdb_ptr, error_code); 128 if error_code ^= 0 then 129 go to WRITE_RETURN; 130 131 record_data_size = 1024; /* Now that we have the bootable label written, reset to full length */ 132 record_size = record_data_size + size (mstr_header) + size (mstr_trailer); 133 tmdb.work.rec_length = record_data_size * 4; 134 tmdb.head.data_bit_len = record_data_size * 36; 135 136 call COMPLETE_TMDB; /* Label records written OK. */ 137 138 WRITE_RETURN: /* Common exit from this entry. */ 139 arg_error_code = error_code; 140 return; 141 142 read: 143 entry (arg_tmdbp, arg_volid, arg_error_code); 144 145 /* This entry is called to read a label record and an End of File record from the 146* * beginning of a Multics standard tape. 147**/ 148 149 tmdb_ptr = arg_tmdbp; 150 tioi_id = tmdb.work.tioi_id; 151 152 record_data_size = 1024; /* Initially assume that this tape has large records. */ 153 record_size = record_data_size + size (mstr_header) + size (mstr_trailer); 154 155 tmdb.opt.blp = null; 156 157 call INIT_TMDB; /* Set up an TMDB. */ 158 if error_code ^= 0 then 159 goto READ_RETURN; 160 161 tmdb.work.label_version = 1; /* set to old type label initially */ 162 tmdb.work.output_mode = Stream_output; /* default output mode is stream_output */ 163 tl_ptr = addr (tmdb.buffer); /* Read label data into this buffer. */ 164 165 call tape_mult_read_$label (tmdb_ptr, tl_ptr, record_data_len, error_code); 166 /* Read the label. */ 167 if error_code ^= 0 then 168 go to READ_RETURN; 169 170 /* We have successfully read the first record of the tape. 171* * On some tapes, on some tape drives, FSF commands miss file marks 172* * that reads find. So instead of sending in an FSF here to 173* * skip the file mark, we leave the tape just after the label, 174* * and trust that tape_mult_read_ will cheerfully skip the 175* * file mark (if the drive picks it up.) 176* * Now, we must see how many words are in this record. The rest of the records on 177* * this tape should be the same size. We must also check to see that this record is a 178* * valid Multics standard tape label record. 179**/ 180 record_data_size = divide (tmdb.head.data_bit_len, 36, 17, 0); 181 if (record_data_size ^= 1024) & (record_data_size ^= 256) then 182 goto BAD_LABEL; 183 184 if ^tmdb.head.flags.admin | /* Check that label flags are correct. */ 185 ^tmdb.head.flags.label then 186 goto BAD_LABEL; /* Both MUST be ON. */ 187 if tmdb.work.label_version > 2 then do; /* if a bootable label.. */ 188 tmdb.opt.blp = tl_ptr; /* save ptr to full label for control */ 189 tl_ptr = addr (tl_ptr -> mst_label.installation_id); 190 /* adjust ptr to volume info */ 191 end; 192 193 if tmdb.work.label_version > 1 then /* if a new style label */ 194 if tmdb.opt.volume_set_id ^= "" then /* and if a volume set was specified in att. desc. */ 195 if tl_ptr -> volume_identifier.volume_set_id ^= "" then 196 /* and if tape label has something besides blanks */ 197 if tl_ptr -> volume_identifier.volume_set_id ^= tmdb.opt.volume_set_id then 198 /* they must be equal */ 199 go to BAD_LABEL; 200 201 string (tmdb.work.flags), /* Zero work.flags. */ 202 string (tmdb.head.flags) = "0"b; 203 204 call COMPLETE_TMDB; /* Return a good TMDB to tape_. */ 205 if error_code ^= 0 then 206 go to READ_RETURN; 207 208 tmdb.work.rec_length = 0; 209 tmdb.work.buf_pos = 1; 210 tmdb.trail.tot_rec = 0; 211 tmdb.work.curr_buf = null; 212 tmdb.work.next_buf = null; 213 tmdb.meters = 0; 214 tmdb.work.label_uid = tmdb.head.uid; 215 216 arg_volid = tl_ptr -> volume_identifier.tape_reel_id; 217 /* give caller right info. */ 218 goto READ_RETURN; 219 220 221 BAD_LABEL: 222 error_code = error_table_$bad_label; 223 224 READ_RETURN: /* Common exit from this entry. */ 225 arg_error_code = error_code; 226 return; 227 228 INIT_TMDB: 229 procedure; 230 231 /* This internal procedure is called by both the write and read entries. 232* * Its job is to initialize the TMDB and set up a buffer for the 233* * label I/O. 234**/ 235 236 tmdb.head.c1 = header_c1; /* 670314355245 */ 237 tmdb.head.rec_within_file = -1; /* Incremented before record is written. */ 238 tmdb.head.phy_file = 0; 239 tmdb.head.data_bit_len = record_data_size * 36; 240 string (tmdb.head.flags) = "0"b; 241 tmdb.head.header_version = HEADER_VERSION; /* set version number of record header */ 242 tmdb.head.c2 = header_c2; /* 512556146073 */ 243 244 tmdb.trail.c1 = trailer_c1; /* 107463422532 */ 245 tmdb.trail.tot_data_bits = 0; 246 tmdb.trail.pad_pattern = "777777777777"b3; 247 tmdb.trail.reel_num, tmdb.trail.tot_file = 0; 248 tmdb.trail.tot_rec = -1; /* Incremented before record is written. */ 249 tmdb.trail.c2 = trailer_c2; /* 265221631704 */ 250 251 string (tmdb.work.flags) = "0"b; 252 253 tmdb.work.buf_pos = 0; /* Start with no data. */ 254 tmdb.work.rec_length = record_data_size * 4; 255 tmdb.work.next_buf = null; /* Only one now. */ 256 tmdb.work.buf_len = record_size * 4; 257 tmdb.work.n_full = 0; 258 tmdb.work.n_recs_to_eof = 0; 259 tmdb.work.buffer (*) = null; 260 261 if tmdb.work.n_bufs ^= 0 /* Make sure we only have one buffer for synchronous I/O */ 262 then do; 263 call tape_ioi_$deallocate_buffers (tioi_id, error_code); 264 if error_code ^= 0 then 265 return; 266 end; 267 268 tmdb.work.n_bufs = 1; 269 tmdb.work.bufs_per_subset = 1; 270 271 n_bufs = 1; 272 dummy_arrayp = addr (tmdb.work.buffer (1)); 273 274 call tape_ioi_$allocate_buffers (tioi_id, tmdb.work.buf_len, n_bufs, act_length, act_number, dummy_array, 275 error_code); /* Allocate only 1 buffer now - rest later. */ 276 /* This is for synchronous I/O of label. */ 277 if error_code ^= 0 then 278 return; 279 280 tmdb.work.curr_buf = dummy_array (1); /* Buffer for label I/O. */ 281 282 return; 283 284 end INIT_TMDB; 285 286 COMPLETE_TMDB: 287 procedure; 288 289 /* This internal procedure is called when we have successfully processed the tape label. 290* * Its job is to set up all the buffers that we will be using to process this tape. 291* * Previously, only one buffer was set up because we only wanted 1 record (the label record) 292* * and wanted to read/write it synchronously. Tapes with the "-system" option specified 293* * get more buffers than ones without because RCP allows a greater maximum workspace 294* * size for system processes. 295**/ 296 297 if tmdb.opt.system /* System procs get more buffers. */ 298 then do; 299 tmdb.work.n_bufs = 16; 300 tmdb.work.bufs_per_subset = 8; 301 end; 302 else do; 303 tmdb.work.n_bufs = 4; 304 tmdb.work.bufs_per_subset = 2; 305 end; 306 307 n_bufs = tmdb.work.bufs_per_subset - 1; 308 dummy_arrayp = addr (tmdb.work.buffer (2)); 309 call tape_ioi_$allocate_buffers (tioi_id, tmdb.work.buf_len, tmdb.work.n_bufs - 1, act_length, act_number, 310 dummy_array, error_code); 311 312 end COMPLETE_TMDB; 313 314 315 end tape_mult_labeler_; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 11/11/89 0812.6 tape_mult_labeler_.pl1 >spec>install>1112>tape_mult_labeler_.pl1 90 1 09/16/83 1110.4 tape_ioi_dcls.incl.pl1 >ldd>include>tape_ioi_dcls.incl.pl1 92 2 10/21/86 1251.7 tmdb.incl.pl1 >ldd>include>tmdb.incl.pl1 94 3 12/20/82 1113.8 mstr.incl.pl1 >ldd>include>mstr.incl.pl1 96 4 02/02/78 1229.7 iox_modes.incl.pl1 >ldd>include>iox_modes.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. HEADER_VERSION constant fixed bin(17,0) initial dcl 3-89 ref 241 Stream_output constant fixed bin(17,0) initial dcl 4-15 ref 162 act_length 000100 automatic fixed bin(21,0) dcl 61 set ref 274* 309* act_number 000101 automatic fixed bin(17,0) dcl 61 set ref 274* 309* addr builtin function dcl 78 ref 163 189 272 308 admin 112 based bit(1) level 4 packed packed unaligned dcl 2-24 set ref 120* 184 arg_error_code parameter fixed bin(35,0) dcl 54 set ref 98 138* 142 224* arg_tmdbp parameter pointer dcl 54 ref 98 106 110 112 142 149 arg_volid parameter char packed unaligned dcl 54 set ref 142 216* blp 62 based pointer level 3 dcl 2-24 set ref 155* 188* buf_len 147 based fixed bin(21,0) level 3 dcl 2-24 set ref 256* 274* 309* buf_pos 135 based fixed bin(17,0) level 3 dcl 2-24 set ref 209* 253* buffer 150 based pointer array level 3 in structure "tmdb" dcl 2-24 in procedure "tape_mult_labeler_" set ref 259* 272 308 buffer 176 based fixed bin(35,0) array level 2 in structure "tmdb" dcl 2-24 in procedure "tape_mult_labeler_" set ref 163 bufs_per_subset 146 based fixed bin(17,0) level 3 dcl 2-24 set ref 269* 300* 304* 307 c1 115 based bit(36) level 3 in structure "tmdb" packed packed unaligned dcl 2-24 in procedure "tape_mult_labeler_" set ref 244* c1 105 based bit(36) level 3 in structure "tmdb" packed packed unaligned dcl 2-24 in procedure "tape_mult_labeler_" set ref 236* c2 114 based bit(36) level 3 in structure "tmdb" packed packed unaligned dcl 2-24 in procedure "tape_mult_labeler_" set ref 242* c2 124 based bit(36) level 3 in structure "tmdb" packed packed unaligned dcl 2-24 in procedure "tape_mult_labeler_" set ref 249* curr_buf 136 based pointer level 3 dcl 2-24 set ref 211* 280* data_bit_len 111(18) based fixed bin(17,0) level 3 packed packed unaligned dcl 2-24 set ref 134* 180 239* divide builtin function dcl 78 ref 180 dummy_array based pointer array dcl 74 set ref 274* 280 309* dummy_arrayp 000102 automatic pointer dcl 61 set ref 272* 274 280 308* 309 error_code 000104 automatic fixed bin(35,0) dcl 61 set ref 108* 117 122* 123 127* 128 138 158 165* 167 205 221* 224 263* 264 274* 277 309* error_table_$bad_label 000010 external static fixed bin(35,0) dcl 81 ref 221 flags 112 based structure level 3 in structure "tmdb" packed packed unaligned dcl 2-24 in procedure "tape_mult_labeler_" set ref 126* 201* 240* flags 32 based structure level 3 in structure "tmdb" dcl 2-24 in procedure "tape_mult_labeler_" flags 126 based structure level 3 in structure "tmdb" dcl 2-24 in procedure "tape_mult_labeler_" set ref 201* 251* hbound builtin function dcl 78 ref 110 112 head 105 based structure level 2 dcl 2-24 header_c1 000003 constant bit(36) initial packed unaligned dcl 3-79 ref 236 header_c2 000002 constant bit(36) initial packed unaligned dcl 3-79 ref 242 header_version 112(24) based fixed bin(3,0) level 3 packed packed unsigned unaligned dcl 2-24 set ref 241* installation_id 20 based char(32) level 3 packed packed unaligned dcl 3-16 set ref 189 label 112(01) based bit(1) level 4 packed packed unaligned dcl 2-24 set ref 120* 184 label_uid 131 based bit(72) level 3 dcl 2-24 set ref 214* label_version 133 based fixed bin(17,0) level 3 dcl 2-24 set ref 161* 187 193 meters 170 based structure level 2 dcl 2-24 set ref 213* mst_label based structure level 1 dcl 3-16 mstr_header based structure level 1 dcl 3-37 ref 112 132 153 mstr_trailer based structure level 1 dcl 3-62 ref 112 132 153 n_bufs 145 based fixed bin(17,0) level 3 in structure "tmdb" dcl 2-24 in procedure "tape_mult_labeler_" set ref 261 268* 299* 303* 309 n_bufs 000105 automatic fixed bin(17,0) dcl 61 in procedure "tape_mult_labeler_" set ref 271* 274* 274 307* 309 n_full 143 based fixed bin(17,0) level 3 dcl 2-24 set ref 257* n_recs_to_eof 144 based fixed bin(17,0) level 3 dcl 2-24 set ref 258* next_buf 140 based pointer level 3 dcl 2-24 set ref 212* 255* null builtin function dcl 78 ref 155 211 212 255 259 opt 32 based structure level 2 dcl 2-24 output_mode 134 based fixed bin(17,0) level 3 dcl 2-24 set ref 162* pad_pattern 121 based bit(36) level 3 packed packed unaligned dcl 2-24 set ref 246* phy_file 110(18) based fixed bin(17,0) level 3 packed packed unaligned dcl 2-24 set ref 238* rec_length 142 based fixed bin(21,0) level 3 dcl 2-24 set ref 133* 208* 254* rec_within_file 110 based fixed bin(17,0) level 3 packed packed unaligned dcl 2-24 set ref 237* record_data_len 000106 automatic fixed bin(17,0) dcl 61 set ref 165* record_data_size 000107 automatic fixed bin(17,0) dcl 61 set ref 110* 112 131* 132 133 134 152* 153 180* 181 181 239 254 record_size 000110 automatic fixed bin(21,0) dcl 61 set ref 112* 132* 153* 256 reel_num 122 based fixed bin(11,0) level 3 packed packed unaligned dcl 2-24 set ref 247* size builtin function dcl 78 ref 112 112 132 132 153 153 string builtin function dcl 78 set ref 126* 201* 201* 240* 251* system 32(02) based bit(1) level 4 packed packed unaligned dcl 2-24 ref 297 tape_ioi_$allocate_buffers 000020 constant entry external dcl 1-11 ref 274 309 tape_ioi_$deallocate_buffers 000022 constant entry external dcl 1-39 ref 263 tape_mult_read_$label 000012 constant entry external dcl 86 ref 165 tape_mult_write_$eof 000014 constant entry external dcl 86 ref 127 tape_mult_write_$label 000016 constant entry external dcl 86 ref 122 tape_reel_id 10 based char(32) level 2 packed packed unaligned dcl 3-73 ref 216 tioi_id 000111 automatic bit(36) dcl 61 in procedure "tape_mult_labeler_" set ref 107* 150* 263* 274* 309* tioi_id 130 based bit(36) level 3 in structure "tmdb" dcl 2-24 in procedure "tape_mult_labeler_" ref 107 150 tl_ptr 000112 automatic pointer dcl 61 set ref 163* 165* 188 189* 189 193 193 216 tmdb based structure level 1 dcl 2-24 tmdb_ptr 000114 automatic pointer dcl 2-22 set ref 106* 107 120 120 122* 126 127* 133 134 149* 150 155 161 162 163 165* 180 184 184 187 188 193 193 193 201 201 208 209 210 211 212 213 214 214 236 237 238 239 240 241 242 244 245 246 247 247 248 249 251 253 254 255 256 257 258 259 261 268 269 272 274 280 297 299 300 303 304 307 308 309 309 tot_data_bits 120 based fixed bin(35,0) level 3 packed packed unaligned dcl 2-24 set ref 245* tot_file 122(12) based fixed bin(23,0) level 3 packed packed unaligned dcl 2-24 set ref 247* tot_rec 123 based fixed bin(35,0) level 3 packed packed unaligned dcl 2-24 set ref 210* 248* trail 115 based structure level 2 dcl 2-24 trailer_c1 000001 constant bit(36) initial packed unaligned dcl 3-79 ref 244 trailer_c2 000000 constant bit(36) initial packed unaligned dcl 3-79 ref 249 uid 106 based bit(72) level 3 packed packed unaligned dcl 2-24 ref 214 vid 20 based structure level 2 dcl 3-16 volume_identifier based structure level 1 dcl 3-73 volume_set_id 20 based char(32) level 2 in structure "volume_identifier" packed packed unaligned dcl 3-73 in procedure "tape_mult_labeler_" ref 193 193 volume_set_id 43 based char(32) level 3 in structure "tmdb" packed packed unaligned dcl 2-24 in procedure "tape_mult_labeler_" ref 193 193 work 126 based structure level 2 dcl 2-24 xfer_vector based structure array level 2 dcl 3-16 ref 110 112 NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. Direct_input internal static fixed bin(17,0) initial dcl 4-15 Direct_output internal static fixed bin(17,0) initial dcl 4-15 Direct_update internal static fixed bin(17,0) initial dcl 4-15 Keyed_sequential_input internal static fixed bin(17,0) initial dcl 4-15 Keyed_sequential_output internal static fixed bin(17,0) initial dcl 4-15 Keyed_sequential_update internal static fixed bin(17,0) initial dcl 4-15 LABEL_VERSION internal static fixed bin(17,0) initial dcl 3-87 Sequential_input internal static fixed bin(17,0) initial dcl 4-15 Sequential_input_output internal static fixed bin(17,0) initial dcl 4-15 Sequential_output internal static fixed bin(17,0) initial dcl 4-15 Sequential_update internal static fixed bin(17,0) initial dcl 4-15 Stream_input internal static fixed bin(17,0) initial dcl 4-15 Stream_input_output internal static fixed bin(17,0) initial dcl 4-15 iox_modes internal static char(24) initial array dcl 4-6 label_c1 internal static bit(36) initial packed unaligned dcl 3-79 mstr based structure level 1 dcl 3-10 mstrp automatic pointer dcl 3-8 short_iox_modes internal static char(4) initial array dcl 4-12 tape_ioi_$activate 000000 constant entry external dcl 1-8 tape_ioi_$allocate_work_area 000000 constant entry external dcl 1-16 tape_ioi_$buffer_status 000000 constant entry external dcl 1-20 tape_ioi_$check_order 000000 constant entry external dcl 1-24 tape_ioi_$check_read 000000 constant entry external dcl 1-27 tape_ioi_$check_write 000000 constant entry external dcl 1-30 tape_ioi_$deactivate 000000 constant entry external dcl 1-33 tape_ioi_$deallocate 000000 constant entry external dcl 1-36 tape_ioi_$get_mode 000000 constant entry external dcl 1-43 tape_ioi_$get_statistics 000000 constant entry external dcl 1-46 tape_ioi_$hardware_status 000000 constant entry external dcl 1-50 tape_ioi_$list_buffers 000000 constant entry external dcl 1-54 tape_ioi_$order 000000 constant entry external dcl 1-57 tape_ioi_$queue_order 000000 constant entry external dcl 1-60 tape_ioi_$queue_read 000000 constant entry external dcl 1-63 tape_ioi_$queue_write 000000 constant entry external dcl 1-66 tape_ioi_$read 000000 constant entry external dcl 1-69 tape_ioi_$release_buffer 000000 constant entry external dcl 1-72 tape_ioi_$reserve_buffer 000000 constant entry external dcl 1-76 tape_ioi_$reset_statistics 000000 constant entry external dcl 1-80 tape_ioi_$set_buffer_ready 000000 constant entry external dcl 1-84 tape_ioi_$set_mode 000000 constant entry external dcl 1-88 tape_ioi_$stop_tape 000000 constant entry external dcl 1-91 tape_ioi_$write 000000 constant entry external dcl 1-94 NAMES DECLARED BY EXPLICIT CONTEXT. BAD_LABEL 000330 constant label dcl 221 ref 181 184 193 COMPLETE_TMDB 000535 constant entry internal dcl 286 ref 136 204 INIT_TMDB 000336 constant entry internal dcl 228 ref 116 157 READ_RETURN 000333 constant label dcl 224 ref 158 167 205 218 WRITE_RETURN 000135 constant label dcl 138 ref 117 123 128 read 000144 constant entry external dcl 142 tape_mult_labeler_ 000017 constant entry external dcl 33 write 000031 constant entry external dcl 98 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 756 1002 634 766 Length 1242 634 24 224 122 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME tape_mult_labeler_ 188 external procedure is an external procedure. INIT_TMDB internal procedure shares stack frame of external procedure tape_mult_labeler_. COMPLETE_TMDB internal procedure shares stack frame of external procedure tape_mult_labeler_. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME tape_mult_labeler_ 000100 act_length tape_mult_labeler_ 000101 act_number tape_mult_labeler_ 000102 dummy_arrayp tape_mult_labeler_ 000104 error_code tape_mult_labeler_ 000105 n_bufs tape_mult_labeler_ 000106 record_data_len tape_mult_labeler_ 000107 record_data_size tape_mult_labeler_ 000110 record_size tape_mult_labeler_ 000111 tioi_id tape_mult_labeler_ 000112 tl_ptr tape_mult_labeler_ 000114 tmdb_ptr tape_mult_labeler_ THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. call_ext_out_desc call_ext_out return_mac ext_entry ext_entry_desc THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. tape_ioi_$allocate_buffers tape_ioi_$deallocate_buffers tape_mult_read_$label tape_mult_write_$eof tape_mult_write_$label THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. error_table_$bad_label LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 33 000016 98 000024 106 000041 107 000045 108 000047 110 000050 112 000055 116 000060 117 000061 120 000063 122 000070 123 000101 126 000103 127 000106 128 000117 131 000121 132 000123 133 000125 134 000131 136 000134 138 000135 140 000137 142 000140 149 000162 150 000166 152 000170 153 000172 155 000174 157 000176 158 000177 161 000201 162 000204 163 000206 165 000210 167 000225 180 000227 181 000235 184 000241 187 000245 188 000250 189 000252 193 000254 201 000273 204 000276 205 000277 208 000301 209 000303 210 000305 211 000307 212 000311 213 000312 214 000314 216 000320 218 000327 221 000330 224 000333 226 000335 228 000336 236 000337 237 000342 238 000344 239 000346 240 000351 241 000353 242 000357 244 000361 245 000363 246 000365 247 000367 248 000373 249 000375 251 000377 253 000400 254 000401 255 000404 256 000406 257 000412 258 000413 259 000414 261 000430 263 000433 264 000444 268 000447 269 000452 271 000453 272 000454 274 000456 277 000525 280 000530 282 000534 286 000535 297 000536 299 000542 300 000544 301 000546 303 000547 304 000551 307 000553 308 000556 309 000560 312 000632 ----------------------------------------------------------- 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