From fd6310a0f64eeab1dd1dd22fd5a33287a265b316 Mon Sep 17 00:00:00 2001 From: Robert Pengelly Date: Mon, 5 Aug 2024 10:40:46 +0100 Subject: [PATCH] Implemented mkdir --- build/chimaera.img | Bin 368640 -> 368640 bytes build/chimaera.vhd | Bin 34120704 -> 34120704 bytes src/Makefile.unix | 5 +- src/Makefile.w32 | 2 +- src/apps/hello/hello.asm | 33 +- src/apps/pcomm/Makefile.unix | 2 +- src/apps/pcomm/Makefile.w32 | 2 +- src/apps/pcomm/dir.asm | 4 +- src/apps/pcomm/mkdir.asm | 189 ++++++++ src/apps/pcomm/pcomm.asm | 30 ++ src/apps/pcomm/type.asm | 23 +- src/kernel/Makefile.unix | 2 +- src/kernel/Makefile.w32 | 2 +- src/kernel/disk.asm | 228 +++++++++- src/kernel/fat.asm | 810 ++++++++++++++++++++++++++++++++++- src/kernel/file.asm | 68 +-- src/kernel/int21.asm | 180 +++++++- src/kernel/make.asm | 482 +++++++++++++++++++++ src/kernel/walk.asm | 73 +++- 19 files changed, 2067 insertions(+), 68 deletions(-) create mode 100644 src/apps/pcomm/mkdir.asm create mode 100644 src/kernel/make.asm diff --git a/build/chimaera.img b/build/chimaera.img index b02386d1b16436c8ed65d88b01c5ee59dfad7d54..c8767c1233d093e2b062d5037a6c062af85f2813 100644 GIT binary patch delta 10376 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 delta 7934 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 lk5S@Nn00QOK31#=!Z3{|j|>k!1h? diff --git a/build/chimaera.vhd b/build/chimaera.vhd index 98393defcda3850b26f73fddcf38e0bdd68b54e7..38de4898930509ab5fe0f056527f9fb315daf253 100644 GIT binary patch delta 13033 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 delta 10850 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 Pointer to ASCIIZ path name. +;****************************************************************************** +_int21_39: + + push bx + push cx + push dx + push si + push di + push es + push ds + + mov si, dx + + call _get_disk_info + jc _int21_39.error_path + + mov di, si + + call _walk_path + jc _int21_39.error_path + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Preserve registers. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + push ax + push dx + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Mangle the file name and search for it in the file system. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + call _mangle_dos_name + jc _int21_39.name_error + + call _search_dos_dir + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Restore registers. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + pop dx + pop ax + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; If the carry flag wasn't set then the entry already exists. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + jnc _int21_39.error_exists + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; If we get here then the path is okay and the entry doesn't exist + ;; so lets try and create it. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov cx, HEX (10) + + call _make_dos_entry + jc _int21_39.error + + jmp _int21_39.done + +_int21_39.name_error: + + pop dx + pop ax + +_int21_39.error_exists: + + mov ax, 5 + +_int21_39.error_path: + + mov ax, 3 + +_int21_39.error: + + pop ds + pop es + pop di + pop si + pop dx + pop cx + pop bx + + stc + jmp iretc + +_int21_39.done: + + pop ds + pop es + pop di + pop si + pop dx + pop cx + pop bx + + xor ax, ax + clc + + jmp iretc + ;****************************************************************************** ; @function _int21_3B ; @brief Set Current Directory @@ -1793,6 +1916,9 @@ _int21_3B.copy: lodsw mov cs:[_clustsize], ax + lodsw + mov cs:[_info_sector], ax + pop ds pop si pop es @@ -1813,8 +1939,14 @@ _int21_3B.fat32: mov ax, offset _convert_cluster32 mov cs:[_convert_cluster], ax + mov ax, offset _find_free32 + mov cs:[_find_free], ax + mov ax, offset _nextcluster_fat32 mov cs:[_next_cluster], ax + + mov ax, offset _update_cluster32 + mov cs:[_update_cluster], ax _int21_3B.get_path: @@ -1939,12 +2071,20 @@ _int21_3B.check_prev: _int21_3B.get_prev: - mov byte ptr es:[di - 1], 0 + cmp di, offset _int21_3B.path + je _int21_3B.no_slash2 + + cmp byte ptr es:[di - 1], '\\' + jne _int21_3B.no_slash2 + mov byte ptr es:[di - 1], 0 + +_int21_3B.no_slash2: + push si push ds - mov ax, es + mov ax, cs mov ds, ax mov ax, '\\' @@ -1959,10 +2099,20 @@ _int21_3B.get_prev: pop ds pop si + and ax, ax + jnz _int21_3B.got_index + + mov di, offset _int21_3B.path + jmp _int21_3B.zero + +_int21_3B.got_index: + mov di, ax inc di + +_int21_3B.zero: + mov byte ptr es:[di], 0 - jmp _int21_3B.loop _int21_3B.char_ok: @@ -2255,6 +2405,7 @@ _int21_3F.copy: push si push ds push ax + push cx mov ds, ax xor si, si @@ -2308,6 +2459,9 @@ _int21_3F.copy: lodsw mov cs:[_clustsize], ax + lodsw + mov cs:[_info_sector], ax + mov bx, cs:[_root_cluster] mov cx, cs:[_root_cluster + 2] @@ -2324,11 +2478,18 @@ _int21_3F.fat32: mov ax, offset _convert_cluster32 mov cs:[_convert_cluster], ax + mov ax, offset _find_free32 + mov cs:[_find_free], ax + mov ax, offset _nextcluster_fat32 mov cs:[_next_cluster], ax + + mov ax, offset _update_cluster32 + mov cs:[_update_cluster], ax _int21_3F.read: + pop cx pop ax pop ds pop si @@ -2698,12 +2859,12 @@ _int21_4C.check_file: mov ds, di xor di, di - mov ax, [di + 70] + mov ax, [di + 72] cmp ax, dx jne _int21_4C.next_file - mov ax, [di + 68] + mov ax, [di + 70] push es mov es, ax @@ -3215,6 +3376,9 @@ _int21_4F.copy: lodsw mov cs:[_clustsize], ax + lodsw + mov cs:[_info_sector], ax + pop di pop si pop ds @@ -3236,8 +3400,14 @@ _int21_4F.fat32: mov ax, offset _convert_cluster32 mov cs:[_convert_cluster], ax + mov ax, offset _find_free32 + mov cs:[_find_free], ax + mov ax, offset _nextcluster_fat32 mov cs:[_next_cluster], ax + + mov ax, offset _update_cluster32 + mov cs:[_update_cluster], ax _int21_4F.find: diff --git a/src/kernel/make.asm b/src/kernel/make.asm new file mode 100644 index 0000000..741438f --- /dev/null +++ b/src/kernel/make.asm @@ -0,0 +1,482 @@ +;****************************************************************************** +; @file make.asm +;****************************************************************************** +%ifndef HEX +% define HEX(y) 0x##y +%endif + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Include our fat.inc file for our BPB offsets. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +%include "fat.inc" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; @function _generate_timestamp +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +_generate_timestamp: + + push si + push cx + push dx + + mov ah, HEX (2C) + int HEX (21) + + xor ah, ah + mov al, dh + shr ax + mov si, ax + + push cx + xor ah, ah + mov al, cl + mov cl, 5 + shl ax, cl + pop cx + add si, ax + + push cx + xor ah, ah + mov al, ch + mov cl, 11 + shl ax, cl + pop cx + add si, ax + +_generate_timestamp.done: + + mov ax, si + + pop dx + pop cx + pop si + ret + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; @function _generate_datestamp +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +_generate_datestamp: + + push si + push cx + push dx + + mov ah, HEX (2A) + int HEX (21) + + xor ah, ah + mov al, dl + mov si, ax + + push cx + xor ah, ah + mov al, dh + mov cl, 5 + shl ax, cl + pop cx + add si, ax + + push cx + mov ax, cx + sub ax, 1980 + mov cl, 9 + shl ax, cl + pop cx + add si, ax + +_generate_datestamp.done: + + mov ax, si + + pop dx + pop cx + pop si + ret + + +;****************************************************************************** +; @function _make_dos_entry +;****************************************************************************** +global _make_dos_entry +_make_dos_entry: + + push bp + + mov bp, sp + sub sp, 48 + + push bx + push cx + push dx + push si + push di + push es + push ds + + mov word ptr [bp - 48], ax + mov word ptr [bp - 46], dx + + mov word ptr [bp - 36], cx + mov word ptr [bp - 32], bx + + mov word ptr [bp - 20], 0 + mov word ptr [bp - 16], 0 + + mov bx, ax + or bx, dx + + and bx, bx + jnz _make_dos_entry.not_root + + mov ax, cs:[_root_start] + mov dx, cs:[_root_start + 2] + +_make_dos_entry.got_root: + + mov word ptr [bp - 30], 1 + mov word ptr [bp - 24], 1 + + mov word ptr [bp - 28], ax + mov word ptr [bp - 26], dx + + mov ax, 32 + xor dx, dx + + mov cx, cs:[_root_entries] + mul cx + + mov cx, cs:[_bytes_per_sector] + div cx + + xchg cx, ax + dec cx + + xor dx, dx + mov word ptr [bp - 22], cx + + mov ax, word ptr [bp - 28] + mov dx, word ptr [bp - 26] + + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx + + jmp _make_dos_entry.read + +_make_dos_entry.not_root: + + mov word ptr [bp - 30], 0 + mov word ptr [bp - 24], 1 + + mov word ptr [bp - 28], ax + mov word ptr [bp - 26], dx + + call cs:[_convert_cluster] + jc _make_dos_entry.error + + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx + + xor ch, ch + mov cl, cs:[_sectors_per_cluster] + + mov word ptr [bp - 34], cx + dec word ptr [bp - 34] + +_make_dos_entry.read: + + mov bx, cs:[_disk_scratch] + mov es, bx + xor bx, bx + + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] + + mov cx, word ptr [bp - 24] + call _read_sectors + + mov ax, cs:[_bytes_per_sector] + xor dx, dx + + mov cx, 32 + div cx + xchg cx, ax + + xor di, di + +_make_dos_entry.make: + + cmp byte ptr es:[di], 0 + je _make_dos_entry.found_free + + cmp byte ptr es:[di], HEX (E5) + je _make_dos_entry.found_free + +_make_dos_entry.advance: + + add di, 32 + loop _make_dos_entry.make + + cmp word ptr [bp - 30], 1 + jne _make_dos_entry.check + + mov ax, word ptr [bp - 22] + + and ax, ax + jz _make_dos_entry.error + + dec ax + mov word ptr [bp - 22], ax + + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] + + add ax, word ptr [bp - 24] + adc dx, 0 + + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx + + jmp _make_dos_entry.read + +_make_dos_entry.check: + + mov ax, word ptr [bp - 34] + + and ax, ax + jz _make_dos_entry.next_clust + + dec ax + mov word ptr [bp - 34], ax + + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] + + add ax, word ptr [bp - 24] + adc dx, 0 + + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx + + jmp _make_dos_entry.read + +_make_dos_entry.next_clust: + + mov ax, word ptr [bp - 28] + mov dx, word ptr [bp - 26] + + call cs:[_next_cluster] + jmp _make_dos_entry.not_root + +_make_dos_entry.found_free: + + call cs:[_find_free] + jc _make_dos_entry.error + +_make_dos_entry.got_clust: + + mov word ptr [bp - 38], ax + mov word ptr [bp - 40], dx + + call _generate_datestamp + mov word ptr [bp - 42], ax + + call _generate_timestamp + mov word ptr [bp - 44], ax + + push si + push ds + + mov si, cs + mov ds, si + + mov si, word ptr [bp - 32] + + mov cx, 11 + rep movsb + + pop ds + pop si + + mov ax, word ptr [bp - 36] + stosb + + xor ax, ax + stosw + + mov ax, word ptr [bp - 44] + stosw + + mov ax, word ptr [bp - 42] + stosw + + mov ax, word ptr [bp - 42] + stosw + + mov ax, word ptr [bp - 40] + stosw + + mov ax, word ptr [bp - 44] + stosw + + mov ax, word ptr [bp - 42] + stosw + + mov ax, word ptr [bp - 38] + stosw + + xor ax, ax + stosw + stosw + + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] + + mov cx, word ptr [bp - 24] + call _write_sectors + + mov ax, word ptr [bp - 38] + mov dx, word ptr [bp - 40] + + mov bx, HEX (FFFF) + mov cx, HEX (FFF8) + + call cs:[_update_cluster] + + mov ax, cs:[_disk_scratch] + mov es, ax + + xor al, al + xor di, di + + mov cx, cs:[_clustsize] + rep stosb + + xor di, di + + mov al, '.' + stosb + + mov al, ' ' + + mov cx, 10 + rep stosb + + mov al, HEX (10) + stosb + + xor ax, ax + stosw + + mov ax, word ptr [bp - 44] + stosw + + mov ax, word ptr [bp - 42] + stosw + + mov ax, word ptr [bp - 42] + stosw + + mov ax, word ptr [bp - 40] + stosw + + mov ax, word ptr [bp - 44] + stosw + + mov ax, word ptr [bp - 42] + stosw + + mov ax, word ptr [bp - 38] + stosw + + xor ax, ax + stosw + stosw + + mov al, '.' + + mov cx, 2 + rep stosb + + mov al, ' ' + + mov cx, 9 + rep stosb + + mov al, HEX (10) + stosb + + xor ax, ax + stosw + + mov ax, word ptr [bp - 44] + stosw + + mov ax, word ptr [bp - 42] + stosw + + mov ax, word ptr [bp - 42] + stosw + + mov ax, word ptr [bp - 46] + stosw + + mov ax, word ptr [bp - 44] + stosw + + mov ax, word ptr [bp - 42] + stosw + + mov ax, word ptr [bp - 48] + stosw + + xor ax, ax + stosw + stosw + + mov ax, word ptr [bp - 38] + mov dx, word ptr [bp - 40] + call cs:[_convert_cluster] + + xor ch, ch + mov cl, cs:[_sectors_per_cluster] + + xor bx, bx + call _write_sectors + + jmp _make_dos_entry.done + +_make_dos_entry.error: + + pop ds + pop es + pop di + pop si + pop dx + pop cx + pop bx + + add sp, 48 + pop bp + + mov ax, 5 + stc + + ret + +_make_dos_entry.done: + + pop ds + pop es + pop di + pop si + pop dx + pop cx + pop bx + + add sp, 48 + pop bp + + xor ax, ax + clc + + ret diff --git a/src/kernel/walk.asm b/src/kernel/walk.asm index 98c1c4d..7fd3a25 100644 --- a/src/kernel/walk.asm +++ b/src/kernel/walk.asm @@ -70,6 +70,56 @@ _walk_path.end_path: call _mangle_dos_name jc _walk_path.not_found + cmp dx, cs:[_root_cluster + 2] + jne _walk_path.search + + cmp ax, cs:[_root_cluster] + jne _walk_path.search + +_walk_path.compare_curr: + + push ax + push ds + + mov ax, cs + mov ds, ax + + push bx + + mov ax, offset _curr_check + push ax + + call _strcmp + add sp, 4 + + and ax, ax + pop ds + pop ax + jz _walk_path.check + +_walk_path.compare_prev: + + push ax + push ds + + mov ax, cs + mov ds, ax + + push bx + + mov ax, offset _prev_check + push ax + + call _strcmp + add sp, 4 + + and ax, ax + pop ds + pop ax + jz _walk_path.check + +_walk_path.search: + call _search_dos_dir jc _walk_path.not_found @@ -82,14 +132,27 @@ _walk_path.end_path: mov ax, es:[bx + 0] mov dx, es:[bx + 2] - mov cl, es:[bx + 8] + + mov bx, ax + or bx, dx + + and bx, bx + jnz _walk_path.got_clust + + mov ax, cs:[_root_cluster] + mov dx, cs:[_root_cluster + 2] + +_walk_path.got_clust: + pop es pop bx test cl, HEX (10) jz _walk_path.not_found - + +_walk_path.check: + cmp byte ptr [di - 1], '\\' jne _walk_path.done @@ -108,3 +171,9 @@ _walk_path.done: clc ret + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Data area. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +_curr_check: db ". ", HEX (00) +_prev_check: db ".. ", HEX (00) -- 2.34.1