include 'gsos.equ' include 'minix.equ' include 'fst.equ' include 'fst.macros' include 'M16.Debug' include 'records.equ' include 'p.equ' ; ; dirent_entry 0 is a special case. ; (assuming base = 1, displacement = 1) ; first call: ; before ; dirent_entry = 0, dirent_zone = 0, dirent_offset = 0 ; after: ; dirent_entry = 1, dirent_zone = 0, dirent_offset = 0 ; ; subsequent calls: ; before ; dirent_entry = 1, dirent_zone = ..., dirent_offset = ... ; after ; dirent_entry = 2, dirent_zone = ..., dirent_offset = ... ; gde_dp record dp.__end ; size of the directory, divided by dirent_size. size ds.l 1 displacement ds.w 1 dirent_size ds.w 1 dirent_zone ds.w 1 dirent_offset ds.w 1 dirent_entry ds.w 1 IF *>=$d4 THEN AERROR 'dp -- too large.' ENDIF endr data record dirent ds v1L_dirent endr import init_fcr import init_vcr import load_inode import read_data_block import do_ignore import do_eof import do_blocks import do_r_eof import do_r_blocks import do_access import do_file_sys_id import do_option_list import do_create_date_time import do_mod_date_time import do_file_type import do_aux_type entry init entry base_displace entry find_next_dirent entry find_absolute_dirent entry find_dirent_block entry count_entries entry count_dirent_block entry do_flags entry do_name_buffer_0 entry do_name_buffer_1 entry do_entry_num get_dir_entry procname export with fst_parms with dp with gde_dp ;~DebugSetTrace #1 jsr init_fcr jsr init_vcr ; check for read-access ldy #fcr.access lda [ return total count. ; cmp #0 beq @count jmp find_absolute_dirent @count jmp count_entries forward jmp find_next_dirent ; backward ; backward 0 ? == forward 0 cmp #0 beq forward eor #$ffff sec ; inc / clc adc dirent_entry sta displacement jmp find_absolute_dirent endp count_entries proc ; count the number of entries. with fst_parms with dp, gde_dp ; read each block and count the entries. ; only handles direct blocks. so there. ; disk inode has been copied to the dp. stz dirent_entry ldx #0 zone_loop lda disk_inode.zone,x beq next ; directory should not be sparse! phx ; save jsr read_data_block plx ; and restore bcs exit ; phx ; phy ; pha ; ~DebugHexDump read entry 0) ; ; find_absolute_dirent proc with gde_dp ; 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 with gde_dp, dp lda dirent_entry beq @first dec dirent_entry bra @ok @first dec displacement bmi eod @ok ldx dirent_zone loop lda disk_inode.zone,x beq sparse ; should never happen... phx ; save jsr read_data_block plx bcs exit ; phx ; phy ; pha ; ~DebugHexDump 32, 16 -> 64. cmp #32 beq @ok lda #64 @ok eor #$ffff sec ; + 1 adc size sta size bra next found_it ;stx dirent_zone ;sty dirent_offset clc exit rts eod lda #end_of_dir sec rts endp ; ; returns: ; carry set on error. ; overflow clear if found ; ; inputs y = dirent offset find_dirent_block proc with dp, gde_dp ldy dirent_offset loop lda [io_buffer],y beq next inc dirent_entry dec displacement bmi found_it next dec size beq eod tya clc adc dirent_size tay cmp #1024 bcc loop ; not found ... lda #0 clc sep #p.v rts eod lda #end_of_dir sec rts found_it ; we found our entry!!! ; copy it over. stx dirent_zone sty dirent_offset ; dirent_entry updated above. ldx #0 @loop lda [io_buffer],y sta data.dirent,x iny iny inx inx cpx dirent_size bcc @loop ; update the fcr. lda dirent_entry ldy #fcr.dirent_entry sta [my_fcr],y lda dirent_offset ldy #fcr.dirent_offset sta [my_fcr],y lda dirent_zone ldy #fcr.dirent_zone sta [my_fcr],y lda #0 clc clv rts endp end