diff --git a/get_dir_entry.aii b/get_dir_entry.aii index be62aa0..8845c7d 100644 --- a/get_dir_entry.aii +++ b/get_dir_entry.aii @@ -28,6 +28,9 @@ gde_dp record dp + ; size of the directory, divided by dirent_size. +size ds.l 1 + displacement ds.w 1 dirent_size ds.w 1 @@ -86,7 +89,7 @@ access_ok dir jsr init - jst get_base_displace + jst base_displace bcc @ok rtl @@ -100,6 +103,14 @@ dir lda data.dirent.inode beq dispatch + ; if inode == the directory inode, no need to re-load it. + cmp inode + beq dispatch + + sta inode + jsr load_inode + bcs exit + dispatch lda read entry 0) +; +; +find_absolute_dirent proc + + ; if displacement > dirent_entry, we can re-use that info. + lda displacement + cmp dirent_entry + bcc no + + sec + sbc dirent_entry + sta displacement + bra find_next_dirent + +no + stz dirent_entry + stz dirent_zone + stz dirent_offset + + bra find_next_dirent + endp + +find_next_dirent proc + + lda dirent_entry + bne @ok + ; if currently on dirent entry 0, displacement -= 1 + inc dirent_entry + dec displacement + bmi eod +@ok + + ldx dirent_zone + +loop + lda disk_inode,x + beq sparse ; should never happen... + phx ; save + jsr read_data_block + plx + bcs exit + + jsr find_dirent_block + bcs exit + bvc found_it + +next + inx + inx + stz dirent_offset + + cpx #v1.NR_DZONES*2 + bcs exit + + ; also check size + lda size + beq eod + bmi eod + + bra loop + +sparse + ; should never happen... + ; skip over 1 block. + ; size -= dirents per block -- 32 for linux, 64 for minix + lda dirent_size ; 16 or 32. 32 -> 32, 16 -> 64. + cmp #32 + beq @ok + lda #64 + eor #$ffff + sec ; + 1 + adc size + sta size + bra next + + +found_it + stx dirent_zone + sty dirent_offset + clc +exit + rts + endp + +eod + lda #end_of_dir + sec + rts + end \ No newline at end of file