diff --git a/README.md b/README.md index d4af32be..4706ec46 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,7 @@ There's a [DDT cheat sheet](doc/DDT.md) for Unix users. - PEEK, system monitoring. - PFTHMG, Puff the magic dragon. - PR, print out various system documentation. + - PROBE, probe inside job and display various information about it. - PRUFD, list files on disk volume. - PTY, pseudo-tty - PWORD, replacement for sys;atsign hactrn that requires registered logins. diff --git a/build/build.tcl b/build/build.tcl index bfe11bae..d705579d 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -831,6 +831,18 @@ expect ":KILL" respond "*" ":midas sys2;ts hostab_sysen1;hostab\r" expect ":KILL" +# PROBE +respond "*" ":link syseng;its defs,sys;itsdfs >\r" +respond "*" ":midas sysbin;probe bin_bawden;probe\r" +expect ":KILL" +# note: setting debug to 0 and running causes it to pdump itself to +# sys;ts probe +respond "*" ":job probe\r" +respond "*" ":load sysbin;probe bin\r" +respond "*" "debug/0\r" +type "\033g" +respond "*" ":link sys;ts pb,sys;ts probe\r" + # ndskdmp tape respond "*" ":link kshack;good ram,.;ram ram\r" respond "*" ":link kshack;ddt bin,.;@ ddt\r" diff --git a/src/bawden/probe.258 b/src/bawden/probe.258 new file mode 100755 index 00000000..ceeced98 --- /dev/null +++ b/src/bawden/probe.258 @@ -0,0 +1,1255 @@ +; -*- Midas -*- + +.symtab 3001.,1999. + +title Probe around in a job. + +a=:1 +b=:2 +c=:3 +d=:4 +e=:5 +t=:6 ? intacs==:t_6+2 ; T and TT saved on interrupt +tt=:7 +x=:10 +y=:11 +z=:12 + +u=:16 +p=:17 + +ch==:0,,-1 +chttyi==:1 +chttyo==:2 +cherri==:3 +chusr==:4 +chhsti==:5 +chdump==:6 + +;;;Flags: +%fddt==:1_17. ;DDT is superior +%fbrk==:1_16. ;Superior claims to hack .break +%fhsts==:1_15. ;HOSTS3 database loaded. +%ftemp==:1_14. ;For hacks... + +;;;Instructions: +call=:pushj p, +return=:popj p, +jcall==:jrst +save=:push p, +rest=:pop p, +tyo=:.iot chttyo, + +stop=:call . +$stop: skipe debug + .break 16,104000 + trne %fbrk + .break 16,164000 + .logout 1, + +define syscall name,args + .call [setz ? sixbit /name/ ? args(400000)] +termin + +define princ &string& + move t,[440700,,[ascii string]] + movei tt,.length string + .call siot + .lose %lssys +termin + +siot: setz + sixbit /siot/ + movei chttyo + move t + setz tt + +;;;FORMAT + +format"$$pcode==:1 +format"$$errs==:1 +format"erri==:cherri +.insrt dsk:syseng;format + +outstr: syscall siot,[movei chttyo ? a ? b] + .lose %lssys + return + +define format &string&,args + pushj p,[ + pushj p,fmtin +zzz==-1 +irp arg,,[args] + push p,arg +zzz==.irpcnt +termin + hrroi a,[ascii string] + movei b,.length string + movni c,zzz+1 + jrst format"format] +termin + +fmtin: push p,a + push p,b + push p,c + push p,[fmtout] + jrst @-4(p) + +fmtout: pop p,c + pop p,b + pop p,a + pop p,(p) + return + +lpdl==:100. +.vector pdl(lpdl) +ljcl==:20. ;100. characters +.vector jcl(ljcl+1) +.scalar jclbp + +go: move p,[-lpdl,,pdl-1] + setzi 0, ;clear flags + call sysini + call purify + .open chttyo,[%tjdis\.uao,,'tty ? setz ? setz] + .lose %lssys + .open chttyi,[.uai,,'tty ? setz ? setz] + .lose %lssys + ;;^S and ^G interrupt, ^I ^J and ^? don't echo (mimic DDT): + syscall ttyset,[movei chttyi ? [222222,,222222] ? [230222,,220222]] + .lose %lssys + .suset [.roption,,a] + tlne a,%opddt + tro %fddt + tlne a,%opbrk + tro %fbrk + tlo a,%opint\%opopc + move tt,[-4,,[ .s40addr,,[twenty,,forty] + .soption,,a + .smask,,[%pipdl] + .smsk2,,[1_chttyi\1_chttyo\1_chusr] + ]] + .suset tt + + tlnn a,%opcmd + jrst nojcl + setzm jcl + move tt,[jcl,,jcl+1] + blt tt,jcl+ljcl-1 + setom jcl+ljcl + .break 12,[..rjcl,,jcl] + move tt,[440700,,jcl] + movem tt,jclbp + call getsix + jrst usage + move b,a + call getsix + jrst [ came b,[sixbit /?/] + camn b,[sixbit /help/] + jrst usage + exch a,b + call sixnum + jrst numjcl + call ttynum + jrst ttyjcl + jrst .+1] + syscall open,[moves e ? [10\.bii,,chusr] ; Insist on old job + [sixbit /usr/] ? b ? a] + skipa + jrst ready + jumpn b,nojob + save e + syscall open,[[10\.bii,,chusr] ; Insist on old job. + [sixbit /usr/] ? a ? [sixbit /hactrn/]] + jrst nouser + .uset chusr,[.rcnsl,,a] + jrst ttyjcl + +nouser: rest e +nojob: princ "AJob " + skipe b + format "~S ",b + format "~S -- ~:@E.",[a,e] + stop + +nojcl: trnn %fddt + jrst usage + .break 12,[..rljb,,a] +numjcl: syscall open,[moves e ? [10\.bii,,chusr] ; Insist on old job + [sixbit /usr/] ? movei %jsnum(a) ? movei 0] + skipa + jrst ready + format "~&Job ~O -- ~:@E.",[a,e] + stop + +ttyjcl: move b,a + syscall styget,[moves e ? movei 400000(b) + movem a ? movem a] + jrst [ format "~&Console ~O -- ~:@E.",[b,e] + stop] + jumpge a,numjcl + format "~&Console ~O is free.",b + stop + +usage: .suset [.rxjname,,a] + format "~&Usage is: +:~S +or +:~S +or +:~S T +or +:~S +or +:~S + +With no JCL under DDT, operates on previously selected job. + +:~S ? +or +:~S HELP +or with null JCL prints this help message. +",[a,a,a,a,a,a,a,a,a,a] + stop + +.vector fname(4) +.scalar mode + +usrvar: +irp var,,[uind,cnsl,bchn] +.scalar var + sixbit /var/ + movem var +termin +lusrvar==:.-usrvar + +.vector pmap(400) +rpmap: repeat 400, .rpmap+.rpcnt ? movem pmap+.rpcnt +lrpmap==:.-rpmap + +ttyvar: +irp var,,[idltim,tctyp,ttytyp] +.scalar var + sixbit /var/ + movem var +termin +lttyvar==:.-ttyvar + +ready: move tt,[-lrpmap,,rpmap] + syscall usrvar,[movei chusr ? tt] + .lose %lssys + move tt,[-lusrvar,,usrvar] + syscall usrvar,[movei chusr ? tt] + .lose %lssys + move u,uind + imul u,lublk + skipge t,cnsl + jrst start + move tt,[-lttyvar,,ttyvar] + syscall ttyvar,[movei 400000(t) ? tt] + .lose %lssys + +start: format "~& Job ~O: ~S ~S",[uind,@uname,@jname] + skipn a,@ustp + jrst ready0 + princ ", Stopped" + tdnn a,[#1_33.] + jrst ready0 + ldb b,[360600,,a] + and a,[7777,,-1] + format ": ~O!~O",[b,a] +ready0: skipl @aprc ;Disowned? + jrst redy01 + princ ", Disowned" +redy01: move a,@time + sub a,@lubtm + idivi a,30. + jumpe a,ready1 + princ ", Idle " + call ptime +ready1: move a,@aprc + tlnn a,100000 ;BUMRTL + jrst redy11 + princ ", Will die" +redy11: skipge a,cnsl + jrst ready2 + format "~& Console ~O",cnsl + move a,idltim + idivi a,30. + jumpe a,ready2 + princ ", Idle " + call ptime + jrst ready3 + +ready2: came a,[-1] + jrst ready3 + princ ", System" +ready3: call pwho + movsi a,-16. + movei b,@iochnm +chloop: skipn (b) + jrst nextch + syscall rfname,[movei chusr ? movei (a) + movem fname+0 ? movem fname+1 + movem fname+2 ? movem fname+3 + movem mode] + .lose %lssys + skipn fname+0 + jrst nextch + movei tt,(a) + format "~& ~2<~O~>) ",tt + call pfname + princ " " ; + call pmode + +nextch: aos b + aobjn a,chloop + ldb t,[232100,,@siocp] + skipe t + format "~& ~O channel~P pushed on IOPDL.",t + move a,bchn + addi a,@iochst + ldb a,[221600,,(a)] + jumpe a,nobchn + princ "A Last error" + skipe bchn + format " (on channel ~O)",bchn + format ": ~:@E.",a +nobchn: princ "A Last UUO: " + move a,@sv40 + call pinstr + ldb a,[271500,,@sv40] + caie a,.call_-27 + jrst notcal + hrrz t,@uuac + format " (~S) [~O]",[@lscall,t] +notcal: move a,@upc + move b,a + tlnn b,%psusr + move a,@suuoh + princ "A PC: " + call prinpc + tlne b,%psusr + jrst nsyspc + move a,b + princ "A System PC: " + call prinpc + +nsyspc: skipn t,@epdlt4 + jrst ready8 + movem t,fname+0 + move t,@epdlt1 + movem t,fname+1 + move t,@epdlt2 + movem t,fname+2 + move t,@epdlt3 + movem t,fname+3 + princ "A Last filename: " + call pfname +ready8: move t,@xuname + came t,@uname + format "~& XUNAME: ~S",t + move t,@xjname + came t,@jname + format "~& XJNAME: ~S",t + move t,@hsname + came t,@xuname + format "~& HSNAME: ~S",t + move t,@usysnm + came t,@hsname + format "~& SNAME: ~S",t + skipn a,@option + jrst nooptn + princ "A Options: " + hlrz a,a + move b,[-lmp%op,,mp%op] + movei c,bitset + call bitmap +nooptn: move a,@mskst + move b,@mskst2 + hrroi c,[asciz "Enabled: "] + call pintwd + skipn @piclr + format "~& All deferred (PICLR)" + move a,@idf1 + move b,@idf2 + hrroi c,[asciz "Deferred: "] + call pintwd + move a,@pirqc + move b,@ifpir + hrroi c,[asciz "Pending: "] + call pintwd + + hrlzi a,-400 ; A: aobjn into PMAP +pmaplp: skipn b,pmap(a) + aobjn a,pmaplp + jumpge a,pmapzz + and b,pmapsk ; B: PMAP word + movei c,(a) ; C: Starting page + ldb d,[.bp 777,b] ; D: Type code + setzi e, ; E: # swapped out +pmapnx: tlzn b,100000 + aoj e, + caie d,777 ; Abs or shared? + addi b,1000 ; Yes: Expect next page number. + aobjp a,pmaprt ; Point at next page + skipn tt,pmap(a) + jrst pmaprt + and tt,pmapsk + tlne tt,100000 + tlo b,100000 + camn tt,b + jrst pmapnx +pmaprt: caie c,-1(a) + jrst pmapr1 + format "~& ~7<~O~>",c + jrst pmapr2 + +pmapr1: movei tt,-1(a) + format "~& ~7<~O-~O~>",[c,tt] +pmapr2: tlnn b,%cbwrt + format ", Pure" + tlne b,%cbpub + format ", Public" + tlne b,%cblok + format ", Locked" + tlne b,%cbslo + format ", Slow" + jumpe d,pmapr5 + jumpe e,pmapr3 + cain c,-1(a) + jrst pmapr4 + movei t,(a) + subi t,(c) + format ", ~D/~D Out",[e,t] + jrst pmapr3 + +pmapr5: format ", Abs" + jrst pmapsh + +pmapr4: format ", Out" +pmapr3: cain d,777 + jrst pmaprz + save u + move u,d + imul u,lublk + format ", ~S ~S (~O)",[@uname,@jname,d] + rest u + ldb tt,[.bp <377,,0>,b] + subi tt,2 + skiple tt + format " +~D",tt +pmapsh: ldb tt,[.bp 777000,b] + cain c,-1(a) + soja tt,pmaps1 + movei t,(c) + subi t,(a) + add t,tt + subi tt,1 + format " Pg ~O-~O",[t,tt] + jrst pmaprz + +pmaps1: format " Pg ~O",tt +pmaprz: jumpl a,pmaplp +pmapzz: princ "A" + stop + +;;; Bits in the PMAP word that we really care about. +;;; %CBWRT Writable +;;; %CBPUB Public +;;; %CBLOK Locked in core +;;; %CBSLO In slow memory (Doesn't work; Moon says it never will) +;;; 4.7 Swapped in +;;; 3.8 - 3.1 Number of times shared +;;; 2.9 - 2.1 Page number for absolute or shared page. +;;; 1.9 - 1.1 000 => Absolute +;;; 777 => Unshared +;;; => Shared with job N +pmapsk: %cbwrt\%cbpub\%cblok\%cbslo\100377,,-1 + +pwho: skiple a,@uwho1 + tdnn a,[.byte 8 ? 77 ? 177 ? 77 ? 177] + return + princ "A Who line: " + move b,@uwho2 + call pwho1 + lsh a,16. + tlnn a,(.byte 8 ? 200) + tyo [40] + move b,@uwho3 +pwho1: hlrz c,b + ldb t,[.bp <.byte 8 ? 70>,a] + call pwho3(t) + ldb c,[.bp <.byte 8 ? 0 ? 177>,a] + jumpe c,pwho2 + tyo c + tlne a,(.byte 8 ? 0 ? 200) + tyo c +pwho2: tlnn a,(.byte 8 ? 100) + tyo [40] + hrrz c,b + ldb t,[.bp <.byte 8 ? 7>,a] + jrst pwho3(t) + +pwho3: return ; 0: nothing + jrst pwdate ; 1: date + jrst pwtm40 ; 2: time (40ths) + jrst pwtime ; 3: time (halfs) + jrst pwoct ; 4: octal + jrst pwdec ; 5: decimal + jrst pwsix ; 6: sixbit + return ; 7: unused + +pwoct: format "~O",c + return + +pwdec: format "~D",c + return + +pwsix: ldb t,[140600,,c] + addi t,40 + tyo t + ldb t,[060600,,c] + addi t,40 + tyo t + ldb t,[000600,,c] + addi t,40 + tyo t + return + +pwdate: ldb z,[130700,,c] ; year + ldb x,[070400,,c] ; month + ldb y,[020500,,c] ; day + format "~D/~D/~D",[x,y,z] + return + +pwtime: lsh c,-1 +pwtim0: idivi c,60.*60. ; C: hours + idivi d,60. ; D: minutes E: seconds + format "~2<~;0~D~>:~2<~;0~D~>:~2<~;0~D~>",[c,d,e] + return + +pwtm40: lsh c,-2 + idivi c,10. + hrlm d,(p) + call pwtim0 + hlr d,(p) + addi d,"0 + tyo [".] + tyo d + return + +ptime: tro %ftemp ; %FTEMP => Nothing printed yet. + save b + idivi a,60. + save b + idivi a,60. + save b + idivi a,24. + jumpe a,ptime1 + trz %ftemp + format "~D day~P",a +ptime1: jumpe b,ptime2 + trzn %ftemp + tyo [40] + format "~D hour~P",b +ptime2: rest b + jumpe b,ptime3 + trzn %ftemp + tyo [40] + format "~D min~P",b +ptime3: rest b + jumpe b,ptime4 + trzn %ftemp + tyo [40] + format "~D sec~P",b +ptime4: rest b + return + +pinstr: ldb t,[331100,,a] + cain t,.call_-33 + jrst p.call + cain t,.oper_-33 + jrst p.oper +pibck1: caige t,luuotbl + skipn t,uuotbl(t) + jrst pinum + call 6princ + tyo [40] + call piac +piaddr: tlnn a,(@) + jrst pinoat + princ "@" +pinoat: hrrz t,a + cail t,774000 + hrre t,a + skipe t + format "~O",t + ldb t,[220400,,a] + skipe t + format "(~O)",t + return + +piac: ldb t,[270400,,a] + skipe t + format "~O,",t + return + +pinum: format "~O_33 ",t + call piac + jcall piaddr + +p.call: ldb t,[270400,,a] + caige t,lcaltbl + skipn t,caltbl(t) + jrst piback + call 6princ + tyo [40] + jcall piaddr + +piback: ldb t,[331100,,a] + jrst pibck1 + +p.oper: hrrz t,a + caige t,loprtbl + skipn t,oprtbl(t) + jrst piback + call 6princ + tyo [40] + jcall piac + +pmode: princ "(." + ldb t,[000300,,mode] + move t,(t)[ +irpc ai,,ai +irpc ub,,ub +irpc io,,io +440700,,[ascii "ub!!ai!!io"] +termin +termin +termin +] + movei tt,3 + .call siot + .lose %lssys + move t,fname+0 + camn t,[sixbit /tty/] + jrst ttybts + move t,mode + andcmi t,7 + skipe t + format "+~O",t +pmodez: princ ")" + return + +ttybts: save a + save b + save c + move a,mode + move b,[-lmp%tj,,mp%tj] + trnn a,%doout + move b,[-lmp%ti,,mp%ti] + andcmi a,7 + movei c,ttybt1 + call bitmap + skipe a + format "+~O",a + rest c + rest b + rest a + jrst pmodez + +ttybt1: hrro t,(b) + format "+~A",t + return + +pfname: format "~S:",fname+0 + move t,fname+1 + camn t,[sixbit /.file./] + jrst [ move t,fname+2 + camn t,[sixbit /(dir)/] + jrst pfnam0 + jrst .+1] + move t,fname+0 + camn t,[sixbit /err/] + jrst errhak + came t,[sixbit /chaos/] + camn t,[sixbit /tcp/] + jrst tcphak + camn t,[sixbit /usr/] + jrst usrhak + camn t,[sixbit /spy/] + jrst spyhak +pfnam0: skipe fname+3 + format "~S;",fname+3 + skipe fname+1 +pfnam1: format "~S ~S",[fname+1,fname+2] + return + +spyhak: format " Tty ~O",fname+1 + return + +usrhak: skipn fname+2 + jrst usrhk1 + skipe fname+1 + jrst pfnam1 + format " Own ~S",fname+2 + return + +usrhk1: hrrz t,fname+1 + caige t,20 + jrst [ format " Channel ~O",t + return] + cain t,%jself + jrst [ princ " Self" + return] + cain t,%jssup + jrst [ princ " Superior" + return] + cain t,%jssix + jrst [ princ " The PDP-6!" + return] + subi t,%jsnum + format " Job ~O",t + return + +errhak: save a + syscall open,[moves a ? [.uai,,cherri] ? [sixbit /err/] + fname+1 ? fname+2] + jrst [ format "~S ~S (~:@E.)",[fname+1,fname+2,a] + rest a + return] + syscall rfname,[movei cherri ? movem a ? movem a ? movem a] + .lose %lssys + ldb a,[221600,,a] + format | Error ~O: "|,a + jrst errhk1 + +errhk9: princ |, | +errhk0: tyo a +errhk1: .iot cherri,a + cail a,40 + jrst errhk0 + caie a,^M + jrst errhk2 + .iot cherri,a + caie a,^J + jrst errhk2 + .iot cherri,a + cail a,40 + jrst errhk9 +errhk2: .close cherri, + princ |"| + rest a + return + +netwrk"$$hst3==1 +netwrk"$$hstmap==1 +netwrk"$$look==1 +.insrt dsk:syseng;netwrk + +tcphak: save a + save b + save c + save d + save e + troe %fhsts + jrst tcphk1 + move a,nxpage + movei b,chhsti + call netwrk"hstmap + .lose + hrrzm a,nxpage +tcphk1: move b,fname+3 + call netwrk"hstsrc + jrst nmhost + hrroi a,(a) + format " Host ~A, ",a + skipa +nmhost: format " Host ~O, ",fname+3 + format "Local ~O, Foreign ~O",[fname+1,fname+2] + rest e + rest d + rest c + rest b + rest a + return + +prinpc: save b + save c + hrrz t,a + format "~O",t + hlrz a,a + jumpe a,npcbts + princ " {" ; + move b,[-luserpc,,userpc] + trnn a,%psusr + move b,[-lexecpc,,execpc] + movei c,bitset + call bitmap + skipe a + format "~O",a + princ "}" +npcbts: rest c + rest b + return + +bitset: hrro t,(b) + jumpe a,btset1 + format "~A,",t + return + +btset1: format "~A",t + return + +pintwd: skipn a + jumpe b,[return] + format "~& ~A",c + jumpe a,pintw1 + camn a,[-1] + jrst pintw7 + save b + move b,[-lmp%pi,,mp%pi] + movei c,bitset + call bitmap + move b,[-lmpn.m,,mpn.m] + movei c,bitset + call bitmap + rest b + jumpn b,pintw0 + return + +pintw7: princ "PI*" +pintw0: princ "," +pintw1: hrrz a,b + caie a,1_20-1 + cain a,-1 + jrst [princ "CH*" + hllz b,b + jumpe b,[return] + princ "," + jrst .+1] + hlrz a,b + caie a,1_8-1 + cain a,-1 + jrst [princ "INF*" + hrrz b,b + jumpe b,[return] + princ "," + jrst .+1] + move a,b + move b,[-lmpifp,,mpifp] + movei c,bitset + call bitmap + return + +;;;Convert a word of sixbit to a number if possible. Skips if it isn't. +sixnum: aos (p) + move t,a +sixnm0: setzi x, +sixnm1: setzi tt, + rotc t,6 + cail tt,'0 + caile tt,'9 + return + lsh x,3 ;octal + addi x,-<'0>(tt) + jumpn t,sixnm1 + move a,x + sos (p) + return + +;;;Convert a word of sixbit to a TTY number if possible. Skips if it isn't. +ttynum: aos (p) + move t,a + setzi tt, + rotc t,6 + cain tt,'T + jrst sixnm0 + return + +;;;Gobble a word of sixbit from JCL. +;;;A (val): word of SIXBIT or 0 at EOF +;;;Fails to skip at EOF. +getsix: save b + setzi a, + move b,[440600,,a] +getsx1: call jclch + jrst getsx9 + jrst getsx1 + aos -1(p) +getsx2: caige t,140 ;convert to sixbit + subi t,40 + came b,[000600,,a] + idpb t,b + call jclch + jrst getsx9 + jrst getsx9 + jrst getsx2 + +getsx9: rest b + return + +;;;Reads one character from JCL. +;;;T (val): character +;;;Skips twice on pseudosixbit, once on non-pseudosixbit, never at EOF. +jclch: ildb t,jclbp + caie t,^M + cain t,^C + return + caie t,^_ + cain t,0 + return + aos (p) + caile t,40 + aos (p) + return + +tsint: intacs,,p + 0 ? 1_chttyo ? 0 ? 1_chusr ? morint + 0 ? 1_chttyi ? 0 ? 1_chusr ? ctlint + 0 ? 1_chusr ? 0 ? 0 ? usrint +ltsint==:.-tsint + +dismis: setz + sixbit /dismis/ + movsi intacs + setz p + +ctlint: movei t,chttyi + .ityic t, + jrst disint + caie t,^S + cain t,^G + jrst iflush +disint: .call dismis + .lose %lssys + +morint: princ "--More--" + syscall iot,[movsi %tipek ? movei chttyi ? movem t] + .lose %lssys + caie t,40 + cain t,177 + .iot chttyi,t + caie t,40 + jrst flush + tyo [^P] + tyo ["A] + .call dismis + .lose %lssys + +iflush: .reset chttyo, + syscall ttyfls,[movsi 1 ? movei chttyi] + .lose %lssys +flush: princ "Flushed" + stop + +usrint: .reset chttyo, + princ "AJob went away." + stop + +.scalar nxpage ;Contains first unused page. + +;;;Allocate some pages +;;;A: (arg) number of pages to allocate. +;;;A: (val) address of first word in RH. +;;;T: (val) -,, for CORBLK +alloc: hrrz t,a + addb t,nxpage + caile t,400 + .lose + hrlz a,a + subb t,a + lsh a,10. + return + +.vector sysmap(400) ;One word for every page in the system + ;address space. +.scalar machine ; Name of this machine. +.scalar version ; ITS version number + +$page==:121000,,0 + +sysini: save a + save b + syscall sstatu,[repeat 6, movem machine + movem version] + .lose %lssys + setzm sysmap + move tt,[sysmap,,sysmap+1] + blt tt,sysmap+377 + move a,[-lsymtbl,,symtbl] + +sysin1: move t,1(a) + .eval t, + .lose + hrrm t,(a) + skipl 1(a) ;4.9 => this is an address. + movem t,(a) + ldb t,[$page t] + skipge 1(a) + setom sysmap(t) + add a,[1,,1] + aobjn a,sysin1 + move a,lublk + imul a,maxj + add a,usrstg + subi a,1 ;A: address of last word of user variables + ldb a,[$page a] ;A: page number of last word of user variables + ldb tt,[$page usrstg] + hrl tt,tt + add tt,[sysmap,,sysmap+1] + blt tt,sysmap(a) + movsi a,-400 ;A: AOBJN into system page tables + movei b,ffpage ;B: our next free page +sysin2: skipn sysmap(a) + jrst sysin3 + movem b,sysmap(a) + syscall corblk,[movei %cbndr + movei %jself ? movei (b) + movei %jsabs ? movei (a)] + .lose %lssys + aos b +sysin3: aobjn a,sysin2 + movem b,nxpage + move a,[-lsymtbl,,symtbl] +sysin4: skipl 1(a) + jrst sysin5 + ldb t,[$page (a)] + move t,sysmap(t) + dpb t,[$page (a)] +sysin5: add a,[1,,1] + aobjn a,sysin4 + rest b + rest a + return + +.scalar dump.0 + +purify: movsi tt,-npure + syscall corblk,[movei %cbndr + movei %jself ? move tt] + .lose %lssys + skipe debug + return + syscall open,[moves t ? [.uio,,chdump] + dumpdv + [sixbit /_probe/] + [sixbit /output/] + dumpsn] + return + setzi tt, + movem 0,dump.0 ;PDUMP misses AC0 + syscall pdump,[moves t ? movei %jself ? movei chdump ? move tt] + return + .iot chdump,[jrst purgo] + move tt,[-4,,2] + .iot chdump,tt +irp name,,[symbdv,symbn1,symbn2,symbsn] + rot tt,1 + add tt,name + .iot chdump,name +termin + .iot chdump,tt + .iot chdump,[jrst purgo] + syscall renmwo,[movei chdump ? dumpn1 ? dumpn2] + return + .close chdump, +purgo: move 0,dump.0 + syscall sstatu,[repeat 6, movem t + movem tt] + .lose %lssys + camn t,machine + came tt,version + jrst go + return + +symbdv: sixbit /dsk/ ;Filename where original SBLK with symbols +symbsn: sixbit /sysbin/ ;can be found. +symbn1: sixbit /probe/ +symbn2: sixbit /bin/ + +dumpdv: sixbit /dsk/ ;Filename where PDUMP file should go. +dumpsn: sixbit /sys/ +dumpn1: sixbit /ts/ +dumpn2: sixbit /probe/ + +;;;Type out the SIXBIZ string in T +6princ: hrli t,440600 + jrst 6prnc2 + +6prnc1: addi tt,40 + tyo tt +6prnc2: ildb tt,t + jumpn tt,6prnc1 + return + +if1, .insrt dsk:syseng;its defs + +define maktbl -rest +irps sym,,[rest] +rest +.zzz.==.ldb .ppss.,sym +ifg .zzz.-.max., .max.==.zzz. +loc .beg.+.zzz. + [sixbit /sym /] ;SIXBIZ +.istop +termin +termin + +define deftbl label,len,def,ppss +label: +.ppss.==ppss +.beg.==label +.max.==-1 +def maktbl +len==:.max.+1 +loc .beg.+len +termin + +deftbl uuotbl,luuotbl,.itsuu,331100 + +deftbl oprtbl,loprtbl,.itsop,002200 + +deftbl caltbl,lcaltbl,.itscl,270400 + +;;;CALL BITMAP to map over the bits in a word calling a routine at each 1. +;;;A: (arg) the word to map +;;;B: (arg) aobjn pointer to field table +;;;C: (arg) routine to call for each non-zero field: +;;; Should not clobber A, B or C. +;;; A: (arg) unprocessed bits +;;; D: (arg) value of the field +;;;A: (val) remaining bits +bitmap: save d +bitmp0: hrri t,a + hll t,(b) + setzi tt, + ldb d,t + dpb tt,t + skipe d + call (c) + aobjn b,bitmp0 + rest d + return + +define defmap name,prefix,fields +name: +irp field,,[fields] + .bp prefix!!field,[asciz /field/] +termin +l!name==:.-name +termin + +defmap mp%tj,,[%tjcns,%tjcp1,%tjcp2,%tjech,%tjctn,%tjstp,%tjdis +%tjsio,%tjmor,%tjpp2,%tjink,%tjhde] + +defmap mp%ti,,[%ticns,%tiech,%tipek,%tiact,%tiint,%tinwt,%tiful] + +defmap mp%op,%op,[TRP,DEC,DDT,LSP,BRK,CMD,INT,OPC,LOK,LKF,LIV,OJB] + +defmap mp%pi,%pi,[RLT,RUN,NXI,JST,DCL,ATY,TTY,PAR,FOV,WRO,FET,TRP,DBG,LOS +CLI,PDL,LTP,MAR,MPV,CLK,1PR,BRK,OOB,IOC,VAL,DWN,ILO,DIS,ARO,B42,C.Z,TYI] + +define asconc foo,bar +[asciz /foo!bar/]!termin + +mpifp: +repeat 18., .bp 1_.rpcnt,asconc CH,\.rpcnt +repeat 18., .bp 1_<.rpcnt+18.>,asconc INF,\.rpcnt +lmpifp==:.-mpifp + +mpn.m: +radix 10. +repeat 9, .bp 1_.rpcnt,asconc 1.,\<1+.rpcnt> +repeat 9, .bp 1_<.rpcnt+9>,asconc 2.,\<1+.rpcnt> +repeat 9, .bp 1_<.rpcnt+18.>,asconc 3.,\<1+.rpcnt> +repeat 9, .bp 1_<.rpcnt+27.>,asconc 4.,\<1+.rpcnt> +radix 8 +lmpn.m==:.-mpn.m + +defmap execpc,%ps,[USR,PCU,PUB,PCP,CR0,CR1,FOV,FXU,DIV,INH,TR1,TR2,FPD] + +defmap userpc,%ps,[USR,UIO,PUB,ARO,CR0,CR1,FOV,FXU,DIV,INH,TR1,TR2,FPD] + +cnstnts: +constants + +npure==:<.+1777>/2000 + +loc npure*2000 + +variables + +symtbl: +;;; "=" => store full 36-bit value. +;;; ":" => store as address indexed by U. +;;; "-" => store as unindexed address. +irps sym,type,[ + lublk= + maxj= + usrstg- + time- + epdlt1: + epdlt2: + epdlt3: + epdlt4: + lscall: + uuac: + siocp: + aprc: + lubtm: + iochnm: + iochst: + uwho1: + uwho2: + uwho3: + uname: + jname: + xuname: + xjname: + hsname: + usysnm: + option: + ustp: + upc: + + sv40: + suuoh: + pirqc: + ifpir: + mskst: + mskst2: + idf1: + idf2: + piclr: + ] +ifse type,=,[ +sym: 0 + squoze 00,sym + ] +ifse type,:,[ +sym: u,,0 + squoze 40,sym + ] +ifse type,-,[ +sym: 0,,0 + squoze 40,sym + ] +termin +lsymtbl==:.-symtbl + +twenty: block 20 + +pat: +patch: block 100. + +forty: 0 + 0 + -ltsint,,tsint + +debug: -1 + +ffpage==:<.+1777>/2000 + +end go