.TITLE MAKBUF .GLOBL MAKBUF .IDENT /MAR079/ .MCALL EXTK$S ; ; THIS SUBROUTINE EXPANDS THE CURRENT TASK BY THE ; SPECIFIED NUMBER OF WORDS EACH TIME IT IS CALLED ; ; THE FORM OF THE CALL IS: ; ; CALL MAKBUF(IWTCAD,LENGTH,IER) ; ; WHERE: ; ; IWTCAD = ON RETURN FROM SUBROUTINE THE CONTENTS OF THIS WORD ; IS THE ADDRESS OF THE FIRST WORD IN THE DYNAMICALLY ; CREATED REGION. ; LENGTH= LENGTH TO EXTEND TASK, IN WORDS ; IER= SET NON ZERO IF ERROR OCCURS ; MAKBUF: CLR R0 CLR @6(R5) ; CLEAR ERROR SEMAPHORE MOV @4(R5),R1 ; GET LENGTH TO EXTEND TASK DIV #32.,R0 ; SEE HOW MANY 32 WORD BLOCKS TO EXTEND TST R1 ; SEE IF REMAINDER IN R1 BEQ 1$ ; IF SO, THEN WE MUST ADD ONE MORE INC R0 ; 32 WORD BLOCK 1$: EXTK$S R0 ; EXTEND THE TASK BCS ERROR ; DIDN'T GET SPACE IF CARRY SET MOV LIMIT+2,@2(R5) ; MOVE ADDRESS OF NEW AREA INTO RETURN MOV R0,R1 ; SET UP FOR MULTIPLY MUL #64.,R1 ; R1 HAS NUMBER OF BYTES TASK EXTENDED MOV LIMIT+2,R2 ; STORE ADDRESS OF NEW AREA MOV R1,R3 ; R3 HAS NUMBER OF BYTES TO CLEAR ASR R3 ; R3 HAS NUMBER OF WORDS TO CLEAR 2$: CLR (R2)+ ; CLEAR A WORD SOB R3,2$ ; CLEAR NEXT WORD IF NECC ADD R1,LIMIT+2 ; SET LIMIT+2 TO REPRESENT NEW HIGH ADDR RETURN ; ; ERROR HAS OCCURED, SET RETURN ADDRESS TO -1, RETURN DIRECTIVE ; STATUS WORD VALUE IN 'IER' ; ERROR: MOV #-1,@2(R5) MOV $DSW,@6(R5) RETURN ; LIMIT: .LIMIT ; .END