Added version 10 of basic.
[retro-software/dec/tops10/v4.5.git] / src / clkcss.mac
1 TITLE   CLKCSS - SCHEDULING ALGORITHM FOR NON-SWAPPING SYSTEMS\r
2 SUBTTL  T. HASTINGS/TH TS3.17 6 SEP 67 V001\r
3 XP      VCLKCS,001\r
4                 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
5 \r
6 \r
7 ;SCHEDULING ALGORITHM IS:\r
8 ;CALLED EVERY 60TH OF A SECOND WHEN CURRENT JOB IS USER MODE\r
9 ;CALLED WHEN CURRENT JOB IS IN EXEC MODE AND:\r
10 ;       1. JUST STARTED TO WAIT FOR IO\r
11 ;       2. JUST STARTED TO WAIT FOR A BUSY SHARABLE DEVICE\r
12 ;       3. RETURNING TO USER MODE AFTER TYPING CONTROL C\r
13 ;       4. RETURNING TO USER MODE AFTER CLOCK TRIED TO INTERRUPT\r
14 ;               CURRENT JOB WHILE IT WAS IN EXEC MODE\r
15 ;       5. AN ERROR OCCURRED IN CURRENT JOB\r
16 \r
17 ;CALL:  SETOM TIMEF             ;IF CLOCK HAS GONE OFF SINCE LAST CALL\r
18 ;       PUSHJ PDP,NXTJOB\r
19 ;       RETURN WITH NEXT JOB TO RUN IN AC ITEM\r
20 \r
21 ;INITIALIZE SCHEDULER(CALLED FROM IOINI1 BEFORE ALL OTHER\r
22 ;       DEVICES ARE INITIALIZED)\r
23 \r
24 INTERNAL NXTINI\r
25 \r
26 NXTINI: MOVSI TAC,-NQUEUE       ;NO. OF QUEUES\r
27         SETZM AVALTB(TAC)       ;CLEAR SHARABLE DEVICE AVAILABLE FLAGS\r
28         SETOM REQTAB(TAC)       ;SET SHARABLE DEVICE REQUEST COUNT TO -1\r
29                                 ;IE NO JOB WAITING OR USING DEVICE\r
30         AOBJN TAC,.-2           ;OTHER DEVICE INITIALIZATION\r
31         POPJ PDP,               ;MAY CHOOSE TO SET REQUEST TO MORE\r
32                                 ;NEG. VALUE IF MORE THAN ON JOB CAN\r
33                                 ;USE DEVICE AT ONCE\r
34 \fINTERNAL NXTJOB\r
35 INTERNAL FTTRPSET,FTDISK\r
36 EXTERNAL JOB,TIMEF,JBTSTS,JOBMAX,JOBN,PJBSTS,CPOPJ,CHKSHF\r
37 ENTRY XCKCSS\r
38 \r
39 T=TAC           ;TEMPORARY\r
40 Q=TAC1          ;QUEUE NO.\r
41 Q1=DEVDAT       ;QUEUE NO. SHIFTED TO MATCHING POS. OF JBTSTS WORD\r
42 C=DAT           ;COUNT OF JOB LEFT TO SCAN\r
43 \r
44 XCKCSS:\r
45 NXTJOB: PUSHJ PDP,CHKSHF        ;SHUFFLE CORE IF NEEDED\r
46         SETZM T\r
47         SKIPN ITEM,JOB          ;CURRENT JOB NO., IS IT NULL JOB?\r
48         JRST NXT0               ;YES, DO NOT DECREMENT QUANTUM RUN TIME\r
49         SKIPE TIMEF             ;NO, IS THIS A CLOCK INTERRUPT CALL?\r
50         SOSA T,JBTSTS(ITEM)     ;YES, DECREMENT QUANTUM RUN TIME\r
51                                 ;IN JOB STATUS WORD\r
52         SKIPA T,JBTSTS(ITEM)    ;NO, JUST PICKUP STATUS WORD\r
53         TRNE T,-1               ;REDUCED TIME TO ZERO YET?\r
54         JRST NXT1               ;NO\r
55         HRR T,RNQUNT            ;YES, RESET FOR RUN QUEUE QUANTUM\r
56 NXT0:   SETOM RNAVAL            ;FLAG TO SCAN RUN QUEUE FOR DIFFERENT JOB\r
57 NXT1:   HRRM T,JBTSTS(ITEM)     ;STORE MODIFIED QUANTUM RUN TIME\r
58         MOVEI Q,MAXQ            ;HIGHEST PRIORITY QUEUE SCANNED FIRST\r
59 NXT2:   SKIPN AVALTB(Q)         ;SHOULD THIS QUEUE BE SCANNED FOR A RUNABLE JOB?\r
60 NXT3:   SOJGE Q,NXT2            ;NO. LOOK AT NEXT LOWEST PRIORITY QUEUE\r
61         JUMPL Q,NXT7            ;YES, LOOKED AT QUEUES NQUEUE-1...0?\r
62         MOVE Q1,Q               ;MOVE QUEUE INDEX TO PROPER POS.\r
63         ROT Q1,^D17-JWPOS       ;TO MATCH JOB STATUS WORD\r
64         MOVEI C,JOBMAX          ;NO, SCAN ALL JOBS(EXCEPT NULL JOB)\r
65         AOSA ITEM,JOBP(Q)       ;SCAN ALL OTHER JOBS IN THIS QUEUE FIRST\r
66 \r
67 NXT4:   SETOM RNAVAL            ;FLAG RUN QUEUE BEING SCANNED\r
68 \r
69 NXT5:   CAIL ITEM,JOBN          ;GREATER THAN HIGHEST JOB NO.?\r
70         MOVEI ITEM,1            ;YES, RESET TO 1(SKIP NULL JOB)\r
71         HLRZ T,JBTSTS(ITEM)     ;IS JOB RUNABLE?\r
72         TRZ T,RUNMSK+CMWB       ;MASK OUT JOB STATUS BITS WHICH DO NOT MATTER\r
73         CAIN T,RUNABLE(Q1)      ;ADD IN QUEUE NO. IN PROPER POSITION\r
74         JRST NXT8               ;YES, IT IS RUNABLE AND IS IN THIS QUEUE\r
75 NXT6:   SOJLE C,NXT3            ;NO IT IS NOT, SCANNED ALL JOBS YET?\r
76         AOJA ITEM,NXT5          ;NO, LOOK AT NEXT JOB\r
77 \f;HERE IF NO JOBS FOUND TO RUN(Q=-1)\r
78 \r
79 NXT7:   MOVEI C,JOBN            ;SCAN ALL JOBS INCLUDING POSSIBLY NULL JOB\r
80         MOVE ITEM,JOB           ;STARTING WITH LAST JOB TO RUN\r
81         SKIPN Q1,RNAVAL         ;HAS RUN QUEUE(Q,Q1=0) BEEN SCANNED?\r
82         AOJA Q,NXT4             ;NO, FLAG THAT IS HAS AND SCAN RUN QUEUE(Q,Q1=0)\r
83         SETZB ITEM,RNAVAL       ;YES, CLEAR FLAG, SET NULL JOB TO RUN\r
84         POPJ PDP,               ;RETURN\r
85 \r
86 NXT8:\r
87 IFN FTTRPSET,<\r
88         EXTERNAL STOPTS\r
89                 MOVE T,STOPTS           ;HAS A TRPSET UUO BEEN DONE FOR JOB1\r
90                                         ;WITH NON ZERO AC?\r
91                 CAIE ITEM,1             ;IS THIS JOB 1?\r
92                 JUMPN T,NXT6            ;KEEP LOOKING IF NOT JOB1 AND\r
93                                         ;STOPTS FLAG SET\r
94 >\r
95 \r
96         CAIE Q,TSQ              ;IS THIS TTY WAIT SATISFIED Q?\r
97         CAIN Q,WSQ              ;IS THIS IO WAIT SATISFIED QUEUE?\r
98         SOSGE AVALTB(Q)         ;YES, DECREMENT COUNT OF JOBS WITH SATISFIED IO\r
99         SETZM AVALTB(Q)         ;NO, CLEAR AVAILABLE FLAG FOR THIS QUEUE\r
100         MOVEM ITEM,JOBP(Q)      ;SAVE JOB NUMBER FOR THIS QUEUE FOR NEXT TIME\r
101         JUMPE Q,CPOPJ           ;IS THIS RUN QUEUE?\r
102         MOVEI T,RNQ             ;NO, SET STATE CODE TO RUN\r
103         DPB T,PJBSTS            ;CLEAR WAIT CODE(SO HE WILL BE IN RUN QUEUE)\r
104         MOVE T,QUANTS(Q)        ;SET QUANTUM RUNNING TIME FOR QUEUE\r
105         HRRM T,JBTSTS(ITEM)     ;WHICH JOB HAS JUST LEFT\r
106         POPJ    PDP,            ;RETURN\r
107 \r
108 \fINTERNAL FTCHECK,FTMONP\r
109 \r
110 IFN FTCHECK+FTMONP,<\r
111 EXTERNAL JOBP,AVALTB,REQTAB,QUANTS\r
112 \r
113 DEFINE X(A,B)\r
114 <       EXTERNAL A'AVAL,A'REQ,A'QUNT\r
115         INTERNAL A'Q\r
116         A'Q=ZZ\r
117         ZZ=ZZ+1\r
118 >\r
119         ZZ=0\r
120         QUEUES\r
121         LOC=ZZ\r
122 \r
123 >\r
124 IFE FTCHECK+FTMONP,<\r
125 ;APPROPRIATE ENTRY IS NON-ZERO WHEN SCHEDULER SHOULD LOOK\r
126 ;AT THAT QUEUE TO FIND A JOB TO RUN\r
127 ;WSAVAL CONTAINS THE NO. OF JOBS WITH IO WAIT SATISFIED(0=NONE)\r
128 ;SIMILARLY FOR TSAVAL\r
129 \r
130 \r
131 DEFINE X(A,B)\r
132 <       INTERNAL A'AVAL,A'Q\r
133         A'Q=.-AVALTB\r
134                 A'AVAL: 0\r
135 >\r
136 \r
137 INTERNAL AVALTB\r
138 \r
139 AVALTB: QUEUES          ;GENERATE THE AVAL FLAGS\r
140 LOC=.-AVALTB\r
141 >\r
142 \r
143 NQUEUE=LOC              ;NO. OF QUEUES COUNTING RUN QUEUE\r
144 XP MAXQ,NQUEUE-1        ;MAX STATE CODE WHICH HAS A QUEUE\r
145 \r
146 ;DEFINE STATE CODES WHICH DO NOT HAVE QUEUES ASSOCIATED WITH THEM\r
147 \r
148 \r
149 DEFINE X(A)\r
150 <       INTERNAL A'Q\r
151         A'Q=LOC\r
152         LOC=LOC+1\r
153 >\r
154 \r
155         CODES\r
156 \fIFE FTCHECK+FTMONP,<\r
157 ;LAST JOB SCHEDULED FOR EACH QUEUE\r
158 \r
159 JOBP:   REPEAT NQUEUE,<         EXP 1>\r
160 \f\r
161 ;SHARABLE DEVICE REQUEST TABLE(GENERALIZED FOR OTHER QUEUES TOO)\r
162 ;CONTAINS THE NUMBER OF JOBS WAITING TO USE SHARABLE DEVICE\r
163 ;WSREQ AND RNREQ ARE UNUSED\r
164 \r
165 DEFINE X(A,B)\r
166 <       A'REQ:  0\r
167         INTERNAL A'REQ\r
168 >\r
169 \r
170 INTERNAL REQTAB\r
171 \r
172 REQTAB: QUEUES\r
173 \r
174 \f;QUANTUM RUNNING TIME FOR EACH QUEUE IN JIFFIES(CLOCK TICKS)\r
175 \r
176 DEFINE X(A,B)\r
177 <       A'QUNT: EXP B\r
178         INTERNAL A'QUNT\r
179 >\r
180 \r
181 QUANTS: QUEUES\r
182 >\r
183         END,\r