* MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 1 0001 * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 0002 * 0003 * THIS PROGRAM WAS MADE TO TEST ON THE H316 EMULATOR IN A MULTI THREADING 0004 * STRUCTURE: 0005 * - THE BASIC INTERRUPT HANDLING MECHANISM OF SIMH-H316, 0006 * - THE REAL TIME CLOCK, 0007 * - THE INTERRUPT HANDLING OF THE TTY 0008 * - THE INTERRUPT HANDLING OF THE PTR AND PTP 0009 * 0010 * THE TEST PROGRAM IS BUILT AS A SMALL EXECUTIVE LIKE THE ONES WHICH WERE 0011 * VERY POPULAR ON MINICOMPUTERS IN THE LATE SIXTIES AND IT IS STRUCTURED IN 0012 * 3 RINGS: 0013 * 0014 * RING-0: INTERRUPT HANDLING 0015 * RING-1: INTERRUPT INITIATION, SERVICE PRIMITIVES, TASK SCHEDULING 0016 * RING-2: PROGRAM TASKS/TESTING PROGRAMS 0017 * 0018 * THE RINGS ARE NOT PROTECTED FROM EACH OTHER, AND ALL CODE OF THE 3 RINGS 0019 * MUST RUN IN THE LOWEST 16K MEMORY BLOCK (NO EXTENDED ADDRESSING IS SUPPORTED). 0020 * THE KERNEL (RING-0 AND RING-1) WITHOUT EXTENTIONS, TAKES A SINGLE MEMORY 0021 * SECTOR (EXCEPT TABLE SPACE) AND ITS DEFAULT LOCATION IS THE HIGHEST SECTOR 0022 * IN THE 1ST 16K MEMORY BLOCK. 0023 * 0024 * A COMPLETE SYSTEM CONSISTS OF AT LEAST 3 MODULES: 0025 * - THE KERNEL (THIS FILE) 0026 * - THE FILE CONTAINING THE CONFIGURATION DATA AND TABLES: MTK16-CONFIG 0027 * - ONE OR MORE FILES WITH CODE OF THE TASKS 0028 * THE ASSEMBLED OBJECT CODE OF THE MODULES MUST BE LINKED TOGETHER TO OBTAIN 0029 * A LOADABLE AND WORKING SYSTEM. 0030 * 0031 * HONEYWELL X16 16 BIT COMPUTER SOFTWARE 0032 * MTK16 IS CREATED BY THEO ENGEL (THEO.ENGEL@HETNET.NL) 0033 * 0034 * SERVICE PRIMITIVES FOR TASKS RUNNING IN RING-2 0035 SUBR SLEEP,SLEP SET TIMER 0036 SUBR ATTW ATTACH DEVICE (BLOCKING) 0037 SUBR ATT ATTACH DEVICE (NON-BLOCKING) * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 2 0038 SUBR REL RELEASE DEVICE 0039 SUBR ASRI READ CHAR FROM TTY 0040 SUBR ASRO PRINT CHAR ON TTY 0041 SUBR PTRI READ CHAR FROM HSR 0042 SUBR PTPO PUNCH CHAR ON PTP 0043 SUBR WAIT WAIT FOR AN EVENT 0044 SUBR SIGNAL,SIG SIGNAL AN EVENT 0045 SUBR REVENT,RSEV RESET AN EVENT 0046 SUBR EXEW EXEC A TASK (BLOCKING) 0047 SUBR EXE EXEC A TASK (NON-BLOCKING) 0048 SUBR EXIT EXIT CURRENT TASK 0049 SUBR KILL KILL ANOTHER TASK 0050 SUBR YIELD,YIEL SWITCH TO NEXT READY TASK 0051 SUBR PAUSE,PA SUSPEND ANOTHER TASK 0052 SUBR RESUME,RESU RESUME A SUSPENDED TASK 0053 * 0054 * SCHEDULER ENTRY POINTS FOR RING-1 CODE 0055 SUBR SKED SCHEDULER ENTRY POINT AFTER INITIALIZATION 0056 SUBR RESH ENABLE INTERRUPT AND SCHEDULE THE NEXT READY TASK 0057 SUBR BLOK SET WAITING FOR EVENT; SCHEDULE THE NEXT READY TASK 0058 SUBR BUSY SET PENDING FOR CONDITION; SCHEDULE NEXT READY TASK 0059 SUBR SAVE INHIBIT INTERRUPT AND SAVE CPU STATE IN TCB 0060 * 0061 * OTHER ENTRIES/LOCATIONS 0062 SUBR ILINK,LINK INTERRUPT SERVICE ENTRY POINT ADDRESS 0063 SUBR ISKPCH,INSC RETURN ADDRESS TO INTERNAL INTERRUPT SKIP CHAIN 0064 SUBR IBACK,BACK RETURN ADDRESS FOR AN EXTERNAL INTERRUPT HANDLER 0065 SUBR T POINTER TO TCB OF CURRENT RUNNING TASK 0066 SUBR DEVS ALLOCATED DEVICES 0067 SUBR KSTR BEGIN ADDRESS OF BASIC KKERNEL ADDRESS RANGE 0068 SUBR KEND END ADDRESS OF BASIC KKERNEL ADDRESS RANGE 0069 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 3 0070 * MTK16 CAN BE LOADED ANYWHERE IN THE LOWEST 16K WORD BLOCK. HOWEVER TO 0071 * PREVENT USE OF CROSS SECTOR REFERENCES, THE PREFERED LOCATION IS TO START 0072 * LOADING MTK16 AT A SECTOR BOUNDARY. THE CODE OF THE BASIC 0073 * KERNEL FITS WITHIN A SINGLE SECTOR. 0074 ORG '17000 DEFAULT START ADDRESS (LAST SECTOR 8K) 0075 017000 KSTR EQU * BEGIN ADDRESS OF BASIC KKERNEL ADDRESS RANGE 0076 ********************************************************** 0077 * RING-0, INTERRUPT HANDLERS FOR CLOCK, TTY, PTR AND PTP * 0078 ********************************************************** 0079 17000 0 017001 LINK DAC *+1 POINTER TO INTERRUPT SERVICE ENTRY POINT 0080 * 0081 * INTERRUPT ENTERS HERE 0082 17001 0 00 00000 *** ** INTERRUPT SERVICE ENTRY POINT 0083 17002 0 04 17221 STA SA SAVE A 0084 17003 0 15 17222 STX SX SAVE X 0085 17004 000043 INK 0086 17005 0 04 17223 STA SK SAVE KEYS 0087 * CHECK FOR A CLOCK INTERRUPT 0088 17006 34 0020 SKS '20 0089 17007 0 01 17022 JMP CLCK RTC INTERRUPT SERVICE ROUTINE 0090 * CHECK FOR A PTR INTERRUPT 0091 17010 34 0401 SKS '401 0092 17011 0 01 17105 JMP PTI PAPERTAPE READER INTERRUPT SERVICE ROUTINE 0093 * CHECK FOR A PTP INTERRUPT 0094 17012 34 0402 SKS '402 0095 17013 0 01 17125 JMP PTO PAPERTAPE PUNCHER INTERRUPT SERVICE ROUTINE 0096 * CHECK FOR A TTY INTERRUPT 0097 17014 34 0404 SKS '404 0098 17015 0 01 17144 JMP TTY TTY INTERRUPT SERVICE ROUTINE 0099 * 0100 * TO EXTERNAL SKIP CHAIN (SKIP CHAIN EXTENSION) 0101 * VIA THE EXTERNAL SKIP CHAIN, ADDITIONAL EXTERNAL INTERRUPT SERVICE 0102 * ROUTINES CAN BE ADDED TO THE KERNEL. 0103 * 0104 17016 -0 01 17021 JMP* EXSC 0105 * THE EXTERNAL INTERRUPT SKIP CHAIN HAS TO RETURN TO HERE. * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 4 0106 * NO RTC, TTY, PTR, PTP (OR OTHER ALLOWED) INTERRUPT, SO ERROR 0107 * 0108 17017 000000 INSC HLT ********** ERROR STOP ************* 0109 17020 0 01 17017 JMP *-1 0110 17021 0 000000 EXSC XAC ESKPCH EXTERNAL SKIP CHAIN ENTRY POINT 0111 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 5 0112 *****RTC INTERRUPT 0113 000061 RTC EQU '61 CLOCK LOCATION 0114 * RELOAD THE RTC LOCATION AND RESET THE CLOCK 0115 17022 0 02 17224 CLCK LDA TICK RESET CLOCK VALUE FOR GETTING THE NEXT TICK 0116 17023 0 04 00061 STA RTC INTERRUPT 0117 17024 14 0020 OCP '20 RESET CLOCK INTERRUPT 0118 * UPDATE USED TIMERS 0119 17025 0 35 17237 LDX PTIM POINTER TO TIMERTABLE, X = POINTER TO TIMER(EVENT) 0120 17026 -0 02 00000 CKC LDA* 0 TCB ADDRESS, THEN TIMER USED (OR TABLE END) 0121 17027 0 04 17220 STA TEM0 SAVE TCB ADDRESS IF THERE 0122 17030 101040 SNZ 0123 17031 0 01 17044 JMP NXC NO, TCB FIELD EMPTY, SO FREE; CHECK NEXT TIMER 0124 17032 141206 AOA 0125 17033 101040 SNZ 0126 17034 0 01 17047 JMP BACK TABLE END 0127 * ACTIVE TIMER 0128 17035 1 12 00001 IRS 1,1 INCREMENT TIME VALUE 0129 17036 0 01 17044 JMP NXC GO TO NEXT TIMER 0130 * TIMER DUE; AWAKE SLEEPING TASK 0131 17037 -0 02 17220 LDA* TEM0 STATE 0132 17040 140100 SSP 0133 17041 -0 04 17220 STA* TEM0 RESET BLOCKED-BIT IN STATE OF WAITING TASK 0134 17042 140040 CRA 0135 17043 -0 04 00000 STA* 0 DISCONNECT TIMER FROM THREAD (FREE TIMER) 0136 * GO TO NEXT TIMER 0137 17044 0 12 00000 NXC IRS 0 0138 17045 0 12 00000 IRS 0 0139 17046 0 01 17026 JMP CKC X = POINTER TO NEXT TIMER 0140 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 6 0141 ********************************************************************* 0142 * END OF INTERRUPT HANDLER * 0143 ********************************************************************* 0144 * INTERRUPT HANDLERS MUST END THEIR PROCESSING WITH A JUMP TO THIS 0145 * ENTRY POINT: 0146 * LEAVE THE INTERRUPT STATE, RELOAD CPU STATE, ENABLE INTERRUPT AND BACK 0147 * TO INTERRUPTED PROGRAM 0148 017047 BACK EQU * 0149 * 0150 * RING-1 (SCHEDULER+PRIMITIVES) IS NOT REENTRANT AND AT LEAST IN PART OF RING-1 0151 * THE INTERRUPT IS ENABLED. SO IT IS NOT ALLOWED TO ENTER FOR HERE RING-1 IF 0152 * THE INTERRUPT HAPPENED DURING PROCESSING OF RING-1 CODE. IT IS HOWEVER ALLOWED 0153 * TO ENTER THE SCHEDULER WHEN RING-2 CODE WAS EXECUTED DURING THE INTERRUPT. 0154 * MOST SIMPLE IS TO JUST RETURN TO THE INTERRUPTED CODE AFTER AN INTERRUPT 0155 * SERVICE. TO ENABLE HOWEVER IS SIMPLE FORM OF CLOCK PREEMPTION THERE IS AN 0156 * OPTION (WHEN THE PREEMPT FLAG IS SET) TO ENTER THE SCHEDULER AFTER PROCESSING 0157 * AN INTERRUPT WHICH HAPPENED DURING EXECUTION OF RING-2 CODE. 0158 * 0159 17047 -0 02 17102 LDA* PREE PREEMPT FLAG SET? 0160 17050 101040 SNZ 0161 17051 0 01 17074 JMP RET 0162 * PREEMPTION FLAG IS SET. IS IT ALLOWED TO GO TO THE SCHEDULER? 0163 * CHECK WHETHER ADDRESS WHERE CODE IS INTERRUPTED IS WITHIN RING-1. 0164 * IF NO THEN IT IS ALLOWED TO ENTER THE SCHEDULER. 0165 17052 0 02 17001 LDA LINK+1 ADDRESS WHERE CODE IS INTERRUPTED 0166 17053 -0 11 17104 CAS* XEND END OF MTK16 PROTECTED RANGE OF ADDRESSES 0167 17054 0 01 17061 JMP R2 GT 0168 17055 101000 NOP 0169 17056 -0 11 17103 CAS* XSTR START OF MTK16 PROTECTED RANGE OF ADDRESSES 0170 17057 101000 NOP 0171 17060 0 01 17074 JMP RET INTERRUPT WITHIN RING-1 0172 * INTERRUPT NOT IN RING-1; ENTER SCHEDULER 0173 17061 0 35 17677 R2 LDX T TCB ADDRESS OF CURRENT TASK 0174 17062 000201 IAB 0175 17063 1 04 00003 STA B,1 SAVE B 0176 17064 0 02 17221 LDA SA * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 7 0177 17065 1 04 00002 STA A,1 SAVE A 0178 17066 0 02 17223 LDA SK 0179 17067 1 04 00005 STA KEYS,1 SAVE KEYS 0180 17070 0 02 17222 LDA SX 0181 17071 1 04 00004 STA X,1 SAVE X 0182 17072 000201 IAB A = LINK+1 0183 17073 0 01 17743 JMP BUSY+2 0184 * 0185 17074 0 02 17223 RET LDA SK 0186 17075 171020 OTK RESTORE KEYS 0187 17076 0 35 17222 LDX SX RESTORE X 0188 17077 0 02 17221 LDA SA RESTORE A 0189 17100 000401 ENB 0190 17101 -0 01 17001 JMP* LINK+1 0191 * 0192 17102 0 000000 PREE XAC PREEMT POINTS TO PREEMPT FLAG LOCATION IN MTK16-TAB 0193 17103 0 000000 XSTR XAC MTKSTR RING-1 CODE START ADDRESS (MTK16-TAB) 0194 17104 0 000000 XEND XAC MTKEND RING-1 CODE END ADDRESS (MTL16-TAB) 0195 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 8 0196 *****PTR INTERRUPT 0197 17105 54 1001 PTI INA '1001 CLEAR A AND INPUT CHARACTER, RESET INTERRUPT 0198 17106 000000 HLT 0199 17107 14 0101 OCP '101 STOP READER 0200 17110 0 04 17220 STA TEM0 SAVE OCTAD READ 0201 17111 0 02 17234 LDA EVPI TCB ADDRESS OF TASK WAITING FOR CHARACTER 0202 17112 101040 SNZ 0203 17113 0 01 17047 JMP BACK INTERRUPT, BUT NO EVENT DECLARED (TASK KILLED?) 0204 17114 0 04 00000 STA 0 X = TCB ADDRESS OF TASK WAITING FOR CHARACTER 0205 17115 0 02 17220 LDA TEM0 0206 17116 1 04 00002 STA A,1 STORE CHAR IN A-REG OF WAITING TASK 0207 17117 -0 02 17234 LDA* EVPI STATE 0208 17120 140100 SSP 0209 17121 -0 04 17234 STA* EVPI RESET BLOCKED-BIT IN STATE OF WAITING TASK 0210 17122 140040 CRA 0211 17123 0 04 17234 STA EVPI DISCONNECT PTR INTERRUPT HANDLER FROM TASK 0212 17124 0 01 17047 JMP BACK EXIT FROM PTR INTERRUPT 0213 * 0214 *****PTP INTERRUPT 0215 17125 0 02 17236 PTO LDA EVPO TCB ADDRESS OF TASK WAITING FOR CHARACTER 0216 17126 101040 SNZ 0217 17127 0 01 17142 JMP POFF INTERRUPT, BUT NO EVENT DECLARED => POWEROFF 0218 17130 0 04 00000 STA 0 0219 17131 1 02 00002 LDA A,1 GET CHAR TO PUNCH 0220 17132 74 0002 OTA 2 PUNCH CHAR, RESET INTERRUPT 0221 17133 000000 HLT 0222 17134 -0 02 17236 LDA* EVPO STATE 0223 17135 140100 SSP 0224 17136 -0 04 17236 STA* EVPO RESET BLOCKED-BIT IN STATE OF WAITING TASK 0225 17137 140040 CRA 0226 17140 0 04 17236 STA EVPO DISCONNECT PTR INTERRUPT HANDLER FROM TASK 0227 17141 0 01 17047 JMP BACK EXIT FROM PTP INTERRUPT 0228 17142 14 0102 POFF OCP '102 POWER OFF, RESET INTERRUPT 0229 17143 0 01 17047 JMP BACK EXIT FROM PTP INTERRUPT 0230 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 9 0231 *****TTY INTERRUPT 0232 17144 0 02 17376 TTY LDA MODE 0233 17145 100100 SLZ INPUT MODE? 0234 17146 0 01 17205 JMP OMOD NO, OUTPUT MODE 0235 * TTY IN INPUT MODE 0236 17147 54 1004 INA '1004 INPUT CHARACTER, RESET INTERRUPT 0237 17150 000000 HLT 0238 17151 0 04 17220 STA TEM0 SAVE 0239 17152 0 07 17225 SUB ESC ESCAPE ? 0240 17153 100040 SZE 0241 17154 0 01 17171 JMP TI NO ESCAPE 0242 * ESCAPE! ATTENTION HANDLER REQUEST? 0243 17155 0 02 17232 LDA ATTH AN ATTENTION HANDLER ACTIVE? 0244 17156 100040 SZE 0245 17157 0 01 17171 JMP TI YES; SO DISCARD ESC 0246 17160 0 02 17231 LDA EVAT NO HANDLER ACTIVE; CHECK ATTENTION HANDLER EVENT 0247 17161 101040 SNZ ATTENTION HANDLER WAITING FOR THIS EVENT? 0248 17162 0 01 17171 JMP TI CHAR IS NOT FOR A WAITING ATTENTION HANDER 0249 17163 0 04 17232 STA ATTH YES; SET ATTENTION HANDLER ACTIVATED FLAG (=TCB) 0250 17164 0 02 17776 LDA =1 ATTENTION EVENT IGNORES THE PAUSE STATE 0251 17165 -0 04 17231 STA* EVAT RESET BLOCKED-BIT OF TASK WAITING FOR ATTENTION. 0252 17166 140040 CRA CLEAR ATTENTION EVENT AND 0253 17167 0 04 17231 STA EVAT DISCONNECT TTY INTERRUPT HANDLER FROM TASK 0254 17170 0 01 17047 JMP BACK EXIT FROM TTY INTERRUPT 0255 * CHAR REQUESTED BY A TASK WAITING FOR INPUT? 0256 17171 0 02 17227 TI LDA EVTY TASK WAITING FOR A TTY EVENT? 0257 17172 101040 SNZ 0258 17173 0 01 17047 JMP BACK NO, EXIT FROM TTY INTERRUPT 0259 * YES, A TASK IS WAITING FOR INPUT 0260 17174 0 04 00000 STA 0 X = TCB ADDRESS OF TASK WAITING FOR INPUT 0261 17175 0 02 17220 LDA TEM0 READ CHARACTER 0262 17176 1 04 00002 STA A,1 STORE IN A REG OF WAITING TASK 0263 17177 -0 02 17227 EXTY LDA* EVTY STATE 0264 17200 140100 SSP 0265 17201 -0 04 17227 STA* EVTY RESET BLOCKED-BIT IN STATE OF WAITING TASK 0266 17202 140040 CRA CLEAR TTY EVENT AND * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 10 0267 17203 0 04 17227 STA EVTY DISCONNECT TTY INTERRUPT HANDLER FROM TASK 0268 17204 0 01 17047 JMP BACK EXIT FROM TTY INTERRUPT 0269 * TTY IN OUTPUT MODE 0270 17205 0 02 17227 OMOD LDA EVTY TASK WAITING FOR A TTY EVENT? 0271 17206 101040 SNZ 0272 17207 0 01 17215 JMP RSTY NO CHARS TO PRINT ANYMORE; RESET INTERRUPT 0273 * YES, TASK WAITING FOR OUTPUT 0274 17210 0 04 00000 STA 0 X = TCB ADDRESS OF TASK WAITING FOR OUTPUT 0275 17211 1 02 00002 LDA A,1 GET CHARACTER TO PRINT 0276 17212 74 0004 OTA 4 PRINT CHAR, RESET INTERRUPT 0277 17213 000000 HLT 0278 17214 0 01 17177 JMP EXTY 0279 * RESET THE INTERRUPT BY SWITCHING THE TTY TO INPUT 0280 17215 14 0004 RSTY OCP 4 NO OUTPUT REQUEST, RESET TTY INTERRUPT 0281 17216 0 04 17376 STA MODE MODE = 0, INPUT MODE 0282 17217 0 01 17047 JMP BACK AND RETURN 0283 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 11 0284 * 0285 * WORKING STORAGE RING-0 0286 ************************ 0287 * 0288 17220 000000 TEM0 OCT 0 TEMPORARY FOR RING-0 0289 17221 000000 SA OCT 0 SAVE A 0290 17222 000000 SX OCT 0 SAVE X 0291 17223 000000 SK OCT 0 SAVE KEYS 0292 17224 177773 TICK DEC -5 RTC CLOCK PULSES PER TICK 0293 17225 000233 ESC OCT 233 ATTENTION KEYCODE 0294 * 0295 * TTY READ/PRINT EVENT 0296 17226 0 017227 PVTY DAC *+1 POINTER TO TTY EVENT 0297 17227 000000 EVTY OCT 0 TCB ADDRESS OF TASK WAITING FOR TTY EVENT 0298 * 0 WHEN NO TASK IS WAITING FOR AN TTY EVENT 0299 * TTY ATTENTION HANDLER EVENT 0300 17230 0 017231 PVAT DAC *+1 POINTER TO ATTENTION EVENT 0301 17231 000000 EVAT OCT 0 TCB ADDRESS OF TASK WAITING FOR ATTENTION EVENT 0302 * 0 WHEN NO TASK IS WAITING FOR AN ATTENTION EVENT 0303 17232 000000 ATTH OCT 0 TCB ADDRESS OF ATTENTION HANDLER IF ATTENTION 0304 * HANDLER ACTIVE; ELSE 0 0305 * 0306 * PTR EVENT 0307 17233 0 017234 PVPI DAC *+1 POINTER TO PTR EVENT 0308 17234 000000 EVPI OCT 0 TCB ADDRESS OF TASK WAITING FOR PTR EVENT 0309 * 0 WHEN NO TASK IS WAITING FOR AN PTR EVENT 0310 * PTP EVENT 0311 17235 0 017236 PVPO DAC *+1 POINTER TO PTP EVENT 0312 17236 000000 EVPO OCT 0 TCB ADDRESS OF TASK WAITING FOR PTP EVENT 0313 * 0 WHEN NO TASK IS WAITING FOR AN PTP EVENT 0314 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 12 0315 *************************************************************** 0316 * RING-1: THE SERVICE PRIMITIVES FOR RING-2 AND THE SCHEDULER * 0317 *************************************************************** 0318 * RING-2 ENTERING RING-1: T POINTS TO THE TCB OF THE CURRENT TASK. 0319 * THE RING-1 PRIMITIVES ARE NOT REENTRANT: RING-1 CODE IS NOT ALLOWED TO CALL 0320 * RING-1 PRIMITIVES AND, BECAUSE THE INTERRUPT IS ENABLED IN PARTS OF RING-1 0321 * AND WHEN RING-1 IS ENTERED, ALSO RING-0 IS NOT ALLOWED TO USE RING-1 0322 * PRIMITIVES. (E.G. THE PRIMITIVE'S CALL ADDRESS COULD BE OVERWRITTEN). 0323 * THE MAIN CONSEQUENCE OF THIS DESIGN IS THAT RING-0, AFTER HANDLING AN 0324 * INTERRUPT, IS NOT ALLOWED TO GO TO THE SCHEDULER. 0325 * AFTER INTERRUPT COMPLETION, RING-0 HAS JUST TO RESUME AT THE 0326 * LOCATION WERE THE PROCESSING WAS INTERRUPTED (EITHER ON RING-2 OR RING-1). 0327 * 0328 * TIMER SERVICE (TO BE USED BY RING-2) 0329 *************** 0330 * 0331 * POINTER TO THE TABLE WITH TIMERS 0332 17237 0 000000 PTIM XAC CTAB POINTER TO TIMER TABLE 0333 * 0334 * EACH TIMER CONSISTS OF TWO WORDS: 0335 * WORD1 = POINTER TO TCB OF TASK WAITING FOR THIS TIMER (TIMER EVENT) 0336 * A TIMER IS FREE WHEN THE POINTER VALUE IS 0 0337 * WORD2 = - THE TIMER VALUE IN TICKS OF 0.1 SEC 0338 * 0339 * TIMERS ARE DEFINED IN THE TIMER TABLE CTAB. IF A TASK REQUESTS A TIMER 0340 * SERVICE, A FREE TIMER IS ALLOCATED AND CONNECTED TO THE TASK. A TIMER IS 0341 * LINKED TO A TASK BY EXECUTING: 0342 * CALL SLEEP 0343 * OCT (A TICK IS 0.1 SEC) 0344 * WITH THIS CALL, THE TASK SLEEPS FOR THE SPECIFIED TIME AND IS RESTARTED 0345 * AFTER THE TIMER IS DUE. THE TIMER IS RELEASED. 0346 * 0347 17240 0 000000 SLEP DAC ** 0348 17241 0 10 17745 JST SAVE SAVE CPU STATE 0349 * LOOK FOR A FREE TIMER 0350 17242 0 35 17237 ST LDX PTIM POINTER TO TIMER * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 13 0351 17243 -0 02 00000 LDA* 0 TCB ADDRESS? 0352 17244 101040 SNZ 0353 17245 0 01 17254 JMP FRTI NO, SO A FREE TIMER FOUND 0354 17246 141206 AOA 0355 17247 101040 SNZ 0356 17250 000000 HLT END OF TABLE, STOP, TO FEW TIMERS DEFINED 0357 17251 0 12 00000 IRS 0 0358 17252 0 12 00000 IRS 0 POINTER TO NEXT TIMER 0359 17253 0 01 17243 JMP ST+1 0360 * SET THE TIMER (X = TIMER ADDRESS) 0361 17254 -0 02 17240 FRTI LDA* SLEP STORE TICK VALUE 0362 17255 140407 TCA 0363 17256 1 04 00001 STA 1,1 INTO TIMER 0364 17257 0 02 17677 LDA T 0365 17260 -0 04 00000 STA* 0 STORE TCB ADDRESS OF SLEEPING TASK IN TIMER 0366 17261 0 02 00000 LDA 0 EVENT ADDRESS 0367 17262 0 01 17733 JMP BLOK BLOCK THE TASK AND RESCHEDULE 0368 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 14 0369 * DEVICE MANAGEMENT SERVICES (TO BE USED BY RING-2) 0370 **************************** 0371 * 0372 * ATTACH DEVICE(S) CALLING SEQUENCE: 0373 * CALL ATTW (BLOCKING) 0374 * DAC TTY ATTENTION HANDLER 0375 * OR 0376 * CALL ATTW (BLOCKING) 0377 * OCT DEV (ONE OR MORE DEVICES; BITS 9-16) 0378 * OR 0379 * CALL ATT (NON BLOCKING) 0380 * OCT DEV (ONE OR MORE DEVICES; BITS 9-16) 0381 * *** *** NO SUCCESS RETURN 0382 * *** *** SUCCESS RETURN 0383 * 0384 17263 000000 DEVS OCT 0 GLOBAL DEVICE ATTACHEMENT STATE 0385 * 0386 * BIT ALLOCATION IN DEVS FOR 8 DEVICES MAX. 0387 * BITS 9-13 FREE 0388 * BIT 14 PTP 0389 * BIT 15 PTR 0390 * BIT 16 TTY 0391 * 0392 **** ATTW - BLOCKING REQUEST 0393 17264 0 000000 ATTW DAC ** 0394 17265 0 10 17745 JST SAVE SAVE CPU STATE 0395 17266 -0 02 17264 LDA* ATTW 0396 17267 141044 CAR DEVICE MASK, BITS 9-16 = 0 0397 17270 101040 SNZ 0398 17271 0 01 17304 JMP DATT DEVICE ATTACH 0399 * SPECIAL REQUEST: ATTENTION HANDLER REQUEST FOR THE TTY 0400 17272 0 02 17231 LDA EVAT OTHER TASK IS ALREADY WAITING FOR AN ATTENTION 0401 17273 101040 SNZ EVENT. WAIT 0402 17274 0 01 17277 JMP IDL NO, SO PROCEED 0403 * AN ATTENTION HANDLER IS ACTIVE, OR REQUESTED DEVICE(S) ALREADY ATTACHED 0404 17275 0 02 17264 TBUS LDA ATTW BACK TO RING-2, BUSY WAITING * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 15 0405 17276 0 01 17741 JMP BUSY UNTIL RELEASED BY OTHER TASKS 0406 * 0407 * ATTACH ATTENTION HANDLER 0408 17277 -0 02 17264 IDL LDA* ATTW ATTW POINTS TO ATTENTION HANDLER ADDRESS 0409 17300 1 04 00001 STA LABL,1 SAVE AS TASK CONTINUATION ADDRESS 0410 17301 0 15 17231 STX EVAT ATTACH TASK TO ATTENTION EVENT (RING-0) 0411 17302 0 02 17230 LDA PVAT SET TASK WAITING FOR ATTENTION EVENT 0412 17303 0 01 17733 JMP BLOK BLOCK THE TASK, SAVE ITS STATE AND SCHEDULE 0413 * ATTACH 'NORMAL' DEVICES 0414 17304 0 02 17263 DATT LDA DEVS ARE THE REQUESTED DEVICES FREE ? 0415 17305 -0 03 17264 ANA* ATTW 0416 17306 100040 SZE 0417 17307 0 01 17275 JMP TBUS REQUESTED DEV(S) NOT FREE, WAIT FOR RELEASE 0418 * 0419 * UPDATE THE DEVICE STATUS (FOR ATTACH/RELEASE) 0420 * 0421 17310 1 02 00010 UDEV LDA DEV,1 0422 17311 -0 05 17264 ERA* ATTW 0423 17312 1 04 00010 STA DEV,1 SET THE DEVICES ATTACHED/RELEASED IN TASK 0424 17313 0 02 17263 LDA DEVS 0425 17314 -0 05 17264 ERA* ATTW 0426 17315 0 04 17263 STA DEVS SET THE DEVICES ATTACHED/RELEASED GLOBALLY 0427 17316 0 01 17713 JMP RESH EXIT, RESCHEDULE 0428 * 0429 **** ATT - NON BLOCKING REQUEST 0430 17317 0 000000 ATT DAC ** 0431 17320 0 10 17745 JST SAVE SAVE CPU STATE 0432 17321 0 02 17263 LDA DEVS CHECK WHETHER THE REQUESTED DEVICES ARE FREE 0433 17322 -0 03 17317 ANA* ATT 0434 17323 100040 SZE 0435 17324 0 01 17713 JMP RESH REQUESTED DEV(S) NOT FREE, NO SUCCESS RETURN 0436 * REQUESTED DEVICES ARE FREE, SO CAN BE ATTACHED 0437 17325 1 12 00001 SUC IRS LABL,1 SET CONTINUATION ADDRESS (SUCCESS RETURN) 0438 17326 0 02 17317 LDA ATT MOVE POINTER 0439 17327 0 04 17264 STA ATTW 0440 17330 0 01 17310 JMP UDEV AND UPDATE THE DEVICE STATUS 0441 * * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 16 0442 **** RELEASE DEVICE(S), CALLING SEQUENCE: 0443 * CALL REL 0444 * OCT DEV (ONE OR MORE DEVICES) 0445 * 0446 * A RELEASE WITH OCT 0 RELEASES THE TTY OF AN ACTIVE ATTENTION HANDLER 0447 * (ACTIVATED BY THE ATTENTION EVENT). WITH THIS RELEASE THE ATTENTION 0448 * HANDLER BECOMES A NORMAL TASK, WHICH CAN ATTACH/RELEASE THE TTY IN THE 0449 * STANDARD WAY. 0450 * 0451 * ONLY A TASK WHICH ATTACHES A DEVICE IS ALLOWED TO RELEASE THAT DEVICE 0452 * 0453 17331 0 000000 REL DAC ** 0454 17332 0 10 17745 JST SAVE SAVE CPU STATE 0455 17333 -0 02 17331 LDA* REL 0456 17334 100040 SZE RELEASE ATTENTION HANDLER TTY? 0457 17335 0 01 17344 JMP NR NO 0458 * RELEASE THE ATTENTION HANDLER TTY 0459 17336 0 02 17232 LDA ATTH ATTENTION HANDLER ACTIVE? 0460 17337 0 07 00000 SUB 0 TCB ADDRESS CURRENT TASK 0461 17340 100040 SZE 0462 17341 0 01 17344 JMP NR THIS TASK IS NOT THE ATTENTION HANDLER 0463 * ATTENTION HANDLER ACTIVE, AND THIS TASK IS THE ATTENTION HANDLER 0464 17342 0 04 17232 STA ATTH MAKE ATTENTION HANDLER INACTIVE, WHICH MAKES 0465 17343 0 01 17713 JMP RESH THE TTY AVAILABLE FOR OTHER TASKS 0466 * NORMAL DEVICE RELEASE 0467 17344 1 02 00010 NR LDA DEV,1 ATTACHED DEVICES 0468 17345 -0 03 17331 ANA* REL 0469 17346 -0 05 17331 ERA* REL 0470 17347 100040 SZE 0471 * TASK TRIES TO RELEASE A NOT ATTACHED DEVICE 0472 17350 000000 HLT ********** ERROR STOP ********** 0473 * GENERAL DEVICE RELEASE 0474 17351 0 02 17331 LDA REL MOVE POINTER 0475 17352 0 01 17327 JMP SUC+2 AND UPDATE THE DEVICE STATUS 0476 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 17 0477 * TTY SERVICES (TO BE USED BY RING-2) 0478 ************** 0479 * 0480 * THE TTY IS A HALFDUPLEX DEVICE USED FOR EITHER INPUT OR OUTPUT, SO IT 0481 * IS NOT A STATELESS DEVICE. THE CONTROL UNIT HOWEVER SHARES A SINGLE 0482 * INTERRUPT FOR INPUT AND OUTPUT AND IS NOT ABLE TO REPORT ITS STATE TO 0483 * THE PROGRAM. SO THE PROGRAM HAS TO MAINTAIN THE TTY STATE. 0484 * 0485 * IN THIS PROGRAM THE FOLLOWING TTY STATES ARE DISTINGUISHED (MAINTAINED 0486 * IN A 16 BIT WORD 'MODE': 0487 * - INPUT MODE: 0488 * 'MODE' INPUT: 0000000000000000 0489 * ONE OR MORE CHARACTERS CAN BE READ FROM THE TTY (CHAR BY CHAR WITH 0490 * 'ASRI'). THE TTY REMAINS IN THIS MODE UNTIL SWITCHED TO 'OUTPUT'. 0491 * - OUPUT MODE: 0492 * 'MODE' OUTPUT: 0000000000000001 0493 * ONE OR MORE CHARACTERS ARE PRINTED ON THE TTY (CHAR BY CHAR WITH 0494 * 'ASRO'). WHEN NO CHARACTERS ARE DELIVERED FOR PRINTING, THE TTY IS 0495 * SWITCHED TO INPUT MODE (AND PHYSICAL SWITCHED TO INPUT TO RESET THE 0496 * LAST OUTPUT INTERRUPT) 0497 * 0498 * THE TTY EVENT (EVTY) INDICATES AN IO REQUEST FOR THE TTY. THIS EVENT IS SET 0499 * BY THE ASRI/ASRO ROUTINES. IF AN INTERRUPT OCCORS WHILE THE EVENT IS NOT SET: 0500 * - IN INPUT MODE, WITH AN INA INSTRUCTION THE INTERRUPT IS RESET AND THE 0501 * READ CHARACTER IS DISCARDED 0502 * - IN OUTPUT MODE, THE INTERRUPT IS RESET BY SWITCHING THE TTY TO INPUT WITH 0503 * AN OCP 4 0504 * 0505 * WITH AN INTERRUPT IN INPUT MODE THE TTY EVENT (EVTY) IS OVERRULED BY A 0506 * ATTENTION EVENT (EVAT) IF SET. WHEN THE READ CHARACTER IS AN ESC, THE 0507 * ATTENTION HANDLER IS ACTIVATED AND THE TTY IS REALLOCATED TO THE ATTENTION 0508 * HANDLER. TTY IO OF A TASK TO WHICH THE TTY IS ATTACHED IS STALLED UNTIL 0509 * THE ATTENTION HANDLER EXITS, OR RELEASES THE ATTENTION HANDLING TTY. 0510 * 0511 * TTY PRIMITIVES: 0512 * -ASRI, SETS THE TTY IN INPUT MODE AND INPUTS THE NEXT CHARACTER FOR THE * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 18 0513 * PROGRAM TASK. 0514 * -ASRO, SETS THE TTY IN OUTPUT MODE AND PRINTS THE NEXT CHARACTER FOR THE 0515 * PROGRAM TASK. 0516 * 0517 **** ASRI, READ CHAR FROM TTY; CALLING SEQUENCE: 0518 * CALL ASRI SWITCH TTY INPUT MODE 0519 * *** *** RETURNS HERE WITH THE NEXT CHAR FROM THE TTY IN A-REG 0520 * 0521 * ASRI IS A 'BLOCKING' PRIMITIVE 0522 * 0523 17353 0 000000 ASRI DAC ** 0524 17354 0 10 17745 JST SAVE SAVE CPU STATE, X = T = ADDRESS CURRENT TCB 0525 17355 0 02 17353 LDA ASRI 0526 17356 0 10 17377 JST CHTY CHECK REQUEST AND WAIT FOR NON BUSY TTY 0527 * SWITCH TTY TO INPUT MODE, WHICH RESETS READY 0528 17357 14 0004 OCP 4 SET INPUT MODE 0529 17360 140040 CRA TTY MODE = INPUT MODE 0530 17361 0 01 17370 JMP COEX TO COMMON PART 0531 * 0532 **** ASRO, PRINT CHAR ON TTY; CALLING SEQUENCE: 0533 * LDA CHAR A = CHAR TO PRINT ON TTY 0534 * CALL ASRO SETS TTY IN OUTPUT MODE 0535 * *** *** RETURNS HERE 0536 * 0537 * ASRO IS A 'BLOCKING' PRIMITIVE 0538 * 0539 17362 0 000000 ASRO DAC ** 0540 17363 0 10 17745 JST SAVE X = T = TCB ADDRESS 0541 17364 0 02 17362 LDA ASRO 0542 17365 0 10 17377 JST CHTY CHECK REQUEST AND WAIT FOR NON BUSY TTY 0543 * SWITCH TTY TO OUTPUT MODE (WHICH MAKES THE TTY READY) 0544 17366 14 0104 OCP '104 SET OUTPUT MODE 0545 17367 0 02 17776 LDA =1 TTY MODE = OUTPUT MODE 0546 * 0547 17370 0 04 17376 COEX STA MODE SET TTY MODE + REQUEST BIT 0548 17371 0 02 17362 LDA ASRO POINTER TO JST ASRI/ASRO + 1 0549 17372 1 04 00001 STA LABL,1 SAVE AS TASK CONTINUATION ADDRESS * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 19 0550 17373 0 15 17227 STX EVTY ATTACH TASK TO TTY EVENT (RING-0) AND SET 0551 17374 0 02 17226 LDA PVTY TASK WAITING FOR THIS EVENT 0552 17375 0 01 17733 JMP BLOK BLOCK THE TASK, SAVE ITS STATE AND SCHEDULE 0553 * 0554 17376 000000 MODE OCT 0 TTY MODE STATUS WORD 0555 * 0556 * CHECK WHETHER REQUEST IS FROM ATTENTION HANDLER TASK (OR OTHER TASK) 0557 * AND WAIT FOR TTY IS NOT BUSY. 0558 * WHEN AN ATTENTION HANDLER IS ACTIVE AND THE REQUEST IS THE ATTENTION 0559 * HANDLER, THE HONOR THE REQUEST. 0560 * WHEN AN ATTENTION HANDLER IS ACTIVE AND THE REQUEST IS NOT FROM THE ATTENTION 0561 * HANDLER, DO NOT THE HONOR THE REQUEST. 0562 * WHEN NO ATTENTION HANDLER IS ACTIVE, HONOR THE REQUEST. 0563 17377 0 000000 CHTY DAC ** 0564 17400 0 04 17362 STA ASRO SAVE RETURN ADDRESS 0565 17401 0 02 17232 LDA ATTH ATTENTION HANDLER ACTIVE? 0566 17402 101040 SNZ 0567 17403 0 01 17411 JMP TBU NO, TEST FOR NON BUSY TTY 0568 * ATTENTION HANDLER IS ACTIVE. IF THIS REQUEST IS FROM THE ATTENTION HANDLER 0569 * THEN THE TTY REQUEST CAN BE HONORED. IF THE REQUEST IS NOT FROM THE 0570 * ATTENTION HANDLER, THE THE TASK HAS TO WAIT UNTIL THE TTY IS RELEASED BY 0571 * THE ATTENTION HANDLER 0572 17404 0 07 00000 . SUB 0 IS CURRENT TASK THE ATTENTION HANDLER? 0573 17405 101040 SNZ 0574 17406 0 01 17411 JMP TBU YES, PROCEED 0575 17407 0 02 17362 LDA ASRO REQUEST NOT FROM THE ATTENTION HANDLER, 0576 17410 0 01 17741 JMP BUSY SO WAIT TILL TTY IS RELEASED 0577 17411 0 02 17362 TBU LDA ASRO 0578 17412 34 0104 SKS '104 BACK TO RING-2 IF TTY BUSY 0579 17413 0 01 17741 JMP BUSY TTY BUSY; SET TASK PENDING FOR TTY NOT BUSY 0580 17414 -0 01 17377 JMP* CHTY 0581 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 20 0582 * HIGH SPEED PAPERTAPE SERVICES (TO BE USED BY RING-2) 0583 * 0584 **** PTRI, READ CHARACTER FROM PTR (HIGH SPEED PAPERTAPE READER) 0585 * CALLING SEQUENCE: 0586 * CALL PTRI 0587 * *** *** RETURNS HERE WITH HE NEXT CHAR IN A-REG 0588 * 0589 17415 0 000000 PTRI DAC ** 0590 17416 0 10 17745 JST SAVE SAVE CPU STATE 0591 17417 14 0001 OCP 1 START READER 0592 17420 0 02 17415 LDA PTRI 0593 17421 1 04 00001 STA LABL,1 SET TASK CONTINUATION ADDRESS 0594 17422 0 15 17234 STX EVPI SET PAPERTAPE READER EVENT 0595 17423 0 02 17233 LDA PVPI EVENT ADDRESS 0596 17424 0 01 17733 JMP BLOK AND BLOCK CURRENT TASK 0597 * 0598 **** PTPU, PUNCH CHARACTER FROM PTP (HIGH SPEED PAPERTAPE PUNCHER) 0599 * CALLING SEQUENCE: 0600 * LDA CHAR A = CHAR TO PUNCH 0601 * CALL PTPO 0602 * *** *** RETURNS HERE 0603 * 0604 17425 0 000000 PTPO DAC ** 0605 17426 0 10 17745 JST SAVE SAVE CPU STATE 0606 17427 34 0102 SKS '102 SKIP IF PUNCHER ON 0607 17430 14 0002 OCP 2 PUNCHER ON 0608 17431 0 02 17425 LDA PTPO 0609 17432 1 04 00001 STA LABL,1 SET TASK CONTINUATION ADDRESS 0610 17433 0 15 17236 STX EVPO SET PAPERTAPE PUNCHER EVENT 0611 17434 0 02 17235 LDA PVPO EVENT ADDRESS 0612 17435 0 01 17733 JMP BLOK AND BLOCK CURRENT TASK 0613 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 21 0614 * 0615 * TASK SYNCHRONISATION SERVICES (TO BE USED BY RING-2) 0616 ******************************* 0617 * TWO TYPES OF TASK SYNCHRONISATION ARE SUPPORTED: 0618 * 1) WITH TASK-LINKED EVENTS 0619 * 2) SOFT-EVENTS, OPERATING AS COUNTING SEMAPHORES 0620 * 0621 * TASK-LINKED EVENTS CAN BE USED TO WAIT FOR EXIT OF A SPECIFIC TASK OR ON 0622 * A SIGNAL FROM A SPECIFIC TASK. WHEN A TASK EXECUTES ANOTHER TASK WITH 0623 * THE EXEW PRIMITIVE, THE CALLING TASK IS BLOCKED UNTIL THE EXECUTED TASK 0624 * EXITS, OR PROVIDES A SIGNAL (SIG 0). IF THE TASK IS STARTED WITH THE EXE 0625 * PRIMITIVE, THE CALLING TASK IS NOT BLOCKED, BUT STILL CAN EXECUTE A WAIT 0626 * FOR THE EARLIER STARTED TASK. IN CASE THE STARTED TASK DID NOT EXIT YET, 0627 * THE CALLING TASK IS BLOCKED AND UNBLOCKED BY THE EXIT OF THE STARTED TASK 0628 * (OR BY A SIG 0 OF THE STARTED TASK). IN THE SAME WAY A TASK CAN WAIT FOR 0629 * EXIT OR A SIG 0 OF ANY OTHER SPECIFIC TASK. 0630 * 0631 * SOFT-EVENTS ARE CONTROLED BY 3 PRIMITIVES: WAIT (SEMEPHORE DOWN), SIGNAL 0632 * (SEMAPHORE UP) AND RSIG (RESET/INIT THE SIGNAL WITH AN INITIAL COUNT). 0633 * SOFT-EVENTS ARE IDENTIFIED BY A NUMBER, STARTING WITH NUMBER 1 (EVENT 0 0634 * IS THE TASK-LINKED EVENT; EACH TASK HAS ITS OWN EVENT 0). ALLOCATION OF 0635 * A SOFT-EVENT FOR A SPECIFIC PURPOSE IS TO BE DONE BY THE PROGRAMMER; THE 0636 * SOFT-EVENTS ARE NOT MANAGED AS RESOURCES BY THE SYSTEM. 0637 * RSIG 1 INITIALIZES A BINARY SEMAPHORE WHICH CAN BE USED TO CONTROL A CRITICAL 0638 * SECTION. MAXIMUM NUMBER OF SUPPORTED SOFT-EVENTS IS OCTAL 77; THE MAXIMUM 0639 * INITIAL VALUE OF A SOFT-EVENT CAN BE OCTAL 77. 0640 * 0641 17436 1 000000 PSET XAC ETAB,1 INDEXED POINTER TO SOFT-EVENT TABLE 0642 * 0643 * WAIT FOR AN EVENT; CALLING SEQUENCE: 0644 ****** 0645 * 1) WAIT FOR TASK EXIT OR ON A SIG-0 OF A TASK 0646 * CALL WAIT 0647 * DAC TCB (TCB ADDRESS OF THE TASK TO WAIT FOR) 0648 * 0649 * 2) WAIT FOR A SOFT-EVENT (SEMAPHORE DOWN) * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 22 0650 * CALL WAIT 0651 * OCT XX (SOFT-EVENT NUMBER, 1-MAX '77) 0652 * 0653 17437 0 000000 WAIT DAC ** 0654 17440 0 10 17745 JST SAVE SAVE CPU STATE 0655 * SET CONTINUATION ADDRESS 0656 17441 -0 02 17437 LDA* WAIT SIGNAL NBR OR TCB ADDRESS OF TASK TO WAIT FOR 0657 17442 0 04 17770 STA TEM1 0658 17443 141044 CAR BITS 9-16 = 0 0659 17444 101040 SNZ 0660 17445 0 01 17464 JMP SOFT SOFT EVENT 0661 * WAIT FOR TASK EVENT 0662 17446 -0 02 17770 LDA* TEM1 STATE OF TASK TO WAIT FOR 0663 17447 101040 SNZ 0664 17450 0 01 17713 JMP RESH TASK REQUESTED TO WAIT FOR IS NOT RUNNING 0665 * THE REQUESTED TASK TO WAIT FOR IS RUNNING 0666 17451 0 02 17770 LDA TEM1 TCB ADDRESS 0667 17452 0 06 17775 ADD =7 OFFSET TASK EVENT (TEVT) 0668 17453 0 04 17770 STA TEM1 POINTS TO TASK EVENT OF TASK TO WAIT FOR 0669 17454 -0 02 17770 LDA* TEM1 OTHER TASK WAITING? 0670 17455 101040 SNZ 0671 17456 0 01 17461 JMP FREE NO, SO THE EVENT CAN BE SET 0672 * YES, ALREADY ANOTHER TASK IS WAITING FOR THIS EVENT 0673 * QUEUE THE CURRENT REQUEST 0674 17457 0 02 17437 W LDA WAIT 0675 17460 0 01 17741 JMP BUSY 0676 * STORE THE TCB ADDRESS OF THE WAITING TASK IN THE TASK-EVENT 0677 17461 -0 15 17770 FREE STX* TEM1 X = TCB ADDRESS OF THE CALLING TASK 0678 17462 0 02 17770 LDA TEM1 EVENT ADDRESS 0679 17463 0 01 17733 JMP BLOK AND BLOCK THE CALLING TASK 0680 * 0681 * WAIT FOR A SOFT-EVENT 0682 17464 -0 35 17437 SOFT LDX* WAIT SOFT-EVENT NUMBER 0683 17465 -0 02 17436 LDA* PSET GET ITS COUNT VALUE 0684 17466 100400 SPL IF POSITIVE, TASK MAY PROCEED 0685 17467 0 01 17457 JMP W WAIT FOR A SIGNAL 0686 17470 0 07 17776 SUB =1 DOWN * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 23 0687 17471 -0 04 17436 STA* PSET AND RESTORE THE COUNT VALUE 0688 17472 0 01 17713 JMP RESH 0689 * 0690 * SIGNAL AN EVENT; CALLING SEQUENCE: 0691 * 0692 * 1) SIGNAL TASK EVENT 0693 * CALL SIGNAL 0694 * OCT 0 (REFERING TO THE TASK-LINKED EVENT) 0695 * 0696 * 2) SIGNAL A SOFT-EVENT 0697 * CALL SIGNAL 0698 * OCT XX (SOFT-EVENT NUMBER 1-MAX '77) 0699 * 0700 17473 0 000000 SIG DAC ** 0701 17474 0 10 17745 JST SAVE SAVE CPU STATE 0702 17475 -0 02 17473 LDA* SIG EVENT NUMBER 0703 17476 100040 SZE 0704 17477 0 01 17512 JMP SS 0705 * SIGNAL TASK EVENT 0706 17500 1 02 00007 LDA TEVT,1 TCB ADDRESS OF TASK TO UNBLOCK 0707 17501 101040 SNZ 0708 17502 0 01 17713 JMP RESH NO WAITING TASK 0709 17503 0 04 17770 STA TEM1 0710 17504 -0 02 17770 LDA* TEM1 STATE 0711 17505 140100 SSP SET STATE READY 0712 17506 -0 04 17770 STA* TEM1 0713 17507 140040 CRA 0714 17510 1 04 00007 STA TEVT,1 CLEAR TASK EVENT 0715 17511 0 01 17713 JMP RESH 0716 * SIGNAL SOFT EVENT 0717 17512 0 04 00000 SS STA 0 X = EVENT NUMBER 0718 17513 -0 12 17436 IRS* PSET UP 0719 17514 101000 NOP 0720 17515 0 01 17713 JMP RESH 0721 * 0722 * REVENT - RESET SOFT EVENT, SET INITIAL COUNT 0723 ******** * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 24 0724 * CALLING SEQUENCE: 0725 * CALL REVENT 0726 * OCT XXYY (BITS 5-16) 0727 * WHERE XX = INITIAL COUNT BITS 5 - 10 0728 * YY = SOFT EVENT NUMBER BITS 11 - 16 0729 * 0730 17516 0 000000 RSEV DAC ** 0731 17517 0 10 17745 JST SAVE SAVE CPU STATE 0732 17520 -0 02 17516 LDA* RSEV 0733 17521 0 03 17774 ANA ='77 SOFT EVENT NUMBER 0734 17522 101040 SNZ 0735 17523 0 01 17713 JMP RESH NUMBER 0 (TASK EVENT) CAN NOT BE RESET 0736 17524 0 04 00000 STA 0 X = EVENT NUMBER 0737 17525 -0 02 17516 LDA* RSEV 0738 17526 0404 72 LGR 6 0739 17527 0 07 17776 SUB =1 = COUNT VALUE 0740 17530 -0 04 17436 STA* PSET STORE IN SOFT EVENT 0741 17531 0 01 17713 JMP RESH 0742 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 25 0743 * 0744 * 0745 * TASK MANAGEMENT SERVICES (TO BE USED BY RING-2) 0746 ************************** 0747 * 0748 **** TASK EXECUTION 0749 * 1) EXEC TASK AND WAIT FOR EXIT; CALLING SEQUENCE: 0750 * CALL EXEW 0751 * DAC TCB (TCB ADDRESS OF THE TASK TO START) 0752 * 0753 * THE STARTING TASK (='PARENT') IS BLOCKED AND UNBLOCKED AFTER EXIT OF THE 0754 * STARTED (='CHILD') TASK (OR BY A SIG-0 OF THE STARTED TASK). 0755 * THE DEVICES ATTACHED TO THE STARTING TASK (='PARENT') ARE ALSO ATTACHED TO 0756 * THE STARTED TASK (='CHILD') AND NOT RELEASED WHEN THE STARTED TASK EXITS. 0757 * 0758 * 2) EXEC TASK; CALLING SEQUENCE: 0759 * CALL EXE 0760 * DAC TCB (TCB ADDRESS OF THE TASK TO START) 0761 * 0762 * THE CALLING TASK IS NOT BLOCKED (SO REMAINS READY); NO ATTACHED DEVICES 0763 * OF THE STARTING TASK ARE ATTACHED TO THE STARTED TASK. IF THE TASK TO 0764 * START IS ALREADY STARTED, THE STARTING TASK IS BLOCKED UNITL THE TASK TO 0765 * START CAN BE STARTED. 0766 * 0767 * 3) EXIT THE CURRENT TASK; CALLING SEQUENCE: 0768 * CALL EXIT 0769 * 0770 * SIGNALS EXIT AND RELEASES (STILL) ATTACHED DEVICES NOT ATTACHED TO THE 0771 * PARENT TASK, IF THE TASK WAS STARTED BY EXEW. 0772 * AT KERNEL LEVEL, THE TCB IS NOT CLEARED, SO THE TASK CAN BE RESTARTED 0773 * WITH EXE OR EXEW (THE TASK MUST THEN OF COURSE BE ABLE TO REINIT ITSELF). 0774 * 0775 * 4) KILL ANOTHER TASK; CALLING SEQUENCE: 0776 * CALL KILL 0777 * DAC TCB (TCB ADDRESS OF THE TASK TO KILL) 0778 * * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 26 0779 * INDEPENDENT OF ITS STATE, THE TASK IS KILLED, AN EVENT THE TASK WAS 0780 * WAITING FOR IS CLEARED, EXIT IS SIGNALLED AND (STILL) ATTACHED DEVICES, 0781 * NOT ATTACHED TO THE PARENT TASK, IF THE TASK WAS STARTED BY EXEW, ARE 0782 * RELEASED. 0783 * AT KERNEL LEVEL, THE TCB IS NOT CLEARED, SO THE TASK CAN BE RESTARTED 0784 * WITH EXE OR EXEW (THE TASK MUST THEN OF COURSE BE ABLE TO REINIT ITSELF). 0785 * 0786 * 5) SUSPEND ANOTHER TASK, CALLING SEQUENCE: 0787 * CALL PAUSE 0788 * DAC TCB (TCB ADDRESS OF THE TASK TO SUSPEND) 0789 * 0790 * PAUSE SUSPENDS A TASK AND THE TASK'S DEVICES ARE RELEASED FOR USE BY OTHER 0791 * TASKS. AN ACTIVE ATTENTION HANDLER CAN NOT BE SUSPENDED (A PASSIVE 0792 * ATTENTION HANDLER, WHICH IS A TASK WAITING FOR AN ATTENTION EVENT, CAN BE 0793 * SUSPENDED, BUT THE ATTENTION EVENT ACTIVATES THE ATTENTION HANDLER). 0794 * 0795 * 6) RESUME A SUSPENDED TASK, CALLING SEQUENCE: 0796 * CALL RESUME 0797 * DAC TCB (TCB ADDRESS OF THE TASK TO RESUME= 0798 * *** NO SUCCESS RETURN ADDRESS (RELEASED DEVICES CAN NOT BE REATTACHED) 0799 * *** SUCCESS RETURN 0800 * 0801 * RESUME REACTIVATES A SUSPENDED TASK AFTER REATTACHMENT OF THE RELEASED 0802 * DEVICES WITH THE SUSPEND. 0803 * 0804 * 7) YIELD, LEAVE THE CURRENT TASK, AND SCHEDULE THE NEXT READY TASK 0805 * CALL YIELD (THE CURRENT TASK REMAINS READY) 0806 * 0807 **** EXE, EXEC TASK 0808 * 0809 17532 0 000000 EXE DAC ** 0810 17533 0 10 17745 JST SAVE SAVE CPU STATE 0811 17534 140040 CRA 0812 17535 0 04 17770 E1 STA TEM1 SET EXE FLAG: 0 = EXE, 1 = EXEW 0813 17536 -0 35 17532 LDX* EXE X = TCB ADDRESS OF TASK TO START 0814 17537 -0 02 00000 LDA* 0 STATE? 0815 17540 101040 SNZ * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 27 0816 17541 0 01 17544 JMP E2 NOT RUNNING 0817 * REQUESTED TASK IS RUNNING; QUEUE THE CURRENT REQUEST 0818 17542 0 02 17532 LDA EXE 0819 17543 0 01 17741 JMP BUSY 0820 * REQUESTED TASK IS NOT RUNNING; FILL TCB 0821 17544 141206 E2 AOA 0822 17545 -0 04 00000 STA* 0 SET START BIT 0823 17546 1 02 00006 LDA STRT,1 0824 17547 1 04 00001 STA LABL,1 SET CONTINUATION ADDRESS (PC) 0825 * EXE OR EXEW ? 0826 17550 0 02 17770 LDA TEM1 0827 17551 101040 SNZ 0828 17552 0 01 17713 JMP RESH EXE 0829 * POSTPROCESS EXEW 0830 17553 0 02 17677 LDA T STORE TCB ADDRESS OF CURRENT TASK INTO TASK EVENT, 0831 17554 1 04 00007 STA TEVT,1 TO SET THE CURRENT TASK WAITING FOR EXIT. 0832 17555 0 02 00000 LDA 0 X = TCB ADDRESS OF TASK TO START 0833 17556 0 06 17775 ADD =7 + TASK EVENT OFFSET = EVENT ADDRESS 0834 17557 0 01 17733 JMP BLOK BLOCK THE CURRENT TASK 0835 * 0836 **** EXEW, EXEC TASK AND WAIT FOR EXI 0837 * 0838 17560 0 000000 EXEW DAC ** 0839 17561 0 10 17745 JST SAVE 0840 17562 0 02 17560 LDA EXEW MOVE LINK 0841 17563 0 04 17532 STA EXE 0842 17564 0 02 17776 LDA =1 SET EXE FLAG: 0 = EXE, 1 = EXEW 0843 17565 0 01 17535 JMP E1 0844 * 0845 **** EXIT, EXIT CURRENT TASK 0846 * 0847 17566 0 000000 EXIT DAC ** 0848 17567 0 10 17745 JST SAVE SAVE CPU STATE 0849 * RELEASE THE NORMAL DEVICES 0850 17570 1 02 00010 EXIK LDA DEV,1 ATTACHED DEVICES TO RELEASE 0851 17571 140401 CMA 0852 17572 0 03 17263 ANA DEVS RELEASE ATTACHED DEVICES OF CURRENT TASK * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 28 0853 17573 0 04 17263 STA DEVS 0854 * IS THE ATTENTION HANDLER EXITING? 0855 17574 0 02 17232 EXSU LDA ATTH ATTENTION HANDLER ACTIVE? 0856 17575 0 07 00000 SUB 0 TCB ADDRESS OF CURRENT TASK 0857 17576 100040 SZE 0858 17577 100000 SKP NOT AN EXIT OF THE ATTENTION HANDLER 0859 17600 0 04 17232 STA ATTH ATTH=0; ATT. HANDLER INACTIVE, TTY RELEASED 0860 * UPDATE TCB 0861 17601 140040 CRA 0862 17602 -0 04 00000 STA* 0 STATE = 0 0863 17603 1 04 00010 STA DEV,1 NO DEVICES ATTACHED 0864 17604 1 13 00007 IMA TEVT,1 TASK EVENT RESET 0865 17605 101040 SNZ 0866 17606 0 01 17713 JMP RESH NO TASK WAITING FOR THIS TASK 0867 17607 0 04 17770 STA TEM1 POINTER TO TCB OF TASK TO UNBLOCK 0868 17610 -0 02 17770 LDA* TEM1 STATE 0869 17611 140100 SSP RESET BLOCKED BIT TO MAKE TASK READY 0870 17612 -0 04 17770 STA* TEM1 UPDATE STATE 0871 17613 0 01 17713 JMP RESH 0872 * 0873 **** KILL ANOTHER TASK; CALLING SEQUENCE 0874 * CALL KILL 0875 * DAC TCB (TCB ADDRESS OF TASK TO KILL) 0876 * 0877 17614 0 000000 KILL DAC ** 0878 17615 0 10 17745 JST SAVE SAVE CPU STATE 0879 * TASK BLOCKED? 0880 17616 -0 35 17614 LDX* KILL TCB ADDRESS OF TASK TO KILL 0881 17617 -0 02 00000 LDA* 0 STATE 0882 17620 101400 SMI 0883 17621 0 01 17624 JMP K2 NOT BLOCKED; TASK SUSPENDED? 0884 * YES, THE TASK TO KILL IS BLOCKED => CLEAR EVENT/DECOUPLE EVENT FROM TASK 0885 17622 140040 CRA 0886 17623 -1 04 00011 STA* PWEV,1 CLEAR EVENT 0887 * TASK SUSPENDED? 0888 17624 0 02 17773 K2 LDA =2 0889 17625 -0 03 00000 ANA* 0 * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 29 0890 17626 101040 SNZ 0891 17627 0 01 17570 JMP EXIK NOT SUSPENDED; EXIT THE TASK 0892 17630 0 01 17574 JMP EXSU EXIT SUSPENDED TASK; NO DEVICE RELEASE 0893 * 0894 **** PAUSE, CALLING SEQUENCE: 0895 * CALL PAUSE 0896 * DAC TCB (TCB ADDRESS OF THE TASK TO SUSPEND) 0897 * 0898 * PAUSE SUSPENDS ANOTHER TASK AND ITS DEVICES ARE RELEASED FOR USE BY OTHER 0899 * TASKS. AN ACTIVE ATTENTION HANDLER CAN NOT BE SUSPENDED (A PASSIVE ATTENTION 0900 * HANDLER, WHICH IS A TASK WAITING FOR AN ATTENTION EVENT CAN BE SUSPENDED BUT 0901 * THE ATTENTION EVENT ACTIVES THE ATTENTION HANDLER). 0902 * 0903 17631 0 000000 PA DAC ** 0904 17632 0 10 17745 JST SAVE SAVE CPU STATE 0905 17633 -0 02 17631 LDA* PA TCB ADDRESS OF THE TASK TO SUSPEND 0906 17634 0 04 00000 STA 0 X = TCB ADDRESS OF THE TASK TO SUSPEND 0907 17635 0 07 17232 SUB ATTH IS IT THE ATTENTION HANDLER? 0908 17636 101040 SNZ IT IS NOT ALLOWED TO SUSPEND AN ACTIVE ATTENTION 0909 17637 0 01 17713 JMP RESH HANDLER 0910 17640 -0 02 00000 LDA* 0 STATE 0911 17641 140100 SSP RESET A POSSIBLE BLOCKED BIT 0912 17642 0 07 17776 SUB =1 0913 17643 100040 SZE ONLY READY/BLOCKED TASKS CAN BE SUSPENDED 0914 17644 0 01 17713 JMP RESH 0915 17645 0 02 17773 LDA =2 0916 17646 -0 05 00000 ERA* 0 SET PAUSE STATE 0917 17647 -0 04 00000 STA* 0 0918 17650 1 02 00010 LDA DEV,1 RELEASE ATTACHED DEVICES 0919 17651 0 05 17263 ERA DEVS 0920 17652 0 04 17263 STA DEVS 0921 17653 0 01 17713 JMP RESH 0922 * 0923 **** RESUME, CALLING SEQUENCE: 0924 * CALL RESUME 0925 * DAC TCB (TCB ADDRESS OF THE TASK TO RESUME= 0926 * *** NO SUCCESS RETURN ADDRESS (RELEASE DEVICES CAN NOT BE ATTACHED) * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 30 0927 * *** SUCCESS RETURN 0928 * 0929 * RESUME REACTIVATES A SUSPENDED TASK AFTER REATTACHMENT OF THE RELEASED 0930 * DEVICES WITH THE SUSPEND 0931 * 0932 17654 0 000000 RESU DAC ** 0933 17655 0 10 17745 JST SAVE SAVE CPU STATE 0934 17656 -0 35 17654 LDX* RESU X = TCB ADDRESS OF TASK TO RESUME 0935 17657 0 02 17263 LDA DEVS DEVICES FREE? 0936 17660 1 03 00010 ANA DEV,1 0937 17661 100040 SZE 0938 17662 0 01 17713 JMP RESH NO, NO SUCCESS RETURN 0939 17663 0 02 17772 LDA ='177775 0940 17664 -0 03 00000 ANA* 0 0941 17665 -0 04 00000 STA* 0 RESET PAUSE STATE 0942 17666 0 02 17263 LDA DEVS 0943 17667 1 05 00010 ERA DEV,1 0944 17670 0 04 17263 STA DEVS REATTACH THE DEVICES 0945 17671 1 12 00001 IRS LABL,1 SET SUCCESS RETURN ADDRESS 0946 17672 0 01 17713 JMP RESH 0947 * 0948 **** YIELD, CALLING SEQUENCE: 0949 * CALL YIELD 0950 * 0951 * YIELD LEAVES THE CURRENT TASK AND ALLOWS FOR SCHEDULING THE 0952 * NEXT READY TASK. THE CURRENT TASK REMAINS READY. 0953 * 0954 17673 0 000000 YIEL DAC ** 0955 17674 0 10 17745 JST SAVE SAVE CPU STATE 0956 17675 0 02 17673 LDA YIEL CONTINUATION ADDRESS 0957 17676 0 01 17742 JMP BUSY+1 SAVE 0958 ************* END OF THE RING-2 CALL INTERFACE ********************** 0959 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 31 0960 ************* 0961 * SCHEDULER * 0962 ************* 0963 * 0964 * THE SCHEDULER IS A SIMPLE ROUND ROBIN SCHEDULER AND RUNS THE TASKS IN 0965 * RING-2 DEPENDING ON THEIR STATE: 0966 * - TASK NOT STARTED (STOP) 0000000000000000 0967 * - TASK STARTED, NOT WAITING FOR EVENT (READY) 0000000000000001 0968 * - TASK STARTED, WAITING FOR EVENT (BLOCKED) 1000000000000001 0969 * - TASK STARTED, BUT SUSPENDED (PAUSED) X000000000000011 0970 * (WHEN A TASK IS SUSPENDED, THE BLOCKED BIT CAN BE 1: X = 0 OR 1) 0971 * 0972 * A TAST IS BLOCKED WHEN WAITING FOR: 0973 * - IO EVENT (SIGNALLED BY AN INTERRUPT HANDLER) 0974 * - TASK EVENT (SIGNALLED BY EXIT OR SIG-0 OF THE TASK WAITING FOR) 0975 * - TIMER EVENT (SIGNALLED BY RTC INTERRUPT HANDLER) 0976 * - ATTENTION EVENT (SIGNALLED BY TTY INTERRUPT HANDLER) 0977 * 0978 * WHEN A TASK IS BLOCKED, THE PWEV ENTRY IN THE TASK'S TCB POINTS TO THE 0979 * EVENT THE TASK IS WAITING FOR. 0980 * 0981 * THE SCHEDULER RUNS AT RING-1 AND HAS THE FOLLOWING ENTRY POINTS 0982 * FOR RING-1 CODE: 0983 * SKED - SCHEDULER ENTRY POINT AFTER INITIALIZATION 0984 * RESH - ENABLE INTERRUPT AND SCHEDULE THE NEXT READY TASK 0985 * BLOK - SET TASK WAITING FOR AN EVENT, AND SCHEDULE THE NEXT READY TASK 0986 * BUSY - TASK PENDING FOR A CONDITION, SCHEDULE NEXT READY TASK 0987 * SAVE - INHIBIT INTERRUPT AND SAVE CPU STATE IN TCB 0988 * 0989 * THESE ENTRY POINTS MUST BE ENTERED WITH A JMP! 0990 * 0991 * EACH TASK IN RING-2 IS PRESENTED TO THE SCHEDULER BY A DATA STRUCTUCE: 0992 * THE TASK CONTROL BLOCK (TCB). THE LOCATION T ALWAYS POINTS TO THE TCB OF 0993 * THE CURRENT RUNNING TASK. 0994 * 0995 * TASK CONTROL BLOCK STRUCTURE * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 32 0996 000000 STAT EQU 0 TASK STATE 0997 000001 LABL EQU 1 ADDRESS WHERE TASK MUST CONTINUE (P) 0998 000002 A EQU 2 SAVED A 0999 000003 B EQU 3 SAVED B 1000 000004 X EQU 4 SAVED X 1001 000005 KEYS EQU 5 SAVED KEYS 1002 000006 STRT EQU 6 TASK START ADDRESS 1003 000007 TEVT EQU 7 TASK EVENT 1004 000010 DEV EQU 8 ATTACHED DEVICES 1005 000011 PWEV EQU 9 POINTER TO EVENT BLOCKED FOR 1006 000012 TCBL EQU PWEV+1 LENGTH TCB (WHEN CHANGED, CHANGE SCHEDULER!) 1007 * 1008 17677 000000 T OCT 0 POINTER TO TCB OF RUNNING TASK 1009 17700 0 000000 PTAB XAC TTAB TASK CONTROL BLOCK (TCB) TABLE START ADDRESS 1010 17701 177777 TEND OCT '177777 TASK CONTROL BLOCK (TCB) TABLE END 1011 * 1012 * 1013 ***** SCHEDULER ENTRY POINT (TO BE USED BY INIT) 1014 017702 SKED EQU * 1015 17702 0 02 17700 LDA PTAB POINTER TO 1ST TASK CONTROL BLOCK (TCB) 1016 17703 0 04 17677 NXTR STA T POINTER TO NEXT TCB TO CHECK ITS STATE 1017 17704 -0 02 17677 LDA* T A = STATE, OR TABLE END 1018 17705 0 11 17701 CAS TEND =177777? END OF TABLE, OR STATE? 1019 17706 100000 SKP 1020 17707 0 01 17702 JMP SKED YES, TABLE END, RESTART FROM TOP 1021 * STATE IS READY ? 1022 17710 0 07 17776 SUB =1 1023 17711 101040 SNZ 1024 17712 0 01 17717 JMP RUN STATE=1; READY 1025 * TASK BLOCKED, WAITING ON AN EVENT 1026 * 1027 ***** RESCHEDULER ENTRY POINT (TO BE USED BY RING-1) 1028 * LOOK FOR NEXT 'READY' TASK IN THE TASK QUEUE 1029 * T = POINTER TO TCB OF TASK WHICH GIVES UP THE CONTROL 1030 * WHEN ENTERED FROM RING-1 THE TCB OF THE TASK ASKING RESCHEDULE MUST BE 1031 * UPDATED (AT LEAST ITS CONTINUATION ADDRESS) 1032 17713 000401 RESH ENB * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 33 1033 17714 0 02 17677 LDA T ADDRESS CURRENT TCB 1034 17715 0 06 17771 ADD =10 + OFFSET TO NEXT TCB (****TCBL****) 1035 17716 0 01 17703 JMP NXTR 1036 * READY TASK FOUND => RUN 1037 * T = POINTER TO TCB OF THE 'READY' TASK 1038 17717 0 35 17677 RUN LDX T X = TCB ADDRESS 1039 17720 1 02 00003 LDA B,1 RESTORE B 1040 17721 000201 IAB 1041 17722 1 02 00005 LDA KEYS,1 1042 17723 171020 OTK RESTORE C, ... 1043 17724 1 02 00004 LDA X,1 1044 17725 0 04 17767 STA SAVX 1045 17726 1 02 00001 LDA LABL,1 GET CONTINUATION ADDRESS 1046 17727 0 04 17770 STA TEM1 1047 17730 1 02 00002 LDA A,1 RESTORE A 1048 17731 0 35 17767 LDX SAVX RESTORE X 1049 17732 -0 01 17770 JMP* TEM1 JUMP INTO TASK 1050 * 1051 ***** SET TASK BLOCKED ENTRY POINT (TO BE USED BY RING-1) 1052 * SET TASK BLOCKED, SAVE ITS STATE AND SCHEDULE NEXT 'READY' TASK 1053 * T = POINTER TO TCB OF CURRENT TASK 1054 * A = EVENT ADDRESS THE BLOCKED TASK IS WAITING FOR 1055 17733 0 35 17677 BLOK LDX T X = TCB ADDRESS CURRENT TASK 1056 17734 1 04 00011 STA PWEV,1 STORE EVENT ADDRESS IN TCB 1057 17735 -0 02 00000 LDA* 0 GET STATE 1058 17736 140500 SSM SET BLOCKED BIT 1059 17737 -0 04 00000 STA* 0 SET TASK STATE: WAITING FOR EVENT 1060 * RESCHEDULE; RUN NEXT NON-BLOCKED TASK 1061 17740 0 01 17713 JMP RESH 1062 * 1063 ***** SET TASK PENDING ENTRY POINT (TO BE USED BY RING-1) 1064 * ENTRY POINT FOR RING-1 TO SET A TASK PENDING (IN A 'BUSY WAITING LOOP') 1065 * A RING-1 PRIMITIVE MUST JUMP TO THIS ENTRY WITH THE ADDRESS OF THE 1066 * PRIMITIVE CALL AT RING-2 IN REG-A. THE PRIMITIVE CALL ADDRESS IN THE TASK 1067 * IS SAVED AS THE CONTINUATION ADDRESS OF THE THREAD. 1068 * 1069 * 'CALLING' SEQUENCE: * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 34 1070 * C JST P PRIMITIVE CALL IN THREAD (RING-2) 1071 * *** *** 1072 * 1073 * P *** *** PRIMITIVE ENTRY POINT (RING-1) 1074 * *** *** 1075 * LDA P A-REG = ADDRESS C+1 1076 * SKS *** 1077 * JMP BUSY 1078 * 1079 * IN CASE THE SKS DOES NOT SKIP, THE JMP BUSY IS EXECUTED WITH AS RESULT THAT. 1080 * THE TASK IS RESTARTED AT ADDRESS C (THE CONTINUATION ADDRESS SAVED WITH 1081 * THE JMP TO BUSY) 1082 * A = CONTINUATION ADDRESS + 1; T = TCB ADDRESS CURRENT THREAD 1083 17741 0 35 17677 BUSY LDX T X = TCB ADDRESS CURRENT TASK 1084 17742 0 07 17776 SUB =1 1085 17743 1 04 00001 STA LABL,1 SAVE CONTINUATION ADDRESS 1086 17744 0 01 17713 JMP RESH AND RESCHEDULE, STARTING AT NEXT THREAD 1087 EJCT * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 35 1088 ***** SAVE CPU STATE ENTRY POINT (TO BE USED BY RING-1) 1089 * WHEN ENTERING RING-1 TO EXECUTE THE RING-1 PRIMITIVE CODE. 1090 * THE JST TO SAVE MUST BE THE 1ST INSTRUCTION OF THE PRIMITIVE CODE. 1091 * CALLING SEQUENCE: 1092 * JST SAVE 1093 * RETURNS INH, WITH X = T = ADDRESS OF TCB OF CURRENT TASK 1094 * AND ALSO SETS THE DEFAULT CONTINUATION ADDRESS OF THE TASK EXECUTING 1095 * THE RING-1 PRIMITIVE (PRIMIITIVE CALL ADDRESS + 2). 1096 * 1097 17745 0 000000 SAVE DAC ** 1098 17746 001001 INH 1099 17747 0 15 17767 STX SAVX X, TEMPORARY SAVE 1100 17750 0 35 17677 LDX T X = TCB ADDRESS CURRENT TASK 1101 17751 1 04 00002 STA A,1 SAVE A 1102 17752 000201 IAB 1103 17753 1 04 00003 STA B,1 SAVE B 1104 17754 000043 INK 1105 17755 1 04 00005 STA KEYS,1 SAVE KEYS 1106 17756 0 02 17767 LDA SAVX 1107 17757 1 04 00004 STA X,1 SAVE X 1108 17760 0 02 17745 LDA SAVE 1109 17761 0 07 17773 SUB =2 1110 17762 0 04 17767 STA SAVX = POINTER TO PRIMITIVE CALL ADDRESS + 1 1111 17763 -0 02 17767 LDA* SAVX 1112 17764 141206 AOA 1113 17765 1 04 00001 STA LABL,1 SET DEFAULT CONTINUATION ADDRESS 1114 17766 -0 01 17745 JMP* SAVE 1115 * 1116 * TEMPORARY SPACE RING-1 1117 17767 000000 SAVX OCT 0 1118 17770 000000 TEM1 OCT 0 TEMPORARY FOR RING-1 1119 17771 000012 FIN LITERALS RING-0 AND RING-1 17772 177775 17773 000002 17774 000077 17775 000007 * MTK16 - MULTI TASKING KERNEL FOR DDP516/H316 - V1.3 JULY 5 2007 PAGE 36 17776 000001 1120 017776 KEND EQU *-1 END ADDRESS OF BASIC KERNEL ADDRESS RANGE 1121 END NO ERRORS IN ABOVE ASSEMBLY. DAP-16 REV. E