.title directory ok=0 eof=-1 err=-3 ; ; linked list of FAB's for directory routines ; next_fab=-4 ; offset from FAB to pointer to next FAB fab_10=0 ; end of list exp_str_size=100 ; size of expanded string ; ; free list listhead ; .psect st_directory_data rel,con,gbl,noexe,wrt,rd,pic,noshr,usr,novec,long free_fab: .address fab_0 .address fab_1 fab_0: $fab nam=nam_0 nam_0: $nam esa=esb_0,ess=exp_str_size esb_0: .blkb exp_str_size .address fab_2 fab_1: $fab nam=nam_1 nam_1: $nam esa=esb_1,ess=exp_str_size esb_1: .blkb exp_str_size .address fab_3 fab_2: $fab nam=nam_2 nam_2: $nam esa=esb_2,ess=exp_str_size esb_2: .blkb exp_str_size .address fab_4 fab_3: $fab nam=nam_3 nam_3: $nam esa=esb_3,ess=exp_str_size esb_3: .blkb exp_str_size .address fab_5 fab_4: $fab nam=nam_4 nam_4: $nam esa=esb_4,ess=exp_str_size esb_4: .blkb exp_str_size .address fab_6 fab_5: $fab nam=nam_5 nam_5: $nam esa=esb_5,ess=exp_str_size esb_5: .blkb exp_str_size .address fab_7 fab_6: $fab nam=nam_6 nam_6: $nam esa=esb_6,ess=exp_str_size esb_6: .blkb exp_str_size .address fab_8 fab_7: $fab nam=nam_7 nam_7: $nam esa=esb_7,ess=exp_str_size esb_7: .blkb exp_str_size .address fab_9 fab_8: $fab nam=nam_8 nam_8: $nam esa=esb_8,ess=exp_str_size esb_8: .blkb exp_str_size .address fab_10 fab_9: $fab nam=nam_9 nam_9: $nam esa=esb_9,ess=exp_str_size esb_9: .blkb exp_str_size ; ; start of code ; .psect st_pure_code rel,con,lcl,exe,nowrt,rd,pic,shr,usr,novec,long ; ; integer function dopen(name, length, fab) ; ; return(OK/ERR) ; name=4 length=8 fab=12 ; .entry dopen ^m movl free_fab,r2 ; address of next free FAB beql 10$ ; if == 0, none left movl next_fab(r2),free_fab ; unlink FAB from list $fab_store fab=r2,fna=@name(ap),fns=@length(ap) $parse fab=r2 blbc r0,20$ ; lbc => error movl r2,@fab(ap) ; return FAB address movl #ok,r0 ; return(OK) ret 20$: movl r2,free_fab ; link back into free list 10$: movl #err,r0 ; return(ERR) ret ; ; subroutine dclose(fab) ; fab=4 ; .entry dclose ^m<> movl @fab(ap),r0 ; FAB address movl free_fab,next_fab(r0) ; link back into free list movl r0,free_fab ; ... ret ; ; integer function dfind(fab, buf) ; ; return(OK/EOF) ; fab=4 buf=8 ; .entry dfind ^m movl @fab(ap),r3 ; FAB address movl fab$l_nam(r3),r2 ; NAM address $nam_store nam=r2,rsa=@buf(ap),rss=#exp_str_size,rsl=#0 $search fab=r3 ; find next file in directory blbc r0,30$ ; lbc => error movzbl nam$b_rsl(r2),r0 ; length of resultant string addl2 buf(ap),r0 ; address of first free char clrb (r0) ; terminate with EOS movl #ok,r0 ; return(OK) ret 30$: movl #eof,r0 ; return(EOF) ret .end