.TITLE SETBIG .IDENT \V02.03\ .SBTTL SETBIG ALLOCATE SPACE FOR EXECUTE OR MONADIC ENCODE ;++ ; FUNCTIONAL DESCRIPTION: ; ALLOCATES THE LARGEST AVAILABLE BLOCK OF FREE STORAGE AS AN OUTPUT ; BUFFER. THIS BUFFER IS SET UP TO LOOK LIKE A LITERAL ARRAY BLOCK, ; AND A PARSE FRAME IS CREATED POINTING TO THIS ARRAY BLOCK. THE ; OUTPUT POINTERS (OCHAN, ETC) ARE SET UP TO POINT INTO ; THE OUTPUT BUFFER CREATED BY THIS ROUTINE. THIS ROUTINE IS CALLED ; BY THE MONADIC ENCODE OPERATOR AND BY 'COMAND' IF THE EXECUTE OP ; INITIATED A SYSTEM COMMAND ;-- .PSECT CODE SETBIG:: PUSH ;SAVE REGS CLR -(SP) ;TOTAL FREE SPACE AVAILABLE CLR R0 ;NO SIZE YET MOV ROVER,R1 ;POINT TO FREE LIST BEQ 1$ ;IF THERE IS ONE MOV R1,R2 ;COPY POINTER TO INITIAL LOCATION 3$: TST -2(R1) ;IS IT FREE? BLT 5$ ;NO, IS IN USE CMP R0,-(R1) ;CHECK SIZE OF THIS BLOCK BGE 4$ ;SMALLER MOV (R1),R0 ;BIGGER, SAVE ITS LENGTH 4$: ADD (R1)+,@SP ;INCREMENT TOTAL FREE AREA 5$: MOV @R1,R1 ;POINT TO NEXT BLOCK CMP R1,R2 ;ALL THE WAY 'ROUND? BNE 3$ ;NO 1$: ;NO FREE SPACE .IF NE RSTS .STAT ;Find out current, available space MOV XRB+4,R1 ;Max space for user SUB XRB,R1 ;Any free space for user? BGE 20$ ;Nope ASH #10.,R1 ;Convert to words ADD R1,(SP) ;Add to total MOV ENDCOR,R2 ;Point to end of core MOV -(R2),R2 ;Get the end size BLT 21$ ;Not free ADD R2,R1 ;Size of end block 21$: CMP R1,R0 ;Is this the largest block? BLE 20$ ;Nope MOV R1,R0 ;Yes 20$: .ENDC ;+ ; CREATE ARRAY BLOCK ;- ; ASR @SP ;DIVIDE TOTAL SPACE IN 2 ROR @SP ;DIVIDE TOTAL SPACE IN 2 CMP R0,@SP ;LARGEST BLOCK TOO LARGE? BLE 6$ ;NO, IS ALRIGHT MOV @SP,R0 ;WE WANT ONLY HALF THE AVAILABLE SPACE 6$: ASL R0 ;CONVERT TO BYTES SUB #4,R0 ;MINUS 4 BYTES FOR OVERHEAD BGT 7$ ;WORKS OUT FINE WSFULL ;TIME TO DIE 7$: MOV R0,(SP) ;SAVE FOR LATER CALL GETFRA ;ALLOCATE BIG BLOCK MOV #T.VAL,SI.BIT(SI) ;Literal Argument MOV R0,CHANEX+C.BUFF ;SAVE POINTER TO BLOCK ADD #A.DIM1+2,(R0)+ ;POINTER TO DATA MOV #<400*A.ASB>+1,(R0)+ ;LITERAL ARRAY WITH 1 DIM (VECTOR) POP R1 ;GET ARRAY LENGTH SUB #A.DIM1+4,R1 ;MINUS OVERHEAD MOV R1,(R0)+ ;ALEN MOV R1,(R0)+ ;DIM1 MOV R1,CHANEX+C.CCNT ;LENGTH OF OUTPUT BUFFER MOV R0,CHANEX+C.CPTR ;POINTER TO BUFFER MOV WIDTH,CHANEX+C.WIDR ;NEW WIDTH MOV WIDTH,CHANEX+C.WIDC ;CURRENT WIDTH MOV #CHANEX,OCHAN ;SET NEW OUTPUT CHANNEL .IF GE RT11 ; MOV #C.OPN+C.FRC,CHANEX ;Pretend Channel is Open MOV #C.OPN+FD.REC,CHANEX ;Pretend Channel is Open .IFF MOV #C.OPN,CHANEX ;Pretend Channel is Open .ENDC POP ;RESTORE REGS RETURN