From 44f9aac8cddfa8da0b5d8f1b7d49dddec3321c1f Mon Sep 17 00:00:00 2001 From: Robert Pengelly Date: Tue, 6 Aug 2024 12:14:40 +0100 Subject: [PATCH] Implemented int 21h/AH=3C --- build/chimaera.img | Bin 368640 -> 368640 bytes build/chimaera.vhd | Bin 34120704 -> 34120704 bytes src/Makefile.unix | 1 + src/apps/hello/hello.asm | 29 ++- src/apps/pcomm/Makefile.unix | 2 +- src/apps/pcomm/Makefile.w32 | 2 +- src/apps/pcomm/pcomm.asm | 5 + src/apps/pcomm/touch.asm | 220 +++++++++++++++++++++ src/kernel/file.asm | 18 ++ src/kernel/int21.asm | 365 ++++++++++++++++++++++++++++++++++- src/kernel/make.asm | 66 +++++++ src/kernel/search.asm | 40 +++- 12 files changed, 739 insertions(+), 9 deletions(-) create mode 100644 src/apps/pcomm/touch.asm diff --git a/build/chimaera.img b/build/chimaera.img index c5dc8e7cfdbc5070a8ea341100aff353f6d767aa..d52add0355fc3a6b7e03549ba94739d682f4b10f 100644 GIT binary patch delta 6248 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 diff --git a/build/chimaera.vhd b/build/chimaera.vhd index dcb9b66214d61b4c4710436cc3349bbaea786129..cc7804661feabfe608240b18426d9c6a6baeae70 100644 GIT binary patch delta 9165 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 delta 8036 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 OM-L7R$NqPV>OTQEVGCUV diff --git a/src/Makefile.unix b/src/Makefile.unix index 7c0b071..1d5aab0 100644 --- a/src/Makefile.unix +++ b/src/Makefile.unix @@ -30,6 +30,7 @@ chimaera.img: all utils/dosfstools/mcopy -i $@ boot/freeldr/core/freeldr.sys :: utils/dosfstools/mcopy -i $@ kernel/kernel.sys :: utils/dosfstools/mcopy -i $@ apps/pcomm/pcomm.com ::command.com +# utils/dosfstools/mcopy -i $@ apps/hello/hello.com ::hello.com chimaera.vhd: all if [ -f $@ ]; then rm -rf $@; fi diff --git a/src/apps/hello/hello.asm b/src/apps/hello/hello.asm index ff2b84e..07f1f9f 100644 --- a/src/apps/hello/hello.asm +++ b/src/apps/hello/hello.asm @@ -11,14 +11,33 @@ %include ;****************************************************************************** -; @function _free +; @function _main ;****************************************************************************** global _main _main: - mov bx, offset msg_hello + mov bx, offset _msg_hello call _writestr - + +; mov ah, HEX (3C) +; mov cx, HEX (20) +; mov dx, offset _existing_file +; mov dx, offset _new_file +; int HEX (21) +; jc .exit +; +; call _writehex +; call _crlf +; +; mov bx, ax +; +; mov ah, HEX (3E) +; int HEX (21) +; jnc .exit +; +; call _writehex +; call _crlf +; ; call _crlf ; ; mov ah, HEX (08) @@ -115,4 +134,6 @@ _main: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Data area. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -msg_hello: db "Hello, world!", HEX (0D), HEX (0A), HEX (00) +_msg_hello: db "Hello, world!", HEX (0D), HEX (0A), HEX (00) +_new_file: db "temp.txt", HEX (00) +;_existing_file: db "\\boot\\freeldr\\freeldr.cfg", HEX (00) diff --git a/src/apps/pcomm/Makefile.unix b/src/apps/pcomm/Makefile.unix index 7edf7ba..b39d307 100644 --- a/src/apps/pcomm/Makefile.unix +++ b/src/apps/pcomm/Makefile.unix @@ -46,7 +46,7 @@ genver: genver.c gcc -o $@ $^ endif -pcomm.com: ../../lib/crt/crt0.o cbreak.o cd.o crlf.o date.o dir.o erase.o exit.o history.o mkdir.o pcomm.o time.o type.o vector.o writedec.o writehex.o writestr.o xmalloc.o xstrcpy.o ../../lib/crt/libc.a +pcomm.com: ../../lib/crt/crt0.o cbreak.o cd.o crlf.o date.o dir.o erase.o exit.o history.o mkdir.o pcomm.o time.o touch.o type.o vector.o writedec.o writehex.o writestr.o xmalloc.o xstrcpy.o ../../lib/crt/libc.a ../../utils/binutils/slink --oformat msdos -o $@ $^ %.o: %.asm diff --git a/src/apps/pcomm/Makefile.w32 b/src/apps/pcomm/Makefile.w32 index 4a11f17..e56edd9 100644 --- a/src/apps/pcomm/Makefile.w32 +++ b/src/apps/pcomm/Makefile.w32 @@ -30,7 +30,7 @@ genhash.exe: genhash.c genver.exe: genver.c gcc -o $@ $^ -pcomm.com: ../../lib/crt/crt0.o cbreak.o cd.o crlf.o date.o dir.o erase.o exit.o history.o mkdir.o pcomm.o time.o type.o vector.o writedec.o writehex.o writestr.o xmalloc.o xstrcpy.o ../../lib/crt/libc.a +pcomm.com: ../../lib/crt/crt0.o cbreak.o cd.o crlf.o date.o dir.o erase.o exit.o history.o mkdir.o pcomm.o time.o touch.o type.o vector.o writedec.o writehex.o writestr.o xmalloc.o xstrcpy.o ../../lib/crt/libc.a ../../utils/binutils/slink --oformat msdos -o $@ $^ %.o: %.asm diff --git a/src/apps/pcomm/pcomm.asm b/src/apps/pcomm/pcomm.asm index e2aea7b..f06e924 100644 --- a/src/apps/pcomm/pcomm.asm +++ b/src/apps/pcomm/pcomm.asm @@ -1076,6 +1076,7 @@ _handler_help.msg: db "MKDIR Create a new directory.", HEX (0D), HEX (0A) db "REBOOT Reboots the machine.", HEX (0D), HEX (0A) db "TIME Displays the system time.", HEX (0D), HEX (0A) + db "TOUCH Create a new file if it doesn't already exist.", HEX (0D), HEX (0A) db "TYPE Displays the contents of a text file.", HEX (0D), HEX (0A) db HEX (00) @@ -1305,6 +1306,10 @@ _cmd_table: dw 0 dw _handler_time + dw hash_touch + dw 0 + dw _handler_touch + dw hash_type dw 0 dw _handler_type diff --git a/src/apps/pcomm/touch.asm b/src/apps/pcomm/touch.asm new file mode 100644 index 0000000..ca254e9 --- /dev/null +++ b/src/apps/pcomm/touch.asm @@ -0,0 +1,220 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; @file touch.asm +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +%ifndef HEX +% define HEX(y) 0x##y +%endif + +;****************************************************************************** +; @function _handler_touch +;****************************************************************************** +global _handler_touch +_handler_touch: + + push bp + + mov bp, sp + sub sp, 4 + + push ax + push bx + push cx + push dx + push si + push di + push es + push ds + + mov word ptr [bp - 4], 0 + mov word ptr [bp - 2], 0 + + cmp byte ptr [bx], 0 + jne _handler_touch.ok + + mov bx, offset _err_invalid + call _writestr + + jmp _handler_touch.done + +_handler_touch.ok: + + push bx + + call _strlen + add sp, 2 + + mov di, offset _cmdline + mov si, bx + + mov cx, ax + rep movsb + + xor al, al + stosb + + mov bx, offset _cmdline + +_handler_touch.store_arg: + + cmp byte ptr [bx], 0 + je _handler_touch.next + + mov si, bx + push si + + mov ax, offset _vec_files + push ax + + call _vec_push + add sp, 4 + +_handler_touch.check: + + mov ax, ' ' + push ax + + mov si, bx + push si + + call _strchr + add sp, 4 + + and ax, ax + jz _handler_touch.next + + mov bx, ax + mov byte ptr [bx], 0 + + inc bx + +_handler_touch.skip: + + cmp byte ptr [bx], 0 + je _handler_touch.next + + cmp byte ptr [bx], ' ' + ja _handler_touch.store_arg + + inc bx + jmp _handler_touch.skip + +_handler_touch.next: + + mov ax, word ptr [bp - 4] + inc ax + + cmp ax, cs:[_vec_files + 4] + ja _handler_touch.cleanup + + mov word ptr [bp - 4], ax + dec ax + + xor dx, dx + + mov cx, 2 + mul cx + + mov bx, ax + push es + + mov ax, cs:[_vec_files + 0] + mov es, ax + + mov ax, es:[bx] + mov bx, ax + + pop es + +_handler_touch.open: + + push bx + + mov ax, HEX (3D02) + mov dx, bx + int HEX (21) + jnc _handler_touch.close + + mov ah, HEX (3C) + mov cx, HEX (20) + mov dx, bx + int HEX (21) + jnc _handler_touch.close + + cmp ax, 3 + jne _handler_touch.unhandled + + mov bx, offset _err_no_path + jmp _handler_touch.error + +_handler_touch.unhandled: + + pop bx + mov bx, offset _err_unhandled + +_handler_touch.error: + + call _writestr + + cmp ax, 3 + jne _handler_touch.next + + pop bx + + call _writestr + call _crlf + + jmp _handler_touch.next + +_handler_touch.close: + + pop bx + mov bx, ax + + mov ah, HEX (3E) + int HEX (21) + + jmp _handler_touch.next + +_handler_touch.cleanup: + + mov ax, cs:[_vec_files + 0] + push ax + + call _free + add sp, 2 + + mov ax, cs + mov es, ax + + mov di, offset _vec_files + xor al, al + + mov cx, 6 + rep stosb + +_handler_touch.done: + + pop ds + pop es + pop di + pop si + pop dx + pop cx + pop bx + pop ax + + add sp, 4 + pop bp + + ret + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Data area. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +_vec_files: db 6 dup (0) +_cmdline: db 256 dup (0) + +_err_invalid: db "Invalid number of parameters", HEX (0D), HEX (0A), HEX (00) + +_err_no_path: db "Path not found: ", HEX (00) +_err_unhandled: db "Unhandled error code", HEX (0D), HEX (0A), HEX (00) diff --git a/src/kernel/file.asm b/src/kernel/file.asm index ac14024..0c73b04 100644 --- a/src/kernel/file.asm +++ b/src/kernel/file.asm @@ -757,12 +757,15 @@ _open_file.got_handle: ;; Allocate memory for a buffer that will be used to keep track of ;; the current data read. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + push si xor si, si mov ax, es:[si + 50] xor dx, dx call _kmalloc + pop si + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Store the value. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -774,6 +777,21 @@ _open_file.got_handle: mov ax, cs:[_curr_psp] stosw + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Store information about where the entry is located on disk. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, cs:[si + 10] + stosw + + mov ax, cs:[si + 12] + stosw + + mov ax, cs:[si + 14] + stosw + + mov ax, cs:[si + 16] + stosw + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Restore ax and re-push it to the stack. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/src/kernel/int21.asm b/src/kernel/int21.asm index d9bf5f0..a6f0a11 100644 --- a/src/kernel/int21.asm +++ b/src/kernel/int21.asm @@ -839,8 +839,8 @@ _int21_dispatch.list: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Create File Using Handle. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;db HEX (3C) - ;dw _int21_3C + db HEX (3C) + dw _int21_3C ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Open File Using Handle. @@ -2268,6 +2268,367 @@ _int21_3B.done: _int21_3B.path: db 66 dup (0) +;****************************************************************************** +; @function _int21_3C +; @brief Create File Using Handle +; +; @in CX -> File attributes. +; @in DS:DX -> Pointer to an ASCIIZ file name. +; +; @out AX -> File handle. Error code if CF is set. +;****************************************************************************** +_int21_3C: + + push bp + + mov bp, sp + sub sp, 10 + + push bx + push cx + push dx + push si + push di + push es + push ds + + xor bh, bh + mov bl, al + + mov si, dx + + call _get_disk_info + jc _int21_3C.error_path + + mov di, si + +_int21_3C.open: + + call _open_file + jnc _int21_3C.zero + +_int21_3C.create: + + mov word ptr [bp - 4], si + mov word ptr [bp - 2], di + + call _walk_path + jc _int21_3C.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_3C.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_3C.error_denied + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; If we get here then the path is okay and the entry doesn't exist + ;; so lets try and create the entry. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + call _make_dos_entry + jc _int21_3C.error_denied + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Restore the origin si and di values. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov si, word ptr [bp - 4] + mov di, word ptr [bp - 2] + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Try and open the file again. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + call _open_file + jc _int21_3C.error + + jmp _int21_3C.done + +_int21_3C.zero: + + mov word ptr [bp - 6], ax + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; First thing we need to do is get the index into the file info vector. + ;; + ;; Note: We should need to do a compare here as _open_file should + ;; give us a value of at least 3. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + xor dx, dx + sub ax, 3 + + mov cx, 2 + mul cx + + mov bx, ax + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Okay, we should have the correct index into the file info vector + ;; so get the + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, cs:[_vec_files + 0] + mov es, ax + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; If the vector entry is zero then the file handle is invalid. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + cmp word ptr es:[bx], 0 + je _int21_3C.error_denied + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Re-initialize the extra segment but this time with the address + ;; of the vector entry. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, es:[bx] + mov es, ax + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; We'll use si register as the index into the info. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + xor si, si + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Get the file size. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, es:[si + 66] + mov dx, es:[si + 68] + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; If we don't have a file size then we can got straight to done. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov bx, ax + or bx, dx + + and bx, bx + jz _int21_3C.done + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Convert the size into the amount of cluster. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov cx, es:[si + 50] + div cx + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Move the value into the cx register. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov cx, ax + inc cx + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Get the starting cluster. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, es:[si + 58] + mov dx, es:[si + 60] + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Save the value in cx. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + push cx + +_int21_3C.clear: + + and cx, cx + jz _int21_3C.update + + push ax + push dx + + call cs:[_next_cluster] + + mov word ptr [bp - 8], ax + mov word ptr [bp - 10], dx + + pop dx + pop ax + + push cx + push bx + + xor bx, bx + xor cx, cx + call cs:[_update_cluster] + + pop bx + pop cx + + mov ax, word ptr [bp - 8] + mov dx, word ptr [bp - 10] + + dec cx + jnz _int21_3C.clear + +_int21_3C.update: + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Clear out the starting sector. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + xor ax, ax + mov es:[si + 58], ax + mov es:[si + 60], ax + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Update the entry on disk. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, es:[si + 74] + mov dx, es:[si + 76] + + mov cx, es:[si + 78] + mov di, es:[si + 80] + + push es + push bx + push ax + push dx + push cx + + mov bx, cs:[_disk_scratch] + mov es, bx + + xor bx, bx + call _read_sectors + + xor ax, ax + mov es:[di + 26], ax + mov es:[di + 20], ax + mov es:[di + 28], ax + mov es:[di + 30], ax + + pop cx + pop dx + pop ax + + xor bx, bx + call _write_sectors + + pop bx + pop es + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Make sure our file info size is zero. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + xor ax, ax + mov es:[si + 66], ax + mov es:[si + 68], ax + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Restore the value in the cx register. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + pop si + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Check if we have an info sector. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, cs:[_info_sector] + + and ax, ax + jz _int21_3C.no_info + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Update the free clusters. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + xor dx, dx + + add ax, cs:[_hidden_sectors] + adc dx, cs:[_hidden_sectors + 2] + + mov bx, cs:[_disk_scratch] + mov es, bx + xor bx, bx + + mov cx, 1 + call _read_sectors + + mov di, HEX (01E0) + + mov ax, es:[di + 8] + mov dx, es:[di + 10] + + add ax, si + adc dx, 0 + + mov es:[di + 8], ax + mov es:[di + 10], dx + + mov ax, cs:[_info_sector] + xor dx, dx + + add ax, cs:[_hidden_sectors] + adc dx, cs:[_hidden_sectors + 2] + + mov cx, 1 + call _write_sectors + +_int21_3C.no_info: + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Put the file pointer back into the ax register and jump to done. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, word ptr [bp - 6] + jmp _int21_3C.done + +_int21_3C.error_path: + + mov ax, 3 + jmp _int21_3C.error + +_int21_3C.name_error: + + pop dx + pop ax + +_int21_3C.error_denied: + + mov ax, 5 + +_int21_3C.error: + + pop ds + pop es + pop di + pop si + pop dx + pop cx + pop bx + + add sp, 10 + stc + + pop bp + jmp iretc + +_int21_3C.done: + + pop ds + pop es + pop di + pop si + pop dx + pop cx + pop bx + + add sp, 10 + clc + + pop bp + jmp iretc + ;****************************************************************************** ; @function _int21_3D ; @brief Open File Using Handle diff --git a/src/kernel/make.asm b/src/kernel/make.asm index 4216d22..0a24ef1 100644 --- a/src/kernel/make.asm +++ b/src/kernel/make.asm @@ -289,6 +289,72 @@ _make_dos_entry.next_clust: _make_dos_entry.found_free: + mov ax, word ptr [bp - 36] + + and ax, HEX (20) + jz _make_dos_entry.create_dir + + 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 + + xor ax, ax + stosw + + mov ax, word ptr [bp - 44] + stosw + + mov ax, word ptr [bp - 42] + stosw + + xor ax, ax + 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 + + jmp _make_dos_entry.done + +_make_dos_entry.create_dir: + call cs:[_find_free] jc _make_dos_entry.error diff --git a/src/kernel/search.asm b/src/kernel/search.asm index 4ce90fc..2cf47a1 100644 --- a/src/kernel/search.asm +++ b/src/kernel/search.asm @@ -226,6 +226,9 @@ _search_dos_dir.found: mov ds, ax mov bx, offset _file_info + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Get the starting cluster and file size of the entry. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ax, es:[di + 26] mov [bx + 0], ax @@ -238,9 +241,35 @@ _search_dos_dir.found: mov ax, es:[di + 30] mov [bx + 6], ax + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Get the entry type. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov al, es:[di + 11] mov [bx + 8], al + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Save the starting sector of the entry. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, word ptr [bp - 6] + mov [bx + 10], ax + + mov ax, word ptr [bp - 4] + mov [bx + 12], ax + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Save the size. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, word ptr [bp - 24] + mov [bx + 14], ax + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Save the index info the directort sector where the entry starts. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov [bx + 16], di + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Restore registers. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pop ds pop es pop di @@ -249,15 +278,24 @@ _search_dos_dir.found: pop cx pop bx + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Clean up the stack and restore the base pointer. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; add sp, 34 pop bp + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Set ax as the offset of the file info and clear the carry flag. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ax, offset _file_info clc + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Return to caller. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Data area. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -_file_info: db 9 dup (0) +_file_info: db 20 dup (0) -- 2.34.1