.title getindexf Map the indexf.sys file .sbttl History ; Author: R Eldridge ; 104 Computer Science ; Iowa State University ; Ames, IA 50011 ; (515) 294-5659 ; Created: Summer 1984 ; History: none. .sbttl Description ; Description: Map the indexf.sys file into virtual memory and allow ; the calling program to access each file header record. ; Usage: status = getindexf( area, device, buffer ) ; Input: area: storage area (see GETINDEF_area below) ; passed by reference ; ; ifi: internal file identifier ; if ifi = 0 then open file ; ; flag: flag ; if flag = 0 then return next used ; filehdr ; if flag <> 0 then return next filehdr ; ; device: device name (string descriptor) ; passed by reference ; Output: status: integer ; return via r0 ; ; area: storage area (see getindexf_area below) ; passed by reference ; ; ifi: resultant internal file identifier ; ; n_filehdr: number of filehdrs in file ; ; vbn_filehdr: vbn of last mapped filehdr ; ; n_mapped: number of pages mapped ; ; adr_filedhr: address(s) of mapped section ; ; adr_actual: address(s) of mapped section ; ; buffer: file header record (string descriptor) ; passed by reference ; Registers: r3: fab address ; ; r6, r7: length and address of device string descriptor ; length and address of buffer string descriptor ; ; r7: compute #pages mapped ; ; r7, r8: compute #blocks preceeding 1st filehdr ; ; r10: address of home block buffer ; address of current header in mapped section ; ; r11: area(ap) .sbttl Data $FH2DEF $HM2DEF $FIDDEF $RMSDEF $SECDEF $SSDEF .psect data,noexe,rd,wrt,long fab_indexf: $fab fnm=<[0,0]INDEXF.SYS>, - fac=, - mrs=512, - rtv=255, - shr=get rab_indexf: $rab fab=fab_indexf, - usz=512, - ubf=home_block fab_map_indexf: $fab fnm=<[0,0]INDEXF.SYS>, - fop=ufo home_block: .blkb 512 ; home block buffer adr_initial: .long 200,200 ; initial map addresses $defini getindexf_area $def ifi .blkw 1 ; internal file identifier $def flag .blkw 1 ; flag $def n_filehdr .blkl 1 ; number of file headers $def vbn_filehdr .blkl 1 ; vbn of mapped header $def n_mapped .blkl 1 ; number of pages mapped $def adr_filehdr .blkq 1 ; address(s) of mapped section $def adr_actual .blkq 1 ; address(s) of mapped section $defend .sbttl Main Procedure narg = 0 area = 4 device = 8 buffer = 12 .psect code,exe,rd,nowrt,long .entry get_indexf, ^M ; check argument count cmpl #3,narg(ap) ; 3 or more arguments? bleq 10$ ; yes movl #SS$_INSFARG,r0 ; not enough arguments ret ; return to caller ; initialize 10$: bsbw INITIALIZE ; initialize blbc r0,99$ ; if error then return bsbw NEXT ; get first/next filehdr blbc r0,99$ ; if error then return ; test flag to determine action tstw flag(r11) ; test flag beql 20$ ; flag = 0 bneq 30$ ; flag <> 0 ; return next used filehdr 20$: cmpw FH2$W_FID_NUM(r10),#FID$C_MFD ; is filehdr allocated? bgequ 30$ ; yes, return filehdr bsbw NEXT ; no, get next filehdr blbc r0,99$ ; if error then return jmp 20$ ; check again ; return filehdr 30$: movq @buffer(ap),r6 ; string descriptor movc5 #512,(r10),#0,r6,(r7) ; move filehdr to buffer movl #SS$_NORMAL,r0 ; return normal 99$: ret ; return to caller .sbttl Procedure INITIALIZE INITIALIZE: ; if ifi = 0 then open indexf.sys file movl area(ap),r11 ; area address tstw ifi(r11) ; ifi zero? beql 10$ ; yes, initialize ; load i/o channel into fab movw ifi(r11),fab_map_indexf+FAB$L_STV movl #SS$_NORMAL,r0 ; return normal status rsb ; use device name passed to set default device name 10$: movq @device(ap),r6 ; string descriptor moval fab_indexf,r3 ; get fab address moval (r7),FAB$L_DNA(r3) ; default file name address movb r6,FAB$B_DNS(r3) ; default file name size moval fab_map_indexf,r3 ; get fab address moval (r7),FAB$L_DNA(r3) ; default file name address movb r6,FAB$B_DNS(r3) ; default file name size ; open file and connect rms $open - ; open indexf.sys fab=fab_indexf blbc r0,99$ ; if error then return $connect - ; connect rms rab=rab_indexf blbc r0,99$ ; if error then return ; read the home block and compute m moval rab_indexf,r3 ; get rab address movl #2,RAB$L_BKT(r3) ; skip boot block $read - ; read home block rab=rab_indexf blbc r0,99$ ; if error then return bsbw CALCULATE ; close file $close - ; close file fab=fab_indexf blbc r0,99$ ; if error then return ; open file for mapping $open - ; open file fab=fab_map_indexf blbc r0,99$ ; if error then return ; save i/o channel movw fab_map_indexf+FAB$L_STV,ifi(r11) ; do initial mapping bsbw MAP ; map first time 99$: rsb .sbttl Procedure CALCULATE CALCULATE: ; compute m, the number of blocks preceeding the first file header ; m = 1 + 4 * cluster_size + int ((max_files + 4095) / 4096) movab home_block,r10 ; home block buffer movzwl HM2$W_CLUSTER(r10),r7 ; offset to 1st filehdr mull #4,r7 ; *4 incl r7 ; +1 movl r7,vbn_filehdr(r11) ; vbn of start of bitmap movl HM2$L_MAXFILES(r10),r8 ; max number of files movl r8,n_filehdr(r11) ; number of filehdrs addl #4095,r8 ; round up to next block divl3 #4096,r8,n_mapped(r11) ; bitmap size in blocks addl n_mapped(r11),vbn_filehdr(r11) ; vbn of 1st filehdr rsb .sbttl Procedure MAP MAP: movl n_filehdr(r11),r6 ; more filehdrs? bneq 10$ ; yes clrl adr_filehdr(r11) ; no, flag it done bsbw RELEASE ; release mapped pages rsb ; release any pages mapped 10$: bsbw RELEASE ; release mapped pages ; do Mapping $crmpsc_s - ; map inadr=adr_initial, - retadr=adr_filehdr(r11), - flags=#SEC$M_EXPREG, - chan=fab_map_indexf+FAB$L_STV, - pagcnt=r6, - vbn=vbn_filehdr(r11) movq adr_filehdr(r11),adr_actual(r11) addl3 #4,adr_filehdr+4(r11),r7 ; number of pages mapped subl adr_filehdr(r11),r7 divl3 #512,r7,n_mapped(r11) cmpl #SS$_VASFULL,r0 ; too big to map? bneq 20$ ; no movl #SS$_NORMAL,r0 ; SS$_VASFULL is ok subl n_mapped(r11),n_filehdr(r11) ; pages remaining addl n_mapped(r11),vbn_filehdr(r11) ; new offset into file rsb 20$: blbc r0,99$ ; if error then return clrl n_filehdr(r11) ; no more filehdrs to map 99$: rsb .sbttl Procedure NEXT NEXT: movl adr_filehdr(r11),r10 ; address of current header cmpl r10,adr_filehdr+4(r11) ; end of map? blequ 10$ ; no bsbw MAP ; yes, map in next chunk blbc r0,99$ ; if error then return movl adr_filehdr(r11),r10 ; end of file? bneq 99$ ; no movl #SS$_ENDOFFILE,r0 ; yes, set end of file rsb 10$: movab 512(r10),adr_filehdr(r11) ; point to next filehdr 99$: rsb .sbttl Procedure RELEASE RELEASE: ; relase any pages mapped tstl n_mapped(r11) ; are any pages mapped? beql 99$ ; no $deltva_s - ; yes, release pages inadr=adr_actual(r11) ; address(s) of pages mapped 99$: rsb .end