223 lines
2.9 KiB
PHP
223 lines
2.9 KiB
PHP
;; File: stpdfs.inc
|
|
|
|
STPDFS_BLOCK_SIZE = 512
|
|
STPDFS_NAME_MAX = 28
|
|
|
|
;; Struct: Inode
|
|
struc Inode {
|
|
.inode dw ?
|
|
.nlink dw ?
|
|
.uid dw ?
|
|
.gid dw ?
|
|
.flags dw ?
|
|
.size dd ?
|
|
.zones dd 10 dup(?)
|
|
.actime dq ?
|
|
.modtime dq ?
|
|
}
|
|
DEFN Inode
|
|
|
|
STPDFS_INODE_PER_BLOCK equ STPDFS_BLOCK_SIZE / sizeof.Inode
|
|
|
|
;; Struct: DirEntry
|
|
struc DirEntry {
|
|
.inum dd ?
|
|
.name db STPDFS_NAME_MAX dup(?)
|
|
}
|
|
DEFN DirEntry
|
|
|
|
;; Function: stpdfs_load_rootdir
|
|
;;
|
|
;; Out:
|
|
;;
|
|
stpdfs_load_rootdir:
|
|
; read first inode
|
|
mov ax, DISK_BUFFER/0x10
|
|
mov es, ax
|
|
mov ax, 2
|
|
mov cx, 1
|
|
xor bx, bx
|
|
|
|
call disk_read_sectors
|
|
|
|
; root dir is inode 1
|
|
xor ax, ax
|
|
mov es, ax
|
|
mov ecx, sizeof.Inode
|
|
mov esi, DISK_BUFFER + sizeof.Inode
|
|
mov edi, inode_cache
|
|
rep movsb
|
|
|
|
mov ax, DISK_BUFFER/0x10
|
|
mov es, ax
|
|
xor bx, bx
|
|
call stpdfs_copy_data
|
|
|
|
ret
|
|
|
|
;; Function: stpdfs_read_inode
|
|
;;
|
|
;; copy selected inode from file system to `inode_cache`
|
|
;;
|
|
;; In:
|
|
;; EAX - inum
|
|
;;
|
|
stpdfs_read_inode:
|
|
; get block where inode is located
|
|
xor edx, edx
|
|
mov ecx, STPDFS_INODE_PER_BLOCK
|
|
div ecx
|
|
add eax, 2
|
|
|
|
; read block
|
|
push edx
|
|
push eax
|
|
mov ax, DISK_BUFFER/0x10
|
|
mov es, ax
|
|
pop eax
|
|
mov cx, 1
|
|
xor bx, bx
|
|
call disk_read_sectors
|
|
pop edx
|
|
|
|
; copy to inode cache
|
|
mov eax, edx
|
|
mov cl, sizeof.Inode
|
|
mul cl
|
|
movzx esi, ax
|
|
add esi, DISK_BUFFER
|
|
|
|
xor ax, ax
|
|
mov es, ax
|
|
mov ecx, sizeof.Inode
|
|
mov edi, inode_cache
|
|
rep movsb
|
|
|
|
ret
|
|
|
|
;; Function: stpdfs_search
|
|
;;
|
|
;; In:
|
|
;; SI - filename
|
|
;;
|
|
;; Out:
|
|
;; EAX - kernel inode
|
|
stpdfs_search:
|
|
clc ; clear carry flag
|
|
|
|
xor ax, ax
|
|
mov es, ax
|
|
|
|
xor ecx, ecx
|
|
.search_loop:
|
|
cmp ecx, dword [inode_cache + Inode.size]
|
|
jge .search_end
|
|
|
|
push ecx
|
|
|
|
; check if inum != 0
|
|
mov eax, DISK_BUFFER
|
|
add eax, ecx
|
|
mov edx, [eax]
|
|
|
|
or edx, edx
|
|
jz .search_next
|
|
|
|
; compare filename
|
|
mov edi, eax
|
|
add edi, 4
|
|
|
|
push si
|
|
.strcmp:
|
|
mov al, [si]
|
|
cmpsb
|
|
jne .strcmp_not_equal
|
|
or al, al
|
|
jz .kernel_found
|
|
jmp .strcmp
|
|
.strcmp_not_equal:
|
|
pop si
|
|
.search_next:
|
|
pop ecx
|
|
add ecx, sizeof.DirEntry
|
|
jmp .search_loop
|
|
.search_end:
|
|
stc
|
|
ret
|
|
.kernel_found:
|
|
pop si
|
|
pop ecx
|
|
|
|
mov eax, edx
|
|
|
|
clc
|
|
ret
|
|
|
|
;; Function: stpdfs_copy_data
|
|
;;
|
|
;; In:
|
|
;; ES:BX - buffer
|
|
;;
|
|
stpdfs_copy_data:
|
|
xor edx, edx
|
|
movzx ebx, bx
|
|
|
|
;; read direct
|
|
@@:
|
|
cmp ebx, dword [inode_cache + Inode.size]
|
|
jg .all_read
|
|
mov eax, edx
|
|
shl eax, 2
|
|
add eax, inode_cache + Inode.zones
|
|
mov eax, [eax]
|
|
|
|
push edx
|
|
push ebx
|
|
mov cx, 1
|
|
call disk_read_sectors
|
|
pop ebx
|
|
pop edx
|
|
|
|
add ebx, STPDFS_BLOCK_SIZE
|
|
inc edx
|
|
cmp edx, 7
|
|
jb @b
|
|
|
|
.indirect_read:
|
|
push ebx
|
|
mov ax, es
|
|
push ax
|
|
|
|
mov ax, DISK_BUFFER/0x10
|
|
mov es, ax
|
|
|
|
mov eax, dword [inode_cache + Inode.zones + 28]
|
|
mov cx, 1
|
|
xor bx, bx
|
|
call disk_read_sectors
|
|
|
|
pop ax
|
|
mov es, ax
|
|
|
|
pop ebx
|
|
xor edx, edx
|
|
@@:
|
|
cmp ebx, dword [inode_cache + Inode.size]
|
|
jg .all_read
|
|
mov eax, edx
|
|
shl eax, 2
|
|
add eax, DISK_BUFFER
|
|
mov eax, [eax]
|
|
|
|
mov cx, 1
|
|
push edx
|
|
call disk_read_sectors
|
|
pop edx
|
|
|
|
add ebx, STPDFS_BLOCK_SIZE
|
|
inc edx
|
|
cmp edx, 128
|
|
jbe @b
|
|
.all_read:
|
|
ret
|