tdlr(1): /* all peripheral operations */ tdl.tppos_save = vdec4; /* save posible number for fsfxx, bsfxx, bkfxx */ tdl.tmnem = inst$tdli(dovar1); check =fixed(inst$tdlr_type_conv_control((dovar1-1)*12+24)); per_op_common: tdl.topcd = tst.opd(check + 1); /* op def to topcd */ if tdl.topcd.op_type >-1 then goto move_standards_to_call; inv_data = "trying to issue illegal op-code to device"; goto say_invalid_instruction; move_standards_to_call: tdl.tdata = tdl.tdatas; tdl.tdtyp = tdl.tdtyps; tdl.tcwdl = tdl.tcwdls; tdl.testat = tdl.testas; tio.tadwd = tdl.tadwds; tdl.tpmb.op_code = tdl.tpmbs.op_code; if tdl.tpxdio ^=0 then goto prdup; if tdl.tdcws.wc = 0 then goto use_tpmax; if tdl.tdcws.wc >320 then goto use_tpmax; tio.tdcw.wc = bit(fixed(tdl.tdcws.wc,12),12); goto used_std_dcw_wc; use_tpmax: tio.tdcw.wc = bit(fixed(tst.max,12),12); goto used_tpmax_wc; used_std_dcw_wc: tdl.tdtcal_reladd = 0; tdl.tdtcal_wc = fixed(tio.tdcw.wc); used_tpmax_wc: if chgmode = -1 then goto set_length; tdl.tpmb.op_code = tdl.topcd.op_code; tdl.tpmb.iom_cmd = tdl.topcd.ioc_cmd; tdl.tpmb.reccnt = tdl.topcd.record_count; if tdl.topcd.op_type = 0 then goto tis_non_data; if tdl.topcd.op_type = 1 then goto tis_write; if tdl.topcd.op_type = 2 then goto tis_address; if tdl.topcd.op_type = 3 then goto tis_read; inv_data = "op-code <0 in perif--should not happen"; goto say_invalid_instruction; tis_non_data: status_zero_ptr = addr(tdl.status); status_zero = "000000000000000000000000000000000000"b; tis_address: tio.tdcw.wc = "000000000001"b; /* address word wc = "000000000001"b */ tdl.tcwdl = 0; tdl.tdtyp = 0; tio.tdcw.add= rel(addr(tio.tadwd)); goto cmd_common; tis_write: tio.tdcw.add = rel(addr(tio.twarea)); goto tis_write_read; tis_read: tio.tdcw.add = rel(addr(tio.trarea)); tis_write_read: tdl.tncflg = 0; status_zero_ptr = addr(tdl.status); status_zero = "000000000000000000000000000000000000"b; cmd_common: tdl.testat.major_status= tdl.topcd.major_status; tdl.testat.sub_status= tdl.topcd.sub_status; tdl.testat.ignore_ss = tdl.topcd.ignore_ss; if tdl.tmiflg = 0 then goto dont_force_ignore_ss; tdl.testat.ignore_ss = "1"b; dont_force_ignore_ss: tdl.testat.expected_interrupts = tdl.topcd.expected_interrupts; prdup: tdl.trrec = "000000"b; tdl.trwrd = "000000000000"b; cmpflg = 0; if tdl.tmiflg ^=0 then goto prinit; /* mass storage checks here----assume not ram */ prcmp: prsav: if tdl.tpxdio ^= 0 then goto prinit; tdl.tscnt(11) = tdl.line_number; tdl.tsfld(11) = tdl.topfld; prinit: tdl.tnrflg,tdl.tnmflg,tdl.tntflg,tdl.trflg,tdl.tnsflg,tdl.second_io_of_dual = 0; chgmode = 1; /* set to previous */ if cmpflg ^=0 then goto nxfld; prcmp1: if tdl.tcwdl ^=0 then goto lcset; tdl.tfdcwp = addr(tio.tdcw); goto nxfld; set_length: if tdl.tcwdl ^=0 then goto lcset; tdl.tfdcwp = addr(tio.tdcw); goto nxfld; tdlr(2): /* LPdd.U or dd */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; tdl.line_number = fdec1; goto nxlin; tdlr(3): /* $ */ tdl.do_dual_io = 1; goto nxfld; tdlr(4): /* * */ if tdl.terflg ^=0 then goto skipf; goto nxfld; tdlr(5): /* Aoooooooooooo-- */ /* set address */ tio.tadwd = bit (fixed(octnum,36)); goto nxfld; tdlr(6): /* AAoooooooooooo-- */ /* add to address */ tio.tadwd = bit(fixed(fixed(octnum,36) + fixed(tio.tadwd,36),36)); goto nxfld; tdlr(7): /* ABT */ goto set_obsolete_msg; tdlr(8): /* ADoooooooooooo-- */ tdl.tdtyp = 4; goto dtypst; tdlr(9): /* ADROT */ tdl.tdtyp = 10; goto dtypst; tdlr(10): /* AL--dddd */ if vdec4 > 321 then goto say_too_big; vdec4 = vdec4 + tdl.tdtcal_wc; if vdec4 > 321 then goto say_too_big; call set_dcw_len; goto nxfld; tdlr(11): /* AMdd.--dddd */ goto set_obsolete_msg; tdlr(12): /* AOPoo */ tdl.tmnem = inst$tdli(dovar1); check = octnum + fixed(tdl.tpmb.op_code); if check <64 then goto per_op_common; check = check - 64; goto per_op_common; tdlr(13): /* ARAN */ /* aran - generate random seek address */ call random_$uniform(seed,random_no); adrange = adhi - adlow ; adproduct = adrange * random_no; tio.tadwd = bit((adproduct + adlow),36); go to nxfld; tdlr(14): /* B-d */ tdl.tscnt(vdec4+1) = tdl.tscnt(11); tdl.tsfld(vdec4+1) = tdl.tsfld(11); skip_field_no = 2; /* preset for loop off */ if tdl.loop = 0 then goto fldct; /* loop on--skip 0 if error, 1 if no error */ if tdl.terflg = 0 then goto nxfld; skip_field_no = 1; goto fldct; tdlr(15): /* CHG */ chgmode = -1; goto move_standards_to_call; tdlr(16): /* CHMoooooooooooo-- */ tdl.tchmsk = bit(fixed(octnum,36)); goto nxfld; tdlr(17): /* CHXIdd.--dd */ if tdl.man ^=0 then goto ill_eep; tdl.eep_tally = tdl.eep_tally + vdec4; goto nxfld; tdlr(18): /* CHXddd.ddd.--dd */ if tdl.man ^=0 then goto ill_eep; fix_bit = 1; if fdec2 =1 then fix_bit = 9; /* first 8 bits not used */ do dovar1 = 1 to fdec2*2; substr(tdl.eep_line,tdl.eep_tally-1+dovar1,1) = substr(page_no_char,(fixed(substr(string(addrel(addr(tio.trarea),fdec1)->data_move),fix_bit+(dovar1-1)*4,4)))+1,1); end; tdl.eep_tally = tdl.eep_tally + 2*fdec2; if tdl.talpha ^= "chxs.." then goto nxfld; substr(tdl.eep_line,tdl.eep_tally,1) = " "; tdl.eep_tally = tdl.eep_tally + 1; goto nxfld; tdlr(19): /* CHXSddd.ddd.--dd */ goto tdlr(18); tdlr(20): /* CKF--dd */ /* check flag and skip field if not set */ if vdec4 > 35 then goto flag_error; if tdl.tflag(vdec4+1) ^= 0 then goto nxfld; goto skipf; flag_error: inv_data = "only 36 flags available, 0-35"; goto say_invalid_instruction; tdlr(21): /* CL--dd */ tdl.loopct(vdec4+1) = 0; goto nxfld; tdlr(22): /* CLK--dddddd */ tdl.pagclk = (vdec4*1000)/64; /* convert 1/64 ms to us */ tdl.clock_dispatch = nxfld; tdl.clock_going = 1; /* set clock going */ call timer_manager_$alarm_wakeup(tdl.pagclk,"10"b,tdl.clock_event); /* time is in micro seconds */ clock_common: goto main_dispatch_queue_service; /* go away untill called */ tdlr(23): /* CLKRAN--dddddd */ goto set_obsolete_msg; tdlr(24): /* CMP-d */ tdl.tncflg = 0; cmpflg = 1; if vdec4 = 0 then goto prcmp; tdl.interrupts.init = "1"b; /* fake an initiate interrupt */ goto prcmp; tdlr(25): /* CODEdd */ goto set_obsolete_msg; tdlr(26): /* CSW--dd */ goto set_obsolete_msg; tdlr(27): /* CWdAddd.--dddd */ /* in order to permit effective subtraction from the offset and or word count, the offset addition is performed moduluo 512 and the word count addition is performed moduluo 4096 */ if tio.tdcww(fdec1+1).typ = "10"b|tio.tdcww(fdec1+1).char = "111"b then goto cwa_bad; /* bad if tdcw or idcw-----cant add to them */ fdec2 = mod(fdec2 + fixed(tio.tdcww(fdec1+1).add)-fixed(rel(addr(tio.twarea(1)))),512); vdec4 = mod(vdec4 + fixed(tio.tdcww(fdec1+1).wc),4096); if fdec2 >320 then goto say_too_big; if fdec2 + vdec4 > 320 then goto say_too_big; if vdec4 = 0 then goto say_too_big; /* compute offset and word count for common routine */ goto complete_dcw_add; cwa_bad: inv_data = "trying to add offset or length to a tdcw or idcw"; goto say_invalid_instruction; tdlr(28): /* CWdBd */ if fdec1 = 0 then goto lcset_error; tio.tdcww(fdec1+1).add = rel(addr(tio.tdcww(vdec4+1).add)); tio.tdcwr(fdec1+1).add = rel(addr(tio.tdcwr(vdec4+1).add)); tio.tdcww(fdec1+1).char = "000"b; tio.tdcwr(fdec1+1).char = "000"b; tio.tdcww(fdec1+1).typ = "10"b; tio.tdcwr(fdec1+1).typ = "10"b; tio.tdcww(fdec1+1).wc = "000000000000"b; tio.tdcwr(fdec1+1).wc = "000000000000"b; tdl.tcwdl = fdec1+1; tdl.tfdcwp = addrel(addr(tio.tdcww(1)),fdec1); goto nxfld; tdlr(29): /* CWdI */ if fdec1 = 0 then goto lcset_error; if tdl.man ^=0 then goto ill_eep; tio.tdcww(fdec1+1).add = "000000000000000000"b; tio.tdcww(fdec1+1).wc = "000000000000"b; tio.tdcww(fdec1+1).char = "111"b; tio.tdcww(fdec1+1).typ = "00"b; tio.tdcww(fdec1+1).w_c = "0"b; tdl.tfdcwp = addr(tio.tdcww(fdec1+1)); tdl.tcwdl = fdec1+1; goto nxfld; tdlr(30): /* CWdNddd.--dddd */ work_num = 3; /* IONTP dcw type */ goto pdcw_com; tdlr(31): /* CWdPddd.--dddd */ work_num = 1; /* IOTP dcw type */ pdcw_com: if fdec1 ^=9 then goto set_dcw; /* not last--is ok */ inv_data = "trying to set up the last dcw as an iontp or iotp"; goto say_invalid_instruction; tdlr(32): /* CWdSddd.--dddd */ work_num = 0; /* dcw type is stop */ set_dcw: if fdec2 >320 then goto say_too_big; if fdec2 + vdec4 > 320 then goto say_too_big; if vdec4 = 0 then goto say_too_big; tio.tdcww(fdec1+1).typ = bit(fixed(work_num,2),2); /* set dcw types */ tio.tdcwr(fdec1+1).typ = bit(fixed(work_num,2),2); complete_dcw_add: tio.tdcww(fdec1+1).char = "000"b; tio.tdcwr(fdec1+1).char = "000"b; tio.tdcww(fdec1+1).add = rel(addrel(addr(tio.twarea(1)),fdec2)); /*ad in wrt*/ tio.tdcwr(fdec1+1).add = rel(addrel(addr(tio.trarea(1)),fdec2)); /*ad in rd */ tio.tdcww(fdec1+1).wc = bit(fixed(vdec4,12),12); /* set word counts */ tio.tdcwr(fdec1+1).wc = bit(fixed(vdec4,12),12); tdl.tcwdl = fdec1+1; /* dcw no. +1 to flag */ tdl.tdtcal_reladd = fdec2; tdl.tdtcal_wc = vdec4; tdl.tfdcwp = addrel(addr(tio.tdcwr(1)),fdec1); /* assume read */ if tdl.topcd.op_type = 3 then goto nxfld; /* was a read */ tdl.tfdcwp = addrel(addr(tio.tdcww(1)),fdec1); /* point to write dcw */ goto nxfld; tdlr(33): /* Doooooooooooo-- */ if tdl.tfdcwp->dcw_peek.char = "111"b then goto was_idcw; tdl.tdtyp = 3; goto dtypst; was_idcw: tio.tdcww(tdl.tcwdl).add = substr(bit(fixed(octnum,36),36),1,18); tio.tdcww(tdl.tcwdl).char = substr(bit(fixed(octnum,36),36),19,3); tio.tdcww(tdl.tcwdl).w_c = substr(bit(fixed(octnum,36),36),22,1); tio.tdcww(tdl.tcwdl).typ = substr(bit(fixed(octnum,36),36),23,2); tio.tdcww(tdl.tcwdl).wc = substr(bit(fixed(octnum,36),36),25,12); goto nxfld; tdlr(34): /* DA */ goto set_obsolete_msg; tdlr(35): /* DEV */ if tdl.man ^=0 then goto ill_eep; goto nxfld; tdlr(36): /* DLN--dd */ tdl.tdtyp = 5; octnum = vdec4; goto dtypst; tdlr(37): /* DMOD */ /* dmod - decrement working number of disc modules this instruction is not supported under multics */ set_obsolete_msg: inv_data = "obsolete instruction, not implemented"; goto say_invalid_instruction; tdlr(38): /* DRAN-d */ tdl.tdtyp = 1; octnum = vdec4; goto dtypst; tdlr(39): /* DREAD */ goto set_obsolete_msg; tdlr(40): /* DROT */ tdl.tdtyp = 6; goto dtypst; tdlr(41): /* DUP */ goto set_obsolete_msg; tdlr(42): /* E */ /* set expected major and substatus from standards */ tdl.testat.ignore_ss = tdl.testas.ignore_ss; tdl.testat.major_status = tdl.testas.major_status; tdl.testat.sub_status = tdl.testas.sub_status; goto nxfld; tdlr(43): /* EEPdd */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; tdl.eep_in_progress = 0; tdl.eep_saved_tmiflg = 0; tdl.eep_line_no = fdec1; goto nxfld; tdlr(44): /* END */ if tdl.force = 1 then goto say_end_page; if tdl.rcycle = 0 then goto say_end_page; tdl.nxt = -1; tdl.initreq = 1; tdl.call_page = substr(tst.name,1,5)||"a"; /* select first page */ call call_from_page; /* get the first page */ goto select_next_test_or_seg_or_start_or_end; tdlr(45): /* F--dd */ /* f - loop to field yy of current line */ skip_field_no = vdec4; tdl.tlscan = (tdl.line_number*56)+1; goto fldct; tdlr(46): /* FEND */ goto set_obsolete_msg; tdlr(47): /* GLNK */ /* glnk - get link for disc 204 this instruction is not supported under multics */ goto set_obsolete_msg; tdlr(48): /* ICoo */ /* 00 = unit record transfer 02 = peripheral action(no dcws) 04 = special card punch --note---illegal on iom 06 = multirecord(unit record) note--uses multiple dcw lists 10 = single character record 24 = dual command (multi command) 20 through 37 except 24 --special error commands for disc mpc 40 to 57--special controller commands */ /* DSS180,DSS190 error control commands: 01a0bc a = inhibit automatic end of cylinder b = inhibit automatic alternate track logic c = inhibit automatic retry 011100 inhibit RPS 011101 edac override MTC500 error control commands: octal set capstan 20 automatic retry off 21 automatic retry off low threshold 22 automatic retry off slow 23 automatic retry off slow low threshold 25 automatic retry off fast low threshold 26 automatic retry off 27 automatic retry off low threshold 30 31 low threshold 32 slow 33 slow low threshold 34 fast 35 fast low threshold 36 37 low threshold special controller commands: for dss181,dss190,mtc500 channel instruction 10xxxx device address must be zero device instruction field as below: (in octal) 32 = write controller main memory binary 12 = write controller main menory ascii 34 = conditional write lock byte 14 = write lock byte 22 = read controller main memory binary 02 = read controller main menory ascii 04 = read lock byte 16 = initiate write data xfer 06 = initiate read data transfer 00 = suspend controller 20 = release controller */ if octnum = 1 then goto ioc_non_data; /* peripheral action(no dcws) */ if octnum < 4 then goto set_ioc_cmd; /* if <4 unit record transfer, special card punch or multirecord */ if octnum = 10 then goto set_ioc_cmd; /* dual command */ if octnum ^=4 then goto ioc_unknown; /* single character record */ if tdl.topcd.op_code = "00"b|tdl.topcd.op_code = "11"b then goto ioc_sc_err; set_ioc_cmd: tdl.tpmb.iom_cmd = substr(bit(fixed(octnum,length(tdl.tpmb.iom_cmd)),length(tdl.tpmb.iom_cmd)), 1,length(tdl.tpmb.iom_cmd)); goto nxfld; ioc_non_data: inv_data = "cannot specify an ioc non-data command"; goto say_invalid_instruction; ioc_unknown: inv_data = "unknown ioc command or bootload"; goto say_invalid_instruction; ioc_sc_err: inv_data = "trying to use a sing. char. ioc cmd with a read or nondata opcode"; goto say_invalid_instruction; tdlr(49): /* IDCW */ /*note-----not in list in com.alm */ goto set_obsolete_msg; tdlr(50): /* ISoo */ goto set_obsolete_msg; tdlr(51): /* ITALdd */ if tdl.man ^=0 then goto ill_eep; tdl.eep_tally = 1; if tst.linetab(fdec1+1) ^=1 then goto ill_eep_line; substr(tdl.eep_line,1,48) = substr(string(addrel(addr(tst.lines),fdec1*14+1)->char_move),3,48); substr(tdl.eep_line,49,16) = " "; if tst.linetab(fdec1+2) ^=1 then goto nxfld; substr(tdl.eep_line,49,16) = substr(string(addrel(addr(tst.lines),(fdec1+1)*14)->char_move),1,16); goto nxfld; ill_eep: inv_data = "eep instructions illegal in manual mode"; goto say_invalid_instruction; ill_eep_line: inv_data = "eep data line not ascii data"; goto say_invalid_instruction; tdlr(52): /* L--dddd */ lran: /* LRAN entry */ if vdec4 > 321 then goto say_too_big; if vdec4 = 0 then goto say_4096; call set_dcw_len; goto nxfld; say_too_big: inv_data = "last word of dcw would be outside of write area"; goto say_invalid_instruction; say_4096: inv_data = "trying to use a dcw with word count of 4096 (0)"; goto say_invalid_instruction; set_dcw_len:proc; tdl.tdtcal_reladd = 0; tdl.tdtcal_wc = vdec4; tio.tdcw.wc = bit(fixed(vdec4,12),12); tio.tdcw.add = rel(addr(tio.twarea)); /* presume write first */ if tdl.topcd.op_type ^=3 then goto was_not_read; /* check presumption */ tio.tdcw.add = rel(addr(tio.trarea)); /* revert presumption */ was_not_read: tdl.tcwdl = 0; /* flag not control words */ tdl.tfdcwp = addr(tio.tdcw); end set_dcw_len; tdlr(53): /* LCW-d */ tdl.tcwdl = vdec4+1; /* select dcw # */ tdl.tfdcwp = addrel(addr(tio.tdcww(1)),vdec4); /* assume write */ if tio.tdcww.char(vdec4+1) = "111"b then goto nxfld; /* lcw set for idcw */ if tio.tdcww.typ(vdec4+1) = "10"b then goto lcw_err; tdl.tdtcal_reladd = fixed(tio.tdcwr(vdec4+1).add) - fixed(rel(addr(tio.trarea(1)))); tdl.tdtcal_wc = fixed(tio.tdcww(vdec4+1).wc); if tdl.topcd.op_type ^= 3 then goto nxfld; /* was a write */ tdl.tfdcwp = addrel(addr(tio.tdcwr(1)),vdec4); /* point to read dcw */ goto nxfld; lcw_err: inv_data = "lcw points to tdcw"; goto say_invalid_instruction; tdlr(54): /* LOC--oo */ tdl.tdata = "000000000000000000000000000000"b||bit(fixed(octnum,6),6); tdl.tdtyp = 7; goto nxfld; tdlr(55): /* LPdd.--dddd */ if tst.linetab(fdec1+1) ^= 0 then goto loop_to_invalid_line; if tdl.loopct(tdl.line_number+1) >= vdec4 then goto loop_exh; tdl.loopct(tdl.line_number+1) = tdl.loopct(tdl.line_number+1) + 1; tdl.line_number = fdec1; goto nxlin; loop_exh: tdl.loopct(tdl.line_number+1) = 0; goto nxfld; loop_to_invalid_line: inv_data = "looping to non_tdl_line"; goto say_invalid_instruction; tdlr(56): /* LPdd.AE */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; if tdl.taeflg = 0 then goto nxfld; tdl.line_number = fdec1; goto nxlin; tdlr(57): /* LPdd.B */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; if tdl.tpadda = tdl.tpaddp then goto nxfld; tdl.line_number = fdec1; goto nxlin; tdlr(58): /* LPdd.E */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; if tdl.terflg = 0 then goto nxfld; tdl.line_number = fdec1; goto nxlin; tdlr(59): /* LPdd.ET */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; if tdl.status.major_status||substr(tdl.status.sub_status,1,1) ^= "00111"b then goto nxfld; tdl.line_number = fdec1; goto nxlin; tdlr(60): /* LPdd.F-dd */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; tdl.line_number = fdec1; skip_field_no = vdec4; tdl.tlscan = (tdl.line_number*56)+1; goto fldct; tdlr(61): /* LPdd.Fdd.--dddd */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; if tdl.loopct(tdl.line_number+1) >= vdec4 then goto loop_field_exh; tdl.loopct(tdl.line_number+1) = tdl.loopct(tdl.line_number+1) + 1; tdl.line_number = fdec1; skip_field_no = fdec2; tdl.tlscan =(tdl.line_number*56)+1; goto fldct; loop_field_exh: tdl.loopct(tdl.line_number+1) = 0; goto nxfld; tdlr(62): /* LPdd.NB */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; if tdl.tpadda ^= tdl.tpaddp then goto nxfld; tdl.line_number = fdec1; goto nxlin; tdlr(63): /* LPdd.NE */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; if tdl.terflg ^=0 then goto nxfld; tdl.line_number = fdec1; goto nxlin; tdlr(64): /* LPdd.SVd */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; tdl.tscnt(vdec4+1) = tdl.line_number; tdl.tsfld(vdec4+1) = tdl.next_field_number; tdl.line_number = fdec1; goto nxlin; tdlr(65): /* LRAN */ call compute_random; vdec4 = mod(fixed(dvran,31),tst.max); if vdec4 = 0 then vdec4 = 1; /* exlcude 0 */ goto lran; tdlr(66): /* Moo */ /* set major status expected and ignore substatus bit */ tdl.testat.ignore_ss = substr(bit(fixed(octnum,36)),2,1); tdl.testat.major_status = substr(bit(fixed(octnum,36)),3,4); goto nxfld; tdlr(67): /* NC */ /* set flag for no data check */ tdl.tncflg = 1; goto nxfld; tdlr(68): /* NM */ /* set flag for no mailbox (dcw residue) check */ tdl.tnmflg = 1; goto nxfld; tdlr(69): /* NR */ tdl.tnrflg = 1; goto nxfld; tdlr(70): /* NS or NSdd.--dddd */ /* set flag for no halt on error */ tdl.tnsflg = 1; if tdl.talpha ^="ns." then goto nxfld; tdl.tnsflg = -1; call check_type_lines; tdl.nslin = fdec1; tdl.nsnum = vdec4; goto nxfld; tdlr(71): /* NT */ tdl.tntflg = 1; goto nxfld; tdlr(72): /* NX */ /* note: nxnn is illegal in the multics polts implimentation */ goto select_next_test_or_seg_or_start_or_end; tdlr(73): /* O */ tdl.do_opt = 1; tdl.optrtn = nxfld; goto process_options; tdlr(74): /* P--dd */ /* p instruction - performs no function (obsolete but harmless) */ goto nxfld; tdlr(75): /* PDoooooooooooo-- */ tdl.tpadwd = bit(fixed(octnum,36),36); goto nxfld; tdlr(76): /* PHDLN--dd */ tdl.tdtyp = 8; octnum = vdec4; goto dtypst; tdlr(77): /* POS */ if substr(tst.name,1,4)="td11"|substr(tst.name,1,4)="td12"|substr(tst.name,1,4)="td13"|substr(tst.name,1,4)="td14" |substr(tst.name,1,4)="td15"|substr(tst.name,1,4) = "td16" then goto pos_ok; inv_data = "positioning valid only for mag tape"; goto say_invalid_instruction; pos_ok: tdl.tpsflg = 1; goto nxfld; tdlr(78): /* Rdd */ /* set record count */ if fdec1 <64 then go to rec1; inv_data = "record count must be 0-63"; goto say_invalid_instruction; rec1: tdl.tpmb.reccnt = substr(bit(fixed(fdec1,36)),31,6); goto nxfld; tdlr(79): /* RET-d */ /* return to saved tdl field location */ if tdl.tsfld(vdec4+1) ^= -1 then goto have_save; no_save: inv_data = "trying to execute a ret without a previous sv"; goto say_invalid_instruction; have_save: skip_field_no = tdl.tsfld(vdec4+1); tdl.line_number = tdl.tscnt(vdec4+1); tdl.tlscan =(tdl.line_number*56)+1; goto fldct; tdlr(80): /* RETd+--dd */ /* return to saved tdl field location plus n fields */ if tdl.tsfld(fdec1+1) = -1 then goto no_save; skip_field_no = tsfld(fdec1+1) + vdec4; tdl.line_number = tscnt(fdec1+1); tdl.tlscan = (tdl.line_number*56)+1; goto fldct; tdlr(81): /* RETEP */ if tdl.man ^=0 then goto ill_eep; tdl.eep_tally = 0; /* use to flag out of eep */ if tdl.eep_in_progress = 0 then goto err_not_in_eep; tdl.talpha = tdl.eep_talpha; tdl.tnmbr = tdl.eep_tnmbr; tdl.tnmwrd = tdl.eep_tnmwrd; tdl.next_field_number = tdl.eep_next_field_number; tdl.per_op_number = tdl.eep_per_op_number; tdl.line_number = tdl.eep_line_number; tdl.tlscan = tdl.eep_tlscan; tdl.inst_index = tdl.eep_inst_index; tdl.tdlret = tdl.eep_tdlret; tdl.eep_in_progress = 0; goto check_for_options_after_error_check; err_not_in_eep: inv_data = "retep illegal if not in eep"; goto say_invalid_instruction; tdlr(82): /* RFL--dd */ if vdec4 >35 then goto flag_error; tdl.tflag(vdec4+1) = 0; goto nxfld; tdlr(83): /* RR--dd */ goto set_obsolete_msg; tdlr(84): /* RST */ goto set_obsolete_msg; tdlr(85): /* RSTTD */ goto nxfld; tdlr(86): /* RW--dddd */ if vdec4 >320 then goto rw_err; tdl.trwrd = bit(fixed(vdec4,length(tdl.trwrd)),length(tdl.trwrd)); goto nxfld; rw_err: inv_data = "residual word count cannot exceed 320"; goto say_invalid_instruction; tdlr(87): /* Soo-- */ /* set expected substatus */ tdl.testat.sub_status = substr(bit(fixed(octnum,36)),1,6); goto nxfld; tdlr(88): /* SAoo,SIoo,SNoo,SWoo */ tdl.tmnem = inst$tdli(dovar1); check = octnum; if check <64 then goto per_op_common; check = check - 64; goto per_op_common; tdlr(89): /* SDSKdd */ goto set_obsolete_msg; tdlr(90): /* SFL--dd */ /* set program flag */ if vdec4 > 35 then goto flag_error; tdl.tflag(vdec4+1) = 1; goto nxfld; tdlr(91): /* SIF--dd */ goto set_obsolete_msg; tdlr(92): /* SMODo */ goto set_obsolete_msg; tdlr(93): /* STNdd */ goto set_obsolete_msg; tdlr(94): /* STRdd */ goto set_obsolete_msg; tdlr(95): /* SV-d */ /* save location of next tdl field */ tdl.tscnt(vdec4+1) = tdl.line_number; tdl.tsfld(vdec4+1) = tdl.next_field_number; goto nxfld; tdlr(96): /* T--dd */ if tdl.trycnt >=0 then goto use_option_trycount; tdl.trflg = vdec4; goto tran_com; use_option_trycount: tdl.trflg = tdl.trycnt; tran_com: tdl.tscnt(8) = tdl.tscnt(11); /* per. op. loc to save 7 */ tdl.tsfld(8) = tdl.tsfld(11); tdl.tdlret = nxfld; goto do; /* do do after instruction */ tdlr(97): /* TAL */ goto set_obsolete_msg; tdlr(98): /* TDM */ goto set_obsolete_msg; tdlr(99): /* TISooo-- use 0 or 1 only for o */ if bit(fixed(octnum,36),36) &"110110110111111111111111111111111111"b then goto bad_tis; tdl.testat.expected_interrupts.term = substr(bit(fixed(octnum,36),36),3,1); tdl.testat.expected_interrupts.init = substr(bit(fixed(octnum,36),36),6,1); tdl.testat.expected_interrupts.spec = substr(bit(fixed(octnum,36),36),9,1); goto nxfld; bad_tis: inv_data = "only 3 numbers, each 0 or 1 permitted in ""tis"""; goto say_invalid_instruction; tdlr(100): /* TRRdd */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; tdl.tsubr = fdec1; /* line # for transient read recovery */ goto nxfld; tdlr(101): /* TWRdd */ if tst.linetab(fdec1+1) ^=0 then goto loop_to_invalid_line; tdl.tsubw =fdec1; /* line # for transient write recovery */ goto nxfld; tdlr(102): /* TYdd.--dddd */ tdl.ttyret = nxfld; call check_type_lines; inv_data = substr(work_ptr->char_move,1,vdec4*6); goto type_lines; tdlr(103): /* TYRDdd.--dddd */ goto set_obsolete_msg; tdlr(104): /* TYSdd */ if tdl.man ^=0 then goto ill_eep; if tdl.eep_tally <2 then goto type4096_line; inv_data = ""; if tdl.eep_in_progress ^=0 then goto append_eep; call ioa_$rsnnl("^/^/**^a(^ac) device extended status in hex^/^a"||inv_data, message, mesg_len, substr(page_no_char,tdl.pageno,1), tdl.iccdd, substr(tdl.eep_line,1,tdl.eep_tally-1)); tdl.ttyret = nxfld; goto type_lines_nlf; append_eep: if tdl.halt = 0|tdl.tnsflg ^=0 then goto no_halt; tdl.optrtn = tdl.tdlret; tdl.rtnopt = pdata.process_dispatch; tdl.optrd = 1; inv_data = " enter options:"; no_halt: message = tdl.eep_msg||" device extended status in hex "||substr(tdl.eep_line,1,tdl.eep_tally-1)||inv_data; tdl.ttyret = nxfld; goto type_lines_nlf; tdlr(105): /* TYWRdd.--dddd */ goto set_obsolete_msg; tdlr(106): /* UHDLN--dd */ tdl.tdtyp = 9; octnum = vdec4; goto dtypst; tdlr(107): /* W */ goto set_obsolete_msg; tdlr(108): /* XDIO */ if tdl.man ^=0 then goto ill_eep; tdl.tpxdio = 1; tdl.tmnem = "xdio "; goto move_standards_to_call; tdlr(109): /* YES */ inv_data = "enter y or n"; tdl.optrd = 1; tdl.rtnopt = check_question; type_lines: call ioa_$rsnnl("^/^/**^a(^ac)^/^a", message, mesg_len, substr(page_no_char,tdl.pageno,1), tdl.iccdd, inv_data); type_lines_nlf: inv_data = ""; goto request_and_wait_for_tty_write; check_question: if substr(tdl.option,1,1) = "y" then goto skipf; goto nxfld; tdlr(110): /* "YESdd.--dddd */ call check_type_lines; inv_data = substr(work_ptr->char_move,1,vdec4*6); tdl.optrd = 1; tdl.rtnopt = check_question; goto type_lines; not_ascii_data_line: inv_data = "trying to type from non_ascii data line"; goto say_invalid_instruction; check_type_lines:proc; if vdec4 = 0 then goto type4096_line; if vdec4 > 18 then goto type_too_many; /* 72 characters max */ work_ptr = addrel(addr(tst.lines),fdec1*14); /* address of message */ do dovar1 = 1 to vdec4 by 14; if tst.linetab(fdec1+(dovar1-1)/14+1) ^= 1 then goto not_ascii_data_line; end; end check_type_lines; type4096_line: inv_data = "trying to type 4096 words (0)"; goto say_invalid_instruction; type_too_many: inv_data = "last word of message would be outside of message area"; goto say_invalid_instruction; */ ----------------------------------------------------------- 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 */