ÿL 01F4 09:45:52 05 Oct 2005 vs,, þ01ÿÿÿÿ4þ/usr/lib/pick/dtý7ý87ý01F4þ/home/jd/virt.tpý0ý87ý0 3@¡ ppy/2ý0ý87ý01F4þ/tmp/flo/floppy/5ý0ý87ý01F4þ/tmp/floppy/6ý0ý87ý01F4þ/home/patches/rs74xa202ý0ý87ý01F4þ/home/public/569131.txtý7ý87ý01F4þ/home/dev/fsý7ý87ý4240þ/n/ai€3@!ë/mqs.d3ý0ý87ý01F4þ/tmp/floppy/c2ý7ý87ý01F4þ/tmp/floppy/c3ý7ý87ý01F4þ/tmp/floppy/c4ý7ý87ý01F4þ/tmp/floppy/c5ý7ý87ý01F4þ/tmp/floppy/c6ý7ý8patchþn Updates to this program should be propagated to 'patch.alt' as wellþpþt-rewþt-fwdþpþdisplay Loading patch files ÿû...þpþdelete-file nsmx.patchþcreate-file nsmx.patch 1 101þcreate-file nsmx.patch,load 7 (xþt-load dict nsmx.patch (oiþcoÿûpy dict nsmx.patch mode patch.date (oiý(dict dm,abs,þt-load dict dm,abs, (oiþt-load dm,md, (oiþt-load dm,bp, (oiþt-load ÿûnsmx.patch (oiþpþdisplayþdisplay Compiling patch utilities ...þpþcompile dm,bp, patchxpick patchxpick.sub makexpatchxpicÿûk lock-abs mload gen.step.addr.data compile-catalog verify-patches patch.ds.location (dþcatalog dm,bp, patchxpick patchxÿûpick.sub makexpatchxpick lock-abs mload gen.step.addr.data compile-catalog verify-patches patch.ds.locationþpþdisplay Crÿûeating temporary abs ...þpþcreate-file absx.patch 1 397 (xnþcreate-abs absx.patch (lýdm,abs,þlock-abs absx.patch (hþexecÿû absx.patchþpþpatchxpickþpþexec dm,abs,þdelete-file absx.patchþdelete-file nsmx.patch,loadþpþpatch.wrapupþûpatch.altþn Updates to this program should be propagated to 'patch.alt' as wellþpþt-rewþt-fwdþpþdisplay Loading patch fiÿûles...þpþcreate-file nsmx.patch 1 79þcreate-file nsmx.patch,load 7 (xþclear-file data nsmx.patchþt-load dict nsmx.patch ÿû(oiþcopy dict nsmx.patch mode patch.date (oiý(dict dm,abs,þt-load dict dm,abs, (oiþt-load dm,md, (oiþt-load dm,bp, (oiþtÿû-load nsmx.patch (oiþpþdisplayþdisplay Compiling patch utilities...þpþcompile dm,bp, patchxpick patchxpick.sub makexpatcÿûhxpick lock-abs mload gen.step.addr.data compile-catalog verify-patches patch.ds.location (doþcatalog dm,bp, patchxpick ÿûpatchxpick.sub makexpatchxpick lock-abs mload gen.step.addr.data compile-catalog verify-patches patch.ds.location (oþpþpÿûatchxpick (aþpþdelete-file nsmx.patch,loadþpþûpatch.hpþn Updates to this program should also be made to patch.alt & patchþdisplay Loading patch files...þpþt-rewþt-fwdÿûþcreate-file nsmx.patch 1 79þcreate-file nsmx.patch,load 7 (xþclear-file data nsmx.patchþt-load dict nsmx.patch (oiþcopÿûy dict nsmx.patch mode patch.date (oiý(dict dm,abs,þt-load dict dm,abs, (oiþt-load dm,md, (oiþt-load dm,bp, (oiþt-load nÿûsmx.patch (oiþcompile dm,bp, patchxpick patchxpick.sub makexpatchxpick lock-abs verify-patches patch.ds.location (doþcatÿûalog dm,bp, patchxpick patchxpick.sub makexpatchxpick lock-abs verify-patches patch.ds.locationþpþpatchxpickþpþdelete-fiÿûle nsmx.patch,loadþpþûmake.patch.tapeþnþmakexpatchxpick nsmx.patchþûrepatchþnþdisplay Creating temporary abs ...þpþcreate-file nsmx.patch,load 7 (xþcreate-file absx.patch 1 397 (xnþcreate-ÿûabs absx.patch (lýdm,abs,þlock-abs absx.patchþexec absx.patchþpþpatchxpickþexec dm,abs,þpþlock-abs absx.patch (uþdelete-ÿûfile absx.patchþdelete-file nsmx.patch,loadþpþpatch.wrapupþûrepatch.altþnþpþcreate-file nsmx.patch,load 7 (xþpþpatchxpick (aþpþdelete-file nsmx.patch,loadþpþûpatch.detailþnþsort nsmx.patch # "[!3!]" by patch.num by patch.type break-on patch.num patch.type mode.id patch.ds.locatÿûion heading "Patch Detail'jtl'" id-suppþûÿXûûûûûûûûûûûûûûûûEOFÿloppy/c6ý7ý8ÿL 01F4 09:45:52 05 Oct 2005 DICT nsm.patchobj þ01loppy/c6ý7ý8modeþ6386þvirtualþtranslationþsensitiveþ18þ7.1.1.A14þûpatch.dataþ1þ202þ7.4þûpatch.numþaþ0þþþþþþg0!1þrþ3þûpatch.dateþ13793þûmode.idþaþ0þþþþþþg2!9þLþ25þûpatch.typeþaþ0þþþþþaif lpv = "1" then "ABS" else "Data Set"þg1!1þlþ10þûpatch.ds.locationþaþ0þþþþþþcall dm,bp, patch.ds.locationþLþ30þûÿXûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûEOFÿloppy/c6ý7ý8ÿL 01F4 09:45:52 05 Oct 2005 DICT dm,abs, þ01loppy/c6ý7ý8actionþaþ13þAction#þþþþþþrþ7þûpatchþaþ12þPatch#þþþþþþrþ6þûdescþaþ14þDescriptionþþþþþþtxþ30þûÿXûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûEOFÿloppy/c6ý7ý8ÿL 01F4 09:45:52 05 Oct 2005 dm,md, þ01loppy/c6ý7ý8list-patchesþnþlist abs %patches% patch action desc id-supp ni-suppþûÿXûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûEOFÿloppy/c6ý7ý8ÿL 01F4 09:45:52 05 Oct 2005 dm,bp, þ01loppy/c6ý7ý8patchxpickþ*þ* Patch loader for Pick systems patchesþ*þþ* [01] 02Nov93:bh Give Mload more benign warning messages [13559ÿû]þ* [02] 04Nov93:bh Allow %filter% item for platform/release specs [13582]þ* [03] 22Feb94:bh Leave mload there for makexÿûpatchxpick [14385]þ* [04] 04Mar94:bh Add exclusion checking [14468]þ* [05] 11May94:bh Compile gen.step.addr.date too in ÿûcase of Flashþ* [06] 20May94:bh Add 6.1þ* [07] 14Jun94:bh If 6.1, then only print 6.1þ* [07] 21Jun94:bh Add 6.1.Xþ* [08]ÿû 31Aug94:bh Add 5.2.7þ* [09] 16Sep94:bh Fix 6.0.1 - How did this get broken????þ* [10] 16Sep94:bh Fix 6.1.xþ* [11] 18Octÿû94:bh Use boot abs base - not monitor [15957]þ* [12] 22Dec94:bh Better release checking mechanism [14468]þ* [13] 09Jan94ÿû:bh Use "%release" to eliminate older patches [16421]þ* [14] 24feb95:rr Add ability to load 3rd party absþ* ÿû Make sure process running temporary absþ* Add check for missing %abs% itemþ* Add i-oÿûption to pause after every patchþ* [15] 21mar95:rr Remove verify-abs, as this is done manuallyþ* [16] 12apr95:rr Redo ouÿûtputþ* [17] 08may95:rr Remove @ functions from patch load displayþ* [18] 19Jun95:bh Allow boot abs if a optionþ* [19] 08ÿûFeb96:rr Allow range of patchesþ* [20] 11Mar96:rr Use %patch% item in data abs as patch indexþ* [21] 23May96:rr Check foÿûr mload error messagesþ* [22] 24May96:rr If no "checked-into" value, load the patchþ* [23] 28May96:rr dict nsm "patch.enÿûd" to mark end of patchesþ* [24] 04Jun96:rr update %abs% item of alternate abs if a-optionþ* [25] 30Oct96:rr Allow platfÿûorm-general exclusions (sco, pro, etc)þ* If %load% prints "not applicable", display it hereþ* [26] 05Decÿû96:rr Remove hard-coding of platforms and release levelsþ* [27] 16Dec96:rr Fix "var not assigned" errorsþ* [28] 21Apr97:ÿûrr Check for abs write-protection errorþ* [29] 04Jun97:rr Check release exclusions against monitor level onlyþ* [30] 23Jÿûul97:rr Check for u59 loaded else prompt userþ* [31] 29Jul97:rr "pre-loaded" message to supersede "superseded" messageþ*ÿû [32] 10Sep97:rr Rewrite for new patch file structureþ* [33] 22Sep97:rr Use patch.rel to verify loading releaseþ* [34] 2ÿû4Sep97:rr Clear type-ahead bufferþ* [35] 24Sep97:rr Bypass basic clearfile bugþ* [36] 25Sep97:rr Certain data set items ÿûnot being compiledþ* [37] 04Dec97:rr Combine dict nsm patch.] items into patch.dataþ* Verify target abs ÿûwhen doneþ* Create list-patches-alt macro based on abs filenameþ* [38] 27Apr98:rr Use pseudo floppy methÿûod for HPþ* [39] 19Jun98:rr Allow unconditional exclusion specificationþ* [40] 16Jul98:rr Fix bug with [39] not acceptinÿûg specific patch numbersþ* [41] 07Aug98:rr Fix var not assigned when unable to open pick0þ* Support multÿûiple configuration filesþ* [42] 22Sep98:rr Handle binary data set itemsþ* [43] 09Oct98:rr Put new HP code in subroutine ÿû(doesnt' compile on 6.1)þ* [44] 16Nov98:rr Compile after copying items to INCLUDE source codeþ* [45] 07May99:rr Try to rÿûecognize a bad patch tapeþ* [46] 19Apr00:rr Allow invalidation of patch through "load" moduleþ* [47] 26Apr00:rr Expand 'ÿûexclusions' item to include specific.to infoþ* [48] 04May00:rr Fix problem when only "#" specifications appear inþ* ÿû patch numbers to loadþ* [49] 26Jul00:rr [24258] Shutdown only if patch requires itþ* [50] 08Aug00:rr Executeÿû "echo" only on ProPlusþ* [51] 06Oct00:rr Make sure we are in DMþ* [52] 02Mar01:rr Prompt to update-md if appropriateþ* ÿû[53] 26Mar01:rr Display 'cancelled' if mload errorþ* [54] 05Apr01:rr Kill printers if applicableþ* [55] 09Apr01:rr Stop ÿûsyschkþ* [56] 17May01:rr Use current md in case not in dmþ* [57] 31May01:rr Clarify alternate abs error msgþ* [58] 12Junÿû01:rr Remove [54], cannot start spooler under alt absþ* [59] 22Aug01:rr If update-md, do selective copy rather than all ÿûof newacþ* [60] 30Jan03:rr Check for mload verb missingþ* [61] 25Sep03:rr Add option to display patch.detail prior to inÿûstallþ* [62] 31Aug04:rr Add conditional patch supersessionþ* [63] 08Sep04:rr Do not load patch if release levels are equÿûalþ* [64] 27Oct04:rr When patch becomes superseded, remove from list-patchesþ*þprompt ""þequ am to char(254), vm to charÿû(253), svm to char(252)þEquate VIRTUAL To "!1!", DATASET to "!2!", CONTROL to "!3!"þEquate VIRT.CD To 1, DATA.CD To 2þþcÿûasing offþþ* [51] MD checkþ* -------------þif @account = "dm" elseþ print "This command must be entered from the DM acÿûcount."þ print "Patch install aborted."þ stopþendþþoptions = system(15)þaflg = index(options,'a',1)þ*þx = Oconv('','ÿûu05');* [34] Clear type-ahead bufferþ*þmload.opt = "";* [30]þshutdown = 0;* [49]þ*þ* [30] Determine if write-protected aÿûbs are in effectþ* ---------------------------------------------------þ*open "dm,," To fv.mdþopen "md" To fv.md;* [56] Iÿûn case not in dmþopen "dm,abs,";* Look for u59 in boot absþreadv ver from "000",5 Elseþ Print; Print "000 item missingÿû from ABS file!"; err=1; Goto wrapupþEndþminor = oconv(ver,"g0.2")þif minor >= "7.0" thenþ if minor = "7.0" and field(ÿûver,".",3) >= 15 or minor > "7.0" thenþ read dummy from "ux.tcb" elseþ print; print "This is the first patcÿûh install on a system which has read-only abs."þ print "Did you enter D3 with the -b option (if you are unsure, ÿûanswer 'n')? ":þ input keyþ if trim(key)[1,1] # "y" thenþ print; print "Please exit D3 and rÿûe-enter with the -b option to allow updating of the abs."þ print "You can then restart the patch load proceduÿûre."; printþ err = 1þ Goto wrapupþ endþ mload.opt := "b";* [30]þ endþ end eÿûlse mload.opt := "b";* [30]þendþ*þrelease = system(100)þhp = Index(release,"hp9000",1);* [38]þ*þif not(aflg) and not(hp)ÿû thenþ * [18] Only if loading into boot absþ execute "where ":system(22) CAPTURING whereþ if index(where,"000018",1) ÿûthenþ printþ print "Error creating or exec'ing temporary abs";* [57]þ err = 1þ Goto wrapupþ endþendþþifÿû aflg thenþ printþ print "Enter complete filepath name of alternate abs (account,file,)"þ print "or 'q' to quit: ÿû":þ input abs.fnþ if trim(abs.fn) = "" or abs.fn = "q" then err=1; Goto wrapupþend else abs.fn = "dm,abs,"þþopen 'diÿûct',abs.fnþread any from "%abs%" elseþ print "%abs% item missing!"; err=1; Goto wrapupþendþþopen 'dict','nsmx.patch'þrÿûead patch.data from 'patch.data' elseþ print 'dict nsm patch.data item missing!'þ * stop;* [37]þ err = 1 þ Gotÿûo wrapupþEndþpatch.end = patch.data<2>;* [37]þ*þ* [33] Ensure patch matches systemþ* --------------------------------þ*rÿûead patch.rel from 'patch.rel' else print "dict nsm patch.rel item missing!"; stopþpatch.rel = patch.data<3>;* [37]þif pÿûatch.rel # minor thenþ printþ print "Cannot load ":patch.rel:" patches on a ":minor:" system!"þ err = 1þ Goto wrÿûapupþendþ*þ* [38] Create special files for HPþ* --------------------------------þIf hp Thenþ *þ * Create unix file fÿûor pseudo floppyþ Convert "." To "" In patch.relþ unix.fpath = "/tmp/hppatch":patch.rel:"xa":patch.endþ Execute "!ÿûtouch ":unix.fpath Capturing outþ If out # "" Then Print out; err=1; Goto wrapupþ *þ * Create temp abs from boot aÿûbs (or alt abs if a-opt)þ dest.abs = "hp":patch.rel:"xa":patch.endþ Execute "create-file ":dest.abs:" 1 617 (x" Captÿûuring xxþ Data abs.fnþ Execute "create-abs ":dest.abs:" (l" Capturing xxþ *þ abs.fn = dest.abs;* Newly created aÿûbs is the one to updateþEndþ*þopen abs.fn to data.abs;* [20]þ*þ* [26] Get mon/abs information from systemþ* ------------ÿû----------------------------þabs.level = iconv(3,"u713d")þþopen "nsmx.patch" to patch.srcþopen "nsmx.patch,load" to patcÿûh.loadþþpatch.prompt:þprint "- To load all the patches on the patch media, press ."þprint "- To load specific pÿûatches, enter single patch numbers, a range of patch"þprint " numbers, or '#patch' to exclude the patch unconditionallÿûy."þprint " For instance: 5,9-13,#18,25"þprintþprint "Enter the patch number(s), V)iew patch detail, or Q)uit: ":þinÿûput patchesþpatches = trim(patches)þif patches[1,1] = "q" then err=1; Goto wrapupþþ* [61] View patch detailþIf patches[1ÿû,1] = "v" Thenþ Execute "patch.detail"þ Loopþ Print "Press 'c' to continue or 'q' to quit: ":þ Input key,ÿû1þ Until key = "c" Or key = "q" Do Repeatþ If key = "q" Then Stopþ Goto patch.promptþEndþ*þ* [19] allow 5,7-9,11 iÿûnputþ*þconvert "," to am in patchesþpatchload = "";* [39]þ*þdc = dcount(patches,am)þfor a = 1 to dcþ p.spec = patches<ÿûa>þ beg.patch = field(p.spec,"-",1)þ if index(p.spec,"-",1) thenþ end.patch = field(p.spec,"-",2)þ end else;*ÿû [40]þ end.patch = beg.patch;* [40]þ endþ *þ pindx = 1;* [39] Default is the list of included patchesþ if bÿûeg.patch[1,1] = "#" then pindx=2; beg.patch[1,1]="";* [39]þ if end.patch[1,1] = "#" then pindx=2; end.patch[1,1]="";* ÿû[39]þ if not(num(beg.patch)) or not(num(end.patch)) thenþ print "Invalid patch specification."þ goto patch.pÿûromptþ endþ *þ for b = beg.patch to end.patchþ * add patch numbers to listþ patchload = b;* [3ÿû9] Add to included/excluded listþ next bþnext aþ*þprintþþ* [32] Build source tableþ* -----------------------þsrc.tbl =ÿû ""þmin = 999þSelect patch.srcþLoopþ Readnext id Else Exitþ patch.num = Field(id,"!",1)þ code = Field(id,"!",2)þ ÿû item.id = Field(id,"!",3)þ *þ * [45] Some checks for safetyþ * ---------------------------þ invalid = 0þ If Nÿûot(Num(patch.num)) ! Not(Num(code)) Then invalid = 1þ If item.id = "" Then invalid = 1þ If invalid Thenþ Print;ÿû Print "Invalid patch media!"; err=1; Goto wrapupþ Endþ *þ src.tbl<1,patch.num,-1> = item.idþ src.tbl<2,patch.nuÿûm,-1> = codeþ If patch.num < min Then min = patch.numþRepeatþþinstall.default = (patchload<1> = "");* [48] No patch spÿûec = load allþþ* [55] Stop syschkþ* ----------------þExecute "syschk stop" Capturing xxþþ*þ* [32] Load the patchesþ* ---ÿû------------------þ* [59] newac.flg = 0;* [52]þnewac.ids = "";* [59]þFor i = min To patch.endþ install = install.defauÿûlt;* [48] Get default install statusþ Locate i In patchload<1> Setting xx Then install = 1;* [39]þ Locate i In patchÿûload<2> Setting xx Then install = 0;* [39]þ If install Thenþ * this patch was requestedþ print "Patch ":i "rÿû#3":" ... ":þ *þ excluded = 0þ *þ read exclusions from patch.src,i:CONTROL:"exclusions" thenþ ÿû * check for exclusionsþ gosub chk.exclusionsþ if excluded or not(included) thenþ print "notÿû applicable to this platform/release."þ goto nextpatchþ endþ endþ *þ read xx from patcÿûh.src,i:CONTROL:"release" thenþ xx = xx[2,999];* extract abs number [13]þ abs.rel = field(abs.level<5>,"ÿû.",4)[2,9];* [27] extract abs numþ* if xx = "" or xx >= abs.rel or aflg then;* [22]þ if xx = "" or xx > aÿûbs.rel or aflg then;* [22] [63]þ gosub load.itþ end elseþ print "pre-loaded on this releasÿûe."þ endþ end elseþ gosub load.itþ endþ endþ nextpatch:þnext iþ*þexecute "verify-abs ":absÿû.fn;* [37]þprintþprint "Flushing memory ..."þexecute "flush" capturing xxþ*þ* Transfer patch information from multiple aÿûbs items (old method) toþ* single %patches% item (new method) [20]þ* ---------------------------------------þprintþprintÿû "Updating patch index ..."þexecute 'select ':abs.fn:' with patch and with a0 # "%]"' capturing xxþloopþ readnext id eÿûlse exitþ read abs.item from data.abs,idþ i = abs.item<12>;* [32]þ actions = abs.item<13>þ descs = abs.item<14>þÿû gosub upd.abs.fileþrepeatþ*þ* [37] Create list-patches-alt macroþ* ----------------------------------þwrite "n":am:"sÿûelect ":abs.fn:" %patches%":vm:"list ":abs.fn:" patch action desc id-supp ni-supp" on fv.md,"list-patches-alt"þ*þData "(ÿûdict ":abs.fnþExecute "copy dict dm,abs, patch action desc (o" capturing xxþ*þ* [52] Prompt to update newacþ* ----------ÿû-----------------þ*If newac.flg ThenþIf newac.ids # "" Then;* [59]þ Printþ Print "The patch installation has made chÿûanges to the DM master dictionary."þ Print "Press 'c' to update all other accounts with these changes,"þ Print "or aÿûny other key to skip this step: ":þ Input key,1þ If key = "c" Then Gosub update.mds;* [59]þEndþ*þ* [38] Dump patchedÿû abs to pseudo floppyþ* --------------------------------------þIf hp Thenþ * [43] Make into subroutineþ Call patchxpÿûick.sub(unix.fpath, abs.fn)þ*þ* Not quite complete until system is rebootedþ*End Elseþ* printþ* print "Patch installaÿûtion is complete."þEndþerr = 0þ*þ* [49] Create termination macroþ* -----------------------------þwrapup:þmacro = "n"þBegÿûin Caseþ Case errþ macro<-1> = "display Patch installation cancelled."þ macro<-1> = "maxusers (mq"þ macÿûro<-1> = "off"þ Case shutdownþ info = iconv(2,"u713d")þ release = oconv(info,'g0;1')þ If Field(release,ÿû' ',2) = 'ProPlus' Thenþ * [50] Needed for proper shutdown on ProPlusþ macro<-1> = '!echo "S" > /usr/libÿû/pick/.shutdown'þ Endþ *þ * Must print here since we can't run basic after resuming boot absþ Printþÿû Print "The patches that have been installed require a reboot of D3."þ *þ * Go directly to virtualþ ÿûmacro<-1> = ":shutdown"þ Case 1þ macro<-1> = "display Patch update is complete."þ macro<-1> = "maxusers (mq"ÿûþ macro<-1> = "off"þEnd CaseþWrite macro On fv.md,"patch.wrapup";* Will be executed þStopþ*þ* Load the patchþ* ----ÿû----------þload.it:þ*þ* [31] Check if obsoleteþ* ----------------------þread xx from patch.src,i:CONTROL:"obsolete" thenÿûþ * check for obsolete statusþ gosub is.obsoleteþ Gosub del.from.abs.file;* [64]þ returnþendþ*þ* [32] Process daÿûtaset itemsþ* --------------------------þExecute "clear-file nsmx.patch,load" Capturing xx;* [35]þstart = 1þLoopþ Locaÿûte DATA.CD In src.tbl<2,i>,start Setting subval Thenþ id = src.tbl<1,i,subval>þ Read buf From patch.src,i:DATAÿûSET:idþ If System(0) = 10 Thenþ * [42] Handle binary itemsþ Data "(nsmx.patch,load ":idþ Exÿûecute "copy nsmx.patch ":i:DATASET:id:" (o" Capturing xxþ End Elseþ Write buf On patch.load,idþ Endþ ÿû start = subval+1þ End Else ExitþRepeatþ*þlbit = 0; * "something was loaded" flagþread load.item from patch.src,i:CÿûONTROL:"load" thenþ * customized pre-loaderþ load.bp = load.item<5>þ If load.bp # "" Thenþ Convert vm To am In loÿûad.bpþ Write load.bp On patch.load,"%load%"þ* Execute "compile-run nsmx.patch,load %load%" Capturing outputþ ÿûExecute "compile nsmx.patch,load %load%" Capturing outputþ If index(output,"compilation aborted",1) Then Goto errorþÿûþ Execute "run nsmx.patch,load %load%" Capturing outputþ *þ * [46] Allow load program to classify patch as "ÿûnot applicable"þ * -------------------------------------------------------------þ* If Index(output,"not applicablÿûe",1) Thenþ If Index(output,"not applicable",1) Or Index(output,"superseded",1) Then;* [62]þ* print "not appliÿûcable to this platform/release."þ Print output;* [62]þ Returnþ Endþ Endþ *þ num.files = Dcount(loadÿû.item<1>,vm)þ For j = 1 To num.filesþ dest.fn = load.item<1,j>þ Open dest.fn Thenþ num.ids = Dcount(loadÿû.item<2,j>,svm)þ For k = 1 To num.idsþ id = load.item<2,j,k>þ Read src.itm From patch.load,idÿû Thenþ lbit = 1þ If System(0) = 10 Thenþ * [42] Handle binary itemsþ ÿû Data "(":dest.fnþ Execute "copy nsmx.patch,load ":id:" (o" Capturing xxþ End Elseþ ÿû Write src.itm On id;* write dataset item on dest. fileþ Endþ Endþ Next kþ ÿû End;* [44]þ Next j;* [44]þ *þ For j = 1 To num.files;* [44]þ dest.fn = load.item<1,j>;* [44]þ Open dest.fnÿû Then;* [44]þ *þ * [36] Build list of ids to compileþ * ---------------------------------þ iÿûds = load.item<2,j>þ Convert svm TO " " In idsþ *þ If load.item<3,j> Then;* [36]þ * compiÿûle & catalog new itemþ Execute "compile ":dest.fn:" ":ids:" (d" Capturing xxþ Execute "catalog ":desÿût.fn:" ":ids:" (o" Capturing xxþ Endþ If load.item<4,j> Thenþ * update newacþ Data "(dÿûm,newac,"þ Execute "copy md ":ids:" (o" Capturing xxþ*[59] newac.flg = 1;* [52]þ newac.ids<-1> ÿû= idsþ Endþ Endþ Next jþ *þ * customized post-loaderþ load.bp = load.item<6>þ If load.bp # "" Thenþ ÿûConvert vm To am In load.bpþ Write load.bp On patch.load,"%load%"þ Execute "compile-run nsmx.patch,load %load%" ÿûCapturing outputþ If index(output,"compilation aborted",1) Then Goto errorþ Endþendþ*þ* [32] Process virtual modesþÿû* --------------------------þExecute "clear-file nsmx.patch,load" Capturing xx;* [35]þstart = 1þLoopþ Locate VIRT.CD Iÿûn src.tbl<2,i>,start Setting subval Thenþ id = src.tbl<1,i,subval>þ Read buf From patch.src,i:VIRTUAL:idþ ÿû Write buf On patch.load,idþ start = subval+1þ End Else ExitþRepeatþ*þ*execute 'select nsmx.patch with a0 # "%]"'ÿû capturing xxþexecute 'select nsmx.patch,load' capturing xx;* [32]þif system(11) thenþ lbit = 1þ data abs.fnþ execÿûute "mload nsmx.patch,load (":mload.opt capturing output Returning err;* [28] [30] [32]þ if index(output,"error(s)",1)ÿû then goto error;* check for assembly errsþ If Index(output,"[320]",1) Then Goto error;* [28]þ If err = 3 Then Goto ÿûerror;* [60]þ if index(output,"unsupported processor",1) then goto error else gosub success;* [21] check for bad dict ÿûnsm itemþend elseþ if lbit then gosub success else print "empty patch!"þendþ*þ* Update abs %patches% item from nsm,strÿûip %patch% information [20]þ* -----------------------------------------------------------------þ*open "nsmx.patch,strip"ÿû:patch to stripþ*read patch.nsm from strip,"%patch%"þread patch.nsm from patch.src,i:CONTROL:"patch"þactions = patch.nsmÿû<1>þdescs = patch.nsm<2>þgosub upd.abs.fileþþRead any from patch.src,i:CONTROL:"reboot" then shutdown = 1;* [49]þreturnþÿû*þ* Patch not applicable to platform/releaseþ* ----------------------------------------þnot.applicable:þprint "not appliÿûcable to this platform/release."þreturnþ*þ* Patch is obsoleteþ* -----------------þis.obsolete:þprint "superseded by patcÿûh ":xx:"."þif patches # "" thenþ * automatically add the new patch to the patch listþ* patches = patches:",":xx:","þ* pÿûatches<-1> = xxþ patchload<1,-1> = xxþendþreturnþ*þ* Patch loaded successfullyþ* -------------------------þsuccess:þpriÿûnt "loaded successfully."þreturnþ*þ* Update %patches% item in data abs [20]þ* --------------------------------------þupdÿû.abs.file:þconvert vm to svm in actions ;* for access reportþconvert vm to svm in descsþ*þreadu patch.abs from data.abs,ÿû"%patches%"þlocate i in patch.abs<12> by "dr" setting set thenþ patch.abs<12,set> = iþ patch.abs<13,set> = actionsþ ÿû patch.abs<14,set> = descsþend elseþ patch.abs = insert(patch.abs,12,set;i)þ patch.abs = insert(patch.abs,13,set;acÿûtions)þ patch.abs = insert(patch.abs,14,set;descs)þendþwrite patch.abs on data.abs,"%patches%"þreturnþ*þdel.from.abs.fÿûile:þreadu patch.abs from data.abs,"%patches%"þlocate i in patch.abs<12> by "dr" setting vmc thenþ For amc = 12 to 14þÿû patch.abs = Delete(patch.abs,amc,vmc)þ Next amcþ Write patch.abs on data.abs,"%patches%"þEndþReturnþ*þ* Subrouÿûtine to check exclusionsþ* ------------------------------þ* Exclusion list is in xxþ* excluded = 1 if exluded on returnþÿû*þchk.exclusions:þexcluded = 0þexmax = dcount(exclusions<1>,vm);* [47] Get exclusionsþfor j = 1 to exmaxþ this.excl = tÿûrim(exclusions<1,j>)þ if this.excl = "all" then excluded = 1þ *þ * [26] New 'exclusions' algorithmþ * --------------ÿû-----------------þ begin caseþ case num(this.excl[1,2])þ * release level exclusion onlyþ * append "." so that 6.ÿû1.1 exclusion does not exclude 6.1.15þ excl.lvl = field(this.excl," ",1):"."þ if index(release,excl.lvl,1) then exÿûcluded = 1;* [29]þ case field(this.excl," ",2) # ""þ * platform & release level exclusionþ excl.plat = field(thisÿû.excl," ",1)þ excl.lvl = field(this.excl," ",2):"."þ if index(release,excl.plat,1) then excluded = 1;* [29]þ caseÿû 1þ * platform exclusion onlyþ excl.plat = field(this.excl," ",1);* [27]þ if index(release,excl.plat,1) then exÿûcluded = 1;* [29]þ end caseþnext jþþ*þ* [47] If specific.to releases exist, check that we qualifyþ* -------------------ÿû--------------------------------------þincluded = 0þnum.specific.to = dcount(exclusions<2>,VM);* þif num.specific.to = 0ÿû then included = 1; return;* Not specificþþfor j = 1 to num.specific.toþ if index(release,exclusions<2,j>,1) then inclÿûuded = 1; exitþnext jþreturnþ*þ* Print errorþ* -----------þerror:þprint "error loading patch!"þprintþdc = dcount(outpuÿût,am)þfor a = 1 to dcþ print " ":outputþ if a/18 = int(a/18) thenþ print; print "Press to continue: ÿû":þ input keyþ printþ endþnext aþprintþerr = 1;* [53]þGoto wrapupþþupdate.mds:þ* [59] Save listþ* -------------ÿû-þOpen "dm,pointer-file," To fv.listþWrite newac.ids On fv.list,"d3.patch.newac"þClose fv.listþ þ* [59] Build list ÿûof accountsþ* ---------------------------þaccounts = ""þExecute 'select mds,, # "dm" and # "mds" with a1 "d]" and with bÿûase < "a"' Capturing xxþLoopþ Readnext id Else Exitþ accounts<-1> = idþRepeatþþ* [59] Copy to each account MDþ* ----ÿû------------------------þPrint; Print "Updating ..."; Printþnum.accounts = Dcount(accounts,@am)þFor i = 1 to num.accountÿûsþ Print " ":accountsþ Data "(":accounts:",,"þ Execute "gl d3.patch.newac":@am:"copy dm,newac, (oi" Capturÿûing xxþNext iþReturnþûpatchxpick.subþSubroutine patchxpick.sub(unix.fpath, abs.fn)þ*þ* [00] 09oct98 rr: Original, split from patchxpickþ*þEquaÿûte MAXTAPES to 40þEquate AM to Char(254)þ*þPrint "Dumping patches to pseudo floppy ..."þ*þ* get last device on listþExecÿûute "list-device" Capturing devicesþdc = Dcount(devices,am)þFor i = dc to 1 Step -1þ ln = Trim(devices)þ dev = Fiÿûeld(ln," ",1)þ If Num(dev) Then Exit;* found oneþNext iþIf Not(Num(dev)) Then Print "Error locating valid device!"; Stÿûopþ*þ* Change device for absdumpþExecute "t-det ":devþExecute "chg-device ":dev:" type=floppy density=pseudo name=":unixÿû.fpath Capturing outþdc = Dcount(out,am)þIf out # "Device changed" Thenþ Print "Unable to change device!"; StopþEnÿûdþ*þ* Dump the patched abs to pseudo floppyþExecute "set-device ":dev Capturing xxþExecute "t-att 512" Capturing xxþExecÿûute "absdump ":abs.fn:" (il" Capturing xxþExecute "t-dump ":abs.fn:" (i" Capturing xx þ*þprintþprint str('-',79)þ*þpriÿûnt; print "The ABS file will now be modified, and the system will be shutdown."þPrint 'After the shutdown, load A)bs froÿûm device "':unix.fpath:'" to'þPrint "complete the installation."þPrint; Print "Note: Quitting now will abort the patch ÿûinstallation without any"þPrint "changes to the system. However, failure to load A)bs after the"þPrint "shutdown will rÿûesult in ABS file inconsistencies."þPrintþPrint "Press 'c' to start the ABS modification and system shutdown, or 'q' to ÿûquit: ":þLoopþ Input key,1þUntil key = "c" Or key = "q" Do Print Char(7): RepeatþIf Trim(key)[1,1] = "q" Thenþ Prinÿût; Print "Patch install aborted."; StopþEndþ*þ* Load data absþPrint; Print "Modifying abs file ... ":þExecute "clear-filÿûe abs" Capturing xxþExecute "t-rew" Capturing xxþExecute "t-fwd" Capturing xxþExecute "t-load abs (oi" Capturing xxþ*þ* ÿûModify configuration fileþfailure = ""þnew.line = "tape ":unix.fpath:" 500 f lx";* [41]þvmname = Field(Field(System(100)ÿû,";",3),":",1);* [41]þ*þOpen "unix:/usr/lib/pick" Thenþ Read pick0 From vmname Elseþ failure = "Unable to read /uÿûsr/lib/pick/":vmname;* [41]þ Endþ dc = Dcount(pick0,am)þ numtapes = 0; onfile = 0þ For i = 1 To dcþ ln = Trÿûim(pick0)þ If ln[1,4] = "tape" Then numtapes += 1þ If ln[1,Len(new.line)] = new.line Then onfile = 1; Exitþÿû Next iþ If onfile = 0 Thenþ If numtapes < MAXTAPES Thenþ pick0<-1> = new.lineþ Write pick0 On ÿûvmname On Error failure = "Unable to write /usr/lib/pick/":vmname;* [41]þ End Else failure = MAXTAPES:" tape deviceÿûs already defined"þ EndþEnd Else failure = "Unable to open /usr/lib/pick"þ*þPrintþIf failure # "" Thenþ Print "Errorÿû: ":failure; *[41]þ Print "After the shutdown has completed, the following line must be added"þ Print "to /usr/lib/ÿûpick/":vmname;* [41]þ Printþ Print " ":new.lineþ Printþ Print "Once the configuration file is updated, you musÿût load A)bs from this device."þ Print "Press a key to begin the shutdown: ":þ Input key,1þEndþ*þChain "shutdown (y"ÿûþûmakexpatchxpickþ*þ* Program to create patchesþ*þ*þ* [01] 02Nov93:bh [13559] Make mload have more benign messagesÿûþ* [02] 25Jan93:bh [13559] Allow numeric option to limit dumpþ* [03] 04Feb94:bh [14222] Allow dumping of obsoletesþ* [04ÿû] 05Feb94:bh [14353] Allow dumping of a single patchþ* Force M option for change [02]þ* [05] 22Fÿûeb94:bh [14385] Fix alternate filename problemþ* [06] 07Mar94:bh [14468] Use "patch.start" in dict nsm for low limitþ* [ÿû07] 24Feb95:rr Centralize patch macro in VSþ* [08] 21Mar95:rr Add patch.qa macroþ* [09] 12Apr95:rr ÿû Remove patch.qa (modified 'patch' output)þ* [10] 19Jun95:bh Dump "lock-abs" tooþ* [11] 27Jun95:bh Incÿûrease high limitþ* [12] 23May96:rr Make sure dict abs mode is not NTþ* [13] 28May96:rr Use "patch.end" (ÿûcomputed or spec as option)þ* in dict nsm for high limitþ* [14] 29May96:rr Add "patch.daÿûte" to dict nsm for 'which'þ* [15] 04Jun96:rr Allow comments on line 1 of patch macrosþ* [16] 19Dec96:rr ÿû Add e-option to cut exclusive patchþ* [17] 15Jan97:rr Fix problems when patch.start item missingþ* [18] 29Jul97ÿû:rr Dump %release% for better patch load displayþ* [19] 18Sep97:rr Rewrite for new patch file structureþÿû* [20] 22Sep97:rr Use patch.rel for release levelþ* [21] 25Sep97:rr Esnure patchcode matches sourceþ* [2ÿû2] 25Sep97:rr Use source file to determine max patch numberþ* [23] 01Oct97:rr Write patch.date & patch.rÿûel only on originalþ* [24] 29Oct97:rr Remove hard-coding to 7.0þ* [25] 19Nov97:rr Do not verify obsoleteÿû patchesþ* Do not dump obsolete "patch" control itemsþ* [26] 04Dec97:rr Put target dict ÿûnsm patch.] in 'patch.data'þ* [27] 07Dec97:rr Exclude patches with "all" exclusionsþ* [28] 06Feb98:rr nsÿûm,patchcode ==> nsm.patchobjþ* [29] 30Mar98:rr Ensure dict nsm.patchobj patch.num existsþ* [30] 20Apr98:rr ÿû Use source file to check obsolete patchesþ* [31] 27Apr98:rr Dump patch.hp macroþ* [32] 03Jun98:rr Addÿû f-opt to dump to pseudo floppyþ* [33] 03Jun98:rr Verify patch excl/obsolete info matches src,þ* ÿû Fix bug with obsolete control items gettingþ* deleted from patches,src instead of temp ÿûfileþ* [34] 21Aug98:rr Reassembly after integrity check not workingþ* [35] 10Sep98:rr Remove header updaÿûtes, causing mload errorsþ* if a1 in object becomes too largeþ* [36] 01oct98:rr Check foÿûr assembly errorsþ* [37] 09oct98:rr Split patchxpick into patchxpick.subþ* [38] 21oct98:rr Display patchÿû id after createþ* [39] 18apr00:rr Change f-option pseudo floppy directoryþ* [40] 21apr00:rr Print descrÿûiptive message if can't open fileþ* [41] 03aug00:rr Include patch.date in t-dumpþ* [42] 17aug00:rr Just ÿûreport assembly errors if not includedþ* [43] 15Dec00:rr Add verify-patchesþ* [44] 22Dec00:rr Don't checÿûk for assembly errors if obsoleteþ* [45] 11Jan01:rr Add frame.lock.absx.patchþ* [46] 11Mar02:þ* [47] 27Jan03:rr ÿû Increase size of temp fileþ* [48] 17Sep03:rr [28683] Add patch.ds.locationþ* [49] 24Oct03:rr Display errÿûors if unrecoverableþ* [50] 12Dec03:rr Create DN temp file for performanceþ* [51] 20Feb04:rr T-dump to sÿûpecify target frame size (binaries)þ* [52] 22Oct04:rr [30478] Ensure description exists for every patch numþ* ÿû þ*þequ am to char(254), vm to char(253)þþprompt ''þþ* Get the file-nameþþtclread lineþIf Index(line,"?",1) Tÿûhenþ Print "create-patch {device.num} {( {patch} options}"þ Printþ Print "Options:"þ Printþ Print " patch - ÿûcut up to this patch only"þ Print " E - cut specified patch only"þ Print " M - cut from patch 1 (ignore min patcÿûh number)"þ Printþ StopþEndþ*þline = Trim(line)þdevnum = Field(line," ",2)þIf devnum[1,1] = "(" Then devnum = ""þþp ÿû= index(line," (",1)þif p then þ params = line[1,p-1]þ opt = line[p+2,9999]þend elseþ params = lineþ opt = ""þend þþÿûacct = Field(Oconv('','u50bb'),' ',3)þlevel = Oconv(acct,"g2.2")þpatch.fn = "vs,patches.":level:","þ*þsource.fn = field(ÿûparams," ",2)þif source.fn = "" then source.fn = "nsm.patchobj"þIf Num(source.fn) Then source.fn = "nsm.patchobj"þþtemp.ÿûfn = source.fn:",temp"þþoopt = index(opt,"o",1);* no obsolete patchesþmopt = index(opt,"m",1);* start from beginningþeopÿût = index(opt,"e",1);* cut specified patch ONLYþfopt = index(opt,"f",1);* cut to pseudo floppyþþ*þ* [19] Search for min/ÿûmax patch numbers in file [22]þ* --------------------------------------------------þmin = 999; max = 0þopen 'patches.':lÿûevel:',src' to source.fv else;* [24] [33]þ open source.fn to source.fv else;* [33]þ print "Unable to open patch sÿûource file!"; stopþ endþendþ*þfatal = 0;* [52]þselect source.fv;* [22] [33]þloopþ readnext id else exitþ Read patcÿûh.src.item From source.fv,idþ patch.num = field(id,"!",1) þ if patch.num < min then min = patch.numþ if patch.num ÿû> max then max = patch.numþþ * [52] Check for blank descriptionsþ patch.id = field(id,"!",3)þ if patch.id = "patchÿû" thenþ num.acts = Dcount(patch.src.item<1>,vm)þ for i = 1 to num.actsþ if patch.src.item<2,i> = "" thÿûenþ print "Patch item '":id:"' is missing action descriptions."þ fatal = 1þ endþ nextÿû iþ endþrepeatþþif fatal then abort;* [52]þþ*þ* [19] Patch.start item overridesþ* -------------------------------þopenÿû "dict",source.fn To dict.nsm else stop 201,"dict ":source.fn;* [40]þwrite 'a':am:0:Str(am,6):"g0!1":am:"r":am:3 on dictÿû.nsm,"patch.num";* [29]þwrite 'a':am:0:Str(am,5):'aif lpv = "1" then "ABS" else "Data Set"':am:"g1!1":am:"l":am:10 on diÿûct.nsm,"patch.type";* [46]þwrite 'a':am:0:Str(am,6):"g2!9":am:"L":am:25 on dict.nsm,"mode.id";* [46]þwrite 'a':am:0:Str(ÿûam,6):"call dm,bp, patch.ds.location":am:"L":am:30 on dict.nsm,"patch.ds.location";* [48]þþread xx from dict.nsm,"patch.ÿûstart" thenþ xx = trim(xx)þ if num(xx) then min = xxþendþread patch.data from dict.nsm,'patch.data' else patch.data = ÿû'';* [26]þ*if patch.data<1> # "" then min = patch.data<1>;* [26]þþ* [19] Tcl specifications overrideþ* -----------------ÿû---------------þn = oconv(opt,"mcn");* limit of patch dumpþif n # "" thenþ max = nþ if eopt then min = nþendþif mopt tÿûhen min = 1þ*þ* [12] dict nsm mode cannot be NTþ* -------------------------------þreadv imp from dict.nsm,"mode",1þif imÿûp = "nt" then print "DICT ":source.fn:" mode cannot be NT!"; stopþþ*write min on dict.nsm,"patch.start";* [19]þ*write maÿûx on dict.nsm,"patch.end";* [13]þpatch.data<1> = min;* [26] Starting patch numberþpatch.data<2> = max;* [26] Ending patcÿûh numberþ*þ* Locate patch macroþ* ------------------þþmd = "vs,,"þopen md thenþ readv code from 'patch',1 thenþ iÿûf code[1,1] # "n" then md = "md";* [15]þ end else md = "md"þend else md = "md"þ*þif fopt thenþ *þ * [32] Pseudo flÿûoppy preparationþ * ------------------------------þ If devnum = "" Thenþ execute "list-device"þ print; priÿûnt "Enter unit number of device or 'q' to quit: ":þ input devnumþ if devnum = "q" then stopþ Endþ *þ Prÿûint "Creating Unix file..."þ platform = field(acct,".",2)þ begin caseþ case platform = "m88k"; platform = "dg"þÿû case platform = "rs6000"; platform = "rs"þ case platform = "hp9000"; platform = "hp"þ end caseþ minor = fÿûield(acct,".",5)þ if minor = "" then minor = "x"þ unix.fpath = "/home/patches/":platform:level:minor:"a":maxþ If eÿûopt Then unix.fpath := "e"þ convert "." to "" in unix.fpathþ Execute "!touch ":unix.fpathþ Execute "!chmod a+rwx "ÿû:unix.fpathþ Execute "t-det" Capturing xxþ Execute "chg-device ":devnum:" name=":unix.fpath Capturing xxþ Execute ÿû"set-device ":devnum Capturing xxþ If Index(xx,"is assigned",1) Else Print "Error: ":xx; StopþEndþ*þ* [21] Ensure patcÿûh code matches sourceþ* -------------------------------------þreassembled = 0þverify.patches:þprint; print "Verifying paÿûtch integrity..."þ*þerrs = ""; err.detail = ""þfatal.errs = 0;* [36]þ*þExecute 'sselect patches.':level:',src with a0 "[ÿû!1!]" by patch.num' Capturing xx;* [24]þIf System(11) Thenþ Open source.fn To fv.object else stop 201,source.fn;* [36]ÿû [40]þ Open patch.fn else stop 201,patch.fn;* [25] [40]þ *þ * [33] Verify obsolete/exclusion informationþ * ----ÿû--------------------------------------þ For i = min To maxþ Read patch.info From iþ If patch.info<3> Thenþ ÿû obs.id = i:"!3!obsolete" þ Read any From source.fv,obs.id Elseþ Write patch.info<3> On source.ÿûfv,obs.idþ Print "Item '":obs.id:"' missing from source file; restored"þ Endþ Endþ *þ ÿûIf patch.info<4> # "" Or patch.info<1> # "" Thenþ exc.id = i:"!3!exclusions"þ Read any From source.fv,exÿûc.id Elseþ Write patch.info<4>:vm:patch.info<1> On source.fv,exc.idþ Print "Item '":exc.id:"' missÿûing from source file; restored"þ Endþ Endþ Next iþ *þ Loopþ Readnext id Else exitþ patch.nuÿûm = Field(id,"!",1)þ Read patch.item From patch.num;* [44]þ If patch.item<3> = "" And patch.item<4> # "all" Thÿûenþ Locate patch.num In errs Setting xx Elseþ If patch.num >= min And patch.num <= max Thenþ ÿû Gosub check.errorsþ Endþ Endþ Endþ Repeatþ *þ If fatal.errs Then Stop;* [36]þ *þ ÿû If errs # "" Thenþ If reassembled Thenþ Print "Unrecoverable mismatch between source and object:"; Printþ ÿû * [49] Display errorsþ dc = Dcount(err.detail,am)þ For i = 1 To dc; Print err.detail; Next iþÿû Stopþ Endþ *þ Print; Print "Assemble these patches now (y/n)? ":þ Input keyþ If Trim(ÿûkey)[1,1] = "y" Else Stopþ dc = Dcount(errs,am)þ For i = 1 to Dcþ Execute "as-patch ":errsþ Neÿûxt iþ reassembled = 1þ Goto verify.patchesþ EndþEndþ*þ* [19] Prepare temp fileþ* ----------------------þPrinÿût "Clearing temporary file..."þþExecute "create-file ":temp.fn:" 21523 (n" Capturing xx;* [47]þExecute "clear-file ":temÿûp.fn Capturing xxþ*þ* get virtual codeþPrint "Copying virtual modes..."þExecute 'select ':source.fn:' with patch.num >= ÿû"':min:'" and <= "':max:'"' Capturing xxþIf System(11) Thenþ Data "(":temp.fnþ Execute "copy ":source.fn:" (oi" Captÿûuring xxþEndþ*þOpen temp.fn To temp.fv Else stop 201,temp.fn;* [40]þOpen patch.fn to patches Thenþ *þ print "Strippiÿûng source..."þ execute 'strip-object ':temp.fn:' (s' capturing xxþ *þ* Print "Updating object headers..."þ* Execuÿûte "sselect ":temp.fn:" by patch.num" Capturing xxþþ* þ* [35] remove following coÿûdeþ*þ* last = ""þ* Loopþ* Readnext id Else Exitþ* patch.id = Field(id,"!",1)þ* If patch.id # last Thenþ* ÿû Read info From patches,patch.idþ* hdr = "*#Patch ":patch.idþ* if info<2>[1,1] = "Y" Then hdr = hdr:VÿûM:"reboot"þ* num.acts = dcount(info<10>,vm)þ* for i = 1 to num.actsþ* hdr = hdr:vm:info<10,i>:" ÿû":info<11,i>;* add action infoþ* next iþ* Endþ* *þ* Read mode From temp.fv,idþ* mode = hdr:am:modÿûeþ* Write mode On temp.fv,idþ* last = patch.idþ* Repeatþ *þ * get dataset & control items from vs if applicÿûableþ *þ src = patch.fn:"src,"þ Open src Thenþ Print "Copying dataset & control items..."þ Execute 'seleÿûct ':src:' # "[!1!]"' Capturing xxþ If System(11) Thenþ Data "(":temp.fnþ Execute "copy ":src:" (oiÿû" Capturing xxþ Endþ Endþ *þ write date() on dict.nsm,"patch.date";* [14] [23]þ* write level on dict.nsm,"paÿûtch.rel";* [20] [23]þ patch.data<3> = level;* [26]þEndþWrite patch.data On dict.nsm,"patch.data";* [26]þ* þ* remove unÿûwanted patch modules, check for exceptions to supersedingsþ* -----------------------------------------------------------ÿû--------þobsolete = ""þIf oopt Elseþ * If the file does not exist, then we are on a host system, soþ * obsolete itemÿûs have already been deletedþ * ----------------------------------------þ Print "Removing obsolete items..."þ Execuÿûte 'select patches.':level:',src = "[!obsolete""[!exclusions"' Capturing xx;* [30]þ Loopþ Readnext id Else Exitþ ÿû Read xx From temp.fv,idþ If Field(id,"!",3) = "obsolete" Thenþ If xx > max Thenþ * supersedÿûing patch won't be included in cut, so make activeþ Delete temp.fv,id;* [33]þ End Elseþ * ÿûAdd to list of obsolete patchesþ obsolete<-1> = Field(id,"!",1)þ Endþ End Elseþ If xx<1>ÿû = "all" Then obsolete<-1> = Field(id,"!",1);* [27]þ Endþ Repeatþ *þ Select temp.fvþ Loopþ Readnext idÿû Else Exitþ patch.num = Field(id,"!",1)þ If patch.num =< max And patch.num >= min Thenþ * delete non-cÿûontrol items that are obsoleteþ Locate patch.num In obsolete Setting xx Thenþ code = Field(id,"!",2)þÿû If code # 3 Or (code = 3 And Field(id,"!",3) = "patch") Thenþ Delete temp.fv,idþ Enÿûdþ Endþ End Else Delete temp.fv,id;* not part of requested patch setþ RepeatþEndþClose temp.fvþ*þprint "Dÿûumping patch utilities..."þexecute "t-rew" capturing xxþexecute "t-dump ":md:" 'patch''patch.alt''patch.hp''make.patch.tÿûape''repatch''repatch.alt''patch.detail' (i" capturing xx;* [46]þexecute "t-dump dict ":source.fn:" mode patch.data patcÿûh.num patch.date mode.id patch.type patch.ds.location (i" capturing xx;* [26][41][46][48]þexecute "t-dump dict dm,abs, aÿûction patch desc (i" capturing xxþexecute "t-dump dm,md, list-patches (i" capturing xxþexecute "t-dump dm,bp, patchxpickÿû patchxpick.sub makexpatchxpick lock-abs mload verify-patches frame.lock.absx.patch patch.ds.location (i" capturing xx;*ÿû [45] [48]þ*execute "t-dump dm,bp, mload (i" capturing xxþþ*þ* Dump the patchesþ* ----------------þprint "Dumping patcheÿûs..."þopts = "i";* [51]þIf level >= "7.4" Then opts := "r4000";* [51]þexecute "t-dump ":temp.fn:" (":opts capturing xx;*ÿû [51]þþprint; print "Deleting temporary files..."þexecute "delete-file ":temp.fn Capturing xxþþprint "Releasing tape...ÿû"þexecute "t-rew" capturing xxþexecute "t-det" capturing xxþþ* [38] Display patch generatedþIf eopt Then max := "e"þprinÿût "Patch creation (A":max:" for ":imp:") is complete."þStopþþcheck.errors:þData "(nsm.patchobj"þExecute "compare patchesÿû.":level:",src ":id:" (zs" Capturing xx;* [24]þIf xx = "" Elseþ print " Patch ":patch.num:" needs to be assembled!"þÿû errs<-1> = patch.numþ err.detail<-1> = xxþ ReturnþEndþ*þ* [36] Check for assembly errorsþ* ----------------------ÿû--------þRead object From fv.object,idþIf Index(object,"*err",1) Thenþ Print " Module '":id:"' has assembly errors!"ÿûþ If patch.num <= max Then fatal.errs = 1 Else errs += 1;* [42]þEndþReturnþûlock-absþ*þ* Utility for locking abs into memoryþ*þ* [01] 19Jun95:bh Createdþ*þtclread lnþopt = field(ln,"(",2)þhopt = cÿûount(opt,"h");* HP onlyþuopt = count(opt,"u");* Unlockþ*þif hopt thenþ * H option makes the abs only lock on the HP plaÿûtform since it seemsþ * to have trouble with cache synchronizationþ if not(count(system(100),"hp9000")) then stopþendþÿû*þif uopt then verb = "unlock-frame " else verb = "lock-frame "þ*þ*þfn = field(ln," ",2); * get abs nameþopen "dict",fn ÿûelse stop 201,fnþ*þread xx from "%abs%";* get location infoþ*þstart = xtd(xx<1>)þsize = xtd(xx<2>)þ*þif not(num(start)) ÿûor start < 1 then stopþif not(num(size)) or size < 1 then stopþ*þ* Do the operationþ*þif uopt thenþ print "Unlocking ABÿûS '":fn:"'...":þend elseþ print "Locking ABS '":fn:"'...":þendþmax = start+size-1þfor i = start to maxþ execute verb:iÿû capturing xxþnext iþ*þprintþstopþûmloadþ! program mloadþ* 10 Jan 89þ*þ* [01] 21Dec88 : es : Accept 'e' mode for mverifyþ* [02] 29Dec88 : es : Remove some ÿûnon printable character in one commentþ* Change the checksum compuiting for virtualþ* ÿû mloadþ* [03] 10Jan89 : tw : create the step address data item in the abs fileþ* for the virtuaÿûl debugger.þ* replace numbers, including labels, with mnemonics.þ* [04] 28Feb89 : es : Fix a corruptÿûed variable nameþ* [05] 28Feb89 : es : - Introduce '#command'þ* - Change the meaning of 'm' type, toÿû be aþ* segment/disp absolute address. Before was theþ* same as ''. Wÿûas unused (!?)þ* - Trap relative calls across segmentsþ* - Assumed that byte.swaÿûp also means the upper tallyþ* of an address comes first (Intel way). Thisþ* ÿû has nothing to do with the DATA representationþ* which remains the PICK way.þ* ÿû - Change the LOCK mechanismþ* [06] 12Jul89 : es : Change for development...þ* (:create.abs -> create-abs)þ* [07] 26Octÿû89 : es : Byte swap (d) and (f) relocation. Controlledþ* by 'df.swap' flagþ* [08] 18Dec89 : es : Addÿûed 6386 codeþ* xmode address swap controlled by 'xm.swap'þ* flag.þ* [09] 20Feb90ÿû : es : Chg code.expected from 9 to 10 (single stepping)þ* [10] 25Feb90 : es : Rebuilt for rios. Introduced fratio. þ* ÿû New LOCATE.þ* Force alignment (malign) on modesþ* [11] 01May90 : es : Create itemÿû '000' for Virtual Mloadþ* [12] 28May90 : es : Added a fix from 32100 loaderþ* [13] 12Jul90 : jw : Add timedate stamp toÿû abs item from mloadþ* [14] 12Jul90 : jw : Add character check for verb typeþ* - Add input interface tÿûo logoff on null inputþ* - Check for (filenameþ* [15] 24Aug90 : jw : Allow pathing for abs filename inÿûputþ* [16] 29Aug90 : jw : Allow abs data size to be sent to user-exit forþ* - proper checksum calculatÿûionþ* [17] 08Sep90 : jw : Mode-name displayþ* [18] 14Sep90 : jw : Calculate fratio from source system frame sizeþ* ÿû - used src.frm.siz to store source frame sizeþ* - changed dsize to dst.frm.siz for logicaÿûl namingþ* [19] 01Oct90 : jw : Allow the DBSYM file to be optionalþ* [20] 04Jan91 : es : Do flush (a at the end of mloadÿûþ* [21] 19Feb91 : pc : Remove flush (a at the end of mload per ecþ* [22] 28Jan92 : jw : Save reasons for mode change andÿû mloadþ* [23] 06Feb92 : jw : Add version stamp for EXEC checksþ* [24] 06Feb92 : jw : Add revision identifierþ* [25] 31Deÿûc92 : es : Added HP9000þ* [26] 02May93 : es : Added SINIX (MSNX)þ* [27] 11May93 : bh : Added Patch checkingþ* [28] 11Julÿû93 : es : Added DRS6000þ* [29] 22Jul93 : es : Changed DRS6000 to SVSþ* [30] 31Jul93 : es : Changed MSNX to 2Kþ* [31] 02Nÿûov93 : bh : Installing an extisting patch is not an errorþ* [32] 02Dec93 : es : Changed 6386 to 2Kþ* [33] 03Dec93 : es :ÿû Correct [32] for 6.1.0 ONLYþ* [34] 06May94 : es : Make 'pro' a synonym of 6386þ* [35] 11Mar94 : bh : Remove mload warniÿûng (JW ok'd)þ* [36] 11Jul94 : bh : Make case insensitiveþ* [37] 17Aug94 : rr : Add citrix support to use 6386 assemblerþÿû* [38] 12Feb96 : tw : Add DG/Intel support to use 6386 assemblerþ* [39] 01Nov96 : rr : Recognize "dgux" as DG/Intelþ* [4ÿû0] 14Nov96 : rr : Recognize R83 'who' outputþ* [41] 18Apr97 : bh : Check for write-protected abs [20208]þ* [42] 12May97 ÿû: rr : Do [41] only for boot absþ* [43] 27May97 : rr : Do not do [41] for mverifyþ* [44] 29Jul97 : rr : Add b-option to ÿûbypass u59 checkþ* [45] 27Apr98 : jl : SUN==SVSþ* [46] 22Jan02 : rr : RS 8.0 ==> 4k frame sizeþ* Enhÿûance to support alternate absþ* [47] 16Jun03 : tr : Support 4k frames on 7.4 and othersþ*þ*þ* Copyright 1987 PICK Systemÿûs, as an unpublished work.þ* All rights reserved. This work is the property of, andþ* embodies trade secrets and confideÿûntial informationþ* proprietary to PICK Systems. It may not be reproduced,þ* copied, used, disclosed, tranferred, adapteÿûd or modifiedþ* without the express written approval of PICK Systems.þ*þ*þcasing off;* [36]þ*þEQUATE am TO char(254), vmÿû TO char(253), svm TO char(252)þEQUATE mode.min.size TO 2, TRUE TO 1, FALSE TO 0þEQUATE date.imp TO xx ;* xx : scraÿûtch varþ*þ* attribute definitionsþ*þ* obj,log modesþobj.date=1 ;obj.size=2 ;obj.errs=3þ* abs dict 'lock'þlock.msg=1 ÿû;port=2 ;* lockþ* abs dict 'mode'þimp=1 ;code=2 ;assembly=3 ;char=4 ;ver=5 ;* modeþ* abs data ÿû modesþDIM abs.mode(14), abs.ref.by.mode(10), abs.ref.to.mode(10);*[13]þtype=1 ;fid=2 ;disp=3 ;length=4 ;ref.by=5 ;ref.ÿûto=6 ;ref.to.addr=7þinst.inc.dsp=8 ;code.expected=10; mload.date=11 ;* [09]þlast.patch=12; patch.act=13; patch.desc=14; ÿû* [27]þ* abs data fidsþmodes=2 ;disps=3 ;lengths=4 ;chksum=5þ* step addr dataþinc.dsp=1 ;partial.code=2 ;src.lines=3þÿûþ* user exitsþu.mld = "u3E"þþDIM options(26)þmat options = 0þEQUATE b.option TO options(2);* [44] Skip u59 checkþEQUATEÿû display.frm.option TO options(04) ;* display frame rec dataþEQUATE err.only.option TO options(05) ;* print errors onlyþÿûEQUATE frm.load.option TO options(06) ;* process all modes in frameþEQUATE save.desc TO options(8);* [22] save reason foÿûr changesþEQUATE k.option TO options(11) ;* kill jobþEQUATE mload.flg TO options(12) ;* loadþEQUATE monitor.flg TO optioÿûns(13) ;* monitorþEQUATE o.option TO options(15) ;* override log-file testþEQUATE p.option TO options(16) ;* to printerþÿûEQUATE total.load.option TO options(20) ;* total-loadþEQUATE unload.option TO options(21) ;* unloadþEQUATE mverify.flg TÿûO options(22) ;* verifyþEQUATE warning.flg TO options(23) ;* [05] suppress warningþerrmsg = "can't do it"þbuff = trim(OCÿûONV("","u3"))þprompt ""þþuser = FIELD(OCONV('','U50BB'),' ',2+system(29)) ;*[13] [40]þuserdate = user:' ':TRIM(TIMEDATE(ÿû)) ;*[13]þreboot = 0;* default is no rebootþþobj.file.name = field(buff," ",2)þOPEN "dict","md" TO mdict ELSE STOP 201,"ÿûmdict???"þREAD nsm.rec FROM mdict,obj.file.name ELSE nullþOPEN obj.file.name TO nsm ELSE STOP 201,obj.file.nameþOPEN "diÿûct",obj.file.name TO dnsmþREAD obj.dict.mode FROM dnsm,"mode" THENþ obj.imp = obj.dict.modeþ IF obj.dict.mode = "monitor" THEN monitor.flg = 1þend else stop "'MODE' item missing from dict of file '":obj.file.name:"'"þOPEN obj.fÿûile.name:',log' TO logfile ELSEþ o.option = 1 ;* override logfile checkþendþ* [47] get frame size from the monitor syÿûmbol file else use oursþid.data.size = dtx(system(32))þREAD obj.dict.files FROM dnsm,"files" THENþ monitor.symbol.file ÿû= obj.dict.files<7>þ OPEN monitor.symbol.file TO msf THENþ READV id.data.size FROM msf,'fdsize',2 ELSEþ stop "'ÿûfdsize' item not found in '":monitor.symbol.file:"'"þ ENDþ ENDþENDþþIF SYSTEM(10) ELSE CRT "to abs file (" :þINPUT aÿûbs.nameþabs.name = TRIM(abs.name);*[14]þIF abs.name[1,1] = '(' THEN abs.name = FIELD(abs.name,'(',2);*[14]þIF abs.name =ÿû '' THEN STOP ;*[14]þþOPEN "dict",abs.name TO abs.dict ELSE STOP 201,"dict":abs.nameþIF monitor.flg ELSEþ*[15][22]þ IF ÿûabs.name[LEN(abs.name),1]=',' THENþ DNAME = abs.name:'DBSYM'þ CNAME = abs.name:'CHANGES'þ END ELSEþ DNAME = abÿûs.name:',DBSYM'þ CNAME = abs.name:',CHANGES'þ ENDþ*þ OPEN dname TO abs.dbsym.file THEN DBSYM = TRUE ELSE DBSYM = FAÿûLSE;*[19]þendþREAD abs.dict.mode FROM abs.dict,"mode" THENþ IF abs.dict.mode # obj.imp THENþ PRINT "Using '":obÿûj.imp:"' source and '":abs.dict.mode:"' abs."þ STOPþ endþ isize = abs.dict.modeþend ELSE stop "Item ÿû'MODE' missing from dict of abs file '" :abs.name: "'"þOPEN abs.name TO abs.data ELSE STOP 201,abs.nameþmy.port = systÿûem(22) ;* this line numberþREADU abs.dict.lock FROM abs.dict,"lock" LOCKEDþ READ abs.dict.lock FROM abs.dict,"lockÿû" ELSE STOP 'Internal lock error'þ CRT "file locked by line ":abs.dict.lockþ STOPþENDþWRITEU "locked":am:my.portÿû ON abs.dict,"lock"þttime = time();fatal = 0;use.new.fid.flg = 0þ* [05] new initsþsetdisp='';segname='';segnum=0;segbaseÿû=0;mbase=0þsegtbl=''þer.cnt=0;wn.cnt=0þ*þerr.string = ""þobj.itm.lst = field(buff," ",3)þbuf.cnt = 4;itm.cnt = 1þLOOPþ ÿûobj.itm.id = field(buff,' ',buf.cnt)þUNTIL obj.itm.id = "" DOþ obj.itm.lst = obj.itm.lst :am: obj.itm.idþ itm.cnt = itÿûm.cnt + 1;buf.cnt = buf.cnt + 1þREPEATþþverb = field(buff," ",1) ;* the calling verb ("l", "v", &c.)þIF verb[1,2] = "mÿûm" THEN monitor.flg = 1;verb = verb[2,99]þBEGIN CASEþ CASE verb[1,5] = "mload" ;mload.flg = 1 ;*[14]þ CASE verb[1,7]ÿû = "mverify" ;mverify.flg = 1 ;*[14]þ CASE verb[1,2] = "ld" ;mload.flg = 1 ;*[14]þ CASE verb[1,2] = "vy" ;mvÿûerify.flg = 1 ;*[14]þEND CASEþ*þIF obj.itm.lst[1,1] = "(" THEN ;* (optionsþ obj.itm.id = obj.itm.lstþ obj.itm.id = OCONV(obj.itm.id[2,99],"u21")þ ll = len(obj.itm.id)þ FOR ii = 1 TO llþ pp = index("abcdefghijklmnoÿûpqrstuvwxyz",obj.itm.id[ii,1],1)þ IF pp THEN options(pp) = 1þ NEXT iiþ obj.itm.lst = delete(obj.itm.lst,itm.cnt);itÿûm.cnt = itm.cnt - 1þendþ*þ* Check for abs protection [41] [44]þ* ----------------------------------þIf mload.flg And Notÿû(b.option) Then;* [43] [44]þ Readv absfid From abs.dict,"%abs%",1 Else absfid = 0;* [42]þ If System(0) = 10 Else absÿûfid = 0;* [42]þ If absfid = 0 Then;* [42]þ * dealing with boot absþ open "dm,abs," to dmabs else stop 201,"dÿûm,abs,"þ read dummy from dmabs, "ux.tcb" thenþ * We have the potential of checking thisþ is.prot = ocÿûonv("0200","u59");* returns non-zero if protectedþ if is.prot then stop 320þ endþ End;* [42]þEnd;* [43]þ*þÿû*[22]þIF save.desc THENþ OPEN cname TO abs.change.fv THENþ chg.desc = TRUEþ OPEN 'scontrol' TO scontrol.fv else cÿûhg.desc = FALSEþ OPEN 'snews' TO snews.fv else chg.desc = FALSEþ END ELSE chg.desc = FALSEþEND ELSE chg.desc = FALSEÿûþ*þIF abs.dict.mode<4> = 'errors' AND mload.flg THENþ IF total.load.option ELSEþ PRINT CHAR(7)þ PRINT 'The last VÿûERIFY-SYSTEM detected errors within the ABS code.'þ PRINT 'Re-verify the ABS using the VERIFY-SYSTEM verb before'þ ÿû PRINT 'attempting to MLOAD your modes. If VERIFY-SYSTEM still'þ PRINT 'detects errors then either reload the abs obÿûject code,'þ PRINT 're-restore the abs data file, or both.'þ STOPþ ENDþENDþcreate.abs = total.load.optionþIF totaÿûl.load.option THENþ IF monitor.flg THENþ gl.load.list = "get-list dict ":abs.name:" list"þ end ELSEþ CRT "Enter ÿûload list item-id (return to exit):":þ INPUT abs.load.listþ IF abs.load.list='' THEN stop;*[14]þ gl.load.list =ÿû "get-list dict ":obj.file.name:" ":abs.load.list:".":obj.imp<1>þ endþendþCRT 'AP GM Loader'þLOOPþ total.load = total.ÿûload.optionþ second.chance = 0þ rfto = "t":am ;* code for load of refto (in wkspce)þ rfby = "b":am ;* code for loÿûad of refby (in abs)þ load = "l":am ;* code for load (from image to abs)þ imge = "i":am ;* code for generation of ÿûimage (in wkspce)þ u.mld.open.abs.and.obj.files = "o":am:abs.name:am:obj.file.nameþ abs.base = OCONV(u.mld.open.abs.anÿûd.obj.files,u.mld)þ IF abs.base = "x" THEN errmsg = "open failed";GO fatal.errþ abs.end.fid = abs.base<3>;abs.max.fid ÿû= abs.base<2>;abs.base = abs.base<1>þ abs.end.fid = abs.end.fid 'r%%%%'þ BEGIN CASEþ CASE mverify.flg ;* verifyþ ÿû IF abs.end.fid = 1 THENþ IF monitor.flg ELSE errmsg = "abs empty";GO fatal.errþ endþ* [05] Reload segmeÿûnt tableþ IF monitor.flg THENþ READ segtbl FROM abs.dict,'%segment%' ELSEþ STOP 202,'%segment'þ ÿû ENDþ ENDþ CASE mload.flgþ IF abs.end.fid = 1 THENþ total.load = 1þ endþ IF create.abs ÿûTHENþ u.mld.pcb.abs.base = "e"þ IF abs.base = OCONV(u.mld.pcb.abs.base,u.mld) THENþ errmsg = "no ÿûtotal load of executing abs";GO fatal.errþ endþ xx = "create-abs ":abs.name:" (z":isizeþ CRT xx;TCLÿû xxþ rfto = rfby;imge = "it":am;load = "" ;* total.load exitsþ second.chance = 1þ create.abs = 0þÿû total.load = 1þ endþ end CASEþWHILE second.chance DO REPEATþCRT abs.base, abs.end.fid, abs.max.fidþIF totaÿûl.load THENþ date.imp = OCONV(date(),"d"):am:obj.imp<2>:am:obj.imp<1>þ if obj.dict.mode<5> = '' else date.imp<4> = objÿû.dict.mode<5>;*[23]þ if obj.dict.mode<6> = '' else date.imp<5> = obj.dict.mode<6>;*[23]þ date.imp<6> = xtd(id.data.sizÿûe)þ IF monitor.flg ELSE WRITE date.imp ON abs.data,'000' ;* [11]þ u.mld.stamp.abs = 's':am:date.impþ date.imp = OCONVÿû(u.mld.stamp.abs,u.mld)þ if monitor.flg elseþ rev = oconv(obj.dict.mode<6>,'mcu');* [24]þ rev.upd = iconv(abs.namÿûe:am:rev,'u4e');* [24]þ endþendþIF system(11) ELSEþ IF total.load.option THEN CRT gl.load.list;TCL gl.load.listþendþitÿûm.max = system(11)þif system(11) then select nsm to nsmlist;*[18]þsrc.frm.siz = system(32)þif src.frm.siz = 1000 or src.ÿûfrm.siz = 2000 elseþ EXECUTE "WHAT WLS" CAPTURING fsvalue;*[18]þ ATTR = DCOUNT(FSVALUE[1,INDEX(FSVALUE,'FID',1)],AM)+1ÿû;*[18]þ src.frm.siz = FIELD(TRIM(fsvalue),' ',8);*[18]þend þIF itm.max ELSE itm.max = itm.cntþitm.cnt = 1þIF p.oÿûption THENþ PRINTER ONþ heading "load/verify 't' page 'pl'command: ":buff:"'l'"þ PRINT abs.base, abs.endÿû.fid, abs.max.fid ;* on printerþendþabs.end.fid = dtx(abs.end.fid) 'r%%%';abs.based = xtd(abs.base)þcur.fid = abs.end.ÿûfid;cur.desc = "";abs.fid = ""þþ* Implementation-dependent stuff hereþþbyte.swap = 0 ;* default not swappedþworÿûd.swap = 0 ;* [05] upper address firstþdf.swap = 0 ;* [07] d and f relocation not swappedþxm.swap ÿû= 0 ;* [08] xmode address relocation not swappedþsigned.offset = 0 ;* offset are 0 to max.reltvþmax.reltv ÿû= 65534 ;* 64K - 2þfratio = 1 ;* [10] Size of target frm/host frm sizeþmalign = 0 ;* [10] Nÿûo alignment restrictionþIF monitor.flg THEN id.data.size = "10000"þ* [46] Get abs version supporting alternate absþ* [47ÿû] Read the frame size from attribute 6þread abs.info from abs.data,'000' thenþ abs.version = abs.info<5>þ abs.ver = ÿûOconv(abs.version,"g0.2")þend elseþ abs.ver=oconv(3,"u713d")<5>[1,3]þendþIF monitor.flg ELSEþ dst.frm.siz=XTD(id.dataÿû.size) ;* [47]þ fratio = dst.frm.siz/src.frm.siz;*[47]þENDþ*þBEGIN CASEþ CASE obj.imp = "i286"þ xm.swap=1;df.swapÿû=1þ IF monitor.flg THEN byte.swap = 1þ CASE obj.imp = "ap-at" or obj.imp = "ap-dos"þ xm.swap=1;df.swap=1þ byteÿû.swap = 1þ CASE obj.imp = "at-native" or obj.imp = "at-dos"þ xm.swap=1;df.swap=1þ byte.swap = 1þ CASE obj.imp = ÿû"68K"þ byte.swap = 0þ signed.offset = 1þ max.reltv = 32764þ malign = 2; ;* mode alignement on wÿûordsþ STOP "UNSUPPORTED PROCESSOR ":obj.impþ CASE obj.imp = "32100"þ byte.swap = 0þ df.swap = 1 ;ÿû* [07] d and f byte swappedþ signed.offset = 1þ max.reltv = 32764þ CASE obj.imp = "6386" or obj.imp = "pro" or obÿûj.imp = "citrix" or obj.imp = "DGIntel" or obj.imp = "dgux";* [36-39]þ byte.swap = 1;þ max.reltv = xtd('7fffffff')ÿû;þ * [33] Change frame size depending on versionþ * Get major/minor abs version (eg 6.1)þ* abs.ver=oconv(3,"u713ÿûd")<5>[1,3]þ df.swap = 1 ;* d and f are byte swappedþ xm.swap = 1 ;* xmode address are bÿûyte swappedþ signed.offset = 1þ CASE obj.imp = "i386"þ IF monitor.flg THENþ byte.swap = 1;word.swap = 1;id.dÿûata.size = "40000"þ endþ CASE obj.imp = "RS6000" or obj.imp = "RIOS"þ byte.swap = 0þ signed.offset = 1þ maxÿû.reltv = 32764þ malign = 4; ;* mode alignement on wordsþ CASE obj.imp = "HP9000"þ byte.swap = 0þ ÿûsigned.offset = 1þ max.reltv = 32764þ malign = 4; ;* mode alignement on cache lineþ CASE obj.imp = ÿû"MSNX"þ byte.swap = 0þ signed.offset = 1þ max.reltv = 32764þ malign = 4; ;* mode alignement onÿû cache lineþ CASE obj.imp = "88k" or obj.imp = 'm88k' or obj.imp = '88open'þ byte.swap = 0þ signed.offset = 1þ ÿû max.reltv = 32764þ malign = 4; ;* mode alignement on wordsþ CASE obj.imp = "mot"þ byte.swap = 0þ ÿû signed.offset = 1þ max.reltv = 32764þ malign = 4; ;* mode alignement on wordsþ CASE obj.imp = "VAX"ÿû ;* VAX/VMS impþ byte.swap = 1;þ signed.offset = 1þ max.reltv = xtd('7fff');þ df.swap = 1 ÿû;* d and f are byte swappedþ xm.swap = 1 ;* xmode address are byte swappedþ CASE obj.imp = "370"þ byÿûte.swap = 0þ signed.offset = 1þ max.reltv = 'fff'þ malign = 2; ;* mode alignement on wordsþ CASE ÿûobj.imp = "SVS" or obj.imp="SUN" or obj.imp = "solaris" ;* [25] [45]þ byte.swap = 0þ signed.offset = 1þ max.relÿûtv = 32764þ malign = 4; ;* mode alignement on wordsþ CASE 1 ;* ÿû[05]þ STOP "UNSUPPORTED PROCESSOR ":obj.impþEND CASEþ*þ* [05] create the first default segmentþIF monitor.flg THENþ ÿûsegbase=0þ segment='s':am:cur.fid:am:segbase'r%6':am:id.data.sizeþ IF mload.flg THENþ WRITE segment ON abs.data,'seÿûgment0'þ segtbl=cur.fid:vm:segbaseþ ENDþENDþ* [10] If more than one frame in the target, skip someþIF fratio>1 and tÿûotal.load thenþ for ii=1 to fratio-1þ cur.fid = OCONV('u',u.mld) 'r%%%' þ IF cur.fid = '000' THEN errmsg = 'abs fÿûull';GO fatal.errþ next iiþENDþ*þprocess.next.item :þþLOOPþ IF obj.itm.lst = "" THENþ READNEXT cur.obj.id FROM nsmÿûlist ELSE cur.obj.id = "" ;* from select-list;* [18]þ end ELSEþ cur.obj.id = obj.itm.lst ;* or tÿûcl item-listþ endþUNTIL cur.obj.id = "" DOþþ main :þþ patch = ""; * [27]þ IF k.option THEN GO program.end ;* writÿûe errors, unlock fileþ IF err.only.option ELSEþ PRINT itm.cnt 'r####' :" of ": itm.max : ": " : cur.obj.id 'l#20' :;ÿû*[17]þ endþ IF cur.obj.id = '*' THENþ* [05] þ use.new.fid.flg = 1þ GO next.itemþ ENDþ*þ* [05] Test for loader cÿûommandsþ IF cur.obj.id[1,1]='#' THENþ mline=cur.obj.id[2,999] ;* remove the pound signþ mcommand=FIELD(mlinÿûe,' ',1) ;* get command (possibly space)þ mline=TRIM(mline) ;* remove all spacessþ mparam1=FIELD(mliÿûne,' ',2)þ dst.frm.siz=XTD(id.data.size);* [18]þ BEGIN CASEþ CASE mcommand=''þ* Empty. Was a space. Ignore itÿûþ CASE (mcommand='setdisp' OR mcommand='align' ) AND mload.flgþ e.expr=mparam1;gosub evaluateþ IF e.eÿûrror#'' THENþ errmsg = "Illegal syntax";GO fatal.errþ ENDþ* Get the abs record of curfidþ READ abÿûs.fid FROM abs.data,cur.fid ELSE þ errmsg = "abs rec '":cur.fid:"' missing";GO fatal.errþ ENDþ mpÿûaram1=e.resultþ LOCATE("free",abs.fid,modes;pos) THENþ avail = xtd(abs.fid)þ mfirsÿût= XTD(abs.fid)þ END ELSEþ* No 'free'?? Is it full or new?þ IF abs.fid = '' THENþ ÿû abs.fid="f":am:"free":am:amþ abs.fid=abs.fid:id.data.sizeþ END ELSEþ errmsg = "Segmeÿûnt full";GO fatal.errþ ENDþ avail=dst.frm.siz;* [18]þ mfirst=0þ ENDþ ii=dst.frmÿû.siz - avail - mfirst ;* disp in segment;*[18]þ IF mcommand='align' THENþ* turn alignement into a displacemÿûentþ mparam1 = mparam1 * (1+INT(ii/mparam1));* new dispþ ENDþ size=mparam1-ii ;* ÿûsize of pseudo modeþ sizex=DTX(size)þ BEGIN CASEþ CASE size < 0þ errmsg = "Cannot moveÿû backward";GO fatal.errþ CASE mparam1 >= dst.frm.siz;* [18]þ errmsg = "Cannot move out of segment";GÿûO fatal.errþ CASE 1þ* OK. Change displacementþ abs.fid = sizex 'r%%%%' ;*[10]þ ÿû abs.fid = 'skip' ;* change the modeþ pos1 = pos + 1þ abs.fid = insert(abs.fid,modesÿû,pos1;"free")þ ii= dtx(size+xtd(abs.fid))'r%4' ;* [10]þ abs.fid = insert(abs.fid,disps,ÿûpos1;ii) ;* [10]þ abs.fid = insert(abs.fid,lengths,pos1;dtx(avail-size)'r%4') ;*[10]þ WRITE absÿû.fid ON abs.data,cur.fidþ END CASEþ CASE mcommand='option'þ mparam1 = OCONV(mparam1,"u21")þ llÿû = len(mparam1)þ FOR ii = 1 TO llþ pp = index("abcdefghijk.mnopqrstu.wxyz",mparam1[ii,1],1)þ IFÿû pp THEN options(pp) = 1þ NEXT iiþ CASE mcommand='xoption'þ mparam1 = OCONV(mparam1,"u21")þ llÿû = len(mparam1)þ FOR ii = 1 TO llþ pp = index("abcdefghijk.mnopqrs...wxyz",mparam1[ii,1],1)þ IFÿû pp THEN options(pp) = 0þ NEXT iiþ CASE (mcommand='segment') AND mload.flgþ* get the segment name (1st) and ÿûaddress (2nd)þ segname=field(mline, ' ', 3)þ segnum=segnum+1þ IF segname='' THEN segname='segment':ÿûsegnum ;* defaultþ called=0;MAT abs.mode=''þ MATREAD abs.mode FROM abs.data,segname THENþ* Already exist ?ÿû?þ IF abs.mode(type)='u' THENþ* ok. was simply referencedþ called=1þ END ELSEþ IÿûF mload.flg THENþ errmsg = "Duplicate segment name";GO fatal.errþ ENDþ ENDþ ENDþÿû* get the segment addressþ e.expr=mparam1;gosub evaluateþ IF e.error#'' THENþ errmsg = "Illegal sÿûyntax";GO fatal.errþ ENDþ mparam1=e.resultþ segbase=mparam1þ GOSUB set.segmentþ IF caÿûlled THENþ* Has been called already. Solve referencesþ xid = segnameþ GOSUB upd.abs.fid.of.ref.by.modeÿûþ ENDþ CASE mcommand='segsize'þ* Test validityþ IF NOT(monitor.flg) THENþ errmsg = "Illegal ÿûduring Virtual load";GO fatal.errþ END ELSEþ e.expr=mparam1;gosub evaluateþ IF e.error#'' THENþÿû errmsg = "Illegal syntax";GO fatal.errþ ENDþ id.data.size=DTX(e.result)þ ENDþ ÿûCASE mcommand='fidsize'þ* Test validityþ IF monitor.flg THENþ errmsg = "Illegal during Monitor load";GO ÿûfatal.errþ END ELSEþ e.expr=mparam1;gosub evaluateþ IF e.error#'' THENþ errmsg = "Ilÿûlegal syntax";GO fatal.errþ ENDþ id.data.size=DTX(e.result)þ ENDþ CASE mcommand='base'þ ÿû e.expr=mparam1;gosub evaluateþ IF mparam1='' OR NOT(NUM(mparam1)) THENþ errmsg = "Illegal syntax";GÿûO fatal.errþ ENDþ mbase=e.resultþ CASE mcommand='delete'þ IF mload.flg ELSE GOTO next.itemþ* Dÿûelete a symbol (cannot delete F nor S)þ READ dummy FROM abs.data,mparam1 THENþ* Control the typeþ dummy=ÿûdummy<1>þ IF dummy='S' OR dummy='F' OR dummy='U' THENþ errmsg = mparam1:" does no exist."þ ÿû GOSUB print.errmsgþ END ELSEþ DELETE abs.data,mparam1þ ENDþ END ELSEþ* does not exÿûist ??þ errmsg = mparam1:" does no exist."þ GOSUB print.errmsgþ ENDþ CASE (mcommand='definÿûe' or mcommand='set') AND mload.flgþ IF mload.flg ELSE GOTO next.itemþ* Create a symbol (cannot create F nor S)þ ÿû def.id =FIELD(mparam1,',',1)þ def.type=FIELD(mparam1,',',2)þ def.mode=FIELD(mparam1,',',3)þ ÿû def.disp=FIELD(mparam1,',',4)þ def.size=FIELD(mparam1,',',5)þ IF def.mode='*' THEN def.mode="x'":cur.fid:ÿû"'"þ e.expr=def.mode;gosub evaluateþ IF e.error#'' THENþ errmsg = "Illegal syntax";GO fatal.errþ ÿû ENDþ def.mode=DTX(e.result)'R%%%'þ IF def.disp='*' THENþ* Get the abs record of curfidþ REÿûAD abs.fid FROM abs.data,def.mode ELSE þ errmsg = "abs rec '":def.mode"' missing";GO fatal.errþ ENDþÿû LOCATE("free",abs.fid,modes;pos) THENþ mfirst= XTD(abs.fid)þ END ELSEþ* No 'freÿûe'?? Is it full or new?þ IF abs.fid = '' THENþ mfirst=0þ END ELSEþ ÿû errmsg = "Segment full";GO fatal.errþ ENDþ ENDþ def.disp=mfirstþ ENDþ IF deÿûf.id='' OR def.type='' OR def.disp="" OR INDEX("DES",def.type,1)=0 THENþ errmsg = "Illegal syntax for a define"ÿûþ GOSUB print.errmsgþ ENDþ e.expr=def.disp;gosub evaluateþ IF e.error#'' THENþ erÿûrmsg = "Illegal syntax";GO fatal.errþ ENDþ IF def.type = 'S' THENþ def.disp=DTX(e.result)þ ÿû END ELSEþ def.disp=DTX(e.result)'R%%%%'þ ENDþ called=0þ mat abs.mode=''þ READ abs.ÿûmode FROM abs.data,def.id THENþ* Already exist ??þ IF abs.mode(type)='u' THENþ* ok. was simply referencedþ ÿû called=1þ END ELSEþ* the item exists. Test if redefine (set)þ IF mcommand#'set' THENþ ÿû errmsg = def.id:" already exist."þ GOSUB print.errmsgþ GOTO next.itemþ ENDþ ÿû ENDþ ENDþ abs.mode(type)=def.typeþ abs.mode(fid)=def.modeþ abs.mode(disp)=def.disp'rÿû%4' ;*[10]þ IF def.type='S' THENþ* Add the segment to the tableþ segtbl=segtbl:am:def.mode:vm:def.dispþ ÿû e.expr=def.size;gosub evaluateþ IF e.error#'' THENþ errmsg = "Illegal syntax";GO fatal.errþÿû ENDþ abs.mode(length)=DTX(e.result) 'r%4' ;* [10]þ ENDþ MATWRITE abs.mode ON abs.data,dÿûef.idþ IF called THENþ* Has been called already. Solve referencesþ xid = def.idþ GOSUB upd.abs.ÿûfid.of.ref.by.modeþ ENDþ CASE mcommand='missing'þ PRINTþ mcommand='sort ':abs.name:' with a1 =ÿû "u" id ref_by heading "Undefined Symbols ':"'ll'":'" id-supp tcl-supp 'þ IF p.option THEN mcommand=mcommand:" (pÿû"þ EXECUTE mcommandþ CASE 1þ* Illegal command. Abort MLOAD.þ END CASEþ GOTO next.itemþ ENDþ*þ* [05] eÿûliminate spaces, and get the first wordþ cur.obj.id=FIELD(TRIM(cur.obj.id),' ',1)þ MATREAD abs.mode FROM abs.data,cur.ÿûobj.id ELSEþ mat abs.mode = '';abs.mode(type) = 'u'þ ENDþ IF abs.mode(type) = 'd' THENþ READ abs.fid FROM abs.daÿûta,abs.mode(fid) ELSEþ errmsg = "abs rec???";GO fatal.errþ endþ END ELSEþ GOSUB rd.abs.fidþ ENDþ IF o.optiÿûon ELSEþ READ lrec FROM logfile,cur.obj.id ELSEþ errmsg = "not in logfile" ;GO skip.cur.itmþ ENDþ IF lrec<ÿûobj.errs>#"no errs" THENþ errmsg = "assembly errors" ;GO skip.cur.itmþ endþ endþ 120þ BEGIN CASEþ CASE frmÿû.load.optionþ PRINT " in frame " : abs.mode(fid) :þ modes.in.fid = abs.fidþ no.of.modes.in.abs.fidÿû = dcount(modes.in.fid,vm)þ frm.load.option = 0þ FOR mode.cnt.of.abs.fid = 1 TO no.of.modes.in.abs.fidþ ÿû PRINTþ cur.obj.id = modes.in.fid<1,mode.cnt.of.abs.fid>þ IF cur.obj.id = "free" THENþ PRINT " ÿûfree":þ end ELSEþ PRINT " " : cur.obj.id 'l#20' :þ MATREAD abs.mode FROM abs.data,cur.obj.id ÿûTHENþ GOSUB 120þ end ELSE errmsg = "mode rec missing";GOSUB print.errmsgþ endþ NEXT modeÿû.cnt.of.abs.fidþ frm.load.option = 1þ RETURNþ CASE unload.optionþ GOSUB unload.modeþ abs.mode(fidÿû) = "4";abs.mode(disp) = "0000" ;* ???þ GOSUB upd.abs.fid.of.ref.by.modeþ WRITE abs.fid ON abs.data,abs.mode(fÿûid) ;* write frame recþ delete abs.data,cur.obj.id ;* delete mode recþ PRINT cur.obj.id:" deletedÿû" :þ CASE mload.flgþ GOSUB get.obj.modeþ IF err.flg THEN GO next.itemþ IF abs.mode(type) = "d" THENþ ÿû GOSUB unload.modeþ WRITE abs.fid ON abs.data,abs.mode(fid) ;* with mode unloadedþ use.new.fid.flg = ÿû0 ;* reload ignores force-new-frameþ end ELSEþ abs.mode(fid) = cur.fidþ endþ IF use.new.fid.ÿûflg THENþ GOSUB upd.free.rd.abs.fid ;abs.mode(fid) = cur.fidþ endþ LOOPþ LOCATE("free",abs.fid,mÿûodes;pos) THENþ avail = xtd(abs.fid)þ end ELSEþ avail = 0þ endþ WHILE ÿûsize > avail DOþ GOSUB upd.free.rd.abs.fid;abs.mode(fid) = cur.fidþ REPEATþ abs.mode(disp) = abs.fid'r%4' ;*[10]þ abs.mode(type) = 'd'þ abs.mode(length) = sizex'r%4' ;* [10] mode sizeþ u.mld.cv.ÿûobj.to.buf = imge:abs.mode(fid):am:abs.mode(disp)þ IF OCONV(u.mld.cv.obj.to.buf,u.mld) = "x" THEN þ errmsg =ÿû "err in object code";GO skip.cur.itmþ endþ GOSUB upd.abs.mode ;* do load and external referencesþ IF lÿûoad # '' THEN ;* if not loading in place ?? [02]þ u.mld.copy.buf.to.abs = load:abs.mode(fid):am:abs.mode(disp)þ ÿû IF OCONV(u.mld.copy.buf.to.abs,u.mld)="x" THENþ errmsg = "err in object code";GO skip.cur.itmþ enÿûdþ endþ IF err.only.option ELSEþ IF monitor.flg THENþ PRINT dtx(segbase + XTD(abs.mode(disp)))ÿû'r%6':þ END ELSEþ PRINT dtx(abs.based+xtd(abs.mode(fid))) :þ PRINT "." : abs.mode(disp) 'r%4':þÿû ENDþ ENDþ xid = cur.obj.idþ GOSUB upd.abs.fid.of.ref.by.mode ;* write addr in ref-by'sþ abs.ÿûfid = cur.obj.id ;* change the modeþ IF avail > size THEN ;* then some free space left overÿûþ abs.fid = sizex'r%4' ;*[10]þ pos1 = pos + 1þ abs.fid = insert(abs.fid,modes,pos1;"frÿûee")þ ii = dtx(size+xtd(abs.fid))'r%4' ;*[10]þ abs.fid =insert(abs.fid,disps,pos1;ii) ;*[10]þ ÿû abs.fid=insert(abs.fid,lengths,pos1;dtx(avail-size)'r%4') ;*[10]þ endþ* [02] test mload type. Checksums are dÿûifferent for virtualþ* and for monitor...þ IF monitor.flg then ;* [02]þ* doing moniÿûtor mload ;* [02]þ u.mld.checksum = 'c':am:abs.mode(fid):am:0þ abs.fid=OCONÿûV(u.mld.checksum,u.mld) ;* chksum (pc)þ end else ;* [02]þ* doing virtual mloaÿûd ;* [02]þ u.mld.checksum = abs.base:am:abs.mode(fid):am:id.data.size;*[16]þ abs.fiÿûd=OCONV(u.mld.checksum,"u617d") ;* [02] [16]þ end ;* [02]þ* [03ÿû]þ IF monitor.flg ELSEþ IF DBSYM THEN;*[19]þ WRITE step.addr.data ON abs.dbsym.file,cur.ÿûobj.idþ ENDþ abs.mode(inst.inc.dsp)=step.addr.dataþ abs.mode(code.expected)=step.addr.dataÿûþ ENDþ IF total.load.option ELSEþ abs.mode(mload.date) = userdate;* [13]þ IF len(pÿûatch) THENþ * Add Patch action items and descriptions [27]þ abs.mode(patch.act) = ""þ abs.modÿûe(patch.desc) = ""þ abs.mode(last.patch) = patchnumþ LOOPþ xxx = field(patch<1,1>," ",1)þ ÿû if len(xxx) = 0 then exitþ abs.mode(patch.act)<1,-1> = xxxþ xxx = patch<1,1>[index(pÿûatch<1,1>," ",1)+1,999]þ abs.mode(patch.desc)<1,-1> = xxxþ patch = DELETE(patch,1,1)þ RÿûEPEATþ ENDþ ENDþ MATWRITE abs.mode ON abs.data,cur.obj.id ;* new modeþ WRITE abs.fid ON abs.datÿûa,abs.mode(fid)þ IF total.load.option elseþ IF save.desc AND chg.desc THENþ CALL mload.desc(cur.objÿû.id, abs.change.fv, snews.fv, scontrol.fv)þ ENDþ ENDþ IF epno THENþ mfid = abs.mode(fid);mdisp =ÿû xtd(abs.mode(disp))þ FOR xx = 1 TO epnoþ name = eps ;*k* a ref to this mode nameþ MATRÿûEAD abs.mode FROM abs.data,name ELSE mat abs.mode = ""þ abs.mode(type) = "e"þ abs.mode(fid) = mfidþ ÿû abs.mode(disp) = dtx(mdisp+xtd(eps))'r%4';*[10]þ abs.mode(length) = cur.obj.id'r%4' ;*ÿû[10]þ MATWRITE abs.mode ON abs.data,nameþ IF abs.mode(ref.by) # "" THENþ xid = nameþ ÿû GOSUB upd.abs.fid.of.ref.by.modeþ endþ NEXT xxþ endþ CASE mverify.flgþ* [01] accept both 'dÿû' and 'e' typeþ IF abs.mode(type) # "d" AND abs.mode(type) # 'e' THENþ errmsg = " not loaded";GO skip.cur.itÿûmþ endþ* test presence only if a 'd' type ;* [01]þ IF abs.mode(type) = 'd' THENþ LOCATE(cÿûur.obj.id,abs.fid,modes;pos) ELSEþ errmsg = " not in mode" ;GO skip.cur.itmþ endþ endþ GOSUB gÿûet.obj.modeþ IF err.flg THEN GO next.itemþ IF OCONV(imge,u.mld) = "x" THENþ errmsg = "err in image";GO ÿûskip.cur.itmþ endþ GOSUB upd.abs.mode ;* generate refto'sþ u.mld.verify.abs = "v":am:abs.mode(fid):am:aÿûbs.mode(disp)þ xx = OCONV(u.mld.verify.abs,u.mld) ;*k*þ IF xx = "x" THEN errmsg = "err in verify" ;GO skip.cÿûur.itmþ yy = dcount(xx,am) - 1þ IF err.only.option THENþ IF yy THEN PRINT " ":cur.obj.id:" has ":yy:" ÿûerrs"þ end ELSEþ IF monitor.flg THEN ;* [05]þ PRINT dtx(segbase + XTD(abs.modeÿû(disp)))'r%6':þ END ELSEþ PRINT dtx(abs.based+xtd(abs.mode(fid))) :þ PRINT "." : abs.mode(disp)ÿû 'r%4':þ ENDþ PRINT ' ': yy : " errs" :þ IF yy THENþ PRINTþ FOR jj = 1 TO yyþ ÿû PRINT xx :" ":þ IF rem(jj,6) ELSE PRINTþ NEXT jjþ endþ endþ IF yy THENÿû err.string = err.string :am: cur.obj.idþ CASE 1;errmsg = "unknown option";GO fatal.errþ end CASEþ IF display.frm.oÿûption THENþ PRINTþ dd = dcount(abs.fid,vm)þ FOR xx = 1 TO ddþ line = " mode: " : abs.fid 'l#20'þ line = line :"start:": abs.fid 'r####' :" size:": abs.fid 'r#4'þ PRINT ÿûlineþ NEXT xxþ endþ next.item:þ IF err.only.option ELSE PRINTþ itm.cnt = itm.cnt + 1þREPEATþþprogram.end :þþdeleÿûte abs.dict,"lock";* free the loaderþIF err.string = "" THEN err.string = am: "no errs"þerr.string = timedate():err.striÿûngþBEGIN CASEþ CASE mverify.flgþ PRINT "Verify done ":þ WRITE err.string ON abs.dict,"verrs"þ CASE total.load.opÿûtion and mload.flgþ PRINT "Load done ":þ WRITE err.string ON abs.dict,"total.errs"þ* [05] Write the segment table ÿûin dictionaryþ WRITE segtbl ON abs.dict,'%segment%'þ CASE 1þ PRINT "Load done ":þ WRITE err.string ON abs.dictÿû,"errs"þend CASEþIF er.cnt#0 then CRT er.cnt:' error(s)' ;* [05]þIF wn.cnt#0 then CRT wn.cnt:' warning(s)' ÿû ;* [05]þIF fatal THEN PRINT " with fatal err" :þPRINT " run-time: " : OCONV(time()-ttime,'mts')þIF reboot thenþ* pÿûrint "Modes have been loaded which require system reboot."þ* print "Upon return to TCL, shutdown the Pick system and rÿûeboot."þendþIF p.option THEN printer close;printer offþ*þ* [20] Force an ABS flushþIF MLOAD.FLG THENþ STOPþþþ get.obj.ÿûmode :þ err.flg = 0þ u.mld.get.ext.ref = "x":am:cur.obj.id ;* from obj code in obj fileþ ld.info = OCONV(u.mld.get.ÿûext.ref,u.mld) ;* read obj code from obj fileþ IF ld.info = "x" THEN GO obj.code.missingþ IF monitor.flg=0 AND mload.fÿûlg=1 THENþ READ obj.mode from nsm, cur.obj.id ELSE GO obj.code.missingþ IF total.load.option ELSEþ xxx = indeÿûx(obj.mode,"*#patch",1); *[27]þ IF xxx THENþ patch = FIELD(obj.mode[xxx,9999],AM,1)þ patchnum = FIEÿûLD(patch<1,1>," ",2);* Get patch numberþ patch = DELETE(patch,1,1);* Get rid of headingþ READ xxx FROM aÿûbs.data, cur.obj.id THENþ IF xxx > patchnum THENþ * Patch level is higher - don't loadÿûþ printþ print ' Patch already loaded at a higher level'þ RETURN TO next.itÿûemþ ENDþ ENDþ IF patch<1,1> = "reboot" THENþ reboot = 1þ patch = DELETE(paÿûtch,1,1)þ ENDþ ENDþ ENDþ CALL gen.step.addr.data( obj.mode, byte.swap, step.addr.data ) ;* [03]þ ENDÿûþ sizex = ld.info<1>;size = xtd(sizex)þ* [10] Force mode alignmentþ if malign thenþ* The mloader needs alignment. Incrÿûease the size of the modeþ* so that the next mode is alignedþ xx=mod(size,malign)þ if xx then size=size+malign-xx;ÿûsizex=dtx(size)þ endþ ld.info = delete(ld.info,1) ;*k* remove sizeþ IF monitor.flg ELSEþ IF size > xtd(id.datÿûa.size) THENþ errmsg = 'too large: ':size ;GO print.errþ endþ IF size < mode.min.size THENþ errmsg = 'toÿûo small: ':size ;GO print.errþ endþ endþ end.get.obj.mode :þ RETURNþ obj.code.missing :þ errmsg = 'obj code ':cuÿûr.obj.id:' not found'þ print.err :þ GOSUB print.errmsgþ err.flg = 1þ GO end.get.obj.modeþþþ unload.mode :þþ LOCATÿûE(cur.obj.id,abs.fid,modes;pos) ELSEþ errmsg = "locate" ;GO print.errmsgþ endþ IF abs.fid = "free" THEÿûNþ pos1 = pos - 1þ avail = xtd(abs.fid) + xtd(abs.fid)þ abs.fid = delete(abs.fid,modÿûes,pos1) ;* remove free nameþ abs.fid = delete(abs.fid,disps,pos) ;* remove mode's startþ abs.fid = delete(abÿûs.fid,lengths,pos) ;* remove mode's size..þ pos = pos1þ abs.fid = dtx(avail)'r%4' ;* [10] replace wiÿûth combined sizeþ endþ IF abs.fid = "free" THENþ pos1 = pos + 1þ avail = xtd(abs.fid) ÿû+ xtd(abs.fid)þ abs.fid = delete(abs.fid,modes,pos1) ;* remove free nameþ abs.fid = delete(abs.fidÿû,disps,pos1) ;* remove free's startþ abs.fid = delete(abs.fid,lengths,pos) ;* remove mode's sizeþ abs.fid = dtx(avail)'r%4' ;* [10] replace with combined sizeþ endþ abs.fid = "free"þ RETURNþþ upd.free.rdÿû.abs.fid :þþ use.new.fid.flg = 0þ u.mld.upd.nxt.free.abs.fid = 'u'þ* [10] Allocate as many frames as required for tarÿûgetþ for ii=1 to fratioþ cur.fid = OCONV(u.mld.upd.nxt.free.abs.fid,u.mld) 'r%%%' þ IF cur.fid = '000' THEN errmsÿûg = 'abs full';GO fatal.errþ next iiþ*þ rd.abs.fid :þ*þ READ abs.fid FROM abs.data,cur.fid ELSE þ errmsg = "abs rÿûec '":cur.fid:"' missing" ;GO fatal.errþ endþ IF abs.fid = '' THENþ abs.fid="f":am:"free":am:am:id.data.sizeÿûþ ENDþ RETURNþþ upd.abs.mode :þþ abs.mode(ref.to) = "";abs.mode(ref.to.addr) = "";abs.mode(type) = "d"þ eps = "";eÿûpno = 0þ IF mload.flg THENþ IF total.load.option ELSE abs.mode(11) = userdate ;*[13]þ MATWRITE abs.mode ON abs.daÿûta,cur.obj.idþ ENDþ no.of.ext.ref = dcount(ld.info,am)þ FOR ext.ref.cnt = 1 TO no.of.ext.refþ name = ld.infoþ disp.of.ext.ref = ld.infoþ ext.type = ld.infoþ BEGIN CASEþ CASE eÿûxt.type = "i"þ addr = dtx(xtd(abs.mode(disp))+xtd(ld.info)) 'r%%%%'þ IF byte.swap THEN addrÿû = addr[3,2] : addr[1,2]þ* [10] Divide fid ref by fratioþ mld.fill=rfto:dtx(xtd(abs.mode(fid))/fratio):am:abs.modÿûe(disp): am:disp.of.ext.ref:am:addrþ IF OCONV(mld.fill,u.mld) = "x" THEN ;* [10]þ errmsg = " cannot handÿûle ref to ": name;GO print.errmsgþ endþ CASE ext.type = "e"þ IF mload.flg THENþ epno = epno ÿû+ 1;eps = ld.info ;* save ep's to endþ endþ CASE ext.type = "p" ;* long internal refereÿûnceþ addr = dtx(xtd(abs.mode(disp))+xtd(ld.info)) 'r%%%%%%%%'þ IF byte.swap THEN addr = addÿûr[7,2]:addr[5,2]:addr[3,2]:addr[1,2]þ u.mld.fill.ext.ref.in.buf = rfto:abs.mode(fid): am:abs.mode(disp): am:disp.ÿûof.ext.ref:am:addrþ IF OCONV(u.mld.fill.ext.ref.in.buf,u.mld) = "x" THENþ errmsg = " cannot handle ref tÿûo ": name;GO print.errmsgþ endþ CASE 1þ abs.mode(ref.to)<1,-1> = name ;* uses what tableþ ÿû abs.mode(ref.to.addr)<1,-1> = disp.of.ext.ref : ext.typeþ BEGIN CASEþ CASE mload.flgþ IÿûF name = cur.obj.id THENþ MATWRITE abs.mode ON abs.data,cur.obj.idþ ENDþ MATREAD abs.ÿûref.to.mode FROM abs.data,name THENþ LOCATE(cur.obj.id,abs.ref.to.mode(ref.by),1;pos1;'al') ELSEþ ÿû abs.ref.to.mode(ref.by) = insert(abs.ref.to.mode(ref.by),1,pos1;cur.obj.id)þ endþ end ELSEÿûþ mat abs.ref.to.mode = "";abs.ref.to.mode(type) = "u";abs.ref.to.mode(ref.by) = cur.obj.id ;* fwd refþ ÿû endþ MATWRITE abs.ref.to.mode ON abs.data,nameþ CASE mverify.flgþ MATREAD abs.rÿûef.to.mode FROM abs.data,name ELSE þ mat abs.ref.to.mode = "";abs.ref.to.mode(type) = "u"þ endþ ÿû end CASEþ IF abs.ref.to.mode(type) # "u" THENþ addr=dtx(xtd(abs.ref.to.mode(fid))/fratio)'r%%%%' ÿû;* [10]þ addr=abs.ref.to.mode(disp) 'r%%%%':addr ;* [10]þ BEGIN CASEþ CASE ext.tyÿûpe = "d" ;* disp onlyþ* [05] Check cross segment callþ IF (abs.mode(fid) # abs.ref.to.modÿûe(fid)) AND mload.flg AND monitor.flg THENþ errmsg = 'Crossing segment, referencing ':nameþ ÿû GOSUB print.warningþ ENDþ* [07] ++ If fd swap reverse dispþ if df.swap thenþ ÿûtt=addr[3,2]:addr[1,2]þ end elseþ * [25] If hp9000, special codeþ tt = addr[1ÿû,4]þ if obj.imp="hp9000" thenþ * Put the sign bit (0) at the endþ tt=ÿûdtx(xtd(tt)*2)"r%4"þ endþ endþ* ++ [07]þ CASE ext.type = "r" ;*ÿû 16-bit intel relativeþ* [05] Check cross segment callþ IF abs.mode(fid) # abs.ref.to.mode(fid) THENþ ÿû errmsg = 'Crossing segment error, referencing ':nameþ GOSUB print.errmsgþ ENDþ*þ ÿû tt = dtx(xtd(abs.ref.to.mode(disp))- xtd(abs.mode(disp))- xtd(disp.of.ext.ref)-2 ) 'r%%%%'þ IF ÿûbyte.swap THEN tt = tt[3,2] : tt[1,2] ;* [08]þ CASE ext.type = "q" ;*long relativeþ ÿû tt = dtx(xtd(abs.ref.to.mode(disp))- xtd(abs.mode(disp))- xtd(disp.of.ext.ref)-4 ) 'r%%%%%%%%'þ IF bytÿûe.swap THENþ tt = tt[7,2] : tt[5,2] : tt[3,2] : tt[1,2]þ ENDþ CASE ext.type = "m"ÿûþ* [05] Absolute longþ* Find in which segment we want to go toþ segto=abs.ref.to.mode(fid)þ iiÿû=0þ LOOPþ ii=ii+1þ WHILE segtbl#'' AND segtbl#segto DO REPEATþ ÿû IF segtbl='' THENþ errmsg = 'Missing segment. Internal mload error'þ GOSUB prinÿût.errmsgþ END ELSEþ tt=segtbl"R%8"þ IF abs.ref.to.mode(type)='s' THENþ ÿû addr='0000' ;* force 0 disp if segmentþ END ELSEþ IF byte.swap THENþ ÿû addr=addr[3,2]:addr[1,2]þ END ELSEþ addr=addr[1,4]þ ÿû ENDþ ENDþ* Add the displacement of segmentþ addr=DTX(XTD(addr)+XTD(tt[5,4]))"R%4"þ* Exÿûtract the segment (4 digit)þ tt=tt[1,4]þ IF byte.swap THENþ* Put segment in reversed byte ÿûorder after the dispþ tt=addr:tt[3,2]:tt[1,2]þ END ELSEþ* Put segment before in normal oÿûrderþ tt=tt:addrþ ENDþ ENDþ CASE ext.type = "f"þ ttÿû = addr[5,4] ;* fid onlyþ* [07] ++ If df swap reverse dispþ if df.swap thenþ tt=addr[7,2]:ÿûaddr[5,2]þ end elseþ tt = addr[5,4]þ * [25] Special encoding for HPþ ÿû if obj.imp="hp9000" thenþ * Put the sign bit (0) at the endþ tt=dtx(xtd(tt)*2ÿû)"r%4"þ endþ endþ* ++ [07]þ CASE 1þ* Default. disp:fid [08]þ IF xm.sÿûwap THENþ tt=addr[3,2]:addr[1,2]:addr[7,2]:addr[5,2]þ END ELSEþ tt=addrþ ÿû ENDþ END CASEþ u.mld.fill.ext.ref.in.buf = rfto:abs.mode(fid):am:abs.mode(disp): am:disp.of.eÿûxt.ref:am:ttþ IF OCONV(u.mld.fill.ext.ref.in.buf,u.mld) = "x" THENþ errmsg = " cannot handle ref to ÿû": name;GO print.errmsgþ endþ endþ END CASEþ NEXT ext.ref.cntþ RETURNþþ*þ* This routine is called tÿûo solve all the existing referenceþ* made by existing modes to the mode being added.þ* 'abs.mode' is the mode refered toÿû.þ*þ upd.abs.fid.of.ref.by.mode :þþ IF cur.obj.id = "udef" THEN RETURNþ* [10] The fid of the new mode must be dividedÿû by fratioþ addr=abs.mode(disp)'r%%%%' : dtx(xtd(abs.mode(fid))/fratio)'r%%%%'þ ref.by.times = dcount(abs.mode(ref.by)ÿû,vm)þ FOR ref.by.cnt = 1 TO ref.by.timesþ ref.by.mode.name = abs.mode(ref.by)<1,ref.by.cnt>þ MATREAD abs.ref.by.mÿûode FROM abs.data,ref.by.mode.name ELSE errmsg = "no ":ref.by.mode.name;GOSUB print.errmsgþ ref.to.times.in.ref.by.moÿûde = dcount(abs.ref.by.mode(ref.to),vm)þ not.refed = 1þ FOR ref.to.cnt.in.ref.by.mode = 1 TO ref.to.times.in.ref.bÿûy.modeþ ref.to.name.in.ref.by.mode = abs.ref.by.mode(ref.to)<1,ref.to.cnt.in.ref.by.mode>þ IF ref.to.name.in.rÿûef.by.mode = xid THENþ not.refed = 0 ;* at least one refþ disp.of.ext.ref.in.ext.mode = abs.refÿû.by.mode(ref.to.addr)<1,ref.to.cnt.in.ref.by.mode>þ ext.type = disp.of.ext.ref.in.ext.mode[5,1]þ disp.of.eÿûxt.ref.in.ext.mode = disp.of.ext.ref.in.ext.mode[1,4]þ BEGIN CASEþ CASE ext.type = "d" ÿû ;* disp onlyþ* [05] Check cross segment callþ IF (abs.mode(fid) # abs.ref.by.mode(fid)) AND monitor.flg THENÿûþ errmsg = 'Crossing segment, referencing ': ref.to.name.in.ref.by.mode :' by mode ':ref.by.mode.nameþ ÿû GOSUB print.warningþ ENDþ IF df.swap THENþ tt = addr[3,2]:addr[1,2]þ ÿû END ELSEþ tt = addr[1,4] þ * [25] Special encoding for HPþ if obj.imp="hp900ÿû0" thenþ * Put the sign bit (0) at the endþ tt=dtx(xtd(tt)*2)"r%4"þ endþ ÿû ENDþ CASE ext.type = "r" ;* 16-bit intel relativeþ* [05] Check cross segment callþ ÿû IF abs.mode(fid) # abs.ref.by.mode(fid) THENþ errmsg = 'Crossing segment error referencing ': reÿûf.to.name.in.ref.by.mode :' by mode ':ref.by.mode.nameþ GOSUB print.errmsgþ ENDþ*þ ttÿû = dtx(xtd(abs.mode(disp))- xtd(abs.ref.by.mode(disp))- xtd(disp.of.ext.ref.in.ext.mode)-2) 'r%%%%'þ IF byte.ÿûswap THENþ tt = tt[3,2] : tt[1,2]þ END þ CASE ext.type = "q" ;* long ÿûrelativeþ tt = dtx(xtd(abs.mode(disp))- xtd(abs.ref.by.mode(disp))- xtd(disp.of.ext.ref.in.ext.mode)-4) 'r%%%ÿû%%%%%'þ IF byte.swap THENþ tt = tt[7,2] : tt[5,2] : tt[3,2] : tt[1,2]þ ENDþ ÿûCASE ext.type = "m"þ* [05] Absolute longþ* Fin in which segment we want to go toþ segto=abs.mode(fid)þ ÿû ii=0þ LOOPþ ii=ii+1þ WHILE segtbl#'' AND segtbl#segto DO REPEATþ ÿû IF segtbl='' THENþ errmsg = 'Missing segment. Internal mload error'þ GOSUB print.errÿûmsgþ END ELSEþ tt=segtbl"R%8"þ IF abs.mode(type)='s' THENþ addÿûr='0000' ;* force 0 disp if segmentþ END ELSEþ IF byte.swap THENþ addr=adÿûdr[3,2]:addr[1,2]þ END ELSEþ addr=addr[1,4]þ ENDþ ENDþ* Add ÿûthe displacement of segmentþ addr=DTX(XTD(addr)+XTD(tt[5,4]))"R%4"þ* Extract the segmentþ tt=tÿût[1,4]þ IF byte.swap THENþ* Put segment in reversed byte order after the dispþ tt=addr:tt[3,ÿû2]:tt[1,2]þ END ELSEþ* Put segment beforeþ tt=tt:addrþ ENDþ ENDþ ÿû CASE ext.type = "f"þ tt = addr[5,4] ;* fid onlyþ* [07] ++ If df swap reverse dispþ if df.sÿûwap thenþ tt=addr[7,2]:addr[5,2]þ end elseþ tt = addr[5,4]þ * [25] Speÿûcial encoding for HPþ if obj.imp="hp9000" thenþ * Put the sign bit (0) at the endþ ÿû tt=dtx(xtd(tt)*2)"r%4"þ endþ endþ* ++ [07]þ CASE 1þ* Default. disp:fid [08]þ ÿû IF xm.swap THENþ tt=addr[3,2]:addr[1,2]:addr[7,2]:addr[5,2]þ END ELSEþ tt=ÿûaddrþ ENDþ END CASEþ u.mld.fill.ext.ref.by.in.abs = rfby:abs.ref.by.mode(fid):am:abs.ref.by.modÿûe(disp): am:disp.of.ext.ref.in.ext.mode:am:ttþ IF OCONV(u.mld.fill.ext.ref.by.in.abs,u.mld)="x" THENþ erÿûrmsg = "err in ref-by ":ref.by.mode.name;GO print.errmsgþ endþ endþ IF unload.option THEN abs.ref.by.moÿûde(ref.to)<1,ref.to.cnt.in.ref.by.mode> = "udef"þ NEXT ref.to.cnt.in.ref.by.modeþ IF unload.option THENþ MATWÿûRITE abs.ref.by.mode ON abs.data,ref.by.mode.nameþ endþ IF not.refed THENþ abs.mode(ref.by) = delete(abs.modeÿû(ref.by),1,ref.by.cnt)þ ref.by.cnt=ref.by.cnt-1;ref.by.times=ref.by.times-1þ endþ WRITEV OCONV(abs.base:am:abÿûs.ref.by.mode(fid):am:id.data.size,"u617d") ON abs.data,abs.ref.by.mode(fid),chksumþ NEXT ref.by.cntþ RETURNþþ skip.cÿûur.itm :þ GOSUB print.errmsgþ GO next.itemþþ* Add errmsg to err.string & return unless fatalþþ fatal.err :þ fatal =ÿû 1þþ print.errmsg :þ IF err.only.option THEN PRINT cur.obj.id:" ": ELSE PRINTþ PRINT errmsgþ err.string = err.strinÿûg :am: cur.obj.id :vm: errmsgþ er.cnt=er.cnt+1 ;* [05]þ IF fatal THEN GO program.end ÿû ;* ingest waste & expireþ RETURNþþ*þ* [05] Print a warning.þ print.warning :þ IF warning.flg THEN RETURNþ IF err.oÿûnly.option THEN PRINT cur.obj.id:" ": ELSE PRINTþ errmsg='WARNING: ':errmsgþ PRINT errmsgþ err.string = err.string :aÿûm: cur.obj.id :vm: errmsgþ wn.cnt=wn.cnt+1þ RETURNþ*þ* [05] Align on a next boundary. The boundary (in decimal) is inþÿû* mparam1þ*þ set.segment:*þ* Compute the number of frame to skip (if any)þ u.mld.upd.nxt.free.abs.fid = 'u'þ dst.frm.ÿûsiz=xtd(id.data.size);* [18]þ skip.frm=1+INT(dst.frm.siz/1000) ;* number of frames to cross;*[18]þ IF skip.frm > 0 THÿûENþ FOR ii=1 TO skip.frmþ cur.fid = OCONV(u.mld.upd.nxt.free.abs.fid,u.mld) 'r%%%' þ IF cur.fid = '000' THEÿûN errmsg = 'abs full';GO fatal.errþ NEXT iiþ ENDþ*þ* Write the segment descriptorþ abs.mode(type)='s'þ abs.mode(fiÿûd)=cur.fidþ abs.mode(disp)=dtx(segbase)'r%4' ;* [10]þ abs.mode(length)=id.data.size'r%4' ;* [10]þ IF mload.flg THEN MÿûATWRITE abs.mode ON abs.data,segnameþ segtbl=segtbl:am:cur.fid:vm:dtx(segbase)þ RETURNþ*þ* Evaluate 'expr'. put resultÿû in 'result'. Syntax errors in 'error'þ* Accepts hexadecimal input x'1234'þ* Return the result in decimal.þ*þ* Does not ÿûrecognize operator precedence. Use explicit parenthesisþ*þ* Operators:þ* + add / divide & ANDþ*ÿû - substract % integer divide | ORþ* ^ multiply \ moduloþ*þ*þ evaluate: *þ e.eÿûrror=''þ e.result=0þ e.expr=trim(e.expr)þ if e.expr='' then returnþ*þ e.polish='';e.level=''þ dim e.stack(32)þ matÿû e.stack='' þ*þ* Transform the expression to polish notationþ* ===========================================þ e.i=0;eÿû.data='';e.op='';e.sp=1þ loopþ e.i=e.i+1þ e.c=e.expr[e.i,1]þ while e.c#'' doþ begin caseþ case e.c=''þ* ÿûignore these charactersþ case index('+-/%|&^\)]}',e.c,1)þ* binary operators.þ* out the operandþ if e.data#''ÿû then e.polish=e.polish:e.data:amþ* out the last pushed operand (if any)þ if e.stack(e.sp)#'' thenþ e.poÿûlish=e.polish:e.stack(e.sp):amþ endþ if index(')]}', e.c,1) thenþ* unstack operatorþ e.stack(e.spÿû)=''þ if e.sp=1 then goto e.err3þ e.sp=e.sp-1þ end elseþ e.stack(e.sp)=e.c;þ enÿûdþ e.data=''þ case index('{([',e.c,1)þ* start a paren sequenceþ if e.data#'' then goto e.err2þ ÿû e.sp=e.sp+1þ case 1þ* ordinary charactersþ e.data=e.data:e.cþ end caseþ repeatþ*þ* do the last timeþ*þ ÿû if e.data#'' then e.polish=e.polish:e.data:amþ*þ* pop the operators, if any þ loop while e.sp>=1 doþ if e.stack(e.sÿûp)#'' thenþ e.polish=e.polish:e.stack(e.sp);þ endþ e.sp=e.sp-1þ repeatþ*þ* Evaluate the expressionþ* =======ÿû================þ mat e.stack=''þ e.sp=0þ e.c=0þ loopþ e.c=e.c+1þ e.val=e.polishþ while e.val#'' doþ ÿûif index('+-/%|&^\',e.val,1) thenþ* binary operatorþ if e.sp<=1 then goto e.err3 ;* need 2 parametersþ e.op1=ÿûe.stack(e.sp);e.sp=e.sp-1;þ begin caseþ case e.val='+'þ e.stack(e.sp)=e.stack(e.sp) + e.op1þ ÿû case e.val='-'þ e.stack(e.sp)=e.stack(e.sp) - e.op1þ case e.val='/'þ e.stack(e.sp)=e.stack(e.sÿûp) / e.op1þ case e.val='^'þ e.stack(e.sp)=e.stack(e.sp) * e.op1þ case e.val='%'þ* integer divisioÿûnþ e.stack(e.sp)=int( e.stack(e.sp) / e.op1 )þ case e.val='\'þ* moduloþ e.stack(e.sp)=mod( e.stÿûack(e.sp) , e.op1 )þ end caseþ end elseþ* push a valueþ e.again:*þ begin caseþ case e.val[1,2]=ÿû"x'"þ* hexadecimalþ e.val=xtd(field(e.val,"'",2))þ case num(e.val)þ* OK decimalþ case 1þ* unrecogÿûnizedþ* Look for specific variablesþ if e.val[1,1]='_' thenþ READ abs.fid FROM abs.data,cur.fid ELSEÿû þ errmsg = "abs rec '":cur.fid:"' missing";GO fatal.errþ ENDþ LOCATE("free",abs.fid,ÿûmodes;pos) THENþ avail = xtd(abs.fid)þ mfirst= XTD(abs.fid)þ ÿû END ELSEþ avail=dst.frm.siz;* [18]þ mfirst=0þ ENDþ e.val=e.val[2,99]þ ÿû begin caseþ case e.val='curfid';e.val=xtd(cur.fid)þ case e.val='segbase' ;e.val=segÿûbaseþ case e.val='offset';e.val=mfirstþ case e.val='segsize';e.val=xtd(id.data.size)þ ÿû case 1;goto e.err6þ end caseþ goto e.againþ endþ goto e.err4þ end caseÿûþ e.sp=e.sp+1;e.stack(e.sp)=e.valþ endþ repeatþ*þ if e.sp# 1 then goto e.err5þ e.result=e.stack(1)þ*þ returnÿûþ*þ e.err1: e.error='Operator without operand';returnþ e.err2: e.error='Missing operator';returnþ e.err3: e.error='Emÿûpty stack';returnþ e.err4: e.error="Unrecognized symbol or value '":e.val:"'";returnþ e.err5: e.error="Unused stack enÿûtries";returnþ e.err6: e.error="Unrecognized pseudo-variable";returnþ*þENDþûverify-patchesþ* Verify patches according to nsmx.patch fileþ* Raining Dataþ*þ* [00] rr: Originalþ* [01] 21Mar03ÿû rr: Make 'does not verify' message more specificþ* [02] 21Mar03 rr: Do not verify pre-loaded patchesþ* [03] 05Jan04 rr:ÿû Atrocious hard-coding of exceptionsþ* [04] 17Sep04 rr: Acknowledge conditional supercessionþ* [05] 17Sep04 rr: Split prÿûe-load into qualification and pre-loadþ* [06] 26Oct04 ml: [30430] Ensure correct terminal typeþ* [07] 10Nov04 ml: [30546ÿû] Corrected to remember all term parametersþ*þPrompt ''þEquate am to Char(254), vm to Char(253)þþDim total(2); Mat totalÿû = 0þþrelease = System(100)þabs.level = Field(Iconv(3,"u713d")<5>,".",4)[2,9];* [02]þþTclread tclþoptions = Field(tcl,"(ÿû",2)þaflg = Index(options,"a",1)þþ þOpen "nsmx.patch" To fv.sourceþExecute "create-file nsmx.patch,load 1" Capturing xxþÿûExecute "clear-file nsmx.patch,load"þOpen "nsmx.patch,load" To fv.tempþþ*OldTerm = system(7) ; * [06] [07]þ*þ* [07] Starÿûtþ* ----------þOldTerm = oconv("",'u0004')þpw = OldTerm<3> ; pd = OldTerm<5>þOldTerm = delete(OldTerm,5)þOldTerm = deletÿûe(OldTerm,3)þOldTerm<8> = pwþOldTerm<9> = pdþconvert @am to ',' in OldTermþ*þ* [07] Endþ*þExecute "term dumb" capturing ÿûdummy ; * [06]þResetTerm = "term ":OldTerm ; * [06]þIf aflg Thenþ Print; Print "Enter full path of alternate abs: ":þÿû Input abs.fnþEnd Else abs.fn = "abs"þþpno = options "cn"þIf pno = "" Thenþ * Verify all patchesþ cmd = 'sselect nÿûsmx.patch with a0 "[!1!]""[!2!]" by-dsnd patch.num'þEnd Elseþ * Verify selected patchesþ cmd = 'sselect nsmx.patch wÿûith a0 "':pno:'!1!]""':pno:'!2!]"'þEndþþExecute cmd Capturing xxþ* If System(11) Else Print "Patch installation data notÿû found"; Stop ; * [06]þIf System(11) Else Print "Patch installation data not found"; Execute ResetTerm capturing dummy ;ÿû Stop ; * [06]þþerrs = 0þLoopþ Readnext patch.id Else Exitþ patch.num = Field(patch.id,"!",1)þ patch.type = Field(ÿûpatch.id,"!",2)þ mode.id = Field(patch.id,"!",3)þ obsolete.id = patch.num:"!3!obsolete"þ load.id = patch.num:"!3!lÿûoad"þ excl.id = patch.num:"!3!exclusions"þ rls.id = patch.num:"!3!release"þ Gosub verify.patchþRepeatþþPrintþPrintÿû total(1) "r#4":" abs modes"þPrint total(2) "r#4":" dataset items"þþIf errs Thenþ Print errs "r#4":" mismatches"þEnd Eÿûlseþ Print "All patches verify!"þEndþExecute ResetTerm capturing dummy ; * [06]þStopþþverify.patch:þRead obsolete Fromÿû fv.source,obsolete.id Else obsolete = ""þIf obsolete = "" Else Return;* Patch is obsoleteþþ* If load item exists, make ÿûsure load itemþ* is not checking for applicable levelsþ* -------------------------------------þRead load.item From fv.soÿûurce,load.idþload.bp = load.item<5>þIf load.bp # "" Thenþ * Check if this patch is able to print the words 'not applicÿûable'þ* If Index(load.bp,"not applicable",1) Thenþ If Index(load.bp,"not applicable",1) Or Index(load.bp,"superseded"ÿû,1) Then;* [04]þ Convert vm To am In load.bpþ x = Index(load.bp,"* End of qualify",1);* [05]þ If x Then lÿûoad.bp = load.bp[1,x-2];* [05]þ Write load.bp On fv.temp,"%load%"þ Execute "compile nsmx.patch,load %load%" Caÿûpturing xx Returning msgnoþ Locate 241 In msgno Setting xx Else Return;* Should never happenþ Execute "run nsmÿûx.patch,load %load%" Capturing msgþ* If Index(msg,"not applicable",1) Then Return;* Patch does not applyþ If Indÿûex(msg,"not applicable",1) Or Index(msg,"superseded",1) Then Return;* [04]þ EndþEndþ*þRead exclusions From fv.source,eÿûxcl.id Thenþ Gosub chk.exclusionsþ If excluded Then Returnþ If Not(included) Then ReturnþEndþþ* [02] Check if pre-ÿûloadedþRead release.info From fv.source,rls.id Thenþ If release.info "cn" <= abs.level Then ReturnþEndþþ* All tests paÿûssed, this patch was installableþRead object From fv.source,patch.idþWrite object On fv.temp,mode.idþþIf patch.type = 1 ÿûThenþ * Abs patchþ* error = 0þ error = "";* [01]þ Data "(":abs.fnþ Execute "mverify nsmx.patch,load ":mode.id Cÿûapturing msgþ If Index(msg,"errs",1) Or Index(msg,"error(s)",1) Else Goto fatalþ* If Index(msg,"0 errs",1) Else errorÿû = 1þ If Index(msg,"0 errs",1) Else error = Trim(msg<3>);* [01]þEnd Elseþ * Dataset patchþ * Search for target filÿûenameþ* error = 1þ error = ""; found = 0;* [01]þ num.files = Dcount(load.item<1>,VM)þ For i = 1 To num.filesþ* ÿû Locate mode.id In load.item<2,i> Setting xx Then error = 0; Exitþ Locate mode.id In load.item<2,i> Setting xx Theÿûn found = 1; Exitþ Next iþþ * [01]þ If found Thenþ* If error = 0 Thenþ Data "(":load.item<1,i>þ tcl = "ÿûcompare nsmx.patch,load ":mode.id:" (zas"þ Execute tcl Capturing msg Returning msgnoþ* If msg # "" Thenþ Iÿûf msg # "" And mode.id # "xs.interface" Then;* [03]þ * [01] Display more specific messagesþ Begin Caseþ ÿû Case msgno = 503; Null;* Binary item msg okþ Case msgno = 409þ error = "Not on file"ÿûþ Case 1; error = msg<1>þ End Caseþ Endþ End Elseþ * [01]þ error = "Not found in 'loÿûad' item"þ EndþEndþþ*If error ThenþIf error # "" Thenþ* Print "Item '":mode.id:"' in patch ":patch.num:" does not verÿûify"þ Print "Item '":mode.id:"' in patch ":patch.num:": ":errorþ errs += 1þEndþtotal(patch.type) += 1þReturnþþchk.exÿûclusions:þexcluded = 0þexmax = dcount(exclusions<1>,vm);* [47] Get exclusionsþfor j = 1 to exmaxþ this.excl = trim(exclÿûusions<1,j>)þ if this.excl = "all" then excluded = 1þ *þ * [26] New 'exclusions' algorithmþ * ----------------------ÿû---------þ begin caseþ case num(this.excl[1,2])þ * release level exclusion onlyþ * append "." so that 6.1.1 exclÿûusion does not exclude 6.1.15þ excl.lvl = field(this.excl," ",1):"."þ if index(release,excl.lvl,1) then excluded =ÿû 1;* [29]þ case field(this.excl," ",2) # ""þ * platform & release level exclusionþ excl.plat = field(this.excl," ÿû",1)þ excl.lvl = field(this.excl," ",2):"."þ if index(release,excl.plat,1) then excluded = 1;* [29]þ case 1þ *ÿû platform exclusion onlyþ excl.plat = field(this.excl," ",1);* [27]þ if index(release,excl.plat,1) then excluded =ÿû 1;* [29]þ end caseþnext jþþ*þ* [47] If specific.to releases exist, check that we qualifyþ* ---------------------------ÿû------------------------------þincluded = 0þnum.specific.to = dcount(exclusions<2>,VM);* þif num.specific.to = 0 then inÿûcluded = 1; return;* Not specificþþfor j = 1 to num.specific.toþ if index(release,exclusions<2,j>,1) then included = 1ÿû; exitþnext jþreturnþþfatal:þPrint "Error verifying:"þx = Dcount(msg,am)þFor i = 1 To x; Print msg; Next iþExecute ReÿûsetTerm capturing dummy ; * [06]þStopþûpatch.ds.locationþsubroutine patch.ds.location (patch.item) þ* þ* Subroutine to extract dataset load location þ* þ* [00]ÿû 04Sep03 mal First Version þ* þ********************************************************************** þ* þpatchtype=fielÿûd(access(10),"!",2) þif patchtype = "1" then patch.item="";return ; * abs patch þ* þpatchno=field(access(10),"!",1) þloaÿûdkey=patchno:"!3!load" þdsitem=field(access(10),"!",3) þ* þfd=access(1) þread loadrec from fd,loadkey then þ* þ found=ÿû0 þ x=1 þ itemcount=dcount(loadrec<1>,@VM) þ loop until (x > itemcount) or found do þ sxcount=dcount(loadrec<ÿû2,x>,char(252)) þ for f = 1 to sxcount until found þ if loadrec<2,x,f> = dsitem then þ patch.itÿûem=loadrec<1,x> þ found=1 þ end þ next f þ x=x+1 þ repeat þend þif not(found) then þ pÿûatch.item="" þend þreturnþûÿXûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûEOFÿREAD abs.fidÿL 01F4 09:45:53 05 Oct 2005 nsm.patchobj,temp þ01READ abs.fid170!1!openþü0000 8B71A0ýü0003 31C0ýü0005 668986D60100ü000B 00ýü000C 8986D8010000ýü0012 8049AC80þü0016 8B7980ýü0019 C6470ÿû420þü001D 8D5900ýü0020 8D4980ýü0023 BAF4000000ýü0028 FF95E8040000þü002E 8B7180ýü0031 8B7900ýü0034 8A4605ýü0037 8807ýü003ÿû9 80490C80þü003D C646052Cþü0041 8B7180ýü0044 83C604ýü0047 8D59C0ýü004A FF957E050000ýü0050 EBEFþü0052 8D59C0ýü0055 8D4980ÿûýü0058 BAEC010000ýü005D FF95E2040000þü0063 FF95BE040000ýü0069 00000400þü006D 8B7180ýü0070 66817E0E0100ýü0076 0F842103000ÿû0þü007C 8B79A0ýü007F 8B87B8020000ýü0085 8987C6020000ýü008B 668B87BC0200ü0091 00ýü0092 668987CA0200ü0098 00ýü0099 8049AC8ÿû0þü009D 8B71C0ýü00A0 8A06ýü00A2 3C20ýü00A4 0F85AE000000þü00AA 8D5970ýü00AD 8D4900ýü00B0 FF95D0040000þü00B6 8D5970ýü00B9 ÿûFF951E050000þü00BF 8B7170ýü00C2 8A06ýü00C4 8D9DB0090000ýü00CA D7ýü00CB 3C44ýü00CD 0F8536010000þü00D3 8B7980ýü00D6 66C747ÿû0C0314þü00DC FF95BE040000ýü00E2 00000400þü00E6 8D5900ýü00E9 8D4970ýü00EC FF95D0040000þü00F2 8D5900ýü00F5 8D4960ýü00F8 B2ÿûE0ýü00FA FF9534070000ýü0100 EBF0ýü0102 E93AFFFFFFþü0107 8D5970ýü010A 8D4900ýü010D FF95D0040000þü0113 8B7180ýü0116 66C746ÿû0C0218þü011C FF95BE040000ýü0122 00000400þü0126 8D5900ýü0129 8D4970ýü012C FF95D0040000þü0132 8D5900ýü0135 8D4960ýü0138 B2ÿûE0ýü013A FF9534070000ýü0140 EBF0ýü0142 E905000000þü0147 E9BD000000þü014C 8B7180ýü014F 804E1B80þü0153 E9E9FEFFFFþü0158 8Bÿû71C0ýü015B 8A06ýü015D 3C2Cýü015F 0F85A4000000þü0165 8D59C0ýü0168 8D4970ýü016B FF95D0040000þü0171 8D5970ýü0174 FF951E0500ÿû00þü017A 8B7170ýü017D 8A06ýü017F 3CFCýü0181 7368þü0183 3C20ýü0185 7464þü0187 8B7980ýü018A 3A4702ýü018D 745Cþü018F 8D5970ÿûýü0192 FF9524050000þü0198 8B7180ýü019B 8D95D00D0000ýü01A1 B8FCFDFEFFýü01A6 8982FC000000ýü01AC 8942F2ýü01AF 31C0ýü01B1 8Aÿû4602ýü01B4 C60402FFýü01B8 8842F6ýü01BB 8A4605ýü01BE C60402FFýü01C2 8842F7ýü01C5 8A4604ýü01C8 C60402FFýü01CC 8842F8ýü01CFÿû C642F007ýü01D3 8D5970ýü01D6 FF95AE050000ýü01DC EBBAþü01DE 8B7170ýü01E1 8A06ýü01E3 3C2Cýü01E5 0F8516010000þü01EB 8B7980ýÿûü01EE 8D7F50ýü01F1 8B7180ýü01F4 8D7660ýü01F7 FF95EE040000þü01FD FF95BE040000ýü0203 00000400þü0207 EB29þü0209 8B7980ýü020ÿûC 8D7F50ýü020F 8B7180ýü0212 8D7660ýü0215 FF95EE040000þü021B 8B71A0ýü021E 66C746020100ýü0224 8049AC80þü0228 FF95BE040000ýÿûü022E 00000400þü0232 8B7180ýü0235 F6462580ýü0239 0F8468010000þü023F 8B7980ýü0242 8D7F58ýü0245 8B7180ýü0248 8D7650ýü024B ÿûFF95EE040000þü0251 8B7180ýü0254 F6461B80ýü0258 0F8599000000þü025E 8B71E0ýü0261 8A06ýü0263 3C2Cýü0265 7564þü0267 8D5900ýüÿû026A 8D4980ýü026D BAF4000000ýü0272 FF95E8040000þü0278 8B7180ýü027B 8D95D00D0000ýü0281 B8FCFDFEFFýü0286 8982FC000000ýü028ÿûC 8942F2ýü028F 31C0ýü0291 8A4602ýü0294 C60402FFýü0298 8842F6ýü029B 8A4605ýü029E C60402FFýü02A2 8842F7ýü02A5 8A4604ýü02A8ÿû C60402FFýü02AC 8842F8ýü02AF C642F007ýü02B3 8D59E0ýü02B6 8D4900ýü02B9 FF9586060000ýü02BF EBB7þü02C1 8B7100ýü02C4 C606FEýÿûü02C7 80490C80þü02CB FF95BE040000ýü02D1 00000400þü02D5 8B7180ýü02D8 F6462580ýü02DC 0F84FA000000þü02E2 F6461B80ýü02E6 750ÿûFþü02E8 8B79A0ýü02EB 66817F020300ýü02F1 0F8567FFFFFFþü02F7 FF95AC040000ýü02FD 00000400þü0301 8D5960ýü0304 8D49A0ýü0307 BÿûA8E010000ýü030C FF95E8040000þü0312 8D5970ýü0315 8D4980ýü0318 BAEC010000ýü031D FF95E8040000þü0323 8D5970ýü0326 FF95240500ÿû00þü032C 8B7180ýü032F 8D95D00D0000ýü0335 B8FCFDFEFFýü033A 8982FC000000ýü0340 8942F2ýü0343 31C0ýü0345 8A4602ýü0348 C60402ÿûFFýü034C 8842F6ýü034F 8A4604ýü0352 C60402FFýü0356 8842F7ýü0359 C642F006ýü035D 8D5970ýü0360 8D4960ýü0363 FF9586060000ýü03ÿû69 EBC1þü036B 8B7160ýü036E C606FEýü0371 80496C80þü0375 8D5960ýü0378 B251ýü037A FF95FA040000ýü0380 EBF3þü0382 8D5960ýü038ÿû5 8D4980ýü0388 BAEC010000ýü038D FF95E2040000þü0393 FF95AC040000ýü0399 00000400þü039D FF95AC040000ýü03A3 00000400þü03A7 8ÿûB71A0ýü03AA 66837E0200ýü03AF 7414þü03B1 66C74602C900ýü03B7 8049AC80þü03BB FF95AC040000ýü03C1 00000400þü03C5 8B71A0ýü03C8ÿû 66C74602E500ýü03CE 8049AC80þü03D2 FF95AC040000ýü03D8 00000400þü03DC FF95AC040000ýü03E2 00000400þý $$ü 03E6ý $copyfnü 00ÿû69ý $get.msgü 00E2ý $get.msgü 0122ý $open.setqü 0203ý $openxü 022Eý $openxü 02D1ý $open.grtnü 02FDý $openzü 0399ý $open.ÿûperr1ü 03A3ý $open.perr2ü 03C1ý $open.perr2ü 03D8ý $open.perr4ü 03E2þû200!3!rebootþ1þû87!3!exclusionsþþþû173!3!patchþ30697ý30651þEnhanced the BASIC compiler to require at least one space after the "READ{V}{U}" and "FROM" keywÿûords for a file read, and the "WRITE{X}{V}{U}", "ON", and "TO" keywords for a file write.ýCorrected a problem with the FÿûlashBASIC Compiler, which caused "Input@" statements to use the printer device codes instead of the terminal device codeÿûs when they were used with a "printer on" statement in effect.þû199!1!fm.create.ffþü0000 8D5900ýü0003 B2FEýü0005 FF95FA040000ýü000B EBF3þü000D 8D5950ýü0010 8D4970ýü0013 FF95D0040000þü0ÿû019 8B7180ýü001C 8B4678ýü001F 89460Cýü0022 6699ýü0024 6689560Aþü0028 FF95BE040000ýü002E 00000400þü0032 8D5970ýü0035 B22Aÿûýü0037 FF95FA040000ýü003D EBF3þü003F 8B7180ýü0042 8B467Cýü0045 89460Cýü0048 6699ýü004A 6689560Aþü004E FF95BE040000ýü0054ÿû 00000400þü0058 8B7180ýü005B 66C7460E0E00ýü0061 B2FEýü0063 8D5970ýü0066 FF958A080000ýü006C EBF3þü006E 8D5970ýü0071 B24Eýÿûü0073 FF95FA040000ýü0079 EBF3þü007B 8D5970ýü007E B2FEýü0080 FF95FA040000ýü0086 EBF3þü0088 8B71A0ýü008B C60664ýü008E 8049ÿûAC80þü0092 FF95BE040000ýü0098 00000400þü009C 8D5950ýü009F 8D49A0ýü00A2 BAA0010000ýü00A7 FF95E8040000þü00AD 8D5950ýü00B0 ÿû8D4970ýü00B3 FF956E060000ýü00B9 EBF2þü00BB 8B7170ýü00BE C6062Aýü00C1 80497C80þü00C5 FF95A0070000þü00CB 8B7180ýü00CE 0FBFÿû460Eýü00D2 99ýü00D3 6689460Eýü00D7 89560Aýü00DA 8D5970ýü00DD 8D4970ýü00E0 FF95D0040000ýü00E6 FF95BE040000ýü00EC 00000400ÿûýü00F0 8D5970ýü00F3 8D4970ýü00F6 FF95D0040000þü00FC 8B7180ýü00FF 66C7460E0900ýü0105 B2FEýü0107 8D5970ýü010A FF958A080000ÿûýü0110 EBF3þü0112 FF9584080000þü0118 8B7180ýü011B 0FBF460Aýü011F 99ýü0120 6689460Eýü0124 89560Aþü0127 66C746280400þü012Dÿû FF95BE040000ýü0133 00000400þü0137 8D5970ýü013A B2FEýü013C FF95FA040000ýü0142 EBF3þü0144 8D5970ýü0147 B2FFýü0149 FF95FA0ÿû40000ýü014F EBF3þü0151 8D5950ýü0154 8D4980ýü0157 BADC000000ýü015C FF95E8040000þü0162 8DB5AE0A0000ýü0168 8D5950ýü016B FF9ÿû572050000ýü0171 EBEFþü0173 8B71A0ýü0176 F6461201ýü017A 7559þü017C 8D5960ýü017F BA12000000ýü0184 FF950C050000ýü018A EBF0ýÿûü018C 89D9ýü018E FF95E8040000þü0194 8B7160ýü0197 F6461820ýü019B 7538þü019D 8B7980ýü01A0 F6878D000000ü01A6 08ýü01A7 752Cþÿûü01A9 8B71A0ýü01AC F6461210ýü01B0 7523þü01B2 F6461110ýü01B6 7509þü01B8 8B7960ýü01BB F6471880ýü01BF 7414þü01C1 FF95BE0400ÿû00ýü01C7 00000400þü01CB FF95AC040000ýü01D1 00000400þü01D5 FF95AC040000ýü01DB 00000400þý $$ü 01DFý $mbdsubü 002Eý $mbdsubÿûü 0054ý $timedateidü 0098ý $mbdsubü 00ECý $mbdsubü 0133ý $upditmü 01C7ý $tl.fmü 01D1ý $upditmü 01DBþû25!3!releaseþa6þû79!3!symbolsþglobalýglobalýglobalýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsÿûýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsýxsþt%xstsrptrýxstsrptrýf.xstsrptrýxst.usagecounterýxst.TempSR0ýxst%Offsetýxs.Verÿûsionýxs.Sign1ýxste%Sizeýxs%cmdCreateýxs.Offsetýxst.TempSR0.14ýxst%Sign1ýxs%Versionýxs%cmdGetýxs.Sign2ýxs%Successýxst.UpdÿûateLock.14ýxste.FIDýxst%Sign2ýxst.Offsetýxst.TempD0ýxs%errBadCommandýxs%cmdAppendýxst.UpdateLockýxst.TempD0.14ýxst.Sign2ÿû.14ýxst.Versionýxst.Version.14ýxst.Offset.14ýxs%errBadHandleýxs%cmdDeleteýxst.UsageCounter.14ýxst.Sign1ýxst.Sign1.14ýxs%ÿûerrBadSignýxs%Sign1ýxs%cmdClearýxstsrlockýxst.Sign2ýxs.EOSýxs%Sign2ýxstsrýxs%Offsetýxst%Versionýxste.Handleþnü6Cýsü6CüEüÿûüüüýnü000000000012ýdü10üFýsü1AüFýnü0040ýtüCüFýfü0üFýnü8ýnü00000003ýtüEüFýsü1AüEüüüüýnüFF5244FF7873ýnü0000ýnü00000005ýfü6ÿûüFýnü0ýtü14üEüüüüýdü4üFýnü7461626C65FFýtüEüFýdü16üFýnü80000000ýnü00000001ýtü14üFýdü16üEüüüüýfü6üEüüüüýtüCüFýtüCüEüüüüýtüÿûEüEüüüüýnü80000001ýnü00000004ýdü10üEüüüüýfü0üFýfü0üEüüüüýnü80000002ýnüFF5244FF7873ýnü00000002ýtü6üEýfü6üFýsü10üFýnü74726ÿû96E67FFýsü0üEýnü0040ýnü0000ýdü0üFþnü6Cýsü6CüEüüüüýnü000000000012ýdü10üFýsü1AüFýnü0040ýtüCüFýfü0üFýnü8ýnü00000003ýtüEüFýsÿûü1AüEüüüüýnüFF5244FF7873ýnü0000ýnü00000005ýfü6üFýnü0ýtü14üEüüüüýdü4üFýnü7461626C65FFýtüEüFýdü16üFýnü80000000ýnü00000001ýÿûtü14üFýdü16üEüüüüýfü6üEüüüüýtüCüFýtüCüEüüüüýtüEüEüüüüýnü80000001ýnü00000004ýdü10üEüüüüýfü0üFýfü0üEüüüüýnü80000002ýnüFF52ÿû44FF7873ýnü00000002ýtü6üEýfü6üFýsü10üFýnü7472696E67FFýsü0üEýnü0040ýnü0000ýdü0üFþû173!3!loadþdm,messages,þbnfþ0þ0þþþû70!3!obsoleteþ75þû199!2!reclaim-ovfþ!þ*þ* Program to activate the RECLAIM-OVF processþ*þ* [01] 15jul96 rr: modify shutdown messageþ* [02] ÿû16jul96 rr: ensure maxusers > 0þ* [03] 04feb03 rr: ensure in DM acctþ* [04] 03apr03 rr: [28284] Log execution to errors ÿûfileþ* [05] 21Jul03 rr: [28670] Use new licensing scheme for >= 7.4þ* [06] 19Apr04 ral: [29755] Disable this feature forÿû nowþ*þstop 4326; *[06] disable for nowþequ am to char(254)þprompt ""þcasing offþtclread lineþoptions = field(line,'(',2ÿû)þbflg = index(options,'B',1) ;* start process in background þfflg = index(options,'F',1) ;* display file namesþiflg = iÿûndex(options,'I',1) ;* reuse reserved block if possibleþkflg = index(options,'K',1) ;* kill processþnflg = index(optionsÿû,'N',1) ;* prompt user of size of pre-reserved blockþrflg = index(options,'R',1) ;* resume processþsflg = index(options,ÿû'S',1) ;* display statusþuflg = index(options,'U',1) ;* unconditional flagþxflg = index(options,'X',1) ;* suspend procesÿûsþ*þ* [03] Add DM checkþ* -----------------þif @account # "dm" thenþ crt "This command must be executed from the DM acÿûcount."þ stopþendþþif rflg and xflg thenþ crt "Conflict in options - Try again"þ stopþendþ*þ* first get status of reÿûclaim-ovfþ*þstat.info = oconv("s","u53")þstat = stat.info<1>þif sflg then go get.status; * inquire statusþif rflg then gÿûo rco.resume ;* resume reclaim processþif xflg then go rco.suspend; * suspend reclaim processþif kflg then go rco.killÿû; * kill processþif uflg then go rco.kill; * unconditionally kill processþ*þ* start process, must be line 0þif systeÿûm(22) then ;* abort execution if not on line 0.þ crt; crt "ABORT! RECLAIM-OVF can only be initiated from line 0"þ stoÿûpþendþ*þ* Ensure maxusers > 0þ* [05] Special processing for 7.4 and upþ* --------------------------------------þrel.leveÿûl = Oconv(Field(System(100),';',7),"g0.2")þIf rel.level >= 7.4 Thenþ Equ LD.STATUS TO 1, LD.ACTIVATED to 2, LD.PORTS tÿûo 3þ Equ LD.CEILING TO 4, LD.IN.USE to 5þþ LICENSEDATA=OCONV("1","U7C")þ IF LICENSEDATA = 0 AND LICENSEÿûDATA = 1 THENþ X=LICENSEDATAþ IF LICENSEDATA < X THENþ X=LICENSEDAÿûTAþ ENDþ Maxusers = X-LICENSEDATAþ END ELSEþ Maxusers = 0þ ENDþEnd Elseþ exeÿûcute "maxusers" capturing maxþ dc = dcount(max,am)þ for i = 1 to dcþ if index(max,"allowed",1) thenþ ÿû maxusers = trim(field(max,":",2))þ endþ next iþEndþþif maxusers elseþ crt; crt "ABORT! Cannot execute thisÿû command when maxusers is 0."þ stopþendþ*þopt = ""þif bflg then opt = opt:'B'þif fflg then opt = opt:'F'þif iflg then ÿûopt = opt:'I'þif nflg thenþ5 * allow user to specify the number of pre-reserved framesþ crt "Input the number of pre-reÿûserved contiguous frames: ":; input nfrmsþ if nfrms = 'q' or nfrms = 'Q' then stopþ if not(num(nfrms)) or nfrms <= 0 tÿûhenþ crt "Input must be a number greater than 0, try again !!!" ;crtþ goto 5þ endþ opt = opt:am:nfrmsþendþþxx = ÿûoconv("o":am:opt,"u53")þbegin caseþ case xx = 1þ crt "Reclaim-ovf is currently in progress !!!";* stopþ case xx = 2ÿûþ crt "Not enough contiguous frames, try again with n-option";* stopþ case xx = 3þ crt "Reserved block is not valÿûid; try again WITHOUT i-option";* stopþ case xx = 0þ crt char(7)þ crt " To activate the Overflow Reclamatiÿûon process,"þ crt " all print and hold files will be deleted, and"þ crt " the system will shutdown iÿûmmediately."; crtþ crt "Do you wish to continue (y/n) ? ":; input ansþ if ans = 'y' or ans = 'Y' thenþ Execuÿûte "log-msg ":line:" executed.";* [04]þ data "y"þ chain 'shutdown (v' þ endþend caseþþExecute "log-msg ":ÿûline:" attempted, err=":xx;* [04] Log attemptþcrt; crt " Reclaim-ovf process not activated."þx = oconv("w","u53") ;* relÿûease framesþstopþ*þget.status:*þ * depending on the rtn status of reclaim-ovf process, the dynamic arrayþ * will containÿû different info, the possible statuses are:þ * R)unning, S)uspended, C)ompleted, K)illed, þ * A)borted, I)ÿûnactive, else not startedþ * rco.stat rtns a dynamic array:þ * <1> rco.status, <2> rco.pib, <3> time, <4> dateþ * 1.ÿû rco.status = "R" or "S"þ * <5> phase, <6> # files scanned, <7> # frms removedþ * or <6> # frms scruÿûbbed, <7> total f