" *********************************************************** " * * " * Copyright, (C) Honeywell Information Systems Inc., 1982 * " * * " *********************************************************** " ntape -- Multics Standard Tape Package. " Modified for MTS-500 Operation on 9/7/73 by N. I. Morris " Modified 2/80 by R.J.C. Kissel for 6250 bpi operation. " Modified November 1981 by C. Hornig to not use IOM rel mode. name ntape " ****************************************************** " * * " * * " * Copyright (c) 1972 by Massachusetts Institute of * " * Technology and Honeywell Information Systems, Inc. * " * * " * * " ****************************************************** include bosequ include bos_toequ " include sav_io_buf_seg include ntape_equ " " events are: " 0 = bad data xfer " 1 = no tape " 2 = good " " xrs are: " 0 = buffer index " 1 = log record index " 3 = queue index " " tape format is: " 0/ id of data " 1/ offset of next log. header, offset in log record of following data " ... " logical header: " id " next log header, length of log record " ... " org ntape_org org taperopen tra taperopen_ org tapewopen tra tapewopen_ org taper tra taper_ org tapew tra tapew_ org inittape tra inittape_ org opentaper tra opentaper_ org opentapew tra opentapew_ org runtape tra runtape_ org endtape tra endtape_ " " tsx2 inittape to initialize tape package " zero tapeden only used by ntape " zero fatal_error go here on fatal error in opentape(r w)_ inittape_: stx2 intpx2 save X2 lda 0,2* get the density setting command sta ntapeden save it for later use eaa 1,2* compute actual error return address sta fatal_open_return save for later use by opentape(r w)_ lda com|tapechanno sta tpchanno als 9 Shift to PCW position sta tppcw+1 tsx2 get_status_interrupt Run "interrupt" driven for faster response. zero tpchanno,tpint intpx2: eax2 * restore X2 tra 3,2 " tsx2 endtape to close out tape endtape_: stx2 tpet here to end a tape stc1 tpfin tsx2 runtape szn tpfin wait until finished tnz *-2 tsx2 erpt print total errors on tape acc "tape errors = ^d." arg tperrors tpet: tra * " " tsx2 opentape(r/w) to open tape " zero queue " zero tapeno opentapew_: stc2 setrtn set return loc from setape tra setape perform setup operations lda ntapeden get the set density command sta owden set it into the argument list tsx2 dotape owden: oct 0 tra owbadden couldn't do it owbuflen: lda ntapeden adjust the buffer length depending on density cmpa =o41,dl is it 6250 bpi? tze ow6250 yes, we need a big buffer lda small_tp_buff,du small buffer size sta tpn_du arl 18 get it into al sta tpn tra owcomden ow6250: lda big_tp_buff,du big buffer size sta tpn_du arl 18 get it into al sta tpn owcomden: stca tpwlist+1,03 set the length into the write DCW stca tprlist+1,03 set the length into the read DCW als 18 get it into au sta tprecl lrl 18+36 put it back into ql for the multiply mpy 36,dl convert to bits stcq hdr+4,07 store in record header word stq tpn_x_36 save for later use in dl qls 18 get into qu stq tpn_x_36_du save for later use in du tra owcont owbadden: tsx2 erpt acc "Density not set as specified in save (from opentapew_)." tra fatal_open_return,* transfer to return address saved by inittape owcont: eax0 0 buffer index eax7 0 stx7 hdr+4 reset bit count lda =o600000,du set flags sta hdr+5 rscr 4*8 read the clock sta hdr+1 use for unique ID stq hdr+2 .. sta tlr+1 .. stq tlr+2 .. stz tpbuf clear header stz tpbuf+1 stz tpburstsw clear PE burst error switch tsx2 tpwrit write label szn tpburstsw Did burst error occur? tnz resetape if so, try all over again tsx2 tpweof eax2 tpw0 simulate call tra tpqtest enter subroutine to get next queue entry " " Finish with current queue entry and get next one. tpwql: tsx2 tpnextq on to the next tpw0: tra tpweot end of tape return szn tpeotsw if end of tape tnz tpweot " Prime new buffer. cmpx0 0,du if at start of buffer tnz tpw1 lda 1,3 fill in header sta tpbuf with id lda 2,du sta tpbuf+1 eax0 2 next header at word 2 " Strip trailing zeroes from the data. tpw1: eaq 0,7 length in QU mpy =6,dl compute 6-bit character length tctr (pr,rl) search backward for non-zero word desc6a xs1|0,qu .. arg tctable .. arg tptemp .. ldq tptemp get tally to non-zero character anq =o77777777 mask the tally div =-6 get word tally and complement eax7 1,ql place in X7 and round to nearest even adx7 tplenq subtract from original length anx7 =o777776,du round stx7 tplen save length with stripped zeroes " Set logical header and copy data. sxl7 tpbuf+1,0 set data length in header tpw3: lda 1,3 set id in log header sta tpbuf,0 stx1 tptemp save current data offset eax7 2,0 will rest of data fit in this phy rec? adx7 tplen compute next buffer index sbx7 tptemp sub off what is done cmpx7 tpn_du is it larger than tape record? tmi *+2 tra if no ldx7 tpn_du set index to fill rest of phy rec stx7 tpbuf+1,0 store index to next header eax0 2,0 skip over header info stx0 tpcopyl store current index ssx7 tpcopyl subtract from next index tze tpwc0 if zero, avoid IPR fault lda tpcopyl word count to copy in AU als 2 get character count eax7 0,au in X7 eaa 0,0 buffer offset in AU eaq 0,1 data offset in QU lls 2 compute character offsets mlr (pr,rl,qu),(rl,au) copy the data into buffer desc9a xs1|0,x7 desc9a tpbuf,x7 tpwc0: adx0 tpcopyl bump buffer index and adx1 tpcopyl data index by amount copied " If more data, then write out this record and proceed. " Otherwise, go get next queue entry. cmpx0 tpn_du if buffer not full tnz tpwql go get more ldx7 tpn_x_36_du full record, set bitcount stx7 hdr+4 .. stz hdr+5 clear record flags tsx2 tpwrit write record eax0 0 reset buffer pointer cmpx1 tplen if all of log record tpl tpwql go get more sxl1 tpbuf+1 set current data offset in header tra tpw3 and copy more data " " End of logical or physical tape. tpweot: eaa 0,0 current buffer offset in AU neg 0 subtract from buffer length ada tpn_du to get remaining length eaq 0,0 buffer offset in QU lls 2 get character count and offset mlr (),(rl,qu),fill(777) pad rest of record with 1's desc9a *,0 desc9a tpbuf,au mpy 36/4,dl compute bits in last record stcq hdr+4,70 and place in tape header stz hdr+5 tsx2 tpwrit write record tsx2 tpweof write eof eax7 0 then write end of tape label stx7 hdr+4 reset bit count lda =o500000,du set end of tape sta hdr+5 lda tpn_du character length of tape buffer in AU als 2 multiply by 4 to get characters mlr (),(rl),fill(777) fill the buffer with 1's desc9a *,0 desc9a tpbuf,au tsx2 tpwrit eax0 3 write 3 eofs tsx2 tpweof eax0 -1,0 tpl *-2 tpreot: " Done with tape, unload it unless it is the last. szn tpfin Zero if tape full, not if closing out last tape. tze *+3 tsx2 tprew Rewind tape without unloading it. tra *+2 tsx2 tprewun Rewind and unload tape, expecting another. lda tpeot,dl get EOT flag orsa 0,3 set in queue entry stz tprunning tape no longer connected tsx2 tpret wait for new open call stz tpfin let endtape return tra tpret " tpwrit: stx2 tpwx2 here to write a record lda hdr+4 set total number of bits arl 18 asa tlr+3 tprewt: lda hdr+1 bump the unique ID ldq hdr+2 .. adl 1,dl by 1 sta hdr+1 replace in header stq hdr+2 .. sta tlr+1 and in trailer stq tlr+2 .. szn tpeotsw was EOT reflector passed? tze *+3 If not, skip this code. lda =o11,du Get EOT flag for record. orsa hdr+5 And insert in record header. tsx2 tpcks_new compute checksum zero hdr sta hdr+6 tsx2 connect_iom start io zero tppcw,tpwidcw stc2 tprunning set state tsx2 tpret tra tpwbad retry io errors tra tprewt retry no tape aos tlr+6 good write bump record nos lda =1,du asa hdr+3 ldx7 hdr+3 is it time to write eof cmpx7 =o200,du tnz *+2 tsx2 tpweof tpwx2: tra * tpwbad: lda =o14,du set retry flag orsa hdr+5 aos hdr+5 and count tra tprewt " tpweof: stx2 tpwex2 here to write eof tsx2 dotape oct 55 wef tra *-2 try again if error aos tlr+5 bump file count aos hdr+3 eax7 0 stx7 hdr+3 zero record count tpwex2: tra * tprewun: lda =o72,dl Rewind and unload. tra *+2 tprew: lda =o70,dl Rewind tape. sta tprewop stx2 rewx here to rew log tape stz hdr+3 reset record and file counts stz tlr+3 stz tlr+5 stz tlr+6 tsx2 dotape tprewop: oct 72 rewind/unload or just rewind. tra *-2 rewx: tra * " " tsx2 opentape(r/w) to open tape " zero queue " zero tapeno opentaper_: stc2 setrtn set return from setape tra setape setup for tape operation lda =o60,dl sta ntapeden tsx2 dotape set the density oct 60 try 800 bpi first tra tpr1600 try 1600 bpi on error tsx2 dotape oct 45 fsf to test the density tra tpr1600 1600 bpi on error tra tprgo tpr1600: tsx2 tprew lda =o65,dl sta ntapeden tsx2 dotape oct 65 1600 bpi tra tpr6250 try 6250 bpi on error tsx2 dotape oct 45 fsf to test tra tpr6250 6250 bpi tra tprgo tpr6250: tsx2 tprew lda =o41,dl sta ntapeden tsx2 dotape oct 41 6250 bpi tra orbadden tsx2 dotape oct 45 fsf to test tra orbadden give up if this fails tra tprgo orbadden: tsx2 erpt acc "Could not read save tape at 800, 1600, or 6250 bpi." tra fatal_open_return,* tprgo: lda ntapeden adjust the buffer length depending on density cmpa =o41,dl is it 6250 bpi? tze or6250 yes, we need a big buffer lda small_tp_buff,du small buffer size sta tpn_du arl 18 get it into al sta tpn tra orcomden or6250: lda big_tp_buff,du big buffer size sta tpn_du arl 18 get it into al sta tpn orcomden: stca tpwlist+1,03 set the length into the write DCW stca tprlist+1,03 set the length into the read DCW als 18 get it into au sta tprecl lrl 18+36 put it back into ql for the multiply mpy 36,dl convert to bits stcq hdr+4,07 store in record header word stq tpn_x_36 save for later use in dl qls 18 get into qu stq tpn_x_36_du save for later use in du ldx0 tpn_du initialize buffer index to force tape read lda 1,dl initialize expected record # sta tpxrec .. stz tperct stz tpct reset error counts stz tpcompatsw stz tpuid clear the previous unique ID stz tpuid+1 .. eax2 tpr0 set return loc for subroutine tra tpqtest go get first queue entry " " Proceed to next queue entry. tprql: tsx2 tpnextq get next queue entry tpr0: tra tpreot end of tape return " Search for correct logical record. tprsl: cmpx0 tprecl if through record, get another tmi *+2 .. tsx2 tprd .. lda tpbuf,0 pick up ID tmi tpreot test for end of tape cmpa 1,3 is this correct ID? tmi tpnid if not far enough, search more tpnz tprfatal if too far, record is lost cmpx0 0,du at beginning of physical record? tnz tpr2 if not, go set length ldx7 tpbuf+1 X7 = 2 => not a continuation record cmpx7 2,du must not have a continuation record here tnz tprfatal .. tpnid: ldx0 tpbuf+1,0 go to next header tra tprsl .. " Set length of logical record. tpr2: lxl7 tpbuf+1,0 set length stx7 tplen eax1 0 and index " Copy data from tape record. When finished, pad copied data with zeroes. tprcpy: ldx7 tpbuf+1,0 copy data from tpbuf eax0 2,0 skip over header info stx0 tpcopyl store current index ssx7 tpcopyl subtract from next index lda tplenq remaining data length in AU ldq tpcopyl length to copy in QU lls 2 compute character lengths eax6 0,au target length in X6 eax7 0,qu source length in X7 eaa 0,0 get buffer offset eaq 0,1 and data offset lls 2 compute character offsets adx0 tpcopyl bump buffer index adx1 tpcopyl and data index cmpx1 tplen is this the last copy? tpl *+2 tra if so eax6 0,7 if not, don't pad the data cmpx6 0,du are we copying anything? tze tprc0 if not, avoid IPR fault mlr (rl,au),(pr,rl,qu),fill(0) copy and pad desc9a tpbuf,x7 desc9a xs1|0,x6 lca tpcopyl get length copied asa tplenq subtract from remaining data length tprc0: cmpx1 tplen have we transferred all data? tpl tprql yes. get next queue entry " Read and check continuation record. tsx2 tprd read the next physical record cmpa 1,3 correct ID? tnz tprfatal no, fatal error lxl7 tpbuf+1 get offset of first word stx7 tptemp .. cmpx1 tptemp check against desired offset tze tprcpy offset good. copy the data " Fatal error. Mark failure in queue entry. tprfatal: lda tpstat,dl get tape error flag orsa 0,3 insert in queue entry flags tra tprql and get next queue entry " " Read and Check Tape Record. tprd: stx2 tprx2 save X2 tprd1: stz tperct clear the backspace-retry count tpragn: stz tpct clear count of records skipped tpag1: aos tpct count one record read stz rhdr clear check words in header stz rhdr+7 .. stz rtlr and trailer stz rtlr+7 .. tpcon: tsx2 connect_iom start read zero tppcw,tpridcw stc2 tprunning tsx2 tpret set state to reading data tra tpag1 try again on bad read tra tpcon retry if not ready lda rhdr check header check words cmpa hdr tnz tpag1 lda rhdr+7 cmpa hdr+7 tnz tpag1 ldq rhdr+4 get bit length of record anq =o777777,dl in QL div =36,dl compute word length qls 18 shift to QU stq tprecl save record length cmpq tpn_du is it a short record? tze tpok1 if not, trailer in correct place qls 2 get character offset of trailer mlr (qu),() copy the trailer to correct place desc9a tpbuf,8*4 desc9a rtlr,8*4 tpok1: lda rtlr now check trailer check words cmpa tlr tnz tpag1 lda rtlr+7 cmpa tlr+7 tnz tpag1 tsx2 tpcks_new check check sum zero rhdr cmpa rhdr+6 tnz tpag1 lda rhdr+1 get unique ID from header ldq rhdr+2 .. cmpaq tpuid is it ascending? tmoz tpragn if not, try again lda rtlr+6 get record # from trailer cmpa tpxrec is this expected #? tmi tpragn too low. read gain tpnz tpback too high. back up aos tpxrec ok. bump expected record # lda rhdr+1 get unique ID again ldq rhdr+2 .. staq tpuid and save it for next record lda rhdr+5 get admin bits from header cana =o100000,du test for end of reel tnz tpreot tra if end of reel lda tpbuf get first logical ID tmi tpreot if negative, end of tape eax0 0 reset index to first logical header tprx2: eax2 * restore X2 tra 0,2 and return to caller tpback: lxl0 tpct get # of records read eax0 4,0 plus a few extra tpbkl: tsx2 dotape backspace the tape oct 46 .. tra *+1 ignore errors eax0 -1,0 .. tpl tpbkl .. aos tperct increment the backspace-retry count lda tperct how many times have we done this? cmpa 5,dl if fewer than 5, tmi tpragn try again aos tpxrec otherwise, throw away this record tra tprd1 and try to read next " " tsx2 runtape to keep tape moving runtape_: stx2 tprunx2 save callers regs szn tprunning tape connected? tze tpstatp if not, skip check_status call tsx2 check_status arg =0 tra *+2 tra *+1 tpstatp: lda tpstatus get saved status cmpa tpoldstatus has it changed? tze tprunx2 if not, don't print it sta tpoldstatus save for comparison tsx2 erpt print error status acc 'ntape: tape status = ^w.' arg tpstatus tprunx2: eax2 * szn tprunning tape running now? tnz 0,2 if so, return to caller sreg tphisreg lreg tpmyreg load mine ldx2 tpstate and tra to state prog tra 0,2 at run entry tpret: stx2 tpstate remember where we were sreg tpmyreg here to return, save my regs lreg tphisreg and load theirs tra 0,2 " " ldaq status " tsx2 tpint to deliver status tpint: sznc tprunning tape connected? tze 0,2 if not, must be spurious call sreg tphisreg save callers machine lreg tpmyreg restore mine ldx2 tpstate lda tphisreg+4 get status cana =o370000770000 Check for all bad status. tnz tperr If bad, analyze error. stz tpstatus Clear old status. stz tpoldstatus .. tra 2,2 Report normal termination. tperr: eaq 0,au Major status in QU. qrl 12 Right-justify in QU. anq =o37,du Mask major status and power bit. tra tpdisp,qu Dispatch on major status. tpdisp: tra tpbio1 0: IOM channel or central error tra tpatt 1: device busy tra tpatt 2: device attention tra tpdde 3: device data alert tra 1,2 4: end of file tra 0,2 5: command reject tra tpbio1 6: tra tpbio1 7: tra tpbio1 10: tra tpbio1 11: tra tpcompat 12: MPC device attention tra tpburst 13: MPC device data alert tra tpbio1 14: tra tpbio1 15: MPC command reject tra tpbio1 16: tra tpbio1 17: tra tpatt 20: peripheral absent or power off tpbio1: sta tpstatus save status for reporting tpbio: aos tperrors count errors tra 0,2 take error return tpdde: cana =o4000,du EOT bit on? tze tpdde1 If not, treat as tape error stc1 tpeotsw Set EOT flag. cana =o3700,du Any other substatus bits on? tze 2,2 If not, take normal return tpdde1: cana =o0100,du Transfer timing error? tze tpbio If not, just count error. tra tpbio1 Report the error. tpcompat: cana =o1000,du Compatibility error? tze tpbio1 If not, treat as tape error. stc1 tpcompatsw Set compatibility error flag. tra 0,2 Take error return tpburst: eaq 0,au Status in QU. anq =o7700,du Mask substatus. cmpq =o1000,du PE burst error? tnz tpbio If not, record and continue. stc1 tpburstsw If so, set switch and continue. tra tpbio1 Print error. tpatt: sta tpstatus Report status online. tra 1,2 Retry operation. " " Utility subroutines. " tsx2 setape to set up PCW and IDCW's. setape: eax2 2,2 change return loc sreg tphisreg save registers ldx3 -2,2 get queue pointer in X3 lda -1,2* get tape # in A sta tapeno fill tape number into pcw's als 24 stca tppcw,20 stca tpridcw,20 stca tpwidcw,20 stca tpdidcw,20 resetape: stz tpfin clear flags stz tpeotsw stz tperrors Clear error count. tsx2 tprew rewind the tape setrtn: tra * return to caller " tsx2 tpcks_new to compute tape checksum tpcks_new: "See MPM Ref. Data 5.3 stx0 tpckx0 X0 gets clobbered by RPD ldx7 0,2 routine to compute multics checksum eax6 8,7 X6 is trailer pointer eax5 1 X5 is shift index ldi =o4000,dl lda =0,dl odd; rpda 6,1 do the header awca 0,7 alr 0,5 awca 1,7 get the last word alr 0,5 odd; rpda 8,1 do the trailer awca 0,6 alr 0,5 awca =0,dl get any remaining carry tpckx0: eax0 * restore X0 tra 1,2 " " tsx2 tpnextq to discard current queue and get next entry tpnextq: lda tpdone,dl finish with current queue entry orsa 0,3 turn on done bit ldx3 0,3 step to next queue entry tpqtest: lda 0,3 get flags cana tpdone,dl anything to do? tze tpnd if so, go to it szn tpfin finished with tape? tnz 0,2 if so, take end of tape return stx2 tpnqx2 save X2 stz tprunning set state to waiting tsx2 tpret and wait for more work tpnqx2: eax2 * run call, restore X2 tra tpqtest see if more work to do tpnd: cana tpskip,dl skip this queue entry? tnz tpnextq if so, go get another one ora tpstat,dl turn off error bit era tpstat,dl .. sta 0,3 store flags back in queue entry ldx7 2,3 get segment # and offset eaa 0,7 segment # in A (0-2) anx7 =o77777,du mask the offset arl 15 right-justify segment # in AU easp xs1,0,au pr 4 -> data segment eawp xs1,0,7 .. lxl7 2,3 get length from queue eax7 1,7 round to next even anx7 =o777776,du .. stx7 tplenq save data length eax1 0 reset data index tra 1,2 return to caller " " tsx2 dotape to perform non-data transfer operation " oct command " tra error dotape: stx2 dx lda 0,2 als 30 fill in command stca tpdidcw,40 domore: tsx2 connect_iom start oper zero tppcw,tpdidcw stc2 tprunning tsx2 tpret wait for status tra dobad tra doagain tra dx doagain: ana =o370000,du mask the major status cmpa =o040000,du EOF? tnz domore if not, try again dx: eax2 * tra 2,2 dobad: ldx2 dx tra 1,2 " " Storage and Constants. tpstate: bss ,1 last loc'n in ntape package tprunning:bss ,1 non-zero if tape connected tpfin: bss ,1 non-zero to finish up tape tpeotsw: bss ,1 non-zero when EOT reflector encountered tpcompatsw: bss ,1 non-zero if compatibility error occurred tpburstsw:bss ,1 non-zero if PE burst error occurred tapeno: bss ,1 current tape handler # tplen: bss ,1 length of logical record on tape tplenq: bss ,1 length of logical record from queue tpchanno: bss ,1 tape channel # tperct: bss ,1 # of times tape direction changed tpct: bss ,1 # of records skipped reading tpxrec: bss ,1 next expected physical record # tprecl: bss ,1 data length of record on reading tpn: bss ,1 length of tape record in dl tpn_du: bss ,1 length of tape record in du tpn_x_36: bss ,1 length of tape record in bits in dl tpn_x_36_du: bss ,1 length of tape record in bits in du ntapeden: bss ,1 tape density, set by opentaper_ tpstatus: bss ,1 tpoldstatus: bss ,1 tptemp: bss ,1 tperrors: bss ,1 count of errors on tape tpcopyl: bss ,1 # of words to copy fatal_open_return: bss ,1 set by inittape for use in opentape(r w)_ even tpuid: bss ,2 last unique ID read from tape tctable: vfd 9/0,9/1,9/1,9/1 table to stop tct on non-zero character vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 vfd 9/1,9/1,9/1,9/1 " " DCW Lists and Tape Buffers. even tppcw: vfd o6/40,6/0,6/0,3/7,3/2,6/2,6/1 reset status (PSIA compat.) vfd 9/*-* tpwidcw: vfd o6/15,6/0,6/0,3/7,3/0,6/0,6/0 Write tape binary. tpwlist: vfd 18/hdr+pgmorg,6/1,12/8 Write header, data, trailer. vfd 18/tpbuf+pgmorg,6/1,12/0 set in inittape_ and opentapew_ vfd 18/tlr+pgmorg,6/0,12/8 tpridcw: vfd o6/05,6/0,6/0,3/7,3/0,6/0,6/0 Read tape binary. tprlist: vfd 18/rhdr+pgmorg,6/1,12/8 Read header, data, trailer. vfd 18/tpbuf+pgmorg,6/1,12/0 set in inittape_ and opentaper_ vfd 18/rtlr+pgmorg,6/0,12/8 tpdidcw: vfd o6/0,6/0,6/0,3/7,3/0,6/2,6/1 Non-data operation. tpddcw: vfd 6/0,6/0,6/0,3/7,3/0,6/2,6/1 Request status (just in case). eight bss tpmyreg,8 bss tphisreg,8 eight hdr: oct 670314355245 phy rec header vfd 72/0 vfd 18/0,18/0 phyrec,phyfil vfd 18/0,18/0 ndata bits, initialized in opentapew_ vfd 36/0 flags vfd 36/0 checksum oct 512556146073 tlr: oct 107463422532 vfd 72/0 mul id vfd 36/0 ndata bits of log tape vfd 36/0 padding bits vfd 18/0,18/0 reel number,phy file in log tape vfd 36/0 record in log tape oct 265221631704 bss rhdr,8 bss rtlr,8 bss tpbuf,small_tp_buff " " tapesyn -- simple tape interface. "tsx2 tape(r/w)open to init simple tape interface "arg tapen tapewopen_: stx2 stwo lda 0,2 loc of tape number sta *+3 tsx2 opentapew zero stq zero * stwo: eax2 * tra 1,2 taperopen_: stx2 stro lda 0,2 loc of tape number sta *+3 tsx2 opentaper zero stq zero * stro: eax2 * tra 1,2 "lda id "tsx2 tape(r/w) "arg segno|offset "arg length "tra error taper_: tapew_: "both entrys same stx2 stx2 sta stid save id ldx7 0,2 put loc in queue stx7 stloc ldx7 1,2 length sxl7 stloc eax7 0 turn off done bit sxl7 stq tsx2 runtape keep tape running lxl7 stq wait for done bit to come on canx7 tpdone,du tze *-3 stx2: eax2 * canx7 tpstat,du test error bit tnz 2,2 error tra 3,2 even stq: zero * queue of one entry stid: oct 0 id stloc: oct 0 segno|offset,length 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 " "