*DECK EXINCSZ
PROC EXINCSZ( (ADDSIZE), TSBADDR, TSBN );
BEGIN
*IF DEF,IMS
#
** EXINCSZ - INCREASE TSB SIZE.
*
* M. E. VATCHER 81/03/13
*
* EXINCSZ INCREASES THE SIZE OF AN ASSIGNED TSB.
*
* PROC EXINCSZ( (ADDSIZE), TSBADDR, TSBN )
*
* ENTRY ADDSIZE NUMBER OF ADDITIONAL WORDS REQUESTED
* TSBN TSB NUMBER
*
* EXIT TSBADDR ADDRESS OF NON-MOVABLE TSB WITH INCREASED
* SIZE
*
* METHOD
*
* IF ANYTHING IS WRONG WITH THE ENTRY PARAMETERS, RETURN WITH
* TSBADDR = -1. OTHERWISE GET A NEW BIGGER TSB AND MOVE THE DATA
* FROM THE OLD TSB TO THE LOWER ADDRESS PORTION OF THE NEW TSB.
* THEN MAKE THE OLD TSB A FREE TSB.
*
#
*ENDIF
CONTROL NOLIST; # TSBDEFS, TSBDATA, TSBBASE #
*CALL CYBERDEFS
*CALL TSBDEFS
*CALL TSBDATA
*CALL TSBBASE
CONTROL LIST;
XREF
BEGIN
PROC ABORT;
PROC GETTSB;
PROC GIVETSB;
PROC MOVEI;
END
ITEM ADDSIZE U; #ADDITIONAL SIZE REQUESTED #
ITEM TSBADDR U; # ADDRESS OF USER AREA OF TSB RETURNED #
ITEM TSBN U; # TSB NUMBER OF TSB WHOSE SIZE IS TO BE #
# INCREASED #
ITEM TSBSIZE U; # INCREASED TSB SIZE #
IF ( NOT TBUSY[TSBN] ) OR ( TSBN GR LENGTH[0] ) OR
( TSBN LQ 0 )
THEN # TSBN IS ILLEGAL #
BEGIN
$BEGIN
ABORT;
$END
TSBADDR = -1; # NEGATIVE ADDRESS INDICATES REJECT #
TSBN = BADTSBN + TSBN; # BAD TSBN AS PARAMETER #
RETURN; # ***** EXIT ***** #
END
P<BTSBHDR> = TTSBFWA[TSBN]; #SET TSB HEADER TO OLD TSB #
TSBSIZE = BTSBL[0] + ADDSIZE; # SET INCREASED TSB SIZE #
IF ( TSBSIZE LQ BTSBL[0] ) OR ( TSBSIZE GR MAXTSBL )
THEN # SIZE IS ILLEGAL #
BEGIN
$BEGIN
ABORT;
$END
TSBADDR = -1; # NEGATIVE ADDRESS INDICATES REJECT #
TSBN = BADSIZE; # BAD REQUEST SIZE ERROR CODE #
RETURN; # ***** EXIT ***** #
END
BNOTMOV[0] = TRUE; # SET SO IT CANT BE MOVED #
GETTSB(TSBSIZE,TSBN,TSBADDR); # GET A NEW TSB #
P<BTSBHDR> = TTSBFWA[TSBN]; # RESET HEADER ON OLD TSB #
TTSBFWA[TSBN] = TSBADDR; # SET NEW TSB FWA IN TSBIT #
TSBADDR = TSBADDR + TSBHDRL; # ADDRESS OF USER AREA TO USER #
MOVEI(BTSBL[0]-TSBHDRL,P<BTSBHDR>+TSBHDRL,TSBADDR); # MOVE DATA #
GIVETSB(P<BTSBHDR>); # RETURN OLD TSB #
END TERM # EXINCSZ #