*USE 'ASMB,R,N' (RTE-M II) OR 'ASMB,R,Z' (RTE-M III) * * IFN OPTION * NAME: $MDI2 * SOURCE: 92064-18009 * RELOC: PART OF 92064-16002 * PROGMR: E.J.W. BASED ON RTE-III VERSIONS G.A.A.,L.W.A.,D.L.S. * * IFZ OPTION * NAME : $MDI3 * SOURCE: 92064-18009 * RELOC: PART OF 92064-16003 * PROGMR: E.J.W. BASED ON RTE-III VERSIONS G.A.A.,L.W.A.,D.L.S. * * **************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977. 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. * * **************************************************************** * * IFN * BEGIN NON-DMS CODE *************** NAM $MDI2,0 92064-16002 REV.1726 770512 *** END NON-DMS CODE *************** XIF IFZ ***** BEGIN DMS CODE *************** NAM $MDI3,0 92064-16003 REV.1726 770512 ******* END DMS CODE *************** XIF * SUP * * DISPATCHER ENTRY POINT NAMES * ENT $RENT,$ZZZZ,$XEQ ENT $MPFT,$EMRP,$CON SPC 1 IFZ ***** BEGIN DMS CODE *************** ENT $MRMP,$ENDS,$MATA ENT $SMAP ENT $LPSA,$XDMP ******* END DMS CODE *************** XIF SPC 1 * * DISPATCHER EXTERNAL REFERENCE NAMES * EXT $RSRE,$WATR,$TRRN,$IRT,$ABRE,$LIST EXT $MIC,$SGAF * MIC STR,105623B,1 SEQUENTIAL STORE VALUE SKP * THE DISPA MODULE OF THE HP-2100 REAL TIME EXECUTIVE * * PERFORMS THE FOLLOWING FUNCTIONS: * * 1. IDLE LOOP WHEN NO PROGRAMS ARE SCHEDULED OR CANNOT BE * * EXECUTED. * * 2. SWITCHES PROGRAM EXECUTION SUCH THAT THE HIGHEST * * PRIORITY EXECUTABLE PROGRAM EXECUTES. * * 3. SETS THE FENCE REGISTER ACCORDING TO PROGRAM TYPE. * * 4. LOADS, SWAPS, AND EXECUTES DISC RESIDENT PROGRAMS * * * CALLING SEQUENCE * JMP $XEQ * * $XEQ LDB $ZZZZ CHECK IF PROGRAM TO BE ABORTED SZB JMP ABORT YES GO HANDLE IT LDB $LIST IF LIST NOT ENTERED SZB,RSS THEN NOTHING NEW SO JMP $IRT GO CONTINUE CURRENT PGM * LDA SKEDD LOAD TOP OF SCHEDULE LIST CLB STB $LIST PREVENT NEEDLESS LIST SCANS RSS SKIP FIRST TIME X0035 LDA ZWORK,I GET THE NEXT PGM IN THE LIST SZA IF ZERO, THEN NO PROG SCHED JMP X0010 GO TO PROCESS SCHED LIST * * NO PROGRAM SCHEDULED--SETUP FOR IDLE LOOP * * * THE IDLE LOOP SECTION CONSISTS OF: * * CLEARING XEQT WORD TO SIGNIFY THAT NO PROGRAM * * CURRENTLY EXECUTING. * * STORE ADDRESS OF 4 DUMMY WORDS INTO XSUSP-XSUSP+3 * * DUE TO I/O PROCESSING. * * SET MEMORY PROTECT REGISTER TO ZERO. * * CALL INTERRUPT RESTORE ROUTINE, $IRT * JUMP TO * * * * STA XEQT SET BP POINTERS TO DUMMY ID LDB VSUSP STB XSUSP INB STB XA SET POINTERS TO DUMMY REGS STB XB STB XEO STB XI SET X,Y REG POINTER TO DUMMY JMP X0029 SET UP MP FENCE, EXIT * IDLE JMP * IDLE LOOP * VSUSP DEF *+1 DEF IDLE NOP NOP SKP ABORT LDA B,I GET POSSIBLE NEXT PGM STA $ZZZZ AND SET IT FOR ABORT CLA CLEAR THE XSUSP ADDRESS STABI STA B,I FOR THE NEXT START ADB DM8 BACK UP TO ID-SEG ADDRESS STB A SAVE THE ID-SEG. ADDRESS STB TMP A FEW TIMES JSB $ABRE RELEASE ANY RE-ENTRANT MEMORY. * LDB TMP JSB $WATR SCHEDULE ANYONE WAITING LDB TMP LDA B ADA D12 SPC 1 IFZ ***** BEGIN DMS CODE *************** STA CNT SAVE ADDR OF NAME WORD ******* END DMS CODE *************** XIF SPC 1 ADA D8 INDEX TO FLAG WORD STA TEMP SAVE ADDR OF FLAG WORD LDA A,I ALF,ALF GET FLAG WORD SLA ANY RESOURCES HELD? JSB $TRRN YES, RELEASE THEM * CLA IF CURRENTLY STA TEMP,I (CLEAR FLAG WORD) SPC 1 IFZ ***** BEGIN DMS CODE *************** LDA CNT,I SZA OF,PROG,8? JMP $XEQ NO * LDA TMP YES ADA D14 LDA A,I GET PROG TYPE AND D15 CPA D1 IF IT IS MEM RES TYPE JMP $XEQ SKIP ALL THE PTTN JAZZ * LDA TMP OF,PROG,8 IN PTTN JSB MATEN GO SET UP POINTERS CLB STB MID,I CLEAR RESIDENT WORD IN PART ******* END DMS CODE *************** XIF SPC 1 JMP $XEQ ABORTION DONE. * D12 DEC 12 SKP * THE SWITCHING SECTION USES THE SCHEDULE LIST TO DETERMINE * * WHICH PROGRAM TO EXECUTE-STARTING FROM TOP OF LIST. * * IF PROGRAM FROM LIST OF LOWER OR EQUAL PRIORITY, * * THEN EXECUTION OF CURRENT PROGRAM CONINUES. * * IF PROGRAM FROM LIST OF HIGHER PRIORITY AND * * TYPE EITHER REAL TIME RESIDENT OR BACKGROUND * * RESIDENT, EXECUTION SWITCHING TAKES PLACE.* * TYPE IS BACKGROUND DISC RESIDENT, * * GO TO BACKGROUND DISC PROCESSING. * * TYPE IS REAL TIME DISC RESIDENT, GO TO REAL * * TIME DISC RESIDENT PROCESSING * * X0010 STA ZWORK SCHED LIST PROG ID SEG ADDRESS ADA D6 STA ZPRIO PRIORITY ADDRESS ADA D8 STA ZTYPE TYPE ADDRESS ADA D7 STA ZMPID MAP WORD ADDRESS * LDA XEQT ANY PROGRAM CURRENTLY EXECUTING? SZA,RSS YES, TEST FOR HIGHEST PRIORITY JMP X0030 NO, EXECUTE NEW SCHEDULED PROG ADA D15 CHECK STATUS OF XEQT ID SEGMENT LDA A,I AND D15 MASK TO MAJOR STATUS CPA D1 RSS SCHEDULED-SO GO TO CHECK PRIORITY JMP X0030 NOT SCHEDULED -SO GO SWITCH LDA XPRIO,I LOAD TEST PROGRAM PR CMA,INA MAKE NEGATIVE ADA ZPRIO,I SUPTRACT FROM CURRENT PGM PR. SSA,RSS IF SIGN A=0 THEN PROG OF HIGHER PR JMP RNOLD CURR PROG HIGHER PRIOR THAN SCHED PROG * X0030 EQU * IFN * BEGIN NON-DMS CODE *************** CLA FORCE MPFT INDEX TO ZERO STA MPN STORE MPFT INDEX *** END NON-DMS CODE *************** XIF SPC 1 IFZ ***** BEGIN DMS CODE *************** LDA ZMPID,I GET MAP ID WORD AND B1700 AND SAVE MPFT INDEX ALF,ALF RAL STA MPN LDA ZTYPE,I SCHED PROG HIGHER PRIOR THAN CURR PROG AND D15 STA TMP CPA D1 CHECK IF REAL TIME RESIDENT JMP X0F40 YES CPA D2 CHECK IF REAL TIME PTTN RESIDENT JMP X0200 YES JMP X0035 NOT LEGAL TYPE, IGNOR * X0200 JSB FND SET UP PTTN, RETURNS (A) = #PGS LDB MLNK SET (B) = PTTN ENTRY ADDR JSB $SMAP GO SET UP USER MAP JMP X0N40 NOW SET UP USER PROG PTRS * * X0F40 LDA $MRMP GET ADR MEM RES MAP USA LDA $EMRP SET PTRS FOR MEMORY RESIDENT PROG INA INCREMENT FOR LAST WORD PROG + 1 STA RTDRA STA AVMEM STA BKDRA STA BKLWA LDA ADMEM STA MID ******* END DMS CODE *************** XIF SPC 1 X0N40 LDA ZWORK STA MEMID SET ID FOR MEM RES PROG ADA MI GET ADR FOR INDEX REGISTERS STA XI SET POINTER TO INDEX REGISTERS ADA D30 STA $CON SET POINTER TO CONSOLE LU (WORD 29) * * LOAD PROGRAM ID SEG ADR IN XEQT AREA * LDA ZWORK IF SAME AS CURRENT PGM CPA XEQT THEN JMP $RENT SKIP BASE PAGE SET UP. JSB $X041 SET UP BASE PAGE ID SEG PTRS LDB XSUSP,I CHECK IF PROGRAM SUSPENDED CMB,INB,SZB IF SO THEN JMP $RENT GO SET IT UP LDB XPENT,I GET PRIMARY ENTRY PT. STB XSUSP,I SET ENTRY ADDRESS * * CHECK IF PT OF SUSPENSION IN LIBRARY AREA * $RENT EQU * IFZ ***** BEGIN DMS CODE *************** LDA ZWORK GET PROG TRYING DISPATCH CPA MID,I HAS SETUP CHANGED? (TRY TO SAVE TIME) RSS NO,GO TO IT JSB FIX GO SET BACK UP ******* END DMS CODE *************** XIF SPC 1 LDB XTEMP+4 GET THE RENT BIT ADB D15 LDB B,I GET THE WORD BLF,RBL ROTATE TO PUT RENT BIT IN SIGN SSB,RSS IF RENT NOT IN CONTROL JMP X0028 GO SET FENCE SLB IF MEMORY MOVED JSB $RSRE GO RESTORE IT LDA LBORG SET THE LIBRARY FENCE JMP X0029 GO SET IT UP * * * $X041 NOP SET UP B.P. ID SEG PTRS LDB DM12 (12 WORDS) STB TMP LDB XQDEF PUT THEM AT XEQT STA XEQT X0041 JMP MIC OR STA B,I IF NO MICRO INA INB ISZ TMP JMP X0041 JMP $X041,I RETURN WHEN DONE * XQDEF DEF XLINK * RNOLD LDA XEQT RESET POINTERS FOR CURR PROG STA ZWORK SINCE WE WILL NOT RUN SCHED PROG ADA D14 STA ZTYPE ADA D7 STA ZMPID JMP $RENT * MIC STR 12 CALL MICROCODE JMP $X041,I RETURN * SPC 1 IFZ ***** BEGIN DMS CODE *************** FIX NOP ROUTINE TO RESET MAT POINTERS FOR CURRENT PROG LDA ZTYPE,I GET PROG TYPE AND D15 CPA D1 JMP X0F40 GO RESET MEM RES INFO * LDA ZMPID,I AND B1700 RAL ALF,ALF GET MP FENCE INDEX STA MPN JSB FND GO SET MAT POINTERS, BNDRY WORDS JMP FIX,I ******* END DMS CODE *************** XIF SPC 1 * * * SET MEMORY PROTECT ACCORDING TO PROG TYPE * * X0028 LDA MPN GET MPFT INDEX ADA $MPFT LDA A,I GET FENCE X0029 STA FENCE OTA 5B * * RESTORE REGISTERS, MEMORY PROTECT, AND TURN ON INTERRUPT SYSTEM * JMP $IRT GO EXECUTE THE PROGRAM SPC 3 * XEQ PROCESSOR--BUFFERS, CONSTANTS, POINTERS, ETC * * ZWORK NOP SCHED LIST ID SEGMENT ADDRESS ZPRIO NOP SCHED LIST PRIORITY LIST ZTYPE NOP SCHED LIST TYPE ADDRESS ZMPID NOP SCHED LIST MAP & MPFTI WORD TEMP NOP TEMPORARY WORKING STORAGE AREA TMP NOP TEMPORARY WORKING STORAGE * D1 DEC 1 D2 DEC 2 D3 DEC 3 D4 DEC 4 D6 DEC 6 D7 DEC 7 D8 DEC 8 D14 DEC 14 D15 DEC 15 D30 DEC 30 D22 DEC 22 DM1 DEC -1 DM8 DEC -8 DM12 DEC -12 * $EMRP NOP FWA SAM-1 (SET BY GENERATOR) $MPFT NOP ADDR M.P. FENCE TABLE (SET BY GENERATOR) ADMEM DEF MEMID MEMID NOP ID SEG ADDR OF CUR MEM.RES. PROG MPN NOP INDEX TO MPFT, BP FLAG B1700 OCT 1700 MASK FOR MP INDEX MID NOP ID SET ADDR MI DEC -2 NEG # OF INDEX REGS SPC 2 * MPFT INDEX * * BUILT BY THE GENERATOR AS FOLLOWS: * 0 PARTITION RESIDENT PROGRAM, NO COMMON * 1 MEMORY RESIDENT PROGRAM, NO COMMON * 2 RT COMMON, ANY PROGRAM * 3 -- NOT USED -- * 4 SSGA, ANY PROGRAM * * * MAT ENTRY * *EACH MAT ENTRY WILL BE AS FOLLOWS: * * WORD PURPOSE * 0 LINKAGE (ADR NEXT ENTRY IN LIST) (-1 IF NOT DEFINED) * 1 - NOT USED- * 2 ID SEG ADR * 3 BEGINNING PAGE ADR OF PARTITION * BITS 0-9 * 4 NUMBER PAGES OCCUPIED BY PARTITION * BITS 0-9,RESERVED FLAG BIT 15 * 5 STATUS ,REAL TIME FLAG BIT 15 * * *THE FOLLOWING ARE SET AT GENERATION TIME: * BEGINNING PAGE ADR (WORD 3) * NUMBER PAGES IN PART (WORD 4) * REAL TIME FLAG (WORD 5) * RESERVED FLAG (WORD 4) * SPC 2 IFZ ***** BEGIN DMS CODE *************** PGN NOP PROG LENGTH MLNK NOP LINKAGE WORD CNT NOP PARTITION # B77 OCT 77 B2000 OCT 2000 BIT 10 SET B76K OCT 76000 D21 DEC 21 $LPSA NOP LAST PAGE SAM (SET BY GENERATOR) $MRMP NOP ADDR MEM RES MAP (SET BY GENERATOR) $ENDS NOP #PAGES OCCUPIED BY SYSTEM ,LIBR (SET BY GENERATOR) $MATA NOP ADR FIRST ENTRY MAT (SET BY GENERATOR) * *ROUTINE TO SET USER MAP *CALL: AREG=LENGTH IN PAGES * BREG=ADR MAT ENTRY * * $SMAP NOP STB XADR MAT ENTRY ADR STA XPGN JPROG LENGTH IN PAGES ADB D2 LDA B,I GET ID ADR ADA D22 LDA A,I GET LOW MAIN AND B76K GET START PAGE ALF RAL,RAL GET IN LOW 5 BITS LDB $ENDS GET PAGE # USER STARTS ON STB STUSR START USER WITH NO COMMON CMB,INB ADB A SZB,RSS B=0,NO COMMON JMP MAPUS NO COMMON * STA STUSR SAVE START REG USER LDA $ENDS A REG START COMMON ADA D32 GET TO USER MAP CBX BREG HAS # REGISTERS LDB $ENDS ADR OF START REG VALUE XMS MAP COMMON * MAPUS CLA,INA CAX SET TO MAP BASE PAGE REGISTER LDA D32 FIRST REG IN USER MAP LDB XADR ADB D3 GET TO START PARTITION WORD LDB B,I ELB,BRS GET TO START PARTITION WORD STB STVAL STORE START VALUE LDB STVAL GET ADR START VALUE XMS MAP BASE PAGE * SEZ,RSS E=1,DONT INCREMENT START VALUE ISZ STVAL LDA D32 ADA STUSR START REG IN USER MAP LDX XPGN GET LENGTH PROG LDB STVAL XMS MAP * LDB STUSR PROTECT REST OF MAP ADB XPGN STB STUSR CMB,INB ADB D32 SZB,RSS IF B=0,FINISHED JMP $SMAP,I * CBX GET # REGISTERS IN X LDA STUSR GET START REGISTER ADA D32 LDB PRTCT GET PROTECT VALUE XMS JMP $SMAP,I YES,RETURN * PRTCT OCT 140000 READ & WRITE PROTECT STVAL NOP XADR NOP XPGN NOP STUSR NOP D32 DEC 32 * * * EXTERNAL ROUTINE TO SET USER MAP * * CALL: LDA IDADR AREG HAS ID SEG ADR * JSB $PVMP * --RETURN * AREG=0 ON RETURN IS ERROR--SAYS PROGRAM * NOT IN PARTITION * * $XDMP NOP STA XADR TEMP SAVE OF ID ADR LDB A ADB D14 LDA B,I AND D15 IS PROG MEM RES CPA D1 JMP MRPV YES,GO SET MEM RES MAP ADB D7 GET MPID WORD LDA B,I STA XPGN TEMP SAVE AND B77 MPY D6 ADA $MATA GET PART ADR LDB A B HAS MAT ENTRY ADA D2 LDA A,I CPA XADR IS PROG STILL IN PARTITION JMP *+3 YES ,CONTINUE CLA NO,ERROR JMP $XDMP,I ERROR RETURN LDA XPGN AND B76K ALF RAL,RAL GET LENGTH JSB $SMAP GO SET MAP CCA MAKE SURE A NOT 0 JMP $XDMP,I RETURN MRPV LDA $MRMP USA SET MEM RES MAP JMP $XDMP,I SKP * JSB FND TO SET UP PTTN POINTERS * (A) = # OF PAGES OF PTTN * FND NOP PARTITION FOUND SO SET IT UP LDA ZWORK JSB MATEN GO SET UP MAT POINTERS LDB MID,I GET OWNER OF PART * FNDR ADB D21 LDA B,I GET PROG LENGTH AND B76K STA PGN SAVE PAGE ADDR TEMPORARILY ADA DM1 FILL OUT PAGE INB LDB B,I STB RTDRA ADA B STA AVMEM STA BKDRA STA BKLWA LDA PGN GET PAGE ADDR AND B76K MASK AND SHIFT TO GET #PGS ALF RAL,RAL JMP FND,I RETURN * * * * SET UP POINTERS TO ENTRY IN MAT * AREG HAS ID ADR ON ENTRY * MATEN NOP ADA D21 GET MAP ID WORD LDA A,I AND B77 GET PARTITION # STA CNT MPY D6 MULTIPLY BY MAT ENTRY LENGTH ADA $MATA STA MLNK (1) SET MAT ENTRY POINTER ADA D2 STA MID (3) ID SEG ADR JMP MATEN,I ******* END DMS CODE *************** XIF SPC 1 HED SYSTEM START UP ******************************************************************** * THE START SECTION: * * CLEARS INTERRUPT SYSTEM * * INITIALIZES MAPS IN RTE-M III * ******************************************************************** * $ZZZZ NOP CLC 0 CLEAR INTERRUPT SYSTEM LDB STABI LDA $MIC SZA,RSS ANY MICRO? STB X0041 NO, PUT STA B,I THERE * LDA $MPFT ADA D4 LDA A,I GET START OF SSGA ADA DM1 STA $SGAF SPC 1 IFZ ***** BEGIN DMS CODE *************** LDA $MRMP GET ADDRESS MEM RES MAP USA LOAD USER MAP CLA XMA SET DMA1 FROM SYS MAP INA XMA SET DMA2 FROM SYS MAP LDA BPA2 GET LAST USER LINK INA INCREASE TO FIRST SYSTEM LINK IOR B2000 SET BIT 10 TO SHOW LOWER MAPPED LFA SET FENCE FOR BP ******* END DMS CODE *************** XIF SPC 1 JMP $ZZZZ,I END DISPATCHER INITIALIZE * ORG * SIZE OF MODULE HED ** SYSTEM BASE PAGE COMMUNICATION AREA ** * * *** SYSTEM BASE PAGE COMMUNICATION AREA *** * XI EQU 1647B . EQU 1650B ESTABLISH ORIGIN OF AREA * * SYSTEM TABLE DEFINITION * * * DEFINITION OF SYSTEM LISTS (QUEUES) * * SKEDD EQU .+33 'SCHEDULE' 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 1731B XB EQU 1732B XEO EQU 1733B * * * DEFINITION OF MEMORY ALLOCATION BASES * * BPA2 EQU .+59 LWA R/T DISC RES. BP LINK AREA LBORG EQU .+61 FWA OF RESIDENT LIBRARY AREA RTDRA EQU .+64 FWA OF R/T DISC RESIDENT AREA AVMEM EQU .+65 FWA OF SYSTEM AVAILABLE MEMORY BKDRA EQU .+68 FWA OF BKG DISC RESIDENT AREA * * UTILITY PARAMETERS * $CON EQU 1736B POINTER TO CURRENT SESSION TABLE FENCE EQU .+85 MEM PROTECT FENCE ADDRESS * BKLWA EQU .+87 LWA OF MEMORY IN BACKGROUND * * * A EQU 0B LOCATION OF A REGISTER B EQU 1B LOCATION OF B REGISTER * ORG * PROGRAM LENGTH END $ZZZZ