" *********************************************************** " * * " * Copyright, (C) Honeywell Information Systems Inc., 1982 * " * * " *********************************************************** """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " " " This is a bos command to load the 355. The 355 core load as well as the 355 boootload " program are assumed to be in the bos directory. The coreload name is arg 1 to the command. " If no arg is given, the default is D355. The 355 bootload program must be called B355. " This command will copy the 355 bootload program and the 355 coreload into segment 1 " (after seg 3) and set up the necessary commands to put the 355 bootload program " into the 355. The 355 core image will be patched to reflect the configuration " specified in the bos config deck rather than what was specified when the 355 " 355 core image was created. The bootload program will then load the 355 coreload. " When the 355 has been loaded, it will tell ld355 whether the load was successful " or not. An error message will be printed if the load was a failure. In either case, " a return will be made to bos. " " " Assigned Segment Numbers: " " Seg No. Use " " 0 Descriptor Segment " 1 Scratch " 3 Command " 6 Common Data " 7 Absolute Core " " include files: bosequ, bos_common, conf355, bos_tv, bos_sdw " " WRITTEN BY DICK SNYDER JULY 1,1971 " Modified Dec 1,1971 to run on iom by Dick Snyder " Modified for follow_on by Dick Snyder July, 1972 " Modified to patch config info into core image by R.B.Snyder 9/20/73 " Modified to change iom interrupt levels by Mike Grady 7/8/74 " Modified for MCS by Mike Grady 4/13/75 " Modified to run multiple 355s by Mike Grady 8/22/75 " """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " name ld355 include bosequ " " " equates and bools " " bool bit21,040000 bit 21-parity bit for upper (0-17) 18 bits bool bit22,020000 bit 22-parity bit for lower (18-35) 18 bits bool dn355mbx,2400 dia pcw mailbox loc'n bool dnload,100 loc to begin loading 355boot pgm " definitions of various 355 addresses and values equ l1ch,9 first lsla channel equ l6ch,14 last lsla channel equ h1ch,6 first hsla channel equ h3ch,8 last hsla channel equ .criom,427 start of iom table equ .crnhs,428 number of hslas configured equ .crnls,429 number of lslas configured equ .crcon,430 console enable switch equ h1mb,512 address of mailbox for first hsla equ cnfgst,14 offset in hsla mailbox of config status pcw " definitions of bootload communication block in 355 bootload program equ iclist,0 list icw equ icdcw1,iclist+1 dcw 1 equ icdcw2,icdcw1+2 dcw 2 equ icdcw3,icdcw2+2 dcw 3 equ icdcw4,icdcw3+2 dcw 4 equ icdcw5,icdcw4+2 dcw 5 disconnect equ icmbx,icdcw5+1 600 mbx addr and int cell no. equ icdate,icmbx+1 date of bootload equ ictime,icdate+1 time of bootload equ iclmts,ictime+1 355pgm address limits equ icksma,iclmts+1 355pgm checksum equ icksmb,icksma+1 bootload pgm checksum " equ's that define fields on lsla config card equ d355_no,1 equ lsla_no,2 equ seq_no,3 equ start_baud,4 equ baud,0 equ count,1 " equs that define fields on hsla config card " equ d355_no,1 equ hsla_no,2 equ chan_no,3 " equ start_baud,4 " equ baud,0 " equ count,1 " " " " init the BOS environment for this program " " stx2 x2 save x2 for return to bos stz com|d355_state indicate no success tsx2 initint init for interrupts arg ttyrequest ignore execute faults tsx2 init_io init iom tsx2 ttyinit set up to get tty interrupts arg ttyrequest request button returns to bos " " " process any args " ldx2 x2 restore x2 ldx0 mem|0,2 get addr of arg aos all_sw default case arglp: eax0 1,0 bump x0 lda mem|0,0 get next arg cmpa =-1 no more args? tze argend yes, done cmpa =h check check option specified? tnz narg1 no, next arg aos chk_sw yes, set switch tra arglp more args narg1: lda mem|0,0 get the arg ldq 0,dl zero the q lrl 6 drop char into high q cmpa =o002020202020 is rest all blank? tnz narg2 nope, might be prg name stq *+3 put into descriptor scm (),(du),mask(0) look for 355 number arg desc6a which_list,max_no_355s arg 0 arg temp_355n ttn narg2 not that, what else lda temp_355n get number ada 1,dl up one sta which_355 this one stz all_sw not all anymore aos conf355err to report missing card tra arglp narg2: lda mem|0,0 refetch arg sta prognm must be 355 coreimage name tra arglp argend: lda prognm get name of dn355 prog to load tsx2 search search BOS command directory tra comerr sta pgm355 save disk address lda =h b355 look for 355 bootload pgm sta prognm tsx2 search tra comerr sta pgmboot save addr about boot pgm tra allset OK. " " " ERROR: dn355 program not found. Print error msg and exit " " comerr: null tsx2 erpt print error message acc '^g not found' arg prognm " " " here to return to BOS " " exit: ttyrequest: lca 1,dl no return arg to bos ldx2 x2 restore x2 tra mem|1,2 exit to bos " " " Come here when both the DN355 program and the bootload program have " been found. Lay them out in memory and start bootloading. " allset: null lda which_355 get which 355 we want tsx2 conf355 set config info tra next_355 none, done lda which_355 get number again ada =o140,dl make into letter als 27 shift into au ora =o040040040 add three blanks sta ldarg save tsx2 erpt write message acc 'loading 355 ^a' arg ldarg ldaq ds|pgm*2 get this program's sdw anq sdw.bound,du isolate the bound field arl sdw.add_shift right justify seg address in a sta temp store away for a bit qrl 36-15 right justify bound field adlq 1,dl bump bounds field by 1 for correct seg size qls 4 mult by 16 to get bound in words adq temp create new address field for an sdw lls 36+sdw.add_shift put new address in a ora sdw.df,dl no faults please ldq 1024*8,du get a seg bound of 16K orq accbits set access bits in sdw staq ds|tmp*2 create temp seg sdw cams 0 start anew lda pgmboot get command addr and no of sectors ana =o777777770777 mask out unwanted bits tsx2 rdsec read bootload program nop tmp|dnload starting at dnload in 355 bootload area dis * error..stop ldq tmp|dnload get size of boot pgm (stored there by 355 simulator) adq dnload+64+2,dl add 2 words(size and checksum words) and get next mod 64 anq =o777700,dl address beyond end of boot pgm qls 18 shift into qu stq relorg rel addr of 355 pgm in relorg(upper) lda ds|tmp*2 get addr field of temp seg sdw als 18-sdw.add_shift left justify 24 bit addr sta absorg save a bit lda relorg get rel offset of 355 core image asa absorg left half of absorg has abs addr of core image orsq load2 patch loading address lda pgm355 get addr and no of sectors ana =o777777770777 mask out unwanted bits tsx2 rdsec read dn355 program load2: nop tmp|0 loading addr (right after bootload pgm) dis * error..stop " " " At this point we have the 355 bootload program in absolute core at location " segment 1+dnload followed at next mod(64) loc by the 355 program to be loaded. " Note that since each program must have been passed thru the 355 simulator " each program has a word added to the beginning and end. The word at the " beginning is the size of the program and the word at the end is " a checksum of the entire program. " It should also be noted that the bootload program has a 15 word bootload " control block at the end which is to be filled in before booting it " into the 355. This control block is defined by a set of equ's at the " beginning of this command. " " lda tmp|dnload get size of boot program eax4 tmp|dnload-15,al get offset of bootload control block stx4 bcboff save ldx5 relorg pick up offset of dn355 program lxl6 tmp|0,5 get length of dn355 prog adx6 relorg get offset of end of dn355 program lda tmp|-1,6 get system load limits sta tmp|iclmts,4 store in bootload control block lda tmp|0,5 get length of dn355 program arl 12 calculate no of dcws needed ada 2,dl add in disconnect dcw als 1 times two (72 bits per dcw) orsa tmp|iclist,4 put in list icw tally eax1 0,al save tally eax1 bcboff,*1 calculate position of last dcw lda tmp|icdcw5,4 get disconnect dcw ora bit21+bit22,dl set parity bits sta tmp|-1,1 store as last dcw in list lda =o100000,du get 36 bit xfer mode bits ora bit22,dl set parity for this word sta tmp|0,1 * lda tmp|0,5 get length of dn355 program ada 1,dl plus one ana =o007777,dl mask remainder tally orsa tmp|-2,1 store in last data xfer dcw lca =o60001,dl remove existing parity bits ansa tmp|-2,1 * lda tmp|-2,1 get last data xfer dcw tsx2 parity calculate its parity sta tmp|-2,1 replace " " " We will now look at the LSLA and HSLA config cards and patch the " configuration tables in the 355 core image accordingly. This is done " so that a standard 355 core image can be sent to all external Multics " sites and it can be patched according to site specific configuration. " tsx2 reset_arrays lda =alsla look for lsla cards first tsx2 getconf tra no_more_lslas none tra skip_getmore get_lsla_card: lda =alsla tsx2 getmore get another lsla card tra no_more_lslas all gone skip_getmore: lda com|d355_no,7 get 355 number cmpa which_355 right one? tnz get_lsla_card lda com|lsla_no,7 get lsla number aos lsla_ch_array,al remember our number als 3 multiply number by 8 ada com|seq_no,7 add in sequence number sba 1,dl make relative to zero stx7 lsla_array,al save ptr to card tra get_lsla_card get another card no_more_lslas: tsx2 read_image read addr of iom table zero .criom,iom_table_addr eax1 l1ch*2 get twice first lsla chan no stx1 iom_channel and save stz no_of_lslas zero ctr eax0 0 set up lsla array index lsla_loop: szn lsla_ch_array,0 see if lsla assigned tze no_lsla no aos no_of_lslas count total lslas lxl1 iom_table_addr get base of 355 iom table adx1 iom_channel add 2*channel number adx1 1,du add offset of lsla table addr stx1 *+2 store address tsx2 read_image read the address word zero 0,lsla_table_addr lxl4 lsla_table_addr get x4 at base eax4 2,4 skip slot 0 stx4 ltemp save for a bit lda 52,dl get count neg 0 negitive sta baud_cnt save lda 7,dl get undefined code sta lsla_conf_word set config word lsla_ulp: stx4 *+2 store addr tsx2 write_image set in 355 core zero 0,lsla_conf_word eax4 2,4 bump to next slot aos baud_cnt bump counter tnz lsla_ulp ldx4 ltemp eaa 0,0 get offset of channel no ars 18-3 multiply by 8 eax3 lsla_array,al get ptr to lsla cards for this lsla lsla_card_loop: szn 0,3 any more lsla cards? tmi lsla_assigned nope, done ldx7 0,3 get ptr to lsla card eax7 start_baud,7 point x7 at baud rate count pairs lsla_baud_loop: lda com|count,7 get count for this pair neg 0 negate it sta baud_cnt save for processing lda com|baud,7 get the baud rate tmi next_lsla_card no more this card cmpa 300,dl is it 300 baud? tnz not300 nope lp300c: lda 1,dl get type of first 300 baud channel lp300: sta lsla_conf_word set in config word stx4 *+2 put addr into arg word tsx2 write_image write into image zero 0,lsla_conf_word eax4 2,4 bump address lda lsla_conf_word get config word ada 1,dl bump cmpa 4,dl are we done yet? tnz lp300 nope, more slots this line aos baud_cnt bump baud count tnz lp300c more 300 baud lines tra next_baud no more, get next baud rate not300: cmpa 150,dl is it 150 baud? tnz not150 nope, continue checking lda 5,dl get initial config word for 150 sta ltemp save in temp lp150c: lda ltemp restor config word sta lsla_conf_word stx4 *+2 tsx2 write_image mark image zero 0,lsla_conf_word aos lsla_conf_word eax4 2,4 bump to next slot stx4 *+2 tsx2 write_image zero 0,lsla_conf_word eax4 2,4 bump to next slot aos baud_cnt bump baud count tnz lp150c more to be done tra next_baud not150: cmpa 133,dl is it 133 baud? tnz not133 no, continue checking lda =o105,dl get type for 133 baud sta ltemp put into temp tra lp150c 2 slots, same as 150 baud not133: cmpa 110,dl is it 110 baud? tnz not110 nope, could be error stz lsla_conf_word zero is right for 110 baud lp110c: stx4 *+2 tsx2 write_image zero 0,lsla_conf_word eax4 2,4 aos baud_cnt bump baud count tnz lp110c more to be done tra next_baud not110: sta ill_baud must be some illegal number ldx7 0,3 get ptr to lsla card lda com|lsla_no,7 get the lsla number sta ill_lsla svae lda com|seq_no,7 get card sequence number sta ill_seq save tsx2 erpt notify operator acc 'lsla ^d card ^d: illegal baud rate ^d' arg ill_lsla arg ill_seq arg ill_baud tra not_loaded don't process rest of this one " next_baud: "get next baud rate count pair eax7 2,7 bump ptr tra lsla_baud_loop next_lsla_card: "get ptr to next lsla card eax3 1,3 bump ptr tra lsla_card_loop no_lsla: lxl1 iom_table_addr compute config table addr for this lsla adx1 iom_channel stx1 *+2 patch addr in calling sequence tsx2 write_image deconfigure this lsla zero 0,zero by writing zero in its entry in 355 config table lsla_assigned: eax0 1,0 bump lsla array index ldx1 iom_channel bump lsla channel number adx1 2,du stx1 iom_channel cmpx1 (l6ch+1)*2,du are we done with lslas yet? tnz lsla_loop no " " " Now loop finding all hsla config cards and put baud rates for each " configured channel in a 3 x 32 array which has one entry for each " subchannel on up to 3 hslas. " lda =ahsla tsx2 getconf find first hsla card tra no_more_hsla_cards there are none tra skip_h_getmore get_hsla_card: lda =ahsla tsx2 getmore find additional hsla cards tra no_more_hsla_cards threr are none skip_h_getmore: lda com|d355_no,7 get 355 number cmpa which_355 right one? tnz get_hsla_card no lda com|hsla_no,7 get hsla number aos hsla_channel_array,al keep track of how many hslas als 5 multiply by array size (32) ada com|chan_no,7 add in channel number eax3 start_baud,7 point X3 to baud rate/count pairs get_h_baud: ldq com|baud,3 get baud rate from card tmi get_hsla_card end of card lxl6 com|count,3 get number of lines at that baud rate store_h_baud: stq hsla_array,al store baud rate in array ada 1,dl bump array index sbx6 1,du done with this baud rate group? tnz store_h_baud no eax3 2,3 bump X3 to next baud rate/count pair tra get_h_baud no_more_hsla_cards: eax1 h1ch*2 kep first hsla channel #*2 stx1 iom_channel save it stz no_of_hslas zero ctr eax0 0 init array index hsla_loop: szn hsla_channel_array,0 is this hsla configured? tze no_hsla no aos no_of_hslas keep track of how many hslas tra hsla_assigned no_hsla: lxl1 iom_table_addr compute address of config table adx1 iom_channel entry for this hsla and stx1 *+2 deconfigure (zero) it tsx2 write_image zero 0,zero hsla_assigned: eax0 1,0 bump array index ldx1 iom_channel skip on to next hsla channel adx1 2,du stx1 iom_channel cmpx1 (h3ch+1)*2,du done with hslas yet? tnz hsla_loop no " tsx2 write_image zero .crnhs,no_of_hslas patch in number of configured tsx2 write_image zero .crnls,no_of_lslas hslas and lslas " " Now go over the 'hsla_array' and for each configured subchannel, " the 355 hsla subchannel table and configuration pcw must be patched " eax3 0 init hsla array index eax1 h1ch*2 init iom channel number*2 stz hsla_num init the hsla number and subch number stz hsla_subch eax2 h1mb+cnfgst stx2 hsla_hardware_addr_1 setup the config pcw locs eax2 h1mb+cnfgst+1 stx2 hsla_hardware_addr_2 per_hsla: stx1 iom_channel save channel number lxl1 iom_table_addr get base of iom table adx1 iom_channel add (two times) channel number stx1 *+2 address of first word of iom table entry tsx2 read_image pick up iom table word zero 0,hsla_config_word szn hsla_config_word is this hsla really there? tze hsla_not_config whole hsla gone, ignore adx1 1,du plus 1 to get second word of iom table entry " (hsla table addr) stx1 *+2 tsx2 read_image read the word zero 0,hsla_table_addr subchan_loop: stz hsla_table_word init table word to zero (not configured) szn hsla_array,3 is current subchannel configured? tpl chan_assigned yes stz hsla_pcw_upper cause config pcw to be zeroed out stz hsla_pcw_lower .. tra zero_config_pcw chan_assigned: lda hsla_array,3 get baud rate for this subchannel eax4 baud_table look up baud rate to get basic subchannel data rpt baud_table_len,entry_len,tze cmpa 0,4 eax4 -entry_len,4 back up x4 to entry we found ldq 1,4 load up the basic subchannel data from the table ttf hit good, we got a hit sta ill_baud illegal, save it tsx2 erpt print error message acc 'hsla ^d subch ^d: illegal baud rate ^d' arg hsla_num arg hsla_subch arg ill_baud tra not_loaded don't do any more for now hit: stq hsla_table_word set up table word " " now set up configuration pcw " ldq hsla_subchannel get subchannel number qrl 18+1 right justify and divide by 2 (it was mult by 2) qls 6 position orq 2,4 or in most of pcw bits from table stq hsla_pcw_upper this will be first 18 bits of pcw lda 3,4 get lower 18 bits sta hsla_pcw_lower put into pcw word zero_config_pcw: tsx2 write_image write pcw hsla_hardware_addr_1: zero 0,hsla_pcw_upper tsx2 write_image hsla_hardware_addr_2: zero 0,hsla_pcw_lower zero_table_word: lxl1 hsla_table_addr store value of hsla table word adx1 hsla_subchannel stx1 *+2 tsx2 write_image zero 0,hsla_table_word eax3 1,3 bump hsla array index lda 16,du bump hsla hardware com region addr asa hsla_hardware_addr_1 asa hsla_hardware_addr_2 lda hsla_subchannel get current subchannel ada 2,du bump to next cmpa 64,du done with current hsla? tze next_hsla yes sta hsla_subchannel aos hsla_subch next subchannel tra subchan_loop hsla_not_config: eax3 32,3 jump over whole hsla lda 32*16,du hardware comm region too asa hsla_hardware_addr_1 asa hsla_hardware_addr_2 next_hsla: stz hsla_subchannel start on new hsla with subchannel 0 ldx1 iom_channel get current hsla channel number eax1 2,1 bump hsla channel number stz hsla_subch first subchannel aos hsla_num new hsla cmpx3 3*32,du done with hsla array? tnz per_hsla no " process check arg szn chk_sw check option specified? tnz done_with_config yes, do nothing lda 1,dl sta temp make nonzero word to write to coreimage tsx2 write_image fix .crcon to disable checking zero .crcon,temp disable console during init " done_with_config: " " " Calculate checksum on dn355 prog. " " ldx4 bcboff reload addr of bootload communications area ldi =o4000,dl set overflow mask sti indic reset indicator storage ldq tmp|0,5 get length of dn355 prog eaq -1,ql reduce count for first word ldx1 relorg get offset of dn355 prog adx1 2,du get offset of second word lda tmp|-1,1 get first word cksum1: null ldi indic get indicators awca tmp|0,1 add with carry sti indic store indicators adlx1 1,du bump word pointer adlq -1,du decrement word count tnz cksum1 more to do sta tmp|icksma,4 store checksum of dn355 prog rscr 4*8 read clock for date and time of bootload sta tmp|icdate,4 set clock value as date and time of stq tmp|ictime,4 bootload lda =o37,dl pick up interrupt cell numbers ldq iom_chan get the channel number cmpq 32,dl test for high number channel tmi *+2 no, use 3 and 7 lda =o26,dl yes, use 2 and 6 sta temp save it ldq mbx_offset get offset of this mbx eaa dn355mbx,ql get mailbox addr ora temp or in interrupt cell numbers tsx2 parity calculate parity sta tmp|icmbx,4 return " " " " Set up data dcws to point to dn355 program sections (4096 word blocks) " " lda tmp|iclist,4 get list icw ana =o77,dl get count field (no. of 36 bit words) arl 1 calculate no. of dcws eax0 -1,al remove disconnect dcw from count ldq absorg get abs addr of anq -1,du clear lower half of word adq 1,du dn355 program eax3 0,4 copy x4 to x3 dcwloop: null orsq tmp|icdcw1,3 put addr in dcw adlq 4096,du increment addr by max tally lda tmp|icdcw1,3 tsx2 parity calculate parity sta tmp|icdcw1,3 put back adlx3 2,du bump dcw pointer adlx0 -1,du reduce dcw counter tnz dcwloop continue until all address fields filled in eax1 dnload get locn of boot pgm ldq tmp|0,1 get length of boot pgm eaq -2,ql don't include first and last words in count lda tmp|1,1 get first word of boot pgm adlx1 2,du move ptr over second word ldi =o4000,dl set overflow mask sti indic init indicators storage cksum2: null ldi indic get indicators awca tmp|0,1 add next word with carry sti indic save indicators adlx1 1,du bump data ptr adlq -1,du tnz cksum2 more data to go sta tmp|icksmb,4 store bootload checksum eax1 dnload+1 get loc'n of boot control word lda tmp|0,1 get boot control word gtb 0 calculate parity on it ana 1,dl test tnz 3,ic odd parity lda bit22,dl even,force odd orsa tmp|0,1 * " " " " Set now to do actual bootload. Set up pcw at dn355mbx to point to indirect " control word. This indirect control word will overlay the word containing " the length of the bootload program (dnload). " " lda =o000072,dl get bootload pcw ldq mbx_offset get offset of this mbx sta mem|dn355mbx,ql lda ds|tmp*2 get temp seg sdw (word 0) als 18-sdw.add_shift get abs addr of temp seg in au ada dnload,du get addr of indirect control word ana -1,du clear lower half of a orsa mem|dn355mbx,ql put in pcw lda mem|dn355mbx,ql gtb 0 calculate parity on pcw ana 1,dl test for odd or even tnz 3,ic odd lda bit22,dl even ... set parity bit orsa mem|dn355mbx,ql .. lda tmp|dnload get length of bootload program ana =o007777,dl set up 355 addr (0) ora =o100000,du set in 36 bit xfer mode sta tmp|dnload put in indirect word ldq iom_chan get channel number lda 4*3,dl get interrupt cell number cmpq 32,dl check the channel number tmi *+2 all ok, continue sba 4,dl fix the interrupt cell number ada iom_no add in the iom number sta norm_int_cell save it away anq 31,dl get channel number mod 32 lda =o400000,du get a bit arl 0,ql move the bit sta int_bit save the bit lxl7 norm_int_cell point to cells adlx7 com|iom_mxbase add in base of iom mbx stz mem|0,7 clear all pending interrupts stz mem|16,7 also for emergency " " Now connect to the DIA to do bootload. " tsx2 connect_iom connect first to mask dia to clear it zero maskpcw,0 tsx2 connect_iom connect to iom zero diapcw,0 holds channel no of dia " " " " Now we wait while the 355 does its initialization code. " It will check the config we gave it, and report errors. " " rscr 4*8 get time staq begin_wait save it lxl7 norm_int_cell get addr of cells adlx7 com|iom_mxbase add in base of iom mbx wait_for_int: lda int_bit pick up bit cana mem|0,7 was it regular interrupt? tnz int355 yes, go look at result cana mem|16,7 was it emergency interrupt? tnz emergency_interrupt yes, print message rscr 4*8 read the clock sbaq begin_wait see if we have waited over 30 seconds yet cmpaq default_waittime .. tmi wait_for_int no - loop around some more " " we waited too long, must be bad 355 " tsx2 erpt squawk acc 'no response from 355' tra exit return to bos " " " " Subroutine to calculate parity on dia dcw. Enter with A reg " holding word on which parity is to be calculated. Returns the word " in the A-reg with parity bits set. " " parity: null sta atemp save input word arl 18 do parity check for upper half gtb 0 calculate parity ana 1,dl test for odd or even tnz 3,ic odd lda bit21,dl even..set parity bit orsa atemp for upper 18 bits lda atemp get dcw again als 18 do lower 18 bits now gtb 0 calculate parity ana 1,dl test for odd or even tnz 3,ic odd lda bit22,dl even,force odd orsa atemp set bit lda atemp restore "paritized" dcw to a-reg tra 0,2 return bss atemp,1 temp storage " " Subroutine to reset arrays between 355 loads. " reset_arrays: mlr (),(),fill(0) desc9a 0,0 desc9a lsla_ch_array,6*4 mlr (),(),fill(777) desc9a 0,0 desc9a lsla_array,48*4 mlr (),(),fill(0) desc9a 0,0 desc9a hsla_channel_array,3*4 mlr (),(),fill(777) desc9a 0,0 desc9a hsla_array,96*4 tra 0,2 " " " Subroutine to read or write a word in the 355 core image to " be loaded. Used to patch configuration tables. Calling sequence " is: " " tsx2 write_image (or read_image) " zero 355_addr,addr_of_data " " write_image: lda xed_inst_write patch xed instruction for write tra join_image read_image: lda xed_inst_read patch xed instruction for read join_image: sta xed_inst adx2 1,du bump x2 over args stx2 image_ret set up return instruction lda -1,2 get 355 addr lxl2 -1,2 get addr of data stx2 read_ret save in case doing read lxl2 0,2 get data ldq 0,dl clear Q ana =o777777,du leave only 355 addr lrs 19 get odd/even bit in QU(0) qrl 16 odd/even to QU(16) als 18 355 addr in AU ada relorg get offset in seg tmp ada 1,du skip over header word xed_inst: oct 0 home of xed instruction image_ret: tra 0 xed_inst_write: xed store_data,qu xed_inst_read: xed read_data,qu even store_data: stx2 tmp|0,au nop 0,du sxl2 tmp|0,au nop 0,du read_data: ldx2 tmp|0,au sxl2 read_ret,* lxl2 tmp|0,au sxl2 read_ret,* read_ret: oct 0 " " " " Come here when you have an interrupt from the 355. " Tell operator how things went. " " int355: null ldq mbx_offset get offset of this mbx lda mem|dn355mbx+6,ql get status word from 355 tpl badint no high order bit - bad interrupt ana =o070000,du isolate error code ars 12 position cmpa =o000006,du check for legality tnc *+2 good status tra * bad status...take a dump please lda stmsgs,au get addr of appropriate message printer tra 0,au go to message printer stmsgs: null arg ok arg cksum arg badst arg confg arg init_confg arg wait_again ignore "unwire" status ok: tsx2 erpt acc 'load successful' aos com|d355_state indicate success next_355: szn all_sw loading all? tze exit no, done lda which_355 get current one aos which_355 bump cmpa max_no_355s,dl is this last one tnz allset go again tra exit done " cksum: tsx2 erpt acc 'checksum error in 355 core image reported by 355' tra exit badst: tsx2 erpt acc '355 reports error in reading 355 core image' tra exit confg: tsx2 erpt acc 'configuration error reported by 355 bootloader' tra exit wait_again: stz mem|0,7 clear interrupt cells stz mem|16,7 tra wait_for_int " init_confg: tsx2 erpt acc 'configuration error reported by 355 initialization' ldq mbx_offset get offset of this mbx lda mem|dn355mbx+1,ql get status ana =o777,du isolate the stop code ars 18 shift down sta temp save in temp lda mem|dn355mbx+1,ql get status again ana =o777,dl isolate the channel number sba 9,dl convert into LSLA num sta lchan_no since only used for that lda temp get code back tze bad_init ng cmpa 14,dl check max tpl bad_init ng sba 1,dl index to list tra init_list,al dispatch on code init_list: tra bad_init tra init_2 tra init_3 tra init_4 tra init_5 tra bad_init tra bad_init tra init_8 tra init_9 tra init_10 tra init_11 tra init_12 tra init_13 init_2: tsx2 erpt report error acc 'timer channel not enabled' tra exit init_3: tsx2 erpt report error acc 'more than one dia configured' tra exit init_4: tsx2 erpt report error acc 'dia does not exist' tra exit init_5: tsx2 erpt report error acc 'dia did not respond' tra exit init_8: tsx2 erpt report error acc 'lsla ^o is not an lsla' arg lchan_no tra exit init_9: tsx2 erpt report error acc 'lsla ^o illegal sync speed' arg lchan_no tra exit init_10: tsx2 erpt report error acc 'lsla ^o failed ten times to init' arg lchan_no tra exit init_11: tsx2 erpt report error acc 'lsla ^o speed not equal desired speed' arg lchan_no tra exit init_12: tsx2 erpt report error acc 'timer switch incorrectly set' tra exit init_13: tsx2 erpt report error acc 'lsla ^o, actual config does not match config deck' arg lchan_no tra exit bad_init: tsx2 erpt acc 'load status ^w' arg mem|dn355mbx+1,ql tra exit " " " " Come here if we get interrupt but no status. DIA probably down. " " badint: tsx2 erpt acc 'bad 355 interrupt ... dia probably down' tra exit " " " Come here when emergency status interrupt received from 355 " " emergency_interrupt: tsx2 erpt print error message acc '355 emergency interrupt' tra exit return to bos not_loaded: tsx2 erpt too bad acc 'load failed' tra exit " " " " Constants and work variables " " prognm: bci ' mcs',6 dn355 pgm to be loaded ("mcs" for now) bss x2,1 save x2 pgm355: bss ,1 disk loc'n of 355 program pgmboot: bss ,1 disk loc'n of boot pgm bss relorg,1 storage for relative (in temp seg) origin of 355 prog bss absorg,1 storage for absolute origin of 355 prog bss norm_int_cell,1 bss int_bit,1 bss bcboff,1 bss temp,1 temp bss chk_sw,1 check option switch bss all_sw,1 all option sw which_355: oct 1 default is one temp_355n: bss ,1 which_list: bci 'abcd' equ max_no_355s,4 ldarg: bss ,1 bss lchan_no,1 indic: dec 0 storage for indicators accbits: vfd 18/sdw.read+sdw.write,18/sdw.unpaged access bits of sdw even bss begin_wait,2 default_waittime: dec 0,30000000 30 seconds in microseconds " " 1 x 6 array, 1 entry for each possible lsla lsla_ch_array: dec 0,0,0,0,0,0 " 6 x 8 array for lsla card ptrs lsla_array: dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 lsla_table_addr: oct 0 iom_table_addr: oct 0 iom_channel: oct 0 no_of_lslas: oct 0 zero: oct 0 no_of_hslas: oct 0 hsla_config_word: oct 0 hsla_table_word: oct 0 hsla_table_addr: oct 0 hsla_subchannel: oct 0 hsla_pcw_upper: oct 0 hsla_pcw_lower: oct 0 hsla_num: oct 0 hsla_subch: oct 0 lsla_conf_word: oct 0 baud_cnt: oct 0 ltemp: oct 0 ill_lsla: oct 0 ill_seq: oct 0 ill_baud: oct 0 " " Table of 4 word entries, 1 entry for each possible baud rate. " Word 0 of each entry is baud rate, word 1 is the basic subchannel data " set up for the hsla table, and words 2 and 3 are setup " for a configuration pcw. " " basic subchannel data " " bit meaning " 0 concentrator subchannel " 1 private line " 2 sync = 0, async = 1 " 3-5 (3) not used " 6-9 (4) modem type " 10-13 (4) line type " 14-17 (4) device speed code as follows: " " bits async sync " 01 75 2000 " 02 110 2400 " 03 133 3600 " 04 150 4800 " 05 300 5400 " 06 600 7200 " 07 1050 9600 " 10 1200 19200 " 11 1800 40800 " 12 option 50000 " 13-17 undefined--- " " HSLA configuration PCW formats " " Word 1 " " bit meaning " 0-1 (2) 10=async chan, 11=sync chan " 2-5 (4) char length code: 15=6, 16=7, 17=8 " 6 not used " 7-11 (5) subchannel number " 12 lateral parity receive " 13 lateral parity send " 14 lateral parity odd " 15 2 send ICW's " 16 CCT enable " 17 not used " " word 2 " " 18-23 (6) not used " " async sync " 24 2 stp bt not used " 25-27 (3) not used not used " 28 110 bit 8 of sync char " 29 134.5 7 " 30 150 6 " 31 300 5 " 32 1050 4 " 33 1200 3 " 34 1800 2 " 35 not used 1 baud_table: dec 110 baud vfd 18/0,o1/0,o1/0,o1/1,o3/0,o4/0,o4/0,o4/2 basic subchannel data vfd 18/0,o2/2,o4/17,o1/0,o5/0,o1/0,o1/1,o1/0,o1/1,o1/1,o1/0 1st word of PCW oct 200 2nd word of config pcw bits dec 133 vfd 18/0,o1/0,o1/0,o1/1,o3/0,o4/0,o4/0,o4/3 vfd 18/0,o2/2,o4/16,o1/0,o5/0,o1/1,o1/1,o1/1,o1/1,o1/1,o1/0 oct 100 dec 150 vfd 18/0,o1/0,o1/0,o1/1,o3/0,o4/0,o4/0,o4/4 vfd 18/0,o2/2,o4/17,o1/0,o5/0,o1/0,o1/1,o1/0,o1/1,o1/1,o1/0 oct 40 dec 300 vfd 18/0,o1/0,o1/0,o1/1,o3/0,o4/0,o4/0,o4/5 vfd 18/0,o2/2,o4/17,o1/0,o5/0,o1/0,o1/1,o1/0,o1/1,o1/1,o1/0 oct 20 dec 600 vfd 18/0,o1/0,o1/0,o1/1,o3/0,o4/0,o4/0,o4/12 vfd 18/0,o2/2,o4/17,o1/0,o5/0,o1/0,o1/1,o1/0,o1/1,o1/1,o1/0 oct 1 specifies option baud rate dec 1200 vfd 18/0,o1/0,o1/0,o1/1,o3/0,o4/0,o4/0,o4/10 vfd 18/0,o2/2,o4/17,o1/0,o5/0,o1/0,o1/1,o1/0,o1/1,o1/1,o1/0 oct 4 dec 1800 vfd 18/0,o1/0,o1/0,o1/1,o3/0,o4/0,o4/0,o4/11 vfd 18/0,o2/2,o4/17,o1/0,o5/0,o1/0,o1/1,o1/0,o1/1,o1/1,o1/0 oct 2 dec 2400 vfd 18/0,o1/0,o1/0,o1/0,o3/0,o4/0,o4/0,o4/2 vfd 18/0,o2/3,o4/17,o1/0,o5/0,o1/1,o1/1,o1/1,o1/1,o1/1,o1/0 oct 026 dec 4800 vfd 18/0,o1/0,o1/0,o1/0,o3/0,o4/0,o4/0,o4/4 vfd 18/0,o2/3,o4/17,o1/0,o5/0,o1/1,o1/1,o1/1,o1/1,o1/1,o1/0 oct 026 dec 7200 vfd 18/0,o1/0,o1/0,o1/0,o3/0,o4/0,o4/0,o4/6 vfd 18/0,o2/3,o4/17,o1/0,o5/0,o1/1,o1/1,o1/1,o1/1,o1/1,o1/0 oct 026 dec 9600 vfd 18/0,o1/0,o1/0,o1/0,o3/0,o4/0,o4/0,o4/7 vfd 18/0,o2/3,o4/17,o1/0,o5/0,o1/1,o1/1,o1/1,o1/1,o1/1,o1/0 oct 026 equ entry_len,4 equ baud_table_len,(*-baud_table)/entry_len " 1 x 3 array, 1 entry for each possible hsla hsla_channel_array: dec 0,0,0 hsla_array: "3 x 32 array initialized to -1 for each entry dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 dec -1,-1,-1,-1,-1,-1,-1,-1 include conf355 " include bos_sdw include bos_tv include bos_common end " " " ----------------------------------------------------------- " " " " 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 " "