Module mem = Begin External Routine lib$get_vm, lib$free_vm, lib$stop; Own LIST : Vector[33]; ! ! allocate 'n' words of memory ! Global Routine GETSPACE(n) = Begin Local p : Ref Vector, m, sts, k; If .n Eql 0 Then Return 0; m = .n * 8; If .n Gtru 32 Then Begin k = .m; p = 0; sts = lib$get_vm(k,p); If Not .sts Then lib$stop(.sts) End Else Begin p = .list[.n]; If .p Eqla 0 Then Begin k = .m * 32; sts = lib$get_vm(k,p); If Not .sts Then lib$stop(.sts); list[.n] = .p; ! first 30 Incr i From 1 To 30 Do Begin p[0] = .p + .m; p = .p + .m End; ! 31th p[0] = 0; ! 32nd p = .p + .m End Else list[.n] = .p[0] End; ch$fill(0,.m,.p); Return .p End; ! ! duplicate a block of memory ! Global Routine DUPSPACE(p,n) = Begin Local s; s = GETSPACE(.n); ch$move(.n*8,.p,.s); Return .s End; ! ! release a block of memory ! Global Routine RELEASESPACE(p : Ref Vector,n) : Novalue = Begin Local k; If .n Eql 0 Then Return; p = .p And %x'7fffffff'; If .p Eqla 0 Then Return; If .n Gtr 32 Then Begin k = .n * 8; lib$free_vm(p,n) End Else Begin p[0] = .list[.n]; list[.n] = .p End End; End Eludom