.TITLE BREQW .IDENT /RICE04/ ; ; $RT11 is defined if RT11 version is desired ; LIMIT: .LIMIT ; Get program limits .ifndf $RT11 .mcall GTSK$S,GPRT$S,EXTK$S BLK: .BLKW 16. ; Temporary storage .endc BREQW:: JSR R2,$SAVVR ; SAVE R0-R2 INC R3 ; ADD ONE BIC #1,R3 ; Round it to even # words BLE 30$ ; No TST HI$FRH-2 ; IS DATA POOL INITED BNE 10$ ; YES DEC HI$FRH-2 ; Set it as inited .ifndf $RT11 GTSK$S #BLK ; GET TASK PARAMETERS MOV BLK+G.TSTS,R4 ; GET SIZE OF PARTITION IN BYTES GPRT$S ,#BLK ; GET STARTING VIRTUAL ADDRESS ADD $DSW,R4 ; CALCULATE ENDING VIRTUAL ADDRESS .iff MOV #157776,R0 ; Max location available? .SETTOP ; Try to get it MOV R0,R4 ; Save actual top .endc SUB LIMIT+2,R4 ; Now is byte count MOV R4,HI$FRH+2 ; INITIAL INDEX POINTERS BEQ 30$ ; None! MOV LIMIT+2,HI$FRH ; set free head to top memory location 10$: MOV HI$FRH+2,R0 ; Current size SUB R3,R0 ; Enough space? BCC 15$ ; No .ifndf $RT11 NEG R0 ; Get min increment ADD #77,R0 ; Round off to next 32 word block ASH #-6,R0 ; Now is 32 word block count BLE 30$ ; too big EXTK$S R0 ; Try to extend the task BCS 30$ ; Failure ASH #6,R0 ; Get #words ADD R0,HI$FRH+2 ; Next increment BR 10$ .iff BR 30$ .endc 15$: MOV R0,HI$FRH+2 ; Save count MOV HI$FRH,R0 ; Current address ADD R3,HI$FRH ; Increment next address MOV R3,R1 ; Size MOV R0,R3 ; For user address of block CLC ASR R1 ; NOW IS WORD COUNT 20$: CLR (R0)+ ; CLEAR BUFFER SOB R1,20$ ; UNTIL IT IS ALL CLEAR CLC ; CLEAR CARRY FOR OK! RETURN 30$: SEC ; SET CARRY FOR ERROR MOV #-1,R3 ; Bad address RETURN .END