M.MMP=0;THIS IS A MULTIPROCESSOR MONITOR! .IF DF,$$DOS .IF DF,NODOS SAXCL=0 ;DUAL MODE STANDALONE DEF. .ENDC .ENDC .IIF NDF,SAXCL,APRSET=0 .TITLE MX.MAP ;MAPPER FOR MSX0 TASKS .IDENT /GCE001/ ;G. EVERHART 5/1979 UAPR1=177642 ;USER APR 1 UAPR0=177640 ;USER APR 0 (STANDALONE SETS THIS ONE...) TCBSEG=12 ;SEGMENT NAME HERE OFF TCB ; ; THIS ROUTINE IS EXPECTED TO BE CALLED BY MSX AT STARTUP TO ;SET UP ALL MEMORY-RESIDENT OVERLAYS UNDER RSX (11M ANYWAY) FROM THE ;MSX SYSTEM TASK LIST BETWEEN MX.TBL AND MX.TBE. IT WILL LOAD SEGMENTS ;NAMED AS IN THE TASK SEGMENT WORD OF THE TASK LIST, THE 2ND PART OF THE ;NAME BEING THE CONSTANT RAD50 PART "TSK", AND SET UP THE USER APRS ; IT WILL NOT (AND CANNOT) DETERMINE THE VIRTUAL STARTING ADDRESS ; ; THE ROUTINE $LOAD WILL BE CALLED FOR SYNCHRONOUS LOADING OF THE ;SEGMENTS XXXTSK AND THE STATUS WILL BE SET TO 0 IF LOAD FAILS. THE ;TASK MAY STILL BE CALLED, BUT APR'S WILL BE AS KERNEL APR'S ARE ;INITIALLY (THIS IS A DEFAULT TO ALLOW SMALL MAPPINGS TO BE SHARED) TCBAP1=14 ;APR 1 OFFSET (START OF TASK IN RSX VERSION) ;NOTE THAT ONLY APR 1 WILL BE PRESET. INITIAL MAPPING WILL PREVAIL ;IN OTHER APR'S. ; .IF NDF,R$$11D .IF DF,MUSEG .IIF NDF,SAXCL, .GLOBL $LOAD .ENDC .ENDC ; CALL THIS ROUTINE FROM MX.BGN AT STARTUP. ; .GLOBL MX.MAP ;MAP THINGS IN MX.MAP: .IF NDF,R$$11D MOV #</MX.TBS>,R5 ;NUMBER OF TASKS IN SYSTEM MOV #MX.TBL,R4 ;POINT AT EACH TASK .IIF NDF,APRSET, MOV MX.TCB,-(SP) ;SAVE MX.TCB FOR THE TIME BEING LOOP: MOV TCBSEG(R4),R3 ;GET TASK SEGMENT NAME .IF NDF,APRSET ;IF APRS NOT PRESET MOV R4,MX.TCB CLR -(SP) CLR -(SP) ;NO PS,PC JSR PC,U.RSAV ;BUT SAVE REGS FOR TASK MOV R0,-(SP) MOV MX.TCB,R0 CLR TCBDSP(R0) ;CLR DYNAM. SP TO SAY TSK NOT GOING MOV (SP)+,R0 CMP (SP)+,(SP)+ ;RESTORE STACK ;NOTE THAT CURRENT APR'S ARE NOW SET UP FOR TASK .ENDC .IIF NDF,SAXCL, MOV R3,PBLK+2 ;SAVE IN SEGMENT NAME AREA .IF NDF,SAXCL ;RSX VERSION TASKS MAP VIA APR1 .IF NDF,AL$APR MOV @#UAPR1,TCBAP1(R4) ;SET UP INITIAL COPY OF START APR1 .IFF JSR PC,ASAV .ENDC .IFF .IF NDF,AL$APR MOV @#UAPR0,TCBAP1(R4) ;STANDALONE TASKS MAP VIA APR0 .IFF JSR PC,ASAV .ENDC .ENDC .IIF NDF,SAXCL, MOV #PBLK,R0 ;POINT AT ARG .IF NDF,SAXCL .IF DF,MUSEG JSR PC,$LOAD ;LOAD THE SEGMENT .ENDC .IFF SEC .ENDC BCS NOSET ;ON ERROR LEAVE APR1 ALONE ;SET UP APR 1 START NOW THAT SEGMENT LOADED OK ; ; NOTE THAT SINCE THIS REQUEST ACTUALLY MAPS THE SEGMENT INTO MEMORY, ; APR 1 IS SET UP BY RSX TO POINT TO IT (BY STANDARD OPERATION). ; THUS IT IS NOT NECESSARY TO TRACE THE RSX CONTROL BLOCKS, BUT ONLY ; TO PLACE A COPY OF THIS VALUE OF APR1 IN THE BLOCK. ; .IF NDF,SAXCL ;RSX TSKS USE APR 1 MOV @#UAPR1,TCBAP1(R4) ;SAVE APR1 AS NOW SET UP BY RSX .IFF ;STANDALONE TSKS USE APR0 MOV @#UAPR0,TCBAP1(R4) .ENDC NOSET: ADD #MX.TBS,R4 ;SKIP TO NEXT TCB ENTRY DEC R5 ;COUNT DOWN TASKS TO DO BGT LOOP ;IF MORE, DO THEM .IIF NDF,APRSET, MOV (SP)+,MX.TCB ;RESTORE MSX TSK POINTER .ENDC ;R$$11D RTS PC ;BACK TO CALLER .IF NDF,R$$11D .IF DF,AL$APR ASAV: ;SET UP ALL TASK APRS TO ESTABLISH TOTAL ADDRESSABILITY .IF DF,SAXCL MOV #UAPR0,R0 ;DADA MOV #10,R2 ;NO. APRS .IFF MOV #UAPR1,R0 MOV #6,R2 ;NO APRS .ENDC MOV TCBAP1(R4),R1 ;GET BLK ADDR TO SAVE IN 1$: MOV (R0)+,(R1)+ ;COPY AN APR SOB R2,1$ ;DO ALL RTS PC .ENDC .IF NDF,SAXCL PBLK: .BYTE 3,0 ;SYNCH. LOAD, NO AST .WORD 0 ;TASK NAME (3 RAD50 CHARS) .RAD50 /TSK/ ;LAST CHARS OF SEGMENT ARE "TSK" .WORD PIOSTT PIOSTT: .WORD 0,0 ;I/O STATUS BLOCK (IGNORED...) .ENDC .ENDC ;R$$11D .END