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) ; INPUT MESSAGE LAST ENTRY (QUEUE) ; NO. MESSAGES OUT (WORD) ; OUTPUT MESSAGE QUEUE START ; OUTPUT MESSAGE QUEUE TAIL ; ADDRESS OF MESSAGE IN COUNT COPY IN TASK SPACE ; ADDRESS OF MESSAGE OUT COUNT COPY IN TASK SPACE ; ;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 ; ;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 ;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. .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 NZSTAT=0 .MACRO TCB NAM,STAT,START,STACK,SEG,CPU,BUS,SIZ,PL,MP,MSZ .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 .RAD50 /NAM/ .BYTE 0,STAT .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 200. ;DEFAULT STACK 200 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 ..$$=. .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 .+16 ;TOA ADDRESS .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 (OLD SPARE) .WORD 0 ;VALUE OF TIMER AT ABORT (OR 0 IF NO TASK TIMEOUT) .WORD 0 ;TASK STATUS BYTE AT AST ENTRY OR 0. .WORD 0 ;ADDRESS OF NAME BLOCK (MX.NML ENTRY) IF NONPERMANENT ;TASK .WORD 0,0 ;DIRECTIVE PRIVILEGE MASK. A 1 BIT MEANS THAT THE ;CORRESPONDING TRAP NUMBER IS PROHIBITED TO A TASK. ;(HOWEVER, CERTAIN TRAPS ARE ALWAYS LEGAL). .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 .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 ;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 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 MX.TBL: TCB AAA,0,AAA,,,CPU.ID,,40,AAAPOL,,1 TCB BBB,0,BBB,,,CPU.ID,,40,BBBPOL,,1 TCB CCT,0,CCT,,,CPU.ID,,40,CCTPOL,,1 TCB DDD,0,DDD,,,CPU.ID,,40,DDDPOL,,1 TCB EEE,0,EEE,,,CPU.ID,,40,EEEPOL,,1 ;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. TCB KBA,4,KBT,,,CPU.ID,,40,KBTPOL,,1 ;FIXED CONSOLE TASKS TCB KBB,4,KBT,,,CPU.ID,,40,KBTPOL,,1 ;FIXED CONSOLE TASKS TCB KBC,4,KBT,,,CPU.ID,,40,KBTPOL,,1 ;FIXED CONSOLE TASKS ; 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 .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 .END