OU:[12,10]FIXOV.MAC;2/AU:72./-BF=IN:[12,10]FIXOV.MAC;1 \ -2,2 .IDENT /1.1A/ -23,23 ; VERSION 1.1A -52, ; GT001 3-JAN-80 ADD SUPPORT FOR MC2 ; ; JRK141 2-MAY-80 ADD UNFIX CASE WHERE TASK MAY NO BE LOADED YET ; % -204,,/;JRK141/ MOV R1,-(SP) ; SAVE TCB ACROSS $NXTSK CALL -208,208,/JRK141/ MOV (SP)+,R0 ; RETRIVE TCB ADDRESS AND STORE IN R0 -217,217,/; GT001/ BIT #T3.REM!2,T.ST3(R1) ; RUN AND REMOVE? -355,355,/;JRK141/ ; ; THE FOLLOWING CODE CHECKS TO SEE IF AN UNFIX COMMAND HAS BEEN ISSUED ; AGAINST A TASK WHICH HAS NOT YET HAD AN OPPORTUNITY TO BE LOADED. ; THIS CONDITION IS CHECKED BY DEQUEUEING THE TASK FROM ITS PARTITION ; WAIT QUEUE. IF THIS OPERATION IS SUCCESSFUL, ONLY THE PCB IS ; DEALLOCATED. IF IT IS NOT SUCCESSFUL (TASK IS LOADED), THE OUT ; BIT IS CHECKED TO SEE IF IT IS IN A WINDOW CONDITION WHERE THE PCB ; HAS BEEN DEQUEUED, BUT INSERTION IS NOT YET COMPLETE. THIS IS AN ; ERROR CONDITION AND THE UNFIX COMMAND MUST BE RE-ENTERED. IF THE ; PCB IS NOT IN THE WAIT QUEUE AND THE OUT BIT IS ZERO, UNFIX DELETES ; THE INTERNAL HEADER, UNLINKS ALL TASK ATTACHMENTS, AND THEN DEALLOCATES ; THE PCB ; FIXRLS: CMP #^RUNF,$MCMD ; IS THIS AN UNFIX COMMAND? BNE 5$ ; NO, SKIP CHECK FOR TASK LOADED MOV R0,-(SP) ; SAVE TCB ADDRESS FOR LATER USE MOV R0,R1 ; SAVE TCB FOR DEQUEUE CALL MOV T.PCB(R0),R0 ; GET SUB-PCB ADDRESS OF TASK MOV P.MAIN(R0),R0 ; GET THE MAIN PCB ADDRESS OF TASK ADD #P.WAIT,R0 ; POINT TO WAIT QUEUE FOR THIS PCB CALL $QRMVT ; TRY TO DEQUEUE TASK FROM WAIT QUEUE BCC 1$ ; CC -> TASK IS NOT YET LOADED MOV (SP)+,R0 ; RETRIEVE TCB ADDRESS BIT #TS.OUT,T.STAT(R0) ; CHECK IF TASK IS IN WINDOW STATE ; BETWEEN LOADED BUT NOT SET 'IN' BEQ 5$ ; IF EQ, TASK IS FULLY IN MEMORY BR FIXER5 ; CANNOT UNFIX WHILE IN WINDOW STATE 1$: MOV (SP)+,R1 ; RETRIEVE TCB ADDRESS MOV T.PCB(R1),R0 ; GET SUB-PCB ADDRESS OF TASK MOV P.MAIN(R0),T.PCB(R1) ; RESTORE POINTER TO MAIN PCB MOV #P.LGTN,R1 ; SET LENGTH OF PCB CALL $DEACB ; DEALLOCATE THE PCB BR FIXSWS ; RETURN FROM COMMAND 5$: BIS #TS.OUT,T.STAT(R0) ; SET THE TASK 'OUT OF MEMORY' /