ASMB,L,C,Q,Z ** RT SCHEDULER MODULE ** NON-DEBUG *ASMB,L,C,Q,N ** RT SCHEDULER MODULE ** DEBUG * HED RTE SCHEDULER/MESSAGE PROCESSOR * NAME: SCHED * SOURCE: 92067-18110 * RELOC: 92067-16103 * PGMR: G.A.A.,L.W.A.,D.L.S.,C.M.M.,G.L.M. * DATE: 6/27/78 * * *************************************************************** * * (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 SCHD4,0 92067-16103 REV.2040 800731 * * SUP PRESS EXTRANIOUS LISTING ******************************************************************* * HISTORY * * *G.A.A. RTE 2 VERSION JULY 1973 *L.W.A. RTE 3 VERSION APRIL 1975 *D.L.S. ENHANCEMENTS MAY 1977 *C.M.M. RTE 4 VERSION JAN 1978 *G.L.M. RTE 4 SM VERSION JUN 1978 * ******************************************************************* * * SCHED ENTRY POINT NAMES * ENT $ABRT,$TYPE,$PRSE,$CNV1,$CNV3,$OP ENT $MPT1,$MPT2,$MPT3,$MPT4,$MPT5,$MPT6 ENT $STRT,$INER,$MPT7,$ASTM,$WATR,$SZIT ENT $MPT8,$IDSM,$PBUF,$EX6 ENT $MPT9,$RTST,$CVWD,$STRG ENT $MSEX,$LSTM,$RLNK,$SVAL,$SPRI ENT $LST,$SCD,$ID#,$MSG,$SCXX EXT $LMES,$CES ENT $BRKP * * SCHED EXTERNAL REFERENCE NAMES * EXT $XSIO,$IOUP,$IODN,$ERMG,$DREQ EXT $DLP,$PLP,$MPFT,$MEU EXT $CMST,$COML,$SDA,$SDT2,$RLB,$RLN EXT $MPSA,$MPS2,$IDEX EXT $IOCL,$OTRL,$DREL,$CHTO,$LUPR,$EQST EXT $MESS,$LIST,$IDNO,$SCD3,$CNFG EXT $ERAB,$ZZZZ,$TIME,$PVCN,$MNP EXT $ERIN,$NOPG,$OPER,$ILST,$NOLG,$LGBS,$NMEM EXT $XEQ,$TMRQ,$ONTM,$ALC,$RTN,$WORK EXT $BRED,$TIMR,$ETTM,$TIMV,$TREM EXT $RNTB,$CREL,$YMG,$SDRL EXT $ALDM,$DMAL,$MATA,$PRCN EXT $MBGP,$MRTP,$MCHN,$MAXP EXT $BFOT,$LU?? ALDM EQU $ALDM DMAL EQU $DMAL PRCNG EQU $PRCN * ******IFN SYSTEM SESSION CONSOLE WORK EXT !BITM,$SHED,$SMST,$DSCS ******XIF * * *******************MEU INSTRUCTIONS*********** ********************************************** EXT $BLLO,$BLUP * ******************************************************************* * * THE SCHED MODULE OF HP2100 REAL TIME EXECUTIVE CONSISTS OF * * 1. LIST PROCESSORS * 2. LINK PROCESSORS * 3. OPERATOR INPUT MESSAGE PROCESSORS * 4. SYSTEM START UP AND OPER INPUT REQUEST ACKNOWLEDGE * 5. MEMORY PROTECT VIOLATION SCHEDULER PREPROCESSORS * 6. ABORT AND TERMINATION PROCESSORS * ******************************************************************* HED --BUFFERS, CONSTANTS, POINTERS, ETC * TEMP LDA EQT11 ***TEMPORARY WORKING STORAGE AREA TEMP1 STA TEMP5 * TEMP2 LDB EQT12 * TEMP3 STB TEMP6 * TEMP4 JSB $RTN * THESE TEMPS ARE USED TO INITIALIZE TEMP5 NOP *** SYSTEM AVAILABLE MEMORY. TEMP6 NOP * AND ALSO TMP JMP $ALC * USED BY $PARS AS CONTIGUOUS BUFFER SPACE NOP ?? WORK EQU $WORK WPRIO NOP * ASCI BSS 1 * ASCI1 BSS 1 *** ASCI2 BSS 1 DM5 DEC -5 * D2 DEC 2 D4 DEC 4 D5 DEC 5 D6 DEC 6 D7 DEC 7 D9 DEC 9 D14 DEC 14 D15 DEC 15 D17 DEC 17 * D1 OCT 1 D3 DEC 3 B77 OCT 77 B177 OCT 177 B377 OCT 377 * ZERO REP 5 NOP DEF0 DEF ZERO * * RETRN NOP DMST NOP DMM5 DEC -5 D22 DEC 22 NWCNT NOP HED ID-SEGMENT MAP ID-SEGMENT MAP ID-SEGMENT MAP * WORD USE * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 * ! ! ! ! ! ! * 1 LIST LINKAGE * ! ! ! ! ! ! * 2-6 5 WORD TEMPORARY AREA USED FOR SPECIAL FLAGS IN QUEUES ETC. * ! ! ! ! ! ! * 7 PRIORITY * ! ! ! ! ! ! * @ 8 PRIMARY ENTRY POINT * ! ! ! ! ! ! * 9 POINT OF SUSPENSION (XSUSP) * ! ! ! ! ! ! * 10 A REGISTER AT SUSPENSION (XA) * ! ! ! ! ! ! * 11 B REGISTER AT SUSPENSION (XB) * ! ! ! ! ! ! * 12 E/O REGISTERS AT SUSPENSION (XEO) * ! ! ! ! ! ! * @ 13 NAME ( FIRST AND SECOND CHARACTERS ) * ! ! ! ! ! ! * @ 14 NAME (THIRD AND FOURTH CHARACTERS) * ! ! ! ! ! ! * @ 15 NAME (FIFTH CHARACTER)---- TM CL AM SS --- TYPE --- * ! ! ! ! ! ! * 16 NA NP W A O L R D --- STATUS- * ! ! ! ! ! ! * 17 TIME LIST LINKAGE WORD * ! ! ! ! ! ! * @ 18 RESOLUTION T -------MULTIPLE----------------------- * ! ! ! ! ! ! * @ 19 LOW ORDER 16 BITS OF EXECUTE TIME LESS 24 HRS IN 10'S MS. * ! ! ! ! ! ! * @ 20 HIGH ORDER 16 BITS OF EXECUTE TIME * ! ! ! ! ! ! * 21 BA FW AT RM RE PW RN --FATHER ID-SEG. NUMBER-- * ! ! ! ! ! ! * 22 RP ---# OF PAGES---,--MPFTI-- .. ----PARTITION #---- * ! ! ! ! ! ! * @ 23 LOW MAIN ADDRESS * ! ! ! ! ! ! * @ 24 HI MAIN ADDRESS + 1 * ! ! ! ! ! ! * @ 25 LOW BASE PAGE ADDRESS * ! ! ! ! ! ! * @ 26 HI BASE PAGE ADDRESS + 1 * ! ! ! ! ! ! * @ 27 DISC ADDRESS (LU (15),TRACK (14-7),SECTOR(6-0) * ! ! ! ! ! ! * 28 SWAP DISC ADDRESS (LU (15),TRACK (14-7),#TRACKS(6-0) * ! ! ! ! ! ! * 29 ID EXTENSION # (15-10) EMA SIZE (9-0) * ! ! ! ! ! ! * 30 HIGH MAIN + LARGEST SEGMENT + 1 ( = 0 IF NO SEGMENT) * ! ! ! ! ! ! * 31 SESSION MONITOR WORD 1 * ! ! ! ! ! ! * 32 SESSION MONITOR WORD 2 * ! ! ! ! ! ! * 33 SESSION MONITOR WORD 3 * ! ! ! ! ! ! * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 * * @ WORDS USED IN SHORT ID SEGMENTS SPC 5 * <<<<<<<<<>>>>>>>> SPC 5 * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 * * 1 NS / CURRENT MSEG # / # PAGES MSEG * ! ! ! ! ! ! * 2 MSEG STRT PAGE #/DE/ EMA START PAGE PHYSICAL * ! ! ! ! ! ! * 3 /# OF TRACKS FOR EMA SWAP * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 SKP * WHERE THE FLAG BITS MEAN: * * TM = TEMP LOAD (COPY OF ID-SEG NOT ON DISC) * CL = CORE LOCK (MAY NOT SWAP) * AM = ALL MEMORY (PROGRAM USES ALL OF ITS AREA) * SS = SHORT SEGMENT (INDICATES A 9-WORD ID-SEGMENT) * NA = NO ABORT (PASS ABORT ERRORS TO THE PROGRAM INSTEAD) * NP = NO PRAMS ALLOWED ON RESCHEDULE. * W = WAIT BIT (WAITING FOR PROG. WHOES ID-SEG ADD. IS IN WD.2) * A = ABORT ON NEXT LIST ENTRY FOR THIS PGM. * L = LOAD IN PROGRESS * O = OPERATOR SUSPEND ON NEXT SCHEDULE ATTEMPT * R = RESOURCE SAVE (SAVE RESOURCES WHEN SETING DORMANT) * D = DORMANT BIT (SET DORMANT ON NEXT SCHEDULE ATTEMPT) * T = TIME LIST ENTRY BIT (PROG IS IN THE TIME LIST) * BA = BATCH (PROGRAM IS RUNNING UNDER BATCH) * FW = FATHER IS WAITING (HE SCHEDULE WITH WAIT) * AT = ATTENTION BIT (OPERATOR HAS REQUESTED ATTENTION) * RM = RE-ENTRENT MEMORY MUST BE MOVED BEFORE DISPATCHING PGM. * RE = RE-ENTRENT ROUTINE IN CONTROL NOW * PW = PROGRAM WAIT (SOME PROGRAM WANTS TO SCHEDULE THIS ONE ) * RN = RESOURCE NUMBER EITHER OWNED OR LOCKED BY THIS PGM. * RP = RESERVED PARTITION FOR REQUESTING PROGRAMS ONLY. * NS = 0/1 MSEG POINTING TO STD SEGMENT(SET BY .EMAP) / * MSEG POINTING TO NON STD SEG (SET BY .EMIO)/ * DE = SET IF EMA SIZE WAS DEFAULTED * * * $LIST STATE TRANSITION TABLE: * * THE FOLLOWING TABLE DETAILS THE STATE TRANSITIONS EFFECTED BY * $LIST. THE MAJOR STATES ARE 0 THRU 6 (DORMANT THRU OP-SUSP) * AND THE STATE MODIFIERS ARE THE ADDITIONAL BITS SET FROM TIME * TO TIME IN THE STATUS WORD. THE BITS WHICH AFFECT OR ARE * MODIFIED BY $LIST ARE (SEE ABOVE DESCRIPTION): * * BIT WEIGHT POSITION * O 10 9 * W 4 12 * R 2 7 * D 1 6 * * * 0- OP SUSPEND BIT IS A DEFERRED ACTION BIT. SUSPEND ON NEXT SCHEDULE * ATTEMPT. CAN'T DO IT NOW BECAUSE PROGRAM IS OP SUSPENDED OR * IN THE TIME LIST. * * W- WAIT BIT (EXEC 9 & 23) THIS PROGRAM SCHEDULED ANOTHER WITH WAIT. * ID ADDRESS OF PERSON HE SCHEDULED IS IN 2ND OF WORD OF ID. * * R- SAVE RESOURCES WHEN SETTING DORMANT. NOT LEFT IN ID SEG AFTER * PROG IS SET DORMANT. * * D- DORMANT BIT IS A DEFERRED ACTION BIT. IT MEANS TO SET THE * PROGRAM DORMANT ON THE NEXT SCHEDULE ATTEMPT. WE CAN'T DO IT * NOW BECAUSE HE IS I/O SUSPENDED. * * * * * THESE BITS ARE COMBINED TO FORM 16 SUBSTATES AS PER THE TABLE BELOW * THE ENTRYS IN EACH SQUARE OF THE TABLE DEFINE THE NEXT STATE AS * FOLLOWS: * * THE FIRST DIGIT IS THE REQUESTED MAJOR TRANSITION (FROM * THE $LIST CALL). * THE SECOND TWO NUMBERS (SEPERATED BY A ".") DEFINE THE NEXT * MAJOR STATE . SUBSTATE. THUS 62.10 INDICATES A OP-SUSPEND * REQUEST (6) CAUSES A MOVEMENT TO I/O SUSPEND (2) SUBSTATE 10 * (THE O BIT IS SET). * A "*" AS THE DESTINATION INDICATES THE CURRENT STATE/SUB- * STATE I.E. NO CHANGE. * ILLEGAL OR UNEXPECTED STATES ARE MARKED WITH "X" * ONLY EXPECTED CALLS ARE PLOTTED. * * IN GENERAL CODE EXTERNAL TO $LIST MOVES PROGRAMS FROM SUB-STATE * TO SUB-STATE WHILE ONLY $LIST CAN MOVE A PROGRAM FROM ONE * MAJOR STATE TO ANOTHER. * * ONE FINAL NOTE TO THE UNWARY. THE CODE OF THE LIST PROCESSOR * IN NO WAY FOLLOW THE CHART BELOW. THE CHART IS TO GIVE THE * READER AN IDEA OF WHAT THE FOREST LOOKS LIKE NOT THE TREES. * DON'T MAKE THE MISTAKE OF THINKING THAT THE CHART SHOWS HOW * ANYTHING IS DONE. HED SYSTEM STATE TABLE******SYSTEM STATE TABLE*** *MAJOR STATE 0 1 2 3 4 5 6 *SUB-STATES *---------!-----!-------!-------!-------!-------!-------!------ * 0 11.0 00.0 02.1 00.0 00.0 00.0 00.0 * 22.0 11.0 11.0 11.0 11.0 11.0 * 33.0 62.10 66.0 66.0 66.0 * 44.0 * 55.0 * 66.0 *---------!-----!-------!-------!-------!-------!-------!------ * 1 D X X 02.1 X X X X * 10.0 * 62.11 *---------!-----!-------!-------!-------!-------!-------!------ * 2 R 11.0 00.2 02.3 00.2 00.2 00.2 06.3 * 66.3 *---------!-----!-------!-------!-------!-------!-------!------ * 3 RD X X 0* X X X 0* * 10.2 10.2 *---------!-----!-------!-------!-------!-------!-------!------ * 4 W 00.0 33.4 00.0 00.0 00.0 00.0 00.0 * 1* 13.4 * 66.4 *---------!-----!-------!-------!-------!-------!-------!------ * 5 WD X X X X X X X *---------!-----!-------!-------!-------!-------!-------!------ * 6 WR 0* X X 00.6 X X 06.7 * 13.4 * 66.7 *---------!-----!-------!-------!-------!-------!-------!------ * 7 WRD X X X X X X 0* * 10.6 *---------!-----!-------!-------!-------!-------!-------!------ * 10 O 16.0 X 02.11 X X X X * 16.0 * 6* *---------!-----!-------!-------!-------!-------!-------!------ * 11 OD X X 0* X X X X * 10.0 * 6* *---------!-----!-------!-------!-------!-------!-------!------ * 12 OR X X 02.13 X X X X *---------!-----!-------!-------!-------!-------!-------!------ * 13 ORD X X 0* X X X X * 16.3 * 6* *---------!-----!-------!-------!-------!-------!-------!------ * 14 OW X X X X X X X *---------!-----!-------!-------!-------!-------!-------!------ * 15 OWD X X X X X X X *---------!-----!-------!-------!-------!-------!-------!------ * 16 OWR X X X X X X X *---------!-----!-------!-------!-------!-------!-------!------ * 17 OWRD X X X X X X X *---------!-----!-------!-------!-------!-------!-------!------ HED REAL TIME SCHEDULER---LIST PROCESSOR SECTION--- * * THE $LIST PROCESSOR SECTION OF THE HP-2100 REAL TIME * EXECUTIVE PROCESSES THE FOLLOWING LIST REQUESTS * 1. DORMANT * 2. SCHEDULE * 3. OPERATOR SUSPEND * 4. NON-OPERATOR SUSPEND * A. I/O * B. MEMORY AVAILABLE * C. DISC AVAILABLE * 5. SEGMENT LOADING * * * * CALLING SEQUENCE * * JSB $LIST * OCT (ADDRESS CODE)(FUNCTION CODE) * DEF (ADDRESS) * * IF A = 0, THEN NO MESSAGE & B = PROG ID ADDRESS * IF A NOT= 0, THE A = ASCII ERROR CODE ADDRESS * & B CONTAINS DECIMAL ERROR CODE * * * ADDRESS CODES OF 0, 6, & 7 ARE RESERVED FOR * DRIVERS. THE ONLY FUNCTION CODE ALLOWED WITH * THESE ADDRESS CODES IS 1 (SCHEDULE) * IF SUCCESSFUL A = 0 ELSE * B = 3 ILLEGAL STATUS * B = 5 NO SUCH PROG * * FOR A DRIVER THAT WANTS TO CONVERT A PROG NAME * TO AN ID ADDRESS : JSB $LIST * OCT 217 * DEF PNAME (PROG NAME) * * THIS PERFORMS A SIMPLE LIST MOVE LIKE CHANGES TO PRIORITY. * (IF THE PROGRAM IS DORMANT ITS A BIG NOP ). UPON * A SUCCESSFUL RETURN (A = 0) B WILL BE THE ID ADDRESS * OF THE PROGRAM. IF THE PROGRAM IS SCHEDULED MANY TIMES * DOING THIS REMOVES THE SEARCH TIME FOR THE ID SEG OF * THE PROGRAM. * * FUNCTION CODE * 0 = DORMANT REQUEST * 1 = SCHEDULE REQUEST * 2 = I/O SUSPEND REQUEST * 3 = GENERAL WAIT LIST REQUEST * 4 = MEMORY AVAILABEL REQUEST * 5 = DISK ALLOCATION REQUEST * 6 = OPERATOR SUSPEND REQUEST * 17 = RELINK PROGRAM REQUEST * 10 THRU 16 ARE NOT ASSIGNED * * ADDRESS CODE * 0 = ID SEGMENT ADDRESS(5 PARAMETERS PASSED) * 1 = ID SEGMENT ADDRESS(AS NEXT OCT VALUE) * 2 = ASCII PROGRAM NAME ADDRESS(A DEF) * 3 = ID SEGMENT ADDRESS IN WORK * 4 = ID SEGMENT ADDRESS IN B-REG * 5 = ID SEGMENT ADDRESS IN XEQT * 6 = ID SEGMENT ADDRESS (NEXT PRAM IS VALUE TO * PUT INTO B REG @ SUSP) * 7 = ASCII PROG NAME (PASSES 5 PARAMETERS) * * * * FOR EXAMPLE * * ---0,7,& 6 (FOR DRIVERS)------- ---1---- ---2---- ----3----- * - - - - - - - - * * JSB $LIST JSB $LIST JSB $LIST JSB $LIST JSB $LIST JSB $LIST * OCT 001 OCT 701 OCT 601 OCT 1XX OCT 2XX OCT 3XX * DEF RETRN DEF RETRN OCT IDADR OCT IDADR DEF PNAME ID ADR IN $WORK * OCT IDADR DEF PNAME OCT BVAL * DEF PRAM1 DEF PRAM1 * DEF PRAM2 DEF PRAM2 * DEF PRAM3 DEF PRAM3 (NO INDIRECT DEFS !!) * DEF PRAM4 DEF PRAM4 * DEF PRAM5 DEF PRAM5 * * * * ---4----- ------5-------- * - - - - * * JSB $LIST JSB $LIST * OCT 4XX OCT 5XX * ID ADR IN B REG ID ADR IN XEQT * * * * * SKP * * ************** WATCH THE E REGISTER ****************** * * * ENTRY MADE BY $LIST NOP * RSA * SJP $LIST * * $LST RAL,RAL ROTATE THE DMS STATUS AND SAVE STA DMST NOW PUT DMS STATUS IN E-REGISTER RAL,ELA E = 0/1 CALL CAME FROM SYS/USER MAP * LDA $LIST GET ADDRESS OF CALL STA $LSTM SAVE FOR CRASH DUMP ANALIZER ( HOPE WE * NEVER USE IT !!!!!!) SEZ (E= 0/1 CAME FROM SYS/USER MAP) JMP UMAP1 CALL CAME FROM THE USER MAP ! * LDA $LIST,I CALL FROM SAME MAP (SYSTEM MAP) AND D15 PUT FUTURE STATUS INTO L0091 STA L0091 STORE AWAY FUNCTION CODE XOR $LIST,I FORM ADDR CODE * LIST1 ALF,ALF AND PUT INTO LOW END RAL,RAL CPA D4 ADDRESS IN B-REG? JMP L0021 YES GO SET UP CPA D3 ADDRESS IN WORK? JMP L0060 YES GO SET UP LDB XEQT PRESET FOR CURRENT EXECUTING PGM. CPA D5 CURRENT PGM? JMP L0021 YES GO SET IT UP ISZ $LIST STEP TO ADDRESS WORD * SEZ WHICH MAP ? JMP UMAP2 USER MAP (ALTERNATE MAP) * LDB $LIST,I THIS MAP SO GET IT TO B LIST2 CPA D1 IS ADDRESS NOW IN B? JMP L0021 YES GO SET IT UP * CPA D2 DOES B POINT TO AN ASCII NAME ? JMP DL02 YES SO SEE IF THE PROGRAM EXISTS CPA D6 JMP DL06 * STB RETRN B MUST BE A RETURN ADDRESS ISZ $LIST BUMP TO THE PROGRAM ADDRESS OR NAME LDB $LIST AND SAVE AS A POINTER STB TEMP1 FOR PARAMETER PASSING LDB RETRN GET THE RETURN ADDRESS CMB,INB DECREMENT WITHOUT AFFECTING E-REG CMB STB $LIST THIS THEN SETS UP RETURN ADDRESS * SEZ WHICH MAP JMP UMAP3 STILL THE USER MAP LDB TEMP1,I GET THE ID ADDRESS OR PROG NAME ADDR * LIST3 CPA D7 ASCII PROGRAM NAME ? JMP DL07 YES SZA,RSS ID ADDRESS JMP DL00 YES * * * L0075 LDA $ILST ILLEGAL STATUS MESSAGE LDB D3 ILLEGAL STATUS ERROR CODE JMP L0015 * SPC 6 * * * * UMAP1 XLA $LIST,I GET THE REQUEST CODE AND D15 SAVE LOWER BITS STA L0091 SOCK IT AWAY AS FUTURE STATE OF PROGRAM XLA $LIST,I GET IT AGAIN XOR L0091 NOW GET THE UPPER BITS JMP LIST1 NOW GO SEE WHAT TYPE CALL * * UMAP2 XLB $LIST,I GET POSSIBLE ID ADDRESS JMP LIST2 AND CONTINUE * * UMAP3 XLB TEMP1,I GET ID ADDRESS OF PROGRAM NAME ADDRESS & JMP LIST3 CONTINUE HED LIST PROCESSOR--REQUEST CODE DETERMINATION * * PROCESS ID SEGMENT ACCORDING TO REQUEST CODE * DL02 SEZ IS NAME IN THIS MAP JSB PLNAM NO, SO PULL IT IN LOCALLY JSB TNAME NOW ID ADDR IN B REG SEZ,RSS SKIP IF NOT FOUND OR SHORT ID JMP L0021 GO SET UP WORK ADDRESSES * NPRG LDA $NOPG GET THE NO SUCH PROG ADDRESS LDB D5 AND THE NO SUCH PROG ERROR CODE JMP L0015 GO TO RETURN * * L0060 LDB WORK GET ID SEGMENT ADDRESS L0021 JSB DORM? GO SET UP WORK ADDRESSES * LDB L0091 GET THE REQUEST CODE SZB,RSS CHECK IF DORMANT REQUEST JMP L0100 DORMANT REQUEST CPB D1 CHECK IF SCHEDULE REQUEST JMP L0200 YES CPB D6 CHECK IF OPERATOR SUSPEND REQUEST JMP L0300 YES CPB D15 CHECK IF LINKAGE UPDATE REQUEST JMP L0135 YES JMP L0400 MUST BE A SIMPLE LIST MOVE SPC 3 HED LIST PROCESSOR--DRIVER SERVICING SECTION. * * THIS PROCESSES LIST CALLS OF 0, 6, & 7. THESE ARE RESERVED * FOR DRIVERS. THE OPERATING SYSTEM MAKES THE ASSUMPTION * THAT IF YOU KNOW HOW TO CALL $LIST YOU KNOW WHAT YOUR * DOING. IN ADDITION, IF A DRIVER WANTS A PROGRAM IT WANTS * IT IN A HURRY. THUS $LIST DOES MINIMAL ERROR CHECKING FOR * DRIVERS (AND NONE FOR THE OP SYSTEM). HERE A CHECK IS MADE * ONLY TO SEE IF THE PROGRAM IS DORMANT (ALSO IF THE PROGRAM * EXISTS IF THE CALL WAS BY NAME RATHER THAN BY ID ADDRESS). * NO SIZE CHECKS OR EMPTY ID CHECKS ARE MADE. IF YOUR KNOW * ENOUGH TO CALL $LIST, YOU KNOW ENOUGH TO MAKE SURE THE * PROGRAM EXISTS AND THAT THERE IS A PARTITION TO RUN IT IN. * THE REAL ADVANTAGE TO THIS PHILOSOPHY IS THAT DRIVERS ARE * GIVEN OP SYSTEM STATUS AND THEREFOR OP SYSTEM SPEED IN * PROGRAM SCHEDULING. THE SYSTEM WILL SCHEDULE THE PROGRAM AS * FAST AS IT POSSIBLY CAN. * HINT. IF YOUR SCHEDULING DISC RESIDENT PROGRAMS, HAVE THEM * TERMINATE SAVING RESOURCES OR SERIALLY REUSABLE. IT WILL * SAVE LOTS OF DISC TIME. * * * * DL07 SEZ WELL WHICH MAP IS IT IN ? JSB PLNAM ALTERNATE MAP, SO PULL IN LOCALLY JSB TNAME GET THE ID ADDRESS SEZ DID THE PROGRAM EXIST ? JMP NPRG NO, SO TELL THE FOLKES * DL00 JSB DORM? SET UP THE $LIST PRAMS & SEE IF DORMANT SZA PROG DORMANT ? JMP L0075 NO, TELL THE DRIVER TO FORGET IT JSB PRAMX GO PICK UP THE PARAMETERS JMP L0275 GO SCHEDULE THE PROGRAM * DL06 ISZ $LIST BUMP TO FUTURE B-REG @ SUSP(SETS RETURN ADDR) SEZ WHICH MAP ? JMP DL061 THE OTHER ONE. * LDA $LIST,I GEY THE B REG @ SUSP DL062 STA TEMPX AND SAVE TEMPORARIALLY JSB DORM? SET UP LIST PARAMETERS & CHK FOR DORMANT SZA PROG DORMANT ? JMP L0075 TELL DRIVER TO FORGET IT. LDB WORK GET THE ID ADDRESS ADB D10 AND INDEX TO THE B REG @ SUSP WORD LDA TEMPX GET THE VALUE STA B,I AND PUT IT IN THE ID SEG JMP L0275 NOW GO SCHEDULE THE PROGRAM * DL061 XLA $LIST,I GET THE B REG AT SUSP VALUE JMP DL062 CONTINUE * * SKP * HED LIST PROCESSOR--DORMANT REQUEST * * DORMANT REQUEST * * THE DORMANT REQUEST IS PROCESSED AS FOLLOWS: * IF ABORT BIT SET, MAKE PROGRAM DORMANT * IF ALREADY DORMANT, RETURN * IF SCHEDULED, THEN ENTERED INTO DORMANT LIST, POINT * OF SUSPENSION CLEARED. * IF ID SEGMENT ADDRESS IS SAME AS RESIDING * BACKGROUND DISC RESIDENT PROGRAM, THEN BKRES * FLAGS ARE CLEARED SO ANOTHER PROGRAM MAY BE * LOADED INTO THE AREA. * IF ID SEGMENT ADDRESS IS SAME AS RESIDING REAL * TIME DISC RESIDENT PROGRAM, THEN RDISK FLAGS * ARE CLEARED SO ANOTHER PROGRAM MAY BE LOADED * INTO THE AREA. * IF NOT ONE OF ABOVE, THEN DORMANT BIT SET IN STATUS SPC 1 L0100 LDB WSTAT,I CHECK IF ABORT BIT SET BLF RBL,SLB,BLF JMP L0115 YES, SO GO MAKE DORMANT CPA D2 IF I/O SUSPENDED L0103 ALF,SLA,RAL SET DORMANT BIT JMP L0350 ELSE GO CHECK RESOURCE BIT * IOR WSTAT,I MERGE THE CURRENT STATUS AND CL.NP CLEAR NO PARMS BIT L0105 STA WSTAT,I RESET THE NEW STATUS JMP L0014 GO TO EXIT * L0115 LDA WORK CLEAR ID SEG TEMP AND SET B LDB DEF0 (CLEAR 5 TEMP WORDS TO 0) JSB PRAM LDB WORK SET FLAG FOR DISPATCHER CLA CPB XEQT STA $PVCN ADB D8 LINK THROUGH XSUSP LDA $ZZZZ SO RESIDENT FLAGS STB $ZZZZ ARE STA B,I CLEARED ADB D6 INDEX TO TYPE WORD LDA B,I AND CLEAR AND NCLAM THE CORE LOCK AND ALL OF MEMORY STA B,I BITS CLA STA XEQT CLEAR CURRENT PGM FLAG IN CASE IT IS SPC 1 L0130 STA WSTAT,I SET THE NEW STATUS AND D15 GET THE ADDITION CODE L0135 LDB L0090 SET B FOR LINK JSB LINK RELINK THE PROG L0014 CLA SET FOR NORMAL RETURN LDB WORK RETURN THE ID ADDRESS L0015 ISZ $LIST STEP TO RETURN ADDRESS JRS DMST $LIST,I LOOK MA ! NO LABEL !! SPC 1 SPC 1 L0350 SLB,RSS IF RESOURCE BIT NOT SET JMP L0115 GO MAKE DORMANT CPA D6 IF OPERATOR SUSPENDED JMP L0103 GO SET DORMANT BIT TOO. * L0355 LDA WSTAT,I GET OLD STATUS AND CLD.R CLEAR THE "R" AND "D" BITS LDB WORK IF NOT CURRENT CPB XEQT PROGRAM THEN RSS IOR B20K SET THE NO PRAMS BIT. JMP L0130 GO PUT IN THE DORM LIST SPC 2 $LSTM NOP DON'T MOVE OR REARRANGE THESE THREE L0090 NOP WORDS. CRASH DUMP ANALIZER USES THEM. L0091 NOP SPC 1 NCLAM OCT 177637 CL.NP OCT 157777 HED LIST PROCESSOR--SCHEDULE REQUEST * * SCHEDULE REQUEST * * THE SCHEDULE REQUEST IS PROCESSED AS FOLLOWS: * IF ABORT BIT SET, STORE ID SEGMENT ADDRESS SUCH THAT * PROGRAM WILL BE ABORTED AT NEXT ENTRY FROM XEQ * IF DORMANT BIT SET, GO TO DORMANT REQUEST * IF OPERATOR-SUSPEND BIT SET, GO TO OPERATOR-SUSPEND * REQUEST * IF SCHEDULED, THEN STATUS ERROR EXIT * IF CURRENT STATUS NOT ONE OF ABOVE, THE PROGRAM IS * ENTERED INTO THE SCHEDULE LIST. * NOTE: THE ID TIMESLICE WORD IS SET TO A 1 TO INDICATE * A NEW SCHEDULE HAS BEEN PERFORMED. * * L0200 CPA D6 IF OP-SUSP JMP L0250 GO CHECK FOR DORMANT BIT LDB WSTAT,I GET WHOLE STATUS WORD * SZA IF DORMANT OR CPA D2 IF I/O SUSP. THEN BLF,SLB,BLF ROTATE AND SKIP JMP L0255 ELSE GO CHECK WAIT BIT * RBR,SLB,RBL IF OP-SUSP BIT SET JMP L0220 GO CHECK FURTHER * L0270 RBL DORM BIT TO 15 L0271 CLA,INA SET A FOR SCHEDULE SSB IF DORM BIT SET JMP L0100 GO SET DORMANT * * CHECK FOR SERIALLY REUSABLE OR SAVE RESOURCES * OR OP SUSPEND TERMINATION LAST TIME THROUGH . * * LDB L0090 GET THE CURRENT STATUS SZB IF 0 CPB D6 OR 6 RSS THEN CHECK ON THE PROGS LAST PARTITION JMP L0290 ELSE GO SCHEDULE THE PROGRAM * L0275 LDB WORK GET THE ID ADDRESS ADB D14 INDEX TO THE TYPE WORD LDA B,I GET THE TYPE AND D15 ONLY CPA D1 NOW IF ITS MEMORY RES, THEN NO PARTITION JMP L0290 SO, WE JUST SCHEDULE * ADB D7 MUST BE 1ST DISPATCH & DISC RES LDA B,I GET THE PARTITION WORD AND B77 AND USE IT TO INDEX INTO THE MPY D7 $MATA TABLE ADA $MATA ADA D3 GET TO THE D BIT WORD LDA A,I AND PULL IT IN AND B20K MASK IT SZA,RSS IS IT SET ? JMP L0290 NO, SO GO SCHEDULE * LDA WORK GET THE ID ADDRESS TP 1 JSB DMAL AND SEE IF HE IS STILL IN THE PARTITION. * L0290 CLA,INA SET FOR SCHEDULE STA WTSLC,I INDICATE NEW SCHEDULE JMP L0130 AND DO IT TO IT !!! * * * * * L0220 RBL,SLB CHECK RESOURCE BIT JMP L0230 IF SET GO CLEAR OP-SUSP SSB IF DORM BIT SET JMP L0271 GO MAKE DORMANT * L0230 XOR B1006 CLEAR THE OP-SUSP BIT AND JMP L0280 GO OP-SUSP THE PGM. * L0250 LDA WSTAT,I IF OP-SUSP BIT SET AND B100 AND DORM BIT SET SZA JMP L0355 GO CLEAR BIT AND SET DORMENT * L0255 LDB WSTAT,I GET THE WHOLE STATUS WORD BLF,BLF SHIFT LEFT EIGHT. LDA WSTAT,I IF WAIT BIT SET ALF,SLA,ALF THEN ALF,SLA,ALF GO MOVE TO WAIT LIST (SKIPS) JMP L0270 ELSE, GO SCHEDULE. * XOR D3 CHANGE STATUS TO 3 AND D15 L0280 XOR WSTAT,I AND JMP L0130 GO RELINK HED LIST PROCESSOR--SUSPEND REQUESTS * * OPERATOR SUSPEND REQUEST * * THE OPERATOR-SUSPEND REQUEST IS PROCESSED AS FOLLOWS: * IF DORMANT, THEN ENTER INTO OPERATOR SUSPEND LIST * IF ALREADY OPERATOR SUSPEND, THEN STATUS ERROR EXIT * IF SCHEDULED, THEN ENTER INTO OPERATOR SUSPEND LIST * IF NOT ONE OF ABOVE, THEN OPERATOR-SUSPEND BIT SET * L0300 CPA D6 OR OP-SUSP JMP L0075 REJECT THE REQUEST * CPA D2 IF I/O SUSP JMP L0310 GO SET TO "O" BIT * CCE,SZA IF DORM WITH RESOURCES SKIP JMP L0400 ELSE GO RELINK I.E. SET OP-SUSP. * ELA,ELA IF DORM BUT IN TIME LIST ADA WSTAT LDA A,I AND B10K THEN SET O BIT SZA IN TIME LIST ? JMP L0310 YES * LDB WSTAT,I GET FULL STATUS WORD SZB,RSS ENTIRE STATUS WORD = 0 ? JMP L0075 YES, ITS AN ERROR * LDA B306 ELSE SET "R" AND "D" BITS AND IOR B PUT IN OP-SUSP LIST JMP L0130 * L0310 LDA B1000 SET OPER-SUSP BIT IN STATUS IOR WSTAT,I JMP L0105 GO SET BIT AND EXIT SPC 1 * * NON-OPERATOR SUSPEND REQUEST * * THE NON-OPERATOR SUSPEND REQUEST IS PROCESSED AS FOLLOWS: * THE PROGRAM IS ENTERED INTO THE REQUESTED LIST AND * THE NEW STATUS REPLACES THE 4 LOW ORDER BITS OF THE * PROGRAM STATUS-THUS SAVING THE DORMANT OR OPERATOR- * SUSPEND BITS THAT MAY BE PRESENT. * * L0400 LDA WSTAT,I UPDATE STATUS SAVING ALL AND C17 BUT LOW 4 BITS IOR L0091 JMP L0130 GO TO EXIT SPC 1 C17 OCT 177760 B100 OCT 100 B306 OCT 306 B1006 OCT 1006 CLD.R OCT 57460 D21 DEC 21 SKP * * THE PLNAM SUBROUTINE PULLS THREE WORDS OUT OF THE ALTERNATE * MAP (ASCII PROGRAM NAME). THE ROUTINE IS TYPICALLY CALLED * DIRECTLY BEFORE TNAME SO THAT THE PROGRAM NAME IS LOCAL AND * THE ID SEGMENTS CAN BE SEARCHED. * * * CALLING SEQUENCE LDB ADDRESS OF THREE WORD ARRAY * JSB PLNAM * * ON RETURN B = LOCAL ADDRESS OF ARRAY * A = DESTROYED * * PLNAM NOP XLA B,I GET THE 1ST ONE STA PNAME AND SAVE IT INB DO THIS TWO MORE TIMES XLA B,I STA PNAME+1 INB XLA B,I STA PNAME+2 LDB DPNAM JMP PLNAM,I * DPNAM DEF PNAME PNAME BSS 3 DON'T REARRANGE THESE WORDS OR MOVE THEM TEMPX NOP I NEED THEM LATER FOR CONTIGIOUS SPACE TEMPY NOP IN THE PRAMX ROUTINE TEMPZ NOP * * * THE DORM? SUBROUTINE IS CALLED BY THE $LIST PROCESSOR FOR * ALL CALLS IT'S PRIMARY FUNCTION IN LIFE IS TO SET UP * WORK, WPRIO, WSTAT, AND L0090. IN ADDITION IT RETURNS * L0090, THE PROGRAMS CURRENT STATUS IN THE A REGISTER. * $LIST FUNCTION CODES OF 0, 6, AND 7 (THE DRIVER $LIST * CALLS) USE THIS TO SEE IF THE PROGRAM IS DORMANT. * * CALLING SEQUENCE LDB ID ADDRESS * JSB DORM? * ON RETURN A-REG = CURRENT STATUS 0-6 * * DORM? NOP STB $WORK SET UP THE ID ADDRESS FOR LATER ADB D6 AND STB WPRIO THE PRIORITY WORD ADB D9 AND STB WSTAT THE STATUS WORD LDA B,I GET THE OLD STATUS AND D15 KEEP ONLY STATUS STA L0090 SET UP THE STATUS WORDTATUS ADB D15 ADVANCE TO ID 30 STB WTSLC AND DEFINE TIMESLICE WORD JMP DORM?,I RETURN TO THE CALLER * WTSLC NOP HED SET UP ID SEGMENT TEMP PARAMETERS * * * THE PRAMX SUBROUTINE IS CALLED BY THE $LIST PROCESSOR * FOR ADDRESS CODES OF 0 & 7. THESE ADDRESS CODES * HAVE BEEN RESERVED FOR DRIVERS WHO WISH TO SCHEDULE * PROGRAMS. THE SUBROUTINE CALLS EITHOR THE PRAM OR * XPRAM SUBROUTINE TO STUFF THE PARAMETERS INTO THE PROGRAMS * ID SEGMENT TEMP AREA. PRAM IS CALLED IF THE DRIVER CALLED * $LIST FROM THE SYSTEM MAP, XPRAM IS CALLED IF THE DRIVER * IS IN THE SYSTEM MAP. * ACTUALLY PRAMX IS ONLY CALLED ONCE & THUS NEED NOT BE A * SUBROUTINE. HOWEVER, FOR THOSE WHO MUST READ THIS CODE * IT HELPS SEPERATE THE LIST MOVE PROBLEM FROM THE PARAMETER * MOVE PROBLEM AND MAKES THE CODE MUCH EASIER TO READ & * UNDERSTAND. * * * CALLING SEQUENCE JSB PRAMX * * $WORK HAS PROG ID ADDRESS * DMST HAS THE DMS STATUS IN IT * TEMP1 POINTS TO THE WORD BEFORE THE PARAMETER LIST * RETRN HAS RETURN ADDRESS OF THE LIST CALL * * RESTRICTIONS - ASSUMPTIONS * 1) DEFS IN THE $LIST CALL MUST BE DIRECT * (NEED NOT APPLY IF DRIVER IN SYSTEM MAP) * 2) AT LEAST ONE PARAMETER MUST BE SUPPLIED (IE 1 DEF) * 3) RETURN ADDRESS MUST DELIMIT PARAMETER LIST. * 4) 5 PARAMETERS MAX * * PRAMX NOP ISZ TEMP1 BUMP $LIST TO POINT TO 1ST PRAM LDB RETRN GET RETURN ADDRESS CMB,INB AND USE THIS TO ADB TEMP1 SEE HOW MANY PARAMETERS TO PASS STB DM5 SAVE TO FAKE OUT PRAM OR XPRAM * LDA DMST NOW GET THE DMS STATUS RAL,ELA E = 1 MEANS CALL FROM USER MAP SEZ,RSS WELL, WHICH MAP ? JMP PRMEX SYS MAP , SO GO STUFF THE PRAMETERS * CMB,INB USER, SO PULL ADDRESSES IN LOCALLY CBX PUT # IN X LDA TEMP1 GET SOURCE LDB DPNAM AND DESTINATION MWF AND BRING EM IN. * LDA WORK NOW GET THE PROGRAMS ID ADDRESS LDB DPNAM AND THE LOCAL ADDRESS ADB SIGN MAKE IT ADDRESS INDIRECT JSB XPRAM AND GO STUFF THE ID SEGMENT JMP PRMX3 NOW GO RETURN * PRMEX LDA WORK ID ADDRESS TO A LDB TEMP1 ADDRESS OF PARAMETERS TO B ADB SIGN SET THE SIGN BIT TOO JSB PRAM GO STUFF THE ID SEGMENT * PRMX3 LDA DMM5 GET A -5 BACK TO STA DM5 LOCATIOM DM5 SO THAT THE OTHER PROCESSORS JMP PRAMX,I ARE HAPPY. - RETURN TO CALLER - * * * * HED LINK UPDATE PROCESSOR * * THE LINK PROCESSOR SECTION OF THE HP-21XX REAL TIME * EXECUTIVE * 1. REMOVES A PROGRAM FROM A LIST * AND * 2. ENTERS THE PROGRAM INTO ANOTHER LIST AT THE PROPER PLACE * ACCORDING TO PRIORITY LEVEL. * * * NOTE: THE ROUTINE $RLNK PROVIDES AN INTERFACE BETWEEN THE * RTIME MODULE AND THE LINK PROCESSOR. IT'S FUNCTION * IS TO MOVE A PROGRAM BEHIND ALL OTHER PROGRAMS (OF THE * SAME PRIORITY) IN THE SCHEDULED LIST. THIS ROUTINE IS * CALLED ONLY WHEN A TIMESLICED PROGRAM HAS USED A FULL * TIMESLICE. * * * * CALLING SEQUENCE * * LDB CODE1 * LDA CODE2 * JSB LINK * * WHERE * CODE1 = CODE OF REMOVAL LIST * CODE2 = CODE OF INSERTION LIST * THE ID SEGMENT IS ASSUMED TO BE LOCATED IN WORK * AND WPRIO SET * * * THE REMOVAL OF PROGRAM FROM A LIST CONSISTS OF: * 1. IF I/O LIST (CODE 2), THEN THIS IS SPECIAL CASE * AND DOES NOT REQUIRE REMOVAL. * 2. IF NULL LIST, THEN ERROR EXIT TAKEN. * 3. IF FIRST AND ONLY PROGRAM IN LIST, THEN LIST * VALUE SET TO ZERO. * 4. IF FIRST PROGRAM IN LIST, BUT NOT THE ONLY * PROGRAM IN LIST(LINKAGE NOT ZERO), THEN SET LIST * VALUE TO THE LINKAGE VALUE. * 5. IF IN MIDDLE OF LIST, THE LINKAGE OF THE ID SEG * MENT WHICH POINTS TO THE PROGRAM TO BE REMOVED * IS SET TO THE LINKAGE VALUE OF THE PROGRAM THAT * IS REMOVED. * 6. IF LAST PROGRAM IN LIST, THE LINKAGE VALUE OF * PREVIOUS PROGRAM IN LIST IS SET TO ZERO. * LINK NOP ENTRY/EXIT SZB IGNOR DORMANT AND CPB D2 I/O LIST REQUESTS JMP LK100 YES, SEE IF ADDITION. ADB LLIST ADD TOP OF LIST POINTER * LK010 STB TEMP TOP OF REMOVAL LIST LDB B,I GET TOP OF LIST POINTER SZB,RSS END OF LIST? JMP LINK,I FORGET IT ????????????????????????????? CPB WORK MATCHES PROGRAM? RSS YES JMP LK010 NO, KEEP SEARCHING LDB B,I UPDATE LINKAGE TO BYPASS STB TEMP,I THE DELETED ID SEG HED LINK PROCESSOR--ADDING PROGRAM TO A LIST * * ADD A PROGRAM TO A LIST * * THE ADDITION OF PROGRAM TO A LIST CONSISTS OF: * 1. IF I/O LIST (CODE 2), THEN THIS IS SPECIAL CASE * AND NO ADDITION MADE TO LIST. * 2. IF NULL LIST, THEN LIST VALUE SET TO POINT TO ID * SEGMENT OF PROGRAM TO BE ADDED AND THE LINKAGE * SET TO ZERO. * 3. IF NOT NULL LIST, THE PROGRAM IS INSERTED INTO * LIST ACCORDING TO PRIORITY LEVEL AND LINKAGES * CHANGED TO REFLECT THIS INSERTION. * 4. IF OF LOWER PRIOR. THAN ANY PROGRAM IN LIST, THEN * LAST LINKAGE IS SET TO POINT TO THE PROGRAM TO * BE ADDED AND THE PROGRAM LINKAGE IS CLEARED. * LK100 SZA IGNOR DORMANT AND CPA D2 I/O LIST REQUESTS JMP LINK,I YES, RETURN ADA LLIST ADD TOP OF LIST POINTER * LK110 STA TEMP SAVE TOP OF LIST POINTER LDA A,I GET POINTER SZA,RSS END OF LIST? JMP LK140 YES, LINK IN NEW PROG CPA WORK IS IT A DUPLIC. PROG? JMP LK150 YES, DUPLIC SO RETURN STA B NOT DUPLIC, COMPARE PRIORITY ADB D6 OF WORK ID SEG LDB B,I AGAINST CMB,INB CURRENT ADB WPRIO,I ID SEG SSB,RSS WORK < CURRENT? JMP LK110 NO, SEE NEXT ONE * LK140 STA WORK,I LINK THIS TO FOLLOW WORK LDA WORK LINK WORK TO FOLLOW STA TEMP,I PREVIOUS PROG * LK150 JMP LINK,I RETURN * * LLIST DEF DORMT TOP OF LIST ADDRESS WSTAT NOP WORK STATUS ADDRESS DM32 DEC -32 B1000 OCT 1000 B4000 OCT 4000 COM OCT 54 TBUF DEF TEMP5 TBUFS DEF TEMP5+7 DM58 DEC -58 SKP * * $RLNK ALLOWS THE RTIME MODULE TO MOVE A PROGRAM BEHIND ALL * OTHER PROGRAMS OF THE SAME PRIORITY IN THE SCHEDULED LIST. * THIS IS ACCOMPLISHED BY CALLING LINK TO REMOVE THE PROGRAM * FROM THE SCHEDULED LIST AND THEN INSERT THE PROG BACK INTO * * * $RLNK NOP LDA XEQT DEFINE THE PROGRAM STA WORK TO BE RELINKED LDA XPRIO DEFINE IT'S STA WPRIO PRIORITY ALSO * CLA,INA REMOVAL CODE (SCHEDULED LIST) CLB,INB INSERTION CODE (SCHEDULED LIST) STA $LIST FORCE A SCAN OF SCHEDULED LIST * JSB LINK GO DO IT JMP $RLNK,I RETURN SKP * THE SAME LIST (SCHEDULED LIST). HED OPERATOR INPUT MESSAGE PROCESSOR * * THE $MESS PROCESSOR SECTION OF HP-2116 REAL TIME EXECUTIVE * PROCESSES THE FOLLOWING OPERATOR INPUT REQUESTS: * * 1. TURN ON A PROGRAM * ON[IH],XXXXX * ON[IH],XXXXX,NOW * ON[IH],XXXXX,P1,...,P5 * ON[IH],XXXXX,NOW,P1,...,P5 * 2. TURN OFF A PROGRAM * OF,XXXXX,P * 3. OPERATOR SUSPEND A PROGRAM * SS,XXXXX * 4. CONTINUE A OPERATOR SUSPENDED PROGRAM * GO[IH],XXXXX * GO[IH],XXXXX,P1,...,P5 * 5. CURRENT STATUS OF A PROGRAM * ST,XXXXX * 6. CHANGE PROGRAM ID SEGMENT TIME PARAMETERS. * IT,XXXXX,R,MMM * IT,XXXXX,R,MMM,HR,MN * IT,XXXXX,R,MMM,HR,MN,SC * IT,XXXXX,R,MMM,HR,MN,SC,MS * 7. CHANGE PROGRAM PRIORITY * PR,XXXXX,ZZ * 8. SET REAL TIME CLOCK AND START TIME BASE GENERATOR * TM,DAY,HR,MN,SC * 9. CURRENT REAL TIME CLOCK VALUES * TI * 10. SET A SLOT OR DEVICE DOWN. * DN,N1 * DN,,N2 * 11. SET A SLOT AND DEVICES UP * UP,NN * 12. LOGICAL UNIT SWITCH AND STATUS * LU,N1 * LU,N1,N2 * LU,N1,N2,N3 * 13. EQUIPMENT STATUS * EQ,NN * 14. SET SOURCE FILE * LS,P1,P2 * 15. SELECT LOAD-AND-GO * LG,P * 16. CHANGE DEVICE TIME-OUT PARAMETER * TO,N1 * TO,N1,N2 * 17. RELEASE PROGRAM'S TRACKS * RT,XXXXX * 19. SET BREAK FLAG * BR,XXXXX * 20. ABORT JOB REQUEST * AB * 21. RUN REQUEST * RU[IH],XXXXX * RU[IH],XXXXX,P1,...,P5 * 22. BUFFER LIMIT PRINT/CHANGE * BL OR BL,N1,N2 * 23. SIZE REQUEST/CHANGE * SZ,XXXXX * SZ,XXXXX,P1 * SZ,XXXXX,P1,P2 * 24. ASSIGN PROGRAM TO PARTITION * AS,XXXXX,N * 25 UNRESERVE A PARTITION * UN, N * 26 EXAMINE OR ALTER TIMESLICING PARAMETERS * QU,ZZZZZ,XXXXX * * * * * SPC 3 * IN GENERAL THERE ARE TWO CLASSES OF COMMANDS. THOSE THAT PERFORM * A SERVICE IN WHICH SPEED IS OF IMPORTANCE (RU, ON, OF ETC) AND * AND THOSE COMMANDS WHICH GIVE STATUS INFORMATION OR WHICH MUST * BE ENTERED BEFORE A PROGRAM IS RUN. IN THE FORMER CASE A CONSIDERABLE * AMOUNT OF EFFORT IS SPENT EXECUTING THE COMMAND AS FAST AS POSSIBLE. * IN THE LATER CASE EFFORT IS SPENT IN MAKING THE CODE AS SMALL AS * POSSIBLE SO AS TO SAVE ROOM. * * HED OPERATOR INPUT MESSAGE DECIPHER ROUTINE * * CALLING SEQUENCE * JSB $MESS * B CONTAINS NUMBER OF CHARACTERS * A IS THE BUFFER ADDRESS * * * * INPUT DECIPHER ROUTINE ROUTINE SCANS THE ASCII OPERATOR * INPUT AND STORES THE DATA INTO PARAMETERS. * THIS ROUTINE ASSUMES THE CHARACTER COUNT IN B ON ENTRY AND * DATA IN BUFFR. COMMA IS USED TO SEPARATE PARAMETERS. A PARA- * METER MAY BE UP TO 6 ASCII CHARACTERS- EXCEPT FOR OP CODE * WHICH MUST BE 2 CHARACTERS. A MAXIMUM OF 40 CHARACTERS MAY BE * INPUT. A COUNT IS KEPT OF THE NUMBER OF PARAMETERS INPUT AND * A CHARACTER COUNT IS KEPT FOR EACH PARAMETER. THE VALUES ARE * STORED LEFT ADJUSTED IN THE BUFFERS. * * MESS MUST KEEP TRACK OF WHICH MAP THE CALLER CAME IN FROM * IF THE ENTRY TO $MESS IS FROM THE SYSTEM MAP THEN THE CALL * WAS FROM THE $TYPE ROUTINE. IF FROM THE USER MAP THEN THE * CALL IS FROM THE SYSTEM LIBRARY ROUTINE MESSS. (PRMPT & * R$PN$ THING) * IF FROM $TYPE, THEN INPUT BUFFER = INBUF * OUTPUT BUFFER = INBUF * IF FROM MESSS, THEN INPUT BUFFER PULLED IN LOCALLY TO * IBUFX * OUTPUT BUFFER = THE PROCESSOR'S BUFFER * GENERALLY SHARED W/PARSE * BUFFER. * * * ENTRY MADE BY $MESS NOP * SSM $MEU * SJP $MSG * * NOTE: BFCNT=BUFFER CHAR COUNT (USED BY "OP") * BFADD=BUFFER LOCATION " " * * * $MSG STA BFADD SAVE INPUT BUF ADDRESS FOR STRING ROUTINE STA OP INVALIDATE PREVIOUS CMND (GLM.2013) STB BFCNT SAVE COUNT FOR STRING ROUTINE TOO. STB NWCNT ONE MORE TIME. * LDA $MEU GET THE DMS STATUS RAL,RAL ROTATE THE STATUS FOR STA $MEU OUR RETURN TRIP * SSB IF NEG ITS AN ERROR JMP $INER SZB,RSS IF THE CHAR COUNT = 0 JMP M0150 JUST RETURN * RAL,ELA PUT DMS STATUS IN E REG (0/1 SYS USER) LDA BFADD GET THE BUFFER ADDRESS BACK AGAIN SEZ,RSS WELL, WHICH MAP ? JMP NMESS SYSTEM (SYSTEM CONSOLE) * INB CONVERT CHAR COUNT TO BRS WORD COUNT (DIVIDE BY 2) CBX SAVE WORD COUNT FOR MOVE * ADB DM41 NOW CHECK OUT WORD COUNT SSB GREATER THAN 22 WORDS ? JMP GTMES NO,SO PULL IT IN LOCALLY LDB D40 YES, SO ONLY PULL IN 22 WORDS ANYWAY CBX SAVE FOR MOVE RBL NOW CONVERT TO CHARACTERS FOR $PARS ROUTINE STB NWCNT * GTMES LDB IBUFX GET THE DESTINATION STB BFADD SAVE BUFF ADDR FOR OP COMMAND AND STRING PASSING MWF AND MOVE THE WORDS * LDA IBUFX GET THE BUFFER ADDRESS LDB NWCNT AND THE LENGTH NMESS JSB $PRSE AND GO PARSE THE INPUT STRING BUFAD DEF PRAMS * * * HED MESSAGE PROCESSOR--OP REQUEST SEARCH * * THIS SECTION CHECKS THE OPERATOR REQUEST CODE AGAINST THE * LEGAL REQUEST CODES AND JUMPS TO THE PROPER PROCESSOR. ******************************************************************* * TO ADD NEW REQUEST ONE MERELY, * A. ADDS ASCII OPERATION CODE TO TABLE -LDOPC- * B. ADDS PROCESSOR START ADDRESS TO TABLE -LDJMP- * C. ADDS PROCESSOR CODING TO PROCESS THE REQUEST. ******************************************************************* * LDB OP OPERATION CODE INTO B STB OPP SET STOP FLAG LDA LDOPC SET OPERATION TABLE POINTER STA TEMP1 LDA LDJMP SET OPERATION PROC. JUMP ADDRESS STA TEMP2 LDA P1 SEND P1 IN A REG. UNL IFN LST CPB DBUG **********DEBUG********** CLB,RSS **********DEBUG********** JMP M0030 **********DEBUG********** STB FLG **********DEBUG********** ENT $DDDT **********DEBUG********** $DDDT JSB $DDT **********DEBUG********** DEF $TYPE+2 **********DEBUG********** DBUG ASC 1,DB **********DEBUG********** EXT $DDT **********DEBUG********** UNL XIF LST M0030 CPB TEMP1,I COMPARE WITH TABLE VALUE JMP TEMP2,I COMPARES GO DO IT ISZ TEMP1 DOES NOT COMPARE-INCREMENT OP TABLE ISZ TEMP2 INCREMENT JUMP ADR. JMP M0030 GO TO COMPARE NEXT OP CODE * OPER LDA $OPER ILLEGAL OPERATION CODE REQUEST $MSEX JRS $MEU $MESS,I RETURN AND RESTORE MEU STATUS MSEX EQU $MSEX D40 DEC 40 DM41 DEC -41 UNL IFZ NON-DEBUG BSS 7 BSS 7 MAKE RELEASED LISTING ALLIGN W/DBUG XIF LST * * * SKP * * LDOPC DEF *+1 OPERATION CODE TABLE ADDRESS ASC 8,RTONOFSSGOSTPRIT $ASTM ASC 9,TMDNUPLUEQLSLGTOTI ASC 8,BRABRUBLSZASURQU * ******IFN SYSTEM SESSION CONSOLE ASC 2,ENOP ******XIF * OPP NOP OPCODE FOR CURRENT REQUEST LDJMP DEF *+1,I JUMP ADDRESS FOR EACH OPER. CODE DEF M0070 RELEASE PROGRAM'S TRACKS DEF M0100 TURN ON DEF M0200 TURN OFF DEF M0300 OPERATOR SUSPEND DEF M0400 REMOVE OPERATOR SUSPEND DEF M0500 STATUS DEF M0650 PRIORITY CHANGE DEF M0600 INTERVAL TIME CHANGE DEF M0700 REAL TIME CLOCK INITIALIZATION DEF M0800 DN REQUEST DEF $IOUP+0 UP REQUEST DEF M0850 LU REQUEST DEF M0900 EQ REQUEST DEF M0960 LS REQUEST DEF M0970 LG REQUEST DEF M0990 TO REQUEST DEF M0750 TI REQUEST DEF M0725 BR REQUEST DEF M0950 AB REQUEST DEF M0408 RU REQUEST DEF BLIM BL REQUEST DEF SIZE SZ REQUEST DEF ASIGN AS REQUEST DEF URESV UR REQUEST DEF QUTM QU REQUEST * ******IFN SYSTEM/SESSION CONSOLE WORK DEF ENAB EN COMMAND DEF OPIN OP COMMAND ******XIF * DEF OPER OPERATOR ERROR * ON EQU LDOPC+2 RU EQU LDOPC+20 OF EQU LDOPC+3 ST EQU LDOPC+6 * * HED PARSE SUBROUTINE FOR OPERATOR MESSAGES * CALLING SEQUENCE: * LDA BUFFER ADDRESS * LDB CHARACTER COUNT * JSB $PRSE * DEF PRAM BUFFER * -RETURN- * * THE PRAM BUFFER IS 33 WORDS LONG AND CONTAINS UP TO 8 * PRAMETER DESCRIPTERS FOLLOWED BY THE PRAMETER COUNT. * * EACH PARAMETER DESCRIPTER CONSISTS OF FOUR WORDS: * * WORD MEANING * 1 FLAG WORD 0=NULL PRAMETER * 1=NUMERIC PRAMETER * 2=ASCII PRAMETER * 2 0 IF NULL,VALUE IF NUMERIC,ASCII(1,2) IF ASCII * 3 0 IF NOT ASCII ELSE ASCII(3,4) * 4 0 IF NOT ASCII ELSE ASCII(5,6) * * TEMP USAGE IN PARSE SECTION: * * TEMPP = CHARACTER ADDRESS * TEMP = PARAMETER FLAG ADDRESS * TEMP1 = TEMP BUFFER FETCH ADD. * TEMP2 = TEMP BUFFER STORE ADD. * TEMP3 = LAST INPUT CHAR.+1 ADD. * TEMP4 = PARAMETER VALUE ADDRESS. * TBUF = DEF TEMP5 (6 LOCATIONS) * TBUFS = DEF TEMP5+7 * $PRSE NOP CLE,ELA MAKE CHARACTER ADD. STA TEMPP SET BUFFER CHAR ADD. ADA B COMPUTE END ADDRESS. STA TEMP3 AND SET IT. LDB DM32 CLEAR PARAMETER AREA STB TEMP LDB $PRSE,I CLA MES1 STA B,I INB ISZ TEMP JMP MES1 * STA B,I CLEAR THE PRAM COUNT STB WSTAT SET ADDRESS OF PRAM COUNT DEC09 LDA TBUF INITIALIZE TEMP BUFFER ADDRESS STA TEMP1 STA TEMP2 * DEC10 LDB TEMPP GET THE BUFFER CHAR ADDRESS CPB TEMP3 IF NO MORE CHARACTERS JMP DEC60 GO PROCESS PRAM ISZ TEMPP STEP INPUT POINTER CLE,ERB CONVERT TO WORD SET UP IN E LDA B,I GET WORD FROM THE BUFFER SEZ,RSS CHECK TO EXAMINE UPPER/LOWER ALF,ALF UPPER, SO ROTATE TO LOWER BITS AND B377 MASK OFF ALL BUT LOW ORDER CPA COM SEE IF A COMMA JMP DEC60 YES CPA LASCI CHECK IF BLANK CHAR JMP DEC10 YES, SO SKIP CHAR LDB TEMP2 CHECK IF SIX CHARS IN PARM CPB TBUFS IF SO JMP DEC10 SKIP STORE STA TEMP2,I STORE THE CHAR STA SABRT SAVE THE LAST CHAR ISZ TEMP2 STEP FOR NEXT CHAR * JMP DEC10 GO TO PROCESS NEXT CHAR * * ATTEMPT NUMERIC CONVERSION OF PARM. * DEC60 LDA WSTAT,I FIRST SET UP POINTERS RAL,RAL TAKE 4 TIMES THE PRAM NUMBER ADA $PRSE,I PLUS THE OP CODE ADDRESS-1 STA TEMP SET FLAG ADDRESS CLE,INA ONE MORE AND WE HAVE STA VALOC THE PRAMETER VALUE LOCATION LDA TEMP2 IF NO CHARACTERS CPA TBUF INPUT JMP DEC75 GO TRY NEXT ONE * * NOW TRY FOR A NUMBER * ISZ TEMP,I SET FLAG TO 1 FOR NUMBER LDB TEMP1,I GET FIRST CHAR CPB DASH MINUS SIGN? ISZ TEMP1 YES, INCRE TO NEXT CHAR CPA TEMP1 (A) STILL = TEMP2 JMP DEC80 IF "-" WAS ONLY CHAR, THEN ASCII * LDB D10 SET UP CONVERSION BASE LDA SABRT CPA "B" IF B SUFFIX LDB D8 SET FOR BASE 8 STB TEMP4 SET BASE DEC65 MPY VALOC,I BUMP THE CURRENT VALUE VALOC EQU *-1 LDB TEMP1,I GET THE NEXT CHAR. ADB DM58 IF GREATER THAN "9" SEZ,CLE,RSS THEN NOT A NUMBER ADB D10 IF LESS THAN "0" SEZ,CLE,RSS THEN JMP DEC80 NOT A NUMBER ADA B ACCUMULATE THE STA VALOC,I NUMBER ISZ TEMP1 STEP THE BUFFER ADDRESS LDA TEMP4 GET THE BASE TO A LDB TEMP1 AND THE NEXT CHAR. LOC. TO B CPB TEMP2 IF END THEN JMP DEC70 GO TO NEXT PRAM * INB IF BASE 8 CONVERSION CPB TEMP2 AND LAST CPA D10 CHAR. THEN DONE SO SKIP JMP DEC65 ELSE GO GET THE NEXT ONE * SPC 1 DEC70 LDB VALOC,I GET VALUE LDA TBUF,I IF NEG NUMBER, CPA DASH CMB,INB NEGATE VALUE STB VALOC,I STORE VALUE * DEC75 ISZ WSTAT,I COUNT THE PRAMETER LDA WSTAT,I IF LDB TEMP3 EOL OR CPB TEMPP 8 PRAMS LINE RSS THEN CPA D8 JMP DEC90 GO PROCESS JMP DEC09 ELSE GO GET NEXT CHARACTER SPC 1 DEC80 ISZ TEMP,I SET NOT NUMBER FLAG LDA AASCI FILL THE PRAM WITH BLANKS LDB VALOC PRAM ADDRESS TO B INB DON'T WORRY ABOUT FIRST WORD STA B,I SET SECOND WORD CLE,INB STEP TO THIRD WORD STA B,I SET THIRD WORD TO DOUBLE BLANK. LDB TBUF GET THE TEMP BUFFER POINTER DEC85 CPB TEMP2 END OF INPUT? JMP DEC75 YES GO PROCESS NEXT PRAM CPB STOP SIXTH CHAR YET? JMP DEC75 YES, END PARAM LDA B,I GET THE CHARACTER SEZ,RSS IF UPPER CHARACTER ALF,SLA,ALF ROTATE AND SKIP XOR VALOC,I LOWER ADD THE UPPER CHAR. XOR LASCI ADD/DELETE THE LOWER BLANK STA VALOC,I STORE THE PACKED WORD SEZ,CME,INB STEP B,SKIP IF UPPER ISZ VALOC ELSE STEP STORE ADDRESS. JMP DEC85 GO GET OTHER CHAR. SPC 2 DEC90 ISZ $PRSE STEP RETURN ADDRESS JMP $PRSE,I RETURN SPC 2 "B" OCT 102 ASCII "B" DASH OCT 55 ASCII "-" STOP DEF TEMP5+6 ASCII 6TH CHAR STOP HED MESSAGE PROCESSOR--RT,XXXXX COMMAND * * RT,XXXXX * * THE RELEASE TRACKS ROUTINE FUNCTIONS AS FOLLOWS: * IF PROGRAM STATUS NOT DORMANT, STATUS ERROR. * IF DORMANT, ALL TRACKS ASSIGNED TO THAT PROGRAM * ARE RELEASED - ALL PROGRAMS IN DISC TRACK * ALLOCATION SUSPENSION ARE RESCHEDULED. * M0070 JSB TTNAM GO FIND ID SEGMENT ADDRESS ADB D8 PROGRAM MUST BE DORMANT. LDA B,I WILL BE IF POINT OF SZA SUSPENSION IS ZERO. JMP M0405 OTHERWIZE, ILL STATUS ERROR. LDA WORK GET ID SEGMENT ADDRESS JSB $OTRL RESCHEDULE DISC-SUSP PROGRAMS JMP M0150 RETURN- HED MESSAGE PROCESSOR--ON,XXXXX COMMAND * ***************************************************************** * * ON[IH],XXXXX * ON[IH],XXXXX,NOW * ON[IH],XXXXX,P1,...,P5 * ON[IH],XXXXX,NOW,P1,...,P5 * * THE ON REQUEST FUNCTIONS AS FOLLOWS: * IF NO RESOLUTION CODE, THEN PROGRAM SCHEDULED. * IF -NOW- OPTION, THEN ENTER PROGRAM INTO TIME LIST * AND SET TIME VALUES TO CURRENT TIME PLUS 10 MSC * IF NOT ONE OF ABOVE, AND TIME VALUES ARE ZERO THEN * PROGRAM FUNCTIONS SAME AS -NOW- OPTION. * IF NOT ONE OF ABOVE, AND TIME VALUES ARE PRESENT, * THEN PROGRAM IS ADDED TO TIME LIST. * NOTE: 1)ALL THE ABOVE OPTIONS ALLOW PARAMETERS TO BE * PASSED TO THE PROGRAM. THESE MUST BE ASCII * DECIMAL NUMBERS WHICH ARE CONVERTED TO BINARY * AND STORED IN ID SEGMENT TEMP AREA. UPON * EXECUTION, THE B REGISTER WILL POINT TO TEMP. * UP TO 5 PARAMETERS MAY BE INPUT. IF NO PARA- * METERS ARE INPUT, THE TEMP AREA ARE ZEROS BUT * B REGISTER WILL STILL POINT TO TEMP. AREA * 2) THE ABOVE OPTIONS WILL ALLOW THE ORIGINAL * SCHEDULING STRING TO BE SAVED(UNLESS 'IH' * IS SPECIFIED OR THERE ARE NO PARAMETERS). * THE SCHEDULED PROGRAM MAY RECOVER THIS STRING * WITH AN EXEC 14 CALL. * ******************************************************************** * M0100 JSB TTNAM FIND ID SEGMENT ADDR LDB WSTAT,I IF NO PARAMETERS RBL,RBL BIT IS SET, THEN SSB,RSS ILLEGAL STATUS. SZA CHECK IF PROGRAM DORMANT JMP M0405 ILLEGAL STATUS ERROR JSB $SZIT CHECK OUT THE PROGRAM SIZE SZA IS IT OK ? JMP MSEX NO, FLUSH HIM ! * JSB PLOAD GO TO PROCESS CONTROL PRAMETERS LDB WORK ADB D17 COMPUTE RES/T/MULT ADDR LDA B,I ALF,RAR AND D7 CHECK RESOLUTION CODE SZA NONE, SO GO TO SCHED NOW JMP M0110 M0105 JSB $LIST SCHEDULE PROGRAM OCT 301 JMP MSEX RETURN M0110 INB SET B FOR $ONTM LDA CP2 IF ASCII RAR,SLA "NO" ENTERED LDA P2 THEN CPA NO GO PUT CCA IN THE TIME LIST FOR NOW+10MS. JMP $ONTM COMPLETE IN TIME MODULE HED MESSAGE PROCESSOR--OF,XXXXX COMMAND * * OF,XXXXX * OF,XXXXX,1[,NP] "ABORT" * OF,XXXXX,8[,NP] "ABORT AND REMOVE FROM SYSTEM" * * THE NP OPTION SUPPRESSES THE "PROGX ABORTED" MESSAGE. * * THE OF REQUEST FUNCTIONS AS FOLLOWS: * IF PROGRAM DORMANT, IT MAY STILL BE IN TIME LIST SO * A CALL IS MADE TO REMOVE PROGRAM FROM TIME LIST * IF ABORT OPTION 1, THEN $ABRT PROCESSOR IS * CALLED. IF ABORT OPTION 8, IN ADDITION TO * $ABRT PROCESSOR BEING CALLED, IF BIT 7 OF THE * TYPE FIELD IS SET, THEN TRACK(S) WHERE PROGRAM * IS STORED IS ALSO RELEASED BY $DREL. THE NAME * FIELD IN THE ID SEGMENT IS CLEARED SO THAT THE * PROGRAM CANNOT BE CALLED AGAIN. * IF PROGRAM SCHEDULED OR OPERATOR-SUSPENDED, THEN * DORMANT REQUEST MADE VIA LIST PROCESSOR AND * PROCEED AS ABOVE. * IF PROGRAM STATUS NOT ONE OF ABOVE, THE DORMANT BIT * IS SET IN STATUS, IF NOT ABORT OPTION. IF ABORT * OPTION, CHECK IF AVAILABLE MEMORY OR UNAVAILABL * DISC TRACK SUSPENSION-IN WHICH CASE THE ABORT * BIT IS SET AND $ABRT CALLED. IF STATUS IS I/O * SUSPENSION, SET ABORT BIT AND RETURN. * IF INPUT SUSPENSION, CHECK IF * PROGRAM BEING READ IN FROM DISC. IF YES, THEN * SET ABORT BIT AND RETURN. IF NOT BEING READ IN * FROM DISC, SET ABORT BIT AND CALL $IOCL TO * CLEAR THE I/O REQUEST * M0200 JSB TTNAM GO TO FIND ID SEG ADDR M0202 LDB WORK GET ID SEG ADDRESS AND STB TEMPH SAVE IT IN LOCAL STORE SEZ IF SHORT ID-SEG. JMP M0207 GO TEST FOR 8 * * CLEAR NO-PARMS BIT IN CASE PROG IS IN THE TIME LIST * ADB D15 ADVANCE TO ID16 LDA B,I FETCH IT AND CL.NP REMOVE THE NO-PARM BIT STA B,I RESTORE THE WORD LDB WORK FETCH ID ADDR AGAIN * LDA P2 GET PRAM TWO SZA IF NOT ZERO JMP CHKNP CHECK NO PRINT PARAMETER * M0240 JSB SABRT GO DO SOFT ABORT JMP $XEQ EXIT DONE * CHKNP LDA P3 NO PRINT OPTION CHOSEN? CPA NP STA NOPRN YES, SET THE NO PRINT FLAG M0250 LDA WSTAT,I POWER ABORT SO AND D15 GET CURRENT STATUS SWP PUT ID-SEG. ADDRESS IN A,STAT IN B CPB D2 IF I/O SUSP THEN JMP $IOCL GO ABORT THE I/O * JSB $ABRT GO TO ABORT ROUTINE B40 CLE CLEAR E FOR TRACK RELEASE M0207 LDA P2 RELEASE PROG'S TRACKS? CPA D8 IF P = 8, RSS YES JMP $XEQ NO-SO RETURN * LDB TEMPH ADB D14 GET ADDRESS OF LAST LDA B,I NAME WORD ALF,ALF CHECK IF TYPE BIT 7 SET SSA,RSS JMP $XEQ NO-CANNOT REL PROG TRACKS * SEZ,INB,RSS IF SHORT ID-SEG. SKIP ADB D7 ELSE INDEX TO MEM ADDRESS FOR LONG * ALF,ALF *A790216** RE-POSITION TYPE TO LOW END AND D15 SAVE PROGRAM TYPE STA TEMP5 FOR TYPE 5 CHECK * *A790216** LDA B,I CMA,INA INB ADA B,I STA TEMP3 # WORDS OF MAIN INB LDA B,I CMA,INA INB ADA B,I # WORDS IN BASE PAGE INB SET UP THE DISC ADDRESS POINTER STB TEMP1 IN TEMP1 * * * IF THE PROGRAM BEING TERMINATED IS A CLONE (I AM A COPY BIT IS SET) * DON'T RELEASE TRACKS, GO KILL THE ID. NOTE: DON'T ALTER (A). * * * *A790216** LDB TEMP5 FETCH PROGRAM TYPE CPB D5 IF SEG, SKIP CLONE CHECK JMP M0208 * *A790216** * LDB TEMP1 FETCH ID 27 ADDR ADB D5 ADVANCE TO 2ND SESSION WORD LDB B,I AND FETCH IT BLF,BLF IF THE "IM A COPY" BIT (BIT 9) RBR,SLB IS SET JMP M0227 DON'T GIVE THE TRACKS BACK * M0208 CLB CLEAR FOR DOUBLE SHIFT ADA B177 ROUND UP TO NEAREST SECTOR IOR B177 SET THE LOW BITS AND ADA TEMP3 ADD AND ROUND UP THE MAIN LSR 6 DIVIDE BY 64 TO GET SECTORS STA TEMP5 TOTAL # SECTORS IN PROGRAM LDA TEMP1,I GET THE DISC ADDRESS LSR 7 SHIFT TO TRACK AND B377 ADDRESS AND LDB TEMP1,I CHECK IF LU 2 OR 3 SSB LU 2 ADA TATSD LU 3 STA TEMP2 ACTUAL STARTING TRACK # LDB SECT2 LDA TEMP1,I CHECK IF LU 2 OR 3 SO CAN DIVIDE SSA BY # OF TRACKS FOR THAT LDB SECT3 DISC. STB TEMP LDA TEMP1,I GET THE TRACK ADDRESS AND B177 MASK OUT THE SECTOR ADDRESS CMA,INA,SZA,RSS IF ZERO RELEASE THIS TRACK JMP M0226 ADA TEMP ELSE SUBTRACT FROM TRACK ISZ TEMP2 SIZE STEP TO NEXT TRACK CMA,INA AND COMPUTE THE REMAINING SECTORS M0226 ADA TEMP5 A IS TOTAL NUMBER TO CLB CLEAR FOR DIVIDE SZA GEORGES FIX 3/13 SSA RELEASE IF NEGATIVE JMP M0227 FORGET THE WHOLE THING DIV TEMP SZB CHECK IF PARTIAL TRACK INA YES STA B (B)=# TRACKS LDA TEMP2 (A)=STARTING TRACK JSB $DREL CALL EXEC SYS RELEASE TRACKS M0227 LDB TEMPH ADB D12 CLA STA TEMP1,I CLEAR THE TRACK WORD STA B,I INB STA B,I INB LDA B,I SAVE THE OLD SHORT/LONG AND B77 FLAG STA B,I * * * NOTE: MEMORY RESIDENT ID'S ARE SAME LENGTH AS DISC RESIDENT * AND D7 LOOK FOR AN ID EXTENSION CPA D5 A SEGMENT ? JMP $XEQ THEN WE'RE FINISHED * ADB D14 INDEX TO ID EXT WORD LDA B,I PULL IN EMA INFO SZA,RSS IS THIS AN EMA PROG ? JMP $XEQ NO, SO WERE DONE * ALF YES, SO GET THE ID EXT RAL,RAL AND M77 ADA $IDEX GET THE ID EXT ADDRESS LDA A,I NOW HAVE THE ADDRESS CLB STB A,I NOW ZAP THE WORD. JMP $XEQ NOW WE'RE DONE. GO SEE WHAT'S NEW. * M77 OCT 77 NP ASC 1,NP NOPRN NOP * * * SKP SPC 1 * * THE SOFT ABORT ROUTINE CLEARS ANY RESOURCE FLAGS * CALLS THE TERMINATION ROUTINE AND REMOVES A PROGRAM FROM * THE TIME LIST. * * IT ALSO SETS THE ABORT FLAG (100000) IN THE FATHERS ID-SEG. * (IF THERE IS A FATHER AND HE IS WAITING) SO THAT RMPAR * MAY RECOVER THE PRAMETER. * * IF THE PROGRAM IS WAITING FOR A SON IT CLEARS THE SONS * "FATHER IS WAITING" FLAG. * * CALLING SEQUENCE: * * LDB ID-SEG. ADDRESS * JSB SABRT * * RETURN REGISTERS MEANING LESS. * * THIS ROUTINE DOES NOT GENERATE AN ABORT MESSAGE NOR DOES IT * PULL A PROGRAM OUT OF AN I/O LIST. ($LIST DOES SET A FLAG * WHICH WILL PUT THE PROGRAM DORMANT ON I/O COMPLETION. * SABRT NOP STB TEMPH SAVE THE ID ADDRESS ADB D15 GET THE STATUS LDA B,I WORD AND ZAPR CLEAR THE RESOURCE BIT STA B,I RESET IT INB SET B TO THE TIME LIST WORD JSB $TREM REMOVE PGM FROM THE TIME LIST LDB TEMPH RESTORE THE ID ADDRESS AND ADB D15 INDEX TO THE STATUS WORD LDB B,I AND FETCH IT BLF,SLB IF PROGRAM IS WAITING JMP SABT2 GO CLEAR THE SONS FLAG * SABT1 LDB TEMPH RESTORE THE ID-SEG. ADDRESS AND JSB TERM CALL THE TERMINATION PROCESSOR ISZ POP STEP TO THE FATHER'S FIRST PRAM WORD RSS JMP SABRT,I LDA SIGN SET SIGN BIT FOR FATHER ABORT FLAG STA POP,I SET THE ABORT FLAG LDB POP CACULATE THE B-REG ADDRESS ADB D9 AND LDA POP SET IT TO STA B,I POINT TO THE ABORT WORD JMP SABRT,I DONE RETURN * SABT2 LDB TEMPH GET THE SONS ID ADDRESS INB FROM WORD TWO LDB B,I OF THE ID-SEGMENT ADB D20 INDEX TO THE FATHER WAIT FLAG WORD LDA B,I GET THE WORD RAL,CLE,RAL CLEAR BIT 14 ERA,RAR AND STA B,I RESTORE THE WORD JMP SABT1 GO TERMINATE THE PROGRAM SPC 2 TEMPH DEF FMGR D12 DEC 12 DM24 DEC -24 DM60 DEC -60 ZAPR OCT 177477 HED MESSAGE PROCESSOR--SS,XXXXX COMMAND * * SS,XXXXX PROCESSOR * * THE SUSPEND REQUEST FUNCTIONS AS FOLLOWS: * IF PROGRAM DORMANT OR OPERATOR SUSPENDED, THEN * ILLEGAL STATUS ERROR * IF SCHEDULED, THEN OPERATOR SUSPEND VIA $LIST * IF OTHER THAN ABOVE, SET THE OPERATOR-SUSPEND BIT * IN STATUS. AND ALL THESE WONDERS ARE * BY $LIST. * M0300 JSB $LIST OCT 206 SCHED TO OPER-SUSP DEFP1 DEF P1 BY NAME SZA IF ERROR JMP MSEX EXIT * LDA WSTAT,I SET THE NO PRAMS IOR B20K BIT STA WSTAT,I TO PREVENT PRAMS ON RESTART LDA WORK GET ID ADR JSB ALDM GO PUT IN DORM LIST & SET DM FLAG JMP M0150 EXIT SPC 2 B20K OCT 20000 HED MESSAGE PROCESSOR--GO COMMAND * ***************************************************************** * * GO[IH],XXXXX * GO[IH],XXXXX,P1,...,P5 * * THE CONTINUE FROM POINT OF SUSPENSION FUNCTIONS AS * FOLLOWS: * IF NOT OPERATOR SUSPEND: * BIT SET - REMOVE OPER-SUSP BIT IN STATUS * BIT NOT SET - ERROR EXIT FOR MESSAGE * IF OPERATOR SUSPEND, SCHEDULE PROGRAM. UNLESS * 'IH' IS SPECIFIED OR NO PARAMETERS ARE GIVEN, * ANY PREVIOUS OPERATOR SCHEDULING STRING IS * RELEASED AND THE 'GO' SCHEDULING STRING IS * SAVED FOR RETRIEVAL BY THE PROGRAM USING AN * EXEC 14 CALL. * ***************************************************************** * M0400 JSB TTNAM GO TO FIND ID SEG ADDR CPA D6 CHECK IF PROGRAM OPERATOR-SUSPEND JMP M0410 OPERATOR-SUSPEND--SO GO TO PROCESS LDA WSTAT,I NOT OPER SUSP - AND B1000 IS BIT SET? SZA,RSS JMP M0405 NO, ERROR- XOR WSTAT,I YES, CLEAR BIT STA WSTAT,I AND M0150 CLA EXIT JMP MSEX * M0405 LDA $ILST ILLEGAL STATUS MESSAGE ADDRESS JMP MSEX EXIT SKP * ***************************************************************** * * RU[IH],XXXXX * RU[IH],XXXXX,P1,...,P5 * * THE RU COMMAND FUNCTIONS AS FOLLOWS: * IF DORMANT, THE PROGRAM IS SCHEDULED. * PARAMETERS MAY BE PASSED TO THE PROGRAM. THESE * ARE TREATED LIKE PARAMETERS IS THE GO COMMAND * (SEE NOTE 1 FOR THE GO COMMAND). * THE SCHEDULING STRING MAY BE SAVED. SEE NOTE 2 * FOR THE GO COMMAND. * ******************************************************************* * M0408 JSB TTNAM RUN COMMAND ROUTINE LDB WSTAT,I IF NO PARAMETERS RBL,RBL BIT IS SET, THEN SSB,RSS ILLEGAL STATUS. SZA IF NOT DORMANT JMP M0405 GIVE THE MESSAGE,ELSE DO IT * JSB $SZIT CHECK OUT PROGRAM SIZE SZA OK ? JMP MSEX NO ! * M0410 LDA D2 CHECK IF CONTROL PARAMETERS FOLLOW CPA PARAM JMP M0105 NO,DO NOT RETURN STRING,SCHEDULE PROGRAM. * JSB PLOAD GO TO PROCESS CONTROL PARAMETERS JMP M0105 GO SCHEDULE THE PROGRAM HED MESSAGE PROCESSOR--ST,XXXXX COMMAND * * ST,XXXXX PROCESSOR * * IF XXXXX = 0 NAME AND PARTITION# OF CURRENT PGM IS PRINTED * IF XXXXX > 0 NAME OF THE PGM IN PARTITION #XXXXX IS PRINTED * THE STATUS REQUEST OUTPUTS THE REQUESTED PROGRAM STATUS * IN THE FOLLOWING FORMAT: * PRPRP S R MMMM HR MN SC MS T * * PRPRP =PRIORITY * S = STATUS (0 THRU 6 * R = RESOLUTION CODE (0 THRU 4) * MMM = MULTIPLE VALUE * HR = NEXT START TIME -HR * MN = NEXT START TIME -MIN * SC = NEXT START TIME -SEC * MS = NEXT START TIME -10 MSEC * T = PRESENT IF PROGRAM IN TIME LIST * M0500 LDB XEQT IF ZERO SZA,RSS GIVE STATUS OF JMP M0540 CURRENT PGM SSA JMP M0505 IF NEG, ASSUME WANT PRG STATUS LDB $MNP GET THE MAX # OF PARTITIONS CMB IF (A) .LE. TOTAL ADB A NUMBER OF PTTNS SSB THEN GIVE PTTN STATUS JMP M0530 * M0505 JSB TTNAM GO TO FIND ID SEGMENT ADDR CPB D5 IS THIS A SEGMENT ? LDA D9 THEN GET THE SEGMENT FLAG CLB,CCE STB RQP3 SET UP FOR $TIMV CALL JSB $CNV1 CONVERT STATUS TO ASCII. ALF,ALF MOVE TO HIGH HALF WORD STA BUFF4 STORE STATUS IN BUFFER. LDB DM28 CPA BL9 IF SHORT ID-SEG LDB DM8 SET FOR 8 CHAR. MESS STB BUFFR STORE CHARACTER COUNT IN BUFFER LDB WORK ADB D6 PRIORITY ADDRESS CPA BL9 IF SHORT ID-SEG CLA,RSS SET PR TO 0 LDA B,I JSB $CNV1 CONVERT PRIORITY TO ASCII LDB ASCI1 GET DIGITS 23-45 TO B-A RRL 8 34-52 IN B-A STB BUFF2 SET 34 LDB ASCI 1-52 IN B-A ALF,ALF 1-25 IN B-A RRL 8 12-5 IN B-A STB BUFF1 SET 12 STA BUFF3 SET 5 BLANK LDB TEMP6 RESTORE B TO PRIOR ADDRESS ADB D11 RESOL CODE/MULT ADDRESS LDA B,I ALF,RAR AND D7 JSB $CNV1 CONVERT RESOLUTION CODE TO ASCII ALF,ALF ROTATE TO HIGH HALF WORD STA BUFF5 STORE RESOLUTION CODE IN BUFFER LDA B,I AND B7777 JSB $CNV1 CONVERT MULTIPLE TO ASCII STA BUFF7 STORE MULTIPLE IN BUFFER LDA ASCI1 STA BUFF6 STORE MULTIPLE IN BUFFER LDA B,I CHECK IF PROG IN TIME LIST ALF,SLA TEST BIT 12 (T) BIT JMP M0510 YES LDA AASCI PROGRAM NOT IN TIME LIST RSS M0510 LDA TZERO PROG IN TIME LIST STA BUF14 STORE ASCII BLANK OR T IN BUFFER INB SET B TO TIME ADDRESS LDA DTEMP SET UP TO GET TIME TO STA RQP2 TEMP AREA DLD B,I GET TIME FROM ID-SEG JSB $TIMV CONVERT THE TIME LDA TEMP3 GET HOURS JSB $CNV1 CONVERT LDB ASCI1 GET VALUE RRR 8 ROTATE TO BLANK ON EACH SIDE DST BUFF8 SET IN MESSAGE LDA TEMP2 GET MIN. VALUE JSB $CNV1 CONVERT STA BUF10 STUFF IN BUFFER LDA TEMP1 AND AGAIN FOR SEC JSB $CNV1 LDB ASCI1 VALUE TO A BLANK TO B RRR 8 ROTATE DST BUF11 SET IN BUFFER LDA TEMP ONE MORE TIME FOR 10'S OF MS. JSB $CNV1 STA BUF13 STORE TENS OF MSEC IN BUFFER M0520 LDA BUFAD LOAD A WITH OUTPUT BUFFER ADDRESS JMP MSEX RETURN SPC 1 TZERO ASC 1, T D11 DEC 11 B7777 OCT 7777 DTEMP DEF TEMP BL9 ASC 1,9 BLANK 9 DM28 DEC -28 DM1 DEC -1 SPC 1 M0530 ADA DM1 MPY D7 (PTTN#-1)*7 IS ADA $MATA ADDR OF ENTRY IN MATA ADA D2 +2 FOR ID SEG ADDR WORD LDB A,I (B)=ID SEG ADDR JMP M0550 GO PRINT PRG NAME * M0540 SZB,RSS ANY PRG RUNNING? JMP M0550 NO PRINT 0 ADB D21 GET PARTITION # LDA B,I FROM ID SEG WORD 22 AND B77 CCE,INA GET USERS ACTUAL PART NUMBER JSB $CNV1 CONVERT TO DECIMAL STA BUFF4 SET IN MESSAGE LDB XEQT (B)=ID SEG ADDR LDA DM8 (A)=COUNT 8 CHARS JMP M0560 GO PRINT M0550 CCA SET A FOR ZERO PRINT SZB SKIP IF NO PROGRAM LDA DM5 ELSE RESET A FOR PGM PRINT M0560 STA BUFFR SET MESSAGE LENGTH LDA MPT81 GET UPPER ASCII "0" TO A SZB SKIP IF NO PGM ADB D12 ELSE STEP TO NAME ADDRESS LDA B,I STA BUFF1 SET NAM12 INB STEP TO NEXT NAME WORD DLD B,I GET THE NEXT WORDS STA BUFF2 SET NAM34 LDA AASCI FILL RIGHT BLANK BLF,BLF INTO NAM5 RRL 8 STB BUFF3 SET NAM5 JMP M0520 GO EXIT * * SPC 2 HED OVERLAY - INPUT - OUTPUT BUFFER AREA $PBUF DEF PRAMS SET ADDR OF OVERLAY AREA FOR EXEC *********************************************************************** * INPUT MESSAGE BUFFER IBUFX DEF *+1 LOCAL MESS INPUT BUFFER (FOR MESSS) IBUFY BSS 40 * * INBUF BSS 40 MESSAGE INPUT BUFFER BUFFL EQU *-INBUF+*-INBUF LENGTH IN #CHARS * *********************************************************************** * SPC 2 * SYSTEM OUTPUT BUFFER * BUFFR EQU * SHOULD BE AT LEAST 15 WORDS LONG BUFF1 EQU BUFFR+1 BUFF2 EQU BUFFR+2 BUFF3 EQU BUFFR+3 BUFF4 EQU BUFFR+4 BUFF5 EQU BUFFR+5 BUFF6 EQU BUFFR+6 BUFF7 EQU BUFFR+7 BUFF8 EQU BUFFR+8 BUFF9 EQU BUFFR+9 BUF10 EQU BUFFR+10 BUF11 EQU BUFFR+11 BUF12 EQU BUFFR+12 BUF13 EQU BUFFR+13 BUF14 EQU BUFFR+14 * * PARAMETER POINTERS FOR DATA STORAGE * PRAMS BSS 1 CHARACTER COUNT-OP CODE OP BSS 3 OPERATION CODE CP1 BSS 1 CHAR COUNT-PARAM 1 P1 BSS 3 PARAM 1 (UP TP 3 WORDS-6CHAR.) CP2 BSS 1 CHAR COUNT-PARAM 2 P2 BSS 3 PARAMETER 2 CP3 BSS 1 CHAR COUNT-PARAM 3 P3 BSS 3 PARAMETER 3 CP4 BSS 1 CHAR COUNT-PARAM 4 P4 BSS 3 PARAMETER 4 CP5 BSS 1 CHAR COUNT -PARAM 5 P5 BSS 3 PARAMETER 5 CP6 BSS 1 CHAR COUNT-PARAM 6 P6 BSS 3 PARAMETER 6 CP7 BSS 1 CHAR COUNT-PARAM 7 P7 BSS 3 PARAMETER 7 PARAM BSS 1 PARAMETER COUNTER * $OP EQU OP ENDT EQU * ********************************************************************** * HED SYSTEM START UP ROUTINE * * WHEN THE SYSTEM IS BOOTED UP A JMP 3,I IS MADE. * THE DESTINATION OF THE JUMP IS $STRT. THE CODE FROM HERE TO * OVCHK IS EXECUTED ONCE AT START UP AND LATER OVERLAYED FOR I/O * BUFFERS AND OTHER TEMPS NEEDEDBY THE SYSTEM. * * ORG IBUFY PUT INIT CODE IN BUFFER * * $STRT LIA 1 GET THE SWITCH REGISTER LIB 1 AND B70K KEEP TOP OCTAL DIGIT SZA,RSS = 0 ? JMP TOIT YES, NO HALT &NO DBUG ALF ROTATATE TO LOW END * IFN CPA D7 IF = 7 & DDT IN SYS, THEN HALT CLA,RSS TO LET THEM SET SWITCH REGISTER JMP DOHLT AND THEN CALL $DDT ON THEIR BEHALF OTA 1 CLEAR THE SWITCH REGISTER FIRST HLT 75B JSB $DDT DEF TOIT XIF UNL IFZ BSS 7 XIF LST * DOHLT CPA D6 HLT 76B TOIT JSB $SYMP SET UP THE SYSTEM MAP JSB $CNFG NOW GO DO RECONFIGURATION * LDA DM5 GET THE LOOP VARIABLE STA TEMP5 PREPARE TO CALL $ALC LDA DEQT1 TO RETURN BLOCKS OF MEMORY STA TEMP6 TO INITIALIZE SYSTEM AVAILABLE MEMORY MRTNL LDA TEMP6,I BLOCK ADDRESSES ARE IN PAIRS STA MADR1 EQT1 THRU EQT12 ISZ TEMP6 LDA TEMP6,I STA NWDS1 ISZ TEMP6 JSB $RTN RETURN A BLOCK MADR1 NOP NWDS1 NOP ISZ TEMP5 DONE WITH EQT1 THRU EQT10? JMP MRTNL NO, RELEASE NEXT BLOCK JMP $ALC NEXT GO TO $ALC FOR CONFIGURATION * DEQT1 DEF EQT1 GOES TO GTFMG FROM $ALC VIA $WORK * GTFMG LDB TEMPH GET FMGR'S NAME ADDRESS JSB $ZZZZ GO TO DISPATCHER TO SET UP LDB TERM GET ADDRESS JSB TNAME OF D.RTR TO B SEZ,RSS IF NONE SKIP STB ID.RT SET FOR LATER. LDB P1OR2 LOOK UP EDIT'S ADDRESS JSB TNAME ALSO SEZ,RSS IF NONE SKIP STB ID.RT+1 SET IN LIST LDB TEMPH NOW FIND JSB TNAME FMGR'S ID-SEGMENT ADDRESS SEZ,RSS IF NONE SKIP STB IDFMG SET ADDRESS LDB DSMP JSB TNAME SEZ,RSS STB $IDSM * LDA IDFMG GET FMGR'S ID ADDRESS SZA,RSS ANY FMGR ? JMP NOFMG NO, SO FORGET ABOUT ANY CHECKS * STA WORK SET UP HIS ADDRESS IN $WORK JSB $SZIT SEE IF THERE'S A PART'N LARGE ENOUGH SZA WELL IS THERE ? JMP NGFMG NO, YOU BLEW THE RECONFIGURATION TURKEY !!!! * LDA ID.RT OK, SO YOU DID THAT RIGHT. BUT DID YOU SZA,RSS YOU GIVE D.RTR ENOUGH ROOM ? JMP NOFMG NO D.RTR HUH . * STA WORK SET UP FOR THE TEST JSB $SZIT SEE IF THERE IS ENOUGH ROOM SZA OK ? JMP NGFMG NO. * NOFMG LDA D$RN TRACK DOWN RN TABLE ADDRESS RAL,CLE,SLA,ERA IF INDIRECT LDA A,I USE NEXT LEVEL * LDB IDADS GET ADDRESS OF ID ADDRESSES JMP $ERMG GO TO EXEC TO SET UP NO RETURN * NGFMG HLT 10B NO ROOM FOR FMGR, SO YOU LOSE !!!!!!! JMP *-1 YOU LOSE AGAIN ! * * * IDADS DEF ID.RT FMGR ASC 3,FMGR D.RTR ASC 3,D.RTR DSMP DEF *+1 ASC 3,SMP D$RN DEF $RNTB * $SYMP NOP LDA $DLP GET THE LOAD POINT ALF AND GET THE # OF PAGES RAL,RAL STA $CMST * LDA $DLP GET IT AGAIN CMA,INA MAKE IT NEG ADA BKCOM ADD LENGTH & START OF COMMON LDB $MPFT ADB D3 ADA B,I * SZA,RSS ANY COMMON AT ALL ? JMP NCOMN NO AND B76K YES. SO GET PAGE BITS ALF TO LOW END RAL,RAL AND SAVE IT NCOMN STA $COML THIS IS THE LENGTH(IN PAGES) OF COMMON * ADA $CMST ADD IN START PAGE OF COMMON & STA $SDA WE HAVE THE START OF THE SYS DVR AREA * LDB $PLP GET THE PRIV LOAD POINT BLF GET PAGE # TO LOW END RBL,RBL CMA,INA SUBTRACT FROM START OF SYS DVR AREA ADA B TO GET LENGTH OF TB 1 & SYS DVR AREA STA $SDT2 * LDA LBORG NOW GET THE LIBRARY ORGIN ALF CONVERT TO PG # RAL,RAL STA $RLB AND SET AS START OF RES LIB * LDB $MPFT NOW INB GET START OF MEM RES AREA LDB B,I TO LOW END BLF RBL,RBL CMA,INA ADD IN START OF LIBRARY ADA B AND WE GET THE LENGTH STA $RLN OF THE RES LIBRARY * * SPC 1 * SET UP THE SYSTEM MAP AND RETURN SPC 1 * CLA START REGISTER 0 CLB START VALUE = 0 LDX $SDA SET EM UP TO START OF SYS DVR AREA XMS DO IT ! * ADB WRTPR NOW GET THE WRITE PROTECT STA TBL SAVE START REGISTER LDA $SDA GET START VALUE CMA,INA MAKE NEG TO GET # OF REGS ADA D32 LEFT TO SET UP CAX PUT IN X-REG LDA TBL RESTORE START REG XMS AND PLAY IT AGAIN SAM. * LDA $MPSA GET START PAGE SYS AV AND B1777 STA TBL B HAS START VALUE LDA EQT1 AND B1777 XOR EQT1 KEEP ONLY PAGE ALF RAL,RAL GET IN LOW 5 BITS STA NWDS1 START PAGE OF SAM LDA TBL XOR $MPSA GET LENGTH ALF RAL,RAL A HAS LENGTH CAX PUT IN XREG LDB TBL START PAGE NUMBER ADB WRTPR AND WRITE PROTECT LDA NWDS1 START REGISTER XMS LOAD MAP * * STA NWDS1 SAVE REGISTER # LDA $MPS2 GET THE 2ND CHUNK OF SAM AND B1777 SAVE THE PHY PG # LDB A PUT IN B ADB WRTPR AND SET UP WRITE PROTECT XOR $MPS2 NOW GET # OF PAGES ALF RAL,RAL TO LOW END CAX AND PUT INTO X AS # OF REGISTERS LDA NWDS1 GET START REG BACK AGAIN XMS AND DO IT SJP $SYMP,I SET UP SYSTEM MAP & RETURN TBL NOP *$MPSA-$MPS2 0-9 START PG SAM * 10 - 15 NUMBER PGS SAM WRTPR OCT 40000 B70K OCT 70000 B76K OCT 76000 * OVCHK EQU *-ENDT OVERLAY CHECK * HED MESSAGE PROCESSOR--IT,XXXXX COMMAND * IT,XXXXX * IT,XXXXX,R,MMM * IT,XXXXX,R,MMM,HR,MN * IT,XXXXX,R,MMM,HR,MN,SC * IT,XXXXX,R,MMM,HR,MN,SC,MS * * R=RESOLUTION CODE * 1= TEN MILLISECOND CODE * 2= SECONDS CODE * 3= MINUTES CODE * 4= HOURS CODE * MM= MULTIPLICATION FACTOR * HR= START HOURS * MN= START MINUTES * SC= START SECONDS * MS= START TENS OF MILLISECONDS * M0600 JSB TTNAM GO FIND ID SEG ADDR SZA PROG MUST BE DORMANT TO CONTINUE JMP M0405 ILLEGAL STATUS ERROR LDA WORK SET ADA D17 UP THE TIME PRAMETER STA TEMPP STARTING ADDRESS. LDB P2 GET THE RESOLUTION ADB DM5 CODE AND TEST SSB,RSS FOR MORE THAN 4. JMP $INER GREATER THAN 4-ILLEGAL CODE LDA P3 GET THE MULT. FACTOR. LDB TEMPP,I GET THE OLD TIME PRAM. BLF,ERB IF IN TIME LIST ALF,ERA SET BIT IN NEW WORD. LDB P2 GET RESOLUTION TO B SZB,RSS IF ZERO RESOLUTION JMP M0605 GO REMOVE FROM TIME LIST LSR 3 SHIFT THE WHOLE MESS TO A M0604 STA TEMPP,I SET NEW RESOLUTION MULT. ISZ TEMPP INCR TO TMS ADDRESS LDA P7 GET TENS OF MS. ADA DM100 SSA,RSS MINUS, IF LEGAL VALUE JMP $INER INPUT ERROR LDA P6 GET SECONDS VALUE ADA DM60 SSA,RSS MINUS, IF LEGAL VALUE JMP $INER INPUT ERROR LDA P5 GET MINUTES. ADA DM60 SSA,RSS YES, SO CONVERT TO DECIMAL JMP $INER INPUT ERROR LDA P4 GET HOURS ADA DM24 SSA,RSS MINUS, IF LEGAL VALUE JMP $INER INPUT ERROR LDA DP4 SET DEFS TO THE PRAMS STA RQP5 ON THE BASE LDA DP5 PAGE FOR STA RQP6 $ETTM LDA DP6 THE SET TIME STA RQP7 SUBROUTINE LDA DP7 IN THE STA RQP8 RTIME MODULE LDB TEMPP GET ID-SEG ADDRESS AND JSB $ETTM GO SET VALUES IN ID-SEG JMP M0150 EXIT $MESS SPC 2 M0605 CCB REMOVE PGM FROM TIME ADB TEMPP LIST JSB $TREM CLA AND CONTINUE JMP M0604 SETTING UP THE ID-SEG SPC 1 DM100 DEC -100 SPC 2 BLIM CLB,CCE,INB CHECK TO SEE IF EXAMINE CPB PARAM ONE PRAM? JMP BLIMP YES GO PRINT LIMITS * LDB P2 GET THE SECOND PRAMETER * * LOWER LIMIT IN (A) UPPER LIMIT IN (B) * SSB,RSS NEGATIVE LIMITS SSA ARE NOT JMP $INER ALLOWED * CMB,INB,SZB GET NEW UPPER LIMIT STB $BLUP IF ZERO SKIP THE STORE CMA,INA SET UP THE LOWER LIMIT STA $BLLO JMP M0150 GO EXIT DONE SPC 1 BLIMP LDA $BLLO GET THE LOWER LIMIT CMA,INA SET POSITIVE JSB $CNV1 CONVERT TO ASCII OCTAL STA BUFF3 SET LOW DIGITS DLD ASCI GET THE HIGH 4 DIGITS DST BUFF1 AND SET IN BUFFER LDA $BLUP GET THE UPPER LIMIT CMA,CCE,INA SET POSITIVE JSB $CNV1 CONVERT STA BUFF7 SET THE LOW DIGITS DLD ASCI GET THE HIGH DIGITS DST BUFF5 SET IN THE BUFFER LDA AASCI GET A DOUBLE BLANK STA BUFF4 SET BETWEEN THE NUMBERS LDA DM14 GET RECORD LENGTH STA BUFFR SET IN THE BUFFER AND JMP M0520 GO SEND THE MESSAGE SPC 1 HED MESSAGE PROCESSOR--PR,XXXXX,ZZ COMMAND * * PR,XXXXX,ZZ PROCESSOR * * THE PRIORITY CHANGE ROUTINE FUNCTIONS AS FOLLOWS: * IF PROGRAM STATUS OTHER THAN DORMANT, STATUS ERROR. * IF DORMANT, THEN PRIORITY VALUE CHANGED AND PROGRAM * LIST UPDATED VIA LINK PROCESSOR. * M0650 JSB TTNAM GO TO FIND ID SEG ADDR LDA P2 GET PRIORITY SSA,RSS SZA,RSS CHECK IF ZERO PRIORITY REQ JMP $INER ERROR-ILLEGAL VALUE LDB WORK ADB D6 STA B,I STORE NEW PRIORITY VALUE STA NPCNG SAVE NEW PRIORITY JSB $LIST RELINK THE PROGRAM OCT 317 BY NEW PRIORITY LDB NPCNG GET NEW PRIO LDA WORK GET ID ADR JSB PRCNG GO RELINK IN ALLOCATED LIST CLA JMP MSEX RETURN NPCNG BSS 1 SPC 5 * MESSAGE PROCESSOR -- TM COMMAND * M0700 LDB DEFP1 PASS PRAM. ADDRESS TO JMP $TMRQ RTIME PROCESSOR SPC 2 * MESSAGE PROCESSOR -- BR,XXXX REQUEST * * SET BREAK BIT IN PROGRAMS ID-SEGMENT * M0725 JSB TTNAM LOOK UP THE PROGRAM M0730 ADB D20 INDEX TO BREAK WORD LDA B,I GET WORD IOR B10K SET BREAK BIT STA B,I RESTORE THE WORD JMP M0150 EXIT HED MESSAGE PROCESSOR--TI COMMAND * * TI COMMAND * * THE REQUEST TO GET CURRENT SYSTEM TIME OUTPUTS CURRENT * YEAR, DAY NUMBER, HOUR, MINUTES, AND SECONDS IN THE * FOLLOWING FORMAT: * YEAR.DAY..HR..MN..SC * WHERE THE .'S ARE BLANKS * M0750 LDA DM20 STA BUFFR SET OUTPUT CHARACTER COUNT LDA DTEMP SET UP TO GET THE TIME STA RQP2 TO TEMP AREA ADA D5 STA RQP3 DLD $TIME JSB $TIMV GO GET TIME JSB $CNV1 CONVERT YEARS STA BUFF2 SET LEAST TWO DIGITS LDA ASCI1 GET THE NEXT TWO DIGITS STA BUFF1 AND SET THEM LDA TEMP4 GET DAYS JSB $CNV1 CONVERT AND STORE DAYS STA BUFF4 SET LEAST TWO DIGITS LDA ASCI1 GET NEXT DIGIT STA BUFF3 SET IN BUFFER LDA AASCI STUFF NECESSARY WORDS WITH STA BUFF5 BLANKS STA BUFF7 STA BUFF9 LDA TEMP3 GET HOURS JSB $CNV1 CONVERT AND STORE HOURS STA BUFF6 LDA TEMP2 JSB $CNV1 CONVERT AND STORE MINUTES STA BUFF8 LDA TEMP1 JSB $CNV1 CONVERT AND STORE SECONDS STA BUF10 JMP M0520 GO SET A AND EXIT SPC 1 DM20 DEC -20 * * DN,N1 OR DN,,N2 * * THE REQUEST TO DOWN AN EQT OR LU WORKS AS FOLLOWS: * IF N1 IS GIVEN, DOWN THE EQT POINTED TO BY N1. * IF N2 IS GIVEN, DOWN THE LU POINTED TO BY N2. * M0800 CCE NO THIRD PARAMETER. JSB P1OR2 SET A=PARAMETER 1, B=PARAMETER 2. JMP $IODN GO TO 'DOWN' ROUTINE. HED MESSAGE PROCESOR--LU,EQ AND TO COMMANDS * * MESSAGE PROCESSOR --LU,N1,N2 COMMAND * * REQUEST OF LOGICAL UNIT ASSIGNMENT (N1 VALUE ONLY) OR * REQUEST LOGICAL UNIT REASSIGNMENT(N1 & N2 - OR * N1, N2 ,& N3 PRESENT) * M0850 CLE SET THE N3 POSSIBLE SWITCH JSB P1OR2 SET UP PARAMETERS JMP $LUPR * * SPC 1 SPC 1 * * MESSAGE PROCESSOR ---- EQ,N1,N2 COMMAND * * * REQUEST EQUIPMENT STATUS (N1 PARAMETER ONLY) * REQUEST EQUIPMENT BUFFERING OR NON BUFFERING (N1 & N2) * N2 = 0 FOR NO BUFFERING * N2 = 1 FOR BUFFERING * M0900 CCE CLEAR N3 POSSIBLE SWITCH JSB P1OR2 SET IT UP JMP $EQST * * D29 DEC 29 D28 DEC 28 DM12 DEC -12 DM6 DEC -6 SPC 1 SPC 1 * MESSAGE PROCESSOR TO,N1,N2 COMMAND * * * REQUEST DEVICE TIME OUT PARAMETERS (N1 ONLY) * REQUEST TO ASSIGN DEVICE TIMEOUT (N1 & N2) * N1 = DEVICE EQT # * N2 = TIME OUT PARAMETER TO BE ASSIGNED * M0990 CCE CLEAR N3 POSSIBLE SWITCH JSB P1OR2 SET IT UP JMP $CHTO * * * * SKP P1OR2 DEF ABM ENTRY/EXIT LDA CP2 CHECK IF JUST SZA,RSS ONE PARAMETER JMP P1OR5 YES - GO EXIT LDA P2 GET SECOND PRAM. SEZ,RSS IS A THIRD PARAMETER POSSIBLE? JMP P1OR7 YES P1OR3 LDB A LOAD B WITH 'N2' OR 'N3:N2' P1OR4 LDA P1 LOAD A WITH N1 JMP P1OR2,I P1OR5 CCB SET B REG TO -1 FOR 1 PARAMETER JMP P1OR4 P1OR7 AND B377 SAVE BITS 7-0 STA P2 OF 'N2' LDA P3 GET 'N3' AND B37 KEEP BITS 4-0 AND LSL 11 MOVE THEM TO POSITIONS 15-11 ADA P2 ADD IN THE 'N2' PRAM JMP P1OR3 GO EXIT * B37 OCT 37 * * INPUT ERROR MESSAGE OUTPUT * * $INER LDA $ERIN INPUT ERROR MESSAGE JMP MSEX RETURN HED MESSAGE PROCESSOR -- AB COMMAND * * MESSAGE PROCESSOR -- AB COMMAND * * THE AB COMMAND ABORTS THE BATCH PROGRAM CURRENTLY * BEING EXECUTED * * IT TRACKS DOWN THE LOWEST LEVEL USING FMGR AS THE * FIRST LEVEL. IF FMGR IS NOT WAITING THEN IT'S BREAK * FLAG IS SET. IF FMGR IS DORMANT THE REQUEST IS ILLEGAL * IF D.RTR IS AT THE END OF THE LIST THEN THE * INVOLKING PROGRAM IS ABORTED OR, IF FMGR, THE BREAK FLAG * IS SET. * M0950 ALR,ALF KILL BIT 3 (NEVER =8) STA P2 SET THE OPTION FLAG LDB IDFMG GET FMGR'S ID-SEG. ADDRESS M0951 STB WORK AND SET UP WORK SZB IF NO FMGR SKIP ADB D15 INDEX TO STATUS LDA B,I GET STATUS AND D15 IF FMGR IS DORMANT SZA,RSS THEN JMP M0405 ILLEGAL STATUS EXIT * LDA B,I GET STATUS ALF,CLE,SLA IF WAITING JMP M0958 GO TRACK DOWN * M0955 LDB IDFMG GET FMGR'S ID-SEG ADDRESS CPB WORK IF SAME AS CURRENT JMP M0730 GO SET BREAK FLAG * JMP M0202 ABORT * M0958 LDB WORK GET CURRENT ID INB STEP TO WAIT PROGRAM LDB B,I GET ADDRESS CPB ID.RT IF D.RTR JMP M0955 GO DO PREVIOUS PGM. * CPB $IDSM IF SMP JMP M0955 GO TO PREV. JMP M0951 AND CONTINUE HED MESSAGE PROCESSOR - LS N1,N2 PROCESSOR * * SET "SOURCE FILE" IDENTIFICATION * * THE OPERATOR REQUEST IS: * "LS,LUN,1ST TRACK # " * THIS STATEMENT SETS THE SOURCE FILE CONTROL WORD * IN THE COMMUNICATION AREA IN THE FOLLOWING * FORMAT( THE WORD IS LABELED "SFCUN" ): * ******************************* * *LU* ST. TRACK #* ZERO * * ******************************* * 15,14 - 7,6 - 0 (BITS) * * THE LOGICAL UNIT # AND STARTING TRACK # ARE * RECORDED BY THE 'EDITOR' WHEN THE SOURCE FILE * IS CREATED. * * VALIDITY CHECKS ARE FOR LOGICAL UNIT = 2 OR 3, * HOWEVER, A LU = 0 WILL SET "SFCUN" = 0. * M0960 CLB IF PARAM 1 = 0, GO TO SZA,RSS JMP M0961 CLEAR "SFCUN" CLE,ERA SET E IF LU 3. CPA D1 IF NOT LU 2 OR THREE CPB CP2 OR P2 NOT SUPPLIED THEN TAKE JMP $INER ERROR EXIT. ERB SET SIGN OF B TO 1 IF LU 3. ADB P2 ADD THE TRACK AND ASL 7 NORMALIZE (I.E. PUT IN 14-07) * M0961 STB SFCUN SET "SFCUN" JMP M0150 GO EXIT * ID.RT NOP ID.ED NOP IDFMG NOP $IDSM JMP GTFMG START UP CODE HED MESSAGE PROCESSOR - LG,N COMMAND * * SET "LOAD-AND-GO" PARAMETERS * * THE OPERATOR STATEMENT IS: * "LG,# OF TRACKS" * * THIS STATEMENT ALLOWS THE OPERATOR TO: * 1. ALLOCATE A NUMBER OF CONTIGUOUS DISC * TRACKS FOR 'LOAD-AND-GO' USAGE. * 2. RELEASE TRACK(S) CURRENTLY ASSIGNED TO LGO. * * THIS REQUEST HAS NO EFFECT IF LGO CURRENTLY IN USE * * THE BASE PAGE COMMUNICATION AREA WORDS DESCRIBED * BELOW CONTAIN THE LGO TRACK ASSIGNMENTS: * * ******************************** * 'LGOTK' *LU* ST. TRACK # * # OF TRACKS * * ******************************** * 15,14---------07,06---------00 * * ******************************** * 'LGOC' *LU* TRACK # * SECTOR # * * ******************************** * 15,14---------07,06---------00 * * LGOTK DEFINES THE LU #, THE STARTING TRACK # * AND THE NUMBER OF CONTIGUOUS TRACKS. THIS * WORD IS ZERO IF NO TRACKS ARE ALLOCATED. * * LGOC DEFINES THE CURRENT AVAILABLE SECTOR. * THIS IS UPDATED BY 'RTIOC' AND RESET TO * THE BEGINNING OF THE AREA BY THE LOADER * AFTER LOADING FROM THE LGO AREA; ALSO BY * THIS ROUTINE WHEN THE TRACKS ARE ALLOCATED. * * M0970 AND B177 MAX. VALUE OF 127. STA P1 -SAVE P- SZA,RSS IF P = 0, GO TO JMP M0971 RELEASE LGO TRACK(S). CLA CHECK FOR CPA LGOTK CURRENT ASSIGNMENT. M0975 CLB,RSS -NONE JMP M0971 -RELEASE CURRENT * LDA P1 (A) = # OF TRACKS JSB $DREQ ALLOCATE TRACKS * SZB,RSS IF P TRACKS NOT JMP M0972 AVAILABLE, GO FOR DIAG. RETURN. * RBR SET SIGN OF B IF LU 3. ASL 16 MOVE THE TRACK UP ASL 7 TO BITS 14-07 OF B. STB LGOC SET LGOC. ADB P1 SET # OF TRACKS IN 06-00 STB LGOTK AND SET LGOTK. * JMP MSEX -RETURN- * M0971 CPA LGOTK JMP MSEX LDB LGOTK GET ASSIGNMENT WORD TO RELEASE. CLE,ELB SET E IF LU = 3 LSR 8 SET FIRST TRACK IN B ALF,ALF PUT # OF RAR TRACKS IN A CMA,SEZ,CLE,INA SET NEGATIVE,SKIP IF LU 2. ADB TATSD ADD SYSTEM DISC SIZE JSB $CREL GO RELEASE IF POSSIBLE SZB RELEASE OK? JMP M1973 NO SEND THE NASTY MESSAGE. STB LGOTK CLEAR 'LOAD-AND-GO' STB LGOC CONTROL WORDS. CPB P1 IF P = 0, JMP M0150 -RETURN- JMP M0975 GO TO ALLOCATE NEW TRACKS. * M0972 LDA $NOLG PRINT: NO LGO SPACE RSS M1973 LDA $LGBS PRINT: LGO IN USE JMP MSEX * HED MESSAGE PROCESSOR SIZE COMMAND * * * THE SIZE COMMAND COMES IN THREE FLAVORS * * 1) SZ,XXXXX PRINTS SIZE INFORMATION ON PROGRAM XXXXX * 2) SZ,XXXXX,P2 FOR NON EMA PROGRAMS, CHANGES MAX LOGICAL * ADDRESS SPACE OF XXXXX TO P2 PAGES. * FOR EMA PROGRAMS P2 BECOMES THE NEW * SIZE OF PROGRAM + EMA SIZE, IE, THE * NEW MINIMUM PARTITION SIZE OF THE PROG. * 3) SZ,XXXXX,P2,P3 THIS FORM IS FOR EMA PROGRAMS ONLY. P2 * IS AS DESCRIBED ABOVE. P3 IS THE NEW * MSEG SIZE. * * * TEMPS: TEMPY = # OF PAGES IN PROG (NO MSEG) + DYNAMIC BUFFER AREA * IF THE PROGRAM IS AN EMA PROGRAM * = NEG LOW MAIN ADDRESS IF PROG NOT EMA * * * SIZE LDA PARAM GET THE PARAMETER COUNT CPA D2 IS IT JUST 2 ? JMP SZRPT YES,SO REPORT THE SIZE INFO * JSB SZCHK NO, SO GO SEE IF MODS OK JSB $SZIT NOW GO GET ALL THE PARAMETERS LDB TEMPB,I *E SZB *E IS IT AN EMA PROG? JMP ESIZX YES * LDB WORK GET THE LOW MAIN ADDRESS ADB D22 LDA B,I STA TEMPI SAVE IT FOR LATER CMA,INA MAKE NEG STA TEMPY AND SAVE ADB D7 NOW CALCULATE THE # OF WORDS IN ADA B,I IN THE PROGRAM CODE ADB DM6 CPA TEMPY PROG SEGMENTED ? ADA B,I NO. ADA B1777 ALLIGN TO PAGE ALF NOW, CONVERT TO # OF PAGES OF CODE. RAL,RAL AND B37 CMA MAKE NEG & ADD IN BASE PAGE ADA P2 NOW ADD NEW SIZE SPECIFIED SSA IS LOWER LIMIT CHECK OK ? JMP SZERR NO, SO ITS A SIZE ERROR * * WE ALREADY HAVE MAX PARTITION SIZE, BUT MIGHT BE GREATER * THAN MAX PROGRAM ADDRESS SPACE. LETS SEE. * LDA TEMPI GET THE LOW MAIN ADDRESS ALF GET PAGE # RAL,RAL ADA DM32 NOW SEE WHICH IS SMALLER LDB A SAVE IT CMB,INB BUT MAKE POSITIVE ADA TEMPA ADD IN LARGEST PARTITION SIZE SSA,RSS OF THE TWO KEEP THE SMALLEST STB TEMPA USE LOGICAL ADDRESS SPACE * * LDB P2 GET THE INPUT SIZE CMB,INB MAKE NEG ADB TEMPA ADD IN MAX SIZE INB SSB OK ? JMP SZERR NO ! SEND SIZE ERROR. * CCB NOW GO ADB P2 GET THE REQUESTED SIZE ESIZW BLF,BLF AND SHIFT UP RBL,RBL LDA TEMPC,I GET THE # OF PAGES WORD AND BPG# OUT GOES THE OLD ADA B IN GOES THE NEW * SSA,RSS IF PART'N ISN'T RESERVED, ZAP PART'N # AND B177K BECAUSE PROG MIGHT NOT RUN THERE ANTMORE STA TEMPC,I SOCK IT AWAY JMP M0150 AND RETURN * * B177K OCT 177700 SPC 2 * EMA PROGRAM CHECK SPC 2 * ESIZX LDA TEMPF GET THE MSEG SIZE CMA,INA SUBTRACT FROM PROG SIZE ADA TEMPI STA TEMPY TEMPY = PROG SIZE (NO MSEG) * LDB CP3 GET THE LAST PARAMETER SZB,RSS ANY SUPPLIED ? JMP ESFX1 NO, SO DON'T CHECK IT OUT CCB NOW CHECK MSEG SIZE ADB P3 SSB,INB MUST NOT BE LESS THAN 1 JMP $INER IT IS, SO FORGET IT * CLA,INA *E ADA TEMPE *E INDEX TO 2ND ID EXT WORD LDA A,I *E AND GET MSEG START PAGE ALF,RAL *E AND B37 *E GET VALUE FROM LOW 5 BITS CMA,INA *E SUBTRACT FROM 32 TO GET ADA D32 A = MAX MSEG SIZE CMB,INB B = - INPUT SIZE ADA B SSA WELL,IS IT OK OR NOT ? JMP SZERR NOT ! FLUSH HIM JMP ESFX3 IS. * ESFX1 LDA TEMPF USE OLD MSEG SIZE AS NEW. STA P3 * ESFX3 LDA CP2 WAS THIS PARAMETER SUPPLIED ? SZA,RSS WELL ? JMP ESFX2 NO LDA TEMPE GET ADDRESS OF ID EXTENSION INA LDA A,I INDEX TO DE BIT WORD ALF,RAL NOW IF THE DE BIT IS CLEAR SSA,RSS THEN CHANGE IS ILLEGAL JMP SZERR SO YOU LOSE ! * LDA P2 GET THE INPUT EMA SIZE SZA IF = 0 SSA OR IF < 0 JMP $INER ITS AN ERROR. * ADA TEMPY ADD # OF PAGES OF PROG (NO MSEG) CMA,INA NOW SEE IF PROGRAM WILL FIT INTO ADA TEMPA PROPER PARTITION SSA WELL ? JMP SZERR NO, YOU LOSE. * LDA TEMPB,I GET THE EMA WORD XOR TEMPG OUT GOES THE OLD ADA P2 IN GOES THE NEW STA TEMPB,I * ESFX2 LDA TEMPE,I GET THE 1ST ID EXTENSION WORD XOR TEMPF OUT GOES THE OLD ADA P3 IN GOES THE NEW IOR SIGN ANS THE NON STANDARD BIT STA TEMPE,I * LDB TEMPY GET THE # OF PAGES IN PROG ADB P3 ADD IN THE NEW MSEG SIZE JMP ESIZW NOW GO PUT IT IN THE ID SEG * D32 DEC 32 SKP * * SZRPT JSB TTNAM GET THE ID INFO ADB D14 GET THE PROGRAM TYPE LDA B,I AND D7 CPA D1 MEMORY RESIDENT ? JMP $INER YES, INPUT ERROR. JSB $SZIT PICK UP THE SIZE WORDS LDB WORK NOW GET THE ID ADDRESS ADB D29 INDEX TO HIGH MAIN OF LARGEST SEG LDA B,I PULL IT IN ADB DM6 NOW INDEX TO HIGH MAIN OF PROG CLE,SZA,RSS IF ZERO THEN NO SEGMENT SO USE LDA B,I PROGRAM SIZE JSB $CNV3 NOW CONVERT TO ASCII (OCTAL) * LDA ASCI GET THE 1ST WORD STA BUFF1 AND PUT IT IN THE BUFFER DLD ASCI1 AND GET THE LAST 2 WORDS DST BUFF2 AND SAVE THEM TOO * * LDA TEMPI GET SIZE OF PROG (+ MSEG IF EMA ) LDB TEMPB,I IS THE PROGRAM EMA ? SZB,RSS JMP LSIZE NO JUST GO LIST SIZE LDB TEMPF YES GET MSEG SIZE CMB,INB AND SUBTRACT IT ADB TEMPG FROM THE EMA SIZE ADA B AND ADD (A = PROG + EMA SIZE) LSIZE CCE,INA ACCOUNT FOR BASE PG & DO DECIMAL CONVERSION JSB $CNV3 DO THE CONVERSION * DLD ASCI1 GET THE LOWER 2 WORDS (MAX = 1024) DST BUFF5 AND SET INTO BUFFER LDA ASCI GET A BLANK STA BUFF4 AND PUT IT OUT AS A DELIMITER STA BUFF7 ON BOTH SIDES STA BUF10 AND FOR THE NEXT ONE STA BUF11 AND FOR THE NEXT ONE * LDA TEMPB,I GET THE EMA WORD AND B1777 KEEP ONLY EMA SIZE LDB DM12 GET A CHAR COUNT CCE,SZA,RSS (DECIMAL CONVERSION) IF NO EMA THEN, JMP SZEXT WE'RE DONE * JSB $CNV3 NOW THEN,CONVERT TO ASCII * DLD ASCI1 GET THE RESULT (MAX = 1024) DST BUFF8 * LDA TEMPF AS LONG AS WE'RE HERE LETS JSB $CNV3 GIVE THEM THE MSEG SIZE TOO. DLD ASCI1 DST BUF12 * * LDB DM26 GET THE CHAR COUNT SZEXT STB BUFFR AND PUT IT IN THE BUFFER LDA BUFAD THE BUFFER ADDRESS TO A JMP MSEX NOW , GO TELL THE FOLKES. * DM26 DEC -26 SKP * THE SZCHK SUBROUTINE IS CALLED BY THE SZ & AS PROCESSORS * IT MAKES SURE THAT THE PROGRAM EXISTS, IS NOT A SEGMENT, * IS DORMANT, IS NOT MEMORY RESIDENT, AND DOES NOT CURRENTLY * OWN ANY PARTITION. * * SZCHK NOP JSB TTNAM GO LOOK FOR THE PROGRAM SZA IF NOT DORMANT, TAKE GAS ! JMP M0405 SEND ILLEGAL STATUS ERROR. * LDB WORK NOW GO SEE WHAT TYPE ADB D14 PROGRAM THIS IS LDA B,I AND D7 KEEP ONLY LOWER 3 BITS CPA D1 IS IT MEMORY RESIDENT ? JMP M0405 THEN SEND ILLEGAL STATUS ERROR * ADB D7 NOW GET TO THE PARTITION WORD LDA B,I PULL IT IN AND KEEP ONLY AND B77 THE PARTITION BITS MPY D7 USE THIS AS AND INDEX INTO ADA $MATA THE $MATA TABLE ADA D2 SO WE CAN SEE WHO OWNS THAT PARTITION LDA A,I PULL IN THE OWNERS ID ADDRESS CPA WORK AND COMPARE IT TO THIS GUY JMP M0405 IF SAME THEN SEND ILLEGAL STATUS ERROR JMP SZCHK,I IF YOU GOT HERE, YOUR A WINNER !!! * * SZERR LDA $SERR JMP MSEX * * $SERR DEF *+1 DEC -10 ASC 5,SIZE ERROR * BPG# OCT 101777 B1777 OCT 1777 * * HED MESSAGE PROCESSOR --- UR COMMAND * * * WHY, YOU ASK YOURSELF, IS THERE A UNRESERVE COMMAND. * IT SEEMS INTUITIVELY OBVIOUS TO THE MOST CASUAL OBSERVER * THAT A RESERVE COMMAND WOULD BE MORE USEFUL. BUT WHAT * HAPPENS TO THE POOR PROGRAM THAT IS SWAPPED OUT, AND THEN * THE ONLY PARTITION HE WILL RUN IN IS RESERVED. WHERE IS * HE TO GO ? REMEMBER ! PARANOIA IS THE WATCH WORD OF * A GOOD OPERATING SYSTEM. * UR, N N = NUMBER OF PARTITION TO BE UNRESERVED * URESV ADA DM1 SUBTRACT 1 FROM PART'N # SSA IF NEG, SEND ILLEGEL PART'N MESSAGE JMP IPRTN CMA MAKE NEG & CHECK AGAINST ADA $MNP MAX # OF PARTITIONS SSA IS IT OK ? JMP IPRTN NO SEND ILLEGAL PARTITION MESSAGE * CCA ADA P1 INDEX INTO MPY D7 PROPER MATA TABLE ENTRY ADA $MATA LDB A,I GET THE LINK WORD SSB IF PARTITION UNDEFINED JMP IPRTN SEND ERROR MESSAGE * ADA D4 NOW GET THE ENTRY LDB A,I STB TEMPX SAVE THE SIZE FOR A LATER CHECK RBL,CLE,ERB STRIP SIGN BIT STB A,I AND PUT IT BACK * INA BUMP TO TYPE WORD LDB A,I GET IT SSB IS IT RT ? JMP URRT YES CHECK SIZE ADA DM2 NOW GO CHECK MOTHER BIT LDB A,I PULL IT IN SSB IS IT SET ? JMP URMT YES * LDB $MBGP GET MAX BG PART'N SIZE MCHEK LDA TEMPX GET PARTITION SIZE AND B1777 KEEP ONLY SIZE CMB AND COMPARE AGAINST THAT TYPE PTN SIZE ADA B NOW IS THE UNRESERVED SSA PARTITION BIGGER THAN LAST OLD PARTITION ? JMP M0150 NO SO WERE FINISHED * JSB $MAXP YES, SO SET UP THE LARGER PARTITION JMP M0150 * * * URRT LDB $MRTP GET CURRENT RT MAX SIZE JMP MCHEK * URMT LDB $MCHN JMP MCHEK * * IPRTN LDA $ILPN JMP MSEX * B777K OCT 77700 * $ILPN DEF *+1 DEC -14 ASC 7,ILLEGAL PART'N * HED MESSAGE PROCESSOR --- AS COMMAND * * AS,XXXXX, Y * * * THE AS COMMAND WILL ASSIGN PROGRAM XXXXX TO PARTITION # Y * XXXXX MUST BE DORMANT AND NOT RESIDENT IN ANY PARTITION. * (IE HE MAY NOT HAVE PREVIOUSLY TERMINATED SERIALLY * REUSABLE. DO AN OF,XXXXX,1 IF HE DID) * ASIGN JSB SZCHK 1ST GO SEE IF CMND LEGAL JSB $SZIT GET THE NEEDED ADDRESSES. LDA P2 GET THE PARTITION CLE,SZA,RSS IF = 0 WE UNASSIGN JMP ASTUF GO UNASSIGN * SSA IF NEG IT'S AN JMP IPRTN ERROR CMA,INA IF GREATER THAT MAX # PART'NS ITS ADA $MNP AN ERROR SSA JMP IPRTN ALSO. * CCA NOW GO LOOK AT THE PARTITION ADA P2 ACCOUNT FOR BASE PAGE STA P2 AND SAVE MPY D7 INDEX TO THE ADA $MATA PROPPER $MATA ENTRY LDB A,I GET THE LENGTH WORD SSB IF ENTRY UNDEFINED ITS AN ERROR JMP IPRTN * ADA D4 NOW INDEX TO THE # PAGES LDA A,I WORD. AND B1777 KEEP ONLY THE PAGES STA TEMPX AND SAVE FOR LATER * LDB TEMPB,I GET THE EMA WORD SZB IS THIS AN EMA PROG ? JMP EMASS YES, SO DO THE EMA THING * GTPGS LDA TEMPI GET THE # OF PAGES WORD CMA,INA MAKE IT NEG ADA TEMPX AND CHECK IT. CCE,SSA IF NEG ITS AN ERROR JMP IPRTN * ASTUF LDA TEMPC,I GET THE SIZE WORD BACK AND B777K THROW AWAY OLD PARTITION IOR P2 PUT IN NEW PARTITION RAL,ERA FIX THE RESERVED BIT STA TEMPC,I AND PUT THE WORD BACK JMP M0150 AND RETURN * * EMASS LDA TEMPE GET THE ID EXTENSION ADDRESS INA LDA A,I GET THE DE BIT WORD ALF,RAL PUT IN SIGN BIT SSA,RSS WAS DEFAULT TAKEN ? JMP EMESS NO. * LDA TEMPB,I GET THE EMA SIZE WORD XOR TEMPG GET RID OF OLD SIZE INA SET DISPATCHER FLAG FOR MAX SIZE STA TEMPB,I CLA,INA,RSS * EMESS LDA TEMPG GET THE EMA SIZE CMA,INA ADA TEMPF REDUCE BY MSEG SIZE EMES1 ADA TEMPX OFSET THE PARTITION SIZE STA TEMPX AND RESET IT JMP GTPGS NOW GET # OF PAGES IN PROGRAM HED MESSAGE PROCESSOR --- QU COMMAND * * QU,XXXXX,YYYYY * * THE QU COMMAND WILL ASSIGN A SYSTEM SLICE VALUE AND/OR * THE PROGRAM PRIORITY LEVEL AT WHICH TIMESLICING BEGINS. * THE STATUS OF THE SYSTEM SLICE AND PRIORITY LEVEL IS * ALWAYS RETURNED UPON COMPLETION OF THIS COMMAND. * * * QUTM LDA PARAM FETCH PARAMETER COUNT CPA D1 IF JUST DISPLAY REQUEST, JMP QURPT GO DO IT * LDA $SVAL FETCH CURRENT SYSTEM QUANTUM LDB CP1 WAS A NEW QUANTUM ENTERED ? CPB D2 IF ASCII, JMP $INER INPUT ERROR * SZB,RSS IF NULL, JMP NOQU DON'T ALTER SYSTEM QUANTUM * LDA P1 FETCH NEW SYSTEM QUANTUM SSA IF NEGATIVE, JMP $INER INPUT ERROR * CLB CONVERT TO DIV D10 10'S OF MILLISECONDS ADB N5 IF REMAINDER SSB,RSS >= 5 INA BUMP TO NEXT TENTH OF MS * * NOTE: (A) MUST NOT BE ALTERED UNTIL PRIORITY IS CHECKED OUT * AND THE SYSTEM QUANTUM IS UPDATED (@QUTM2). * NOQU LDB CP2 SEE IF A PRIORITY WAS ENTERED. CPB D2 IF ASCII, JMP $INER INPUT ERROR * SZB,RSS NULL ? JMP QUTM2 YEP -- CONTINUE * LDB P2 FETCH NEW PRIORITY SSB IF NEGATIVE, JMP $INER INPUT ERROR * CMB,INB SET IT NEGATIVE STB $SPRI AND SAVE IN GLOBAL LOCATION * QUTM2 STA $SVAL SAVE SYSTEM QUANTUM IN GLOBAL LOCATION ALSO * CLA FORCE A STA XEQT NEW DISPATCH ISZ $LIST USING THE NEW TIMESLICE PARAMETERS JMP $XEQ * * * * * * * THIS SECTION FORMATS AND PRINTS THE TIMESLICE PARAMETERS IN * THE FOLLOWING FORMAT: * * Q=XXXXX P=YYYYY * * * QURPT LDA $SVAL FETCH SYSTEM VALUE CCE SET E FOR DECIMAL CONVERSION JSB $CNV3 CONVERT IT TO ASCII INA ADVANCE TO LAST TWO WORDS DLD A,I AND FETCH THEM DST QUB2 SAVE IN BUFFER * * * LDA $SPRI FETCH PRIORITY CMA,INA SET IT POSITIVE JSB $CNV3 AND CONVERT LDB A,I FETCH FIRST 2 CHARS OF RESULT STB QUB6 INA ADVANCE TO LAST 2 WORDS DLD A,I FETCH DST QUB7 THEN SAVE IN PRINT BUFFER LDA DQUBF FETCH BUFFER ADDRESS JMP MSEX * SPC 5 N5 DEC -5 $SPRI DEC -50 BOOT PRIORITY=-50 $SVAL DEC 150 BOOT QUANTUM=1500MS NOTE: STORED AS 10' OF MS DQUBF DEF *+1 DEC -16 QUBUF ASC 8,Q=XXXX0 P=YYYYYY QUB2 EQU QUBUF+1 QUB6 EQU QUBUF+5 QUB7 EQU QUBUF+6 HED MESSAGE PROCESSOR CONSTANTS ETC. LASCI OCT 000040 ASCII BLANK IN LOW CHARACTER MASKU OCT 177400 UPPER CHARACTER MASK (AND) TEMPP NOP TEMPORARY STORAGE KEY NOP TEMPORARY STORAGE * DEFP2 DEF DP2,I DP0 DEF OP DP1 DEF P1 DP2 DEF P2 DP3 DEF P3 DP4 DEF P4 DP5 DEF P5 DP6 DEF P6 DP7 DEF P7 HED CONTROL PARAMETER STORE IN ID SEGMENT * * * THE PLOAD SUBROUTINE IS CALLED BY THE RU, ON, & GO PROCESSORS * IT DECIDES WHETHER THE USER WANTED TO DO STRING PASSING AND/OR * SET UP THE 5 TEMP WORDS IN THE PROGRAMS ID SEGMENT. * * NOTE ! THE STRING TO BE PASSED IS ASSUMED TO BE IN THE SYSTEM * MAP. IF THE REQUEST CAME FROM THE USER MAP, THE $MSG * ROUTINE MOVES THE COMMAND BUFFER INTO A LOCAL BUFFER * IN THE SYSTEM MAP. * * * PLOAD NOP ENTRY/EXIT LDA WSTAT,I IF NO PRAM BIT IS RAL,RAL SET THEN DO NOT PASS CLE,SSA THE SCHEDULING STRING JMP PLOAD,I (SET E=0 FOR ALCST BELOW). LDB PARAM IF NO PARAMETERS, CPB D2 THEN DO NOT PASS JMP PLOD5 THE SCHEDULING STRING. LDB OP+1 CHECK FOR "IH" IN CPB ASCIH COMMAND TO INHIBIT JMP PLOD5 PASSAGE OF STRINGS. * CCA,CLE INDICATE THAT BUFFER IS IN SYSTEM MAP STA MVFLG AND SET A FLAG FOR THE ALCST SUBROUTINE * LDB WORK NO "IH",SO GET ID-SEG ADDRESS JSB ALCST AND GO STORE THE STRING. JMP NOMEM MEMORY ALLOCATION ERROR? JMP NOMEM YES, GO SEND MESSAGE. * PLOD5 LDB DEFP2 GET INDIRECT DEF TO PRAMS. LDA CP2 GET PRAM FLAG RAR,SLA IF ASCII "NO" LDA P2 ENTERED CPA NO THEN STEP PRAM ADDRESS FIRST TIME INB STEP PRAM ADDRESS LDA WORK GET ID-SEGMENT ADRESS JSB PRAM GO SET PRAMS. JMP PLOAD,I RETURN. * NOMEM LDA $NMEM GO ISSUE NO MEMORY JMP $MSEX MESSAGE AND RETURN. * ASCIH ASC 1,IH NO ASC 1,NO SKP * * SUBROUTINE TO SET UP THE PRAMETERS IN A PROGRAMS * ID-SEGMENT. PRAM SETS FIVE PRAMETERS AND THE B * REGISTER. IF THE NO PRAMETER FLAG IS SET NO * ACTION IS TAKEN. * * CALLING SEQUENCE: * * LDB PRAM ADDRESS (OR INDIRECT TO LIST OF ADDRESSES) * LDA ID-SEGMENT ADDRESS * JSB PRAM * * RETURN: * =1 NO PRAMS BIT SET. * =0 NO PRAMS BIT NOT SET. * OTHER REGISTERS MEANINGLESS. * PRAM NOP INA STEP TO THE PRAM AREA STA TEMP SET IN TEMP ADA D9 STEP TO THE B-REGISTER STA TEMP1 ADDRESS AND SAVE ADA D5 STEP TO THE STATUS ADDRESS LDA A,I GET THE STATUS AND CHECK RAL,RAL THE NO PRAM ALLOWED BIT CCE,SSA IF SET THEN (SET E REG) JMP PRAM,I JUST EXIT * LDA TEMP GET THE PRAM AREA ADDRESS AND STA TEMP1,I SET IT IN THE B REG. SAVE AREA LDA DM5 SET UP THE STA TEMP1 COUNTER PRAM1 CLA ZERO ADDRESS GETS A ZERO LDA B,I GET PRAM STA TEMP,I STUFF IT ISZ TEMP STEP STORE ADDRESS CLE,INB STEP SOURCE ADDRESS (CLEAR E REG) ISZ TEMP1 DONE? JMP PRAM1 NO- CONTINUE JMP PRAM,I YES , SO EXIT HED CROSS MAP PARAMETER CONTROL STORE SKP * * SUBROUTINE TO SET UP THE PRAMETERS IN A PROGRAMS * ID-SEGMENT. XPRAM SETS FIVE PRAMETERS AND THE B * REGISTER. IF THE NO PRAMETER FLAG IS SET NO * ACTION IS TAKEN. * NOTE THAT THE PARAMETERS THAT ARE BROUGHT IN ARE * FROM THE USER MAP, THAT IS, THE ALTERNATE MAP. THIS * MEANS THAT THE PARAMETERS TRUE ADDRESS MUST BE IN THE * CURRENT MAP BECAUSE THE CROSS LOAD INSTRUCTION CHASES * DOWN INDIRECTS IN THE CURRENT MAP BEFORE GOING ACROSS * MAPS TO PICK UP THE VALUE. * * CALLING SEQUENCE: * * LDB PRAM ADDRESS (OR INDIRECT TO LIST OF ADDRESSES) * LDA ID-SEGMENT ADDRESS * JSB XPRAM * * RETURN: * =1 NO PRAMS BIT SET. * =0 NO PRAMS BIT NOT SET. * OTHER REGISTERS MEANINGLESS. * XPRAM NOP INA STEP TO THE PRAM AREA STA TEMP SET IN TEMP ADA D9 STEP TO THE B-REGISTER STA TEMP1 ADDRESS AND SAVE ADA D5 STEP TO THE STATUS ADDRESS LDA A,I GET THE STATUS AND CHECK RAL,RAL THE NO PRAM ALLOWED BIT CCE,SSA IF SET THEN (SET E REG) JMP XPRAM,I JUST EXIT * LDA TEMP GET THE PRAM AREA ADDRESS AND STA TEMP1,I SET IT IN THE B REG. SAVE AREA LDA DM5 SET UP THE STA TEMP1 COUNTER XRAM1 CLA ZERO ADDRESS GETS A ZERO XLA B,I GET PRAM STA TEMP,I STUFF IT ISZ TEMP STEP STORE ADDRESS CLE,INB STEP SOURCE ADDRESS (CLEAR E REG) ISZ TEMP1 DONE? JMP XRAM1 NO- CONTINUE JMP XPRAM,I YES-EXIT * HED MESSAGE PROCESSOR NAME SEARCH * * CALL BY NAME SEARCH ROUTINE * * CALLING SEQUENCE: * * JSB TTNAM NAME ASSUMED TO BE IN P1 * * ON RETURN: * * WORK = ID ADDRESS * B = ID ADDRESS IF A PROGRAM, IF SEGMENT B = 5 (IE TYPE) * A = LEAST 4 STATUS BITS * E = 0 STANDARD ID SEGMENT * E = 1 SHORT ID SEGMENT * * TTNAM NOP ENTRY/EXIT LDB DEFP1 ADDRESS OF ASCII PROG NAME JSB TNAME CALL TO NAME SEARCH ROUTINE SZA,RSS IF ZERO, THEN PROG NOT FOUND JMP NXPRG SO TAKE GAS! * LDA WORK SEE WHAT TYPE PROGRAM IS ADA D14 WITHOUT EFFECTING E REG LDA A,I AND D7 CPA D5 IS IT A SEGMENT ? JMP OPOK? YES, SEE WHO WANTS TO KNOW SPC 2 OPOK! LDA WSTAT,I GET STATUS TO A AND D15 MASK IT AND JMP TTNAM,I RETURN SPC 2 OPOK? STA B A SEGMENT SET B = 5, B NOT = ID ADDR. LDA OP GET THE INPUT COMMAND CPA OF OFF COMMAND ? JMP OPOK! YES. CPA ST ST COMMAND ? JMP OPOK! YES. SPC 2 NXPRG LDA $NOPG NO SUCH PROG ERROR (YOU LOSE !) JMP MSEX EXIT HED SEARCH KEYWORD LIST FOR PROGRAM NAME * ON ENTRY * B IS ADDRESS OF ASCII PROGRAM NAME * ON RETURN * A IS 0 IF PROGRAM NOT FOUND (E=1) * B AND WORK ARE THE ID SEGMENT ADDRESS OF REQUESTED PROGRAM * WSTAT = THE STATUS WORD ADDRESS. * E = 0 IF STANDARD ID SEGMENT * E = 1 IF SHORT (9 WORD ) ID SEGMENT OR NOT FOUND * TNAME NOP ENTRY/EXIT STB TEMP3 ADDRESS OF NAME 1 AND 2 INB INCR TO CHAR 3 AND 4 ADDR STB TEMP4 SAVE IT INB INCR TO CHAR 5 ADDR LDA B,I ASCII NAME CHAR 5 AND X AND MASKU MASK OFF X STA TEMP5 SZA IF NULL CHAR. FOURCE ERROR RETURN LDA KEYWD STA KEY TOP OF KEYWORD LIST TN005 LDA KEY,I CHECK IF AT END OF LIST CCE,SZA,RSS JMP TNAME,I END OF LIST ERROR RETURN ADA D12 LDB A,I ID SEG ASCII NAME CHARS 1 AND 2 CPB TEMP3,I COMPARE WITH REQUESTED CHAR 1,2 INA,RSS COMPARES JMP TN030 DOES NOT COMPARE-GO TO NEXT PROG LDB A,I ID SEG ASCII NAME CHARS 3 AND 4 CPB TEMP4,I COMPARE WITH REQUESTED CHARS 3,4 INA,RSS COMPARES JMP TN030 DOES NOT COMPARE-GO TO NEXT PROG STA WSTAT SET UP WSTAT IN CASE LDA A,I ID SEG ASCII NAME CHARS 5,X STA B SAVE FOR SHORT ID TEST AND MASKU MASK OFF X CPA TEMP5 COMPARE CHARACTER 5 JMP TN040 COMPARES-SO PROGRAM FOUND * TN030 ISZ KEY INCREMENT KEYWORD ADDRESS JMP TN005 GO TO COMPARE CHARACTERS TN040 LSR 4 MOVE SHORT ID BIT TO LEAST B ERB SET E FOR RETURN LDB KEY,I LOAD B WITH ID SEGMENT ADDRESS STB WORK SET IN WORK ISZ WSTAT STEP TO STATUS ADDRESS AND JMP TNAME,I EXIT HED CVT3 (BINARY TO ASCII CONVERSION) * * BINARY TO ASCII CONVERSION ROUTINE * * CALLING SEQUENCE * * SET E TO 0 IF OCTAL CONVERSION OR * SET E TO 1 FOR DECIMAL CONVERSION * LDA NUMBER TO BE CONVERTED * JSB $CNV3 * * RETURN ADDRESS OF ASCI IN A AND E=1. * RESULTS IN ASCI, ASCI+1, ASCI+2 * LEADING 0'S SUPPRESSED * $CNV3 NOP STB TEMP6 SAVE B REGISTER LDB PTTE INIT LOCATION OF BUFFER STB TMP LDB AASCI SET BUFFER=ASCII BLANK'S STB ASCI STB ASCI1 STB ASCI2 LDB DF10 ASSUME BASE TEN SEZ,CLE,RSS IF BASE EIGHT INB SET UP FOR BASE EIGHT STB BASE SET CONVERSION BASE ADDRESS DPCRL CLB START CONVERSION DIV BASE DIVIDE BY BASE BASE EQU *-1 DEFINE BASE ADDRESS ADB B20 CONVERT TO ASCII-BLANK SEZ IF HIGH DIGIT BLF,BLF ROTATE ADB TMP,I ADD CURRENT VALUE STB TMP,I STORE THE CONVERTED VALUE CCB,SEZ PREPARE FOR SUBTRACT ADB TMP IF HIGH CHAR. BACKUP SEZ,CME BUFFER POINTER STB TMP AND RESET SZA IF MORE DIGITS JMP DPCRL GO SET THE NEXT ONE * CCE SET E FOR NEXT CALL (ASSUME BASE 10) LDA PTT LOAD A WITH ASCI BUFFER ADDRESS LDB TEMP6 RESTORE B JMP $CNV3,I RETURN * B20 OCT 20 DF10 DEF D10 D10 DEC 10 D8 DEC 8 PTT DEF ASCI PTTE DEF ASCI2 HED $CNV1 (BINARY TO ASCII CONVERSION) * CALLING SEQUENCE: SAME AS $CNV3 * * RETURN RESULTS LEAST TWO DIGITS IN A. * OTHERS AS PER $CNV3 * $CNV1 NOP JSB $CNV3 GO CONVERT THE NUMBER LDA ASCI2 GET LEAST TWO DIGITS JMP $CNV1,I RETURN HED PROGRAM SIZE .VS. PART'N SIZE CHECK * * * THE $SZIT SUBROUTINE IS CALLED BY THE EXEC 9,10,23 & 24 * PROCESSORS AND IS CALLED FOR THE ON, RU, & SZ COMMANDS. * IT IS ALSO CALLED BY THE DISPATCHER IF A PARITY ERROR * HAS OCCURED AT ANY TIME IN THE PAST AND A SEARCH WAS MADE * FOR A PARTITION & NONE OF THE PROPER SIZE WAS FOUND. * THE SUBROUTINE MAKES SURE THAT THE PROGRAM TO BE SCHEDULED * WILL FIND A PARTITION LARGE ENOUGH TO RUN IN. THAT IS * IT MAKES SURE THAT NO PROGRAM IS FOREVER SCHEDULED BUT * BUT NEVER DISPATCHED. THIS CASE WILL OCCUR IF A PROGRAM * IS LOADED, THEN SP 'D , THE SYSTEM THEN REDEFINED, AND THEN * THE PROGRAM RP 'D AND PROGRAM EXECUTION ATTEMPTED. * * * CALLING SEQUENCE JSB $SZIT * ID ADDRESS IN WORK * * ON RETURN A = 0 ALL IS WELL * A = ASCII ERROR CODE ADDRESS. (PROG TOO LARGE) * B = 8 IF PROG ASSIGNED TO A PARTITION * = 9 IF PROGRAM IS NOT ASSIGNED TO ANY PARTITION. * * TEMPS : TEMPA = $MBGP, $MRTP, $MCHN, OR PARTITION SIZE * TEMPB = ADDR OF ID SEG WORD # 29, THE EMA SIZE WORD * TEMPC = ADDR OF ID SEG WORD # 22, SIZE - PARTITION WORD * TEMPD = ERROR COSE 8 OR 9 (AS IN B-REG ABOVE) * TEMPE = ADDRESS OF ID EXTENSION * TEMPF = MSEG SIZE * TEMPG = EMA SIZE * TEMPI = #OF PAGES OF PROG (INCLUDES 1 MSEG) * * * $SZIT NOP LDB WORK GET THE ID ADDRESS ADB D14 INDEX TO THE TYPE WORD LDA B,I PULL IT IN AND D7 KEEP ONLY TYPE BITS CPA D1 IF MEM RES JMP SIZOK THE MAKE SUCCESSFUL RETURN * LDB $MBGP ASSUME PROG IS BG CPA D2 IS IT ? LDB $MRTP NO, BETTER LUCK NEXT TIME. STB TEMPA SAVE THE PROPER SIZE WORD * LDB WORK GET THE ID ADDRESS AGAIN ADB D28 NOW GET TO THE EMA WORD STB TEMPB (SAVE THE ADDRESS TOO ) LDA B,I AND PULL IT IN LDB $MCHN GET THE MAX EMA SIZE SZA IS PROG EMA ? STB TEMPA YES SO SIZE IS EMA * LDB WORK GET THE ID ADRESS AGAIN ADB D21 INDEX TO THE PARTITION WORD STB TEMPC (SAVE THE ADDRESS TOO ) LDA B,I PULL IT IN NOTAS LDB D9 GET THE PROPPER ERROR CODE SSA,RSS IS PROG ASSIGNED ? JMP GOSIZ NO * AND B77 GET THE PARTITION MPY D7 AND USE AS INDEX ADA $MATA INTO THE LDB A,I GET THE 1ST WORD SSB IF UNASSIGNED, JMP UNASN THEN UNASSIGN THE PROGRAM & TRY AGAIN ADA D4 $MATA TABLE LDA A,I GET THE SIZE OF THE AND B1777 PARTITION STA TEMPA AND SAVE LDB D8 GET THE ERROR CODE * * GOSIZ STB TEMPD AND SAVE IT IF WE NEED IT LDA TEMPC,I ALF GET # OF PAGES IN PROG (+ MSEG IF EMA) RAL,RAL AND B37 STA TEMPI SAVE FOR LATER * LDB TEMPB,I GET THE EMA FLAG SZB IS PROGRAM EMA ? JMP EMACK YES SO CHECK IT OUT * CMA,INA NOW SEE IF ADA TEMPA IF IT IS DISPATCHABLE SZBAD LDB TEMPD GET THE ERROR CODE READY * SSA,RSS WELL ? SIZOK CLA,RSS YES ALL IS WELL, SO CLEAR A LDA $SERR NO, SEND ERROR CODE TO CALLER JMP $SZIT,I RETURN * UNASN LDA TEMPC,I GET THE PART'N WORD AND B777K UNASSIGN THE PROGRAM STA TEMPC,I AND JMP NOTAS TRY AGAIN. * TEMPA NOP TEMPB NOP TEMPC NOP TEMPD NOP TEMPE NOP TEMPF NOP TEMPG NOP TEMPI NOP * * EMACK LDA B ALF GET ID EXTENSION TO LOW END RAL,RAL AND B77 NOW USE THIS AS AN INDEX TO THE ADA $IDEX PROG'S ID EXTENSION LDA A,I PULL IT IN STA TEMPE SAVE THE ADDRESS LDA A,I NOW GET THE AND B37 MSEG SIZE STA TEMPF SAVE THIS TOO * LDA TEMPB,I NOW GET THE EMA SIZE FXEMA AND B1777 LDB A PUT IN IN B=REG TOO STB TEMPG AND SAVE AGAIN ADA TEMPI A= [ #PGS + EMA SIZE ] CMA,INA A= -[ #PGS + EMA SIZE ] ADA TEMPA A = $MCHN - [#PGS + EMA SIZE] ADA TEMPF A = $MCHN -[#PGS - MSEG + EMA SIZE ] SPC 1 * A = $MCHN - [#PGS - MSEG + EMA SIZE ] OR SPC 1 SSA,RSS IS IT OK ? JMP SIZOK YES * CPB D1 IF EMA SIZE = 1, THEN IT'S AN JMP SZBAD ERROR * CLB,INB WELL, PAL YOU GET ONE LAST CHANCE ADB TEMPE INDEX TO THE DE BIT IN THE LDB B,I ID EXTENSION BLF,RBL NOW SEE IF THE EMA SIZE WAS DEFAULTED SSB,RSS WELL ? JMP SZBAD NO, SO YOU'RE A LOSER ! * LDB WORK OK, BUT HAS THE PROGRAM EXECUTED ? ADB D8 LDB B,I GET POINT OF SUSPENSION SZB HAS IT EVER EXECUTED ? JMP SZBAD YES, CAN ONLY HAVE BEEN A PARITY ERROR * LDA TEMPB,I GET THE EMA WORD XOR TEMPG OUT GOES THE OLD SIZE INA IN GOES THE DEFAULT (A FLAG TO THE STA TEMPB,I DISPATCHED TO GIVE LARGEST SIZE) JMP FXEMA PLAY IT AGAIN SAM HED OUTPUT *_ ON SYSTEM TELETYPE ******************************************************************* * THE $TYPE SECTION FUNCTIONS AS FOLLOWS: * ENTRY IS MADE BY STRIKING ANY SYSTEM TELETYPE KEY. * IF TELETYPE FLAG NOT BUSY, THEN * IS OUTPUT AND A * REQUEST IS MADE FOR INPUT. IF FLAG IS SET THEN * IGNORE REQUEST. UPON COMPLETION OF INPUT (LF), * THE MESSAGE PROCESSOR ROUTINE IS CALLED. * UPON RETURN, IF A REGISTER IS ZERO THEN NO * MESSAGE TO BE OUTPUT. IF A NON-ZERO, THEN A IS * ADDRESS OF MESSAGE TO OUTPUT WITH CHARACTER * COUNT THE FIRST WORD IN BUFFER. ******************************************************************* * $TYPE LDA FLG CHECK SYSTEM TTY FLAG SZA JMP $XEQ BUSY, SO RETURN TO $XEQ * ******IFN SYSTEM\SESSION CONSOLE WORK LDA $CES+1 CHECK SYS/SES CON FLAG SZA IF ENABLED JMP $SCON GO PROCESS SESSION WORK ******XIF * * STANDARD SYSTEM CONSOLE PROCESSING * JSB $XSIO CALL TO OUTPUT ASTERISK(*) OCT 1 ON SYSTEM TELETYPE NOP NOP OCT 2 DEF ASTRK DM4 DEC -4 OUTPUT CHARACTER COUNT OCT 0 SAYS DON'T NEED USER MAP JSB $XSIO CALL TO REQUEST OPERATOR INPUT OCT 1 DEF TYP10 INPUT COMPLETION ADDRESS NOP OCT 401 INPUT WITH TYPEOUT IBUF DEF INBUF ABS -BUFFL DETERMINED BY $STRT ROUTINE OCT 0 DONT NEED USER MAP ISZ FLG SET SYSTEM TTY BUSY FLAG JMP $XEQ GO TO $XEQ * * SYSTEM SESSION CONSOLE CONTINUES HERE FOR "OP" CMND PROCESSING * TYP10 CLA CLEAR THE COM FLAG STA FLG LDA IBUF GET BUFFER ADDRESS TO A * TYP11 JSB $MESS GO TO MESSAGE PROCESSOR ROUTINE SZA,RSS CHECK IF MESSAGE TO BE OUTPUT JMP TYP27 NO MESSAGE-SO GO RETURN * ISZ FLG SET THE COM FLAG LDB A,I STB TYP26 BRS CONVERT CHARACTER COUNT  CMB,INB TO POSITIVE WORD COUNT. STB TYPCO SAVE WORD COUNT. LDB IBUF GET BUFFER INA ADDRESSES. MVW TYPCO GO MOVE WORDS. * JSB $XSIO CALL TO OUTPUT ERR MESSAGE OCT 1 DEF TYP30 COMPLETION ADDRESS TYPCO NOP OCT 2 DEF INBUF TYP26 NOP OCT 0 DONT NEED USER MAP JMP $XEQ GO TO $XEQ * TYP27 LDA OP GET THE OP CODE CPA RU WAS IT A RUN ? RSS YES CPA ON NO, WAS IT AN ON ? RSS YES JMP TYP30 NO, DO COMPLETION STUFF * LDB WORK GET THE ID ADDRESS ADB D32 GET SESSION WORD # 3 ADDRESS CCA A = -1 (NEG LU # OF SYS CONSOLE) STA B,I SET THE LU IN THE ID SEGMENT TYP30 CLA CLEAR SYSTEM FLAG FOR NEXT STA FLG REQUEST JMP $XEQ ASTRK OCT 006412 CR, LF ASC 1,*_ ASTERISK, LEFT ARROW **** **** 11 WORD LOG-ON PROMPT FIELD **** ** $BRKP DEC -15 COMMON BREAK MODE PROMPT (11 WORDS ALSO) BRKMS ASC 10,S= 1 COMMAND ?_ **** **** ******IFN SYSTEM/SESSION CONSOLE WORK HED SYSTEM/SESSION CONSOLE ROUTINES * * * * * * * LDA $SHED * JSB MAPIN *SET UP CORRECT MAP * $SCON LDA $SHED FETCH HEAD OF SCB LIST SZA,RSS ANYTHING DEFINED ? JMP SLGON NO-- GO ISSUE LOG-ON PROMPT. * ADA $SMST OFFSET TO SESSION ID LDA A,I FETCH IT CPA D1 IF=1 JMP SBREK A SESSION ALREADY EXISTS * * ISSUE LOGON PROMPT * * NOTE: THE DEFAULT LOG-ON PROMPT IS "PLEASE LOG-ON:". THE * ACCTS PROGRAM HAS THE ABILITY OF CHANGING THIS BY * MOVING THE NEW PROMPT STRING INTO THE 11 WOR BUFFER * SLGON LDB !BITM FETCH WORD WITH POSSIBLE RBR,SLB LU 1 BUSY FLAG SET. JMP LPEN IT'S BUSY, GO DO SPECIAL PROMPT * * LDA $LMES SET LOG-ON STA LLEN PROMPT LENGTH * * JSB $XSIO OCT 1 WRITE LOG-ON PROMPT NOP NOP OCT 2 DEF $LMES+1 MESSAGE BUFFER LLEN NOP OCT 0 DON'T NEED USER MAP * * IF IN SHUT DOWN STATE, ISSUE MESSAGE THEN GIVE SPECIAL PROMPT. * LDA $DSCS+1 FETCH SHUT DOWN FLAG SSA IF SHUT DOWN JMP LPEN GO ISSUE SPECIAL PROMPT * * * ISSUE READ OF RESPONSE * * JSB $XSIO OCT 1 DEF SESIN COMPLETION ADDR NOP OCT 401 READ WITH ECHO DEF INBUF+1 FIRST WORD OF BUFF USED AS FLAG ABS -BUFFL+1 OCT 0 DON'T NEED USER MAP ISZ FLG SET SYS CON BUSY JMP $XEQ CONTINUE * * * * * LOG-ON COMPLETION PROCESSOR * * * SESIN STB TLOG SAVE TRANSFER LOG CLA SET LOG-ON FLAG STA INBUF FOR STRING * * * SEND STRING TO COMMUNICATION PROGRAM. THE STRING IS THEN * PASSED TO LOGON OR PRMPT VIA A CLASS WRITE\READ REQUEST. * * * * * * TLOG=BYTE COUNT OF STRING * * INBUF=FLAG(FIRST WORD) AND STRING * FLAG=0 IF LOG-ON REQUEST * =1 IF BREAK MODE REQUEST * * PSTNG LDB DCOM FETCH ADDR JSB TNAME OF NAME OF COMMUNICATION SZA,RSS PROGRAM. FIND IT? JMP NOTIN NO--NOT INITIALIZED ERROR * STB COMID SAVE COMMUNICATION PROG'S ID ADDR LDA IBUF SET UP FOR STRING STA BFADD REQUEST LDB TLOG FETCH BYTE COUNT ADB D2 ADD TWO CHARS FOR FLAG STB BFCNT SET STRING LENGTH * CCA,CLE CLEAR E FOR CALL AND SET BUFFER STA MVFLG IN SYSTEM MAP FLAG LDB COMID FETCH PROG'S ID ADDR JSB ALCST AND GO SET UP STRING NOP JMP MEMER NO MEMORY ERROR * LDB COMID MAKE SURE PROGRAM IS SCHEDULED ADB D15 LDA B,I AND D15 SZA IF NOT DORMANT JMP SETB CONTINUE * LDB COMID ELSE JSB $LIST CALL LIST OCT 401 PROCESSOR TO GET PROGRAM SCHEDULED * SETB LDA D2 SET SESSION BUSY IOR !BITM FLAG IN STA !BITM BIT MAP CLA CLEAR SYS CON BUSY STA FLG FLAG JMP $XEQ CONTINUE * * TLOG NOP "OP" ASC 2,OP, B.SY ASC 9,S=?? COMMAND ?OP,_ * DCOM DEF COMPG COMMUNICATION PROGRAM NAME COMPG ASC 3,$YCOM COMID NOP SPC 5 MEMER LDA $NMEM,I FETCH MESSAGE LENGTH STA ELN.1 SAVE FOR XSIO * JSB $XSIO ISSUE THE NO MEMORY ERROR OCT 1 NOP NOP OCT 2 DEF $NMEM+2 ELN.1 NOP NOP JMP LPEN GO ISSUE SPECIAL PROMPT FOR THIS TYPE OF A MESS * I.E., THE ONLY COMMAND ALLOWED IS THE "OP" COMMAND * * SKP * * * * A SESSION EXISTS FOR LU 1. THIS SECTION PROCESSES THE BREAK * MODE REQUESTS. * * SBREK JSB $XSIO OCT 1 NOP PROMPT NOP FOR BREAK MODE OCT 2 INPUT DEF BRKMS DEC -15 OCT 0 DON'T NEED USER MAP * * JSB $XSIO OCT 1 DEF BRKIN COMPLETION ROUTINE NOP FOR READ OF INPUT OCT 401 DIBF DEF INBUF+1 ABS -BUFFL+1 1ST WORD IS FLAG OCT 0 * ISZ FLG SET SYS CON BUSY FLAG JMP $XEQ CONTINUE * * * BRKIN STB TLOG SAVE TRANSFER LOG LDA DIBF FETCH BUFFER ADDR JSB $PRSE GO DO A PARSE ON INPUT DEF PRAMS CLA,INA SET FLAG FOR STA INBUF BREAK MODE STRING REQUEST * LDA OP FETCH OPERATION CODE CPA "OP" IF OPERATOR REQUEST CLA,RSS SKIP JMP PSTNG NOT OPERATOR REQUEST--SEND COMMAND TO SESSION MONITOR * STA FLG CLEAR TTY BUSY FLAG LDA DIBF FETCH INPUT BUFFER ADDR LDB TLOG AND TRANSFER LENGTH JMP TYP11 GO PROCESS COMMAND * * * SKP * * * * * * THE ACTION IN PROGRESS BIT (BIT MAP !BITM) WAS SET AND ANOTHER * INTERRUPT WAS RECEIVED. THE ONLY COMMAND PERMITTED IN THIS STATE * IS THE "OP" COMMAND. THEREFORE, THE PROMPT ISSUED HERE CONTAINS * THE "OP" TO INFORM THE OPERATOR OF THE STATE. * * * LPEN JSB $XSIO OCT 1 WRITE NOP NOP OCT 2 BUSY STATE PROMPT DEF B.SY DEC -18 OCT 0 * * DLD "OP" SET ASCII "OP, " INTO BUFFER FOR PARSE DST INBUF * * * ISSUE READ OF RESPONSE * JSB $XSIO OCT 1 DEF LP.CM COMPLETION ROUTINE NOP OCT 401 D.BF DEF INBUF+2 ABS -BUFFL+4 OCT 0 ISZ FLG SET SYS CON BUSY JMP $XEQ CONTINUE * * * BUSY STATE COMPLETION PROCESSOR * * * LP.CM ADB D4 ADD LENGTH OF "OP, " JMP TYP10 GO PROCESS THE REQUEST * * * * * * * * * * * * * ENABLE FOR SESSION * * $DSCS= SESSION INITIALIZED FLAG <0=NOT INIT * $CES = SYSTEM SECURITY CODE (SET BY FMGR) * $CES+1= SESSION ENABLED FLAG 0=NOT ENABLED, <0=ENABLED BUT SEC * CODE NOT REQUIRED, >0= ENABLED AND * SECURITY CODE REQUIRED (=$CES). * * FORMAT OF COMMAND= EN,SC,OPTION * * * * * ENAB LDB $DSCS FETCH SESSION INIT FLAG SSB IF NOT INITIALIZED JMP NOTIN GO REPORT IT * LDB DCOM FETCH ADDR OF NAME OF COMM PROGRAM JSB TNAME SEE IF COMMUNICATION PROGRAM IS PRESENT SZA,RSS IF NOT FOUND JMP NOTIN ISSUE INITIALIZATION ERROR * * SEE IF SEC CODE REQUIRED AND IF IT WAS PASSED. * LDA $CES FETCH REQUIRED PASSWORD SZA,RSS IF NOT REQUIRED JMP NOSEC SKIP VERIFICATION * XOR MSKSC REMOVE SECURITY CODE MASK INA AND ADD ONE BACK IN CPA P1 IF REQUIRED, WAS IT CORRECTLY RSS SPECIFIED -- SKIP JMP $INER ELSE ISSUE "INPUT ERROR" * LDB P2 FETCH OPTION WORD SZB,RSS IF SC OPTION NOT SELECTED NOSEC CCA SET NOT REQUIRED FLAG (GLM.2013) STA $CES+1 ELSE SET REQUIRED SC AS FLAG * * CLA,RSS * NOTIN LDA SESER JMP MSEX * * SESER DEF *+1 DEC -15 ASC 8,NOT INITIALIZED * * MSKSC DEC 31178 * * * * * * * * * "OP" COMMAND * * OP,SC,COMMAND * * OPIN LDB BFCNT FETCH CHAR COUNT CMB,INB SET IT NEGATIVE STB BFCNT LDA $CES+1 FETCH ENABLED FLAG SZA,RSS IF NOT ENABLED JMP $INER THIS WAS A BOO BOO * SSA,RSS IF $CES+1 < 0 S.C. NOT REQUIRED CPA P1 REQUIRED, DOES IT MATCH ? RSS CONTINUE JMP $INER BAD INPUT "INPUT ERROR" * LDA DM2 STA TEMP1 TEMP1 * LDB BFADD FETCH BYTE ADDR OF PRE-PARSE INPUT BUFFER CLE,ELB NBYTE LBT CPA B54 COMMA JMP C.1 NBYT2 ISZ BFCNT JMP NBYTE LDA $OPER ISSUE JMP MSEX "OP CODE ERROR" * * B54 OCT 54 * C.1 ISZ TEMP1 JMP NBYT2 * SLB,RSS IF COMMAND STARTS ON JMP EVEN WORD BOUNDARY - CONTINUE * ADB DM1 BACK UP TO COMMA ADDR LDA B40 ASCII BLANK SBT * EVEN SLB,RSS IF STARTS ON WORD BOUNDRY ISZ BFCNT SUBTRACT 1 FOR LAST COMMA FOUND * CLE,ERB SET WORD ADDR LDA B MOVE WORD ADDRESS TO (A) LDB BFCNT B=CHAR COUNT CMB,INB SET IT POSITIVE STB BFCNT RESTORE CHARACTER COUNT STA BFADD RESTORE BUFFER ADDRESS JMP NMESS GO PARSE INPUT STRING & DO REAL COMMAND * * NOTE (A) AND (B) MUST BE SET-UP FOR NMESS WORK * ******XIF HED $ABRT ROUTINE TO ABORT A PROGRAM * ROUTINE: < $ABRT > * * PURPOSE: THIS ROUTINE PROVIDES FOR REMOVING * A USER PROGRAM FROM EXECUTION USUALLY * AFTER AN ERROR CONDITION IS DETECTED * WHICH PROHIBITS CONTINUED EXECUTION. * THE PROGRAM IS SET TO THE DORMANT * STATE, TIME INTERVAL REMOVED AND ANY * DISC TRACKS ASSIGNED TO THE PROGRAM * RELEASED. * * THE PROGRAM NAME IS SET IN THE MESSAGE * "XXXXX ABORTED" WHICH IS PRINTED * ON THE SYSTEM TELETYPE AND THE SESSION TERMINAL * (UNLESS THE NO PRINT OPTION WAS SPECIFIED). * * CALL: (A) = ID SEGMENT ADDRESS * (P) JSB ABORT * (P+1) -RETURN- (REGISTERS MEANINGLESS) * $ABRT NOP SET ID SEGMENT ADDRESS STA TEMPH FOR SABRT CALL ADA D15 INDEX TO THE STATUS WORD LDB A,I GET THE WORD ADB B4000 SET THE ABORT BIT STB A,I RESET THE STATUS WORD LDB TEMPH SET B AND CALL JSB SABRT THE SOFT ABORT ROUTINE LDA TEMPH GET THE ADDRESS AND JSB $SDRL GO RELEASE THE DISC TRACKS LDA NOPRN GET NO PRINT OPTION FLAG SZA,RSS SET? JMP PRNT NO, PRINT MESSAGE * CLA CLEAR THE FLAG STA NOPRN JMP $ABRT,I EXIT * PRNT LDB TEMPH SET (B) = ADDRESS OF 3-WORD ADB D12 PROGRAM NAME IN ID SEGMENT. LDA B,I SET STA ABM PROGRAM INB NAME LDA B,I IN STA ABM+1 MESSAGE INB LDA B,I AND MASKU MASK OUT THE LOWER CHARACTER IOR LASCI REPLACE WITH A BLANK STA ABM+2 * LDB TEMPH FETCH PROG'S ID ADDR JSB $LU?? GET SESSION/MTM TERM LU CCE,RSS DIDN'T FIND A GOOD LU--PRINT ON LU 1 ONLY CMA,CLE,INA SET E IF LU=1 (LU-1) LDA ABMA FETCH BUFFER ADDRESS LDB TEMPH FETCH ID ADDR FOR POSSIBLE ECHO WORK SEZ,RSS IF TERM LU NOT = 1 JSB $BFOT GO ECHO ON SESSION TERMINAL JSB $YMG ISSUE "XXXXX ABORTED" ON LU 1 JMP $ABRT,I EXIT * * ABMA DEF *+1 DM14 DEC -14 ABM ASC 7,PROGX ABORTED AASCI ASC 1, HED MEMORY PROTECT VIOLATION SCHEDULER PREPROCESSORS ******************************************************************* * THE $MPT1 THRU $MPT9 PREPROCESSORS CONSIST OF MEMORY * PROTECT VIOLATION CALLS FROM EXEC THAT INVOLVE LIST * PROCESSING. * THE FOLLOWING REQUESTS ARE HANDLED: * PROGRAM COMPLETION (DORMANT) * SUSPEND (OPERATOR) * BACKGROUND SEGMENT LOAD * SCHEDULE WITH WAIT * SCHEDULE WITHOUT WAIT * CURRENT SYSTEM TIME (TIME ROUTINE CALL) * SET ID SEGMENT TIME VALUES (TIMER ROUTINE CALL) * SET/CLEAR ALL-OR-MEMORY AND CORE-LOCK FLAGS * GET/PUT A COMMAND STRING ******************************************************************* SPC 3 * * DORMANT REQUEST - PROGRAM HAS RUN TO COMPLETION * $MPT1 JSB GETID GET THE ID-SEGMENT ADDRESS OF AFFECTED STB P2 PROGRAM - SAVE THE ID ADDRESS FOR PRAM MOVE CPB XEQT IF CURRENT PGM. SKIP JMP MPT1A FATHER CHECKS * ADB D20 STEP TO FATHER POINTER ADDRESS CCA GET ADA B,I TO A AND B377 AND MASK ADA KEYWD ADDRESS OF ID OF FATHER IN A LDA A,I NOW CPA XEQT CURRENT PROGRAM? RSS YES SKIP JMP ESC04 NO GO FLUSH * MPT1A LDB P2 RESTORE THE ID-SEGMENT ADDRESS TO B LDA RQRTN UPDATE THE RETURN STA XSUSP,I ADDRESS CLA SET A TO ZERO IN CASE XLA RQP3,I PRAMETER NOT SUPPLIED $EX6 NOP SZA FOR RTE-M4, TERM.REUSABLE (GLM.2013) CMA,SZA,RSS IS THIS GUY SERIALLY REUSABLE JMP MPT1E YES, GO DO IT INA,SZA,RSS JMP MPT1B STANDARD TERMINATION CALL. * INA,SZA,RSS IS IT JMP MPT1C A SAVE RESOURCES TERMINATION * INA,SZA,RSS MAY BE A SOFT ABORT JMP M0240 YES GO TO ABORT ROUTINE * INA,SZA,RSS HARD ABORT (LAST CHANCE) JMP M0250 WOW THAT WAS CLOSE! * ESC02 LDB D2 YOU LOSE - UNRECOGNIZED PRAMETER. JMP ESCXX GO ABORT HIM * MPT1C LDA WORK GET ID ADR JSB ALDM GO PUT IN DORMANT LIST & SET FLG LDB WORK RESTORE B LDA WSTAT,I SET THE IOR B200 RESOURCE BIT IN THE STATUS STA WSTAT,I AND THEN CPB XEQT IF CURRENT PROGRAM JMP MPT1D SKIP DORMANT REQUEST JSB $LIST OCT 400 JMP $XEQ GO TO DISPATCHER * MPT1E CPB XEQT TERM SON AS REUSABLE RSS JMP MPT1B GO DO NORMAL TERMINATE JSB TERM CALL TERMINATE ROUTINE ISZ TMP,I IF OK, SET FLAG FOR SERIAL REUSE LDA IDCKK JSB ALDM GO PUT IN DORMANT LIST & SET FLAG JMP MPT1F GO FINISH PROCESSING * MPT1D JSB $WATR FIND WAITERS LDB XEQT MPT1B JSB TERM CALL TERMINATION ROUTINE MPT1F ISZ TMP,I FINALLY, ALSO SET A FLAG (BIT 1) ISZ TMP,I IN WORD 20 TO INDICATE NORMAL_TERM. LDA DM3 IF REQUEST PRAMS ADA RQCNT THEN SSA SKIP JMP $XEQ ELSE GO TO THE DISPATCHER. * LDB DEFR4 GET DEF TO PRAMS LDA P2 GET ID-ADDRESS JSB XPRAM TRANSFER THE PRAMETERS JMP $XEQ GO TO THE DISPATCHER SPC 1 DM3 DEC -3 SKP * THE TERM SUBROUTINE PERFORMS THE FOLLOWING FUNCTIONS: * * 1. CALL $LIST TO PUT THE PROGRAM IN THE DORMANT LIST * 2. IF THE PROGRAM HAS A FATHER WHO IS WAITING THE * FATHER IS RESCHEDULED * 3. CHECKS TO SEE IF ANOTHER PROGRAM IS WAITING FOR THIS ONE * AND SCHEDULES IT IF SO. * * CALLING SEQUENCE: * * LDB ID ADDRESS * JSB TREM * * ON RETURN THE FATHER POINTER (IF ANY) IS IN POP. * AND IF HE WAS WAITING E WILL BE SET ELSE E=0. * TERM DEF D.RTR JSB $LIST PUT PGM. IN DORMANT OCT 400 LIST * STB IDCKK SAVE THE ID-ADDRESS ADB D20 INDEX TO THE PA POINTER LDA B,I GET THE WORD STB TMP SAVE THE ADDRESS RAL,ELA SET E IF FATHER IS WAITING CCB,SEZ,CME,RSS E=0 IF FATHER/1 IF NO FATHER JMP TERM2 IF NO FATHER GO SET -1. ADB KEYWD KEYWD-1 TO B (SETS E) RAR,CLE,RAR RESTORE A AND SET E TO FATHER WAITING. AND B377 GET THE FATHER ID NUMBER ADB A ID ADDRSS TO B LDB B,I GET THE ID-SEG ADDRESS TERM2 STB POP SAVE THE ADDRESS ADB D15 REMOVE THE POP'S WAIT BIT LDA B,I GET POP'S STATUS AND B7777 KNOCK OUT THE WAIT BIT SEZ,RSS IF WAITING STA B,I RESTORE THE WORD AND D15 IF POP'S CPA D3 IN THE WAIT LIST SEZ AND WAITING JMP TERM3 JSB $LIST THEN RESCHEDULE OCT 101 THE FATHER POP DEF POP * TERM3 LDA TMP,I GET THE FLAG WORD AND B7400 AND KEEP ONLY RE,RM,RN FLAGS STA TMP,I IN WORD JMP TERM,I RETURN * * D20 DEC 20 SIGN OCT 100000 B200 OCT 200 B7400 OCT 7400 DEFR4 DEF RQP4,I SPC 2 $WATR NOP LDA B ADB D20 LDB B,I BLF,BLF RBR,SLB JSB $SCD3 SCHEDULE IF ANY WAITING JMP $WATR,I RETURN * SPC 2 * * PROGRAM SUSPEND REQUEST * $MPT2 LDA XEQT GET ADDR OF ID SEG ADA D20 LDA A,I GET FATHER POINTER CLB SSA IF BATCH FLAG IS SET JMP ESCXX ABORT SC00 LDA XEQT GET CURRENT ID ADR JSB ALDM GO PUT IN DORMANT LST & SET DM FLAG JSB $LIST OCT 506 OPERATOR SUSPEND REQUEST JMP MEM15 GO UPDATE XSUSP SPC 3 * * READ IN BACKGROUND PROGRAM SEGMENT * $MPT3 CCA CHECK PARAMETER COUNT ADA RQCNT SSA JMP ESC01 ERROR, SO RETURN LDB RQP2 ADDR OF ASCII PROG SEGMENT JSB PLNAM PULL IT IN LOCALLY JSB TNAME GO FIND THE ID SEG. SZA,RSS IF NOT FOUND JMP ESC05 TAKE GAS! ADB D7 STEP TO PRIMARY ENT PT. SEZ IF SHORT ID-SEG. STEP ADB D4 TO THE SHORT ID-SEG PRI ENT PT. ADD LDA B,I FETCH AND STA $WATR SET AS RETURN ADDRESS ADB D7 STEP TO TYPE ADDRESS LDA B,I BET TYPE AND D7 MASK IT SEZ,RSS IF SHORT IT MUST BE A SEG. CPA D5 SEGMENT?? CCE,RSS YES SKIP. JMP ESC03 NO TAKE GAS! LDA $WATR SET UP RETURN ADDRESS STA RQRTN LDB WORK GET THE ID-SEG ADDRESS STB XA,I JSB $BRED GO SET UP TO LOAD CCB SET THE ALL OF CORE ADB WSTAT BIT LDA B,I FOR THE IOR LASCI DISPATCHER STA B,I JSB PRAMO PASS PRAMETERS IF ANY JMP MEM15 ADVANCE THE RETURN ADDRESS AND EXIT SPC 3 * PRAMO PASSES PRAMETERS FROM RQP3,4,5,6,AND 7 TO * THE ID-SEGMENT POINTED TO BY WORK. * * CALLING SEQUENCE: * * SET UP WORK * JSB PRAMO * * ID-SEGMENT MUST NOT HAVE NO PRAM BITS SET IN IT'S STATUS. * PRAMO NOP CLB,INB IF NO PRAMS CPB RQCNT THEN JMP PRAMO,I JUST EXIT * LDA WORK SET ADDRESS IN A LDB DEFR3 PRAM ADDRESS IN B AND JSB XPRAM GO MOVE THE PRAMS. JMP PRAMO,I RETURN. SKP * * $SCD3 SCHEDULES PROGRAMS IN THE WAIT LIST (STATUS-3) * WHICH ARE WAITING FOR THE GIVEN RESOURCE. * * CALLING SEQUENCE: * * LDA RESOURCE FLAG (CONTENTS OF XTEMP OF WAITER) * JSB $SCD3 * RETURN - B,E = 0 A = ? * * * ENTRY MADE BY $SCD3 NOP * RSB * SJP $SCD * * * $SCD RBL,RBL STB TEMPD STA $IDNO SAVE THE RESOURCE ID FLAG LDB SUSP2 GET THE LIST HEAD SCD31 CLE,SZB IF END OF LIST JMP SCDMR JRS TEMPD $SCD3,I RETURN * SCDMR LDA B GET THIS ENTRIES INA FLAG FROM LDA A,I HIS ID-SEGMENT CPA $IDNO THIS ONE?? JMP SCD32 YES GO RESCHEDULE * LDB B,I NO GET NEXT ENTRY TO B JMP SCD31 AND GO TEST IT. * SCD32 LDA B,I GET THE NEXT ID IN LIST STA PRAMO AND SAVE IT JSB $LIST SCHEDULE THE PROGRAM OCT 401 WHOES ID-SGEMENT ADDRESS IS IN B LDB PRAMO GET NEXT ID TO B JMP SCD31 SCAN THE REST OF THE LIST * SKP * SCHEDULE REQUEST WITH WAIT * $MPT4 JSB IDCKK CHECK IF PROGRAM DORMANT CLE CLEAR E FOR SCHOK ROUTINE * * NOTE: "WORK" MUST = ID ADDR OF TARGET PROGRAM * JSB SCHOK GO CHECK TIME LIST RESTRICTIONS OF TARGET PROGRAM JSB PASES GO PASS SESSION WORD OF FATHER TO SON LDB XEQT GET THE ADDRESS ADB D20 OF THE BATCH FLAG LDA $IDNO,I FETCH SON'S FATHER WORD XOR B,I AND SET IT AND C120K INTO THE XOR B,I THE NEW PROGRAM IOR B40K SET THE FATHER IS WAITING BIT STA $IDNO,I SET THE WORD IN THE SON'S ID. JSB $LIST PUT CURRENT PGM IN OCT 503 THE WAIT LIST LDB XEQT ADB D15 LDA B,I IOR B10K SET STATUS WAIT REQUEST BIT STA B,I INTO CURRENT EXEC PROGRAM JMP MEM15 * * SCHEDULE REQUEST WITHOUT WAIT * $MPT5 JSB IDCKK CHECK IF PROGRAM DORMANT CLE CLEAR E FOR SCHOK * * NOTE: "WORK" MUST = ID ADDR OF TARGET PROGRAM * JSB SCHOK GO CHECK TIME LIST RESTRICTIONS OF TARGET PROGRAM JSB PASES GO PASS SESSION WORD FROM FATHER TO SON * MEM15 LDA RQRTN SET UP SUSPENSION STA XSUSP,I POINT JMP $XEQ * ESC01 CLB,INB,RSS ILLEGAL PARAMETER COUNT ESC03 LDB D3 RSS ESC04 LDB D4 RSS ESC05 LDB D5 NO SUCH PROGRAM ERROR CODE. RSS ESC07 LDB D7 RSS ESC10 LDB B400 (SC10) NO MEM EVER FOR STRING PASSAGE. RSS ESC11 LDB B401 (SC11) REQUESTED PROGRAM IN TIME LIST FOR DIFF SESSION ESCXX LDA ASY OUTPUT SC ERROR CODE JMP $ERAB CALL SYSTEM ERROR MESSAGE ROUTINE $SCXX EQU ESCXX * B40K OCT 40000 B400 OCT 400 B401 OCT 401 C120K OCT 57777 SKP * * SCHOK CHECKS THE TARGET PROGRAM TO SEE IF IT MAY BE SCHEDULED * OR HAVE IT'S TIME VALUES CHANGED BY THE CURRENTLY EXECUTING * PROGRAM. * * IF THE TARGET IS IN THE TIME LIST, ONLY PROGRAMS OF THE SAME * SESSION MAY ACCESS IT. THIS IS BECAUSE THE PROGRAM MAY DEPEND * ON OPERATING WITHIN THE ENVIRONMENT DEFINED BY IT'S SESSION. IF * ANOTHER SESSION WERE TO RUN THIS PROGRAM, THE ORIGIONAL SESSION * WORD WOULD BE REPLACED BY THE NEW SESSION'S SCB ADDR. * * ANY REQUEST TO DEFINE THE TIME VALUES OF A PROGRAM (EXEC 12) IS * ALSO RESTRICTED TO WORK ONLY WITH PROGRAMS OF THE SAME SESSION. * * SPC 3 * CALLING SEQUENCE: XEQT=ID ADDR OF REQUESTING PROGRAM * WORK=ID ADDR OF TARGET PROGRAM * E=1 IF EXEC 12 REQUEST * ELSE E=0 * * JSB SCHOK * * RETURN : ALL REGISTERS MODIFIED * * * * SCHOK NOP LDB WORK FETCH ID ADDR OF TARGET PROG ADB D17 ADVANCE TO TIME LIST WORD LDA B,I ALF,SLA IF IN THE TIME LIST JMP CKSSN GO DO MORE CHECKS * SEZ,RSS NOT IN TIME LIST SO RETURN IF JMP SCHOK,I CALL IS NOT FOR EXEC 12 REQUEST * CKSSN ADB D15 ADVANCE TO SESSION WORD OF TARGET LDA B,I SZA IF PROGRAM NOT UNDER SSA SESSION CONTROL JMP SCHOK,I LET THE REQUEST GO THROUGH * LDB XEQT FETCH ADB D32 SESSION WORD CPA B,I IF MATCH WITH TARGET PROGRAM JMP SCHOK,I LET IT CONTINUE * JMP ESC11 REJECT WITH SC11 ERROR * * SPC 5 * * * PASES WILL PASS THE SESSION WORD FROM FATHER TO SON * "WORK" MUST BE SET UP TO POINT AT THE SON PROGRAM * * PASES NOP LDB XEQT FETCH ADB D32 FATHER'S LDB B,I SESSION WORD LDA WORK FETCH ADA D32 ADDR OF SON'S SESSION WORD STB A,I PLACE FATHER'S SESSION WORD INTO SON'S ID JMP PASES,I * SKP * * CALL TO GET SYSTEM REAL TIME * $MPT6 LDA RQP2 SAVE THE BUFFER STA TEMP1 ADDRESSES LDA RQP3 STA TEMP2 * LDA DPNAM GET THE ADDRESS OF OUR LOCAL BUFFER STA RQP2 AND USE IT ADA D5 INSTEAD STA RQP3 * DLD $TIME GET THE TIME JSB $TIMV AND CONVERT IT * LDA D5 GET THE # OF CAX TO X LDA DPNAM THE SOURCE LDB TEMP1 THE DESTINATION MWI GIVE THE DATA TO THE USER * LDA DPNAM+6 GET THE YEAR XSA TEMP2,I GIVE TO USER(IF TEMP2 = 0 ITS A NOP) JMP MEM15 GO TO STORE RETURN ADDRESS * * GETID IS A SUBROUTINE TO GET THE ID-SEGMENT ADDRESS * FROM PRAMETER NUMBER TWO WHERE THE USER MAY * SUPPLY ZERO (HIS ID) OR NOTHING (HIS ID) OR * AN ASCII NAME. * * CALLING SEQUENCE: * * JSB GETID * RETURN B= THE ID-SEGMENT ADDRESS. * IF NOT FOUND THEN ERROR "SC05"IS GENERATED * E=0 * A=0 ON ALL RETURNS * WORK = THE ID-ADDRESS * WSTAT = THE ID-STATUS ADDRESS * GETID NOP CLA IF NOT SUPPLIED PRESET TO ZERO LDB XEQT AND CURRENT PGM ADB D12 SET B TO POINT TO CURRENT NAME XLA RQP2,I GET THE PRAMETER SZA,RSS ANY SUPPLIED ? JMP GTID# NO LDB RQP2 GET ADDRESS OF NAME JSB PLNAM PULL IT IN LOCALLY GTID# JSB TNAME GO SEARCH FOR IT CLA,SEZ IF FOUND SKIP JMP ESC05 ELSE FLUSH HIM OUT OF THE SYSTEM * JMP GETID,I RETURN SPC 2 * $IDNO COMPUTES THE ID-SEGMENT NUMBER OF A PROGRAM * * CALLING SEQUENCE * LDB ID-SEGMENT ADDRESS * JSB $IDNO * RETURN ID NUMBER IN B * $ID# RAL,RAL STA TEMPD STB GETID SAVE THE REQUESTED ID-ADDRESS LDB KEYWD IDNO LDA B,I GET KEYWORD BLOCK ENTRY INB STEP FOR NEXT ONE CPA GETID THIS IT? CMB,INB,RSS YES NEGATE AND SKIP JMP IDNO NO CONTINUE LOOP * ADB KEYWD NEGATIVE OF NUMBER TO B CMB,INB SET POSITIVE AND JRS TEMPD $IDNO,I RETURN * SKP * * CALL TO SET ID SEGMENT TIME VALUES * $MPT7 LDA DM7 CHECK PARAM COUNT FOR 4 OR 7 ADA RQCNT SZA,RSS IF SEVEN THEN JMP MPT7A CONTINUE, ELSE ADA D3 CHECK FOR 4 SZA JMP ESC01 YOU LOSE, WRONG # OF PRAMS XLA RQP5,I NO CHECK PRAM 5 SZA,RSS IF = 0 JMP ESC02 YOU LOSE * MPT7A XLA RQP3,I IF RESOLUTION CODE LDB D6 SZA ZERO OR ADA DM5 GREATER THAN 4 SSA,RSS THEN JMP ESCXX ABORT * JSB GETID GO GET SET UP ID-SEG POINTERS ("WORK") * CCE SET (E) FOR SCHOK JSB SCHOK GO CHECK TIME LIST RESTRICTIONS JSB PASES GO PASS SESSION WORD FROM FATHER TO SON LDB WORK FETCH ID ADDR LDA RQRTN PUT RETURN STA XSUSP,I ADDRESS IN THE ID SEG. JMP $TIMR GO CONTINUE REQUEST IN TIME ROUTINE * DM7 DEC -7 * SKP * * THE IDCKK SUBROUTINE CHECKS THE STATUS OF POTENTIAL * SON PROGRAMS & DETERMINES WHETHER TO HONOR THE FATHER- * SON SCHEDULE REQUEST. * * * SPC 1 * CHECK IF PROGRAM DORMANT AND THEN SCHEDULE IDCKK NOP LDB RQP2 GET PROG NAME ADDRESS JSB PLNAM PULL IT IN LOCALLY JSB TNAME NOW SEE IF THE PROGRAM EXISTS SEZ JMP ESC05 NO SUCH PROGRAM ERROR ADB D14 MAKE SURE IT IS NOT LDA B,I A SEGMENT AND D7 CPA D5 IF SEGMENT JMP ESC03 TAKE GAS! JSB $SZIT SEE IF IT WILL FIT SZA WELL ? JMP ESCXX NO,SO TAKE GAS ! * LDB XEQT COMPUTE THE ID NUMBER JSB $IDNO AND STB GETID SAVE IT LDA WORK ALSO COMPUTE THE ADA D20 FATHER POINTER WORD ADDRESS STA $IDNO AND SAVE IT LDA WSTAT,I CHECK PROGRAM STATUS FOR DORMANT AND S&NP KEEP JUST THE IMPORTANT BITS STA XA,I RETURN PROG STATUS IN A REG SZA DORMANT? JMP IDCK2 NO - CHECK FURTHER * XLB RQP9,I (A MUST=0)CHECK IF THE OPTIONAL SZB,RSS PARAMETER STRING IS INCLUDED. JMP IDCK4 IF NOT,SKIP STRING STORAGE. JSB $CVWD CONVERT BUFFER LENGTH TO STB BFCNT POSITIVE CHARS AND SAVE. LDA RQP8 SET UP BUFFER ADDRESS. STA BFADD CLE LDB WORK GET ID-SEGMENT ADDRESS JSB ALCST AND STORE PARM.STRING. JMP ESC10 ABORT PROGRAM(SC10)IF NO MEM EVER. JMP NMNOW SUSPEND FATHER IF NO MEM NOW. * IDCK4 JSB PRAMO PASS THE PARAMETERS,IF ANY,TO IDCK5 JSB $LIST THE ID-SEG.AND THEN SCHEDULE. OCT 301 STA XA,I SHOW THAT IT WAS DONE STB XTEMP,I SON'S ID ADDR TO FATHER'S 1ST TEMP WORD LDA $IDNO,I (MIGHT BE EXEC 9). GET THE CURRENT FLAG BITS AND C377 MASK OUT ANY OLD FATHER NUMBER. IOR GETID ADD THE FATHER NUMBER STA $IDNO,I AND RESET IT. JMP IDCKK,I RETURN SPC 1 IDCK2 RAL,ALR IF JUST THE NO PRAMS CMA,CLE,INA SET E LDA $IDNO,I CHECK TO SEE AND B377 IF THIS GUY IS THE FATHER CPA B IF NOT RSS THEN JMP MPT15 GO TEST FOR QUEING * SEZ IF JUST "NP" BIT THEN JMP IDCK5 GO SCHEDULE HIM * LDA WSTAT,I IF "R" AND "D" BITS BOTH SET AND B300 THEN JUST CPA B300 CLEAR THEM ELSE CLB,RSS JMP MPT15 GO CHECK FOR QUEUEING * XOR WSTAT,I CLEAR THE "R" AND "D" BITS STA WSTAT,I AND RESET IN SON'S ID STB XA,I INDICATE SUCESS. JMP MEM15 AND EXIT. * DM8 DEC -8 C377 OCT 177400 SKP * *SCHEDULE WITH WAIT WITH WAIT REQUEST * * IF REQUESTED PROGRAM IS NOT DORMANT THE REQUESTER IS * SUSPENDED UNTIL IT IS. * MPT15 LDA RQP1 HERE AFTER FINDING REQUESTED PGM BUSY CPA D9 IF NO WAIT RSS THEN JUST DO CPA D10 THE OLD JMP MEM15 THING * LDB WORK ELSE SET THE SUSPEND REASON STB XTEMP,I IN REQUESTERS ID-SEGMENT LDA $IDNO,I TO INDICATE IOR B1000 WE WERE HERE STA $IDNO,I JSB $LIST PUT REQUESTER IN WAIT LIST OCT 503 JMP $XEQ GO TRY SOMEBODY ELSE. SPC 2 ASY ASC 1,SC ASCII -SC- FOR SCHED ERROR DEFR3 DEF RQP3,I B10K OCT 10000 S&NP OCT 20017 STATUS PLUS NO PRAMS BIT MASK B300 OCT 300 SKP * * $MPT8 SET/CLEAR ALL OF MEMORY AND CORE LOCK FLAGS * * EXEC 22 REQUEST WITH ONE PRAMETER * PRAMETER MEANING * 0 CLEAR CORE LOCK * 1 SET CORE LOCK * 2 CLEAR ALL OF MEMORY FLAG * 3 SET ALL OF MEMORY FLAG. * $MPT8 LDB XEQT GET THE ADDRESS ADB D14 OF THE BITS IN THE ID-SEGMENT STB $LIST SAVE ADDRESS LDA B,I GET CURRENT STATUS XLB RQP2,I GET THE REQUEST WORD CMB,INB,SZB,RSS IF ZERO JMP CLCL CLEAR THE CORE LOCK * INB,SZB,RSS IF ONE JMP STCL SET THE CORE LOCK * INB,SZB,RSS IF TWO JMP MEM15 CLEAR ALL OF MEMORY FLAG * INB,SZB IF NOT THREE THEN JMP ESC02 GO ABORT HIM. JMP MEM15 * STCL LDB SWAP CHECK IF LEGAL REQUEST RBR,RBR GET LEGAL FLAG SLA TO LEAST B RBR,CLE CLE,SLB,RSS IF ILLEGAL JMP ESC07 GO DO HIM IN * CLCL LDB B100 GET THE CORE LOCK FLAG TO B MPT81 IOR B SET THE FLAG SEZ AND IF A CLEAR REQUEST XOR B CLEAR THE FLAG STA $LIST,I RESET THE WORD JMP MEM15 GO EXIT. SKP ********************************************************************** * * EXEC 14--GET/PUT A COMMAND STRING. * * FOUR PARAMETERS USED: * . * . * . * JSB EXEC * DEF RTN * DEF ICODE * DEF GPCOD * DEF IBUFR * DEF IBUFL * RTN . * . * . * ICODE DEC 14 * GPCOD DEC 1 OR 2 1 = GET(RETRIEVE)PARAMETER STRING * 2 = PUT(WRITE)PARAMETER STRING TO FATHER * IBUFR BSS N BUFFER OF N WORDS * IBUFL DEC N(OR -2N) BUFFER LENGTH WORDS(+) OR CHARACTERS(-) * ****************************************************************** * $MPT9 LDA RQCNT CHECK TO SEE ADA DM3 IF THERE ARE SSA FOUR PARAMETERS. JMP ESC01 SORRY BUDDY, YOU BLEW IT! LDA RQP3 SAVE ADDRESS STA BFADD OF BUFFER. XLB RQP4,I GET BUFFER LENGTH, SAVE STB $IDNO FOR TRANS.LOG CHECK, JSB $CVWD CONVERT TO POSITIVE STB BFCNT CHAR COUNT AND SAVE. XLA RQP2,I GET TYPE OF REQUEST. ADA DM2 SZA,RSS JMP MPT9W 2=WRITE. INA,SZA 1=READ. JMP ESC02 ILLEGAL REQUEST. * LDB XEQT READ A STRING BLOCK FOR AN ID-SEG. JSB $STSH TO THE BUFFER(E=1,EXTRA WORD). SZA,RSS GET THE STRING BLOCK ADDRESS JMP NOPAW FOR THIS PROG. IF NO STRING, ADA D2 THEN SET A=1, CLEAR B, AND RETURN. LDB A,I GET ACTUAL SIZE OF STORED CMB,CLE,INB STRING AND COMPARE TO ADB BFCNT TO THE REQUESTED LDB A STRING SIZE. SEZ,INA,RSS SET A REG. TO SOURCE ADDRESS. LDB BFCTA USE WHICHEVER SIZE IS LDB B,I SMALLER AND CONVERT STB BFCNT INB TO WORDS AND USE BRS AS MOVE WORDS STB XB,I COUNT. LDB BFADD SET B REG. TO DESTINATION ADD. LDX XB,I MWI GO MOVE WORDS. LDB XEQT WHEN COMPLETE, RETURN THE JSB $RTST STRING BLOCK TO MEMORY. LDB XB,I GET MOVE WORDS COUNT. LDA $IDNO IF ORIGINAL REQUEST WAS SSA FOR CHARS, THEN DOUBLE LDB BFCNT WORD COUNT FOR TRANS.LOG. JMP MPT91 GO SETUP REGS. AND RETURN. * MPT9W LDA XEQT WRITE A STRING BLOCK TO THE FATHER. ADA D20 GET CURRENT PROGRAM LDA A,I AND DETERMINE IF THERE AND B377 IS A FATHER. SZA,RSS JMP NOPAW ERROR, NO FATHER. CCB,CCE GET ID(SET E=1 FOR ALCST) ADB KEYWD SEGMENT ADB A ADDRESS OF LDB B,I FATHER. JSB ALCST DEALLOCATE AND THEN ALLOC.BLOCK FOR PAW. JMP ESC10 IF SUCCESS ALLOC.,THEN SET A=0.IF NO JMP NMNOW MEM EVER,ABORT SON(SC10).IF NO MEM MPT91 CLA NOW, SUSPEND THE SON. * MPT95 STB XB,I SET UP B REGISTER. STA XA,I SET UP A REGISTER. JMP MEM15 RETURN. * NMNOW LDA WORDS FETCH STRING LENGTH (GLM.2013) STA XTEMP,I AND SAVE FOR WAKE-UP CALL (GLM.2013) JSB $LIST NOT ENOUGH MEMORY NOW SO OCT 504 LINK PROGRAM INTO MEMORY JMP $XEQ SUSPENSION LIST. * NOPAW INA IF NO STRING ON 'GET' OR CLB NO FATHER ON 'PUT', THEN JMP MPT95 SET A=1 OR B=0. * DM2 DEC -2 SKP ************************************************************** * * SUBROUTINE TO STORE A STRING IN SYSTEM AVAILABLE MEMORY. * ALCST DEALLOCATES ANY STRING MEMORY, ALLOCATES A BLOCK OF * MEMORY, TRANSFERS THE STRING INTO THE BLOCK, AND LINKS THE * BLOCK INTO THE HEAD OF THE STACK LOCATED AT $STRG. THE LINKED * BLOCKS LOOK AS FOLLOWS: * * * *********** ********************* * $STRG * ---------* 0 OR LINK-------------- * *********** *-------------------* * EXTRA WORD BIT------* ID SEG ADDRESS * * *-------------------* * * # CHARS IN STRING * * *-------------------* * * CHAR 1 CHAR 2 * * *-------------------* * * * * *-------------------* * * CHAR M * * ********************* * * EXTRA WORD * * *-------------------* * * * WORD 1 = LINK TO NEXT BLOCK OR 0 FOR LAST BLOCK * WORD 2 = BITS 0-14 = ID-SEGMENT ADDRESS * BIT 15 = EXTRA WORD IN BLOCK BIT(SEE $ALC) * WORD 3 = ACTUAL NUMBER OF CHARS (M) IN STRING * * CALLING SEQUENCE: * BFADD:= BUFFER ADDRESS * BFCNT:= POSITIVE BUFFER CHARACTER COUNT * MVFLG:= -1/0 STRING IN SYS/USER MAP * CLE/CCE (SEE BELOW) * LDB ID-SEGMENT ADDRESS * JSB ALCST * * RETURN: * (P+1) =-1, =XTEMP UNSUCCESSFUL,NO MEM EVER * (P+2) =0 , =XTEMP UNSUCCESSFUL,NO MEM NOW * (P+3) =+ , =XTEMP SUCCESSFUL ALLOCATION EVER * * AND ARE MODIFIED * TEMP1, TEMP4 AND TEMP6 ARE USED. * CALLS $RTST WHICH USES TEMP2, TEMP3 AND TEMP5. * * ON ENTRY, IF E REG=0, THE BASE PAGE WORD XTEMP(1721B)IS * SET TO THE ID SEGMENT WORD 2 ADDRESS INDICATED BY THE B REG * AND THEN RESTORED ON EXIT. IF THE E REG = 1, THEN XTEMP IS * NOT MODIFIED. SINCE ON "NOT ENOUGH MEMORY", $ALC WILL STORE * THE AMOUNT OF MEMORY REQUIRED IN 'XTEMP,I', THIS WILL RESULT: * 1)E=0,SAVE MEMORY SIZE IN XTEMP OF B REG PROGRAM, OR * 2)E=1,SAVE MEMORY SIZE IN XTEMP OF CURRENT PROGRAM(USED * ONLY IN EXEC 14 CALL FROM SON TO FATHER). * *************************************************************** * ALCST NOP STB TEMP1 SAVE ID ADDRESS. LDA XTEMP SAVE CURRENT PROGRAM'S ID STA TEMP4 WORD 4. * INB IF E=0, THE SET UP OUR PROGRAM'S ID SEZ,INB,RSS WORD 2 FOR USE BY $ALC. STB XTEMP OTHERWIZE, USE CURRENT PROGRAM. LDB TEMP1 GET ID ADDRESS AND JSB $RTST RETURN ANY STRING MEMORY. LDA BFCNT GET CHAR COUNT. INA CHANGE TO ARS WORD COUNT STA RTSTW AND SAVE. ADA D3 INCREMENT WORD COUNT BY STA WORDS 3 FOR LINKAGE WORDS AND JSB $ALC GO GET MEMORY. WORDS NOP JMP ALST9 NO MEMORY EVER RETURN. JMP ALST8 NO MEMORY NOW RETURN. CCE OK RETURN. SET E REG TO CPB WORDS 1 IF AN EXTRA WORD WAS CLE RETURNED. LDB $STRG LINK THE BLOCK INTO STB A,I THE HEAD OF THE STA $STRG STACK HEADED AT $STRG. LDB TEMP1 GET ID-SEG ADDRESS, ADD IN RBL,ERB EXTRA BLOCK WORD BIT, INA AND STORE IN SECOND STB A,I BLOCK WORD. LDB BFCNT STORE BUFFER CHAR INA COUNT IN THIRD STB A,I WORD OF BLOCK. INA LDB A GET ADD.OF DESTINATION BUFFER. LDA BFADD GET ADDRESS OF SOURCE BUFFER. * ISZ MVFLG WHERE IS THE STRING RIGHT NOW ? JMP ALST5 USER MAP * MVW RTSTW SYS MAP, SO GO MOVE THE WORDS JMP ALST6 * ALST5 LDX RTSTW MWF GO MOVE WORDS FROM USER MAP. ALST6 ISZ ALCST SUCCESSFUL RETURN. ALST8 ISZ ALCST NO MEMORY NOW RETURN. ALST9 CLB CLEAR OUT SYS/USER MAP FLG STB MVFLG LDB TEMP4 RESTORE CURRENT PROGRAM'S STB XTEMP ID WORD 2 ADDRESS. JMP ALCST,I NO MEMORY EVER RETURN--A=STATUS. * STRGA DEF $STRG $STRG OCT 0 HEAD OF STRING STORAGE STACK. BFCTA DEF BFCNT BFCNT BSS 1 BFADD BSS 1 MVFLG NOP -1/0 STRING CURRENTLY IN SYS/USER MAP SKP ************************************************************** * * SUBROUTINE TO RETURN SYSTEM AVAILABLE MEMORY ALLOCATED * FOR A STRING. GIVEN A PROGRAM'S ID-SEGMENT ADDRESS, $RTST * LOCATES THE STRING IN THE BLOCK HEADED AT $STRG, UNLINKS * IT AND RETURNS IT TO SAVMEM. * * CALLING SEQUENCE: * LDB ID-SEGMENT ADDRESS * JSB $RTST * * RETURN: * NO REGISTERS ARE SAVED. * USES TEMP2 AND TEMP5 FOR TEMPOARAY STROAGE. * CALLS $STSH WHICH USES TEMP3. * ************************************************************** * $RTST NOP STB TEMP2 SAVE ID-SEGMENT ADDRESS. RTST1 JSB $STSH GET STRING BLOCK ADD.(E=1,EXTRA WD). SZA,RSS CHECK IF STRING JMP $RTST,I BLOCK FOUND. STA RTSTA STORE STARTING BLOCK ADDRESS. LDA A,I UNLINK BLOCK STA B,I FROM STACK. LDA RTSTA ADA D2 GET SIZE OF LDB A,I BLOCK, CONVERT INB TO WORDS BRS AND ADB D3 ADD 3. SEZ IF EXTRA WORD BIT SET, INB ADD 1 TO SIZE. STB RTSTW STORE TOTAL SIZE OF BLOCK. JSB $RTN RETURN MEMORY BLOCK. RTSTA NOP RTSTW NOP * LDB TEMP2 GET ID SEGMENT ADDRESS. STB WORK SET UP $WORK IN CASE ANY PROG SCHEDULED JMP RTST1 CHECK FOR ANY MORE BLOCKS. * SKP ********************************************************************** * * SUBROUTINE $STSH CHASES DOWN A STRING BLOCK IN THE STACK * HEADED AT $STRG GIVEN THE ID-SEGMENT ADDRESS. ASSUMES ENTRY * IN THE SYSTEM MAP. * * CALLING SEQUENCE: * LDB ID-SEGMENT ADDRESS * JSB $STSH * * RETURN: * =0 = COULD NOT FIND NAMED BLOCK * =+ = ADDRESS OF BLOCK, E=1 = EXTRA WORD IN BLOCK * B= ADDRESS OF PREVIOUS BLOCK * USES TEMPORARY LOCATION TEMP3. * ********************************************************************** * $STSH NOP STB TEMP3 SAVE ID-SEGMENT ADDRESS LDB STRGA GET POINTER TO HEAD OF STACK. STSH1 LDA B,I GET BLOCK ADDRESS AND CLE,SZA,RSS IF ZERO, THEN END JMP STSH9 OF STACK. INA OTHERWIZE,INCREMENT IT,AND GET LDA A,I GET ID-SEGMENT ADDRESS. ELA,RAR SAVE EXTRA WORD BIT IN E REG. CPA TEMP3 IF THIS IS CORRECT JMP STSH2 BLOCK, THEN RETURN. LDB B,I OTHERWIZE, GO CHECK JMP STSH1 NEXT BLOCK. * STSH2 LDA B,I SET A=BLOCK ADDRESS AND STSH9 JMP $STSH,I RETURN. * ********************************************************************** * * $CVWD CONVERTS NEGATIVE CHARACTER COUNT OR POSITIVE WORD COUNT * TO POSITIVE CHARACTER COUNT. * * CALLING SEQUENCE: * LDB COUNT(+ = WORDS, - = CHARACTERS) * JSB $CVWD * * RETURN: * B = +CHARACTERS * ********************************************************************** * $CVWD NOP SSB CONVERT NEGATIVE CMB,INB,RSS CHARACTERS AND BLS POSITIVE WORDS TO JMP $CVWD,I POSITIVE CHARACTERS. HED ** SYSTEM BASE PAGE COMMUNICATION AREA ** * * *** SYSTEM BASE PAGE COMMUNICATION AREA *** * XI EQU 1647B . EQU 1650B ESTABLISH ORIGIN OF AREA * * SYSTEM TABLE DEFINITION * * EQTA EQU .+0 FWA OF EQUIPMENT TABLE EQT# EQU .+1 # OF EQT ENTRIES * DRT EQU .+2 FWA OF DEVICE REFERENCE TABLE LUMAX EQU .+3 # OF LOGICAL UNITS (IN DRT) * INTBA EQU .+4 FWA OF INTERRUPT TABLE INTLG EQU .+5 # OF INTERRUPT TABLE ENTRIES * TAT EQU .+6 FWA OF TRACK ASSIGNMENT TABLE * KEYWD EQU .+7 FWA OF KEYWORD BLOCK * * I/O MODULE/DRIVER COMMUNICATION * EQT1 EQU .+8 ADDRESSES EQT2 EQU .+9 EQT3 EQU .+10 OF EQT4 EQU .+11 EQT5 EQU .+12 CURRENT EQT6 EQU .+13 EQT7 EQU .+14 15-WORD EQT8 EQU .+15 EQT9 EQU .+16 EQT EQT10 EQU .+17 EQT11 EQU .+18 ENTRY EQT12 EQU .+81 EQT13 EQU .+82 EQT14 EQU .+83 EQT15 EQU .+84 * CHAN EQU .+19 CURRENT DMA CHANNEL # TBG EQU .+20 I/O ADDRESS OF TIME-BASE CARD SYSTY EQU .+21 EQT ENTRY ADDRESS OF SYSTEM TTY * * SYSTEM REQUEST PROCESSOR /'EXEC' COMMUNICATION * * RQCNT EQU .+22 # OF REQUEST PARAMETERS -1 RQRTN EQU .+23 RETURN POINT ADDRESS RQP1 EQU .+24 ADDRESSES RQP2 EQU .+25 RQP3 EQU .+26 OF REQUEST RQP4 EQU .+27 RQP5 EQU .+28 PARAMETERS RQP6 EQU .+29 RQP7 EQU .+30 (SET FOR MAXIMUM OF RQP8 EQU .+31 9 PARAMETERS) RQP9 EQU .+32 * * DEFINITION OF SYSTEM LISTS (QUEUES) * * DORMT EQU .+32 ADDRESS OF 'DORMANT' LIST, SKEDD EQU .+33 'SCHEDULE' LIST, SUSP2 EQU .+35 'WAIT' LIST, SUSP3 EQU .+36 'AVAILABLE MEMORY' LIST, SUSP4 EQU .+37 'DISC ALLOCATION' LIST, SUSP5 EQU .+38 'OPERATOR SUSPEND' LIST * * DEFINITION OF EXECUTING PROGRAM ID SEGMENT' * * XEQT EQU .+39 ID SEGMENT ADDR. OF CURRENT PROG. XLINK EQU .+40 'LINKAGE' XTEMP EQU .+41 'TEMPORARY (5-WORDS) 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 * * SYSTEM MODULE COMMUNICATION FLAGS * * OPATN EQU .+52 OPERATOR/KEYBOARD ATTENTION FLAG OPFLG EQU .+53 OPERATOR COMMUNICATION FLAG SWAP EQU .+54 RT DISC RESIDENT SWAPPING FLAG DUMMY EQU .+55 I/O ADDRESS OF DUMMY INT. CARD IDSDA EQU .+56 DISC ADDR. OF FIRST ID SEGMENT IDSDP EQU .+57 -POSITION WITHIN SECTOR * * DEFINITION OF MEMORY ALLOCATION BASES * * BPA1 EQU .+58 FWA R/T DISC RES. BP LINK AREA BPA2 EQU .+59 LWA R/T DISC RES. BP LINK AREA BPA3 EQU .+60 FWA BKG DISC RES. BP LINK AREA LBORG EQU .+61 FWA OF RESIDENT LIBRARY AREA RTORG EQU .+62 FWA OF REAL-TIME AREA RTCOM EQU .+63 LENGTH OF REAL TIME COMMON AREA RTDRA EQU .+64 FWA OF R/T DISC RESIDENT AREA AVMEM EQU .+65 FWA OF SYSTEM AVAILABLE MEMORY BKORG EQU .+66 FWA OF BACKGROUND AREA BKCOM EQU .+67 LENGTH OF BACKGROUND COMMON AREA BKDRA EQU .+68 FWA OF BKG 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.) * DSCLB EQU .+73 DISC ADDR OF RES LIB ENTRY PTS DSCLN EQU .+74 # OF RES LIB ENTRY POINTS DSCUT EQU .+75 DISC ADDR OF RELOC UTILITY PROGS DSCUN EQU .+76 # OF RELOC UTILITY PROGS LGOTK EQU .+77 LOAD-N-GO: LU,STG TRACK,# OF TRKS LGOC EQU .+78 CURRENT LGO TRACK/SECTOR ADDRESS SFCUN EQU .+79 SOURCE FILE LU AND DISC ADDRESS MPTFL EQU .+80 MEMORY PROTECT ON/OFF FLAG (0/1) FENCE EQU .+85 MEM PROTECT FENCE ADDRESS * BKLWA EQU .+87 LWA OF MEMORY IN BACKGROUND * * FREG1 EQU LBORG FREG2 EQU RTORG FREG3 EQU BKORG FLG EQU OPFLG * A EQU 0B LOCATION OF A REGISTER B EQU 1B LOCATION OF B REGISTER ORG * PROGRAM LENGTH END $LST