ASMB,R,L,C,Q ** DISP4 -- RTE-IV DISPATCHER MODULE ** HED DISP4 -- RTE-IV DISPATCHER * DATE: 2/16/77 * NAME: DISP4 * SOURCE: 92067-18104 * RELOC: PART OF 92067-16102 * PGMR: G.A.A.,L.W.A.,D.L.S.,E.J.W.,C.M.M.,G.L.M. * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * *************************************************************** * NAM DISP4,0 92067-16102 REV.2040 800730 * ***** AMD ***** JUL,73 GAA ***** GSD ***** FEB,77 EJW * * DISPATCHER ENTRY POINT NAMES * ENT $RENT,$BRED,$ZZZZ,$XCQ,$RVAL,$DCPU,$LICE ENT $ALDM,$DMAL,$SMAP,$PRCN ENT $XDM,$MAXP,$UNPE ENT $BG1,$BG2,$BG3,$BG4,$BG5 ENT $RT1,$RT2,$RT3,$RT4,$RT5 ENT $MM1,$MM2,$MM3,$MM4,$MM5 ENT $PGID,$SGID,$DS1K * * DISPATCHER EXTERNAL REFERENCE NAMES * EXT $MRMP,$MATA,$MPFT,$BGFR,$RTFR,$SVAL,$SMCP,$SPRI EXT $EMRP,$RSRE,$ABRT,$XSIO,$DREQ EXT $WATR,$TIME,$DREL,$TRRN,$SZIT EXT $MCHN,$MBGP,$MRTP,$CFR,$WORK EXT $IOCL,$IRT,$IDLE,$DVPT,$IDEX,$CMST EXT $SDA,$SDT2,$MNP,$XDMP,$SCXX EXT $ABRE,$LIST,$RTST,$SGAF,$OTAT,$OPRI,$ERMG EXT $ELTB,$EQCL * * ******************************************************************** SKP * MAT ENTRY * * WORD DESCRIPTION * !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--! * !15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00! * !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--! * ! ! ! ! ! ! ! * MLNK 0 !00! LINK TO NEXT ENTRY IN LIST ! * ! ! ! ! ! ! ! * !--!--------!--------!--------!--------!--------! * ! ! ! ! ! ! ! * MPRIO 1 !00! PRIORITY OF PARTITION OCCUPANT ! * ! ! ! ! ! ! ! * !--!--------!--------!--------!--------!--------! * ! ! ! ! ! ! ! * MID 2 !00! ID SEGMENT ADDRESS OF OCCUPANT ! * ! ! ! ! ! ! ! * !--!--------!--------!--------!--------!--------! * ! ! ! ! ! ! ! * MADR 3 ! M!** D ******** BEGIN PHYSICAL PAGE# ! * !@@! ! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@! * !--!--------!--------!--------!--------!--------! * ! ! ! ! ! ! ! * MLTH 4 ! R! C *********** NUMBER OF PAGES IN PTTN ! * !@@! ! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@! * !--!--------!--------!--------!--------!--------! * ! ! ! ! ! ! ! * MRDFL 5 !RT!***********************************! STATUS ! * !@@! ! ! ! ! ! * !--!--------!--------!--------!--------!--------! * ! ! ! ! ! ! ! * MSUBL 6 !00! POINTER TO NEXT SUBPTTN OR 0 ! * !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@! * !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--! * !15!14 13 12!11 10 09!08 07 06!05 04 03!02 01 00! * !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--! * * "@" MARKS THE PARTS WHICH ARE SET AT GENERATION TIME: * "*" MARKS THE RESERVED PARTS * * ACTIVITY PART'N STATUS ID STATUS *................................................................ * PROGRAM BEING LOADED 0 1 BIT 8 SET * PROGRAM IS IN PARTITION 1 1-6 * SWAPPING OUT 2 1-6 * SEGMENT BEING LOADED 2 2 * PROGRAM IS SWAPPED OUT 3 1-6 * SUBPARTITIONS BEING SWAPPED OUT 4 1-6 * SUBPARTITIONS ALL SWAPPED OUT 5 1 * * NOTE: IF BIT 8 IS SET IN THE STATUS WORD, THE PROGRAM CAN NOT * BE DISPATCHED. * SKP * * * THE DISP MODULE OF THE REAL TIME EXECUTIVE PERFORMS: * * 1. IDLE LOOP IF NO PROGRAMS ARE SCHEDULED OR CAN'T BE EXECUTED * 2. SWITCHES PROGRAM EXECUTION SUCH THAT THE HIGHEST * * PRIORITY EXECUTABLE PROGRAM EXECUTES. * * 3. SETS THE FENCE REGISTER ACCORDING TO PROGRAM TYPE. * * 4. LOADS, SWAPS, AND EXECUTES DISC RESIDENT PROGRAMS * SPC 2 ABORT LDA B,I GET POSSIBLE NEXT PGM STA $ZZZZ AND SET IT FOR ABORT CLA CLEAR THE XSUSP ADDRESS STA B,I FOR THE NEXT START ADB DM8 BACK UP TO ID-SEG ADDRESS * CPB BPOWN DOES THIS GUY OWN THE CPU ? STA BPOWN YES, BUT NOT ANY MORE. * STB A SAVE THE ID-SEG. ADDRESS STB TMP A FEW TIMES ADA D14 CHECK IF DISC RES. LDA A,I PROGRAM AND D15 STA ATMP SAVE TYPE FOR LATER CHECK CPA D1 IS IT DISC RES. PROG? RSS NO, SKIP. JSB DREL RELEASE ANY SWAP TRACKS * LDB TMP GET THE ID SEG ADDRESS FOR DIST SYS $DS1K NOP AND PROVIDE DS A HOOK INTO THE OS * * * BUMP TERMINATION SEQUENCE COUNTER THEN CLEAR SESSION POINTER * IF PROGRAM NOT UNDER SESSION. * LDB TMP FETCH ID ADDR ADB D31 ADVANCE TO TERMINATION SEQUENCE COUNTER LDA B,I FETCH OLD COUNT ADA B10K BUMP IT (HIGH NIBBLE ONLY) STA B,I RESTORE COUNTER INB ADVANCE TO SESSION WORD * LDA TMP FETCH ID ADDR AGAIN ADA D17 ADVANCE TO TIME WORD LDA A,I ALF,SLA IF THE PROG IS IN THE TIME LIST JMP TIML SKIP THE CLEAR OF SESSION WORD * CLA STA B,I ZAP THE SESSION WORD * * SET (A) FOR RELEASE CALL * TIML LDA ATMP GET PROGRAM TYPE CPA D1 IF MEM RES A<> 0 RSS CLA IF DISC RES A=0 * * LDB TMP RELEASE ANY RE-ENTRENT JSB $ABRE MEMORY PROGRAM OWNS. LDB TMP RELEASE ANY STRING STORAGE JSB $RTST MEMORY THAT THE PROGRAM OWNS. * LDB TMP JSB $WATR SCHEDULE ANYONE WAITING LDB TMP LDA B ADA D20 STA TEMP SAVE ADDR OF FLAG WORD LDA A,I ALF,ALF GET FLAG WORD SLA ANY RESOURCES HELD? JSB $TRRN YES, RELEASE THEM * LDA TMP GET ID SEG ADDR OF TERMINATING PROG. LDB $ELTB,I GET EQT LOCK TABLE HEADER. SSB IF TABLE IS NOT EMPTY, JSB $EQCL GO UNLOCK HIS LOCKED EQTS. IF REQUIRED. * CLA IF CURRENTLY LDB TEMP,I STA TEMP,I (CLEAR FLAG WORD) SLB IS HE SERIALLY REUSABLE JMP $XCQ YES,LEAVE IN MEMORY * LDA ATMP GET TYPE CPA D1 IS IT MEM RES? JMP $XCQ YES,DONT FOOL WITH PARTITION * LDA TMP GET ID SEG ADR JSB MATEN GO SET UP POINTERS LDB MID,I GET PARTITION OCCUPANT WORD CPB TMP IS PROG STILL RESIDENT? RSS YES JMP $XCQ NO, DONT BOTHER WITH IT * LDA MLNK,I DID PTTN GET UNDEFINED INA,SZA,RSS BY A PARITY ERROR? JMP X0154 YES. KILL POSSIBLE I/O TRANSFER * LDA MADR,I SSA IS IT A MOTHER PTTN? JMP XN353 YES, MOVE PTTN FROM ALLOC TO FREE * LDB MFLGS SSB IS IT A REAL TIME PARTITION? JMP XN253 YES, RT. MOVE PTTN FROM ALLOC TO FREE JMP XN153 NO, BG. MOVE PTTN FROM ALLOC TO FREE SPC 2 * * D17 DEC 17 D31 DEC 31 B10K OCT 10000 DM8 DEC -8 SPC 2 $MAXP NOP RE-ESTABLISH MAXIMUM PTTN LIST SIZE WORDS CLA INIT ALL MAX SIZE WORD TO ZERO STA $MCHN STA $MRTP STA $MBGP STA NUMCH INIT ALL PTTN COUNTS BY TYPE TO ZERO STA NUMBG STA NUMRT LDA $MNP CMA,INA,SZA,RSS JMP MXPDN IN CASE 0, EXIT DONE * STA CNT SAVE NEG NUMBER OF PTTN ENTRIES LDA $MATA START AT FIRST PTTN * MXPSL JSB MATAD SET UP PTRS TO MAT ENTRY LDA MLNK,I INA,SZA,RSS IS THIS ENTRY UNDEFINED? JMP MXPNX YES, CHECK NEXT PTTN * LDA MADR,I SSA IS THIS A MOTHER PTTN? JMP MXPCH YES, INCRE COUNT * LDA MFLGS SSA IS THIS A RT PTTN? JMP MXPRT YES, INCRE COUNT * LDB DMBGP SET ADDR OF BG POINTER ISZ NUMBG INCRE COUNT OF BG PTTNS JMP MXPSZ CHECK PTTN SIZE FOR MAX * MXPCH LDB DMCHN SET ADDR OF MOTHER PTTN PTR ISZ NUMCH INCRE COUNT OF CH PTTNS JMP MXPSZ CHECK PTTN SIZE FOR MAX * MXPRT LDB DMRTP SET ADDR OF RT POINTER ISZ NUMRT INCRE COUNT OF RT PTTNS * MXPSZ LDA MLTH,I RAL,CLE,ERA SEZ IS THIS PTTN RESERVED? JMP MXPNX YES, SKIP MAX SIZE CHECK * AND B1777 CHECK LENGTH OF THIS PTTN STA TEMP AGAINST MAX SIZE SO FAR CMA,INA ADA B,I SSA,RSS IS THIS ONE LARGER? JMP MXPNX NO, TRY NEXT PTTN * LDA TEMP YES, SET UP NEW MAX STA B,I * MXPNX LDA MLNK ADA MATSZ INCRE TO NEXT PTTN MAT ENTRY ISZ CNT DONE YET? JMP MXPSL NO, DO NEXT PTTN * MXPDN LDA NUMCH YES, DONE SZA,RSS SET THE PROPER FREE LIST PTR STA $CFR TO ZERO IF THE LIST IS EMPTY LDA NUMRT FOR THE LSTIN SUBROUTINE SZA,RSS STA $RTFR LDA NUMBG SZA,RSS STA $BGFR JSB LSTIN RE-INIT MAT LIST PTRS JMP $MAXP,I RETURN * * NUMCH NOP 0 AT BOOT UP NUMBG NOP 0 AT BOOT UP NUMRT NOP 0 AT BOOT UP DMCHN DEF $MCHN+0 DMBGP DEF $MBGP+0 DMRTP DEF $MRTP+0 * * * INITIALIZE PARTITION MEMORY ALLOCATION TABLE ENTRY LIST POINTERS * CALLED BY BOTH DISPATCHER'S STARTUP CODE AND $MAXP * LSTIN NOP LDA $RTFR IS THERE A RT LIST OR CPA NUMRT WERE ANY IN ALLOC' LIST WHEN A SZA PARITY ERROR OCCURRED? JMP LSTI1 YES, CHECK BG LIST * LDA ABGFR NO, SET UP RT TO SAME AS BG STA ARTFR LDA ABGPR STA ARTPR LDA ABGDM STA ARTDM LDA $MBGP STA $MRTP JMP LSTI2 * LSTI1 LDA $BGFR IS THERE A BG LIST OR CPA NUMBG WERE ANY IN ALLOC' LIST WHEN A SZA PARITY ERROR OCCURRED? JMP LSTI2 YES, CHECK MOTHER PTTN LIST * LDA ARTFR NO, SET BG LIST POINTERS TO RT STA ABGFR LDA ARTPR STA ABGPR LDA ARTDM STA ABGDM LDA $MRTP STA $MBGP * LSTI2 LDA $CFR IS THERE A MOTHER PTTN LIST OR CPA NUMCH WERE ANY IN ALLOC' LIST WHEN A SZA PARITY ERROR OCCURRED? JMP LSTIN,I YES, RETURN * LDA ABGFR NO, SET MOTHER LIST SAME AS BG STA ACHFR LDA ABGPR STA ACHPR LDA ABGDM STA ACHDM LDA $MBGP STA $MCHN JMP LSTIN,I RETURN. AT LEAST ONE LIST REQUIRED * * SKP * CALLING SEQUENCE * JMP $XCQ DIRECT ENTRY IN SYSTEM MAP * OR * JMP $XEQ ENTRY VIA TABLE AREA I IN EITHER MAP * $XCQ LDB $ZZZZ CHECK IF PROGRAM TO BE ABORTED SZB JMP ABORT YES GO HANDLE IT LDB $LIST IF LIST NOT ENTERED SZB,RSS THEN NOTHING NEW SO JMP $IRT GO CONTINUE CURRENT PGM * X0005 LDA SKEDD LOAD TOP OF SCHEDULE LIST CLB STB $LIST PREVENT NEEDLESS LIST SCANS RSS SKIP FIRST TIME X0035 LDA ZWORK,I GET THE NEXT PGM IN THE LIST SZA,RSS ANY MORE IN SKEDD LIST? JMP ILOOP NO, GO TO IDLE LOOP * CPA SGSUP IS THIS PROG SEGMENT SUSPENDED? LDA A,I YES, SKIP TO NEXT PROG SZA IF ZERO,THEN NO PROG SCHED JMP X0010 GO TO PROCESS SCHED LIST * * NO PROGRAM SCHEDULED--SETUP FOR IDLE LOOP * * * THE IDLE LOOP SECTION CONSISTS OF: * * CLEARING XEQT WORD TO SIGNIFY THAT NO PROGRAM * * CURRENTLY EXECUTING. * * STORE ADDRESS OF 4 DUMMY WORDS INTO XSUSP-XSUSP+3 * * DUE TO I/O PROCESSING. * * SET MEMORY PROTECT REGISTER TO ZERO. * * CALL INTERRUPT RESTORE ROUTINE, $IRT * JUMP TO * * * * ILOOP STA FENCE SET THE FENCE TO ZERO OTA 5 STA XEQT CLEAR XEQT ADDRESS VALUE LDA DSLIC FETCH LOCATION OF DUMMY SLICE COUNTER STA $LICE AND SET IT UP FOR RTIME LDA SCPU FETCH ADDR OF DUMMY CPU USAGE BUFFER STA $DCPU AND SET THAT UP FOR RTIME LDB DIDLE RSS LDB B,I GET DIRECT ADDR RBL,CLE,SLB,ERB FOR IDLE LOOP JMP *-2 STB XSUSP SET BASE PAGE POINTERS INB TO POINT TO DUMMY STB XA LOCATIONS. STB XB STB XEO STB XI JMP $IRT GO TO IDLE LOOP (JMP *) * DIDLE DEF $IDLE+0 DIRECT ADDR TO IDLE LOOP SKP * * THE SWITCHING SECTION USES THE SCHEDULE LIST TO DETERMINE * * WHICH PROGRAM TO EXECUTE-STARTING FROM TOP OF LIST. * * IF PROGRAM FROM LIST OF LOWER OR EQUAL PRIORITY, * * THEN EXECUTION OF CURRENT PROGRAM CONINUES. * * IF PROGRAM FROM LIST OF HIGHER PRIORITY AND * * TYPE EITHER REAL TIME RESIDENT OR BACKGROUND * * RESIDENT, EXECUTION SWITCHING TAKES PLACE.* * TYPE IS BACKGROUND DISC RESIDENT, * * GO TO BACKGROUND DISC PROCESSING. * * TYPE IS REAL TIME DISC RESIDENT, GO TO REAL * * TIME DISC RESIDENT PROCESSING * * X0010 STA ZWORK SCHED LIST PROG ID SEG ADDRESS ADA D6 STA ZPRIO PRIORITY ADDRESS ADA D8 STA ZTYPE TYPE ADDRESS INA STA ZSTAT STATUS ADDRESS ADA D6 STA ZMPID MAP WORD ADDRESS ADA D7 STA ZEMA EMA WORD (ID WORD 28) ADA D2 STA ZTSLC TIMESLICE WORD ADA D2 STA ZSESN SESSION WORD * LDA ZEMA,I JSB IDXAD GET ID EXT ADDR JMP X0012 NOT EMA, CLEAR ZIDEX X0012 STA ZIDEX SAVE ADDR OF ID EXT OR 0 * * CHECK IF CURRENT PGM IS STILL TOP. * LDB XEQT SEE IF PROGRAM CURRENTLY EXECUTING SZB,RSS YES SKIP JMP X0030 NO, SO GO SET NEW ONE UP * ADB D15 CHECK STATUS OF XEQT ID SEGMENT LDA B,I AND B417 MASK TO MAJOR STATUS & LOAD FLAG * * NOTE: THE LOAD FLAG SHOULD NEVER BE SET ON THE * XEQT PROGRAM. THIS FLAG IS ONLY SET WHEN * A PROGRAM IS IN TRANSITION (LOAD OR SWAP * IN) FROM THE DISC. * CPA D1 RSS SCHEDULED-SO GO TO CHECK PRIORITY JMP X0030 NOT SCHEDULED -SO GO SWITCH * LDA ZPRIO,I FETCH PRIORITY OF PGRM ON TOP OF LIST CMA,INA SET IT NEGATIVE ADA XPRIO,I AND COMPARE WITH XEQT'S PRIORITY * SSA IF XEQT HIGHER PRIORITY, JMP $RENT GO CONTINUE. * SZA IF PGRM ON TOP OF LIST HIGHER, JMP X0030 GO ATTEMPT SWITCH OF CONTROL. * * * THE CONTENDING PROGRAM HAS EQUAL PRIORITY. * * * IF THE XEQT PROGRAM HAS USED A FULL TIMESLICE, ATTEMPT * EXECUTION SWITCHING. * ADB D15 ADVANCE TO XEQT'S TIMESLICE WORD LDA B,I FETCH IT SZA IF FULL SLICE NOT USED JMP $RENT GO CONTINUE XEQT * LDA $RVAL FETCH TS. RESET VALUE IN CASE CONTENDER CPB ZTSLC IS REALLY XEQT. JMP SETS2 YEP IT'S XEQT, SO RESET TS. VALUE AND CONTINUE * * * * NOTE: THE TIMESLICE WORD IS SET TO A 1 WHEN THE PROGRAM * IS ENTERED INTO THE SCHEDULED LIST ($LIST PROCESSOR). * * * * * CHECK NEW PROGRAM FOR "LOAD IN PROGRESS" FLAG. * X0030 LDA ZSTAT,I IF THIS ALF,ALF PROGRAM IS SLA BEING LOADED, JMP X0035 GO GET THE NEXT ONE IN THE LIST. * * * CHECK PROGRAM TYPE * LDA ZTYPE,I PROGRAM TYPE AND D15 CPA D1 CHECK IF MEMORY RESIDENT JMP X0F40 YES, SET UP TO RUN NOW * LDB ZMPID,I SSB ASSIGNED TO A PARTITION? JMP PCHK YES, GO SEE WHAT TYPE * LDB ZIDEX SZB IS THIS AN EMA PROG? JMP X0300 YES * CPA D2 REAL TIME DISC RESIDENT? JMP X0200 YES * CPA D3 BACKGROUND DISC RESIDENT? JMP X0100 YES, TREAT AS BG * CPA D4 LARGE BACKGROUND DISC RESIDENT? JMP X0100 YES * JMP X0035 NOT LEGAL TYPE, IGNORE * PCHK LDA B ASSIGNED TO PTTN AT LOAD TIME? AND B77 MPY MATSZ ADA $MATA GET PTTN ADDR ADA D3 LDB A,I SSB IS IT MOTHER PTTN? JMP X0300 YES * ADA D2 GET FLAG WORD LDA A,I SSA IS IT RT? JMP X0200 YES JMP X0100 NO,BACKGROUND * ATMP NOP B417 OCT 417 SKP ADMEM DEF MEMID MEMID NOP MPN NOP INDEX TO MPFT, BP FLAG LTH NOP LSTHD NOP NPGN NOP SPRIO NOP BPOWN NOP BPOWN IS CURRENT OWNER OF BP & THUS CPU HED DISP4 -- SET UP PROGRAM ID SEG ADR IN XEQT AREA * * ******************************************************************** * * OK, WE HAVE ARRIVED AT THE POINT THAT WE KNOW WHICH * PROGRAM WE INTEND TO EXECUTE. SO LETS SET UP THE * BASE PAGE POINTERS ON BEHALF OF THE NEW XEQT PROGRAM. * * REMEMBER XEQT OWNS ALL OF BASE PAGE FOR AS LONG AS HE * EXECUTES. ON SIMPLE INTERUPTS WE DON'T NEED TO RESET * UP BASE PAGE BECAUSE IT IHAS ALREADY BEEN SET UP TO * BELONG TO XEQT. * ******************************************************************** * * * * * ****************************************** * * * * * INITIAL (RE)DISPATCH OF MEM RES PROG * * * * * ****************************************** * * X0F40 LDA ZWORK GET THE ID OF PROG WE WANT TO DISPATCH LDB ZMPID CPA BPOWN DOES HE ALREADY OWN CPU ? JMP XRENT YES, SO SKIP THE BASE PAGE SET UP * CLA STA XMATA STA XIDEX * LDA $EMRP LDB A GET THE MEM RES BP LIMITS. JMP RTSET NOW SET EM UP. * * * ****************************************** * * * * * INITIAL (RE)DISPATCH DISC RES PROG * * * * * ****************************************** * * X0040 LDA ZWORK GET THE ID OF PROG WE WANT TO DISPATCH LDB ZMPID CPA BPOWN DOES HE OWN THE CPU ? JMP XRENT YES, SO SKIP THE BASE PAGE SET UP. * LDA MLNK GET THE MATA LINK ADDRESS STA XMATA SET INTO BASE PAGE LDA ZIDEX SAME WITH EMA PROG FLAG STA XIDEX * LDB ZWORK ADB D21 LDA B,I GET LENGTH OF PROG AND B76K ADA DM1 STA LTH ADB DM7 LDA B,I GET TYPE ADB D8 INDEX TO LOW MAIN LDB B,I B = LOW MAIN, A = TYPE WORD * ERA,RAR NOW SET E= 0 FOR RT PROGRAM SEZ,CCE,SLA,RSS AND E= 1 FOR BG PROGRAM CLE * LDA B A = B = LOW MAIN ADA LTH A = XX777 IE HIGHEST ADDRESS OF PROGRAM SEZ,RSS THIS A RT PROGRAM ? JMP RTSET YES. * STB BGDRA NO, BG. SET UP THE BASE PAGE ADB DM1 B = LOW MAIN - 1 STB AVMEM JMP R.SET * RTSET STA BGDRA SET UP THE RT BP WORDS STA AVMEM R.SET STA BGLWA STB RTDRA * LDB ZWORK ADB D21 INDEX TO MEMORY PROTECT FENCE SETTING LDA B,I RAL,ALF ALF SET UP THE VALUE FOR LATER AND D7 STA MPN * XRENT INB LDA B,I STA XI SET AS X REGISTER SAVE AREA * LDB ZWORK !!!!!!!!!!!!!!! COMMIT !!!!!!!!!!!!!!!!!!!!!!! STB XEQT !!!!!!!!!!!!!!! RTE IV !!!!!!!!!!!!!!!!!!!!!!! * STB BPOWN THIS CPU BELONGS TO BPOWN * * * LDA DM12 LOAD PROGRAM TO BE EXECUTED STA TMP INTO XEQT AREA LDA XQDEF X0041 STB A,I INA INB ISZ TMP JMP X0041 * * * ************************************************ * * * * * DEFINE TIMESLICE WORD AND CPU USAGE * * * LOCATION. THE SLICE VALUE IS CALCULATED * * * AS FOLLOWS: S=SYS QU* PRI MULT+SYS QU * * * WHERE : SYS QU= DEFAULT SYSTEM QUANTUM * * * DEFINED BY "QU" CMND * * * : PRI MULT=BITS 8-15 OF PROG'S * * * PRIORITY (IN LOW END) * * * * * * NOTE: SYSTEM LOCATIONS ARE USED IF XEQT * * * IS NOT TO BE TIMESLICED OR ISN'T A * * * SESSION PROGRAM. * * * * * ************************************************ * * DEFINE CPU USAGE LOCATION * X0042 LDB ZSESN,I FETCH POSSIBLE SCB ADDRESS FOR THIS PROGRAM ADB $SMCP ADD OFFSET TO CPU USAGE LOCATION INB BUMP TO LEAST SIGNIFICANT WORD (DOUBLE INTEGER) LDA ZSESN,I FETCH ID'S SESSION WORD SZA IF SSA NOT A SESSION PROGRAM LDB SCPU USE THE DUMMY SYSTEM LOCATION * STB $DCPU THE DOUBLE WORD INTEGER LOCATION * * * * DEFINE TIMESLICE VALUE FOR TIMESLICED PROGRAMS * * LDB DSLIC FETCH DUMMY SYSTEM TIMESLICE LOCATION LDA ZPRIO,I FETCH PRIORITY OF PROGRAM TO BE ENTERED ADA $SPRI COMPARE WITH TIMESLICE PRIORITY SSA,SZA IF HIGHER (LOWER NUMBER) THAN TIMESLICE PRIORITY JMP SETS DO NOT TIMESLICE THIS PROGRAM * LDA ZTSLC,I ANY REMAINING SLICE FOR THIS PROGRAM ? SSA JMP SETS2 YES - CONTINUE WITH REMAING SLICE * LDA ZPRIO,I NO REMAINING SLICE SO ALF,ALF CALUCLATE A NEW ONE. USE BITS 8-15 AND B377 AS A MULTIPLIER CLO MPY $SVAL TO ARRIVE AT TS VALUE * * ADA $SVAL ADD DEFAULT SLICE BACK IN SOC CHECK FOR RESULT LDA D32K > 32K. USE 32K, YOU CAN'T BE SERIOUS! CMA,INA SET SLICE NEGATIVE * SETS2 LDB ZTSLC FETCH ADDR OF ID WD 30 STA B,I SET THE TIMESLICE VALUE STA $RVAL SAVE ORIGIONAL VALUE FOR POSSIBLE RESET SETS STB $LICE SET POINTER TO TIMESLICE LOCATION * LDB XSUSP,I CHECK IF PROGRAM SUSPENDED CMB,INB,SZB IF SO THEN JMP $RENT GO SET IT UP LDB XPENT,I GET PRIMARY ENTRY PT. STB XSUSP,I SET ENTRY ADDRESS * * SKP * ******************************************* * * * * * CONTINUE WITH XEQT * * * * * ******************************************* * * * CHECK IF POINT OF SUSPENSION IS LIBRARY AREA * * * $RENT LDA XEQT (RETURN FROM EXEC) INDEX TO TYPE ADA D14 WORD STA ZTYPE AND SAVE FOR A MOMENT LDA A,I LDB $MRMP & ADDRESS OF MEM RES MAP AND D7 KEEP ONLY TYPE BITS CPA D1 THIS A MEM RES PROG ? USB YES, SO SET UP USER MAP * LDB XEQT GET THE RENT BIT ADB D20 LDB B,I GET THE WORD BLF,RBL ROTATE TO PUT RENT BIT IN SIGN SSB,RSS IF RENT NOT IN CONTROL JMP X0028 GO SET FENCE * SLB IF MEMORY MOVED JSB $RSRE GO RESTORE IT LDA ZTYPE,I ERA,RAR CMA,SSA,SLA,RSS IS THE PROG MEM RESIDENT ? JMP X0028 NO, DISC RES CAN'T BE USING MEM RES LIB * LDA LBREG MEMORY RESIDENT AND REENTRANT LDB LB#PG CBX CLEAR WRITE-PROTECT BITS FROM LDB LBPG# RESIDENT LIBRARY PAGES XMS LDA MPN CHECK MRP'S MPFTI ARS SZA MPN > 1 ? JMP X0028 YES, USE THAT MP FENCE SETTING * LDA LBORG NO, LOWER MP FENCE FOR M.R.L. JMP X0029 FROM MRP WITH NO COMMON * * * SET MEMORY PROTECT ACCORDING TO PROG TYPE * * ID SEG WORD 21 !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--! * !RP/ #PAGES / MPFTI /**/ PARTITION # ! * !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--! * !15!14 13 12!11 10 09!08 07 06!05 04 03!02 01 00! * * MPFTI (MPN) = 0 DISC RESIDENT(TYPE 4), NO COMMON * 1 MEMORY RESIDENT, NO COMMON * 2 ANY PROGRAM, RT COMMON * 3 ANY PROGRAM, BG COMMON * 4 ANY PROGRAM, SSGA * 5 DISC RESIDENT(TYPE 2 & 3), NO COMMON * X0028 LDA MPN GET MPFT INDEX ADA $MPFT LDA A,I GET FENCE X0029 STA FENCE OTA 5B * * RESTORE REGISTERS, MEMORY PROTECT, AND TURN ON INTERRUPT SYSTEM * JMP $IRT GO EXECUTE THE PROGRAM * XQDEF DEF XLINK * LBREG NOP RES. LIB. REGISTER # IN USER MAP LBPG# NOP RES. LIB. PHYSICAL PAGE # LB#PG NOP RES. LIB. SIZE IN # OF PAGES $RVAL NOP ***************** DUMMY CPU USAGE LOCATIONS $DCPU NOP SYSTEM POINTER TO CPU USAGE BUFFER SCPU DEF *+2 SYSTEM DUMMY BUFFER NOP NOTE: DOUBLE INTEGER FORMAT NOP ***************** ***************** DUMMY TIMESLICE LOCATION $LICE NOP SYSTEM POINTER TO TIMESLICE COUNTER DSLIC DEF *+1 NOTE: RTIME EXPECTS THE DUMMY SLICE LOCATION NOP TO BE AT (THE ADDRESS OF) $LICE+2 ***************** * D32K DEC 32767 * HED DISP4 -- BUFFERS, CONSTANTS, POINTERS, ETC * ZIDEX NOP ZEMA NOP ZMPID NOP * ZWORK NOP SCHED LIST ID SEGMENT ADDRESS ZPRIO NOP SCHED LIST PRIORITY LIST ZTYPE LDB SKEDD SCHED LIST PRIORITY ADDRESS ZSTAT NOP SCHED LIST STATUS ADDRESS ZTSLC NOP SCHED LIST TIMESLICE ADDRESS ZSESN NOP SCHED LIST SESSION ADDRESS SPC 1 TEMP ADB D6 TEMPORARY WORKING STORAGE AREA TEMP1 STB ZPRIO SAVE ADDR OF PRIORITY TEMP2 LDB B,I FETCH FMGR'S ORIGIONAL PRIORITY TEMP3 STB $OPRI AND SAVE IT IN TABLE AREA 2 TEMP4 CLB SET FMGR'S TEMP5 STB ZPRIO,I PRIORITY TO ZERO TEMP6 NOP ZEXIT JMP $ZZZZ,I TMP NOP TEMPORARY WORKING STORAGE TMP1 NOP TMP2 NOP CN#SC NOP CURRENT # SECTORS/TRACK (-) * DM12 DEC -12 DM3 DEC -3 * D1 DEC 1 D2 DEC 2 D4 DEC 4 D5 DEC 5 D6 DEC 6 D7 DEC 7 D8 DEC 8 D14 DEC 14 D15 DEC 15 D20 DEC 20 D21 DEC 21 D22 DEC 22 D27 DEC 27 D32 DEC 32 D33 DEC 33 * C77 OCT 177700 * B7 EQU D7 B17 EQU D15 B37 OCT 37 B77 OCT 77 B100 OCT 100 B177 OCT 177 B377 OCT 377 B1777 OCT 1777 B76K OCT 76000 * HED DISP4 -- USER MAP BUILDING ROUTINES ******************************************** *ROUTINE TO SET USER MAP CALLED BY DISP4 AND RTIO4 *CALL: * (B) =ADDR MAT ENTRY * (E) = 0 REBUILD USER MAP, SAVE IN BP COPY * (E) = 1 USE CURRENT BP COPY OF USER MAP, IF ANY * JSB $SMAP * REGISTERS MEANINGLESS ******************************************** * * $SMAP NOP STB XMAT SAVE MAT ENTRY ADDR ADB D2 LDA B,I GET ID SEG ADDR STA XIDA ADA D8 LDA A,I SEZ,SZA PT SUSP=0? OR (E)=0? JMP REMAP NO, USE BP COPY OF USER MAP * INB YES, HAVE TO REBUILD USER MAP LDA B,I AND B1777 STA XSTP SAVE PTTN START PAGE # * LDB XIDA ADB D21 LDA B,I AND B76K GET BITS 10-14 ALF RAL,RAL STA XNUM SAVE # OF PROG PAGES * LDA B,I ALF,ALF RAL AND B7 GET MPFT INDEX VALUE SZA,RSS JMP NOCOM =0, DISC RES(TYPE 4), NO COMMON * LDA XIDA =2,3,4 TYPE BG/RT USING COMMON ADA D14 OR TYPE 2 OR 3 WITHOUT COMMON LDA A,I AND B7 GET ID SEG TYPE CCB SET UP FOR TYPES 2,3, OR 4 WITH COMMON ADB $SDA CLE CPA D2 IS IT TYPE 2? RSS YES, RT NEEDS TAII + SDA CPA D3 IS IT TYPE 3? CCE YES, SET E=1 MAP COMMON + TAII + SDA JMP SYSRG NO, LEAVE E=0 MAP ONLY COMMON * NOCOM CCB NO COMMON, TYPE 4 ADB $CMST CLE (E)=0 FOR NOT PRIVILEGED * SYSRG CBX (X)= # PAGES IN TABLES, ETC. LDA D33 (A)= START REG # 33 FOR USER MAP CLB,INB (B)= 1 XMS SEZ,RSS PRIVILEGED PROG? JMP USERG NO * LDB $SDT2 YES, SET WRITE PROTECT BIT CBX (X)= # PAGES IN SDA + $$TB2 LDB $SDA ADB WRPRT (B)= PAGE # OF SDA WITH WRITE PROTECT XMS * USERG LDB XNUM NOW MAP USER CODE PAGES CBX LDB XSTP INB XMS MAP USER PROGRAM * LDB A CMB,INB ADB B100 CBX (X)= # REGISTERS LEFT LDB RWPMP (B)= READ-WRITE PROTECT FLAGS SET XMS * CLB,INB CBX (X)= 1 REGISTER LDB XSTP (B)= 1ST PAGE OF PTTN FOR BASE PAGE LDA D32 (A)= USER BASE PAGE REGISTER # XMS * LDB XMAT JSB PHYBP MAP IN USER BP TO SAVE USER MAP IOR BIT15 (A) = SIGN SET FOR SAVE MAP IN MEMORY USA JMP $SMAP,I RETURN * REMAP LDB XMAT JSB PHYBP MAP IN USER BP TO LOAD USER MAP USA RESTORE USER MAP FROM BP COPY JMP $SMAP,I RETURN * * * PHYBP MAP IN THE PHYSICAL BASE PAGE COPY OF USER MAP * CALL SEQUENCE: (B) = MAT ADDR * JSB PHYBP * (A) = ADDR OF PHYSICAL BP COPY * PHYBP NOP MAP PHYSICAL BP FOR USER PROG ADB D3 FOR SAVE & RESTORE MAP REGS LDA B,I GET PTTN'S FIRST PAGE # AND B1777 WHICH IS THE PHYSICAL BP STA B (B) = PAGE # OF BP CLA,INA CAX (X) = 1 TO SET ONE REGISTER LDA $DVPT WHERE DRIVER PTTN REG NORMALLY IS XMS MAP IN THE PHYSICAL BP LDA ADBPC GET LOGICAL ADDR FOR BP COPY JMP PHYBP,I RETURN WITH ADDR IN (A) * * ADBPC NOP LOGICAL ADDR IN DRIVER PTTN FOR USER BP COPY RDWRP OCT 140000 READ & WRITE PROTECT RWPMP OCT 141740 READ & WRITE PROTECT END OF MEM WRPRT OCT 040000 WRITE PROTECT ONLY XSTP NOP XIDA NOP XNUM NOP XDMST NOP D3 DEC 3 XMAT NOP DFDMR DEF DVMPR ADDR OF STORAGE FOR DRIVER MAP REG DVMPR NOP DRIVER MAP REGISTER CONTENTS * * *************EXTERNAL ROUTINE TO SET USER MAP******** ***************************************************** **********CALL: LDA IDADR (A) HAS ID SEG ADDR ********** JSB $XDMP ********** ********** (A) =0 IF ERROR-- PROGRAM NOT IN PARTITION * $XDM RBL,RBL CALLED VIA $XDMP ($$TB1) BY JMP STB XDMST SAVE DMS STATUS STA XIDA TEMP SAVE OF ID ADR LDB A ADB D14 LDA B,I AND D15 IS PROG MEM RES CPA D1 JMP MRPV YES,GO SET MEM RES MAP * ADB D7 GET MPID WORD LDA B,I AND B77 MPY MATSZ ADA $MATA GET PTTN ADDR STA XMAT SAVE MAT ENTRY ADDR ADA D2 LDA A,I CPA XIDA IS PROG STILL IN PARTITION? JMP XDMOK YES ,CONTINUE * CLA NO, ERROR JMP XDMEX RETURN (A)=0 * XDMOK CCA CAX (X)=1 READ 1 REG LDA $DVPT (A)=REG # OF DRIVER PARTITION LDB DFDMR (B)=ADDR OF SAVE AREA XMM SAVE REG USED FOR MAPPING USER BP CCE (E)=1 TO REUSE BP COPY OF MAP LDB XMAT (B)=MATA ENTRY ADDR JSB $SMAP GO SET MAP CLA,INA CAX (X)=1 WRITE 1 REG LDA $DVPT (A)=REG # OF DRIVER PARTITION LDB DVMPR (B)=SAVED DRIVER PTTN REG VALUE XMS RESTORE REG USED FOR MAPPING USER BP XDMEX JRS XDMST $XDMP,I RETURN (A)#0 * MRPV LDA $MRMP USA SET MEM RES MAP JMP XDMEX RETURN (A)=0 * HED DISP4 -- FIND PARTITION FOR SCHEDULED PROGRAM * ***************************************** * * ROUTINE TO SEARCH FOR A PARTITION * * ***************************************** SPC 2 * FNDSG NOP LDA ZWORK SET UP PTRS TO PTTN JSB MATEN FNDAG LDA ZMPID,I FNDSH CLE,ELA GET ASSIGNED FLAG IN (E) * *AT THIS POINT THE FOLLOWING WORD ARE IN USE * CNT--PARTITION NUMBER PROG LAST IN * MID--MAT ENTRY ADDR FOR PARTITION ID SEG * MPN--BITS 0-3,MPFT INDEX * BIT 15,BP LOAD FLAG(1,RECOVER BP AREA * EREG--RESERVED FLAG,E=1,CNT IS PTTN SPECIFIED * AT LOAD,E=0,CNT IS PTTN LAST IN * LDA MLTH,I RAL (A) HAS "C" BIT IN SIGN LDB MID,I CPB ZWORK PROG STILL IN PARTITION? JMP FDNSW YES * SEZ,CLE NO,IS ASSIGNED FLAG SET? JMP FDSWP YES, TRY TO SWAP OUT OCCUPANT * * SPC 2 * AT THIS POINT WE KNOW THAT THE PROGRAM IS NOT ASSIGNED TO * A PARTITION AND THAT THE PROGRAM IS NOT CURRENTLY IN THE * PARTITION. THAT IS, THE PROGRAM DOES NOT OWN THE PARTITION. * SINCE THE PROGRAM DOESN'T OWN THE PARTITION AN $XSIO CALL * WILL BE REQUIRED TO BRING HIM OFF THE DISC & INTO MEMORY. * THIS MEANS THAT IN ORDER TO DO ANYTHING USEFUL WITH THE * PROGRAM WE NEED AN $XSIO CALL. IF THE CALL IS NOT AVAILABLE * THEN NOTHING CAN BE DONE FOR THIS TYPE PROGRAM (BG) AND WE SHOULD * GO TO THE NEXT GUY IN THE SCHED LIST IF HE IS RT OR EMA SOMETHING * USEFUL IS POSSIBLE. SPC 2 * LDB FNDSG,I GET THE CONTENTS OF THE LDB B,I $XSIO BUSY WORD SZB CALL BUSY ? JMP X0035 YES, GO GET THE NEXT GUY IN SCHED LIST  * ISZ FNDSG NO, SO FIX RETURN & HOP TO IT !!! * * * ********************************** * * SEARCH FOR PARTITION * * ********************************** * * LDA ZMPID,I AND B76K GET #PAGES OF CODE - BP ALF (PLUS MSEG, IF ANY) RAL,RAL CMA,INA STA NPGN LDA ZEMA,I SZA,RSS EMA PROG? JMP FNDS3 NO * AND B1777 YES, EMA CMA,INA GET EMA SIZE ADA NPGN ADD TO PROG SIZE STA B LDA ZIDEX,I AND B37 GET #PAGES IN MSEG ADA B SUBTRACT FROM PROG SIZE FOR STA NPGN SIZE PTTN NEEDED EVEN THOUGH EMA * FNDS3 LDB FLIST GET POINTER TO FREE LIST HEADER * * * SEARCH FOR A FREE PARTITION * (B) = POINTER TO LIST HEADER * NPGN= NEGATIVE CURRENT LENGTH * GOES TO NOFRP IF NONE FOUND * * FREE LIST IS IN ORDER OF INCREASING SIZE * SCHFR LDA B,I GET ADR ENTRY(HAS LINK WORD) SZA,RSS END OF LIST JMP NOFRP YES,NO FREE PTTN * STA LSTHD STORE CURRENT ENTRY ADDR * CAX SET UP THE INDEX REGISTER * LAX D4,I GET LENGTH PARTITION SSA PTTN RESERVED JMP FR2 YES, CAN'T USE * RAL,CLE,ELA RAR,RAR SEZ,RSS IS IT IN CHAIN MODE? JMP FR1 NO, SEE IF LARGE ENOUGH * LAX D3,I YES, CHAIN MODE SSA,RSS BUT WAS IT MOTHER PTTN? JMP FR2 NO, CAN'T USE SUBPTTN IN CHAIN MODE * LAX D4,I MOTHER IN CHAIN MODE, OK TO USE * FR1 AND B1777 SCREEN OUT FLAGS ADA NPGN SEE IF GRTR,EQUAL TO CURRENT PRG SSA,RSS IS S=0 PTTN BIG ENOUGH JMP FNDFR FOUND ONE * FR2 LDA LSTHD STA B JMP SCHFR * * UNLINK PTTN FROM FREE LIST * LINK PTTN INTO ALLOCATED LIST * FNDFR LAX D3,I WE SEARCHING THE MOTHER LIST ? SSA WELL ? JMP SUBCH YES, SO GO LOOK AT THE SUB PART'N AVAIL * LDA LSTHD,I GET ADR NEXT ENTRY STA B,I UNLINK CURRENT ENTRY JSB SCHND GO SET MAP ID WORD LDA ZWORK JSB MATEN GO SET UP MAT POINTERS * FNDF1 LDA ZPRIO,I GET NEW PRIORITY STA MPRIO,I PUT IN PARTITION JSB ALINK LINK INTO ALLOCATED LIST CLB SET TO CLEAR RESIDENT FLAG STB MID,I CLEAR PTTN ID WORD JMP FNDSG,I RETURN TO CALLER * * * FOUND A PARTITION AND DON'T NEED TO SWAP * PROGRAM IS STILL IN PARTITION (ALLOCATED) BUT IS DORMANT * OR PROGRAM WAS JUST SWAPPED OUT AND IS STILL IN THERE. * IF IT IS A MOTHER PARTITION, CHAIN IS STILL ACTIVE * FDNSW LDB MADR,I SSA,RSS TEST C-BIT JMP FDNS2 C=0 IT'S OK. * SSB,RSS TEST M-BIT JMP FNDS5 C=1, M=0 SUBPTTN BUSY IN CHAIN! * FDNS2 ISZ FNDSG SET UP RETURN ADDRESS JSB FND C=1 M=1 SET UP FLAGS AND USE IT LDA ZPRIO,I GET PARTITION PRIORITY CPA MPRIO,I IS IT THE SAME AS CURRENT? JMP FNDSG,I YES, CONTINUE * STA MPRIO,I NO, RELINK IN ALLOCATED LIST JSB RLNK CAUSE PROG WAS DORMANT JMP FNDSG,I CONTINUE * FNDS5 LDA MRDFL,I SUBPTTN BUSY, AND D7 GET PTTN STATUS CPA D3 IS HE ALL SWAPPED OUT ?TTN RSS YES, SO RELEASE THIS PART'N & GET ANOTHER JMP X0035 NO, LETS WAIT ON THIS GUY FOR A WHILE * LDA DLIST GET DORM LIST POINTER LDB MLNK AND MAT POINTER JSB UNLNK MOVE OUT OF DORM OR ALLOC LIST AND LDB FLIST INTO FREE LIST. STB TEMPS (SAVE & RESTORE FLIST CAUSE JSB FLINK FLINK CHANGES IT) * LDB TEMPS NOW GO TO TOP OF PART'N SCAN ROUTINE & STB FLIST RESET FREE LIST POINTER FIRST CLA RELEASE OWNERSHIP WORD STA MID,I JMP FNDAG NOW GO GET HIM ANOTHER PARTITION. * * * * * ***************************************** * * PROGRAM WAS ASSIGNED TO A PARTITION * * ***************************************** * FDSWP LDB MLNK,I INB,SZB,RSS PTTN UNDEFINED BY P.E.? JMP FDOOH OH-OH, YES * ISZ FNDSG FIX RETURN ADDRESS LDB MADR,I SSA,RSS TEST C-BIT JMP FDSW2 C=0 C-BIT NOT SET, IT'S OK. * SSB,RSS TEST M-BIT JMP FDSUB C=1 M=0 SUBPTTN IN CHAIN, MAYBE SWAP. * FDSW2 LDA MID,I C=1 M=1 OR C=0 OK TO TRY SWAP CLE,SZA IS PTTN EMPTY? JMP FDSW1 NO * SSB,RSS THIS A MOTHER ? JMP USEIT NOT A MOM & NOT IN CHAIN. * LDA MLTH,I IS A MOM, BUT IS CHAIN IN EFFECT ? RAL C BIT IN SIGN SSA,RSS IN CHAIN MODE ? JMP SUBAS IS A MOM BUT NOT IN CHAIN JMP FDSW1 IS A MOM IS ALSO IN CHAIN * * USEIT LDA FLIST YES, AN EMPTY PARTITION LDB MLNK UNLINK FROM FREE LIST JSB UNLNK AND USE THIS PARTITION JMP FNDF1 NOW GO LINK IT INTO ALLOCATED LIST * FDSW1 JSB FND GO SET UP AND SWAP LATER JMP FNDSG,I CONTINUE * FDOOH LDA ZMPID,I UNASSIGNED PROG SINCE RAL,CLE,ERA THE PARTITION WENT AWAY STA ZMPID,I BECAUSE OF PARITY ERROR THERE JMP FNDSH TRY TO FIND A PARTITION * * * PROGRAM IS ASSIGNED TO A SUBPARTITION, HOWEVER THAT SUB IS * IN THE CHAIN MODE. SO LETS SEE WHO OWNS THE MOTHER PARTITION * AND SEE IF THAT GUY IS SWAPABLE. * * FDSUB LDB MLNK SAVE MAT ADDR OF PTTN STB LSTHD THAT WE NEED LDB MSUBL,I GIVEN SUBPTTN WITH "C" SET FDSMO LDA D3 FIND THE MOTHER PTTN ADA B LDA A,I SSA IS THIS THE MOTHER PTTN? JMP FDSMD YES, SEE IF MOTHER IS DORMANT * ADB D6 NO, TRY NEXT LINK LDB B,I JMP FDSMO * * * PROGRAM WAS ASSIGNED TO A SUBPARTITION BUT THE MOTHER PARTITION * IS STILL OCCUPIED. SEE IF WE CAN STILL QUALIFY TO FORCE A SWAP * OUT FROM THE MOTHER PARTITION. THE USER SHOULD NOT ASSIGN PROGRAMS * TO A SUBPARTITION IF THAT PROGRAM IS CONTINUOUSLY COMING IN AND * OUT OF THE SCHEDULE LIST. EMA PROGRAM PERFORMANCE WILL BE SEVERELY * DEGRADED. * * FNDSM IS ENTERED WHEN A PROGRAM IS NOT ASSIGNED TO ANY PARTITION * AND NO PARTITION OF THE PROPER TYPE WAS FOUND BUT A SUITABLE * SUBPARTITION WAS FOUND IN A DORMANT MOTHER PROGRAM. * FDSMD STB MOTHR SAVE SUBPTTN'S MOTHER ADDR ADB D5 LDA B,I AND D6 CPA D4 CLEARING OR CLEARED SUBPTTNS? JMP X0035 YES, SKIP IT FOR NOW * FNDSM LDA MOTHR YES, SET MAT ADDRS OF MOTHER PTTN JSB MATAD CCE (E) = 1 FOR SPECIAL SWAP CHECK LDB MID,I (B) = ID FOR SWPCK JSB SWPCK JMP SMABT ABORT - ONLY IF ASSIGNED TO SUBPTTN JMP SWMOM SWAP IS OK, PROG SAVE RES. OR SUSPENDED JMP SMLOD LOAD - PROG TERM. SERIAL REUSE. JMP X0035 CAN'T SWAP, TRY NEXT SCHED PROG * SMLOD CLA LOAD - PROG TERM. SERIAL REUSE. STA MID,I CLEAR MOTHER OCCUPANT, BEFORE USE SUBPTTN LDA FLIST SAVE CURR FREE LIST HEADER STA TEMPS CAUSE UNMOM+FLINK MESSES IT UP LDB MLNK GET MOTHER MAT ADDR JSB UNMOM RELEASE SUBPTTNS LDA TEMPS RESTORE FREE LIST HEADER STA FLIST LDB LSTHD GET MAT ADDR OF SUBPTTN WE NEED JSB UNLNK UNLINK FROM FREE LIST LDA LSTHD JSB MATAD SET UP MAT ADDR JMP FNDF1 SET INTO ALLOC LIST, RETURN * SWMOM LDA CHSWP MOTHER PTTN I/O CALL BUSY? SZA JMP X0035 YES, TRY SCHED NEXT PROG JMP X0325 NO, DO SWAP OUT OF MOTHER PTTN * SMABT LDA ZIDEX CAN WE ABORT MOM FOR LOAD IN SUBPTTN? SZA IS THIS EMA PROG? JMP XM352 YES, ABORT LOAD IN MOM CAUSE CHSWP WILL BE FREE * LDB BGSWP LDA MFLGS SSA IS THIS PROG FOR BG TYPE PTTN? LDB RTSWP NO, RT PTTN HAS TO BE USED FOR LOAD SZB IF WE DO ABORT, CAN WE LOAD? JMP X0035 NO, WAIT TILL I/O CALL IF FREE. JMP XM352 YES, ABORT MOM LOAD, WE CAN LOAD. TEMPS NOP SKP * * REACHED END OF FREE LIST AND COULD NOT FIND A PARTITION. * SO NOW WHAT WE WANT TO DO IS SEE IF THIS PROGRAM HAS IN THE * PAST FORCED A SWAP. IF WE HAVE GONE THROUGH FNDSG BEFORE * ON BEHALF OF THIS PROGRAM AND FORCED A SWAP, THEN THAT PART'N * NUMBER WILL BE IN THE PROGRAMS ID SEGMENT. LETS LOOK AND * AND SEE IF THAT PROGRAM IS SWAPPED OUT. IF SO WE WILL USE THAT * PARTITION. THIS SAVES US NEEDLESS SWAP OUTS ON BEHALF OF * A SINGLE PROGRAM. ALSO WE WON'T RETURN A PARTITION BEING * SWAPPED BECAUSE DURING THE SWAP THE $XSIO CALL WILL BE BUSY * AND WE DON'T EVEN GET HERE. * NOTE THAT EVEN IF THIS PROGRAM DIDN'T FORCE THE SWAP, WE CAN * CUT DOWN ON SEARCH TIME. * ONE WORD OF CAUTION. FRESHLY LOADED PROGRAMS HAVE A ZERO * (1ST PARTITION) IN THEIR ID SEGMENT. WE CAN'T TRUST * PARTITION ZERO TO BE THE CORRECT TYPE OF PARTITION. * * NOFRP LDA ZPRIO,I COME HERE IF NO FREE PTTN CMA,INA STA SPRIO SEARCH ALLOC LIST FOR PTTN LDA MRDFL,I GET THE PART'N STATUS WORD AND B7 KEEP ONLY STATUS BITS CPA D3 THE RESIDENT PROG SWAPPED OUT ? CLA,RSS YES ! JMP MMSWP NO, SEE IF WE CAN STEAL IT. * CPA CNT THIS PARTITION = ZERO ? JSB PTNOK YES, SO GO SEE IF PART'N IS A LEGAL ONE. SZA IS ALL OK ? JMP SRCNT NO. GO SEARCH ALLOC LIST. * LDA MADR,I MOTHER BIT IN SIGN OF A-REG LDB MLTH,I GET CHAIN BIT IN E-REG ELB,ELB * SEZ,SSA M=1,C=1/ IE MOTHER & IN CHAIN MODE. JMP FNDSG,I REUSE THE PARTITION. * SEZ,SSA,RSS M=0,C=0 /IE NOT A MOM & NOT IN CHAIN JMP FNDSG,I REUSE THIS PARTITION JMP SRCNT M=1 & C=0 / OR M=0 & C=1 (CAN'T USE PART'N) * * * * OK, SO SOMEBODY ELSE OWNS THE PARTITION. IF ITS A MOTHER PARTITION * AND THIS THE RESIDENT IS HAVING SUBPARTITIONS CLEARED, THEN IT'S * POSSIBLE TO STEAL THIS PARTITION FROM THE OLD OWNER. LETS SEE. * MMSWP CPA D4 PARTITIONS BEING CLEARED ? CLA,RSS YES CPA D5 PARTITIONS ALL CLEARED CLA,RSS YES JMP SRCNT NO, JUST FORGET THE WHOLE THING. * CPA CNT PART'N # = ZERO JSB PTNOK YES, SEE IF THE PARTITION IS RIGHT TYPE SZA ALL OK ? JMP SRCNT NO. SO GO SEARCH ALLOC LIST. * LDA MPRIO,I GET THE RESIDENTS PRIORITY CMA,INA ADA ZPRIO SEE HOW THIS COMPARES TO THE CONTENDERS PRIORITY SSA,RSS WHO WINS ? JMP SRCNT THE RESIDENT. * LDA ZPRIO THE CONTENDER STA MPRIO,I SET NEW PRIORITY IN MAT TABLE LDA ZWORK AND NEW OWNER TOO * STA MID,I ****** COMMIT PARTITION ****** * JSB RLNK RELINK IN ALLOCATED LIST SINCE THE PRIORITY IS JMP FNDSG,I DIFFERENT. NOW RETURN * * SKP * * THE PTNOK ROUTINE LOOKS AT A PARTITION AND DETERMINES IF * IT IS THE TYPE OF PARTITION WE ARE LOOKING FOR. IT IS * USED BY THE FNGDG ROUTINE TO DETERMINE IF IT IS OK TO * LOAD THE CURRENT ZWORK PROGRAM INTO THIS PARTITION. IN THE * FUTURE THE ROUTINE COULD BE USED TO LOOK AT THE ZWORK * PROGRAMS FATHER AND IF THE SCHEDULE WAS WITH WAIT FORCE A * SWAP OF THE FATHER PROVIDING THE PARTITION THE FATHER * WAS IN IS THE SAME TYPE AS THE SON COULD USE. THIS FEATURE * PREVENT HIGH PRIORITY PROGRAMS FROM HOGGING PARTITIONS * WHEN THEY DON'T NEED THEM. THE ROUTINE SHOULD BE USED * AFTER SCANNING THE FREE LIST AND NOT FINDING AND EMPTY * PARTITION. * * * CALLING SEQUENCE JSB PTNOK * ALL MAT POINTERS (IE MLNK ETC) SET UP * * * * ON RETURN: A REG = 0 ALLS WELL USE THE PARTITION * A REG = -1 PARTITION OF WRONG TYPE OR * PROGRAM TO BIG FOR PARTITION. * * * PTNOK NOP LDB ACHPR FIRST SEE WHAT TYPE PARTITION LDA MADR,I WE ARE SET UP FOR SSA MOTHER ? JMP MOMIT YES. * LDB ABGPR NO. LDA MRDFL,I SSA BG PARTITION ? LDB ARTPR NO, A RT PARTITION. * MOMIT CPB ALIST IS THIS THE TYPE OF PART'N FNDSG CALLED FOR? RSS YES JMP NOPTN NO, MAKE THE NO GO RETURN. * LDA MLTH,I RIGHT TYPE OF PARTITION BUT IS SSA THE PART'N RESERVED ? JMP NOPTN YES, SO WE CAN'T USE IT. * AND B1777 NO, SO GET THE SIZE OF THE PARTITION. ADA NPGN AND CHECK AGAINST THE SIZE OF THE PROG SSA,RSS DOES IT FIT CLA,RSS YES, MAKE THE OK RETURN. NOPTN CCA NO, MAKE THE NO GO RETURN. JMP PTNOK,I RETURN TO CALLER. * SKP * * SRCNT LDB DLIST,I LESS OR EQUAL PRIORITY * * SEARCH FOR SUITABLE ALLOCATED PARTITION. * ALLOCATED LIST IS IN ORDER * OF INCREASING PRIORITIES(I.E. DECREASING * NUMBERS)--EXCEPTION:DORMANT PROGS WITH * SAVED RESOURCES AT FRONT OF LIST * (OF,SS,COMPLET)*********** * NPGN--NEG LENGTH CURRENT * SPRIO--NEG PRIO CURRENT * GOES TO X0035 IF NO PTTN * * SCHAL CPB ALIST END OF DORM LIST? LDB B,I YES, BUMP TO ALLOC LIST CCE,SZB,RSS LIST EMPTY? JMP SCHMO YES, SEARCH DORMANT MOTHER PTTNS * STB LSTHD STORE CURRENT LIST HEAD CBX SET THE INDEX REGISTER * LAX D4,I SSA PARTITION RESERVED JMP SCHL2 YES, CAN'T USE IT * RAL,CLE,ELA RAR,RAR SEZ,RSS IS PTTN IN CHAIN MODE? JMP SCHL4 NO, TEST SIZE * LBX D3,I SSB,RSS MOTHER IN CHAIN MODE? JMP SCHL2 NO, CAN'T USE SUBPTTN IN CHAIN MODE * SCHL4 AND B1777 GET PARTITION LENGTH ADA NPGN SSA,RSS IF S=0, PTTN IF .GE. IN LENGTH JMP SCHL3 LONG ENOUGH * SCHL2 LDB LSTHD,I CCE,SZB,RSS END OF LIST JMP SCHMO NO PTTNS, TRY DORMANT MOTHER PTTNS JMP SCHAL GO TRY NEXT ONE * * * SCHL3 LBX D2,I GET PART ID ADDR SZB,RSS ANYBODY STILL THERE? JMP FNDAL NO, SO USE IT * ADB D14 LDA B,I AND B100 SZA IS CORE LOCK BIT SET? JMP SCHL2 YES, KEEP LOOKING * LAX D1,I NO GET PARTITION PRIORITY ADA SPRIO SUBTRACT CURRENT PRIORITY CMA,SSA,INA,SZA JMP FNDAL CURRENT IS .GT., GO DO IT * * CHECK FOR EQUAL PRIORITY AND RESIDENT HAVING USED A FULL TIMESLICE. * SZA IF CURRENT LIST HEAD LOWER PRIORITY JMP SCHL5 GO SEE IF RESIDENT IS SCHEDULED * LDA D16 FETCH ADA B TIMESLICE WORD LDA A,I OF RESIDENT. SZA,RSS IF A FULL SLICE HAS BEEN USED JMP FNDAL LET THE CURRENT LIST HEAD HAVE IT * SCHL5 INB CURRENT IS .LE. PTTN PRIORITY LDA B,I GET STATUS AND D15 CPA D1 IS PTTN SCHEDULED? JMP SCHL2 YES, GO TRY SOMEONE ELSE * FNDAL JSB SCHND GO SET MAP ID WORD JSB FND GO SET UP RES FLAGS AND MAT JMP FNDSG,I * * * NO RT OR BG ALLOC PTTNS CAN BE FOUND FOR PROGRAM * SO SEARCH THROUGH THE DORMANT MOTHER PARTITION LIST * TO SEE IF ANY SUBPARTITIONS CAN BE RELEASED WHICH * CAN BE USED FOR THIS PROGRAM * * NOTE: E MUST=1 AND B MUST=0 * SCHMO LDA ACHDM SEARCH DORMANT MOTHER LIST CPA DLIST ALREADY LOOKED BECAUSE EMA? JMP NOMOR YES, NOTHING CAN BE DONE * STA MOTHR LDA FLIST WERE WE SCANNING FOR CPA ARTFR A RT PTTN ERB YES, SET TEMP=100000 STB TEMP NO, SET TEMP=000000 * SCHMN LDB MOTHR,I GET NEXT ENTRY SZB ACCIDENTLY END OF LIST? CPB ACHPR OR END OF DORMANT LIST? JMP NOMOR YES, CAN'T USE BUSY MOTHER PTTNS * STB MOTHR ADB D4 LDA B,I SSA IS MOTHER PTTN RESERVED? JMP SCHMN YES, TRY NEXT DORMANT MOTHER PTTN * LDA ABGFR GET THE BG FREE LIST HEAD CPA ARTFR IF SAME AS RT, THEN SKIP TYPE CHECK. JMP SCHSB * INB LDA B,I AND BIT15 JUST KEEP RT BIT CPA TEMP PTTN TYPE MATCH WHAT WE NEED? JMP SCHSB YES, TRY SUBPTTN SIZE CHECK JMP SCHMN NO, TRY NEXT DORMANT MOTHER PTTN * SCHSB LDA MOTHR JSB MATAD LDA MID,I GET ID OF MOTHER PTTN OCCUPANT ADA D14 LDA A,I AND B100 SZA IS CORE LOCK SET? JMP SCHMN YES, TRY NEXT MOTHER PTTN * SCHSN LDA MSUBL,I GET NEXT SUBPTTN PTR SCHNX CPA MOTHR ANY MORE SUBPTTNS? JMP SCHMN NO, TRY NEXT DORMANT MOTHER PTTN * JSB MATAD SET UP MAT PTRS LDA MLTH,I SSA SUBPTTN RESERVED? JMP SCHSN YES, SKIP TO NEXT SUBPTTN * AND B1777 GET SUBPTTN LENGTH ADA NPGN ADD NEG LENGTH NEEDED SSA IS SUBPTTN LONG ENOUGH? JMP SCHSN NO, TRY NEXT SUBPTTN * LDB MLNK YES, SAVE MAT ADDR OF SUBPTTN STB LSTHD FOR FNDSM JSB SCHND SET UP ID SEG FOR SUBPTTN JMP FNDSM MOVE SUBPTTN FROM FREE LIST INTO ALLOC LIST * SPC 1 * SO NOW WE KNOW THAT THERE IS NO PARTITION THAT THE PROGRAM * CAN USE. THAT IS, THE PARTITIONS HE COULD USE ARE LOCKED * UP OR THERE HAS BEEN A PARITY ERROR IN WHAT WAS FORMERLY * THE LARGEST PARTITION OF THAT TYPE (IE BG, RT, OR MOM). * NOW IF THERE HAS BEEN A PARITY ERROR, THEN IF THIS PROGRAM * IS TOO LARGE FOR THE SYSTEM WE SHOULD ABORT IT. IF THERE * HAS NOT BEEN A PARITY ERROR, THEN JUST GO GET THE NEXT * GUY IN THE SCHED LIST. SPC 1 * NOMOR LDA $UNPE HAS THERE EVER BEEN A SZA,RSS PARITY ERROR ? JMP X0035 NO, SO GET THE NEXT GUY IN THE SCHED LIST * LDA ZWORK YES, I WONDER IF THIS GUY STILL FITS STA $WORK SET UP TO CALL $SZIT & FIND OUT JSB $SZIT GO SEE IT HE STILL FITS SZA,RSS DOES HE STILL FIT ? JMP X0035 YES, GO GET NEXT GUY IN SCHED LIST * LDA ZWORK NO, FLUSH HIM !!! STA XEQT MAKE HIM THE CURRENTLY EXECUTING PROG LDA DP GET THE ERROR CODE LDB BLANK JSB $ERMG ABORT THE MOTHER JMP $XCQ FINISH UP THE ABORTION. * DP ASC 1,DP BLANK ASC 1, D16 DEC 16 * * SUBROUTINE TO SET UP PROGRAM ID SEG TO USE A PARTITION * WHICH WAS FOUND IN A SEARCH OF A LIST. * CALL: * (LSTHD) = ADDR OF PARTITION WHICH WAS FOUND * (ZMPID) = ADDR OF PTTN WORD IN ID SEG * JSB SCHND * * SCHND NOP LDA $MATA GET ADR OF MAT CMA,INA ADA LSTHD CLB DIV MATSZ CALCULATE PTTN # LDB A LDA ZMPID,I GET MAP ID WORD AND C77 IOR B STA ZMPID,I PUT NEW PTTN # IN JMP SCHND,I * * ************************************** * FOUND A PARTITION, SET UP MAT POINTERS AND BP POINTERS * CALL: WORK = ID SEG ADDR OF PROG * JSB FND * ************************************** * FND NOP LDA ZWORK JSB MATEN GO SET UP MAT POINTERS JMP FND,I * DM1 DEC -1 MOM NOP TEMPORARY STORE OF MOTHER MATA ENTRY MOTHR NOP MOTHER MATA ENTRY ADDR OF CURRENT SUBPTTN MOMFL NOP SUBFL NOP SUBFR NOP SUBDM NOP * * * ******************************************** * * FOUND A FREE MOTHER OR WE HAVE * * * A PROGRAM THAT WAS ASSIGNED TO * * * A SUBPARTITION AND THAT MOTHER * * * PARTITION WAS EMPTY NOW GO SEE * * * IF SUBS ARE OVERLAYABLE OR * * * SWAPABLE * * ******************************************** * * SUBCH JSB SCHND SET PART'N # INTO ID SEG LDA ZWORK SET UP THE MATA POINTERS JSB MATEN * LDA MLTH,I RAL SSA IS "C" SET ALREADY? JMP FNDSG,I YES, USE THIS PTTN * SUBAS LDA MOMFL THIS SECTION OF CODE IN USE ? SZA WELL ? JMP X0035 YES, CAN'T DO THIS, TRY ANOTHER PROGRAM. * LDA MFLGS SSA,RSS SET UP PROPER LIST HEADERS JMP BGSUB * LDA ARTFR RT MOTHER PTTN STA SUBFR LDA ARTDM STA SUBDM JMP SUBC2 * BGSUB LDA ABGFR BG MOTHER PTTN STA SUBFR LDA ABGDM STA SUBDM * * SUBC2 LDB MLNK STB MOMFL SET UP SUBPTTN SWAPOUT FLAGS STB SUBFL WITH THE MOTHER PTTN ADDR * SUBN1 LDA MSUBL,I CHECK NEXT SUBPTTN CPA MOMFL DONE YET? JMP SUBRS YES, SET "C" START SWAPS * JSB MATAD SET UP MAT PTRS LDB MID,I CCE,SZB,RSS IS SUBPTTN EMPTY? JMP SUBN1 YES, SKIP SWAP CHECK * * FIRST SCAN THROUGH SUBPTTNS FOR SWAPPABILITY * JSB SWPCK (E)=1 FOR SUBPTTN SWAP CHECK NOP STOP LOAD NOP SWAP OUT JMP SUBN1 LOAD OK, TEST NEXT SUBPTTN CLA CAN'T SWAP, SUBPTTN NOT AVAILABLE STA MOMFL CLEAR THE CHECK IN PROGRESS FLAGS STA SUBFL LDA ZMPID,I GET THE PARTITION WORD SSA,RSS THIS PROG ASSIGNED ? JMP FR2 NO, SO GO LOOK FOR ANOTHER PART'N JMP X0035 YES, SO FORGET IT * * SUBRS LDA MOMFL ALL SUBPTTNS SWAPPABLE SUBR1 JSB MATAD SO SET "C" FLAG ON ALL * LDA MLTH,I IOR B40K STA MLTH,I LDA MSUBL,I CPA MOMFL DONE YET? JMP SUBS0 YES, INITIATE SWAPOUTS JMP SUBR1 NO, KEEP GOING * * SUBS0 LDA MOMFL SEE IF MOTHER PTTN JSB MATAD HAS ANY SUBPTTNS * LDA FLIST *** UNLINK FROM FREE LIST *** LDB MLNK JSB UNLNK * LDA ZPRIO,I GET THE PRIORITY STA MPRIO,I INTO THE PARTITION JSB ALINK *** MOVE INTO ALLOC LIST * LDA ZWORK ***** COMMIT THE PARTITION ***** STA MID,I ***** COMMIT THE PARTITION ***** * LDA MSUBL,I CPA MOMFL ANY SUBPTTNS? JMP SUBDN NO, SO DONE SET PTTN STATUS=5 * LDA MFLGS SET MOTHER PTTN STATUS=4 IOR D4 FOR SUBPTTNS SWAPPING OUT STA MRDFL,I * SUBNX LDA SUBFL GET NEXT SUBPTTN ADA D6 LDA A,I CPA MOMFL ARE WE DONE YET? JMP SUBDN YES, DONE. STA SUBFL SET NEW SUBPTTN ADDR * * * TRY TO SWAP SUBPARTITION. GET HERE FROM I/O CALL COMPLETE CODE SUBSS LDA CHSWP CHECK IN CASE WE CAME FROM RT OR BG CODE SZA IS MOTHER PTTN/EMA CALL BUSY? JMP X0005 YES, SKIP IT FOR A WHILE * SUBS2 LDA SUBFL SET UP MAT PTRS TO SUBPTTN JSB MATAD LDB MID,I CCE,SZB,RSS IS IT EMPTY? (E=1) FOR SWPCK JMP SUBNX YES, DO NEXT SUBPTTN * * SECOND SCAN THROUGH SUBPTTNS AND ACTUAL DO SWAPS * SUBSC JSB SWPCK (E=1) FOR SUBPTTN SWAP CHECK JMP SUBAB ABORT CURRENT LOAD JMP X0325 SWAP CURRENT OCCUPANT OUT JMP SUBNX LOAD OK, CHECK NEXT SUBPTTN LDB MOMFL CAN'T SWAP, SUBPTTN NOT AVAILABLE SUBNL ADB D4 LDA B,I AND C40K CLEAR "C" BIT STA B,I PUT IT BACK ADB D2 LDB B,I GET NEXT SUBPTTN CPB MOMFL DONE YET? JMP SUBDE YES, DEALLOCATE MOTHER PTTN JMP SUBNL NO, CLEAR CHAIN BIT * SUBDE LDA MOMFL UNLINK MOTHER PTTN FROM JSB MATAD ALLOCATED LIST SINCE WE LDA MFLGS STA MRDFL,I SET PTTN STATUS = 0 LDA ACHDM FOUND AN UNSWAPPABLE SUBPTTN LDB MOMFL JSB UNLNK LDA ACHFR STA FLIST LINK IT INTO THE FREE LIST JSB FLINK CLA CLEAR SUBPTTN CLEARING FLAGS STA MID,I UNCOMMIT THE PARTITION STA MOMFL STA SUBFL JMP X0005 GO TO TOP OF SCHED LIST * * SUBAB LDB MID,I ABORT LOAD IN SUBPTTN JSB CLRLD CLEAR LOAD BIT OF PROGRAM BEING LOADED LDA SUBDM TO EXECUTE LATER LDB MLNK UNLINK IT FROM ALLOCATED LIST JSB UNLNK LDA SUBFR AND LINK IT INTO THE FREE LIST STA FLIST JSB FLINK JMP X0154 GO CANCEL LOAD (EXITS VIA $IOCL) * * SUBDN LDA MOMFL SET UP MOTHER PTTN PTRS JSB MATAD SUBDX LDA MSUBL,I NOW UNLINK ALL SUBPTTNS FROM LISTS CPA MOMFL DONE YET? JMP SUBCL YES, SUBPTTNS ALL CLEARED * JSB MATAD SET UP SUBPTTN PTRS LDA SUBFR GET FREE LIST HEADER LDB MID,I SZB IS SUBPTTN EMPTY? LDA SUBDM NO, UNLINK FROM ALLOC LIST LDB MLNK JSB UNLNK UNLINK ENTRY FROM LIST CLA STA MID,I CLEAR OUT OCCUPANT WORD LDA MFLGS STA MRDFL,I CLEAR STATUS FIELD TOO LDA MADR,I ALSO CLEAR THE DORM BIT IOR B20K XOR B20K STA MADR,I JMP SUBDX GO DO NEXT SUBPTTN * SUBCL LDA MOMFL JSB MATAD SET UP PTRS TO MOTHER PTTN LDA MFLGS SUBPTTNS ALL CLEARED NOW IOR D5 SET UP MOTHER PTTN STATUS = 5 STA MRDFL,I CLA CLEAR OUT SUBPTTN STA MOMFL SWAPOUT FLAGS STA SUBFL JMP X0005 HAVE TO GO TO TOP OF SCHED LIST * * * * UNLINK SUBPARTITIONS FROM MOTHER PARTITION AND * RETURN SUBPARTITIONS TO THE BG OR RT FREE LIST * CALL: * MAT ADDRESSES SET UP BY MATAD (MLNK, ETC.) * (B) = MOTHER'S MAT ADDR * JSB UNMOM CALL * (A) = MOTHER'S MAT ADDR * UNMOM NOP CPB MOMFL IS MOTHER TRYING TO CLEAN HOUSE? JMP X0035 YES, LEAVE HER ALONE. * STB MOM SAVE MOTHER MAT ADDR TEMP LDA ACHDM UNLINK MOTHER PTTN FROM ALLOC LIST JSB UNLNK UNLINK FROM ALLOCATED LIST LDA ACHFR STA FLIST LINK PTTN INTO FREE LIST JSB FLINK LDA MLTH,I CLEAR "C" BIT TOO AND C40K STA MLTH,I LDA MRDFL,I GET PTTN STATUS AND D7 IF MOTHER PTTN STILL IN PROCESS CPA D4 OF CLEANING OUT SUBPTTNS JMP UNMOM,I FORGET RELINKING SUBPTTNS * UNMOL LDA MSUBL,I ANY SUBPARTITIONS? CPA MOM END OF LIST? JMP UNMOM,I YES. RETURN * JSB MATAD SET UP PTRS TO CURRENT MAT LDB ABGFR LDA MFLGS SSA RT PTTN? LDB ARTFR YES, CHANGE TO RT FREE LIST STB FLIST SET PROPER FREE LIST PTR JSB FLINK TO LINK SUBPTTN INTO LDA MLTH,I CLEAR "C" BIT TOO AND C40K STA MLTH,I JMP UNMOL LINK NEXT SUBPTTN SOMEWHERE * C40K OCT 137777 ULFRE NOP HED DISP4 -- MEMORY ALLOCATION TABLE LIST LINKAGE ROUTINES * MAT ENTRY * * WORD DESCRIPTION * !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--! * !15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00! * !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--! * ! ! ! ! ! ! ! * MLNK 0 !00! LINK TO NEXT ENTRY IN LIST ! * ! ! ! ! ! ! ! * !--!--------!--------!--------!--------!--------! * ! ! ! ! ! ! ! * MPRIO 1 !00! PRIORITY OF PARTITION OCCUPANT ! * ! ! ! ! ! ! ! * !--!--------!--------!--------!--------!--------! * ! ! ! ! ! ! ! * MID 2 !00! ID SEGMENT ADDRESS OF OCCUPANT ! * ! ! ! ! ! ! ! * !--!--------!--------!--------!--------!--------! * ! ! ! ! ! ! ! * MADR 3 ! M!** D ******** BEGIN PHYSICAL PAGE# ! * !@@! ! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@! * !--!--------!--------!--------!--------!--------! * ! ! ! ! ! ! ! * MLTH 4 ! R! C *********** NUMBER OF PAGES IN PTTN ! * !@@! ! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@! * !--!--------!--------!--------!--------!--------! * ! ! ! ! ! ! ! * MRDFL 5 !RT!***********************************! STATUS ! * !@@! ! ! ! ! ! * !--!--------!--------!--------!--------!--------! * ! ! ! ! ! ! ! * MSUBL 6 !00! POINTER TO NEXT SUBPTTN OR 0 ! * !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@! * !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--! * !15!14 13 12!11 10 09!08 07 06!05 04 03!02 01 00! * !--!--.--.--!--.--.--!--.--.--!--.--.--!--.--.--! * * "@" MARKS THE PARTS WHICH ARE SET AT GENERATION TIME: * "*" MARKS THE RESERVED PARTS * * PARTITION STATUS = * 0 PROGRAM BEING LOADED * 1 PROGRAM IS IN PARTITION * 2 SWAPPING OUT OR SEGMENT BEING LOADED * 3 PROGRAM IS SWAPPED OUT * 4 SUBPARTITIONS ARE BEING SWAPPED OUT * 5 SUBPARTITIONS ALL SWAPPED OUT * ************************************** * SET UP POINTERS TO ENTRY IN MAT * CALL: (A) = ID SEG ADDR OF PROG * JSB MATEN * ************************************** * MATEN NOP ADA D21 GET MAP ID WORD LDA A,I AND B77 GET PARTITION # STA CNT MPY MATSZ MULTIPLY BY MAT ENTRY LENGTH ADA $MATA JSB MATAD JMP MATEN,I RETURN * * * SET UP THE MAT POINTERS FROM THE MAT ADDR * MATAD NOP STA MLNK SET MAT ENTRY POINTER INA STA MPRIO ID SET PRIORTY INA STA MID ID SEG ADR INA STA MADR MAP START ADR INA STA MLTH PTTN LENGTH IN PAGES INA STA MRDFL READ COMPLETION FLAG INA STA MSUBL SUBPARTITION LINK WORD LDA MRDFL,I AND C7 STA MFLGS FLAGS IN PTTN STATUS WORD JMP MATAD,I * * MATSZ DEC 7 MLNK NOP LINKAGE WORD MPRIO NOP PRIORITY RESIDENT MID NOP ID SET ADR MADR NOP MAP START,BITS 0-9 MLTH NOP PTTN LENGTH, BITS 0-9 MRDFL NOP READ FLG(0-2),RT FLAG(15) MSUBL NOP CNT NOP PARTITION # MFLGS NOP UPPER BITS * * * CALCULATE ID SEGMENT EXTENSION ADDRESS * CALL: * (A) = ID SEG WORD 29 * JSB IDXAD * * * IDXAD NOP SZA,RSS ANY EMA? JMP IDXAD,I NO, RETURN P+1 * ALF YES, GET ID EXT# RAL,RAL AND B77 ADA $IDEX INDEX THRU KEYWORD TABLE LDA A,I GET THE ID EXT ADDR ISZ IDXAD JMP IDXAD,I RETURN AT P+2 SKP * ****************************************** *RELINK PART BY NEW PRIORITY ***************************************** * RLNK NOP RELINK BY NEW PRIORITY LDA MADR,I AND DMFLG SEE IF IN DORMANT PTTN ALLOC LIST SZA,RSS JMP RLN1 NO * XOR MADR,I YES STA MADR,I CLEAR FLAG LDA DLIST RLN2 LDB MLNK GET ADR CURRENT ENTRY JSB UNLNK GO UNLINK JSB ALINK GO RELINK IN ALLOC BY NEW PRIO JMP RLNK,I * RLN1 LDA ALIST GO UNLINK ALLOC LIST JMP RLN2 * * ******UNLINK ROUTINE******************** ****CALL: (A) = POINTER TO LIST HEAD * (B) = ADDR MAT ENTRY LOOKING FOR * JSB UNLNK * AFTER UNLINKING ***************************************** * UNLNK NOP UNLN1 SZA,RSS SHOULD NEVER GET CAUGHT HERE! BUT IF WE DO... HLT06 HLT 6 AT LEAST WE HAVE A CHANCE TO FIND IT STA ULST RIGHT, JIM? LDA ULST,I GET ADR CURRENT ENTRY CPB A SAME AS ONE SEARCHING FOR RSS YES,GO UNLINK JMP UNLN1 GO TRY NEXT ENTRY LDB B,I GET THIS ENTRY'S LINK STB ULST,I STORE IN PREVIOUS ENTRY LINK JMP UNLNK,I * ULST NOP * * ****LINK INTO FREE LIST******* * CALL: MLNK IS THE PTTN ENTRY TO BE ENTERED IN FREE LIST * FLIST IS SET TO THE PROPER FREE LIST (SMALLEST PTTN FIRST) * JSB FLINK * PTTN IS LINKED BY SIZE (SMALLEST PTTN FIRST) ****************************** * FLINK NOP LDA MADR,I IOR DMFLG XOR DMFLG CLEAR DORMANT FLAG STA MADR,I LDA MLTH,I GET CURRENT LENGTH AND B1777 SCREEN OUT FLAGS LDB A CMB,INB FLN1 LDA FLIST,I GET FIRST ENTRY IN LIST SZA,RSS JMP FLN2 * ADA D4 BUMP TO LENGTH WORD LDA A,I AND B1777 SCREEN OUT FLAGS ADA B SSA,RSS S=1 NEXT PARTITION SMALLER JMP FLN2 S=0, GO LINK * LDA FLIST,I STA FLIST GO CHECK NEXT ENTRY IN LIST JMP FLN1 * FLN2 LDA FLIST,I GET PREVIOUS POINTER STA MLNK,I PUT IN THIS ENTRY LINK WORD LDA MLNK GET ADR THIS ENTRY STA FLIST,I PUT IN LINK WORD PREVIOUS ENTRY JMP FLINK,I * *******LINK IN ALLOCATED LIST********** * ALINK NOP LDA MLNK SET PTTN LINK ADR STA XLNK LDA MLTH SET PTTN LENGTH ADR STA XLTH LDB MPRIO,I GET CURRENT PRIORITY CLA STA XEND SET END LIST LDA ALIST STA XLST SET UP LINK LIST JSB XXLNK GO LINK JMP ALINK,I * XLTH NOP XLNK NOP XEND NOP XLST NOP C7 EQU DM8 SKP * * ****SETUP FOR DORMANT LINK******* ******CALL: (A) = ID SEG ADDR * JSB DSET * WITH ULST-ALLOC LIST * XLST-DORM LIST ******************************** * DSET NOP STA XLTH SAVE IN TEMP CELL ADA D14 LDA A,I GET TYPE WORD AND D15 CPA D1 JMP DSET,I MEM RES,DONT LINK * LDA XLTH ADA D21 LDA A,I GET MAPID WORK AND B77 GET PTTN # MPY MATSZ CALCULATE ADR ADA $MATA STA XLNK STORE ADR JPARTITIONS LIND ADA D2 LDB A,I GET PTTN RES CPB XLTH SAME AS THE PROGRAM RSS YES JMP DSET,I NO, DON'T LINK * INA INCRE TO WORD 3 LDB A,I SSB IS THIS A MOTHER PTTN? JMP DLMOM YES, SET UP FOR LINKING MOTHER * INA SET UP TO PUT TOP ALLOC STA XLTH SAVE ADDR OF PTTN LENGTH WORD INA LDA A,I GET FLAG WORD SSA IS THIS A BG PTTN? JMP DLRT NO, IT IS RT * LDA ABGDM ADD TO BG DORMANT LIST STA XLST LDA ABGPR GET BG ALLOC LIST ADDR DLN1 STA ULST SET UNLINK HEADER STA XEND SET END LIST ISZ DSET JMP DSET,I * DLRT LDA ARTDM STA XLST SET RT DORM LIST ADDR LDA ARTPR GET RT ALLOC LIST ADDR JMP DLN1 SET UP FOR RETURN FROM DSET * DLMOM LDA ACHDM STA XLST SET MOTHER DORMANT LIST ADDR LDA ACHPR GET MOTHER ALLOC LIST ADDR JMP DLN1 SET UP FOR RETURN FROM DSET * DMFLG OCT 20000 BIT 13 OF MAT WORK 3 INDICATED DMLIST *** * *********LINK DORMANT PROGAM IN ALLC LIST**** * * DLINK NOP JSB DSET GO SETUP JMP DLINK,I NO LINK RETURN,NOT STILL IN PART * LDB XLNK ADB D3 LDA B,I GET WORK 3 MAT ENTRY AND DMFLG SZA IS IT ALREADY IN DORMANT LIST JMP DLINK,I YES, DON'T LINK AGAIN * LDA DMFLG NO IOR B,I SO SET FLAG AND LINK STA B,I LDB XLNK LDA ULST JSB UNLNK GO UNLINK ALLOCATED LIST LDA XLNK INA LDB A,I GET PRIORITY JSB XXLNK GO LINK JMP DLINK,I SKP ****PERFORM LINK INTO ALLOCATED LIST**** ******ROUTINE WILL INSERT IN ALLOCATED * LIST IN ORDER OF INCREASING * PRIORITY(DECREASING NUMBER). PTTN * OF SAME PRIORITY WILL BE IN ORDER * OF INCREASING LENGTH.*************** *CALL:XLNK ADDR OF CURRENT MAT LINK WORD * XLTH ADDR OF CURRENT MAT LENGTH WORD * XLST ADDR OF ALLOCATED LIST TO BE ADDED INTO * JSB XLINK * *************************************** * * XXLNK NOP ALN1 LDA XLST,I GET FIRST ENTRY IN LIST CPA XEND END OF LIST JMP ALN3 YES * INA BUMP TO PRIORITY WORK LDA A,I CMA,INA SCREEN OUT FLAGS ADA B ADD TO CUTTENT PRIORITY SSA,RSS S=1,NEXT PARTITION LOWER PRIORITY JMP ALN2 S=0,GO LINK * ALNXT LDA XLST,I GO CHECK NEXT ENTRY STA XLST JMP ALN1 * ALN2 SZA,RSS ARE PRIORITIES THE SAME JMP ALN4 GO ARRANGE BY LENGTH * ALN3 LDA XLST,I GET PREVIOUS POINTER STA XLNK,I PUT IN THIS ENTRY LINK WORD LDA XLNK GET ADR THIS ENTRY STA XLST,I PUT IN LINK WORK PREVIOUS JMP XXLNK,I * ALN4 LDA XLTH,I GET LENGTH CURRENT ENTRY AND B1777 SCREEN OUT FLAGS CMA,INA STA CLTH LDA XLST,I ADA D4 LDA A,I GET LENGTH NEXT ENTRY IN LIST AND B1777 SCREEN OUT FLAGS ADA CLTH SSA S=1,CURRENT LENGTH GREATER JMP ALNXT GO SEE IF NEXT ENTRY BIGGER JMP ALN3 CURRENT SMALLER,GO LINK * CLTH NOP SKP *******UNLINK ALLOCATED,LINK DORMANT**** * CALL: (A) = ID SEG ADDR * JSB $ALDM * *************************************** * $ALDM NOP JSB DLINK JMP $ALDM,I NOT STILL IN PTTN OR ALREADY IN DM * * ************************************* ****UNLINK DORMANT,LINK ALLOCATED**** * CALL: (A) = ID SEG ADDR * JSB DMAL * **NOTE--MUST MAKE SURE IN DORMANT LIST ** BEFORE GET HERE**** ************************************* * $DMAL NOP JSB DSET GO SET UP JMP $DMAL,I NOT IN PTTN,DONT CHANGE * LDB XLNK ADB D3 LDA B,I XOR DMFLG CLEAR DM LIST FLAG STA B,I LDA XLST GO UNLINK DORM LIST LDB ULST STB XLST SET TO INSERT ALLOC LIST LDB XLNK JSB UNLNK CLA STA XEND LDA XLNK INA LDB A,I GET PRIORITY JSB XXLNK GO LINK IN ALLOC LIST JMP $DMAL,I SKP *****RELINK FOR PR COMMAND********* **RELINKS IN ALLOC LIST BY NEW PRIORITY** * * $PRCN NOP STB NEWPR JSB DSET GO SET UP JMP $PRCN,I NOT STILL IN PTTN,DONT RELINK * LDB XLNK ADB D3 LDA B,I AND DMFLG IS IT IN DORM LIST SZA,RSS JMP PRCG2 NO, MUST BE IN ALLOC * LDA XLST YES, IN DORM PRCG1 LDB XLNK JSB UNLNK GO UNLINK LDA XLNK INA LDB NEWPR PUT NEW PRIO IN PTTN STB A,I JSB XXLNK GO LINK BY NEW PRIO JMP $PRCN,I * PRCG2 CLA SET UP FOR ALLOC LIST STA XEND LDA ULST STA XLST JMP PRCG1 * NEWPR NOP ABGFR DEF $BGFR+0 ADR BG FREE LIST ABGPR DEF BGPR ADR BG ALC LIST HD ABGDM DEF BGDM ADDR BG DORMANT SUBLIST HEADER BGDM DEF BGPR INIT BG DORMANT SUBLIST HEAD BGPR NOP BG ALLOCATED LIST HEADER * * EXT DEFS FOR CMM4 & CDA4 * $BG1 EQU ABGFR $BG2 EQU ABGPR $BG3 EQU ABGDM $BG4 EQU BGDM $BG5 EQU BGPR * ARTFR DEF $RTFR+0 ADDR RT FREE LIST HEADER ARTPR DEF RTPR ADDR RT ALLOCATED LIST HEADER ARTDM DEF RTDM ADDR RT DORMANT SUBLIST HEADER RTDM DEF RTPR INIT RT DORMANT SUBLIST HEAD RTPR NOP RT ALLOCATED LIST HEADER * * EXT DEFS FOR CMM4 & CDA4 * $RT1 EQU ARTFR $RT2 EQU ARTPR $RT3 EQU ARTDM $RT4 EQU RTDM $RT5 EQU RTPR * ACHFR DEF $CFR+0 ACHPR DEF CHPR ACHDM DEF CHDM CHDM DEF CHPR CHPR NOP * * EXT DEFS FOR CMM4 & CDA4 * $MM1 EQU ACHFR $MM2 EQU ACHPR $MM3 EQU ACHDM $MM4 EQU CHDM $MM5 EQU CHPR * FLIST NOP CURRENT FREE LIST POINTER ALIST NOP CURRENT ALLOCATED LIST POINTER DLIST NOP CURRENT DORMANT SUBLIST POINTER SKP * $UNPE - UNLINK PARTITION AND UNDEFINE IT FOR PARITY ERROR MODULE * CALLED BY PERR4 * CALL: * (B) = MAT ADDR OF PARTITION * JSB $UNPE * REGISTERS MEANINGLESS * * $UNPE NOP STB NEWPR SAVE MAT ADDR ADB D3 LDA B,I SSA IS IT A MOTHER PTTN? JMP ULMOM YES, UNLINK AND UNDEFINE MOM * ADB D2 LDA B,I ADB DM3 LDB B,I (B) = ID ADDR SSA IS IT RT PARTITION? JMP ULRT YES * LDA ABGFR BG PARTITION SZB IS PTTN EMPTY? LDA ABGDM NO, USE BG ALLOC LIST JMP ULPTN YES, USE BG FREE LIST * ULRT LDA ARTFR USE RT FREE LIST IF EMPTY SZB IS PTTN EMPTY? LDA ARTDM NO, USE RT ALLOC LIST ULPTN LDB NEWPR JSB UNLNK UNLINK THE ENTRY CCA STA NEWPR,I UNDEFINE THE MAT ENTRY * CLA NOW SET THE MAT FREE LDB NEWPR ADB D2 STA B,I ZAP THE ID ADDRESS ADB D3 LDA B,I GET THE STATUS WORD AND BIT15 SAVE ONLY TYPE STA B,I ZAP THE STATUS JMP $UNPE,I RETURN * ULMOM LDA NEWPR CPA MOMFL SAME AS ONE WE'RE TRYING TO CLEAN OUT CLB,RSS YES, SKIP JMP ULM2 NO, UNLINK FROM LISTS * STB MOMFL YES, CLEAR SWAP OUT FLAGS STB SUBFL ULM2 ADA D4 LDA A,I RAL SSA,RSS IS MOTHER IN CHAIN MODE? JMP ULM3 NO, SKIP UNMOM * LDA NEWPR JSB MATAD SET UP MAT ADDRS LDB NEWPR JSB UNMOM UNLINK SUBPTTNS FROM MOM LDA ACHFR UNLINK MOM FROM CH FREE LIST JMP ULPTN * ULM3 LDB NEWPR (UNMOM CHECKS PTTN STATUS = 4) ADB D2 LDA B,I GET PTTN STATUS AND D7 LDB A LDA ACHFR EITHER IT IS IN FREE LIST CPB D4 JMP ULMSP OR IN ALLOC LIST (SWAPPING SUBPTTNS) * LDB NEWPR ADB D2 LDB B,I SZB OR ULMSP LDA ACHDM IN ALLOC LIST (OCCUPIED) JMP ULPTN GO UNLINK AND UNDEFINE HED DISP4 -- CLEAR "LOAD IN PROGRESS" FLAG * * THIS ROUTINE CLEARS BIT EIGHT OF ID WORD * 16 (STATUS WORD). THIS FLAG (BIT) INDICATES TO THE * SWITCHING SECTION (X0030) THAT THE SPECIFIED PROGRAM * IS NOT YET IN MEMORY. THIS REDUCES THE OVERHEAD * REQUIRED TO FIND A DISPATCHABLE PROGRAM. * * THE "LOAD-IN PROGRESS" BIT IS SET BY THE COMIT ROUTINE. * * NOTE: PROGRAMS ARE NOT PLACED IN I/O SUSPENSION * WHILE THEY ARE BEING LOADED FROM THE DISC. * * * BIT 8 WORD 16 SET= LOAD IN PROGRESS * * * CLRLD NOP ISZ $LIST FORCE ONE MORE LIST SCAN ADB D15 CALLED WITH (B)=ID ADDRESS LDA B,I FETCH STATUS IOR B400 PRESET BIT XOR B400 SO WE CAN CLEAR LOAD BIT STA B,I RESTORE STATUS JMP CLRLD,I RETURN * * B400 OCT 400 SKP HED DISP4 -- BACKGROUND DISK PROGRAM LOADING * BACKGROUND DISK RESIDENT PROGRAM SCHEDULED * * * IF PROGRAM IS NOT RESIDENT OR BEING LOADED, GO TO * * READ IN PROGRAM FROM DISC AND SET READ IN WAIT * * FLAG, AND I/O SUSPEND THE PROGRAM. * * IF A PROGRAM IS RESIDENT AND * * IT IS THE DESIRED PROGRAM, GO TO SWITCHING * * SECTION TO EXECUTE THE PROGRAM. * * IT IS NOT THE DESIRED PROGRAM, * * CALL SWPCK TO CHECK SWAPABILITY OF THE * * CURRENT RESIDENT PROGRAM AND TAKE * * THE INDICATED ACTION. * * * X0100 LDA ABGFR SET UP LIST HEADERS STA FLIST LDA ABGPR STA ALIST LDA ABGDM STA DLIST * LDA ZIDEX SZA EMA ASSIGNED TO BG PTTN? JMP XE300 YES, GO TO MOTHER PTTN CODE * JSB FNDSG GO FIND PARTITION DEF BGSWP & SUPPLY THE $XSIO BUSY WORD LDA MRDFL,I GET READ COMP FLG SSA IS PROG IN RT PTTN JMP XB200 YES,GO THERE * XR100 LDB MID,I PROGRAM RESIDENT IN PTTN? SZB,RSS YES, SKIP JMP XN120 NO, SO GO READ IT IN * CPB ZWORK IF DESIRED PROGRAM JMP X0230 GO CHECK FOR READ COMPLETE * * * SET UP TO CALL SWPCK * LDA BGSWP IS BG SWP OR LOAD IN PROGRESS SZA NO,SO GO TO IT CPA B YES, IS IT SAME PTTN (B)=MID,I CLE,RSS OK,GO TO SWPCK (E=0) JMP X0035 * LDA D28 GET OCCUPANT'S EMA WORD ADA B LDA A,I SZA IS THAT PROG AN EMA PROG? JMP SWEMA YES, TRY SWAP OUT EMA PROG * JSB SWPCK CHECK SWAPPABILITY (E=0) JMP X0152 (P+1) GO CLEAR CURRENT LOAD JMP X101 (P+2) GO SWP OUT CURRENT PRGM * * LOAD RETURN FROM SWPCK * XN120 LDA BGSWP (P+3) GO LOAD OVER CURRENT OCCUPANT SZA JMP X0B35 YES, CALL BUSY, RELEASE PTTN IF FREE * JSB COMIT COMMIT THE PARTITION HED DISP4 -- BACKGROUND DISK RESIDENT PROGRAM SWAP OUT * SETUP TO SWAP OUT BACKGROUND DISK RESIDENT * * * SWAP OUT RT DISC RESIDENT PROGRAM FUNCTIONS AS FOLLOWS: * * COMPUTE NUMBER OF TRACKS NEEDED FOR SWAPPING * * OUT PROGRAM BY COMPUTING NUMBER OF SECTORS * * NEEDED FOR MAIN AND BASE PORTION OF PROGRAM. * * REQUEST THE NECESSARY NUMBER OF CONTIGUOUS * * TRACKS FROM EXECUTIVE. IF NONE IS AVAILABLE, * * THEN CANNOT SWAP AND RETURN TO CHECK NEXT PROG.* * IF TRACKS AVAILABLE, THEN SAVE STARTING TRACK * * ADDRESS, DISC LOGICAL UNIT NUMBER, AND NUMBER * * OF TRACKS INTO ID SEGMENT SWAP WORD. GENERATE * * PARAMETERS FOR SWAP OUTOF PROGRAM AND CALL * * DISC I/O ROUTINE. * * * SEZ,RSS *E=1 IS LOAD IN OR SWAP BACK IN X101 JSB SWOUT *E=0 IS SWAP OUT (GO SAVE MAP REG FIRST) CLB,SEZ,INB,RSS INB STB BGRQ SET UP REQUEST CODE LDB MID,I LDA BTRPA JSB PREST EXITS VIA X0035 IF NO DISC SPACE FOR SWAP STB BGLU SET UP REQUEST LU STA BTRP SET UP TRIPLETS ADDR LDA MID,I SET CALL BUSY AFTER PREST RETURNS STA BGSWP LDA MRDFL STA BRDFL SAVE FLAGS ADDR LDA MFLGS STA BFLGS SAVE HIGH ORDER BITS LDA ZPRIO,I STA BSPR SET UP PRIORITY * JSB $XSIO MAKE DISC I/O CALL BGLU NOP LOGICAL UNIT DEF X0122 COMPLETION ADDR X0155 NOP LINK WORD BGRQ OCT 1 REQUEST CODE BTRP DEF BTRIP TRIPLETS ARRAY ADDR BSPR NOP BG SWAPPING PRIORITY BGSWP NOP ID ADDR OF PROG ISZ BRDFL,I SWAPPING OUT? JMP X0035 YES, FLAG = 2 * LDA BFLGS NO, LOAD. FLAG = 0 IOR BRDFL,I SET UP HIGH BITS STA BRDFL,I JMP X0005 * * BRDFL NOP BFLGS NOP SKP * * BACKGROUND READ IN COMPLETION PROCESSOR * * * THE BACKGROUND DISC RESIDENT READ COMPLETION PROCESSOR, * * IF NO READ ERROR, IT CLEARS THE READ IN WAIT FLAG, * * ENTERS PROGRAM INTO SCHEDULE LIST VIA LIST * * SUCH THAT EXECUTION CAN BEGIN AT THE NEXT * * OPPORTUNITY THE PROGRAM BECOME THE TOP OF LIST.* * IF READ ERRORS OCCURRED, CALL $ABRT PROCESSOR . * X0122 STB TEMP SAVE READ IN STATUS OF DISC ISZ BRDFL,I STEP BG RD FLAG (1 LOADED, 3 SEG LOADED) LDA BFLGS IOR BRDFL,I STA BRDFL,I SET READ FLAG=1 IF READ (A=1) LDB BGSWP CLA STA BGSWP CLEAR BG I/O FLAG LDA BGRQ * X0125 ISZ $LIST SET LIST FLAG TO FORCE SCAN SLA,RSS A=1 IF READ,0 IF WRITE JMP X0127 IT IS WRITE, GO SCAN LIST * STB TEMP1 SAVE ID-SEG. ADDRESS JSB CLRLD (B)=ID ADDR -- CLEAR LOAD BIT LDA TEMP CHECK READ IN STATUS FLAG SSA,RSS SKIP IF DISC ERROR JMP X0127 ALL O-K SO GO SCAN THE LIST * X0126 LDA TEMP1 A CONTAINS ID SEG ADDR JSB $ABRT GO TO ABORT ROUTINE * X0127 LDA MOMFL SZA ANY SUBPTTNS TO SWAP OUT? JMP SUBSS YES, GO DO IT JMP $XCQ NO, DO NEXT SCHEDULE/ABORT * * CLEAR OUT CURRENT LOAD * X0152 LDB MID,I RESCHEDULE THE JSB CLRLD PROGRAM BY CLEARING LOAD BIT (B)=ID ADDR XN153 LDA ABGDM LDB MLNK JSB UNLNK REMOVE LDA ABGFR STA FLIST STRING BY LENGTH JSB FLINK INSERT INTO FREE LIST X0154 CLB LDA MRDFL,I AND D7 CPA D5 DID WE JUST CLEAR MOTHER PTTN LOAD? JMP XABIO YES, ABORT I/O * SLA IS I/O GOING ON IN THIS PTTN? JMP XX154 NO, GO TO $XCQ * XABIO LDA MID,I GET RESIDENT PTTN STB MID,I CLEAR RESIDENT CPA BGSWP WAS I/O BUSY IN BG? JMP XB154 YES * CPA RTSWP RT CALL BUSY? JMP XR154 YES, CLEAR IT * CPA SGSWP JMP XS154 * CPA CHSW2 CHUNK I/O CALL BUSY? JMP XC154 YES, CLEAR IT * CPA CHSWP MOTHER PTTN I/O BUSY? JMP XM154 YES, CLEAR IT * XX154 STB MID,I NONE OF ABOVE, JMP $XCQ JUST CLEAR RESIDENCY WORD * XM154 STB CHSWP CLEAR MOTHER PTTN FLAG LDA DX355 BECAUSE IT WAS NONE OF ABOVE JMP $IOCL GO CANCEL LOAD * XC154 STB CHSW2 STB CHSWP LDA DX366 CHUNK I/O BUSY. JMP $IOCL GO CANCEL LOAD * XR154 LDA DX255 STB RTSWP CLEAR RT FLAG JMP $IOCL GO CANCEL LOAD * XB154 STB BGSWP CLEAR BG FLAG LDA DX155 JMP $IOCL GO CANCEL LOAD * XS154 STB SGSWP CLEAR SG FLAG LDA DX455 JMP $IOCL GO CANCEL LOAD * SPC 1 DX155 DEF X0155 ADDR OF LINK WORD IN BG $XSIO CALL DX255 DEF X0255 ADDR OF LINK WORD IN RT $XSIO CALL DX355 DEF X0355 ADDR OF LINK WORD IN MOTHER $XSIO CALL DX366 DEF X0366 ADDR OF LINK WORD IN CHUNK $XSIO CALL DX455 DEF X0455 ADDR OF LINK WORD IN SEGMENT $XSIO CALL EMAOF NOP MSGSZ NOP MSGPG NOP ZIDX0 NOP ZIDX1 NOP * B40 OCT 40 B176K OCT 176000 DM7 DEC -7 * X0B35 LDA MID,I GET PTTN RESIDENT SZA IF EMPTY PUT BACK IN FREE LIST JMP X0035 OTHERWISE ,DONT BOTHER * LDA ALIST GO REMOVE ALLOCATD LIST LDB MLNK JSB UNLNK JSB FLINK JMP X0035 * * SKP * * * THE COMMIT ROUTINE INSURES THE THE PARTITION IS COMMITTED TO * THE PROGRAM BEFORE THE PROGRAM IS LOADED INTO THE PARTITION. * IF THE PARTITION USED TO BE IN THE DORM LIST IT IS MOVED TO * THE ALLOC LIST. WHAT WE SHOULD PROBABLY DO HERE LATER * IS ALSO TO MOVE THE PARTITION OUT OF THE FREE LIST INTO THE * ALLOC LIST. CURRENTLY THIS IS DONE IN THE FNDSG ROUTINE. OH * WELL MAYBE NEXT PASS WE'LL GET THE TIME. * * * COMIT NOP * LDA MID,I ANYBODY ALREADY OWN THE PARTITION ? SZA,RSS WELL ? JMP ALLOK NO, SO PARTITION IN CORRECT LIST ( VIA FNDSG ) * LDA MADR,I GET THE DORM BIT WORD AND B20K FETCH DORM BIT SZA,RSS THIS PART'N IN DORM LIST ? JMP ALLOK NO. * XOR MADR,I YES, SO STA MADR,I CLEAR DORM BIT & LDA DLIST MOVE OUT OF DORM LIST INTO LDB MLNK THE ALLOC LIST. JSB UNLNK JSB ALINK * ALLOK LDA ZPRIO,I ASSIGN NEW PRIORITY TO PTTN CPA MPRIO,I IS IT SAME AS PARTITION PRIORITY? JMP XW120 YES, CAN'T RELINK * STA MPRIO,I ASSIGN NEW PRIORITY JSB RLNK GO RELINK IN ALLOCATED LIST XW120 LDB ZWORK STB MID,I *** COMMIT THE PARTITION *** !!!!!! ISZ $LIST FORCE A NEW LIST SCAN LDA ZSTAT,I FETCH STATUS WORD IOR B400 ADD "LOAD-IN-PROGRESS" BIT STA ZSTAT,I RESTORE STATUS CCA,CCE (E)=1 FOR PREST ON LOAD STA MRDFL,I * JMP COMIT,I RETURN * B20K OCT 20000 HED DISP4 -- RT DISK RESIDENT LOAD TESTS * * REAL TIME DISC RESIDENT * * REAL TIME DISC RESIDENT PROGRAM EXECUTION * * IF PROGRAM IS NOT RESIDENT OR BEING LOADED, GO TO * * READ IN PROGRAM FROM DISC AND SET READ IN WAIT * * FLAG, AND I/O SUSPEND THE PROGRAM. * * IF A PROGRAM IS RESIDENT AND * * IT IS THE DESIRED PROGRAM, GO TO SWITCHING * * SECTION TO EXECUTE THE PROGRAM. * * IT IS NOT THE DESIRED PROGRAM, * * CALL SWPCK TO CHECK SWAPABILITY OF THE * * CURRENT RESIDENT PROGRAM AND TAKE * * THE INDICATED ACTION. * * * X0200 LDA ARTFR SET POINTERS TO LIST HEADERS STA FLIST LDA ARTPR STA ALIST LDA ARTDM STA DLIST * LDA ZIDEX SZA EMA ASSIGNED TO RT PTTN? JMP XE300 YES, GO TO MOTHER PTTN CODE * JSB FNDSG GO FIND PARTITION DEF RTSWP & SUPPLY THE PROPER $XSIO BUSY WORD LDA MRDFL,I GET READ COMP FLAG SSA,RSS IS PROG IN BG PTTN? JMP XR100 YES,GO DO IT * XB200 LDB MID,I IS PROGRAM RESIDENT? SZB,RSS JMP XN220 NO, SO GO READ IT IN * CPB ZWORK YES, DESIRED PROGRAM JMP X0230 GO CHECK FOR READ COMPLETE * * SET UP TO CALL SWPCK * LDA RTSWP IS RT I/O CALL BUSY? SZA NO, GO TO IT CPA B YES, IS IT SAME PTTN? (B)=MID,I CLE,RSS YES, GO TO SWPCK (E=0) JMP X0035 NO, I/O CALL BUSY, TRY NEXT PROG * LDA D28 GET OCCUPANT'S EMA WORD ADA B LDA A,I SZA IS THAT PROG AN EMA PROG? JMP SWEMA YES, TRY SWAP OUT EMA PROG * JSB SWPCK CHECK SWAPPABILITY (E=0) JMP X0252 GO CLEAR CURRENT LOAD JMP X201 GO SWAP OUT CURRENT PGM. JMP XN220 * SPC 1 X0230 AND B7 PROG IN MEMORY, SCHED IF DONE LOAD CCE,SLA,RSS READ IN COMPLETE? JMP X0035 NO, GO TRY THE NEXT PGM * CPA D3 STILL IN MEMORY AFTER SWAP? JMP X02IN YES, USE IT AGAIN * LDA ZWORK ADA D27 LDA A,I SWAP BACK IN? CCE,SZA JSB SWPIN *YES, SO SET UP THE MAPS FOR DISPATCH CCE *NO, REDISPATCH, USE MAP ON USER B.P. XW230 LDB MLNK JSB $SMAP SET UP USER MAP LDB ZWORK GET THE ID-SEG. ADDRESS JSB DREL RELEASE SWAP TRACKS IF ANY JMP X0040 GO EXECUTE THE PGM. * X02IN LDB MFLGS CCE,INB STB MRDFL,I FORCE PTTN STATUS=1 JSB SWOUT *RESET MAP BACK TO WHAT IT WAS. JMP XW230 RE-USE BP COPY OF USER MAP (E=1) HED DISP4 -- RT DISK RESIDENT READ IN * * SETUP TO READ IN RT DISK PROGRAM * * READ IN OF REAL TIME DISC RESIDENT PROGRAM * * IF ID SEGMENT SWAP ADDRESS IS ZERO, THE SYSTEM * * GENERATED DISC ADDRESS IS USED TO COMPUTE THE * * PARAMETERS FOR DISC I/O CALL. * * IF THERE IS SWAP ADDRESS, THEN THIS DISC ADDRESS * * IS USED. * * * XN220 LDA RTSWP TRANSFER IN ANOTHER AREA? SZA NO, OKAY TO LOAD JMP X0B35 YES, FREE UP PTTN AGAIN * JSB COMIT COMMIT THE PARTITION HED DISP4 -- RT DISK RESIDENT PROGRAM SWAP OUT * * SETUP TO SWAP OUT RT DISK RESIDENT * * * SWAP OUT RT DISC RESIDENT PROGRAM FUNCTIONS AS FOLLOWS: * * COMPUTE NUMBER OF TRACKS NEEDED FOR SWAPPING * * OUT PROGRAM BY COMPUTING NUMBER OF SECTORS * * NEEDED FOR MAIN AND BASE PORTION OF PROGRAM. * * REQUEST THE NECESSARY NUMBER OF CONTIGUOUS * * TRACKS FROM EXECUTIVE. IF NONE IS AVAILABLE, * * THEN CANNOT SWAP AND RETURN TO CHECK NEXT PROG.* * IF TRACKS AVAILABLE, THEN SAVE STARTING TRACK * * ADDRESS, DISC LOGICAL UNIT NUMBER, AND NUMBER * * OF TRACKS INTO ID SEGMENT SWAP WORD. GENERATE * * PARAMETERS FOR SWAP OUTOF PROGRAM AND CALL * * DISC I/O ROUTINE. * * * (E)=0 SWAP OUT (E)=1 LOAD IN * SEZ,RSS *E=1 IS A LOAD OR SWAP BACK IN X201 JSB SWOUT *E=0 IS A SWAP OUT SO SAVE THE MAP INFO CLB,SEZ,INB,RSS SET UP THE REQUEST CODE INB AND SET STB RTRQ LDB MID,I ID SEGMENT ADDRESS LDA RTRPA GET THE QUE ADDRESS JSB PREST GO SET UP THE SWAP STB RTLU SET THE LU STA RTRP SET THE TRIPLET QUE ADDRESS LDA MID,I STA RTSWP LDA MRDFL STA RRDFL LDA MFLGS SAVE FLAGS STA RFLGS LDA ZPRIO,I SET THE REQUEST PRIORITY STA RTSPR IN THE CALL JSB $XSIO CALL FOR DISK I/O RTLU NOP LOGICAL UNIT DEF X0251 COMPLETION ADDRESS X0255 OCT 0 RTRQ NOP REQUEST CODE READ/WRITE RTRP DEF RTRIP ARRAY ADDRESS RTSPR NOP RT SWAP PRIORITY RTSWP NOP EXTENDED XSIO CALL--ID ADR ISZ RRDFL,I SWAPPING OUT? JMP X0035 YES, CONTINUE SEARCH (FLAG = 2) * LDA RFLGS NO, IT'S LOAD IOR RRDFL,I PUT FLAGS BACK IN MAT WORD STA RRDFL,I NOW=0 IF LOADING OR SWAPPING IN JMP X0005 RESCAN LIST, NEW PROG MAY BE READY. * RFLGS NOP UPPER 13 BITS OF PTTN STATUS WORD RRDFL NOP ADDR OF MAT PTTN STATUS WORD SPC 2 * * * READ IN COMPLETION PROCESSOR * * THE REAL TIME DISC RESIDENT READ COMPLETION PROCESSOR, * * * IF NO ERRORS, IT CLEARS READ IN WAIT FLAG, AND * * SCHEDULES PROGRAM SUCH THAT PROGRAM EXECUTION * * CAN BEGIN AT THE NEXT OPPORTUNITY. * * IF READ ERRORS, CALL $ABRT PROCESSOR * * * X0251 STB TEMP SAVE READ IN STATUS OF DISK ISZ RRDFL,I SET FLAG =1 LOAD DONE, =3 SWAP DONE LDA RFLGS IOR RRDFL,I STA RRDFL,I LDB RTSWP GET ID SEG ADR CLA STA RTSWP CLEAR SWAP IN PROGRESS LDA RTRQ GET REQUEST CODE JMP X0125 GO FINISH CHECKS SPC 2 X0252 LDB MID,I ABORT LOAD IN PTTN WHICH WE NEED JSB CLRLD AND CLEAR LOAD BIT IN ABORTED PROG (B)=ID XN253 LDA ARTDM LDB MLNK JSB UNLNK REMOVE PTTN FROM ALLOCATED LIST LDA ARTFR STA FLIST JSB FLINK INSERT PTTN INTO FREE LIST JMP X0154 GO CANCEL LOAD SPC 1 RTRPA DEF RTRIP SPC 1 HED DISP4 -- MOTHER PARTITION RESIDENT PROGRAM PROCESSING * DISPATCHING EMA PROGRAM * OR A BG OR RT PROGRAM ASSIGNED TO A MOTHER PARTITION X0300 LDA ACHFR SET UP LIST HEADERS STA FLIST LDA ACHPR STA ALIST LDA ACHDM STA DLIST * LDA ZIDEX SZA,RSS IS IT AN EMA PROG? JMP X0310 NO * XE300 LDB ZWORK YES, IT IS EMA PROG ADB D8 LDB B,I GET POINT OF SUSPENSION FROM ID SEG SZB INITIAL DISPATCH? JMP X0310 NO, LEAVE EMA SIZE OR EMA START PAGE ALONE * LDA ZIDEX YES, INITIAL DISPATCH CCE,INA STA ZIDX1 SAVE ADDR OF WORD 1 IN ID EXT LDA ZIDEX,I AND B37 GET #PAGES IN MSEG STA B SAVE # PAGES IN MSEG RAL,ERA SET SIGN AND CLEAR MSEG # STA ZIDEX,I SO MSEG PAGES GET PROTECTED LDA ZMPID,I AND B76K ALF RAL,RAL GET SIZE OF PROG LESS BP CMB,INB SUBTRACT MSEG FOR ACTUAL CODE SIZE ADB A KEEP PROG SIZE IN (B) * LDA ZIDX1,I GET ID EXT WORD 1 ALF,RAL SSA,RSS WAS DEFAULT BIT SET? JMP X0310 NO, JUST USE SPECIFIED EMA SIZE * LDA ZEMA,I AND B1777 CPA D1 IS IT DEFAULTED TO 1? RSS YES, SET UP NEW EMA SIZE JMP X0310 NO, USE GIVEN SIZE * CMB,INB SUBTRACT ACTUAL CODE SIZE FROM PTTN SIZE LDA ZMPID,I SSA,RSS ASSIGNED TO A PTTN? JMP X0308 NO, USE $MCHN SIZE * STB NPGN SAVE NEG PROG SIZE LDA ZWORK YES, FIND THE PTTN'S SIZE JSB MATEN LDA MLTH,I AND B1777 LDB NPGN SUBTRACT PROG SIZE ADB A FROM PTTN SIZE TO CALCULATE RSS EMA SIZE X0308 ADB $MCHN USE MOTHER PTTN SIZE TO CALCULATE LDA ZEMA,I GET EMA WORD FROM ID SEG AND B176K IOR B AND FILL IN NEW EMA SIZE STA ZEMA,I SAVE NEW EMA SIZE WORD * X0310 JSB FNDSG GO FIND A PTTN LARGE ENOUGH DEF CHSWP & SUPPLY THE PROPER $XSIO BUSY WORD LDB MID,I PROG ASSIGNED TO MOTHER PTTN SZB,RSS IS ANY PROG IN PTTN? JMP XS320 NO, READ PROG IN IF REALLY FREE * CPB ZWORK YES, BUT IS IT THE CORRECT ONE? JMP X0330 YES, CHECK FOR READ COMPLETE * SWEMA LDA CHSWP NO, TRY SWAP IT OUT SZA IS I/O CALL BUSY? CPA B YES, CALL BUSY. IN THIS PTTN? (B)=MID,I CLE,RSS CALL NOT BUSY OR ONLY BUSY IN THIS PTTN JMP X0035 CALL IS BUSY, SO DO SOMETHING ELSE. * JSB SWPCK CHECK SWAP CONDITION (E=0) JMP X0352 THIS PROG PR > CURR PROG READ IN, STOP IT JMP X0325 WE CAN SWAP OUT OLD OCCUPANT JMP XN320 OCCUPANT NOT EXECUTED SINCE LOAD, OVERLAY IT * * * WE CAN SWAP OUT OLD PROGRAM IN PARTITION * X0325 LDB MID,I *GET OLD OCCUPANT ID ADDR ADB D28 * INDEX TO EMA WORD LDA B,I * STB ZEMA *SET UP FOR SWAP OUT CODE JSB IDXAD *GET ID EXT ADDR STA ZIDEX * NOT EMA, SET ID EXT ADD=0 STA ZIDEX * IS EMA, SAVE THE ID EXT ADDRESS * CLE * JSB SWOUT *SAVE USER MAP REGISTERS JMP X301 *GO SWAP * SPC 3 * SWAPPED EMA PROGRAM BACK IN * SINCE IT MAY COME BACK IN DIFFERENT PARTITION, WE MUST * REBUILD THE MSEG PAGE REGISTERS AND SAVE A NEW COPY OF * THE MAP IN THE USER'S PHYSICAL BASE PAGE. * * EMA START OFFSET = PG# CURR EMA PAGE - OLD EMA START PAGE * NEW EMA START PG = 1ST PG NEW PTTN + #PAGES IN ID + 1 - MSEG SIZE * #PG TO MAP IN MSEG= MSEG SIZE + 1 * * IF MSEG IS NOT COMPLETELY FILLED BY EMA PAGES BECAUSE * END OF THE EMA WAS REACHED OR IF THERE WAS NO MSEG MAPPED * AT THE TIME OF THE SWAP-OUT, THEN THOSE PAGES WILL BE * SET UP WITH READ-WRITE PROTECT. * * X0330 LDA MRDFL,I AND D7 GET PTTN STATUS CPA D4 STILL TRY TO SWAP OUT SUBPTTNS? JMP XS322 YES, DO SOME MORE * CPA D5 ALL DONE WITH SUBPTTNS? JMP XN320 YES, LOAD INTO IT * LDB ZIDEX NONE OF ABOVE, SO READ STARTED ALREADY SZB,RSS IS IT AN EMA PROG? JMP X0230 NO, JUST SET UP BP MAP * CCE,SLA,RSS IS EMA LOAD ALL DONE? JMP X0035 NO, GO DISPATCH NEXT PROG * CPA D3 STILL IN MEMORY AFTER SWAP OUT? JMP X03IN YES, CHANGE PTTN STATUS TO 1 * LDA ZWORK *PROGRAM IS IN MEMORY ADA D27 * LDA A,I *GET SWAP TRACKS WORD CCE,SZA,RSS *IS THIS A LOAD BACK IN FROM A SWAP OUT? JMP X0333 *NO,EITHER A REDISPATCH OR INITIAL RUN. * JSB SWPIN *YES, SO SET UP THE USERS MAP REGS CCE * LDB MLNK *GET THE MATA LINK WORD & JSB $SMAP *NOW GO ENABLE THE USER MAP * XW330 LDB ZWORK *GET THE ID ADDRESS JSB DREL *RELEASE SWAP TRACKS, IF ANY JMP X0040 * GO EXECUTE PROG * X03IN LDB MFLGS * CCE,INB * STB MRDFL,I *SET STATUS=1 FOR PROG IN MEMORY JSB SWOUT *RESTORE SAVED MAP TO WHAT IT USED TO BE LDB MLNK *GET THE MAT ADDRESS & JSB $SMAP *RE-USE USER MAP (E=1) JMP XW330 * AFTER SWAP, SO GET RID OF SWAP TRACKS * * * THIS IS EITHER A REDISPATCH OR THE INITIAL RUN OF THE PROGRAM * X0333 LDB MLNK * LDA ZWORK *GET THE ID ADDR ADA D8 * LDA A,I *GET PT OF SUSP CCE,SZA,RSS * INITIAL EXECUTION ? JMP X0335 *YES,SO SET UP THE START PAGE OF EMA * JSB $SMAP *NO,A REDISPATCH SO JUST USE MAP ALREADY THERE JMP X0040 *SO GO EXECUTE THE GUY. * * THIS IS THE FIRST DISPATCH OF THE EMA PROGRAM * X0335 CLE *(E=0) TO FORCE NEW MAP JSB $SMAP *SET UP USER MAP LDA ZIDEX,I *EMA PROG JUST LOADED AND B37 *NEEDS MAP REGS SET UP FOR MSEG LDB A *NEGATE # PGS IN MSEG CMB,INB * LDA ZMPID,I *GET # PAGES IN USER ALF * (WITHOUT BASE PAGE) RAL,RAL * AND B37 * TO GET ACTUAL CODE SIZE INA * ADB A * IN (B) * LDA MADR,I *GET PHYSICAL START PAGE OF PTTN AND B1777 * FROM MATA ENTRY ADB A *ADD TO GET NEW START PAGE EMA LDA ZIDX1,I * AND B176K * IOR B *ADD OLD BITS IN HIGH PART LDB ZIDEX *GET THE ID EXT ADDR INB * THE START PHYSICAL PAGE OF EMA WORD STA B,I * AND SET UP THE EMA PHYSICAL PAGE WORD. JMP X0040 * OK, SO GO EXECUTE THE PROGRAM. * * B40K OCT 40000 * * X0352 LDB MADR,I NEED TO ABORT LOAD IN PROGRESS SSB MOTHER PTTN? JMP XM352 YES, MOTHER PTTN * LDB MFLGS NO, MUST BE EMA ASSIGNED TO RT/BG SSB JMP X0252 ASSIGNED TO RT (UNLINK RT PTTN) JMP X0152 ASSIGNED TO BG (UNLINK BG PTTN) * * * PROGRAM WAS ASSIGNED TO A SUBPARTITION AND THE SWPCK ROUTINE * DETERMINED THAT IT IS HIGHER PRIORITY THAN THE PROGRAM BEING * LOADED INTO THE MOTHER PARTITION SO STOP THE LOAD. * XM352 LDB MID,I JSB CLRLD CLEAR LOAD BIT OF PROG IN MOTHER PTTN * XN353 LDB MLNK PROG ABORTED BY OPERATOR OR SYSTEM JSB UNMOM OR PROGRAM COMPLETED NORMALLY XW354 JSB MATAD RESET UP PTRS FOR MOTHER PTTN JMP X0154 THEN CANCEL LOAD IF NEED TO * * * DO THE LOAD OF PROGRAM INTO MOTHER PTTN * XN321 LDA MADR,I MOTHER/EMA CALL IS BUSY SSA NEED TO LOAD INTO MOTHER PTTN? JMP X0035 YES, HAVE TO WAIT. TRY NEXT SCHED JMP X0B35 NO, EMA ASSIGNED TO RT/BG. RELEASE PTTN * * XS320 LDA MRDFL,I AND B7 STILL TRYING TO CLEAR SUBPTTNS? CPA D4 RSS YES, DO SOME MORE OR GO TO NEXT PROG JMP XN320 NO, DO LOAD IF CALL IS FREE * XS322 LDA CHSWP IS MOTHER PTTN/EMA CALL BUSY? SZA (NEED THIS, IN CASE OF ABORT IN SUBPTTN) JMP X0035 YES, BUSY SO SKIP IT FOR A WHILE JMP SUBS2 NO, DO NEXT SUBPTTN. * * XN320 LDA CHSWP IS MOTHER PTTN/EMA CALL BUSY? SZA JMP XN321 YES, BUSY. TRY NEXT PROG IF MOTHER PTTN * JSB COMIT COMIT THE PARTITION * SKP * * SWAP-OUT OR LOAD * X301 CLB,SEZ,INB,RSS SET UP REQ CODE INB AND SET UP STB CHRQ IN MOTHER PTTN CALL STB CHRQ2 LDA MLNK STA CHMAT SAVE MAT ADDR LDB MID,I (B) = ID SEG ADDR LDA CTRPA (A)=BOTTOM OF TRIPLETS JSB PREST SET UP FOR SWAP OR LOAD OF PROG STB CHLU1 SAVE LU STB CHLU2 STA CTRP SET TRIPLET QUEUE ADDR LDA TEMP1 STA CHTRK SAVE NEXT TRACK # LDA TEMP2 STA CHSCT SAVE NEXT SECTOR # LDA MID,I STA CHSWP SET EMA/MOTHER PTTN I/O CALL BUSY LDA MRDFL STA CRDFL SET ADDR OF READ-IN FLAG LDA MFLGS STA CFLGS SET HIGH BITS OF READ-IN FLAG LDA ZPRIO,I STA CHSPR SET REQUEST PRIORITY STA CHSP2 LDA ZEMA,I STA CHEMA SAVE CONTENT OF EMA WORD LDA ZIDEX AND ID EXT ADDR STA CHIDX FOR COMPLETION CODE * JSB $XSIO DO LOAD OR SWAP I/O CALL CHLU1 NOP DISC LU DEF X0351 COMPLETION ADDR X0355 NOP LINK WORD CHRQ NOP READ/WRITE CTRP DEF CTRIP TRIPLET ADDR CHSPR NOP PRIORITY CHSWP NOP ID ADDR OF PROG, CODE BUSY FLAG * ISZ CRDFL,I JMP X0035 SWAP OUT FLAG = 2, CONTINUE * LDA CFLGS LOAD IN OR SWAP IN IOR CRDFL,I STA CRDFL,I JMP X0005 CONTINUE * * CHEMA NOP CONTENTS OF EMA WORD CHIDX NOP ID EXT ADDRESS * * * * EMA/MOTHER PTTN I/O COMPLETE * X0351 LDA CHRQ SLA,RSS READ? CLB NO, FORCE NO ERROR SSB YES, CHECK READ FOR ERRORS JMP X03AB ERROR, ABORT! * LDA CHEMA DONE LOAD/SWAP OF PROG, SZA,RSS EMA? JMP X0380 NO, DONE NOW * LDB CHSWP ADB D8 LDB B,I GET POINT OF SUSPENSION WORD CCE,SZB,RSS INITIAL LOAD? JMP X0380 YES, SKIP EMA CHUNK MOVES * LDB CHSWP STB CHSW2 SET CHUNK I/O CALL BUSY RBL,ERB SET SIGN BIT FOR $XSIO CALL STB CHSW3 * LDA CHIDX,I GET THE MSEG SIZE AND B37 CMA,INA MAKE IT NEGATINVE INA ADD 1 FOR BP STA B SAVE -MSEGSIZE+1 LDA CHMAT GET THE PHYS. START ADA D3 PAGE OF THIS PARTITION LDA A,I AND B1777 ADB A B HAS S.P.PART-MSEGSIZE+1 LDA CHSWP GET THE PROGS ID ADRS ADA D21 GET #PAGES FROM ID LDA A,I ALF,RAL SHIFT DOWN TO BOTTOM BITS RAL AND B37 ADB A B HAS S.P.PART+#PGS+1-MSEGSIZE STB CHKPG SET STARTPAGE EMA TO START SWAP LDA CHEMA GET EMASIZE TO FIND END OF AND B1777 SWAPPED AREA ADA B STA EMAEN * X0360 LDA SVCUR SAVE CURRENT USER MAP USA BEFORE MAPPING CHUNK CLA,INA CAX (X) = 1 REGISTER CLB (B) = 0 FOR PAGE# LDA D32 (A) = USER BASE PAGE REGISTER XMS ZAP B.P. SO RTIOC WON'T GET CONFUSED * LDA CHKPG ADA CHKSZ ADD CHUNK SIZE STA CHKNX TO GET START OF NEXT CHUNK CMA,INA ADA EMAEN SSA IS CHUNK PAST END OF EMA? JMP CHKSM YES, ADJUST # PAGES * LDA CHKSZ MAP IN THE CHUNK CHKMP CAX (X) = # PAGES IN CHUNK ALF,ALF RAL,RAL STA TEMP SAVE # WORDS IN CHUNK LDB CHKPG (B) = CHUNK PAGE START LDA CHKRG (A) = REGISTER # XMS * LDB CHMAT JSB PHYBP MAP IN USER'S BP ADA DM32 SAVE CHUNK MAP IN SECOND BP COPY IOR BIT15 USA * LDA CHKAD STA TEMP3 SET UP BEGINNING LOGICAL ADDR OF CHUNK LDA CHTRK STA TEMP1 SET TRACK # FOR SETUP LDA CHSCT STA TEMP2 SET SECTOR # FOR SETUP LDA CTRPA JSB SETUP BUILD TRIPLETS FOR CHUNK STA CTRP2 SET TOP ADDR OF TRIPLETS LDB TEMP1 STB CHTRK SAVE TRACK # FOR NEXT CHUNK, IF ANY LDB TEMP2 STB CHSCT SAVE SECTOR # FOR NEXT CHUNK, IF ANY * JSB $XSIO CHLU2 NOP DEF X0370 COMPLETION ADDR X0366 NOP LINK WORD CHRQ2 NOP READ/WRITE CTRP2 DEF CTRIP TRIPLET ADDR CHSP2 NOP PRIORITY CHSW3 NOP USE CURR USER MAP (ID ADDR + SIGN) * LDA RSCUR RESTORE USER MAP USA JMP X0005 SCHED NEXT PROG OR GO IDLE * * CHSW2 NOP CHUNK I/O BUSY FLAG CFLGS NOP UPPER 13 BITS OF PTTN STATUS WORD CRDFL NOP ADDR OF MAT PTTN STATUS WORD CHKPG NOP PAGE NUMBER OF CURRENT EMA CHUNK CHKNX NOP NEXT CHUNK PAGE NUMBER EMAEN NOP END OF EMA CHTRK NOP TRACK CHSCT NOP SECTOR EMAS NOP EMAL NOP CHMAT NOP MAT ADDR OF PROG D28 DEC 28 DM32 DEC -32 BIT15 OCT 100000 SVCUR DEF CURMP,I RSCUR DEF CURMP CURMP BSS 32 * * AN EMA CHUNK IS FROM LOGICAL PAGE 1 THRU PAGE 31 IN USER MAP * SO THAT LOGICAL PAGE 0 IS NOT USED. THE REASON IS THAT WE * WILL NOT HAVE TO RELOAD THE BASE PAGE FENCE TO PREVENT THE * SYSTEM COMMUNICATION AREA FROM SHOWING THROUGH THE TOP PART * OF THE USER BASE PAGE. IT IS NO BIG LOSS TO MAP JUST ONE * PAGE LESS! CHKSZ NOP CHUNK SIZE CHKRG NOP REGISTER NUMBER OF CHUNK IN USER MAP CHKAD NOP LOGICAL ADDR OF CHUNK * * CHKSM LDA CHKPG GET SIZE OF CHUNK FROM HERE CMA,INA TO END OF EMA ADA EMAEN LDB EMAEN STB CHKNX THERE IS NO NEXT CHUNK JMP CHKMP * * X0370 LDA CHRQ SLA,RSS READ? CLB NO, FORCE NO ERROR SSB YES, CHECK READ FOR ERROR JMP X03AB ERROR, ABORT! * LDA CHKNX STA CHKPG CMA,INA INSTEAD OF COMPARE, ADA EMAEN SUBTRACT TO SEE IF DONE SZA IF CHKNX = EMAEN THEN DONE JMP X0360 NO, NOT DONE YET * X0380 ISZ CRDFL,I FLAG =1 LOAD DONE, =3 SWAP DONE LDA CFLGS IOR CRDFL,I STA CRDFL,I LDB CHSWP CLA STA CHSWP STA CHSW2 LDA CHRQ ISZ $LIST FORCE LIST SCAN SLA WAS IT SWAP OUT? * JSB CLRLD NO, IT WAS LOAD. CLEAR LOAD BIT(B)=ID * CHECK SUBPTTN SWAPOUT * * X0385 LDA SUBFL ANY SUBPTTNS NEED TO SWAP OUT? SZA JMP SUBSS YES, START/CONTINUE SUBPTTN SWAP OUT JMP $XCQ NO, GO CHECK SCHEDULE/ABORT LISTS * * X03AB LDA CHSWP GET ID SEG ADDR OF PROGRAM JSB $ABRT AND GO ABORT IT JMP X0385 NOW GO SCAN THE LISTS * SKP DREL NOP ROUTINE TO RELEASE DISC SWAP TRK STB TEMP3 ADB D27 COMPUTE ID SEGMENT SWAP ADDRESS LDA B,I CCE,SZA,RSS SWAPPED, SO GO TO RELEASE JMP DREL,I NOT, SWAPPED, SO RETURN STA TEMP SAVE LU/TRK/#TRK AND B177 STA TEMP2 ISOLATE # TRACKS TO RELEASE CLA CLEAR ID SEGMENT STA B,I SWAP VALUE LDA TEMP ALF,ALF RAL AND B377 LDB TEMP SSB ADA TATSD L. U. 3 SO ADD # SYS TRACKS STA TEMP1 LDB TEMP2 (B) TO # OF TRACKS TO REL JSB $DREL CALL DISC TRACK RELEASE PROCESOR LDB TEMP3 ADB D28 LDA B,I JSB IDXAD GET ID EXT ADDR JMP DREL,I NOT EMA, EXIT ADA D2 LDA A,I GET # EMA SWAP TRACKS AND B1777 FROM WORD 2 SZA,RSS IF NO TRACKS JMP DREL,I DON'T RELEASE * STA B (B)=#TRACKS TO RELEASE LDA TEMP1 TRACK ADDR OF PROG + #TRACKS ADA TEMP2 = BEGIN TRACK OF EMA JSB $DREL RELEASE THE TRACKS JMP DREL,I RETURN HED DISP4 -- SWAP CHECK ROUTINE. CAN AND SHOULD WE SWAP? TEMP7 NOP * * SWPCK CHECKS TO SEE IF AN AREA SHOULD BE SWAPPED, * IT CHECKS: * 1. IF A SWAP OUT IS UNDER WAY (IF SO FORGET IT) * 2. IF THE BASE PAGE SWAP FLAG FOR THE AREA ALLOWS SWAPPING. * 3. IF THE RESIDENT PROGRAM HAS INHIBITED SWAPPING. * 4. IF THE RESIDENT PROGRAM IS SCHEDULED AND HAS HIGHER * OR EQUAL PRIORITY. * 5. IF THE RESIDENT IS DORMANT BUT HAS PRIORITY AND IS IN * THE TIME LIST AND ITS TIME IS "NEAR". * 6. IF THE RESIDENT IS I/O SUSPENDED * WITH THE BUFFER IN HIS AREA. * * ALL OF THE ABOVE CONDITIONS INHIBIT A SWAP. ( JMP X0035 ). * THE FOLLOWING CONDITIONS CAUSE THE INDICATED ACTIONS. * * 7. THE RESIDENT IS BEING READ IN BUT DOES NOT HAVE PRIORITY * CAUSES AN ABORT (I.E. STOP THE READ) RETURN. * 8. THE RESIDENT HAS NOT BEEN EXECUTED SINCE IT WAS LAST * LOADED FROM THE DISC CAUSES A READ RETURN (I.E. ASSUME * THE RESIDENT CAN BE RELOADED WHEN NEEDED) * * CALLING SEQUENCE: * * ALL THE MAT PTRS ARE SET UP BY EITHER MATEN OR MATAD * MRDFL,I = THE READ IN FLAG 0=READING, 1 = INCORE, 2 =SWAPPING OUT OR * SEGMENT LOAD, 3 = INCORE AND SWAPPED OUT. * (B)= THE RESIDENTS ID-SEGMENT ADDRESS * (E)= 0 NORMAL SWAP CHECK CALL * 1 SUBPARTITION SWAP CHECK CALL * JSB SWPCK * JMP ABORT ABORT (I.E. STOP LOAD) RETURN (A=B=E=0). * JMP SWP SWAP OUT RETURN * JMP LOAD LOAD RETURN * JMP NOSWP CAN'T SWAP RETURN, ONLY SUBPTTN CHECK (E=1) * * THE FOLLOW TEMP AREAS ARE USED IN SWPCK: * RINF EQU TEMP READ IN FLAG SAVE LOCATION RBUFA EQU TEMP1 ADDRESS OF CONWRD THEN BUFFER ADDRESS RPRIO EQU TEMP2 ADDRESS OF RESIDENTS PRIORITY, THEN TEMP RSUSP EQU TEMP3 ADDRESS OF RESIDENTS SUSP RTIML EQU TEMP4 ADDRESS OF RESIDENTS T BIT. RTIME EQU TEMP5 ADDRESS OF RESIDENTS TIME. RSWTR EQU TEMP6 ADDRESS OF RESIDENTS SMAN. RTSLC EQU TEMP7 ADDRESS OF RESIDENTS TIMESLICE WORD. SKP SWPCK NOP LDA MRDFL,I GET CURRENT PTTN STATUS AND B7 CPA D3 IF CURRENT IS SWAPPED OUT JMP SWPC4 GO MAKE LOAD RETURN * RAL,ERA PUT (E) INTO SIGN OF RINF STA RINF SAVE THE READ IN FLAG ELA,CLE,ERA IF SWAPPING OR LOADING A SEGMENT CPA D2 OR IF CLEARING SUBPARTITIONS RSS CPA D4 THEN RETURN CAN'T SWAP JMP X0N35 FORGET THE SWAP, TRY NEXT PTTN * INB INDEX TO THE I/O CONWRD ADDRESS STB RBUFA SAVE IT ADB D5 INDEX TO THE PRIORITY ADDRESS STB RPRIO SAVE IT ADB D2 INDEX TO THE SUSPENSION ADDRESS STB RSUSP SAVE IT ADB D6 INDEX TO THE TYPE/CORE LOCK BIT ADDRESS LDA B,I GET THE WORD AND B100 ISOLATE THE CORE LOCK BIT SZA IF SET JMP X0N35 FORGET THIS PTTN, TRY NEXT PTTN * INB INDEX TO THE STATUS LDA B,I GET STATUS TO A AND B417 ISOLATE THE STATUS (INCLUDE "LOADING" BIT) ADB D2 INDEX TO THE TIME LIST ADDRESS STB RTIML SAVE IT INB INDEX TO THE TIME ADDRESS STB RTIME SAVE IT ADB D9 INDEX TO THE SWAP TRACK ADDRESS STB RSWTR AND SAVE IT ADB D3 INDEX TO THE TIMESLICE ADDRESS STB RTSLC AND SAVE IT * LDB RPRIO,I GET THE PRIORITY CMB,CLE,INB SUBTRACT ADB ZPRIO,I SET E IF RES. WINS PRIORITY TEST STB RPRIO AND SAVE RESULT FOR TIMESLICE CHECK LDB RINF GET THE READ FLAG BLR,BRS CLEAR BITS 14,15 DON'T CHANGE (E) CPA D2 IF I/O SUSPENDED JMP SWPC3 GO DO I/O SUSP. CHECKS * CPA B401 IF IT'S BEING LOADED FROM DISC JMP SWPC3 GO DO I/O SUSP. CHECKS * SEZ,RSS IF THE CONTENDER HAS PRIORITY JMP SWPC1 GO CHECK IF SWAP IS NEEDED * LDB RPRIO IF CONTENDER HAS LOWER PRIORITY SZB GO CHECK JMP SW.1 RESIDENTS STATUS * * * CONTENDER IS SAME PRIORITY AS RESIDENT. IF RESIDENT HAS USED * A FULL SLICE (SLICE COUNT=0), LET THE CONTENDER USE THE PARTITION. * * LDB RTSLC,I FETCH TIMESLICE WORD OF RESIDENT SZB,RSS IF FULL SLICE USED, JMP SWPC1 LET CONTENDER HAVE IT * SW.1 CPA D1 IF RESIDENT IS SCHEDULED JMP X0N35 FORGET THIS PTTN, TRY NEXT PTTN * LDB RTIML,I GET THE TIME LIST BIT BLF,SLB IF IN TIME LIST CLE,SZA AND DORMANT JMP SWPC1 NO SO GO CHECK IF SWAP IS NEEDED * DLD $TIME GET THE SYSTEM TIME DIV BTRIP !! DIVIDE BY ZERO TO SET POS. !! BTRPA EQU *-1 DEF TO BTRIP ADA RTIME,I SUBTRACT THE ID-SEG TIME VALUE SEZ,CLE IF OVERFLOW INB STEP B ISZ RTIME STEP TO NEXT TIME WORD ADB RTIME,I ADD THE HIGH WORD ADA SWPTM ADD THE NEG. OF # OF TICKS SYS WILL WAIT. SEZ,SZB,RSS IF HIGH VALUE IS ZERO AND SSA,RSS THE DIFF < LIMIT JMP SWPC1 * CPB SWPTM & LIMIT NOT = 0 RSS JMP X0N35 FORGET THE SWAP, TRY NEXT PTTN * SWPC1 LDA RSUSP,I SWAP IN ORDER TEST IF THE RESIDENT LDB RSWTR,I WAS RUN SINCE LAST LOAD CLE,SZB,RSS IF SWAP TRACKS STILL ASSIGNED OR SZA,RSS POINT OF SUSP IS ZERO SWPC4 ISZ SWPCK THEN JUST READ SWPC2 ISZ SWPCK ELSE SET SWAP RETURN (E=0) JMP SWPCK,I EASY ISN'T IT? SPC 1 * * NOTE: IF LOAD IN PROGRESS, DON'T ABORT IT UNLESS * CONTENDER IS OF HIGHER PRIORITY (I.E., DON'T * ABORT IF SAME PRIORITY FOR TIMESLICING). (E) * WILL BE SET IF RESIDENT IS > OR = IN PRIORITY* * SWPC3 CLA E = 0 IF HE HAS PRIORITY SEZ,SZB,RSS IF READING IN AND PRIORITY JMP SWPCK,I RETURN P+1 WITH A = 0 (ABORT) * SZB,RSS IF READING IN BUT NOT PRIORITY JMP X0N35 FORGET THIS PTTN, TRY NEXT PTTN * * THE FOLLOWING CODE WILL ALLOW THE SWAPPING OF * PROGRAMS SUSPENDED FOR UNBUFFERED I/O REQUESTS. * * LDA RBUFA,I GET CONWRD. * RAR IF IT IS A * SSA,SLA CONTROL REQUEST * JMP SWPC2 THEN ALLOW SWAP. * * IF UNBUFFERED CONTROL DON'T SWAP * LDA RBUFA,I GET COMMAND AND D3 IF CONTROL CPA D3 JMP X0N35 DON'T SWAP * * ISZ RBUFA ELSE INCREMENT TO THE BUFFER ADDRESS. LDA RBUFA,I GET BUFFER ADR CLE,SSA IS IT A RE-ENT BUFFER JMP SWPC2 YES CAN SWAP * LDA RBUFA ADA D20 INDEX TO LOW MAIN LDA A,I CMA,CLE,INA SUBTRACT FROM BUFF ADDR ADA RBUFA,I IF BUFF ADDR IS BELOW LOW MAIN SEZ,RSS THEN IT IS IN COMMON, SWAP OK. JMP SWPC2 (E=0) SWAP RETURN * * X0N35 - GET HERE IF SWPCK TRIED TO DISPATCH A PROGRAM * IN A PARTITION BUT FOUND THAT IT WAS NO SWAPPABLE * AT THE TIME (IF EVER). IF THE PROGRAM TO BE * DISPATCHED DOES NOT REQUIRE A SPECIFIC PARTITION * NUMBER, THEN A SWAP WILL BE TRIED ON THE NEXT * PARTITION IN THE ALLOCATED LIST. * X0N35 LDA RINF SSA,RSS DOING SPECIAL SUBPTTN CHECK? JMP X0N36 NO * ISZ SWPCK YES, RETURN NOSWP CONDITION JMP SWPC4 * X0N36 LDA ZMPID,I WAS SPECIFIC PTTN ASSIGNED FOR SSA PROGRAM TRYING TO DISPATCH? JMP X0035 YES, CAN'T USE ANOTHER PTTN. JMP SCHL2 NO, TRY NEXT PTTN IN LIST, IF ANY LEFT * SPC 1 SWPTM DEC -15 MAX WAIT IS 150 MS. D9 DEC 9 B401 OCT 401 HED SWOUT & SWPIN THE MAP SAVE & RESTORE SWAPPING ROUTINES * * * THE SWOUT ROUTINE IS CALLED FOR ALL PROGRAMS TO BE SWAPPED OUT TO THE * DISC. IT'S PURPOSE IS TO SAVE THE USER MAPS IN THE USER AREA SO * THAT ON SWAP IN THE MAP REGISTERS WILL BE RESTORED TO THE SAME * CONDITION, RELATIVE TO THE START OF THE PARTITION, THAT THEY WERE WHEN * THE SWAP OUT OCCURED. THIS IS DONE BY MAPPING IN THE FIRST TWO PAGES * OF THE USERS PARTITION AND THEN SAVING THE MAP AS IT EXISTS IN THE * UNUSED PORTION OF THE USERS BASE PAGE INTO WORDS 2 - 34 OF THE * SECOND PAGE OF THE PARTITION. THIS IS THE AREA RIGHT BEHIND THE * THE X & Y REGISTER SAVE AREA. ON SWAP IN THIS INFO WILL BE USED * TO REBUILD THE MAP REGISTERS. * * * CALLING SEQUENCE : JSB SWOUT * * MADR = ADDRESS OF MAT START PAGE WORD * (IE MATAD HAS BEEN CALLED) * * E-REG = 0 SWAP OUT * E-REG = 1 ALREADY SWAPPED OUT BUT * BUT WE INTEND TO RESCHEDULE * THE PROGRAM. * * E-REGISTER IS PRESERVED. * * SWOUT NOP LDA MADR,I GET THE START PHYS PAGE OF PART'N AND B1777 KEEP ONLY THE START PAGE # STA B B = START PAGE LDA D2 CAX X = # OF PAGES TO MAP LDA $DVPT A = START REGISTER # XMS MOVE 1ST TWO PAGES OF PART'N INTO DVR MAP * LDA ADBPC GET THE ADDRESS OF THE REGISTERS (A=SOURCE) LDB A NOW GET THE DESTINATION ADB D34 ADDRESS TO B. SEZ ARE WE SAVING OR RESTORING ? SWP RESTORING. MVW D32 *** SAVE OR RESTORE THE USER MAP AS IT EXISTS *** JMP SWOUT,I RETURN * SKP * * * THE SWPIN ROUTINE IS CALLED FOR ALL PROGRAMS THAT HAVE BEEN * SWAPPED BACK INTO MEMORY. IT GETS THE 32 WORDS OF MAP INFO * SAVED BY SWOUT AND CONFIGURES THESE WORDS TO MAKE SENSE FOR * THE CURRENT PARTITION. IT USES $LOW & $HIGH AS THE LIMITS * OF THE PARTITION AREA. $HIGH WILL PROBABLY BE USED LATER * FOR SHAREABLE EMA. * * * CALLING SEQUENCE JSB SWPIN * MLNK = ADDR OF MAT ENTRY OF * INTEREST. * * SWPIN NOP LDB MLNK GET MAT ADDR OF INTEREST ADB D3 SAVE THE START PG OF THIS PART'N LDA B,I AND B1777 STA STPG# STPG# = START PG # OF THIS PART'N * STA B B = START PG # LDA D2 CAX X = # OF PAGES TO MAP LDA $DVPT A = START REGISTER # XMS MAP 1ST TWO PAGES OF PART'N INTO SYS MAP * LDB ADBPC GET THE DEST BUFFER ADDRESS OF NEW MAP INFO STB NEW AND SAVE FOR OFFSET TESTS. ADB D34 GET THE READ BUFFER ADDRESS OF OLD MAP INFO LDA STPG# NOW IF THE CURRENT START PAGE # EQUAL OLD CPA B,I THEN WE MUST HAVE SWAPPED THIS GUY BACK INTO THE JMP NOMAP SAME PARTITION & NO OFFSET TESTS ARE NEEDED. * STB OLD OLD = ADDRESS OF BUFFER OF OLD MAP INFO LDB B,I GET THE OLD START PAGE CMB,INB & MAKE NEG FOR TESTS STB OBASE OBASE = OLD BASE ( START PG OF LAST PART'N) * LDB DM32 GET THE MAP REG COUNT & STB KNTR SET IT UP SPC 1 * WHEN SHAREABLE EMA COMES KNTR = #PGS PROG ONLY * THAT WAY THE EMA PAGE #'S WON'T BE EFFECTED. SPC 1 JMP SETIT OK, SO SET UP THE NEW MAPS. * * NXPG# LDA OLD,I GET THE NEXT OLD PAGE # LDB $LOW GET THE LOWEST PAGE # FOR PART'NS CMB,CLE,INB MAKE NEG ADB A NOW IF THE OLD PAGE WE ARE LOOKING LDB A AT IS BELOW THE LOWEST PARTITION PAGE CMB,SEZ,CLE,INB OR IS ABOVE THE LARGEST ADB $HIGH PAGE KNOWN BY THE SYSTEM, SEZ,RSS JMP SETIT THEN JUST LEAVE IT AS IS. * ADA OBASE HERE IF $LOW <= (OLD PG #) <= $HIGH ADA STPG# ADD START PAGE OF THIS PART'N * SETIT STA NEW,I THIS IS NOW THE NEW PAGE # ISZ OLD BUMP A FEW POINTERS ISZ NEW ISZ KNTR DONE ? JMP NXPG# NO, SO AROUND WE GO. * LDB ZIDEX ONE LAST THING TO DO. SZB,RSS THIS AN EMA PROG ? JMP SWPIN,I NO, SO WE'RE DONE. * INB YES, SO WE NEED TO SET UP THE NEW START LDA B,I PAGE OF EMA. SO GET THE OLD AND B1777 EMA START PAGE. ADA OBASE AND CALCULATE THE NEW START PAGE ADA STPG# * XOR B,I NOW PLACE IT BACK AND B1777 INTO THE ID EXTENSION UNDER THE XOR B,I RULES OF STA B,I WOO. JMP SWPIN,I SO NOW WE'RE DONE. RETURN TO CALLER. * * NOMAP LDA B PROG SWAPPED BACK INTO SAME PART'N LDB ADBPC MVW D32 RESTORE MAP TO BASE PAGE JMP SWPIN,I RETURN * * $LOW NOP STARTING PAGE # OF THE PROG PART'N AREA $HIGH NOP LAST PAGE # OF THE PROGRAM PART'N AREA OLD NOP BUFFER ADDRESS OF OLD MAP INFO NEW NOP BUFFER ADDRESS OF NEW MAP INFO KNTR NOP LOOP COUNTER SET TO -32 OBASE NOP NEG START PAGE # OF LAST PART(N PROG WAS IN STPG# NOP STARTING PAGE # OF THIS PARTITION D34 DEC 34 * HED DISP4 -- PRELIMINARY SETUP FOR DISK CALL HED DISP4 -- PRELIMINARY SETUP FOR DISK CALL * PREST SETS UP FOR A DISC LOAD OR SWAP AS FOLLOWS: * * 1. SETS MEMORY BOUNDS FOR THE PROGRAM * TEMP = #WORDS IN MAIN * TEMP3 = FIRST WORD OF MAIN * TMP = #WORDS IN BASE PAGE * TMP1 = FIRST WORD OF BASE PAGE * * 2. IF SWAP, GET SWAP TRACKS IF REQUIRED * AND SETS SMAN IN THE ID-SEGMENT. * * 3. SETS THE INITIAL DISC ADDRESS * TEMP1 = TRACK ADDRESS * TEMP2 = SECTOR ADDRESS * B = LU OF DISC * * 4. SETS THE NUMBER OF SECTORS: * CN#SC = -NUMBER OF SECTORS/TRACK * * 5. CALLS SETUP TO BUILD THE TRIPLET FOR THE LOAD * * PREST CHECKS THE FOLLOWING OPTIONS: * * 1. SHORT ID-SEGMENT (BG-SEGMENT LOAD) * 2. THE "ALL OF CORE" BIT CAUSES THE WHOLE AREA * TO BE SWAPPED ALONG WITH ALL OF THE AREA * BASE PAGE. * 3. IF SWAP THEN THE FIRST WORD IS ALWAYS THE AREA * BOUNDRY. * 4. IF SWAP AND NO TRACK ASSIGNED THEN SWAP TRACKS * ARE ALLOCATED. * * CALLING SEQUENCE: * * PREST ASSUMES -BGLWA- AND -AVMEM- ARE SET UP FOR PROG TO BE SWAPPED * B = ID-SEGMENT ADDRESS * E = 1 FOR LOAD * E = 0 FOR SWAP OUT * A = BOTTOM OF TRIPLET TABLE * JSB PREST * * ON RETURN: * B = DISC LU * A = DEF OF TRIPLET TABLE FOR XSIO CALL * * ABNORMAL EXIT * * A JMP IS MADE TO X0035 IF NO DISC TRACKS ARE AVAILABLE * FOR SWAPPING. * * INTERNAL TEMP AREA USAGE: * TEMP4 - TRIPLET QUE ADDRESS * TEMP5 - PROGRAM TYPE WORD * TEMP6 - MEMORY ADDRESS POINTER TO ID-SEGMENT. * TMP2 - DISC ADDRESS POINTER TO ID-SEGMENT. SKP PREST NOP STA TEMP4 SAVE THE TRIPLET QUE ADDRESS CLA SET THE START SECTOR STA TEMP2 ADDRESS FOR SWAP OPTION CPB XEQT IF CURRENT EXECUTING STA XEQT PROGRAM CLEAR THE FLAG ADB D14 INDEX TO TYPE WORD LDA B,I GET PROGRAM TYPE TO A STA TEMP5 SAVE IT ALF,ALF ROTATE THE SHORT ID-SEG. BIT ALF,SLA,RAR TO ZERO AND TEST INB,RSS ADB D8 INDEX TO MEMORY ADDRESSES STB TEMP6 SAVE THE MEMORY ADDRESS ADB D4 INDEX TO THE DISC ADDRESS STB TMP2 AND SAVE IT SSA IF SHORT ID-SEG. JMP SEGCK GO CHECK SEGMENT LIMITS ALF,RAL AND D15 IF PROG TYPE = 5 CPA D5 JMP SEGCK GO CHECK SEGMENT LIMITS * * ******************************************* **E=0IF SWAP,B=0 IF FIRST LOAD******* ******************************************* * SEZ,INB STEP TO SWAP DISC ADDRESS LDB B,I GET SWAP ADDRESS (SKIPPED IF SWAP) CMB,CLE,INB,SZB IF SWAP TRACK OR SWAPPING ISZ TMP2 STEP THE DISC ADDRESS TO SMAN. PRES1 LDB TEMP6,I GET THE ID-SEG LOW MAIN ADD. ISZ TEMP6 STEP THE MEMORY ADDRESS TO HIGH MAIN STB TEMP3 CMB,INB NEGATE SEZ IF FIRST LOAD JMP PRES2 GO SET UP TRUE TO ID-SEG. * LDA TMP2 INA LDA A,I STA ZIDX0 JSB IDXAD GET ID EXT ADDR JMP PRES6 NOT EMA, ZIDX0=0 STA ZIDX0 SAVE ID EXT ADDR INA LDA A,I RAR AND B76K ADB A JMP PRES5 MAKE SURE (A)#0 * PRES6 LDA TEMP6 INDEX TO # OF PAGES WORD ADA DM2 LDA A,I AND B76K GET # OF WORDS LDB A TO B REG * CCA (A) = -1 SWAP ALL OF PTTN PRES5 STB TEMP SET #WORDS IN MAIN ISZ TEMP6 STEP TO LOW BASE PAGE LDB TEMP6,I GET LOW BP STB TMP1 AND SET IT ISZ TEMP6 STEP TO HIGH BASE PAGE CMB,INB SZA INITIAL LOAD? JMP PRES9 NO, USE ALL OF POSSIBLE BP (A#0) * ADB TEMP6,I YES, USE ACTUAL HIGH BP BOUND (A=0) RSS PRES9 ADB BPA2 STB TMP SET BASE PAGE SIZE CMA,CLE,INA SET E IF FIRST LOAD LDA TMP2,I GET THE DISC ADDRESS SZA IF NONE SKIP JMP PRES7 DISC DEFINED GO SET UP * * GET SWAP TRACKS * LDA B GET BASE PAGE SIZE ADA B177 FORCE SIZE UP TO NEXT SECTOR AND C177 TRUNCATE TO EVEN SECTOR STA TMP SAVE LDA TEMP WHILE CHECK MAIN SIZE ADA B177 FORCE SIZE UP TO NEXT SECTOR AND C177 TRUNCATE TO EVEN SECTOR STA TEMP SAVE MAIN SIZE FOR SETUP ADA TMP ADD IF ANY ROUNDED UP FROM BP ALF,ALF DIVIDE BY 128 WORDS RAL TO GET #SECTORS STA PRSCT CLB DIV #SCT DIVIDE BY MIN #SECTORS/TRACK SZB IF REMAINDER INA BUMP STA SETUP SET #TRACKS IN SMAN * LDB TMP2 INB INCRE TO EMA WORD LDA B,I SZA EMA PROG? JMP PRESA YES, ADD EMA TRACK NEEDS * STA EMTRK NO, JUST SWAP PROG LDA SETUP JMP PRESB * PRESA AND B1777 GET EMA SIZE (IN PAGES) ALF,RAR MULT BY 8 TO GET #SECTORS ADA PRSCT ADD #SECTORS NEEDED FOR PROG CLB DIV #SCT DIVIDE BY #SECTORS/TRACK SZB TO GET # OF TRACKS INA BUMP #TRACKS IF ANY OVERFLOWED LDB SETUP CMB,INB SUBTRACT #TRACKS FOR PROG ADB A FROM TOTAL #TRACKS STB EMTRK FOR #TRACKS IN EMA * PRESB CLB GO TO SYS TO GET TRACKS JSB $DREQ ERB,SLB SET LEAST LU BIT IN E SKIP IF NONE ALF,SLA,ALF ROTATE TRACK SKIP ALWAYS JMP X0035 NO TRACKS EXIT TO SWITCHER * ERA,CLE SET LU BIT IN TRACK WORD IOR SETUP ADD THE # TRACKS STA TMP2,I AND SET BACK IN ID-SEG * LDB ZIDX0 (A)=SWAP WORD, (E)=0 SZB,RSS EMA PROG? JMP PRES7 NO * STA SETUP SAVE (A) TEMPORARILY ADB D2 INDEX TO EMA SWAP TRACKS WORD LDA EMTRK STA B,I SET #EMA SWAP TRACKS LDA SETUP RESTORE (A) * * DECODE TRACK/SECTOR ADDRESS IN A * PRES7 AND B177 MASK OUT THE SECTOR/#TRACKS CLB,SEZ,INB SET B TO 1,SKIP IF SWAP STA TEMP2 SET SECTOR ADDRESS XOR TMP2,I GET THE TRACK/LU ASL 1 SET LU IN B/TRACK IN HIGH A ALF,ALF BRING DOWN THE TRACK STA TEMP1 SET THE TRACK ADDRESS LDA SECT2 GET THE SECTOR SIZE FOR LU 2 SLB IF LU IS 3 LDA SECT3 USE 3'S NUMBER CMA,INA SET NEGATIVE STA CN#SC NUMBER OF SECTORS/TRACK * * NOW CALL SETUP TO BUILD THE TRIPLETS * STB TEMP6 SET LU IN A SAFE PLACE LDA TEMP4 GET THE TRIPLET ADDRESS JSB SETUP SET UP THE MAIN LDB TMP STB TEMP SET UP FOR THE LDB TMP1 BASE PAGE STB TEMP3 AND JSB SETUP GO BUILD IT'S TRIPLETS LDB TEMP6 RESTORE THE LU TO B JMP PREST,I NOW THAT WASN'T HARD WAS IT? SPC 2 PRES2 CLA (A) = 0 TO USE REAL BOUNDS ADB TEMP6,I JMP PRES5 * SEGCK LDB FENCE IS IT BELOW THE FENCE CMB,INB ADB TEMP6,I LOW MAIN(SEGMENT) SSB JMP SEGER YES GO ABORT * LDB TEMP6 INB LDB B,I GET HIGH MAIN (SEGMENT) CMB,INB ADB BGLWA DOES IT FIT IN PART'N INB CCE,SSB,RSS SET E FOR OK COND'N JMP PRES1 IT WILL FIT * SEGER LDB D8 IT WON'T FIT JMP $SCXX GO PRINT SC08 AND ABORT * SPC 2 C177 OCT 177600 DM2 DEC -2 #SCT NOP EMTRK NOP PRSCT NOP HED DISP4 -- DISK CALLING SEQUENCE GENERATOR * * DISK READ/WRITE CALLING SEQUENCE GENERATOR ROUTINE * ON ENTRY * TEMP = NUMBER OF WORDS * TEMP1 = TRACK ADDRESS * TEMP2 = SECTOR ADDRESS * TEMP3 = STARTING MEMORY ADDRESS * A = PARAMETER TABLE ADDRESS * * THE DISC PARAMETER GENERATOR FUNCTION IS TO GENERATE * * PARAMETERS FOR DISC CALL GUARANTEEING THAT ALL * * TRACK CROSSING CALLS ARE BROKEN DOWN INTO SUB-CALLS * * SUCH THAT THE DISC DRIVER CAN HANDLE THE REQUEST. * * THE CALLS ARE BROKEN UP IN TRIPLETS OF * * STARTING CORE MEMORY ADDRESS * * NUMBER OF WORDS TO TRANSFER * * STARTING TRACK/SECTOR ADDRESS. * * THE END OF CALL IS INDICATED BY A ZERO FOLLOWING * * THE LAST TRIPLET. * * * SETUP NOP ENTRY/EXIT LDB TEMP COMPUTE NUMBER OF SECTORS SETU1 SZB,RSS ZERO, SO RETURN JMP SETUP,I ADA DM3 SET UP TRIPLET STA DSTAD ADDRESS ADB B177 ROUND UP NUMBER ASR 7 OF SECTORS BLS STB TEMP5 SAVE NUMBER OF SECTORS LDA TEMP2 INITIAL SECTOR ADDRESS ADA B ADA CN#SC SUB CURRENT # SECTORS/TRACK LDB TEMP3 STB DSTAD,I STORE STARTING MEMORY ADDRESS ISZ DSTAD INCREMENT ARRAY ADDRESS CMA,CLE,INA,SZA CLE,SSA,RSS CHECK IF TRACK OVERFLOW JMP SETI0 NO, SO LAST TRIPLET ADA TEMP5 YES, USE REST OF TRACK IF OVER. ASL 6 UPSET LDB TEMP1 FORM BLF,RBL TRACK RBL,RBL ADDRESS ADB TEMP2 AND SECTOR ADDRESS DST DSTAD,I STORE LAST TWO WORDS OF TRIPLET DSTAD EQU *-1 ADA TEMP3 UPDATE STARTING STA TEMP3 MEMORY ADDRESS LDB TEMP2 INCREMENT SECTOR ADDRESS ADB TEMP5 TO START SECTOR FOR SEZ CHECK IF NEW TRACK CLB,RSS RSS NOT NEW TRACK SO SKIP ISZ TEMP1 YES, SO INCREMENT TRACK ADDRESS STB TEMP2 RESET SECTOR LDB DSTAD,I UPDATE NUMBER CMB,INB OF ADB TEMP WORDS STB TEMP TO GO CCA SUB 1 FOR CORRECT NEXT TRIPLET ADA DSTAD ADDRESS CALC. JMP SETU1 GO TO NEXT LOOP SPC 1 SETI0 LDA TEMP SET FOR LAST JMP UPSET TRIPLET HED DISP4 -- READ SETUP * * SETUP TO READ IN BACKGROUND DISK RESIDENT PROGRAM SEGMENT * $BRED EQU * $SGLD NOP ENTRY/EXIT CLA CPA SGSWP SEGMENT LOAD CALL BUSY? JMP SGLD1 NO, SO DO SEGMENT LOAD * LDB XEQT YES, SEGMENT LOAD CALL BUSY STA XEQT CLEAR CURRENT EXECUTING PROG STB SGSUP AND SET IT SEGMENT SUSPENDED JMP X0035 TRY NEXT SCHEDULED PROG * SGLD1 STB SGTMP SAVE THE SHORT ID SEG ADDRESS LDA XEQT GET THE MAINS ID SEG ADDRESS JSB MATEN NOW SET UP THE MAT POINTERS LDB SGTMP GET THE SHORT ID ADDRESS * LDA D2 IOR MFLGS SET READ IN WAIT FLAG STA MRDFL,I PTTN STATUS =2 LOAD SEG CLA,CCE,INA (E=1) FOR PREST TO LOAD STA SGRQ SET READ REQUEST LDA MPRIO,I STA SGPR SET PRIORITY LDA STRPA JSB PREST ADB MSIGN STB SGLU SET LU STA STRP SET TRIPLETS ADDR LDA MID,I AFTER PREST CALL RETURNS STA SGSWP SET SEGMENT I/O CALL BUSY LDA MRDFL STA SRDFL SAVE FLAG WORD ADDR LDA MFLGS STA SFLGS SAVE HIGH BITS * JSB $XSIO SGLU NOP LOGICAL UNIT DEF X0422 COMPLETION ADDR X0455 NOP LINK WORD SGRQ OCT 1 REQUEST CODE STRP DEF STRIP TRIPLETS ARRAY ADDR SGPR NOP PRIORITY SGSWP NOP ID SEGMENT ADDR LDB MID,I JSB $LIST SUSPEND SEGMENT UNTIL DONE OCT 402 JMP $SGLD,I RETURN, SEGMENT LOAD INITIATED * * SRDFL NOP SGTMP NOP SFLGS NOP $PGID EQU SGSWP $SGID EQU SGTMP STRPA DEF STRIP MSIGN OCT 100000 SGSUP NOP * * * SEGMENT LOAD COMPLETION SECTION * X0422 STB TEMP SAVE COMPLETION STATUS LDB SFLGS INB STB SRDFL,I FORCE PTTN STATUS=1 * LDB SGSWP FETCH ID ADDR STB TEMP1 SAVE FOR POSSIBLE $LIST ERROR & CLRLD CLA STA SGSWP CLEAR BUSY FLAG STA SGSUP CLEAR SEGMENT SUSPEND FLAG * JSB $LIST CALL $LIST TO SCHEDULE PROGRAM OCT 401 * SZA IF LIST ERROR JMP X0126 GO ABORT PROGRAM * LDA SGRQ LDB TEMP1 FETCH ID ADDRESS JMP X0125 DO OTHER COMPLETION STUFF * HED DISP4 -- SYSTEM START UP ******************************************************************** * THE START SECTION: * * CLEARS INTERRUPT SYSTEM * * SETS FENCE REGISTER TO 0 * * CLEARS XEQT * * SCHEDULES 'FMGR' IF PRESENT * STARTS THE CLOCK BY CALLING $SCLK IN RTIME MODULE * THIS SECTION IS EXECUTED ONCE - IT IS OVERLAYED ******************************************************************** * $ZZZZ NOP * STB DFMG SET THE NAME ADDRESS CLC 0 CLEAR INTERRUPT SYSTEM JSB MPINT GO DO MAP STUFF * * DEFINE HIGH AND LOW BOUNDS OF PARTITION PAGES * LDA $MNP GET THE MAX # OF PART'NS CMA,INA AND SET NEG FOR LOOP N#PTN LDB $MATA GET THE MATA TABLE ADDRESS * MADD STA *-1 LOOKS STRANGE DOESN'T IT ? NXPTN STB *-1 * ADB D3 INDEX TO THE START PAGE WORD LDA B,I AND B1777 KEEP ONLY PAGE BITS STA STPG# INB LDA B,I GET THE # OF PAGES IN THE PART'N AND B1777 KEEP ONLY PAGE BITS ADA STPG# A = START PG# + # OF PAGES LDB $HIGH GET THE HIGHEST PAGE # SO FAR CMB,INB NOW IF THE CURRENT SUM IS LARGER ADB A THAN THE PAST SUM SSB,RSS THEN USE THE CURRENT SUM AS LAST PAGE STA $HIGH IN THE SYSTEM (USED BE SWAPPING ROUTINES) * LDB MADD GET THE CURRENT PART'N MATA ADDRESS ADB D7 INDEX TO THE NEXT ONE ISZ N#PTN WE DONE ? JMP NXPTN NO, SO DO NEXT PARTITION. * LDB $MATA YES, SO NOW FIGURE ADB D3 OUT THE START OF THE PARTITION AREA LDA B,I GET THE PAGE # AND B1777 KEEP ONLY PAGE BITS STA $LOW SET AS START OF THE PARTITION AREA * * LDA SWAP SET UP THE SWAP DELAY ALF,ALF AND B377 CMA,INA SET NEGATIVE STA SWPTM SET THE VALUE * LDA SECT2 FIND MINIMUM # SECTORS/TRACK LDB SECT3 SUBTRACT # FOR LU 3 CMB,INB,SZB FROM # FOR LU 2. ADB SECT2 IF POSITIVE RESULT, CMB,SSB,INB,SZB LU 3 IS SMALLER. LDA SECT3 OTHERWISE, USE LU 3 ARS CONVERT 64 WORD SECTORS STA #SCT TO 128 WORD SECTORS LDA SKEDD SAVE THE CURRENT STA ZWORK SCHEDULE POINTER SPC 1 JSB $LIST SCHEDULE 'FMGR' PROGRAM OCT 201 IF IT IS IN THE SYSTEM. DFMG DEF * SZA JMP ZEXIT NO - BTRIP NOP END OF BG TRIPLETS CHKBG EQU BTRIP-$ZZZZ-21 INSURE AT LEAST 7 TRIPLETS LDA SKEDD LDB A,I INSURE 'FMGR' IS CPB ZWORK FIRST IN THE SWP SCHEDULED LIST. STB SKEDD STA B,I CLB STB A,I LDB TATLG INHIBIT ALL TRACK STB $OTAT ALLOCATIONS UNTIL (SAVE IN TBL AREA 2) CCB 'FMGR' EXECUTES. STB TATLG 'FMGR' UNDOES THIS SPC 1 JMP ZTYPE * FNMP OCT 2000 B1740 OCT 1740 * ********MAP INITIALIZATION************** ******* MPINT NOP LDA $MPFT ADA D4 LDA A,I GET START OF SSGA ADA DM1 STA $SGAF RTRIP NOP END OF RT TRIPLETS CHKRT EQU RTRIP-BTRIP-21 INSURE AT LEAST 7 TRIPLETS * LDA $DVPT SET UP LOGICAL ADDR ALF,ALF IN DRIVER PARTITION FOR RAL,RAL ACCESSING USER'S BP COPY IOR B1740 OF USER MAP STA ADBPC * LDA $MPFT INA LDA A,I GET START OF MEM RES LIB AND B76K ALF RAL,RAL STA B LDA LBORG AND B76K ALF RAL,RAL STA LBREG LIB PAGE REGISTER START CMA,INA ADA B STA LB#PG NUMBER OF PAGES IN LIB LDA $MRMP ADA LBREG LDA A,I STRIP NOP END OF SEGMENT TRIPLETS CHKSG EQU STRIP-RTRIP-21 INSURE AT LEAST 7 TRIPLETS AND B1777 STA LBPG# LDA LBREG ADA B40 STA LBREG * LDA $CMST USE AREA FROM START OF COMMON CMA,INA TO THE END OF USER MAP ADA D32 FOR DOING I/O ON CHUNKS OF STA CHKSZ EMA TO BE SWAPPED LDA $CMST ADA D32 STA CHKRG STARTING REG# IN USER MAP LDA $CMST ALF,ALF RAL,RAL STA CHKAD SAVE LOGICAL ADDR * LDA $MRMP GET ADDRESS MEM RES MAP USA LOAD USER MAP CLA XMA SET DMA1 FROM SYS MAP INA XMA SET DMA2 FROM SYS MAP LDA BPA2 GET LAST USER LINK INA INCREASE TO FIRST SYSTEM LINK IOR FNMP SET BIT 10 TO SHOW LOWER MAPPED LFA SET FENCE FOR BP JSB LSTIN INITIALIZE PTTN LIST PTRS JMP MPINT,I * CTRIP NOP END OF MOTHER PTTN TRIPLETS CHKCH EQU CTRIP-STRIP-21 INSURE AT LEAST 7 TRIPLETS CTRPA DEF CTRIP HED DISP4 -- ** SYSTEM BASE PAGE COMMUNICATION AREA ** * * *** SYSTEM BASE PAGE COMMUNICATION AREA *** * XIDEX EQU 1645B ADDR OF CURR ID SEG EXT XMATA EQU 1646B ADDR OF CURR MAT ENTRY XI EQU 1647B . EQU 1650B ESTABLISH ORIGIN OF AREA * * SYSTEM TABLE DEFINITION * INTBA EQU 1654B SKEDD EQU 1711B * * * DEFINITION OF EXECUTING PROGRAM ID SEGMENT' * * XEQT EQU .+39 ID SEGMENT ADDR. OF CURRENT PROG. XLINK EQU .+40 'LINKAGE' XPRIO EQU .+46 'PRIORITY' WORD XPENT EQU .+47 'PRIMARY ENTRY POINT' XSUSP EQU .+48 'POINT OF SUSPENSION' XA EQU .+49 'A REGISTER' AT SUSPENSION XB EQU .+50 'B REGISTER' XEO EQU .+51 'E AND OVERFLOW SWAP EQU 1736B * * DEFINITION OF MEMORY ALLOCATION BASES * * BPA2 EQU .+59 LWA R/T DISC RES. BP LINK AREA LBORG EQU .+61 FWA OF RESIDENT LIBRARY AREA RTDRA EQU .+64 FWA OF R/T DISC RESIDENT AREA AVMEM EQU .+65 FWA OF SYSTEM AVAILABLE MEMORY BGDRA EQU .+68 FWA OF BGG DISC RESIDENT AREA * * UTILITY PARAMETERS * TATLG EQU .+69 LENGTH OF TRACK ASSIGNMENT TABLE TATSD EQU .+70 # OF TRACKS ON SYSTEM DISC SECT2 EQU .+71 # SECTORS/TRACK ON LU 2 (SYSTEM) SECT3 EQU .+72 # SECTORS/TRACK ON LU 3 (AUX.) * FENCE EQU .+85 MEM PROTECT FENCE ADDRESS * BGLWA EQU .+87 LWA OF MEMORY IN BACKGROUND * A EQU 0B LOCATION OF A REGISTER B EQU 1B LOCATION OF B REGISTER ORG * PROGRAM LENGTH ORIGINALLY 2716 (8) ? EQU *-2716B END $ZZZZ