.title rablst ; ; functions to get and put rms data structures ; used by openf and closef for software tools ; ; calling sequences: ; rab = getrab(0) ; argument is a dummy one ; call putrab(rab) ; ; ; linked list of rab's and fab's follow: ; rab_l_next==-12 rab_l_curbl==-8 rab_l_curby==-4 .psect st_rablst_data rel,con,gbl,noexe,wrt,rd,pic,noshr,usr,novec,long rabhd: .address rab1 ;rab1 .address rab2 .blkl 1 .blkl 1 rab1: $rab fab=fab1 fab1: $fab fna=fna1 fna1: .blkb 104 ;rab2 .address rab3 .blkl 1 .blkl 1 rab2: $rab fab=fab2 fab2: $fab fna=fna2 fna2: .blkb 104 ;rab3 .address rab4 .blkl 1 .blkl 1 rab3: $rab fab=fab3 fab3: $fab fna=fna3 fna3: .blkb 104 ;rab4 .address rab5 .blkl 1 .blkl 1 rab4: $rab fab=fab4 fab4: $fab fna=fna4 fna4: .blkb 104 ;rab5 .address rab6 .blkl 1 .blkl 1 rab5: $rab fab=fab5 fab5: $fab fna=fna5 fna5: .blkb 104 ;rab6 .address rab7 .blkl 1 .blkl 1 rab6: $rab fab=fab6 fab6: $fab fna=fna6 fna6: .blkb 104 ;rab7 .address rab8 .blkl 1 .blkl 1 rab7: $rab fab=fab7 fab7: $fab fna=fna7 fna7: .blkb 104 ;rab8 .address rab9 .blkl 1 .blkl 1 rab8: $rab fab=fab8 fab8: $fab fna=fna8 fna8: .blkb 104 ;rab9 .address raba .blkl 1 .blkl 1 rab9: $rab fab=fab9 fab9: $fab fna=fna9 fna9: .blkb 104 ;raba .address rabb .blkl 1 .blkl 1 raba: $rab fab=faba faba: $fab fna=fnaa fnaa: .blkb 104 ;rabb .address rabc .blkl 1 .blkl 1 rabb: $rab fab=fabb fabb: $fab fna=fnab fnab: .blkb 104 ;rabc .address rabd .blkl 1 .blkl 1 rabc: $rab fab=fabc fabc: $fab fna=fnac fnac: .blkb 104 ;rabd .address rabe .blkl 1 .blkl 1 rabd: $rab fab=fabd fabd: $fab fna=fnad fnad: .blkb 104 ;rabe .address rabf .blkl 1 .blkl 1 rabe: $rab fab=fabe fabe: $fab fna=fnae fnae: .blkb 104 ;rabf .long 0 .blkl 1 .blkl 1 rabf: $rab fab=fabf fabf: $fab fna=fnaf fnaf: .blkb 104 ; ; ; entry point for getrab ; ; call sequence: rab = getrab(0) ; .psect st_pure_code rel,con,lcl,exe,nowrt,rd,pic,shr,usr,novec,long .entry getrab ^m<> moval rabhd,r1 ; listhead in r1 movl (r1),r0 ; address of free node in r0 beql retrn ; if 0, then no more free nodes movl rab_l_next(r0),(r1) ; relink list clrl rab_l_curbl(r0) ; initialize current block value clrl rab_l_curby(r0) ; initialize current byte value retrn: ret ; ; ; entry point for putrab ; ; call sequence call putrab(%val(rab)) ; .psect st_pure_code rel,con,lcl,exe,nowrt,rd,pic,shr,usr,novec,long .entry putrab ^m<> movl 4(ap),r0 ; address of node to be returned movl rabhd,r1 ; address of first free node in r1 loop: tstl r1 beql retok ; have reached end of linked list cmpl r0,r1 ; compare addresses of nodes beql notok ; user trying to return node twice movl rab_l_next(r1),r1 ; address of next free node in r1 brb loop retok: moval rabhd,r1 ; listhead in r1 movl (r1),rab_l_next(r0) ; returned node points to top node movl r0,(r1) ; listhead now points to returned node notok: ret .end