TITLE ACTIV NAME ('ACTIV') ACTIV:: ; ; ;DO; ; ; ;DECLARE TotalTasks LITERALLY '10'; ; ;DECLARE True LITERALLY '0FFH'; ; ;DECLARE False LITERALLY '0'; ; ;DECLARE BusyBit LITERALLY '10000000B'; ; ;DECLARE ReadyBit LITERALLY '01000000B'; ; ;DECLARE DelayBit LITERALLY '00100000B'; ; ;DECLARE PriorityBit LITERALLY '00010000B'; ; ;DECLARE HighPriorityHead LITERALLY 'HPHEAD', ; ; HighPriorityTail LITERALLY 'HPTAIL', ; ; LowPriorityHead LITERALLY 'LPHEAD', ; ; LowPriorityTail LITERALLY 'LPTAIL', ; ; DelayHead LITERALLY 'DLYHEAD'; ; ;DECLARE (HPHEAD,HPTAIL,LPHEAD,LPTAIL,Status, ; ; NewTask,NewDelay,DLYHEAD,RunningTask) BYTE EXTERNAL; EXTRN HPHEA EXTRN HPTAI EXTRN LPHEA EXTRN LPTAI EXTRN STATU EXTRN NEWTA EXTRN NEWDE EXTRN DLYHE EXTRN RUNNI ; ;DECLARE PNTRS (TotalTasks) BYTE EXTERNAL, EXTRN PNTRS ; ; T$STATUS (TotalTasks) BYTE EXTERNAL, EXTRN TSTAT ; ; DELAYS (Totaltasks) ADDRESS EXTERNAL, EXTRN DELAY ; ; STACKS (TotalTasks) ADDRESS EXTERNAL; EXTRN STACK ; ; ;ActivateTask: PROCEDURE PUBLIC; /* ASSUMES NewTask <> 0 */ PUBLIC ACTIV ; ; ; IF (TStatus (NewTask) AND BusyBit) <> 0 THEN Status = 0; A0002: ACTIV: LXI H,TSTAT LDA NEWTA MOV E,A MVI D,0 DAD D MOV A,M ANI 080H JZ G0007 XRA A STA STATU JMP G0008 ; ; ELSE /* SINCE Task IS NOT BUSY */ ; ; DO; ; ; IF (TStatus (NewTask) AND PriorityBit) <> 0 ; ; THEN DO; /*Because its a High Priority Task*/ G0007: LXI H,TSTAT LDA NEWTA MOV E,A MVI D,0 DAD D MOV A,M ANI 010H ; ; IF HighPriorityTail <> 0 THEN DO; JZ G000D LDA HPTAI ORA A ; ; PNTRS (HighPriorityTail) = NewTask; JZ G000F LXI H,PNTRS LDA HPTAI MOV E,A MVI D,0 DAD D LDA NEWTA ; ; END; MOV M,A JMP G0012 ; ; ELSE /* SINCE HighPriorityTail = 0 THEN */ DO; ; ; HighPriorityHead = NewTask; G000F: LDA NEWTA ; ; END; ; ; HighPriorityTail = NewTask; STA HPHEA G0012: ; ; END; STA HPTAI JMP G0013 ; ; ELSE /* SINCE Task IS LOW PRIORITY THEN */ DO; ; ; IF LowPriorityTail <> 0 THEN DO; G000D: LDA LPTAI ORA A ; ; PNTRS (LowPriorityTail) = NewTask; JZ G0015 LXI H,PNTRS LDA LPTAI MOV E,A MVI D,0 DAD D LDA NEWTA ; ; END; MOV M,A JMP G0018 ; ; ELSE /* SINCE LowPriorityTail = 0 THEN */ DO; ; ; LowPriorityHead = NewTask; G0015: LDA NEWTA ; ; END; ; ; LowPriorityTail = NewTask; STA LPHEA G0018: ; ; END; ; ; PNTRS (NewTask) = 0; STA LPTAI G0013: LXI H,PNTRS LDA NEWTA MOV E,A MVI D,0 DAD D XRA A ; ; TStatus (NewTask) = TStatus (Newtask) OR ( BusyBit OR ReadyBit); MOV M,A LXI H,TSTAT LDA NEWTA MOV E,A MVI D,0 DAD D MOV A,M ORI 0C0H ; ; Status = TStatus (NewTask); MOV M,A ; ; END; ; ; NewTask = 0; STA STATU G0008: XRA A ; ; END ActivateTask; STA NEWTA RET ; ; ;END PROG5; END