File: BS.TK of Tape: Sources/Multi8/m8-tk-etc-20-10-80
(Source file text)
/BS.TK 5-MAY-81 / /THIS IS THE MAIN POLICY MAKER OF THE TIMESHARING SUBSYSTEM. /THE GENERAL FUNCTION OF THIS TASK IS THE SERVICING OF PAGE- (FIELD-) /FAULTS, (IE. WHEN A BACKGROUND PROGRAM HAS EXECUTED A CDF OR CIF /TO A NON-RESIDENT FIELD) AND TO INSURE THAT EACH USER GETS A /RESONABLE SHARE OF THE MACHINE. SO IT ALLOCATES MEMORY AND /PROCESSOR TIME. / /THIS VERSION IS AN EXTENSION OF THE BACKGROUND SCHEDULER OF /MULTI8 V6 (THE NON-PAGING VERSION). THE GENERAL IDEA IS THAT /AFTER ENTERING A COMMAND (OR, AFTER BECOMMING RUNNABLE) EACH /BG GETS A 'SHORT SLICE', APROX. .5 SECOND OF FIRST PRIORITY /TIME. THE PROGRAMS INSTRUCTION AND DATAFIELD ARE LOADED IN /MEMORY AND THE BG POINTER IS PUT IN SJOB. THE MULTI8 DISPATCHER /WILL FIND IT THERE AND START ITS EXECUTION. IF THE BG DOES NOT /COMPLETE (BECOME INACTIVE) DURING THE SHORT SLICE, IT IS /MARKED 'LONG'. IF THERE ARE NO OTHER 'SHORT' BG AT THIS POINT, /THE BG NOW GETS A 'LONG SLICE' OF APROX. 5 SECONDS. DURING THIS /'LONG SLICE' IT MAY BE INTERRUPTED BY OTHER BG'S THAT BECOME /ACTIVE FOR A SHORT SLICE. A POINTER TO THE EXECUTING LONG BG /IS STORED IN 'LJOB'. THE DISPATCHER FIRST LOOKS AT SJOB FOR /A RUNNABLE BG, THEN LOOKS AT LJOB. /IF A PAGEFAULT OCCURS (BS FINDS AN 'INCORE' REQUEST), IT /WILL TRY TO LOAD THE REQUESTED FIELD. THEREFORE IT HAS TO /FREE A MEMORY FIELD BY WRITING ITS CONTENTS BACK IN THE /SWAPFILE. THE PAGE REPLACEMENT ALGORITHM HAS A LARGE INFLUENCE /ON THE SYSTEMS PERFORMANCE. THE CURRENT ALGORITHM IS EXPLAINED /BELOW: /ALL MEMORY FIELDS ARE IN TURN CONSIDERED IN THE LIGHT OF /A SELECTION CRITERIUM. IF NON CAN BE SELECTED BY THAT CRITERIUM, /A NEW (STRONGER) CRITERIUM IS TAKEN AND ALL FIELDS ARE CONSIDERED /AGAIN. AS ONE FIELD PASSES ONE OF THE TESTS, IT IS SELECTED AND /THE ALGORITHM STOPS. IF NO FIELD CAN BE SELECTED, THE BS SETS /'BSFLAG' AND WAITS FOR A SIGNAL FROM THE CENTRAL EMULATOR. /THE SUCCESSIVE SELECTION CRITERIA ARE: /1 FIELD IS NOT IN USE (OWNER=0) (WILL OCCUR ONLY DURING / STARTUP) /2 FIELD IS OWNED BY AN INACTIVE BG, AND IT IS NOT ITS / INSTRUCTION OR DATA FIELD /3 FIELD IS OWNED BY AN INACTIVE BG. /4 OWNER IS NOT IN EMULATION, AND ITS NOT HIS INSTRCTION / OR DATA FIELD. /5 OWNER IS NOT IN EMULATION /6 OWNER (WHICH IS IN EMULATION) IS NOT THE REQUESTOR, / AND THIS IS NOT HIS LOCKED FIELD. /7 THIS IS A LOCKED FIELD, AND NOT MY INSTRUCTION OR / DATA FIELD. / /EACH BG HAS ONE FIELD (MOST OF THE TIME IT'S INSTRUCTION FIELD) /THAT IS 'LOCKED'. THAT MEANS THAT THIS FIELD MAY NOT BE REMOVED /FROM MEMORY IF THAT BG IS IN EMULATION. THIS INSURES THAT DURING /EMULATION ONE FIELD REMAINS IN MEMORY. EMULATORS MAY CHANGE /THE LOCK FIELD BY REQUESTING ANOTHER FIELD IN MEMORY. AFTER /AN INCORE REQUEST, THE NEW FIELD IS THE LOCK FIELD OF THAT BG. /FIELDS WITH OWNER=-1 ARE NEVER USED. THIS MAKES IT POSSIBLE TO /EXCLUDED CERTAIN FIELDS (EG. IN CASE OF HARDWARE TROUBLES) OR /TO LOCK A FIELD FOR SOME TIME SO THAT IT CAN BE USED BY A /FORGROUND TASK EG. FOR BUFFERING PURPOSE. IN THAT CASE THE /(EMULATOR TASK SHOULD PROCEED AS FOLLOWS: /FIRST REQUEST A FIELD IN MEMORY (EG. USERS FIELD 7) BY /AN 'INCORE' REQUEST. THEN STORE A -1 IN THE OWNER FIELD OF /THAT (REAL) FIELD NUMBER IN BSTAB. WHEN THE TASK IS FINISHED, /IT SHOULD RETORE THE CONTENTS OF THE OWNER FIELD IN BSTAB. /NOTE THAT THE BG CAN EXECUTE NORMALLY DURING THE TIME THIS /THIS FIELD IS LOCKED IN MEMORY. /THE FOLLOWING PARAMETERS CAN BE ALTERED TO TUNE THE SYSTEM /FOR SPECIFIC APPLICATIONS: SLICE1=DGNTICK^2%12 /DURATION OF SHORT SLICE: .4 SECONDS /(NOTE THAT EACH PAGEFAULT HAS A PANELTY /OF .1 SECOND) SLICE2=DGNTICK^1 /DURATION OF LONG SLICE: 5 SECONDS / NOSWER=1 /DO NOT ACCEPT SWAP ERRORS LGMASK=INACTIVE BGSTOP BGERR SWPERR SHMASK=LGMASK LONG SLICE, "B^100+"S&3777 /NAME IS "BS" (BACKGROUND SCHEDULER) 1000+100 /FOUR PAGES, NO CONNECTS; AUTO-START XBSSWAP,BSSWAP XBSTAL, BSTAL XBSCOUN,BSCOUNT XKICK, KICK BSTEMP, 0 BS, CDF 10 /DF=10 MOST OF THE TIME /HERE WE WILL SELECT A NEW BG TO RECIEVE THE BLESSING OF THE CPU. IFNDEF SINGL8 < /OUR FIRST TRY IS FOR BG'S WITH A CLEAR CONCIOUS (AND LONG-BIT). /IF NONE IS AVAILABLE, WE LOOK WHETHER THE LAST ACTIVE LONG BG HAS /ANY CREDIT LEFT. IF THAT IS NOT THE CASE THEN WE MAKE A FULL /SCAN FOR A LONG BG. NOTHING ? THEN WE SIT AND WAIT FOR AN EVENT: /THERE IS NOTHING WE CAN DO. BSNEXT, CLA CDF 0 // TAD I (SJOB //START SCANNING AT CURRENT JOB+1 CDF 10 / JMS BSCAN /LOOK FOR INTERACTIVE JOBS (LONG=0) SHMASK CDF 0 // TAD I (LJOB // CDF 10 / JMS DEFER /GET STATUS AND BLGMSK /RUNNABLE ? SZA CLA JMP BSNXT1 /NO, SELECT OTHER LONG BG TAD X TAD (UCOUNT DCA TSTZ TAD I TSTZ /GET HIS COUNTER SPA CLA /ANY CREDIT LEFT ? JMP BSFOUND /YES; H'S THE BOY BSNXT1, CDF 0 // TAD I (LJOB //START SCANNING AT LAST LONG BG+1 CDF 10 / JMS BSCAN /LOOK FOR ANY LONG BG BLGMSK, LGMASK JMP HANG /END IFNDEF SINGL8 > IFDEF SINGL8 < BSNEXT, CLA /FOR SINGL8 WE MAINTAIN TAD (BGDATA /STRICT PRIORITY OF THE ATTACHED TAD (UKB /BACKGROUND OVER THE DETACHED BG. JMS DEFER / SNA CLA /IS THIS THE ATTACHED ONE ? TAD (UEND /NO, MUST BE THE SECOND ONE TAD X / TAD (-UKB /FETCH THE STATUS OF THE ATTACHED BG JMS DEFER /GET HIS STATUS AND (LGMASK /IS HE RUNNABLE SNA CLA /RUNNABLE ? JMP BSFOUND /IF YES, HE'L BE SELECTED TAD X /IF NOT, CHECK THE DETACHED BG TAD (UNEXT / JMS DEFER / JMS DEFER / AND (LGMASK / SNA CLA /RUNNABLE ? JMP BSFOUND /YES JMP HANG /NO, NOTHING TO BE RUN NOW BLGMSK, LGMASK / > TSTZ, 0 /ULTIMATE TEST ROUTINE, NEVER RETURN ACM1 DCA I (BSFLAG HANG, JMS MONITOR /NOTHING TO DO, WAIT FOR NEW EVENTS WAIT RELEASE BSSLOT JMP BSNEXT /GO AND SEE WHAT HAPPENED IFNDEF SINGL8 < BSCAN, 0 DCA X /REMEMBER THIS TAD (-BGMAX /SET UP COUNTER # OF BG'S DCA ZTEM7 /COUNTER BSCAN1, TAD X TAD (UNEXT JMS DEFER JMS DEFER /GET STATUS OF NEXT BG CDTOIF // AND I BSCAN // CDF 10 SNA CLA JMP BSFOUND ISZ ZTEM7 /IS ROBIN ROUND ? JMP BSCAN1 /NO ISZ BSCAN JMP I BSCAN /YES RETURN > BSFOUND,TAD I X AND (LONG SNA CLA /WAS HE LONG ALREADY ? TAD (-SLICE1 /NO, HE EARNS A SHORT SLICE DCA SLICE / TAD X /FOUND A RUNABLE BG CDF 0 // DCA I (SJOB //THIS IS THE NEW SJOB CDF 10 / JMS I XKICK /LOOK FOR INCORE REQUESTS NOP CDF 0 // TAD I (SJOB //RESTORE X CDF 10 / DCA X TAD X TAD C4 /(UFLDS DCA BSTEMP TAD I BSTEMP JMS I XBSSWAP /SWAP HIS INSTRUCTION FIELD IN DCA X TAD I BSTEMP CLL RAL RTL JMS I XBSSWAP /SWAP HIS DATAFIELD IN TAD (UCOUNT CDTOIF // DCA I XBSCOUN //POINTER TO COUNTER OF CURRENT BG ? CDF 10 /HERE WE COME AFTER LOADING A BG. WE WILL GIVE HIM A MINIMUM /TIME IN WHICH HE WILL NOT BE INTERRUPTED BY OTHER BG'S UNLESS /HE MAKES HIMSELF INACTIVE. BSWAT1, TAD SLICE /GET HIS SWAP-IN CREDIT SNA JMP BSWAT2 /NO CREDIT, NO SHORT SLICE SHORT, JMS I XBSTAL JMP ENDSLC /TIMESLICE EXPIRED ! TAD I X /GET HIS STATUS AND BLGMSK SNA CLA /STILL ABLE TO PROCEED ? JMP SHORT /YES, CONTINUE SHORT SLICE JMP BSNEXT /NO, HE'S GONE INACTIVE. SELECT A NEW ONE ENDSLC, CDF 0 // TAD I (SJOB // DCA I (LJOB //THIS IS THE NEW LONG BG TAD I (LJOB // CDF 10 / JMS DEFER /GET HIS STATUS AND (-LONG-1 TAD (LONG /SET HIS LONG BIT DCA I X TAD X TAD (UCOUNT DCA ZTEM1 TAD (-SLICE2 /GIVE HIM A FULL LONG SLICE CREDIT DCA I ZTEM1 JMP BSNEXT /AND SELECT A NEW BG BSWAT2, CDF 0 // TAD I (SJOB // DCA I (LJOB // CDF 10 / JMS I XBSTAL /DO A LONG SLICE OR WHATEVER IS LEFT JMP BSNEXT /END OF LONG SLICE JMP BSNEXT /OTHER EVENT; GO AND SEE WHAT HAPPENED PAGE /PAGE HEADING: YTSTFLD,TSTFLD YNXTFLD,NXTFLD YBSDO, BSDO YTST, TST1 TST2 TST3 TST4 TST5 TST6 TSTZ YBSCTAB,BSCTAB BSSWAP, 0 AND C70 DCA BSVFLD TAD X DCA BSBASE TAD X DCA BASE TAD BSVFLD JMS I YTSTFLD /IS THIS FIELD PRESENT ? JMP BSSW1 /NO, GO LOAD IT TAD I X /YES, THIS IS THE REAL FIELD JMP BSPRES /FIELD IS PRESENT, QUICK RETURN. /HERE FOLLOWS THE CRITICAL ALGORITHM RESPOSIBLE FOR THE /SELECTION OF A REAL MEMORY FIELD TO BE SWAPPED. BSSW1, TAD (JMS I YTST DCA JMSTST /INDEXED INSTRUCTION BSSW2, TAD (-BGFLDS /SETUP COUNTER TO SCAN ALL BACKGROUND CORE DCA ZTEM1 / TRYNXT, JMS I YNXTFLD /GET NEXT REAL FIELD NUMBER DCA BSRFLD /SEE IF THIS FIELD CAN BE USED TAD BSRFLD CLL RTR RAR TAD (-BGFLD%10!7000+BSTAB+1 DCA BSPNT /INDEX IN MASTER TABLE TAD I BSPNT /FETCH FROM TABLE SNA JMP BSNOSW /FIELD IS FREE, NO SWAP OUT CMA SNA /FIELD LOCKED ? JMP BADFLD /YES CMA AND (0777 /EXTRACT BGOFFSET TAD (BGDATA-1 /ADD BASE OF BG TABLES DCA BSOLDB /PRESENT OWNER TAD I BSOLDB JMSTST, HLT /BECOMES JMS I YTST, YTST+1, ETC. JMP BSGOSW /YES, GO SWAPPING BADFLD, ISZ ZTEM1 /NO, HAVE WE TRIED ALL FIELDS ? JMP TRYNXT /NO, TRY NEXT FIELD ISZ JMSTST /NEXT CRITERION JMP BSSW2 /TRY AGAIN BSGOSW, TAD I BSPNT /ACCESS VIRTUAL FIELD # CLL RTL /EXTRACT VIRTUAL FIELD # RTL / AND C7 / TAD BSOLDB /INDEX IN UFLD-TABLE OF PREVIOUS OWNER TAD (UFLD0 DCA BSSWTM DCA I BSSWTM /ZERO TABLE ENTRY TO SHOW IT'S OUT TAD BSOLDB JMS I YBSCTAB /UPDATE STATUS OF SWAPPED BG TAD I (FRESLT /GET POINTER TO FREE ENTRY IN SWPTAB DCA BSSWTM / TAD I BSPNT /GET VFLD & OFFSET OF LEAVING FIELD DCA I BSSWTM / AC4000 TAD BSRFLD /FUNCTION FOR DTV IN AC JMS I YBSDO /CALL BSDO WHICH COMPUTES BLOCK NUMBER SZA CLA /SWAP ERROR ? IFNDEF NOSWER < ISZ I BSOLDB /YES, SET HIS SWPERR BIT > IFDEF NOSWER < JMP .-4 /TRY AND TRY > BSNOSW, TAD BSVFLD /GET VIRTUAL FIELD # BSW /INTO BITS 0-2 TAD BSBASE TAD (-BGDATA+1 /OFFSET TO USER TABLES IN BITS 3-11 DCA I BSPNT /= NEW OWNER ID & VFLD TAD (SWPTAB-1 / DCA BSSWTM /SET POINTER BSLOOP, ISZ BSSWTM TAD I BSSWTM CIA TAD I BSPNT SZA CLA /WAS THIS THE SOUGHT FOR FIELD? JMP BSLOOP /NO TAD BSSWTM DCA I (FRESLT /POINTER TO SLOT THAT WILL BE FREE IN A MOMENT TAD BSRFLD /SETUP DTV FOR 4K READ JMS I YBSDO /AND CALL BSDO WHICH COMPUTES DISK BLOCK NUMBER SZA CLA /SWAP ERROR ? IFNDEF NOSWER < ISZ I BSBASE /SWPERR=1 ! > IFDEF NOSWER < JMP .-3 /TRY ETERNALLY > DCA I BSSWTM /NOW FREE SLOT IN SWPTAB (DOUBLE ENTRIES?) TAD BSVFLD / CLL RTR / RAR /GET VIRTUAL FIELD NUMBER IN 9-11 TAD (UFLD0 TAD BSBASE DCA X TAD BSRFLD DCA I X /PUT REAL FIELD NUMBER IN USERS TABLE SKP BSPRES, DCA BSRFLD TAD BSBASE JMS I YBSCTAB /UPDATE STATUS OF NEW BG TAD BSBASE JMP I BSSWAP BSSWTM, 0 BSVFLD, 0 /VIRTUAL FIELD (NEW) BSRFLD, 0 /REAL FIELD BSBASE, 0 BSOLDB, 0 BSPNT, 0 PAGE /PAGE HEADER: ZBSRFLD,BSRFLD ZBSSWAP,BSSWAP ZBSDTV, BSDTV ZBSBASE,BSBASE ZTSTFLD,TSTFLD /0 BSTAL, 0 SNA /SETUP OR RESUME WAITING TAD I BSCOUNT SMA /CREDIT OR BONUS ? TAD (-SLICE2 /WAS BONUS, COMPUTE NEW CREDIT SMA /BONUS LARGER THAN CREDIT ? ACM1 /YES, FIX CREDIT AT .1 SECOND DCA I BSCOUNT BSTA1, ACM1 JMS MONITOR WAIT BSSLOT TAD M2 SZA CLA /TIMEOUT? OR SIGNAL FROM EMULATORS? JMP BSSIGN /SIGNAL TAD I (BJOB /GET REALY EXECUTING BG BSTA2, CDF 0 //SJOB IS IN FIELD 0 SNA //IF NO-ONE EXECUTING, CHARGE TAD I (SJOB //THE SHORT JOB CDF 10 /RESET DF TAD (UCOUNT / DCA BSCOUNT /HE IS TO PAY ISZ I BSCOUNT /JUST A CLOCK TICK. THE LAST ONE ? JMP BSTA1 /NO, SLICE NOT YET DONE JMP I BSTAL /YES, SLICE EXPIRED, 1ST RETURN BSSIGN, JMS KICK /LOOK FOR INCORE-REQUEST SJOB JMP BSTA2 /OK, CONTINUE HIS SLICE ISZ BSTAL /NO, NO FIELD REQUEST BY SJOB JMP I BSTAL /FIND OUT WHAT'S GOING ON (2ND RETURN) KICK, 0 /ROUTINE TO HANDLE INCORE REQUESTS CDF 0 // TAD I (SJOB //ONLY LOOK FOR INTERACTIVE JOB !! CDF 10 / JMS DEFER /GET STATUS WORD AND (INCORE+INCFLD /REQUEST BIT +VIRTUAL FIELD NNUMBER SNA /ANNY REQUEST PENDING ? JMP KICK1 /NO, TAKE SKIP RETURN JMS I ZBSSWAP /YES, GET THAT FIELD IN CORE JMS DEFER /RETURN WITH BASE IN AC AND (INCFLD /GET VIRTUAL FIELD REQUESTED MQL AC0002 /(USC TAD X DCA ZTEM7 /POINTER TO USC TAD I ZTEM7 AND C7700 /CLEAR PREVIOUS LOCK FIELD MQA /SET NEW LOCK FIELD DCA I ZTEM7 / TAD I X /GET STATUS AND (-EMULATE-INCORE-INCFLD-1 /CLEAR REQUEST BITS TAD (EMULATE /SET EMULATE TO LOCK THIS FIELD IN CORE DCA I X TAD X TAD (USLOT JMS DEFER DCA BSUSLOT /KICK THE SLOT WHERE HE IS WAITING CDTOIF // TAD I ZBSRFLD //RETURN REAL FIELD # AS STATUS CDF 10 / JMS MONITOR SIGNAL BSUSLOT, 0 SKP CLA KICK1, ISZ KICK JMP I KICK BSCTAB, 0 /COMPUTE 'ONDISK'-BIT DCA BASE AC0004 /(UFLDS TAD BASE DCA ZTEM3 TAD I ZTEM3 CLL RTL RAL /GET DATA FIELD BITS IN 6-8 JMS I ZTSTFLD /IS THIS FIELD PRESENT ? JMP BSCTA1 /NO GO ! TAD I ZTEM3 /ZTEM3 POINTS TO UFLDS JMS I ZTSTFLD /IS INSTRUCTION FIELD PRESENT ? BSCTA1, STL TAD I BASE AND (-ONDISK-1 SZL TAD (ONDISK DCA I BASE DCA I (BJOB /MAKE SURE MMU IS RELOADED JMP I BSCTAB BSDO, 0 /CALL SYSTEM DRIVER FOR 4K TRANSFER DCA BSDTV /CALLED WITH FUNCTION IN AC TAD I (FRESLT TAD (-SWPTAB /CONVERT INDEX TO BLK # CLL RTL RTL / 20 BLOCKS FOR 4K TAD I (BSTAB /ADD BEGIN OF SWPFIL.M8 DCA BSDTV+2 /STORE BLK # IN READ REQUEST CDTOIF // TAD ZBSDTV //POINTER TO BSDTV JMS MONITOR // CALL // "S^100+"Y&3777// JMP .-3 //WE SHURELY WANT HIM DCA .+3 //EVENT # FOR COMPLETION JMS MONITOR // WAIT // 0 // CDF 10 / JMP I BSDO /RETURN WITH COMPLETION STATUS IN AC BSDTV, ZBLOCK 3 /4K TRANSFER VECTOR BSCOUNT,BGDATA+UCOUNT /POINTER TO UCOUNT OF CURRENT BG PAGE /PAGE HEADER: QBSOLD, BSOLDB QBSPNT, BSPNT QBSBASE,BSBASE /0 TSTOWN, 0 /SKIP IF NOT OWN FIELD CDTOIF // CLA // TAD I QBSOLD // CIA // TAD I QBSBASE // CDF 10 / SZA CLA /MY FIELD ? ISZ TSTOWN JMP I TSTOWN TST1, 0 /BLOCKED, NOT I OR D ? AND (LGMASK EMULATE CLL RTL /EMULATE TO LINK SNL SZA CLA JMS TSTID /I OR D ? ISZ TST1 JMP I TST1 TST2, 0 /BLOCKED ? AND (LGMASK EMULATE CLL RTL SZL SNA CLA ISZ TST2 JMP I TST2 TST3, 0 /NOT EMULATE, NOT I OR D ? CLL RTL SNL CLA JMS TSTID SKP JMS TSTOWN ISZ TST3 JMP I TST3 TST4, 0 /NOT EMULATE ? CLL RTL SNL CLA JMS TSTOWN ISZ TST4 JMP I TST4 TST5, 0 /EMULATE, NOT OWN, NOT LOCKED ? JMS TSTOWN /DON'T TOUCH OWN FIELDS SKP JMS TSTLCK /LOCKED ? ISZ TST5 /ONE OF THEM. DON'T TOUCH JMP I TST5 TST6, 0 /SKIP IF LOCKED OR I OR D JMS TSTID SKP JMS TSTLCK ISZ TST6 JMP I TST6 TSTLCK, 0 /SKIP IF NOT LOCKED CDTOIF // CLA CLL // TAD I QBSPNT // DCA ZTEM6 //POINTS TO BSTAB ENTRY TAD I QBSOLD // TAD (USC // DCA ZTEM7 //POINTS TO LOCKED FIELD BITS CDF 10 / TAD I ZTEM6 BSW /GET VFIELD IN 6-8 AND C70 /GUESS WHY!! CIA TAD I ZTEM7 /COMPARE WITH LOCK FIELD AND C70 /LOCKED FIELD SZA CLA ISZ TSTLCK JMP I TSTLCK TSTFLD, 0 /ENTER WITH VIRTUAL FIELD NUMBER IN 6-8 AND C70 CLL RTR RAR TAD (UFLD0 TAD BASE /INDEX IN FIELD TABLE OF CURRENT BG JMS DEFER SZA CLA /FIELD PRESENT ? ISZ TSTFLD /YES, SKIP JMP I TSTFLD TSTID, 0 /SKIP IF FIELD IS NOT I OR D CDTOIF // CLA CLL // TAD I QBSPNT // DCA ZTEM6 //POINTS TO OF BSTAB ENTRY TAD I QBSOLD // TAD (UFLDS // DCA ZTEM7 //POINTS TO UFLDS OF OWNER CDF 10 / TAD I ZTEM6 BSW /GET VFIELD IN 6-8 AND C70 /FORCE CARRY TO 8 CIA TAD I ZTEM7 /COMPARE VFIELD WITH INSTRUCTION FLD AND C70 /GET VIRTUAL INSTRUCTION FIELD SNA CLA /EQUAL ? JMP I TSTID /YES, QUIT TAD I ZTEM6 / CLL RTL / RTL /GET VFIELD IN 9-11 CIA / TAD I ZTEM7 /COMPARE WITH DATA FIELD AND C7 /DATAFIELD SZA CLA /EQUAL ? ISZ TSTID /NO: SKIP JMP I TSTID NXTFLD, 0 /ROUTINE TO COMPUTE NEXT REAL CORE FIELD # TAD CURFLD /GET THE CURRENT FIELD CMA TAD (BGFLDS CIA SZA TAD (BGFLDS /WRAP AROUND DCA CURFLD TAD CURFLD CLL RTL RAL /RESULT IN 6-8 TAD (BGFLD /ADD OFFSET JMP I NXTFLD /RETURN CURFLD, 0 $