" *********************************************************** " * * " * Copyright, (C) Honeywell Information Systems Inc., 1982 * " * * " *********************************************************** """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " " " This is a bos command to dump the Data-Net 355. The 355 core image is " read into a buffer, a block at a time and is dumped on the printer " in octal, ibm bcd, and ascii, eight words per line. Prior to the dump, " the registers at the time of the crash and the contents of the " trace table are printed. This command takes one optional argument " which is the character string "abs". If this argument is typed, " no attempt will be made to print the registers or trace table, only " the 355 memory. This is useful if the 355 being dumped contains " something other than the standard 355 software or if the standard " software has been badly munged making the trace table and fault register " pointers invalid. " " Assigned Segment Numbers: " " Seg No. Use " " 0 Descriptor Segment " 1 Scratch " 3 Command " 6 Common Data " 7 Absolute Core " " Written by Dick Snyder Feb 17, 1972 " Modified for follow-on by Dick Snyder July, 1972 " Modified for MCS by Mike Grady Feb. 13, 1975 " Modified to run multiple 355s by Mike Grady Aug. 21, 1975 " " """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" name dmp355 " ****************************************************** " * * " * * " * Copyright (c) 1972 by Massachusetts Institute of * " * Technology and Honeywell Information Systems, Inc. * " * * " * * " ****************************************************** " " " include bosequ " " " equates and bools " " equ blocksz,768 size of blocks to read from 355 rem (must be <4096, mod 8 and >64) equ fltnum,4 offset in saved registers of fault number equ fltnam,5 offset in saved registers of fault name " " dn355 communication region symbols " equ .crldt,416 date of loading equ .crltm,418 time of loading equ .crbdt,420 date of bootloading equ .crbtm,422 time of bootloading equ .crbuf,424 starting address of buffer area equ .crmem,425 last location of memory equ .crnbf,426 number of buffers available equ .criom,427 start of iom table equ .crnhs,428 number of hsla's configured equ .crnls,429 number of lsla's configured equ .cr27f,430 2741 terminals configured flag equ .crmod,431 starting address of first module equ .crltb,432 location of line number table equ .crtra,433 trace entry enable mask equ .crtrb,434 base address of trace table equ .crtrc,435 next available location in trace table equ .crreg,436 disaster fault register storage location equ .crsnp,437 datanet 355 memory snapshot flag equ .crspw,438 datanet 355 memory snapshot password equ .cr355,440 datanet 355 number " " " " " init the BOS environment for this program " stx2 x2 save x2 for return to bos tsx2 init_io init iom tsx2 initint init for interrupts arg ttyrequest here on execute fault tsx2 ttyinit init for tty interrupts from req button arg ttyrequest lda =h ptpkg eaq pt_org load the print package tsx2 ldcom tra x2 mlr (),(),fill(20) move the header into line desc6a header,header_lth desc6a pthdr,header_lth tsx2 rdclock get clock reading in dump header sta pthdr+4 stq pthdr+5 ldq header_lth+18,dl get offset of where to put command line " " process the arguments to this command " ldx2 x2 restore x2 lxl0 mem|0,2 get addr of command line stx0 4,ic put addr of command into descriptor lda =o700000,du or in pointer reg 7 orsa 2,ic into the descriptor mlr (pr),(ql),fill(20) move the command line in desc6a 0,72 desc6a pthdr,72 tsx2 printon " ldx2 x2 restore x2 ldx0 mem|0,2 get addr of possible arg aos all_sw default case argloop: lda mem|1,0 get arg 1 cmpa =-1 -1 if no arg supplied tze print_header normal dump cmpa =h abs arg = "abs" ?? tnz notabs no stc2 abssw eax0 1,0 step to next arg tra argloop notabs: cmpa =h tape tape specified? tnz nottape lda mem|2,0 get tape # sta arg+1 tmoz *+2 eax0 1,0 skip over argument tsx2 tapeon eax0 1,0 step over argument tra argloop nottape: ldq 0,dl zero q lrl 6 drop char into high q cmpa =o002020202020 is the rest blank? tnz argerr stq *+3 drop into scm scm (),(du),mask(0) look for one of the 355 nums (a, b, c, d) desc6a which_list,max_no_355s look in list arg 0 arg which_355 this is the info we want ttn argerr not in list, bad aos which_355 bump up by one eax0 1,0 next arg stz all_sw not all anymore aos conf355err turn on error processing in conf355 tra argloop argerr: tsx2 erpt indicate error to typist acc 'unrecognized argument' tra exit return to bos " print_header: lda which_355 get 355 number wanted tsx2 conf355 get config info for it tra next_355 none, what to do stz d355addr reset dump addr stz ic_355 reset printed location counter szn abssw abs mode? tze *+3 no, dont need this lda 32768,dl get 32k sta d355core ldq header_lth+18+40,dl point to nice place in header line mlr (),(ql),fill(20) move in which dump this is desc6a which_desc,whichdlen desc6a pthdr,whichdlen adq whichdlen,dl bump past there lda which_355 amount of which 355 this is mlr (al),(ql),fill(20) move in 355 number desc6a which_list-1(5),1 desc6a pthdr,1 tsx2 headform tsx2 space space fill buffer tsx2 print tsx2 print " " " " read in the 355 communication region and save pointer to trace info and registers " " read_com: szn abssw abs dump? tnz blk_loop if so, skip trace info tsx2 read_355_words get 355 common region arg indword zero .crldt,64 lda .crreg,du get addr of registers pointer sba .crldt,du rel to the read tsx2 fetch get the registers pointer sta registers save addr of registers lda .crtrb,du get addr of trace base sba .crldt,du relative tsx2 fetch sta trace_base save as trace base lda .crtrc,du get offset of trace current ptr sba .crldt,du relative tsx2 fetch sta trace_cur save as trace current ptr lda .crmod,du get module chain start addr sba .crldt,du relative to base tsx2 fetch get the word sta modchn lda .crmem,du get last mem loc address sba .crldt,du rel to the read tsx2 fetch get memory size arl 18 right justify ada 1,dl convert to last memory loc sta d355core cmpa 32768,dl test for legal size tmi *+3 it is lda 32768,dl not legal, guess at 32K sta d355core " " " " read registers from 355 and put on printer " " mlr (),(),fill(20) move in header of register names desc6a reg_names,reg_nml desc6a line,reg_nml tsx2 print print the header line now tsx2 space ldx4 registers get addr of registers tmi tr_prt minus, try to print trace table cmpx4 32768,du test for legal regs address tpl tr_prt bad, try to print trace table stx4 *+3 tsx2 read_355_words read 5 36-bit words arg indword zero *,5 lda prtally_model sta prtally eax5 buffer point to buffer lda fltnum,5 get fault number cana =o777770,dl processor fault? tze 3,ic yes lda =habort " get "abort" message tra 2,ic lda =hfault " get "fault" message sta line put crump reason in printer buffer lda fltnum,5 get the fault number ana =o777777,dl leave only the fault number lrl 36 put result in q mpy 3*6,dl multiply by 3*6 mlr (ql),(),fill(20) move fault name into line desc6a fault_names,18 desc6a line+1,18 eax4 line+4 get addr of where to store regs stx4 prtally put in print buffer tally word eax5 buffer point to data to be dumped ldx6 =o11,du get number of words to dump tsx2 dump_oct dump registers in octal tsx2 print print the line tsx2 space space fill the print line tsx2 print tsx2 print " " " " print the module chain " " mlr (),(),fill(20) move the header line in desc6a modchn_nm,12 desc6a line,12 tsx2 print tsx2 space ldx4 modchn get address of start of module chain mod_loop: stx4 3,ic put where we need it tsx2 read_355_words read in the next module chain arg indword zero *,2 two 36 bit words eaa 0 get zero offset tsx2 fetch get the word pointing to next chain eax4 0,au put into x4 eaa 1 get next word of chain tsx2 fetch first 6 chars of name sta line+1 put into line eaa 2 other 3 tsx2 fetch eax2 0,au put into index reg sxl2 line+1 store lower, not messing up upper eaa 3 get module addr word tsx2 fetch put in au sta tp.t1 save in temp eax5 tp.t1 get addr of temp word eax6 1 one 355 word to dump lda prtally_model sta prtally eax2 line+2 where to put word stx2 prtally tsx2 dump_oct dump it into line tsx2 print print the line tsx2 space cmpx4 0,du tnz mod_loop do more stuff tsx2 print tsx2 print " " " " setup to print contents of trace table " " tr_prt: null ldx1 trace_cur get trace table current pointer tmi trace_space minus, print core cmpx1 32768,du test for legal address tpl trace_space it isn't, go print core ldx4 trace_base get trace table base tmi trace_space minus, print core cmpx4 32768,du test for legal address tpl trace_space bad, print core stx4 *+3 tsx2 read_355_words read max no of words arg indword zero *,blocksz tsx2 space space fill line and set up printer buffer tally word stc1 noblank tell dump_oct not to put in blank tsx2 read_355_words now! read in the trace ptr words arg indwd2 zero .crtrb,1 only one 36 bit word needed lda tracewds get the tracebase ana =o777777,du only that sta trace_base save it lda tracewds get the other 355 word als 18 the trace current ptr sta trace_cur " " " " loop through trace table printing the entries " " lda trace_cur get ptr to oldest trace entry sba trace_base relative to point read in eax1 0,au put result into x1 tp.a: eaa 0,1 get point to entry into au tsx2 fetch get word at that addr into au cmpa =o525252,du is it end of table marker? tze trace_space yes, all done cmpa =o525250,du last entry in table? tnz tp.b no, continue eax1 0 set pointers back to base tra tp.a go for more data tp.b: sta tp.t1 save the entry header word ana =o77,du save only length of entry for now ada 1,du add one for time word sta tp.t2 save this length also cmpa 20,du more than 20 trace words tmi tp.b0 no, process as usual sreg sv_regs save regs around erpt tsx2 erpt print warning acc "more than 20 words of trace data, ignored" lreg sv_regs tp.b0: eax3 1,1 point x3 at the entry data eax4 0,au get number of words to dump into x4 lda prtally_model2 get the tally model sta prtally put into the tally word tp.b1: eaa 0,3 get address of this entry word in au tsx2 fetch get the word into au sta tp.t3 save it in temp eax5 tp.t3 get addr of temp eax6 1 number of 355 words to dump tsx2 dump_oct dump word into trace_data eax3 1,3 bump up the entry word addr eax4 -1,4 decrement the count tnz tp.b1 loop for more lda trace_data get the converted trace time sta line put into the print line lda =o200000,du get a bcd blank sta line+1 put into line also lda tp.t1 get the entry header word again arl 12 leave only the module number ana =o77,du I said only that. sba 1,du decrement by one for addressing ldx4 modtab,au get addr of correct list lda tp.t1 get entry header again arl 6 ana =o77,du get only trace type sba 1,du decrement by one sta tp.t3 put into temp adx4 tp.t3 add in to get offset of message ldx4 0,4 get addr of trace message lxl5 0,4 get the length of the message eax4 1,4 get addr of actual message stx4 2,ic put addr into first descriptor mlr (rl),(rl),fill(20) move message into print line desc6a 0,x5 from actual message for x5 chars desc6a line+1(1),x5 to line plus one, 1 char offset eax3 6 get offset of first trace datum eax6 0 set initial print line offset to zero tp.c: tct (rl,x6) scan the line for *'s desc6a line+1(1),x5 scan the print line length x5 arg tct_tbl1 using tct_table number one arg star_offset put offset of first star here ttn tp.d no more stars, all done lda star_offset fix up offset to add to x6 als 18 sta star_offset adx6 star_offset pick up the offset eaa 0,x5 get the length into au arl 18 down to al sba star_offset subtract offset eax5 0,al put new length into x5 tct (rl,x6) scan until we run out of stars desc6a line+1(1),x5 scan remaing print line arg tct_tbl2 use other table arg star_len put length here lda =o777777,dl get mask to leave only count ansa star_len lda 6,dl get count of 6 sba star_len get actual length of stars als 18 shift up to au sta tp.t3 put into temp adx3 tp.t3 add to x3, skipping unwanted digits lda star_len mlr (rl,x3),(rl,x6),fill(20) move trace data into print line desc6a trace_data,al desc6a line+1(1),al lda star_len get number of digits output als 18 shift over into au sta tp.t3 put into temp adx6 tp.t3 add onto offset, advancing msg ptr adx3 tp.t3 bump over rest of trace data word sbx5 tp.t3 decrement length tnz tp.c loop if more string left tp.d: tsx2 print print the trace message tsx2 space space fill the line eax1 1,1 bump over entry header adx1 tp.t2 add count value tra tp.a go do more trace entries trace_space: tsx2 space space fill line tsx2 print put out some space after trace tsx2 print * stz noblank zero the noblank switch " " " " come here when ready to dump core " " blk_loop: null tsx2 getblock read a block of 355 core eax1 buffer get starting addr tsx2 space space fill line ck_dup: null ldaq 0,1 check for dup of 8 words cmpaq dupline * tnz no_dup no ldaq 2,1 * cmpaq dupline+2 tnz no_dup no aos dupsw remember this tra nxtline no_dup: null ldaq 0,1 save 8 words for dup test staq dupline ldaq 2,1 staq dupline+2 szn dupsw have we skipped dup line? tze nodupsw no stz dupsw yes, clear sw lda =o205420,du get "*" stca line,70 store in printer buffer tsx2 print print the line tsx2 space space fill print image again nodupsw: null lda prtally_model sta prtally lda =o20,dl get a blakn sta prtally,sc store 4 blanks in front of print line sta prtally,sc sta prtally,sc sta prtally,sc eax5 ic_355 get 355 instruction counter ldx6 1,du dump 1 word tsx2 dump_oct do it lda =o20,dl get a blank sta prtally,sc put extra blank in after ic eax5 0,1 get pointer to words to dump ldx6 8,du dump 8 words tsx2 dump_oct convert to bcd lda =o20,dl get a blank sta prtally,sc put some blanks in print line sta prtally,sc * sta prtally,sc * sta prtally,sc * eax5 0,1 get pointer to buffer ldx6 8,du dump eight words tsx2 dump_ascii in ascii tsx2 print print the line tsx2 space and space fill buffer nxtline: null lda 8,du get ready to increment ic asa ic_355 do it adx1 4,du bump buffer pointer lda read get number of 355 words read sba 8,dl decrement sta read cmpa 0,dl see if <=0 words left tze *+3 tmi *+2 tra ck_dup positive number of words left szn d355core any more in 355 left to dump? tnz blk_loop yes, get a new block next_355: szn all_sw are we doing all? tze donedmp no lda which_355 get which one last done aos which_355 bump cmpa max_no_355s,dl last one? tnz print_header no, loop donedmp: " " " " eject paper at end of dump " " tsx2 wteof " " " come here to exit from dmp355 or if tty request button is pressed " " ttyrequest: exit: null x2: eax2 0 restore x2 lda =-1 no return arguments tra mem|1,2 RTB " " " " Constants " " registers: oct 0 addr of registers trace_base: oct 0 base of trace table addr trace_cur: oct 0 current entry in trace table bss trace_data,20 place to convert the trace data even tp.t1: oct 0 temp tp.t2: oct 0 temp tp.t3: oct 0 temp star_offset: bss ,1 star_len: bss ,1 even bss dupline,4 last eight words printed bss sv_regs,8 dupsw: oct 0 controls duplicate line suppression abssw: oct 0 controls absolute dumping all_sw: oct 0 all 355s being dumper which_355: oct 1 which one now which_desc: bci 'dump of 355 ' equ whichdlen,12 which_list: bci 'abcd' equ max_no_355s,4 ic_355: oct 0 current 355 loc being dumped prtally_model: vfd 18/line,12/132 prtally_model2: vfd 18/trace_data,12/6*20 prtally: bss ,1 even header: bci '1 datanet-355 core dump ' equ header_lth,(*-header)*6 " reg_names: bci ' ',24 bci 'ic ir a q ' bci ' x1 x2 x3 ' bci ' ier etr' equ reg_nml,83 indwd2: oct 0 tracewds: oct 0 modchn_nm: bci 'module chain' modchn: bss ,1 fault_names: bci 'none ' bci 'power on ' bci 'memory parity ' bci 'illegal opcode ' bci 'overflow ' bci 'store fault ' bci 'divide check ' bci 'illegal int ' bci 'extraneous int ' bci 'iom chan fault ' bci 'console abort ' include dn355_trace_msgs tct_tbl1: oct 0,0,0,0 00-17 bcd chars oct 0,0,0,0 20-37 oct 0,0 40-47 oct 0,777000000000 50-53,*,55-57 oct 0,0,0,0 60-77 tct_tbl2: dec -1,-1,-1,-1 00-17 dec -1,-1,-1,-1 20-37 dec -1,-1 40-47 oct 777777777777,000777777777 50-53,*,55-57 dec -1,-1,-1,-1 60-77 " " " " Subroutine to get a block of words from the 355 " " getblock: null stx2 gbexit save x2 for return lxl2 d355addr get 355 address to read next stx2 gbarg lda blocksz*2,dl get maximum read size cmpa d355core still that much left to be read? tmi *+2 yes lda d355core no, only read remaining core ldq d355core sta d355core compute how much sbq d355core 355 core still stq d355core to be read sta read save number of 355 words actually read asa d355addr compute next 355 addr to read arl 1 compute number to 36 bit words stca gbarg,07 tsx2 read_355_words go actually do the read arg indword gbarg: zero *,* gbexit: tra 0 return to caller " " " Constants " " d355addr: oct 0 next 355 address to read d355core: dec 32768 amount of 355 core (32k to start) read: oct 0 number of 355 words read " " " Subroutine to fetch a 355 word from dump area. Relative " address of 355 word in buffer passed in a reg upper. 355 " word returned in a upper. " " fetch: null eaq 0,au copy input to q arl 1 convert 355 addr to 600 addr ada buffer,du relocate to buffer lda 0,au get two 355 words canq 1,du did we want odd word? tze 3,ic no eaa 0,al yes, get in a upper tra 0,2 return to caller eaa 0,au get even word in a upper tra 0,2 return to caller " " " " Subroutine to convert 355 words to octal " " Input - x5 points to first word to dump " x6 contains number of 355 words to dump " prtally holds tally word pointing to output buffer " " dump_oct: null stz oddsw clear any residual value from oddsw eaa 0,6 get count arl 18 position in a-lower neg 0 negate sta docount save do_loop: null ldq 0,5 get two 355 words do_con: lda 6,dl neg 0 negate sta docnt2 save do_: lda 0,dl clear a lls 3 get an octit sta prtally,sc store bcd representation aos docnt2 hsave we done a 355 word yet? tmi do_ no szn noblank if no blank wanted, skip tnz do_m lda =o20,dl get a blank sta prtally,sc store at end of 355 word do_m: aos docount test if done tze 0,2 yes, return to caller szn oddsw did we do odd half of word tnz 3,ic yes aos oddsw no, we are going to it now tra do_con stz oddsw adx5 1,du bump input pointer tra do_loop continue " " " constants " " docount: oct 0 docnt2: oct 0 oddsw: oct 0 noblank: oct 0 " " " " Subroutine to convert 355 to ascii graphics " " Input - x5 points to first word to dump " x6 holds number of 355 words to dump " prtally is a tally word pointing to the output buffer " " " dump_ascii: null stx2 daxit save return address xloop1: lda 0,5 get word tsx2 asge convert to GE BCD eax2 4 store 4 characters xloop2: alr 6 character in A (30-35) sta prtally,sc store it eax2 -1,2 decrement character index tnz xloop2 and loop for 4 characters eax5 1,5 step to next word eax6 -2,6 decrement word count tnz xloop1 loop until done daxit: tra * return to caller include rd355 include conf355 " " " " indirect word and buffer for reading 355 core load blocks " " odd indword: oct 0 buffer: bss ,blocksz " include bos_sdw include pt_equ 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 " "