M.MMP=0;THIS IS A MULTIPROCESSOR MONITOR! .TITLE MXTBLS TABLE AREAS FOR MSX ; THIS PROGRAM CONTAINS TABLES AND DEFINITIONS USED BY ; REST OF MSX... ; CONTROL TABLE DEFINITIONS .CSECT MX.CTL .GLOBL MX.TBL ; DEFINED BY USER AS TASK TABLE .GLOBL MX.IAC,MX.SEV,MX.LOK .GLOBL MX.ATL,MX.TCB,MX.OSP,MX.EMT .IF NDF,$$DOS .GLOBL MX.ARC ;SET 0 IF AST RECOGNITION NOT INHIBITED, ;OTHERWISE SET 1 MX.ARC: .WORD 0 ;INITIALLY NO INHIBIT .ENDC MX.IAC: .BYTE -1 ; INTERRUPT ACTIVITY COUNTER MX.SEV: .BYTE -1 ; SIG EVENT FLAG MX.LOK: .BYTE -1,-1 ; LOC WORD MX.HGH: .WORD 0 ;STL ADDR LAST HIGH PRIO TSK ;REQUESTED, NOT EXITED .GLOBL MX.HGH .IF DF,M.MMP .GLOBL MX.CPU,CPU.ID MX.CPU: .WORD CPU.ID .GLOBL MX.BUS MX.BUS: .WORD 0 ;BUS NO. CPU IS ON (MAY BECOME A TBL) .GLOBL MX.CON MX.CON: .WORD 1 ;CONNECTIVITY OF NET .GLOBL M.MSG ;MESSAGE AREA FOR WITHIN-CPU MESSAGES M.MSG: .BLKW 6 ;HDR .BLKW 258. ;DATA .BLKW 40. .IF DF,X$SVC .GLOBL MX.XTN,MX.XNM ;SUPPORT AN EXIT NOTIFY SERVICE TASK BY PROVIDING THESE WORDS WHICH WILL BE ;INCREMENTED WHEN A CPU SEES A TASK EXITING ANYWHERE IN THE SYSTEM. MX.XTN: .WORD 0 ;EXITING TASK NAME MX.XNM: .WORD 0 ;NUMBER OF EXITING TASKS .ENDC .GLOBL MX.ERR MX.ERR: .WORD 0 ;ERROR FLAG .ENDC MX.ATL: .WORD MX.TBL,0 ; TABLE PTR MX.TCB: .WORD 0,0 ; CURRENT TASK POINTER MX.OSP: .WORD 0 ; ORIGINAL STACK POINTER MX.EMT: .WORD 0 ; SAVE FOR EMT CODE .WORD MX.STK ; STAD ; SYSTEM STACK ;NOTE THAT SYSTEMS BUILT UNDER RSX OR IAS NEED NOT ALLOCATE MUCH ;STACK SPACE...THE MSX STACK IS HERE AND NOT WHERE TKB PUTS IT. .GLOBL MX.STK .BLKW 30. ;(EXTRA SPACE FOR GOOD LUCK .. WE USE SP A LOT!) .BLKW 256. ;SYSTEM STACK AREA. ASSUME 256 WORDS IS ENOUGH ;FOR USE NOW. ; TOP WORDS OF STACK ARE DUMMY RTI STUFF ; THAT POINT TO INTERRUPT CODE .IF DF,$$DOS MX.STK: + MX.RTI,340 ; LEVEL 7 .IFF MX.STK: .WORD MX.RTI,340 ;RSX GETS IT AT PRIO 0 .ENDC .WORD 0 ;SAFETY .GLOBL MX.RTI ; INTERRUPT VECTOR SAVE TABLE AREA .IF DF,$$DOS .CSECT MX.IVT .GLOBL MX.IVT,MX.LUT,MX.FSL MX.IVT: + .+2 ; INITAL POINTER .=.+100 ; 32 WORDS ;-- FREE SPACE LIST .CSECT MX.FSL ; FREE SPACE LIST AREA MX.FSL: + N0 ; HEADER WORD FOR LIST N0: + N1 .=.+20. N1: + N2 .=.+20. N2: + N3 .=.+20. N3: + N4 .=.+20. N4: + N5 .=.+20. N5: + N6 .=.+20. N6: + N7 .=.+20. N7: + N8 .=.+20. N8: + N9 .=.+20. N9: + NA .=.+20. NA: + NB .=.+20. NB: .MACRO FSEL ?LBL .WORD LBL .=.+20. LBL: .ENDM .REPT 10 FSEL .ENDR .WORD 0 ;END OF LIST .=.+20. ;HAS 0 AS LINK .ENDC .IF DF,SE$K ;CLASSIFICATIONS OF DEVICES, INCLUDING CLASIFICATION AND ;SPECIAL CATEGORY LIST. CLIST IS 15 BYTES MAX. INDEXED BY LUN. ; TO IMPLEMENT DEVICE OWNERSHIP JUST GIVE DEVICES A SPECIAL ; CATEGORY "DEVICE" AND ALLOW ONLY 1 TASK THAT CATEGORY IN ITS ; CATEGORY LIST. THEN ONLY SUPER PRIVILEGED TASKS OR THE OWNER ; MAY ACCESS THE DEVICE. .GLOBL CLADEV,CLACAT CLADEV: .WORD KBOCP,KBICP,LPCP,0,0,DTCP,0,0 ;POINTERS TO CLASSIF DATA CLACAT: KBOCP: .WORD 1 ;1 UNIT THERE .BLKW 8. ;8 WORDS FOR DATA KBICP: .WORD 1 ;1 KB OUTPUT .BLKW 8. LPCP: .WORD 1 ;1 LP: UNIT .BLKW 8. DTCP: .WORD 3 ;3 DT: UNITS (EACH OF A DIFFERENT CLASSIF.) .BLKW 3*8. .ENDC ; LOGICAL UNIT TABLE .IF DF,$$DOS ;NOTE THAT THE LUNS ARE ACCOUNTED SOMEWHAT DIFFERENTLY FOR RSX SO ;THIS TABLE IS NOT NEEDED...UNLESS USING DOS OR STAND ALONE WITH ;DOS DRIVERS FOR I/O (IN WHICH CASE NEED MXIOHT, VARIOUS IOHT'S, ;AND DOS-11 DEVICE DRIVERS TO DO THE WORK... .CSECT MX.LUT .GLOBL KBOT,KBIN,LP0,CR0,VT0,DT0,MT0,DF0 ; ; THIS TABLE CONTAINS LINKBLOCK POINTERS WHICH CONTAIN DDB POINTERS ;AND I/O QUEUE LISTHEADS (PLUS A LITTLE OTHER JUNK) FOR EACH DEVICE ;KNOWN TO MSX. ; NOTE THAT THE DRIVERS ARE PASSED THE ADDRESS OF THE TCB FOR EACH ;I/O REQUEST AND IT IS THEIR PROBLEM TO FIGURE OUT HOW TO MAP ;MEMORY ADDRESSES FOR DMA, OR TO MAP APRS FOR NON-DMA. THEY RUN ;IN KERNEL MODE AND SPACE AS SEPARATE PROCESSES (A LA DOS-11) ;RATHER THAN TASKS (A LA CLASSIC BSX). THERE IS SOME FANCY FOOTWORK ;NEEDED TO KEEP I/O GOING, NAMELY REQUEUEING ON I/O COMPLETION. ; THERE IS NO TIMER ON I/O HOWEVER (MSX DOES NOT REALLY NEED A CLOCK ;FOR ITS OWN USE), SO SEPARATE CODE IS NEEDED LATER TO FREE UP I/O ;QUEUE ELEMENTS THAT GET TIED UP BY MISSED INTERRUPTS. THESE ;NODES MAY BE JUST PUT BACK INTO THE FREE LIST AND THE LINKBLOCK ;QUEUES CLEARED FOR THE RESULT. THE LINKBLOCK BUSY POINTER AND THE ;DRIVER BUSY POINTERS SHOULD THEN BE CLEARED AS WELL. ; FOR MSX SYSTEMS, A SUBROUTINE MAY BE DEFINED WHICH IS CALLED ;BY THE CLOCK INTERRUPT HANDLER TO TIME OUT I/O. ALSO, IN A DISTRIBUTED ;SYSTEM, ONE WILL USE A HANDLER TASK AND SEND MESSAGES TO/FROM IT ;TO DO I/O. IT WILL BE THE ONLY PLACE IN THE SYSTEM TO USE THE ;QTRAN DIRECTIVES AND WILL HAVE TO BE RESIDENT ON THE CPU WHERE ;THE DEVICE IS CONNECTED. THIS DOES NOT HAVE PROVISION FOR MULTIPORT ;DEVICES, BUT SUCH SUPPORT COULD BE ADDED AND THE SYSTEM EFFECTIVELY ;BE PARTITIONED BY DEFINING 2 TASKS TO USE. ; ; DEFINE UNITS MX.LUT: + 8. ; MAX TABLE VALUE ; NOW COME ACTUAL WORDS DEFINING DEVICES + KBOT ; 1 = KEYBOURD PRINTER + KBIN ; 2 = KEYBOARD + LP0 ; 3 = LINE PRINTER + CR0 ; 4 = CARD READER + VT0 ; 5 = SCOPE + DT0 ; 6 = DEC-TAPE + MT0 ; 7 = MAG-TAPE + DF0 ; 8 = DISK ; + DF0 ; DISC .ENDC ; ;A FEW TCB OFFSETS TCBAP1=14 TCBST=3 .GLOBL TCBAP1,TCBST ;TCBST=TASK STATUS ;TCBAP1 IS APR 1 OFFSET OR APR TABLE ADDRESS .IF DF,L$OWN .GLOBL MX.LUO ;TSK NAME OF OWNER TASK FOR EACH DEVICE MX.LUO: .BLKW 9. .WORD 0,0 ;(SPARES) .ENDC .END