M.MMP=0;THIS IS A MULTIPROCESSOR MONITOR! ; STANDALONE MSX IS CONDITIONED IF $$DOS AND NODOS BOTH DEFINED. .IF DF,$$DOS .IF DF,NODOS SAXCL=0 .ENDC .ENDC ; ; STL AND OTHER TASK RELATED TABLES FOR MSX0 ; ; SET UP FOR ALL VERSIONS (INCLUDING MULTIPROCESSOR VERSIONS) ; ; CONDITIONAL "M.MMP" DEFINED MEANS MULTIPROCESSOR. THIS IMPLIES ;1. 8 MORE WORDS USED FOR RSX VERSION STL AND EXTRA 8 WORDS USED FOR S/A ; VERSION. THE STL POINTS THEN TO 4 MORE BLOCKS, VIZ: ; a. SPAWN TABLE. This table contains caller STL address and the ; called tasks' STL addresses (for up to 15 spawned tasks). These will ; support the new SPAWN directive which supplements the REQUEST direct- ; ive and provides a hierarchical task structure. ; b. AST CONTROL AREA. This table contains AST listheads and counts ; for ASTs arising from incoming messages and from exit-with-status ; of spawned tasks. These nodes are picked from a system pool and have ; 8 words each (of which 5 are presently to be used), and are returned ; as they are de-queued. The pool is maintained via a bitmap that is ; cleared at startup. The AST control area is itself 8 words long ; and permanently allocated. ; c. SCRATCH AREA CONTROL. The messages for each task are contained in ; a scratch area in the task's address space. The scratch area control ; block has data controlling the bitmaps in kernel space and the ; message storage area in task space, known as the message scratch ; area. The data are copied to the task area and the task is ; given pointers to the data. This simplifies buffer allocation ; for messages, since each task will have some idea of how much space ; it needs. ; Scratch area nodes are maintained by bitmap logic with the map in the ; TCB area, as well as the pool. The pointers to these structures ; are in kernel space and the map must be an integral number of words ; long. A bit map control block has format as below. Bitmap and pool ; lengths must match. ; d. MESSAGE QUEUE BLOCK. This block contains the count of input and ; output messages for the task, the listheads for the messages, and ; addresses in task space for a copy of the input and output message ; counts (to be maintained by the system for use as event variables). ; ; THE ADDITIONAL ENTRIES TO THE STL ARE: ; BYTE CPU NUMBER (0-255) OF TASK ; BYTE BUS NUMBER (0-255) OF CPU-TASK COMBINATION ; WORD STATUS (RETURN FROM SPAWNED TASKS) ; WORD MESSAGE QUEUE BLOCK ADDRESS ; WORD AST ENTRY CONTROL BLOCK ADDRESS ; WORD SPAWN TABLE ADDRESS ; WORD ERROR ENTRY ADDRESS (OR 0) (ENTER HERE AT TASK ABORT) ; WORD SCRATCH AREA CONTROL BLOCK ADDRESS. ; WORD KERNEL EVENT VARIABLE (FOR SPAWN) ADDRESS .IF DF,M.MMP ;DEFINE TCB OFFSETS FOR TCB EXTENSIONS .IF NDF,SAXCL TCBBAS=8.+8. ;START TCB OFFSET FOR NON-S/A SYSTEMS .IFF TCBBAS=24.+24. .ENDC .GLOBL TCBCPU,TCBBUS,TCBSTT,TCBMQB .GLOBL TCBAQB,TCBSPW,TCBSCB,TCBKEV .GLOBL TCBABO TCBCPU=TCBBAS TCBBUS=TCBCPU+1 TCBSTT=TCBBAS+2 ;STATUS WORD TCBMQB=TCBBAS+4 ;MSG QUEUE BLK ADR TCBAQB=TCBBAS+6 ;AST ENTRY BLK ADDR TCBSPW=TCBBAS+10;SPAWN TBL BLK ADDR TCBABO=TCBBAS+12;ERROR ENTRY ADDRESS TCBSCB=TCBBAS+14;SCRATCH CTL BLK ADDR TCBKEV=TCBBAS+16;KERNEL EV ADDR WORD .ENDC .GLOBL MODFLG,TBLMX,MODMAX ;MODFLG IS A TABLE OF OFFSETS WITHIN A TCB ENTRY. 200 BIT MEANS A BYTE ;ENTRY. 1 BIT MEANS A TABLE POINTER. ; ;These entries follow the format of a TCB entry and may be used as a handy ;reference if desired for the TCB contents. ; MODFLG: .WORD 0 ;TSK NAME .BYTE 200,200 ;TSK PRI/STATUS .WORD 0 ;START ADDR .WORD 0 ;SP .WORD 0 ;DYNAMIC SP .WORD 0 ;SEGMENT NAME .WORD 1 ;APR TABLE .WORD 1 ;EV ADDR .IF DF,SAXCL .BLKW 16. ;DYNAMIC REGS, PS, PC .ENDC .BYTE 200,200 ;CPU/BUS .WORD 0 ;STATUS WORD .WORD 1 ;MSG QUEUE BLK ADDR .WORD 1 ;AST BLK ADDR .WORD 1 ;SPAWN BLK ADDR .WORD 0 ;ERROR AST ENTRY .WORD 1 ;SCRATCH CTL BLK .WORD 1 ;KNL OR CALLER TSK EV ADDR DELT=0 .IIF DF,$FPU$,DELT=54. .IF DF,SAXCL TBLMX=40+DELT MODMAX=102+DELT .IFF TBLMX=40+DELT MODMAX=42+DELT .ENDC M.NTSK=0 ;NUMBER OF TASKS MAX ; ; FORMATS OF THE ADDITIONAL BLOCKS: ; ;QUEUE BLOCK: ; NO. MESSAGES IN (WORD) ; INPUT MESSAGE FIRST ENTRY (QUEUE) (UNUSED) ; INPUT MESSAGE LAST ENTRY (QUEUE) (UNUSED) ; NO. MESSAGES OUT (WORD) ; OUTPUT MESSAGE QUEUE START (UNUSED) ; OUTPUT MESSAGE QUEUE TAIL (UNUSED) ; ADDRESS OF MESSAGE IN COUNT COPY IN TASK SPACE OR 0 ; ADDRESS OF MESSAGE OUT COUNT COPY IN TASK SPACE OR 0 ; ;SPAWN TABLE: ; CALLER TASK STL ADDRESS ; CALLED TASK STL ADDRESS #1 (0 IF EMPTY) ; CALLED TASK STL ADDRESS #2 (0 IF EMPTY) ; . ; . ; . ; CALLED TASK STL ADDRESS #15 (0 IF EMPTY) ; ;SCRATCH AREA CONTROL: ; PERMANENT BITMAP CONTROL BLOCK ADDRESS ; WORKING BITMAP CONTROL BLOCK ADDRESS ; STARTING NODE ADDRESS IN TASK (LIST HEADER A) ; ENDING NODE ADDRESS IN TASK (LIST HEADER B) ; SPARE FOR CLOCK COUNTER (BUMPED EVERY SECOND) ; CLOCK VALUE TO ABORT AT OR 0 IF NO TIMEOUT ; SAVE AREA FOR OLD TASK STATUS DURING AST ; POINTER TO TASK NAMELIST/CLEARANCE BLOCK (SEE MXSUBS) ; TASK DIRECTIVE PRIVS (2 WORDS) (1 BIT MEANS CAN'T DO DIR. N) ; APR ALLOCATION FLAGS (1 WORD) AND APR NOS OF CALLER (2 WDS) ; 4 WORDS SPARES (FOR CORE ALLOCATION) ; ;BITMAP CONTROL BLOCKS ARE OF FORM (BOTH FOR WORKING COPY ADDR'S): ; ;BCB: NODE SIZE IN WORDS PER BIT OF BITMAP ; ADDR OF TOP OF BUFFER ADDRESS ; TOP OF BUFFER ADDRESS (POINTED AT BY PREVIOUS WORD) ; START ADDRESS OF NODE POOL USED (TSK MSG AREA) ; BITMAP START ADDRESS ; BITMAP END ADDRESS ; TOP ADDRESS OF NODE POOL USED ; ;AST CONTROL BLOCK: ; MESSAGE-IN AST ENTRY ADDRESS (OR 0) ; MESSAGE-IN AST NUMBER PENDING AST'S ; MESSAGE-IN AST QUEUE HEAD ; MESSAGE-IN AST QUEUE TAIL ; EXIT-WITH-STATUS AST ENTRY ADDRESS (OR 0) ; EXIT-WITH-STATUS AST NUMBER PENDING AST'S ; EXIT-WITH-STATUS AST QUEUE HEAD ; EXIT-WITH-STATUS AST QUEUE TAIL ; ;AN AST ENTRY HAS THE FORM: ; FORWARD POINTER ; BACKWARD POINTER ; STATUS WORD (FROM EXIT STATUS OR EV ADR IN CALLER FOR MSG IN) ; INFORMATION WORD 1 (MSG ADDR OR TASK NUMBER) ; INFORMATION WORD 2 (MSG BYTE COUNT OR TASK CPU/BUS #) ; PRIORITY OF AST ; MSG DATA HDR ADDR IN USER SPACE (HEADER FROM MSG DATA) ; .IIF DF,TP$ALL,AL$APR=0 .TITLE MX.STL ;SYS TASK LIST FOR MSX0 .GLOBL MX.TBS,MX.CNT .PSECT TCB,RW,CON ;MX.TBS IS SIZE OF A TASK TABLE ENTRY IN BYTES ;MX.CNT IS THE POWER OF 2 TO SHIFT TO MAKE A NUMBER A TCB OFFSET ;MX.TBL AND MX.TBE DEFINE START AND END OF STL THOUGH STL MUST ;STILL TERMINATE WITH A ZERO WORD. .PSECT TCB,RW,CON .IF NDF,SAXCL MX.CNT=5 MX.TBS=40 ;SIZE OF TABLE IN BYTES (MUST BE POWER OF 2) .IFF MX.TBS=100 MX.CNT=6 ;STAND ALONE TABLES HAVE REG, APR SAVE AREA TCBREG=20 ;REG OFFSET IN TCB .ENDC ;NAM=TASK NAME ;STAT=TASK STATUS AT START (USUALLY 4 OR 0 (RUN OR EXITED)) ;START=START ADDR (TASK VIRTUAL) ;STACK=STACK TOP ENTRY (IF NONE, 100 WORDS ALLOCATED) ;SEG=SEGMENT NAME FOR LOAD (RSX VERSIONS..IGNORED ELSEWHERE) ;CPU=CPU NO. (0 ILLEGAL IF ACTIVE) TASK RUNNING IN ;BUS=BUS NO. TASK ACTIVE ON ;SIZ=SIZE OF A NODE POOL ENTRY (SHOULD BE A POWER OF 2) ;PL=NODE POOL START ADDRESS (TASK VIRTUAL) FOR MESSAGE DATA ;MP=BITMAP START ADDRESS (WORD BDY) (MUST BE IN KNL SPACE, DEFAULTED HERE) ;MSZ=NO. WORDS IN BITMAP ;P=DIR PRIV LO ;Q=DIR PRIV HI ;LC=LIST OF CLASSIFICATION DATA IN FORMAT FOR NAMEBLK NZSTAT=0 .MACRO TCB NAM,STAT,START,STACK,SEG,CPU,BUS,SIZ,PL,MP,MSZ,P,Q,LC .IF IDN,STAT,4 ;SOMETHING SHOULD BE RUNNING INITIALLY NZSTAT=NZSTAT+1 .ENDC .IF B,MSZ MMSZ=3 .IFF MMSZ=MSZ .ENDC .PSECT TCB,RW,CON M.NTSK=M.NTSK+1 ;COUNT TASKS IN SYSTEM ..T...=. ;TCB ADDRESS .RAD50 /NAM/ .BYTE 0,STAT .IF GT,M.NTSK-NPERM .IF DIF,STAT,0 .ERROR ;TASK NAM HAS NONZERO STATUS STAT BUT IS NOT PERMANENT .ENDC .ENDC .WORD START .IF NB,STACK .WORD STACK .IFF .PSECT STAK,RW,CON ;DEFAULT STACK ALLOCATION PER TASK. THIS NEEDS TO BE FAIRLY EXTENSIVE ;SINCE MESSAGE AST'S ARE PUT ON IT. 200 IS A GUESS. NOTE THAT THE TOP ;OF THE STACK IS USED BY MSX AND SO MUST ALSO BE RESERVED HERE. THAT IS ;WHY THE "GUARD WORDS" ARE PLACED IN .PSECT STACK. .BLKW 256. ;DEFAULT STACK 256 LONG ..$$=. .WORD 0,0,0,0 ;GUARD WORDS .PSECT TCB,RW,CON .WORD ..$$ .ENDC .WORD 0 ;DYNAMIC STACK .IF B,SEG .WORD 0 .IFF .RAD50 /SEG/ ;SEGMENT NAME .ENDC .IF NDF,AL$APR .WORD 0 .IFF .PSECT IAPRS,RW,CON .EVEN ..$$=. .IF DF,SAXCL .BLKW 8. .IFF .IIF DF,M$GE, .BLKW 6 .ENDC .IIF DF,TP$ALL, .BLKW 4. ;BPT,IOT,EMT,TRAP TASK VECTORS .IIF DF,FPPSAV,$FPU$=0 .IIF DF,$FPU$, .BLKW 27. ;FP STATUS AND AC SAVE AREA ;NOTE SAVES FP INTERRUPT AT 244,246 ALSO. .PSECT TCB,RW,CON .WORD ..$$ .ENDC .WORD 0 ;EV ADDR .IF NDF,M.MMP .IF DF,SAXCL .BLKW 24. ;SPACE FOR REGS, PSW, ETC. .ENDC .IFF ;MULTIPROCESSOR VERSION .IF DF,SAXCL .BLKW 16. ;SPACE FOR REGS, PSW, ETC. .ENDC ;8 WORDS FOR NEW MULTIPROCESSOR STL CONSTRUCTS .IF B,CPU .BYTE 0 ;CPU NUMBER OF TASK .IFF .BYTE CPU .ENDC .IF B,BUS .BYTE 0 ;BUS NUMBER OF TASK (BOTH SET UP AT TASK REQ.) .IFF .BYTE BUS .ENDC .WORD 0 ;STATUS FROM CALLED TASK OR MSG OUT ;QUEUE BLOCK ADDRESS. .PSECT MQBLK,RW $$..=. .BLKW 8. ;QUEUE BLOCK ENTRY .PSECT TCB,RW,CON .WORD $$.. ;ASYNCH ENTRY CONTROL BLOCK ADDRESS .PSECT AQBLK,RW $$..=. .WORD 0 ;AST ENTRY ADDR .WORD 0 ;MSG AST COUNT .WORD . ;QUEUE HEAD .WORD .-2 ;QUEUE TAIL (POINT AT EACH OTHER) .WORD 0 ;EXIT AST ENTRY ADDR .WORD 0 ;EXIT AST QUEUE COUNT .WORD . ;EXIT AST QUEUE HEAD .WORD .-2 ;EXIT AST QUEUE TAIL .PSECT TCB,RW,CON .WORD $$.. ;SPAWN TABLE ADDRESS .PSECT SPWNBK,RW $$..=. .WORD 0,0,0,0 .WORD 0,0,0,0 .WORD 0,0,0,0 .WORD 0,0,0,0 .PSECT TCB,RW,CON .WORD $$.. .WORD 0 ;ERROR ENTRY ADDRESS ;SCRATCH AREA CONTROL BLOCK ADDRESS .PSECT BMCTL,RW .$$..=. ;BITMAP CONTROL BLOCK .WORD SIZ ;16 WORD BLOCKS DEFAULT .WORD MX.TOB ;TOA ADDRESS (FOR IN PLACE USE) .IF NB,PL .WORD PL ;START OF POOL .WORD PL ;START OF POOL (PERM.) .IFF .WORD 0 .WORD 0 .ENDC PSZ=MMSZ*20*2*SIZ ;SIZE OF MSG NODE POOL .IF B,MP .PSECT MBITMP,RW,CON .$$$=. .REPT MMSZ .WORD 0 ;WORK BITMAP .ENDR ..$$$=. .PSECT BMCTL,RW,CON .WORD .$$$ ;MAP START .WORD ..$$$ ;MAP END .IFF .WORD MP ;BITMAP START .WORD MP+MMSZ+MMSZ ;BITMAP END .ENDC .IF B,PL .WORD 0 ;END OF POOL .IFF .WORD PL+PSZ .ENDC .$.$=. ;B.C.B. #2 (WORKING COPY) .WORD 20 ;SIZE=16 WORDS .WORD . ;ADDRESSES NEXT WORD .WORD 0,0,0,0,0 ;SAME AS ABOVE .PSECT SCRARE,RW $$..=. .WORD .$$..,.$.$ .WORD . .WORD .-2 ;LISTHEAD OF NODES .WORD 0 ;TIMER BUMPING ADDRESS, BUMPED EVERY CLOCK TICK .WORD 0 ;VALUE OF TIMER AT ABORT (OR 0 IF NO TASK TIMEOUT) .WORD 0 ;TASK STATUS BYTE AT AST ENTRY OR 0. .IF GT, .WORD 0 ;ADDRESS OF NAME BLOCK (MX.NML ENTRY) IF NONPERMANENT ;TASK .IFF .PSECT MX.NMS,RW,CON .$$=. NAMSZ=46 ;LENGTH OF A NAME BLOCK IN BYTES (INCLUDES CLASSIFICATION) ;FILL IN NAMEBLK WITH INFO IN LIST LC IN CALL IF THE LIST IS THERE. ;OTHERWISE JUST FILL IN WITH BLANKS. .IF B, .BLKB NAMSZ .IFF .RAD50 /NAM/ ;TASK NAME .WORD 0,0 ;NO DISK BLOCK .WORD ..T... ;TCB ADDRESS .WORD 0 ;NO SPECIAL APRS .WORD 2 ;NONZERO TO FLAG TCB EXISTS .WORD 0,0 ;SPARES ;REMAINING WORD FORMATS ARE ; .WORD CLASSIF_PRIV ; .WORD DEFAULT_CLASSIF ; .WORD CLASSIF/1ST SPEC CAT ; .BLKW 7 ;OTHER SPECIAL CLASSES, 1/ BYTE ;THESE MUST BE SUPPLIED IN A LIST AS ARG LC. CLS'NAM:: ;DEFINE GLOBAL START OF CLASSIFICATION AREA .IRP XX, .WORD XX .ENDR .=.$$+NAMSZ ;BE SURE OF ENTRY LENGTH .ENDC ; .EVEN .$BCTL=. .IF B, .=.$$ .RAD50 /NAM/ ;TASK NAME .WORD 1,0 ;DUMMY DISK BLK .WORD ..T... ;TCB ADDRESS .WORD 1 ;1 APR (DUMMY REALLY) .WORD 0 ;DUMMY .WORD 0,0 ;DUMMY SPARES (THIS BLK SHOULD MATCH MX.NML!!!) .WORD 0,0 ;INFINITE PRIV FOR PERM TASKS DEFAULT .WORD -1 ;CLASSIFICATION NEG==DO ANYTHING OK .BLKW 7 ;NO SPEC CATEGORIES NEEDED. .WORD 0,177 ;LO/HI CLASSIF. (IGNORED HERE) .$BCTL=. .ENDC ;B,LC .=.$BCTL .PSECT SCRARE .WORD .$$ ;ADDRESS OF NAME BLOCK FOR PERM. TASKS .ENDC ;DIRECTIVE PRIVILEGE MASK. A 1 BIT MEANS THAT THE ;CORRESPONDING TRAP NUMBER IS PROHIBITED TO A TASK. ;(HOWEVER, CERTAIN TRAPS ARE ALWAYS LEGAL). .IF GT,M.NTSK-NPERM PRMSK=177777 .IFF PRMSK=0 .ENDC .IF B,P .WORD PRMSK ;LO DIRECTIVE PRIVS .IFF .WORD P .ENDC .IF B,Q .WORD PRMSK ;HI DIR PRIVS .IFF .WORD Q .ENDC .WORD 0 ;FLAGS FOR TASK. BIT 0=FLAG THAT SOME APRS ARE COPIED ;FROM REQUESTOR. .WORD 0,0 ;4 BYTES OF APR NUMBERS TO COPY FROM THE CALLER. ;NOTE ONLY INITIAL APRS WILL BE COPIED. BOTH TASKS MUST REMAP TO MAINTAIN ;LARGER SHARED AREAS. .WORD 0,0,0,0 ;RESERVED FOR CORE ALLOCATION ;SAVE AREAS FOR TCBEVA DURING ASTS. OFFSET 42 AND 44 ARE FOR EXIT AND MSG AST .WORD 0,0 .PSECT TCB,RW,CON .WORD $$.. ;SCRATCH AREA ADDR .WORD 0 ;SPARE STL SLOT (EV ADDRESS FOR CALLER NOTICE) .ENDC .ENDM .PSECT TCB,RW,CON .GLOBL MX.TBL .IF DF,SAXCL ;STANDALONE ONLY .GLOBL KNLSTK ; .MACRO TCB NAM,STAT,START,STACK,SEG,CPU,BUS,SIZ,PL,MP,MSZ,P,Q,C ;NAM=TASK NAME ;STAT=TASK STATUS AT START (USUALLY 4 OR 0 (RUN OR EXITED)) ;START=START ADDR (TASK VIRTUAL) ;STACK=STACK TOP ENTRY (IF NONE, 100 WORDS ALLOCATED) ;SEG=SEGMENT NAME FOR LOAD (RSX VERSIONS..IGNORED ELSEWHERE) ;CPU=CPU NO. (0 ILLEGAL IF ACTIVE) TASK RUNNING IN ;BUS=BUS NO. TASK ACTIVE ON ;SIZ=SIZE OF A NODE POOL ENTRY (SHOULD BE A POWER OF 2) ;PL=NODE POOL START ADDRESS (TASK VIRTUAL) FOR MESSAGE DATA ;MP=BITMAP START ADDRESS (WORD BDY) (MUST BE IN KNL SPACE, DEFAULTED HERE) ;MSZ=NO. WORDS IN BITMAP ;P=DIR PRIV LO ;Q=DIR PRIV HI ;C=LIST OF CLASSIFICATION DATA IN FORMAT FOR NAMEBLK ; KNLTCB: TCB $$$,0,0,KNLSTK,,CPU.ID,,40,0,,2 ;FAKED UP TCB FOR KNL MODE THAT ;MUST IMMEDIATELY PRECEDE REAL STL .GLOBL KNLTCB .ENDC ; .MACRO TCB NAM,STAT,START,STACK,SEG,CPU,BUS,SIZ,PL,MP,MSZ,P,Q,C NPERM=8. ;NO. "PERMANENT" TASKS. IN LIST ;LISTS OF CLASSIF PRIVS: ;WD.1: PRIV MASK. 100000=IGNORE. 37=MLS OK, 360=MLS NG,7400=IGN MLS ;WD.2: DEFAULT CLASSIF ;WD.3: CLASSIF/SPECIAL CATEGORIES ;WD.4 ON: MORE SPECIAL CATEGORIES IF PRESENT MX.TBL: TCB AAA,0,AAA,,,CPU.ID,,40,AAAPOL,,1,,,<100000,3,0> TCB BBB,0,BBB,,,CPU.ID,,40,BBBPOL,,1,,,<100017,2,0> TCB CCT,0,CCT,,,CPU.ID,,40,CCTPOL,,1,,,<100777,1,0> TCB DDD,0,DDD,,,CPU.ID,,40,DDDPOL,,1,,,<100017,3,0> TCB EEE,0,EEE,,,CPU.ID,,40,EEEPOL,,1,,,<100017,3,0> ;NOTE: CONSOLE TASKS WITH THIS DEMO ARE NAMED RAD50 KBA,KBB,KBC, ETC ;AND THERE SHOULD BE ONE FOR EACH CPU. CPU 1 HAS KBA, CPU 2 HAS KBB, AND ;SO ON. THESE ARE AUTOMATICALLY SELECTED AND ONLY ONE WILL BE ;ACTIVE AFTER THE STARTUP GETS DONE. ;SET UP CPU 1 CONSOLE WITH ALL MLS PRIVS TO DO ANYTHING. ;CPU 2 CONSOLE AND CPU3 CONSOLE ARE CONSTRAINED. TCB KBA,4,KBT,,,CPU.ID,,40,KBTPOL,,1,,,<167777,4,3> TCB KBB,4,KBT,,,CPU.ID,,40,KBTPOL,,1,,,<100777,3,2> TCB KBC,4,KBT,,,CPU.ID,,40,KBTPOL,,1,,,<100017,3,2> ; TCB SLV,0,SLAVE,,,CPU.ID,,100,SLVPOL,,2 ; TCB TIM,0,TIMER,,,CPU.ID,,100,TIMPOL,,2 ; TCB KBT,4,KBTSK,,,CPU.ID,,100,TIMPOL,,2 .IF DF,DY$MEM TCB ZZZ,0,0,,,0,,0,0,,1 ;SPARE TCB ENTRY TCB ZZZ,0,0,,,0,,0,0,,1 ;SPARE TCB ENTRY TCB ZZZ,0,0,,,0,,0,0,,1 ;SPARE TCB ENTRY TCB ZZZ,0,0,,,0,,0,0,,1 ;SPARE TCB ENTRY TCB ZZZ,0,0,,,0,,0,0,,1 ;SPARE TCB ENTRY .ENDC ;DY$MEM .GLOBL MX.TBE ;END OF TABLE ADDR MX.TBE: .WORD 0,0 .IF EQ,NZSTAT .PRINT ; ** WARNING ** NO TASK HAS RUNNING STATUS INITIALLY. .ENDC ; CPU.PR TABLE INDICATES NUMBERS OF TASKS ACTIVE ON EACH CPU AT ; A TIME. IT IS MAINTAINED AS A CRUDE INDEX OF AVAILABILITY ; OF THE SYSTEMS TO NEW TASKS AND IS INDEXED BY CPU NUMBER. NCPU=7 ;NUMBER OF CPU'S IN TOTAL SYSTEM .GLOBL CPU.PR .WORD 0 CPU.PR: .WORD 0 .REPT NCPU .WORD 0 .ENDR ; MX.USG MUST BE SET UP SUCH THAT EVERY TASK NOT HAVING A ; ZERO ENTRY FOR ITS INTIAL STATUS HAS A BIT SET TO 1 ; INITIALLY IN ITS WORD. EACH WORD REPRESENTS 16 TASKS ; WITH THE HIGH BIT REPRESENTING THE FIRST TASK OF THE ; 16, THE NEXT HIGHEST THE NEXT BIT, AND SO ON. ; IT IS NEEDED ONLY WHERE "PRLVLS" IS DEFINED. .IF DF,PRLVLS .GLOBL MX.USG ;TASK USAGES MASKS MX.USG: .WORD 40000,0,0,0,0 ;ROOM IN TBL FOR 56 TASKS HERE .ENDC .IF DF,VARPRI ;IF TASKS MAY HAVE VARIABLE PRIORITY ;IF THERE MAY BE VARIABLE TASK PRIORITY, THE TABLE MX.PRL WILL BE A ;DOUBLE ENDED QUEUE USED TO SCAN THE TASK TABLE. IT IS EXPECTED THAT ;THIS TABLE MAY NOT BE IN SHARED MEMORY; THERE WILL BE NO INTERLOCKS ;TO GUARANTEE THAT IT IS ACCESSED BY ONLY 1 CPU AT A TIME. THE STL ;WILL BE UNTOUCHED; POSITION IN THE PRIO LIST IS DETERMINED BY ;POSITION IN THE STL AND THE PRIO LIST POINTS TO THE STL LOCATIONS. ;INITIAL PRIORITIES ARE PRESET TO THE VALUES FOR SCANNING IN STL ORDER. .GLOBL MX.PRL ;LET OTHERS FIND THIS... .N..=M.NTSK+4 ;PRIORITY TO USE MAX (1ST STL ENTRY) .IF LT,<.N..-255.> .N..=255. ;BUT AT LEAST 255 .ENDC ..N.=MX.TBL ;STL ADDRESS MX.PRL: .WORD .+10 ;POINTER TO NEXT ENTRY .WORD MX.PRN ;POINTER TO LAST ENTRY .WORD ..N. ;TCB (STL) ADDRESS THIS ENTRY ADDRESSES .WORD .N.. ;PRIORITY THIS ENTRY ..N.=..N.+MX.TBS ;UPDATE TCB ADDR .N..=.N..-1 ;LOWER PRIO .REPT M.NTSK-1 ;REPLICATE (EXTRA TIME TO GET END SCAN) .WORD .+10 ;NEXT .WORD .-12 ;LAST .WORD ..N. ;TCB ADDR .WORD .N.. ;PRIO ..N.=..N.+MX.TBS ;UPDATE TCB ADDR .N..=.N..-1 ;LOWER PRIO .ENDR MX.PRN: .WORD MX.PRL ;NEXT=FIRST .WORD .-12 ;LAST .WORD ..N. ;TCB .WORD .N.. ;PRIO .ENDC .IF DF,CMNTCB .PSECT TCB,RW .GLOBL TCBFGS,OWNCPU .BYTE 376,376,376,376 TCBFGS: .REPT M.NTSK .BYTE 376 .ENDR .REPT 6 .NLIST .BYTE 376 .LIST .ENDR .EVEN .WORD 0,0 OWNCPU: .REPT M.NTSK+6 .NLIST .BYTE 0 .LIST .ENDR .ENDC ;RESIDENT LIBRARY LIST ;REFLECTS ANY COMMON LIBRARIES (MUST BE AUDITED CODE IF MLS) IN THE ;SYSTEM. CM.WDS=1 ;WORDS OF CLASSIFICATION DATA +1 .GLOBL LIBLST LB.CNT=2 ;NUMBER OF LIBRARY ENTRIES LIBLST: .REPT LB.CNT .WORD 0 ;LIBRARY NAME, RAD50 .WORD 0 ;BASE ADDRESS. 1 IF PIC LIBRARY. .WORD 0 ;NUMBER TO PUT INTO APR TO MAP THE LIBRARY .WORD 0 ;LIMIT ON SIZE OF LIBRARY (LIMITS ENTRY ADDRS) .WORD 0,0 ;DIRECTIVE PRIVILEGES OF LIBRARY .BLKW CM.WDS LIBSIZ==.-LIBLST .ENDR .WORD 0 ;LIST TERMINATOR. .END