From 919723032fb1bda50a8a8be50805441d7863c685 Mon Sep 17 00:00:00 2001 From: Robert Pengelly <robertapengelly@hotmail.com> Date: Mon, 12 Aug 2024 04:51:06 +0100 Subject: [PATCH] Write data to file, bug fixes and improvements --- build/chimaera.img | Bin 368640 -> 368640 bytes build/chimaera.vhd | Bin 34120704 -> 34120704 bytes src/apps/hello/hello.asm | 247 ++++++-- src/apps/pcomm/del.asm | 374 ++++++++++-- src/apps/pcomm/dir.asm | 267 +++++++- src/apps/pcomm/mkdir.asm | 328 +++++++++- src/apps/pcomm/rmdir.asm | 367 +++++++++-- src/apps/pcomm/touch.asm | 362 +++++++++-- src/apps/pcomm/type.asm | 387 ++++++++++-- src/apps/pcomm/xstrcpy.asm | 6 +- src/kernel/file.asm | 1173 +++++++++++++++++++++++++++++++----- src/kernel/int21.asm | 19 +- 12 files changed, 3038 insertions(+), 492 deletions(-) diff --git a/build/chimaera.img b/build/chimaera.img index 2979e9a6ab4ad936b400bfd86c80bf5a0f0bdb0b..1a20b316af9aa033ee77c59245a1204993a22ae1 100644 GIT binary patch delta 9506 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 delta 6898 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	mIq-Qo`p5^ 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 diff --git a/build/chimaera.vhd b/build/chimaera.vhd index cb81b9896e35a529d13f514c119092e474b81155..3868ac93db139f313cd27c6f5df927a8404a7437 100644 GIT binary patch delta 30420 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 delta 28020 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 JsPt>*e*ja0AesOG diff --git a/src/apps/hello/hello.asm b/src/apps/hello/hello.asm index 805c24e..5f26689 100644 --- a/src/apps/hello/hello.asm +++ b/src/apps/hello/hello.asm @@ -19,60 +19,188 @@ _main: mov bx, offset _msg_hello call _writestr - mov ah, HEX (39) - mov dx, offset _new_dir - int HEX (21) - jc .exit - - mov ah, HEX (3A) - mov dx, offset _new_dir - int HEX (21) - jc .exit - - mov bx, offset _msg_status - call _writestr - - mov ah, HEX (3C) - mov cx, HEX (20) - mov dx, offset _new_file - int HEX (21) - jc .exit - - call _writehex - call _crlf - - mov bx, ax - - mov ax, HEX (4202) - mov cx, 4096 - xor dx, dx - int HEX (21) - jc .exit - - call _writehex - call _crlf - - mov ah, HEX (40) - xor cx, cx - xor dx, dx - int HEX (21) - jc .exit - - mov ax, HEX (4200) - mov cx, 1000 - xor dx, dx - int HEX (21) - jc .exit - - call _writehex - call _crlf - - mov ah, HEX (40) - xor cx, cx - xor dx, dx - int HEX (21) - jc .exit - +; mov ax, offset _flags +; push ax +; +; mov ax, offset _existing_file +; push ax +; +; call _fopen +; add sp, 4 +; +; and ax, ax +; jz .exit +; +; mov cs:[_file_pointer], ax +; +; mov bx, offset _msg_status +; call _writestr +; +; mov ax, cs:[_file_pointer] +; push ax +; +; mov ax, 512 +; push ax +; +; mov ax, 1 +; push ax +; +; mov ax, offset _buffer +; push ax +; +; call _fread +; add sp, 8 +; +; and ax, ax +; jz .exit +; +; mov cs:[_to_write], ax +; +; mov ax, cs:[_file_pointer] +; push ax +; +; call _fclose +; add sp, 2 +; +; mov bx, offset _msg_status +; call _writestr +; +; mov ax, offset _flags +; push ax +; +; mov ax, offset _new_file +; push ax +; +; call _fopen +; add sp, 4 +; +; and ax, ax +; jz .exit +; +; mov cs:[_file_pointer], ax +; +; mov bx, offset _msg_status +; call _writestr +; +; mov cx, 5 +; +;.write_loop: +; +; mov ax, cs:[_file_pointer] +; push ax +; +; mov ax, cs:[_to_write] +; push ax +; +; mov ax, 1 +; push ax +; +; mov ax, offset _buffer +; push ax +; +; call _fwrite +; add sp, 8 +; +; cmp ax, cs:[_to_write] +; jne .exit +; +; mov bx, offset _msg_write +; call _writestr +; +; loop .write_loop +; +; mov ah, HEX (3C) +; mov cx, HEX (20) +; mov dx, offset _new_file +; int HEX (21) +; jc .exit +; +; call _writehex +; call _crlf +; +; mov bx, ax +; +; mov ax, HEX (4202) +; mov cx, 4096 +; xor dx, dx +; int HEX (21) +; jc .exit +; +; call _writehex +; call _crlf +; +; mov ah, HEX (40) +; xor cx, cx +; xor dx, dx +; int HEX (21) +; jc .exit +; +; mov ax, HEX (4200) +; xor cx, cx +; xor dx, dx +; int HEX (21) +; jc .exit +; +; mov ah, HEX (40) +; mov cx, 15 +; mov dx, offset _msg_hello +; int HEX (21) +; jc .exit +; +; mov ah, HEX (39) +; mov dx, offset _new_dir +; int HEX (21) +; jc .exit +; +; mov ah, HEX (3A) +; mov dx, offset _new_dir +; int HEX (21) +; jc .exit +; +; mov bx, offset _msg_status +; call _writestr +; +; mov ah, HEX (3C) +; mov cx, HEX (20) +; mov dx, offset _new_file +; int HEX (21) +; jc .exit +; +; call _writehex +; call _crlf +; +; mov bx, ax +; +; mov ax, HEX (4202) +; mov cx, 4096 +; xor dx, dx +; int HEX (21) +; jc .exit +; +; call _writehex +; call _crlf +; +; mov ah, HEX (40) +; xor cx, cx +; xor dx, dx +; int HEX (21) +; jc .exit +; +; mov ax, HEX (4200) +; mov cx, 1000 +; xor dx, dx +; int HEX (21) +; jc .exit +; +; call _writehex +; call _crlf +; +; mov ah, HEX (40) +; xor cx, cx +; xor dx, dx +; int HEX (21) +; jc .exit +; ; mov ah, HEX (3C) ; mov cx, HEX (20) ; mov dx, offset _new_file @@ -194,7 +322,12 @@ _main: ;; Data area. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; _msg_hello: db "Hello, world!", HEX (0D), HEX (0A), HEX (00) -_msg_status: db "File tests", HEX (0D), HEX (0A), HEX (00) -_new_dir: db "temp", HEX (00) -_new_file: db "temp.txt", HEX (00) +;_msg_write: db "Bytes written", HEX (0D), HEX (0A), HEX (00) +;_msg_status: db "File tests", HEX (0D), HEX (0A), HEX (00) +;_new_dir: db "temp", HEX (00) +;_new_file: db "temp.txt", HEX (00) ;_existing_file: db "\\boot\\freeldr\\freeldr.cfg", HEX (00) +;_file_pointer: dw HEX (0000) +;_flags: db "w+b", HEX (00) +;_buffer: db 512 dup (0) +;_to_write: dw HEX (0000) diff --git a/src/apps/pcomm/del.asm b/src/apps/pcomm/del.asm index d9c086e..abd4bd1 100644 --- a/src/apps/pcomm/del.asm +++ b/src/apps/pcomm/del.asm @@ -1,5 +1,5 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; @file type.asm +;; @file del.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %ifndef HEX % define HEX(y) 0x##y @@ -14,7 +14,7 @@ _handler_del: push bp mov bp, sp - sub sp, 4 + sub sp, 6 push ax push bx @@ -25,6 +25,7 @@ _handler_del: push es push ds + mov word ptr [bp - 6], 0 mov word ptr [bp - 4], 0 mov word ptr [bp - 2], 0 @@ -57,7 +58,7 @@ _handler_del.ok: _handler_del.store_arg: cmp byte ptr [bx], 0 - je _handler_del.next + je _handler_del.check2 mov si, bx push si @@ -80,7 +81,7 @@ _handler_del.check: add sp, 4 and ax, ax - jz _handler_del.next + jz _handler_del.check2 mov bx, ax mov byte ptr [bx], 0 @@ -90,7 +91,7 @@ _handler_del.check: _handler_del.skip: cmp byte ptr [bx], 0 - je _handler_del.next + je _handler_del.check2 cmp byte ptr [bx], ' ' ja _handler_del.store_arg @@ -98,15 +99,20 @@ _handler_del.skip: inc bx jmp _handler_del.skip +_handler_del.check2: + + cmp word ptr cs:[_vec_files + 4], 1 + jbe _handler_del.next + _handler_del.next: - mov ax, word ptr [bp - 4] + mov ax, word ptr [bp - 6] inc ax cmp ax, cs:[_vec_files + 4] ja _handler_del.cleanup - mov word ptr [bp - 4], ax + mov word ptr [bp - 6], ax dec ax xor dx, dx @@ -121,107 +127,363 @@ _handler_del.next: mov es, ax mov ax, es:[bx] - mov bx, ax + mov dx, ax pop es + + call _delete_file + jmp _handler_del.next + +_handler_del.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_del.delete: +_handler_del.done: + pop ds + pop es + pop di + pop si + pop dx + pop cx + pop bx + pop ax + + add sp, 6 + pop bp + + ret + +;****************************************************************************** +; @function _delete_file +;****************************************************************************** +_delete_file: + + push ax push bx + push dx + push ds + push cx + + mov di, offset _file_path + mov cx, 256 + + xor al, al + rep stosb + + mov ah, HEX (19) + int HEX (21) + + mov byte ptr [bp - 4], al + mov si, dx + + push si + + call _strlen + add sp, 2 + + cmp ax, 2 + jb _delete_file.got_drive + + cmp byte ptr [si + 1], ':' + jne _delete_file.got_drive + + mov al, [si] + + cmp al, HEX (7A) + ja _delete_file.no_adjust + + cmp al, HEX (61) + jb _delete_file.no_adjust + + mov bl, HEX (20) + not bl + + sub al, 'a' + + mov byte ptr [bp - 4], al + add si, 2 + + jmp _delete_file.got_drive + +_delete_file.no_adjust: + + cmp al, HEX (5A) + ja _delete_file.got_drive + + cmp al, HEX (41) + jb _delete_file.got_drive + + sub al, 'A' + + mov byte ptr [bp - 4], al + add si, 2 + +_delete_file.got_drive: + + mov di, offset _file_path + + mov al, byte ptr [bp - 4] + add al, 'A' + stosb + + mov al, ':' + stosb + + cmp byte ptr [si], '\\' + je _delete_file.initial_setup + + mov al, '\\' + stosb + + push dx + push si + + mov dl, byte ptr [bp - 4] + mov si, di + + mov ah, HEX (47) + int HEX (21) + + pop si + pop dx + + mov di, offset _file_path + push di + + call _strlen + add sp, 2 + + add di, ax + +_delete_file.initial_setup: + + cmp byte ptr es:[di - 1], '\\' + je _delete_file.no_slash + + mov al, '\\' + stosb + +_delete_file.no_slash: + + mov bx, si + +_delete_file.loop: + + mov ax, si + sub ax, bx + cmp ax, 65 + ja _delete_file.check_path + + lodsb + + and al, al + jz _delete_file.check_path + + cmp al, '.' + je _delete_file.check_curr + + cmp al, '\\' + jne _delete_file.convert_alpha + + cmp si, bx + je _delete_file.loop + + cmp byte ptr es:[di - 1], '\\' + je _delete_file.loop + +_delete_file.convert_alpha: + + xor ah, ah + push ax + + call _isalpha + + and ax, ax + jz _delete_file.no_alpha + + call _toupper + add sp, 2 + + jmp _delete_file.char_ok2 + +_delete_file.no_alpha: + + pop ax + jmp _delete_file.char_ok2 + +_delete_file.check_curr: + + cmp byte ptr [si], 0 + je _delete_file.loop + + cmp byte ptr [si], '\\' + je _delete_file.loop + + cmp byte ptr [si], '.' + je _delete_file.check_prev + + jmp _delete_file.char_ok2 + +_delete_file.check_prev: + + cmp byte ptr [si + 1], 0 + je _delete_file.get_prev + + cmp byte ptr [si + 1], '\\' + jne _delete_file.char_ok2 + +_delete_file.get_prev: + + mov cx, offset _file_path + add cx, 3 + + cmp di, cx + je _delete_file.no_slash2 + + cmp byte ptr es:[di - 1], '\\' + jne _delete_file.no_slash2 + + mov byte ptr es:[di - 1], 0 + +_delete_file.no_slash2: + + push si + push ds + + mov ax, cs + mov ds, ax + + mov ax, '\\' + push ax + + mov ax, offset _file_path + push ax + + call _strrchr + add sp, 4 + + pop ds + pop si + + and ax, ax + jnz _delete_file.got_index + + mov di, offset _file_path + jmp _delete_file.zero + +_delete_file.got_index: + + mov di, ax + inc di + +_delete_file.zero: + + mov byte ptr es:[di], 0 + jmp _delete_file.loop + +_delete_file.char_ok2: + + stosb + jmp _delete_file.loop + +_delete_file.check_path: + + cmp byte ptr es:[di - 1], '\\' + jne _delete_file.null + + dec di + +_delete_file.null: + + xor al, al + stosb + +_delete_file.delete: + mov ah, HEX (41) - mov dx, bx + mov dx, offset _file_path int HEX (21) - jnc _handler_del.close + jnc _delete_file.close + + mov cx, offset _file_path cmp ax, 2 - jne _handler_del.check3 + jne _delete_file.check mov bx, offset _err_no_file - jmp _handler_del.error - -_handler_del.check3: + jmp _delete_file.error +_delete_file.check: + cmp ax, 3 - jne _handler_del.unhandled + jne _delete_file.unhandled - mov bx, offset _err_no_dir - jmp _handler_del.error + mov bx, offset _err_no_path + jmp _delete_file.error -_handler_del.unhandled: +_delete_file.unhandled: - pop bx mov bx, offset _err_unhandled -_handler_del.error: +_delete_file.error: call _writestr cmp ax, 3 - ja _handler_del.next + ja _delete_file.done cmp ax, 2 - jb _handler_del.next + jb _delete_file.done - pop bx + mov bx, offset _file_path call _writestr call _crlf - jmp _handler_del.next + jmp _delete_file.done -_handler_del.close: +_delete_file.close: - pop bx mov bx, ax mov ah, HEX (3E) int HEX (21) - - jmp _handler_del.next -_handler_del.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_del.done: +_delete_file.done: + pop cx 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) +_file_path: db 256 dup (0) _err_invalid: db "Invalid number of parameters", HEX (0D), HEX (0A), HEX (00) -_err_no_dir: db "Path not found: ", HEX (00) +_err_no_path: db "Path not found: ", HEX (00) _err_no_file: db "File not found: ", HEX (00) _err_unhandled: db "Unhandled error code", HEX (0D), HEX (0A), HEX (00) diff --git a/src/apps/pcomm/dir.asm b/src/apps/pcomm/dir.asm index 8a86bf5..cbf62ac 100644 --- a/src/apps/pcomm/dir.asm +++ b/src/apps/pcomm/dir.asm @@ -14,7 +14,7 @@ _handler_dir: push bp mov bp, sp - sub sp, 6 + sub sp, 10 push ax push bx @@ -25,8 +25,9 @@ _handler_dir: push es push ds + mov word ptr [bp - 4], 1 + mov word ptr [bp - 6], 0 - mov word ptr [bp - 4], 0 mov word ptr [bp - 2], 0 mov ax, 64 @@ -53,6 +54,7 @@ _handler_dir: jne _handler_dir.got_path mov bx, offset _fn_wild + mov word ptr [bp - 4], 0 _handler_dir.got_path: @@ -200,7 +202,7 @@ _handler_dir.done: pop bx pop ax - add sp, 6 + add sp, 10 pop bp ret @@ -216,22 +218,251 @@ _walk_dir: push ds push cx + mov di, offset _file_path + mov cx, 256 + + xor al, al + rep stosb + mov word ptr [bp - 2], 0 - mov si, offset _file_path + + cmp word ptr [bp - 4], 1 + jb _walk_dir.find_first + + mov ah, HEX (19) + int HEX (21) + + mov byte ptr [bp - 10], al + mov si, dx + + push si + + call _strlen + add sp, 2 + + cmp ax, 2 + jb _walk_dir.got_drive + + cmp byte ptr [si + 1], ':' + jne _walk_dir.got_drive + + mov al, [si] + + cmp al, HEX (7A) + ja _walk_dir.no_adjust + + cmp al, HEX (61) + jb _walk_dir.no_adjust + + mov bl, HEX (20) + not bl + + sub al, 'a' + + mov byte ptr [bp - 10], al + add si, 2 + + jmp _walk_dir.got_drive + +_walk_dir.no_adjust: + + cmp al, HEX (5A) + ja _walk_dir.got_drive + + cmp al, HEX (41) + jb _walk_dir.got_drive + + sub al, 'A' + + mov byte ptr [bp - 10], al + add si, 2 + +_walk_dir.got_drive: + + mov di, offset _file_path + + mov al, byte ptr [bp - 10] + add al, 'A' + stosb + + mov al, ':' + stosb + + cmp byte ptr [si], '\\' + je _walk_dir.initial_setup + + mov al, '\\' + stosb push dx push si - call _xstrcpy + mov dl, byte ptr [bp - 10] + mov si, di + + mov ah, HEX (47) + int HEX (21) + + pop si + pop dx + + mov di, offset _file_path + push di + + call _strlen + add sp, 2 + + add di, ax + +_walk_dir.initial_setup: + + cmp byte ptr es:[di - 1], '\\' + je _walk_dir.no_slash + + mov al, '\\' + stosb + +_walk_dir.no_slash: + + mov bx, si + +_walk_dir.loop: + + mov ax, si + sub ax, bx + + cmp ax, 65 + ja _walk_dir.check_path + + lodsb + + and al, al + jz _walk_dir.check_path + + cmp al, '.' + je _walk_dir.check_curr + + cmp al, '\\' + jne _walk_dir.convert_alpha + + cmp si, bx + je _walk_dir.loop + + cmp byte ptr es:[di - 1], '\\' + je _walk_dir.loop + +_walk_dir.convert_alpha: + + xor ah, ah + push ax + + call _isalpha + + and ax, ax + jz _walk_dir.no_alpha + + call _toupper + add sp, 2 + + jmp _walk_dir.char_ok + +_walk_dir.no_alpha: + + pop ax + jmp _walk_dir.char_ok + +_walk_dir.check_curr: + + cmp byte ptr [si], 0 + je _walk_dir.loop + + cmp byte ptr [si], '\\' + je _walk_dir.loop + + cmp byte ptr [si], '.' + je _walk_dir.check_prev + + jmp _walk_dir.char_ok + +_walk_dir.check_prev: + + cmp byte ptr [si + 1], 0 + je _walk_dir.get_prev + + cmp byte ptr [si + 1], '\\' + jne _walk_dir.char_ok + +_walk_dir.get_prev: + + mov cx, offset _file_path + add cx, 3 + + cmp di, cx + je _walk_dir.no_slash2 + + cmp byte ptr es:[di - 1], '\\' + jne _walk_dir.no_slash2 + + mov byte ptr es:[di - 1], 0 + +_walk_dir.no_slash2: + + push si + push ds + + mov ax, cs + mov ds, ax + + mov ax, '\\' + push ax + + mov ax, offset _file_path + push ax + + call _strrchr add sp, 4 - cmp word ptr [bp - 4], 1 - jb _walk_dir.find_first + pop ds + pop si + + and ax, ax + jnz _walk_dir.got_index + + mov di, offset _file_path + jmp _walk_dir.zero + +_walk_dir.got_index: + + mov di, ax + inc di + +_walk_dir.zero: + + mov byte ptr es:[di], 0 + jmp _walk_dir.loop + +_walk_dir.char_ok: + + stosb + jmp _walk_dir.loop + +_walk_dir.check_path: + + ;cmp byte ptr es:[di - 1], '\\' + ;jne _walk_dir.null + ; + ;dec di + +_walk_dir.null: + + xor al, al + stosb _walk_dir.find_first: mov ah, HEX (4E) xor cx, cx + mov dx, offset _file_path int HEX (21) jnc _walk_dir.check5 @@ -274,7 +505,7 @@ _walk_dir.error: _walk_dir.check5: cmp word ptr [bp - 4], 2 - jb _walk_dir.setup + jb _walk_dir.setup mov bx, offset _file_path call _writestr @@ -290,22 +521,20 @@ _walk_dir.setup: mov ax, cs:[_dta_addr] mov ds, ax -_walk_dir.find: +_walk_dir.found: cmp word ptr [bp - 2], 0 je _walk_dir.ok + mov cx, 4 + +_walk_dir.seperate: + mov ah, HEX (02) mov dl, ' ' int HEX (21) - mov ah, HEX (02) - mov dl, ':' - int HEX (21) - - mov ah, HEX (02) - mov dl, ' ' - int HEX (21) + loop _walk_dir.seperate _walk_dir.ok: @@ -333,7 +562,7 @@ _walk_dir.check: _walk_dir.period_check: - cmp byte ptr [si - 1], '.' + cmp byte ptr [si - 2], '.' jne _walk_dir.pad _walk_dir.output: @@ -367,7 +596,7 @@ _walk_dir.final_pad: int HEX (21) dec cx - jmp short _walk_dir.final_pad + jnz _walk_dir.final_pad _walk_dir.check2: @@ -383,7 +612,7 @@ _walk_dir.next: mov ah, HEX (4F) int HEX (21) - jnc _walk_dir.find + jnc _walk_dir.found cmp word ptr [bp - 2], 0 je _walk_dir.check4 diff --git a/src/apps/pcomm/mkdir.asm b/src/apps/pcomm/mkdir.asm index 416d917..2ecc9e9 100644 --- a/src/apps/pcomm/mkdir.asm +++ b/src/apps/pcomm/mkdir.asm @@ -14,7 +14,7 @@ _handler_mkdir: push bp mov bp, sp - sub sp, 4 + sub sp, 6 push ax push bx @@ -25,6 +25,7 @@ _handler_mkdir: push es push ds + mov word ptr [bp - 6], 0 mov word ptr [bp - 4], 0 mov word ptr [bp - 2], 0 @@ -57,7 +58,7 @@ _handler_mkdir.ok: _handler_mkdir.store_arg: cmp byte ptr [bx], 0 - je _handler_mkdir.next + je _handler_mkdir.check2 mov si, bx push si @@ -80,7 +81,7 @@ _handler_mkdir.check: add sp, 4 and ax, ax - jz _handler_mkdir.next + jz _handler_mkdir.check2 mov bx, ax mov byte ptr [bx], 0 @@ -90,7 +91,7 @@ _handler_mkdir.check: _handler_mkdir.skip: cmp byte ptr [bx], 0 - je _handler_mkdir.next + je _handler_mkdir.check2 cmp byte ptr [bx], ' ' ja _handler_mkdir.store_arg @@ -98,15 +99,20 @@ _handler_mkdir.skip: inc bx jmp _handler_mkdir.skip +_handler_mkdir.check2: + + cmp word ptr cs:[_vec_files + 4], 1 + jbe _handler_mkdir.next + _handler_mkdir.next: - mov ax, word ptr [bp - 4] + mov ax, word ptr [bp - 6] inc ax cmp ax, cs:[_vec_files + 4] ja _handler_mkdir.cleanup - mov word ptr [bp - 4], ax + mov word ptr [bp - 6], ax dec ax xor dx, dx @@ -121,29 +127,11 @@ _handler_mkdir.next: mov es, ax mov ax, es:[bx] - mov bx, ax + mov dx, ax pop es - -_handler_mkdir.open: - - mov ah, HEX (39) - mov dx, bx - int HEX (21) - jnc _handler_mkdir.next - -_handler_mkdir.error: - - push bx - - mov bx, offset _err_failed - call _writestr - - pop bx - - call _writestr - call _crlf + call _create_dir jmp _handler_mkdir.next _handler_mkdir.cleanup: @@ -174,16 +162,302 @@ _handler_mkdir.done: pop bx pop ax - add sp, 4 + add sp, 6 pop bp ret +;****************************************************************************** +; @function _create_dir +;****************************************************************************** +_create_dir: + + push ax + push bx + push dx + push ds + push cx + + mov di, offset _file_path + mov cx, 256 + + xor al, al + rep stosb + + mov ah, HEX (19) + int HEX (21) + + mov byte ptr [bp - 4], al + mov si, dx + + push si + + call _strlen + add sp, 2 + + cmp ax, 2 + jb _create_dir.got_drive + + cmp byte ptr [si + 1], ':' + jne _create_dir.got_drive + + mov al, [si] + + cmp al, HEX (7A) + ja _create_dir.no_adjust + + cmp al, HEX (61) + jb _create_dir.no_adjust + + mov bl, HEX (20) + not bl + + sub al, 'a' + + mov byte ptr [bp - 4], al + add si, 2 + + jmp _create_dir.got_drive + +_create_dir.no_adjust: + + cmp al, HEX (5A) + ja _create_dir.got_drive + + cmp al, HEX (41) + jb _create_dir.got_drive + + sub al, 'A' + + mov byte ptr [bp - 4], al + add si, 2 + +_create_dir.got_drive: + + mov di, offset _file_path + + mov al, byte ptr [bp - 4] + add al, 'A' + stosb + + mov al, ':' + stosb + + cmp byte ptr [si], '\\' + je _create_dir.initial_setup + + mov al, '\\' + stosb + + push dx + push si + + mov dl, byte ptr [bp - 4] + mov si, di + + mov ah, HEX (47) + int HEX (21) + + pop si + pop dx + + mov di, offset _file_path + push di + + call _strlen + add sp, 2 + + add di, ax + +_create_dir.initial_setup: + + cmp byte ptr es:[di - 1], '\\' + je _create_dir.no_slash + + mov al, '\\' + stosb + +_create_dir.no_slash: + + mov bx, si + +_create_dir.loop: + + mov ax, si + sub ax, bx + + cmp ax, 65 + ja _create_dir.check_path + + lodsb + + and al, al + jz _create_dir.check_path + + cmp al, '.' + je _create_dir.check_curr + + cmp al, '\\' + jne _create_dir.convert_alpha + + cmp si, bx + je _create_dir.loop + + cmp byte ptr es:[di - 1], '\\' + je _create_dir.loop + +_create_dir.convert_alpha: + + xor ah, ah + push ax + + call _isalpha + + and ax, ax + jz _create_dir.no_alpha + + call _toupper + add sp, 2 + + jmp _create_dir.char_ok2 + +_create_dir.no_alpha: + + pop ax + jmp _create_dir.char_ok2 + +_create_dir.check_curr: + + cmp byte ptr [si], 0 + je _create_dir.loop + + cmp byte ptr [si], '\\' + je _create_dir.loop + + cmp byte ptr [si], '.' + je _create_dir.check_prev + + jmp _create_dir.char_ok2 + +_create_dir.check_prev: + + cmp byte ptr [si + 1], 0 + je _create_dir.get_prev + + cmp byte ptr [si + 1], '\\' + jne _create_dir.char_ok2 + +_create_dir.get_prev: + + mov cx, offset _file_path + add cx, 3 + + cmp di, cx + je _create_dir.no_slash2 + + cmp byte ptr es:[di - 1], '\\' + jne _create_dir.no_slash2 + + mov byte ptr es:[di - 1], 0 + +_create_dir.no_slash2: + + push si + push ds + + mov ax, cs + mov ds, ax + + mov ax, '\\' + push ax + + mov ax, offset _file_path + push ax + + call _strrchr + add sp, 4 + + pop ds + pop si + + and ax, ax + jnz _create_dir.got_index + + mov di, offset _file_path + jmp _create_dir.zero + +_create_dir.got_index: + + mov di, ax + inc di + +_create_dir.zero: + + mov byte ptr es:[di], 0 + jmp _create_dir.loop + +_create_dir.char_ok2: + + stosb + jmp _create_dir.loop + +_create_dir.check_path: + + ;cmp byte ptr es:[di - 1], '\\' + ;jne _create_dir.null + ; + ;dec di + +_create_dir.null: + + xor al, al + stosb + +_create_dir.create: + + mov ah, HEX (39) + mov dx, offset _file_path + int HEX (21) + jnc _create_dir.done + +_create_dir.error: + + mov bx, offset _err_failed + call _writestr + + cmp ax, 3 + jne _create_dir.done + + mov bx, offset _file_path + + call _writestr + call _crlf + + jmp _create_dir.done + +_create_dir.close: + + mov bx, ax + + mov ah, HEX (3E) + int HEX (21) + +_create_dir.done: + + pop cx + pop ds + pop dx + pop bx + pop ax + ret + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Data area. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; _vec_files: db 6 dup (0) + _cmdline: db 256 dup (0) +_file_path: db 256 dup (0) _err_invalid: db "Invalid number of parameters", HEX (0D), HEX (0A), HEX (00) _err_failed: db "Unable to create directory - ", HEX (00) diff --git a/src/apps/pcomm/rmdir.asm b/src/apps/pcomm/rmdir.asm index bc06adc..4c50cd6 100644 --- a/src/apps/pcomm/rmdir.asm +++ b/src/apps/pcomm/rmdir.asm @@ -1,5 +1,5 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; @file type.asm +;; @file rmdir.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %ifndef HEX % define HEX(y) 0x##y @@ -14,7 +14,7 @@ _handler_rmdir: push bp mov bp, sp - sub sp, 4 + sub sp, 6 push ax push bx @@ -25,6 +25,7 @@ _handler_rmdir: push es push ds + mov word ptr [bp - 6], 0 mov word ptr [bp - 4], 0 mov word ptr [bp - 2], 0 @@ -57,7 +58,7 @@ _handler_rmdir.ok: _handler_rmdir.store_arg: cmp byte ptr [bx], 0 - je _handler_rmdir.next + je _handler_rmdir.check2 mov si, bx push si @@ -80,7 +81,7 @@ _handler_rmdir.check: add sp, 4 and ax, ax - jz _handler_rmdir.next + jz _handler_rmdir.check2 mov bx, ax mov byte ptr [bx], 0 @@ -90,7 +91,7 @@ _handler_rmdir.check: _handler_rmdir.skip: cmp byte ptr [bx], 0 - je _handler_rmdir.next + je _handler_rmdir.check2 cmp byte ptr [bx], ' ' ja _handler_rmdir.store_arg @@ -98,15 +99,20 @@ _handler_rmdir.skip: inc bx jmp _handler_rmdir.skip +_handler_rmdir.check2: + + cmp word ptr cs:[_vec_files + 4], 1 + jbe _handler_rmdir.next + _handler_rmdir.next: - mov ax, word ptr [bp - 4] + mov ax, word ptr [bp - 6] inc ax cmp ax, cs:[_vec_files + 4] ja _handler_rmdir.cleanup - mov word ptr [bp - 4], ax + mov word ptr [bp - 6], ax dec ax xor dx, dx @@ -121,99 +127,366 @@ _handler_rmdir.next: mov es, ax mov ax, es:[bx] - mov bx, ax + mov dx, ax pop es + + call _delete_dir + jmp _handler_rmdir.next + +_handler_rmdir.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_rmdir.done: + + pop ds + pop es + pop di + pop si + pop dx + pop cx + pop bx + pop ax + + add sp, 6 + pop bp + + ret + +;****************************************************************************** +; @function _delete_dir +;****************************************************************************** +_delete_dir: + + push ax + push bx + push dx + push ds + push cx + + mov di, offset _file_path + mov cx, 256 + + xor al, al + rep stosb + + mov ah, HEX (19) + int HEX (21) + + mov byte ptr [bp - 4], al + mov si, dx + + push si + + call _strlen + add sp, 2 + + cmp ax, 2 + jb _delete_dir.got_drive + + cmp byte ptr [si + 1], ':' + jne _delete_dir.got_drive + + mov al, [si] + + cmp al, HEX (7A) + ja _delete_dir.no_adjust + + cmp al, HEX (61) + jb _delete_dir.no_adjust + + mov bl, HEX (20) + not bl + + sub al, 'a' + + mov byte ptr [bp - 4], al + add si, 2 + + jmp _delete_dir.got_drive + +_delete_dir.no_adjust: + + cmp al, HEX (5A) + ja _delete_dir.got_drive + + cmp al, HEX (41) + jb _delete_dir.got_drive + + sub al, 'A' + + mov byte ptr [bp - 4], al + add si, 2 + +_delete_dir.got_drive: + + mov di, offset _file_path + + mov al, byte ptr [bp - 4] + add al, 'A' + stosb + + mov al, ':' + stosb + + cmp byte ptr [si], '\\' + je _delete_dir.initial_setup + + mov al, '\\' + stosb + + push dx + push si + + mov dl, byte ptr [bp - 4] + mov si, di + + mov ah, HEX (47) + int HEX (21) + + pop si + pop dx + + mov di, offset _file_path + push di + + call _strlen + add sp, 2 + + add di, ax + +_delete_dir.initial_setup: + + cmp byte ptr es:[di - 1], '\\' + je _delete_dir.no_slash + + mov al, '\\' + stosb + +_delete_dir.no_slash: + + mov bx, si + +_delete_dir.loop: + + mov ax, si + sub ax, bx + + cmp ax, 65 + ja _delete_dir.check_path + + lodsb + + and al, al + jz _delete_dir.check_path + + cmp al, '.' + je _delete_dir.check_curr + + cmp al, '\\' + jne _delete_dir.convert_alpha + + cmp si, bx + je _delete_dir.loop + + cmp byte ptr es:[di - 1], '\\' + je _delete_dir.loop + +_delete_dir.convert_alpha: + + xor ah, ah + push ax + + call _isalpha + + and ax, ax + jz _delete_dir.no_alpha + + call _toupper + add sp, 2 + + jmp _delete_dir.char_ok2 + +_delete_dir.no_alpha: + + pop ax + jmp _delete_dir.char_ok2 + +_delete_dir.check_curr: -_handler_rmdir.delete: + cmp byte ptr [si], 0 + je _delete_dir.loop + + cmp byte ptr [si], '\\' + je _delete_dir.loop + + cmp byte ptr [si], '.' + je _delete_dir.check_prev + + jmp _delete_dir.char_ok2 + +_delete_dir.check_prev: + + cmp byte ptr [si + 1], 0 + je _delete_dir.get_prev + + cmp byte ptr [si + 1], '\\' + jne _delete_dir.char_ok2 + +_delete_dir.get_prev: + + mov cx, offset _file_path + add cx, 3 + + cmp di, cx + je _delete_dir.no_slash2 + + cmp byte ptr es:[di - 1], '\\' + jne _delete_dir.no_slash2 + + mov byte ptr es:[di - 1], 0 + +_delete_dir.no_slash2: + + push si + push ds + + mov ax, cs + mov ds, ax + + mov ax, '\\' + push ax + + mov ax, offset _file_path + push ax + + call _strrchr + add sp, 4 + + pop ds + pop si + + and ax, ax + jnz _delete_dir.got_index + + mov di, offset _file_path + jmp _delete_dir.zero + +_delete_dir.got_index: + + mov di, ax + inc di + +_delete_dir.zero: + + mov byte ptr es:[di], 0 + jmp _delete_dir.loop + +_delete_dir.char_ok2: + + stosb + jmp _delete_dir.loop + +_delete_dir.check_path: + + cmp byte ptr es:[di - 1], '\\' + jne _delete_dir.null + + dec di + +_delete_dir.null: + + xor al, al + stosb + +_delete_dir.delete: mov ah, HEX (3A) - mov dx, bx + mov dx, offset _file_path int HEX (21) - jnc _handler_rmdir.next + jnc _delete_dir.close - mov cx, bx + mov cx, offset _file_path cmp ax, 3 - jne _handler_rmdir.check3 + jne _delete_dir.check mov bx, offset _err_failed - jmp _handler_rmdir.error - -_handler_rmdir.check3: + jmp _delete_dir.check2 +_delete_dir.check: + cmp ax, 16 - jne _handler_rmdir.unhandled + jne _delete_dir.unhandled mov bx, offset _err_current - jmp _handler_rmdir.error + jmp _delete_dir.check2 -_handler_rmdir.unhandled: +_delete_dir.unhandled: mov bx, offset _err_unhandled -_handler_rmdir.error: +_delete_dir.check2: cmp ax, 3 - jne _handler_rmdir.error2 + jne _delete_dir.error xchg bx, cx call _writestr xchg bx, cx -_handler_rmdir.error2: +_delete_dir.error: call _writestr cmp ax, 16 - jne _handler_rmdir.next + jne _delete_dir.done mov bx, cx call _writestr call _crlf - jmp _handler_rmdir.next + jmp _delete_dir.done -_handler_rmdir.cleanup: +_delete_dir.close: - 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 bx, ax - mov cx, 6 - rep stosb + mov ah, HEX (3E) + int HEX (21) -_handler_rmdir.done: +_delete_dir.done: + pop cx 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) +_file_path: db 256 dup (0) _err_invalid: db "Invalid number of parameters", HEX (0D), HEX (0A), HEX (00) diff --git a/src/apps/pcomm/touch.asm b/src/apps/pcomm/touch.asm index ca254e9..2f8c2b4 100644 --- a/src/apps/pcomm/touch.asm +++ b/src/apps/pcomm/touch.asm @@ -14,7 +14,7 @@ _handler_touch: push bp mov bp, sp - sub sp, 4 + sub sp, 6 push ax push bx @@ -25,6 +25,7 @@ _handler_touch: push es push ds + mov word ptr [bp - 6], 0 mov word ptr [bp - 4], 0 mov word ptr [bp - 2], 0 @@ -57,7 +58,7 @@ _handler_touch.ok: _handler_touch.store_arg: cmp byte ptr [bx], 0 - je _handler_touch.next + je _handler_touch.check2 mov si, bx push si @@ -80,7 +81,7 @@ _handler_touch.check: add sp, 4 and ax, ax - jz _handler_touch.next + jz _handler_touch.check2 mov bx, ax mov byte ptr [bx], 0 @@ -90,7 +91,7 @@ _handler_touch.check: _handler_touch.skip: cmp byte ptr [bx], 0 - je _handler_touch.next + je _handler_touch.check2 cmp byte ptr [bx], ' ' ja _handler_touch.store_arg @@ -98,15 +99,20 @@ _handler_touch.skip: inc bx jmp _handler_touch.skip +_handler_touch.check2: + + cmp word ptr cs:[_vec_files + 4], 1 + jbe _handler_touch.next + _handler_touch.next: - mov ax, word ptr [bp - 4] + mov ax, word ptr [bp - 6] inc ax cmp ax, cs:[_vec_files + 4] ja _handler_touch.cleanup - mov word ptr [bp - 4], ax + mov word ptr [bp - 6], ax dec ax xor dx, dx @@ -121,100 +127,354 @@ _handler_touch.next: mov es, ax mov ax, es:[bx] - mov bx, ax + mov dx, ax pop es + + call _create_file + 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, 6 + pop bp + + ret -_handler_touch.open: +;****************************************************************************** +; @function _create_file +;****************************************************************************** +_create_file: + push ax push bx + push dx + push ds + push cx + + mov di, offset _file_path + mov cx, 256 + + xor al, al + rep stosb + + mov ah, HEX (19) + int HEX (21) + + mov byte ptr [bp - 4], al + mov si, dx + push si + + call _strlen + add sp, 2 + + cmp ax, 2 + jb _create_file.got_drive + + cmp byte ptr [si + 1], ':' + jne _create_file.got_drive + + mov al, [si] + + cmp al, HEX (7A) + ja _create_file.no_adjust + + cmp al, HEX (61) + jb _create_file.no_adjust + + mov bl, HEX (20) + not bl + + sub al, 'a' + + mov byte ptr [bp - 4], al + add si, 2 + + jmp _create_file.got_drive + +_create_file.no_adjust: + + cmp al, HEX (5A) + ja _create_file.got_drive + + cmp al, HEX (41) + jb _create_file.got_drive + + sub al, 'A' + + mov byte ptr [bp - 4], al + add si, 2 + +_create_file.got_drive: + + mov di, offset _file_path + + mov al, byte ptr [bp - 4] + add al, 'A' + stosb + + mov al, ':' + stosb + + cmp byte ptr [si], '\\' + je _create_file.initial_setup + + mov al, '\\' + stosb + + push dx + push si + + mov dl, byte ptr [bp - 4] + mov si, di + + mov ah, HEX (47) + int HEX (21) + + pop si + pop dx + + mov di, offset _file_path + push di + + call _strlen + add sp, 2 + + add di, ax + +_create_file.initial_setup: + + cmp byte ptr es:[di - 1], '\\' + je _create_file.no_slash + + mov al, '\\' + stosb + +_create_file.no_slash: + + mov bx, si + +_create_file.loop: + + mov ax, si + sub ax, bx + + cmp ax, 65 + ja _create_file.check_path + + lodsb + + and al, al + jz _create_file.check_path + + cmp al, '.' + je _create_file.check_curr + + cmp al, '\\' + jne _create_file.convert_alpha + + cmp si, bx + je _create_file.loop + + cmp byte ptr es:[di - 1], '\\' + je _create_file.loop + +_create_file.convert_alpha: + + xor ah, ah + push ax + + call _isalpha + + and ax, ax + jz _create_file.no_alpha + + call _toupper + add sp, 2 + + jmp _create_file.char_ok2 + +_create_file.no_alpha: + + pop ax + jmp _create_file.char_ok2 + +_create_file.check_curr: + + cmp byte ptr [si], 0 + je _create_file.loop + + cmp byte ptr [si], '\\' + je _create_file.loop + + cmp byte ptr [si], '.' + je _create_file.check_prev + + jmp _create_file.char_ok2 + +_create_file.check_prev: + + cmp byte ptr [si + 1], 0 + je _create_file.get_prev + + cmp byte ptr [si + 1], '\\' + jne _create_file.char_ok2 + +_create_file.get_prev: + + mov cx, offset _file_path + add cx, 3 + + cmp di, cx + je _create_file.no_slash2 + + cmp byte ptr es:[di - 1], '\\' + jne _create_file.no_slash2 + + mov byte ptr es:[di - 1], 0 + +_create_file.no_slash2: + + push si + push ds + + mov ax, cs + mov ds, ax + + mov ax, '\\' + push ax + + mov ax, offset _file_path + push ax + + call _strrchr + add sp, 4 + + pop ds + pop si + + and ax, ax + jnz _create_file.got_index + + mov di, offset _file_path + jmp _create_file.zero + +_create_file.got_index: + + mov di, ax + inc di + +_create_file.zero: + + mov byte ptr es:[di], 0 + jmp _create_file.loop + +_create_file.char_ok2: + + stosb + jmp _create_file.loop + +_create_file.check_path: + + ;cmp byte ptr es:[di - 1], '\\' + ;jne _create_file.null + ; + ;dec di + +_create_file.null: + + xor al, al + stosb + +_create_file.open: + mov ax, HEX (3D02) - mov dx, bx + mov dx, offset _file_path int HEX (21) - jnc _handler_touch.close + jnc _create_file.close mov ah, HEX (3C) mov cx, HEX (20) - mov dx, bx + mov dx, offset _file_path int HEX (21) - jnc _handler_touch.close + jnc _create_file.close cmp ax, 3 - jne _handler_touch.unhandled + jne _create_file.unhandled mov bx, offset _err_no_path - jmp _handler_touch.error + jmp _create_file.error -_handler_touch.unhandled: +_create_file.unhandled: - pop bx mov bx, offset _err_unhandled -_handler_touch.error: +_create_file.error: call _writestr cmp ax, 3 - jne _handler_touch.next + jne _create_file.done - pop bx + mov bx, offset _file_path call _writestr call _crlf - jmp _handler_touch.next + jmp _create_file.done -_handler_touch.close: +_create_file.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: +_create_file.done: + pop cx 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) +_file_path: 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_no_path: db "Path not found: ", HEX (00) _err_unhandled: db "Unhandled error code", HEX (0D), HEX (0A), HEX (00) diff --git a/src/apps/pcomm/type.asm b/src/apps/pcomm/type.asm index da8d569..95c126a 100644 --- a/src/apps/pcomm/type.asm +++ b/src/apps/pcomm/type.asm @@ -14,7 +14,7 @@ _handler_type: push bp mov bp, sp - sub sp, 4 + sub sp, 6 push ax push bx @@ -25,6 +25,7 @@ _handler_type: push es push ds + mov word ptr [bp - 6], 0 mov word ptr [bp - 4], 0 mov word ptr [bp - 2], 0 @@ -57,7 +58,7 @@ _handler_type.ok: _handler_type.store_arg: cmp byte ptr [bx], 0 - je _handler_type.next + je _handler_type.check2 mov si, bx push si @@ -80,7 +81,7 @@ _handler_type.check: add sp, 4 and ax, ax - jz _handler_type.next + jz _handler_type.check2 mov bx, ax mov byte ptr [bx], 0 @@ -90,7 +91,7 @@ _handler_type.check: _handler_type.skip: cmp byte ptr [bx], 0 - je _handler_type.next + je _handler_type.check2 cmp byte ptr [bx], ' ' ja _handler_type.store_arg @@ -98,15 +99,20 @@ _handler_type.skip: inc bx jmp _handler_type.skip +_handler_type.check2: + + cmp word ptr cs:[_vec_files + 4], 1 + jbe _handler_type.next + _handler_type.next: - mov ax, word ptr [bp - 4] + mov ax, word ptr [bp - 6] inc ax cmp ax, cs:[_vec_files + 4] ja _handler_type.cleanup - mov word ptr [bp - 4], ax + mov word ptr [bp - 6], ax dec ax xor dx, dx @@ -121,80 +127,358 @@ _handler_type.next: mov es, ax mov ax, es:[bx] - mov bx, ax + mov dx, ax pop es + + call _read_file + jmp _handler_type.next + +_handler_type.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_type.open: +_handler_type.done: + pop ds + pop es + pop di + pop si + pop dx + pop cx + pop bx + pop ax + + add sp, 6 + pop bp + + ret + +;****************************************************************************** +; @function _read_file +;****************************************************************************** +_read_file: + + push ax push bx + push dx + push ds + push cx + + mov di, offset _file_path + mov cx, 256 + + xor al, al + rep stosb + + mov ah, HEX (19) + int HEX (21) + + mov byte ptr [bp - 4], al + mov si, dx + push si + + call _strlen + add sp, 2 + + cmp ax, 2 + jb _read_file.got_drive + + cmp byte ptr [si + 1], ':' + jne _read_file.got_drive + + mov al, [si] + + cmp al, HEX (7A) + ja _read_file.no_adjust + + cmp al, HEX (61) + jb _read_file.no_adjust + + mov bl, HEX (20) + not bl + + sub al, 'a' + + mov byte ptr [bp - 4], al + add si, 2 + + jmp _read_file.got_drive + +_read_file.no_adjust: + + cmp al, HEX (5A) + ja _read_file.got_drive + + cmp al, HEX (41) + jb _read_file.got_drive + + sub al, 'A' + + mov byte ptr [bp - 4], al + add si, 2 + +_read_file.got_drive: + + mov di, offset _file_path + + mov al, byte ptr [bp - 4] + add al, 'A' + stosb + + mov al, ':' + stosb + + cmp byte ptr [si], '\\' + je _read_file.initial_setup + + mov al, '\\' + stosb + + push dx + push si + + mov dl, byte ptr [bp - 4] + mov si, di + + mov ah, HEX (47) + int HEX (21) + + pop si + pop dx + + mov di, offset _file_path + push di + + call _strlen + add sp, 2 + + add di, ax + +_read_file.initial_setup: + + cmp byte ptr es:[di - 1], '\\' + je _read_file.no_slash + + mov al, '\\' + stosb + +_read_file.no_slash: + + mov bx, si + +_read_file.loop: + + mov ax, si + sub ax, bx + + cmp ax, 65 + ja _read_file.check_path + + lodsb + + and al, al + jz _read_file.check_path + + cmp al, '.' + je _read_file.check_curr + + cmp al, '\\' + jne _read_file.convert_alpha + + cmp si, bx + je _read_file.loop + + cmp byte ptr es:[di - 1], '\\' + je _read_file.loop + +_read_file.convert_alpha: + + xor ah, ah + push ax + + call _isalpha + + and ax, ax + jz _read_file.no_alpha + + call _toupper + add sp, 2 + + jmp _read_file.char_ok2 + +_read_file.no_alpha: + + pop ax + jmp _read_file.char_ok2 + +_read_file.check_curr: + + cmp byte ptr [si], 0 + je _read_file.loop + + cmp byte ptr [si], '\\' + je _read_file.loop + + cmp byte ptr [si], '.' + je _read_file.check_prev + + jmp _read_file.char_ok2 + +_read_file.check_prev: + + cmp byte ptr [si + 1], 0 + je _read_file.get_prev + + cmp byte ptr [si + 1], '\\' + jne _read_file.char_ok2 + +_read_file.get_prev: + + mov cx, offset _file_path + add cx, 3 + + cmp di, cx + je _read_file.no_slash2 + + cmp byte ptr es:[di - 1], '\\' + jne _read_file.no_slash2 + + mov byte ptr es:[di - 1], 0 + +_read_file.no_slash2: + + push si + push ds + + mov ax, cs + mov ds, ax + + mov ax, '\\' + push ax + + mov ax, offset _file_path + push ax + + call _strrchr + add sp, 4 + + pop ds + pop si + + and ax, ax + jnz _read_file.got_index + + mov di, offset _file_path + jmp _read_file.zero + +_read_file.got_index: + + mov di, ax + inc di + +_read_file.zero: + + mov byte ptr es:[di], 0 + jmp _read_file.loop + +_read_file.char_ok2: + + stosb + jmp _read_file.loop + +_read_file.check_path: + + ;cmp byte ptr es:[di - 1], '\\' + ;jne _read_file.null + ; + ;dec di + +_read_file.null: + + xor al, al + stosb + +_read_file.open: + mov ax, HEX (3D02) - mov dx, bx + mov dx, offset _file_path int HEX (21) - jnc _handler_type.file_open + jnc _read_file.file_open cmp ax, 2 - jne _handler_type.check3 + jne _read_file.check3 mov bx, offset _err_no_file - jmp _handler_type.error + jmp _read_file.error -_handler_type.check3: +_read_file.check3: cmp ax, 3 - jne _handler_type.unhandled + jne _read_file.unhandled mov bx, offset _err_no_dir - jmp _handler_type.error + jmp _read_file.error -_handler_type.unhandled: +_read_file.unhandled: - pop bx mov bx, offset _err_unhandled -_handler_type.error: +_read_file.error: call _writestr cmp ax, 3 - ja _handler_type.cleanup + ja _read_file.done cmp ax, 2 - jb _handler_type.cleanup + jb _read_file.done - pop bx + mov bx, offset _file_path call _writestr call _crlf - jmp _handler_type.cleanup + jmp _read_file.done -_handler_type.file_open: +_read_file.file_open: - pop bx mov bx, ax -_handler_type.clear_and_read: +_read_file.clear_and_read: mov ah, HEX (3F) mov cx, 255 mov dx, offset _buffer int HEX (21) - jc _handler_type.close + jc _read_file.close and ax, ax - jz _handler_type.close + jz _read_file.close mov si, dx mov cx, ax -_handler_type.print_loop: +_read_file.print_loop: lodsb cmp al, HEX (0A) - jne _handler_type.char_ok + jne _read_file.char_ok push ax @@ -204,66 +488,41 @@ _handler_type.print_loop: pop ax -_handler_type.char_ok: +_read_file.char_ok: mov ah, HEX (02) mov dl, al int HEX (21) dec cx - jnz _handler_type.print_loop + jnz _read_file.print_loop -_handler_type.read_done: +_read_file.read_done: - jmp _handler_type.clear_and_read + jmp _read_file.clear_and_read -_handler_type.close: +_read_file.close: mov ah, HEX (3E) int HEX (21) - - jmp _handler_type.next - -_handler_type.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_type.done: +_read_file.done: + pop cx 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) -_buffer: db 256 dup (0) + +_file_path: db 256 dup (0) +_buffer: dw 256 dup (0) _err_invalid: db "Invalid number of parameters", HEX (0D), HEX (0A), HEX (00) diff --git a/src/apps/pcomm/xstrcpy.asm b/src/apps/pcomm/xstrcpy.asm index cbe9400..4812b53 100644 --- a/src/apps/pcomm/xstrcpy.asm +++ b/src/apps/pcomm/xstrcpy.asm @@ -19,14 +19,14 @@ _xstrcpy: push si push di - mov si, [bp + 6] - mov di, [bp + 4] + mov si, word ptr [bp + 6] + mov di, word ptr [bp + 4] _xstrcpy.loop: lodsb - or al, al + and al, al jz _xstrcpy.done cmp al, HEX (7A) diff --git a/src/kernel/file.asm b/src/kernel/file.asm index 92957e2..091aef0 100644 --- a/src/kernel/file.asm +++ b/src/kernel/file.asm @@ -566,6 +566,8 @@ _open_file.found_dir: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; test cl, HEX (18) jz _open_file.got_file + + jmp _open_file.error _open_file.name_error: @@ -1162,7 +1164,7 @@ _write_file: push bp mov bp, sp - sub sp, 16 + sub sp, 26 push bx push cx @@ -1187,49 +1189,66 @@ _write_file: ;; If theres zero byte to write then truncate/extend. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; and cx, cx - jz _write_file.zero + jz .L5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;; For now we'll jump to error + ;; Check if the file needs expaning. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - jmp _write_file.error - -_write_file.zero: - - mov ax, es:[si + 66] - mov dx, es:[si + 68] + mov word ptr [bp - 22], dx + mov word ptr [bp - 20], cx - cmp dx, es:[si + 64] - ja _write_file.truncate + mov ax, es:[si + 62] + mov dx, es:[si + 64] - cmp dx, es:[si + 64] - jne _write_file.extend + cmp dx, es:[si + 68] + ja .L20 - cmp ax, es:[si + 62] - jb _write_file.extend + cmp dx, es:[si + 68] + jne .L19 + + cmp ax, es:[si + 66] + jbe .L19 -_write_file.truncate: +.L20: - mov bx, es:[si + 58] - or bx, es:[si + 60] + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Make sure the disk buffer is cleared. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + push es + push di + push ax - and bx, bx - jz _write_file.done + mov cx, es:[si + 50] + xor di, di + + mov ax, cs:[_disk_scratch] + mov es, ax + + xor al, al + rep stosb + + pop ax + pop di + pop es + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Now we need to figure out how many clusters are in use and how many + ;; are in total. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov cx, es:[si + 50] div cx mov bx, ax and dx, dx - jz .L3 + jz .L21 inc bx -.L3: +.L21: - mov ax, es:[si + 62] - mov dx, es:[si + 64] + mov ax, es:[si + 66] + mov dx, es:[si + 68] mov cx, es:[si + 50] div cx @@ -1237,122 +1256,116 @@ _write_file.truncate: mov cx, ax and dx, dx - jz .L3 + jz .L22 inc cx -.L4: +.L22: + mov word ptr [bp - 12], bx xchg bx, cx + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Check if we have a starting cluster. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ax, es:[si + 58] mov dx, es:[si + 60] - -_write_file.truncate_walk: - - mov word ptr [bp - 6], ax - mov word ptr [bp - 4], dx - - and bx, bx - jz _write_file.truncate_ok - - dec cx - - call cs:[_next_cluster] - jc _write_file.truncate_ok - - dec bx - jnz _write_file.truncate_walk - -_write_file.truncate_ok: - - mov ax, word ptr [bp - 6] - mov dx, word ptr [bp - 4] - - mov word ptr [bp - 16], ax - mov word ptr [bp - 14], dx - - mov word ptr [bp - 12], cx - -_write_file.truncate_loop: - - and cx, cx - jz _write_file.truncate_done - call cs:[_next_cluster] - jc _write_file.truncate_done - - push si - push di + mov di, ax + or di, dx - mov si, ax - mov di, dx + and di, di + jnz .L27 - mov ax, word ptr [bp - 6] - mov dx, word ptr [bp - 4] + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Try find a new cluster. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + call cs:[_find_free] + jc _write_file.done - mov word ptr [bp - 6], si - mov word ptr [bp - 4], di + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx - pop di - pop si + dec cx push bx push cx - xor bx, bx - xor cx, cx - + mov bx, HEX (FFFF) + mov cx, HEX (FFF8) call cs:[_update_cluster] pop cx pop bx - mov ax, word ptr [bp - 6] - mov dx, word ptr [bp - 4] + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Update the file info. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov es:[si + 58], ax + mov es:[si + 60], dx - dec cx - jnz _write_file.truncate_loop - -_write_file.truncate_done: - - mov ax, word ptr [bp - 6] - mov dx, word ptr [bp - 4] + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Update the sector on disk. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + push bx + push cx + call cs:[_convert_cluster] + + pop cx + pop bx + jc _write_file.done + push es push bx push cx - xor bx, bx - xor cx, cx + xor ch, ch + mov cl, cs:[_sectors_per_cluster] - call cs:[_update_cluster] + mov bx, cs:[_disk_scratch] + mov es, bx + + xor bx, bx + call _write_sectors pop cx pop bx + pop es - xor ax, ax - xor dx, dx - - mov bx, es:[si + 62] - or bx, es:[si + 64] + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Jump straight to writing the sectors. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + jmp .L26 + +.L27: + + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx and bx, bx - jz _write_file.truncate_update + jz .L26 - mov cx, word ptr [bp - 12] + call cs:[_next_cluster] + jc .L26 - cmp cx, 2 - jb _write_file.truncate_expand_done + dec word ptr [bp - 12] + dec cx - sub cx, 2 + dec bx + jnz .L27 -_write_file.truncate_expand: +.L26: + + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] + +.L28: and cx, cx - jz _write_file.truncate_expand_done + jz .L29 call cs:[_find_free] - jc _write_file.truncate_expand_done + jc _write_file.done push bx push cx @@ -1360,44 +1373,97 @@ _write_file.truncate_expand: mov bx, dx mov cx, ax - mov ax, word ptr [bp - 16] - mov dx, word ptr [bp - 14] + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] call cs:[_update_cluster] - mov word ptr [bp - 16], cx - mov word ptr [bp - 14], bx + push bx + push cx + call cs:[_convert_cluster] + + pop cx + pop bx + jc .L29 + + push es + push bx + push cx + + xor ch, ch + mov cl, cs:[_sectors_per_cluster] + + mov bx, cs:[_disk_scratch] + mov es, bx + + xor bx, bx + call _write_sectors + + pop cx + pop bx + pop es + + mov ax, cx + mov dx, bx + + mov bx, HEX (FFFF) + mov cx, HEX (FFF8) + call cs:[_update_cluster] pop cx pop bx + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx + dec cx - jnz _write_file.truncate_expand + jnz .L28 -_write_file.truncate_expand_done: +.L29: + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Preserve registers. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + push es push bx push cx + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Mark the current cluster as EOF. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov bx, HEX (FFFF) mov cx, HEX (FFF8) - mov ax, word ptr [bp - 16] - mov dx, word ptr [bp - 14] + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] call cs:[_update_cluster] + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Update the sector on disk. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + call cs:[_convert_cluster] + jc _write_file.done + + xor ch, ch + mov cl, cs:[_sectors_per_cluster] + + mov bx, cs:[_disk_scratch] + mov es, bx + + xor bx, bx + call _write_sectors + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Restore registers. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pop cx pop bx + pop es - mov ax, es:[si + 58] - mov dx, es:[si + 60] - -_write_file.truncate_update: - - mov es:[si + 58], ax - mov es:[si + 60], dx - + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Update the stack variables. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ax, es:[si + 58] mov word ptr [bp - 6], ax @@ -1462,11 +1528,15 @@ _write_file.truncate_update: mov ax, cs:[_info_sector] and ax, ax - jz _write_file.done + jz .L19 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update the free clusters. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + push es + push bx + push cx + xor dx, dx add ax, cs:[_hidden_sectors] @@ -1484,8 +1554,8 @@ _write_file.truncate_update: mov ax, es:[di + 8] mov dx, es:[di + 10] - add ax, word ptr [bp - 12] - adc dx, 0 + sub ax, word ptr [bp - 12] + sbb dx, 0 mov es:[di + 8], ax mov es:[di + 10], dx @@ -1499,34 +1569,781 @@ _write_file.truncate_update: mov cx, 1 call _write_sectors - jmp _write_file.done + pop cx + pop bx + pop es -_write_file.extend: +.L19: - push es - push di - push ax - - xor cx, es:[si + 50] - - mov ax, cs:[_disk_scratch] - mov es, ax - xor di, di - - xor al, al - rep stosb + mov word ptr [bp - 12], 0 + mov word ptr [bp - 2], 0 - pop ax - pop di - pop es + mov ax, es:[si + 62] + mov dx, es:[si + 64] mov cx, es:[si + 50] div cx - mov bx, ax - and dx, dx - jz .L2 + jz .L30 + + inc ax + +.L30: + + mov word ptr [bp - 26], ax + + mov ax, es:[si + 66] + mov dx, es:[si + 68] + + mov cx, es:[si + 50] + div cx + + and dx, dx + jz .L31 + + inc ax + +.L31: + + mov word ptr [bp - 24], ax + +.L32: + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Make sure the disk buffer is cleared. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + push es + push di + push ax + + mov cx, es:[si + 50] + xor di, di + + mov ax, cs:[_disk_scratch] + mov es, ax + + xor al, al + rep stosb + + pop ax + pop di + pop es + +.L34: + + mov cx, word ptr [bp - 20] + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; If we don't have any data left then we're done. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + and cx, cx + jz .L42 + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Figure out what cluster we need to write to. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, es:[si + 62] + mov dx, es:[si + 64] + + mov cx, es:[si + 50] + div cx + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Copy the value in the dx register (offset into the cluster) into + ;; the di register. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov di, dx + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Calaculate how many bytes need to be write. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov cx, es:[si + 50] + sub cx, di + + cmp cx, word ptr [bp - 20] + jb .L35 + + mov cx, word ptr [bp - 20] + +.L35: + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Are we writing to an existing cluster or a new one? + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + cmp ax, word ptr [bp - 24] + jae .L36 + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Copy the cluster count to the bx register. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov bx, ax + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Get the starting cluster. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, es:[si + 58] + mov dx, es:[si + 60] + +.L37: + + and bx, bx + jz .L38 + + call cs:[_next_cluster] + jc .L42 + + dec bx + jnz .L37 + +.L38: + + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx + + push si + push es + push ds + push cx + + push bx + push cx + call cs:[_convert_cluster] + + pop cx + pop bx + jc .L43 + + push ax + push dx + push si + push di + push cx + + mov bx, es:[si + 70] + mov es, bx + + xor ch, ch + mov cl, cs:[_sectors_per_cluster] + + xor bx, bx + call _read_sectors + + pop cx + push cx + + mov si, word ptr [bp - 22] + rep movsb + + pop cx + pop di + pop si + pop dx + pop ax + + sub word ptr [bp - 20], cx + add word ptr [bp - 2], cx + add word ptr [bp - 22], cx + + xor ch, ch + mov cl, cs:[_sectors_per_cluster] + + xor bx, bx + call _write_sectors + + pop cx + pop ds + pop es + pop si + + add es:[si + 62], cx + adc word ptr es:[si + 64], 0 + + jmp .L34 + +.L36: + + mov ax, es:[si + 58] + mov dx, es:[si + 60] + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Do we have a starting cluster? + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov bx, ax + or bx, dx + + and bx, bx + jnz .L39 + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Try find a new cluster. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + call cs:[_find_free] + jc .L42 + + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx + + push bx + push cx + + mov bx, HEX (FFFF) + mov cx, HEX (FFF8) + call cs:[_update_cluster] + + pop cx + pop bx + + inc word ptr [bp - 12] + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Update the file info. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov es:[si + 58], ax + mov es:[si + 60], dx + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Update the sector on disk. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + push bx + push cx + call cs:[_convert_cluster] + + pop cx + pop bx + jc _write_file.done + + push es + push bx + push cx + + xor ch, ch + mov cl, cs:[_sectors_per_cluster] + + mov bx, cs:[_disk_scratch] + mov es, bx + + xor bx, bx + call _write_sectors + + pop cx + pop bx + pop es + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Jump straight to writing the sectors. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + jmp .L40 + +.L39: + + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx + + call cs:[_next_cluster] + jc .L41 + + jmp .L39 + +.L41: + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Try find a new cluster. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + call cs:[_find_free] + jc .L42 + + push bx + push cx + push ax + push dx + + mov bx, dx + mov cx, ax + + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] + call cs:[_update_cluster] + + pop dx + pop ax + pop cx + pop bx + + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx + + push bx + push cx + + mov bx, HEX (FFFF) + mov cx, HEX (FFF8) + call cs:[_update_cluster] + + pop cx + pop bx + + inc word ptr [bp - 12] + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Update the sector on disk. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + push bx + push cx + call cs:[_convert_cluster] + + pop cx + pop bx + jc _write_file.done + + push es + push bx + push cx + + xor ch, ch + mov cl, cs:[_sectors_per_cluster] + + mov bx, cs:[_disk_scratch] + mov es, bx + + xor bx, bx + call _write_sectors + + pop cx + pop bx + pop es + +.L40: + + push si + push es + push ds + push cx + + push ax + push di + push cx + + mov ax, es:[si + 70] + mov cx, es:[si + 50] + + mov es, ax + + xor al, al + rep stosb + + pop cx + pop di + pop ax + + push si + push di + push cx + + mov si, word ptr [bp - 22] + rep movsb + + pop cx + pop di + pop si + + push cx + push bx + + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] + call cs:[_convert_cluster] + + pop bx + pop cx + jc .L43 + + sub word ptr [bp - 20], cx + add word ptr [bp - 2], cx + add word ptr [bp - 22], cx + + xor ch, ch + mov cl, cs:[_sectors_per_cluster] + + xor bx, bx + call _write_sectors + + pop cx + pop ds + pop es + pop si + + add es:[si + 62], cx + adc word ptr es:[si + 64], 0 + + jmp .L34 + +.L43: + + pop cx + pop ds + pop es + pop si + +.L42: + + mov ax, es:[si + 62] + mov dx, es:[si + 64] + + cmp dx, es:[si + 68] + ja .L44 + + cmp dx, es:[si + 68] + jne .L45 + + cmp ax, es:[si + 66] + jb .L45 + +.L44: + + mov ax, es:[si + 62] + mov dx, es:[si + 64] + + mov es:[si + 66], ax + mov es:[si + 68], dx + +.L45: + + mov ax, es:[si + 66] + mov word ptr [bp - 10], ax + + mov ax, es:[si + 68] + mov word ptr [bp - 8], ax + + mov ax, es:[si + 58] + mov word ptr [bp - 6], ax + + mov ax, es:[si + 60] + mov word ptr [bp - 4], 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 + + mov ax, word ptr [bp - 6] + mov es:[di + 26], ax + + mov ax, word ptr [bp - 4] + mov es:[di + 20], ax + + mov ax, word ptr [bp - 10] + mov es:[di + 28], ax + + mov ax, word ptr [bp - 8] + mov es:[di + 30], ax + + pop cx + pop dx + pop ax + + xor bx, bx + call _write_sectors + + pop bx + pop es + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Check if we have an info sector. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ax, cs:[_info_sector] + + and ax, ax + jz _write_file.done + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; 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] + + sub ax, word ptr [bp - 12] + sbb 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 + + jmp _write_file.done + +.L5: + + mov ax, es:[si + 66] + mov dx, es:[si + 68] + + cmp dx, es:[si + 64] + ja .L18 + + cmp dx, es:[si + 64] + jne .L17 + + cmp ax, es:[si + 62] + jb .L17 + +.L18: + + mov bx, es:[si + 58] + or bx, es:[si + 60] + + and bx, bx + jz _write_file.done + + mov cx, es:[si + 50] + div cx + + mov bx, ax + + and dx, dx + jz .L3 + + inc bx + +.L3: + + mov ax, es:[si + 62] + mov dx, es:[si + 64] + + mov cx, es:[si + 50] + div cx + + mov cx, ax + + and dx, dx + jz .L3 + + inc cx + +.L4: + + xchg bx, cx + + mov ax, es:[si + 58] + mov dx, es:[si + 60] + +.L7: + + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx + + and bx, bx + jz .L8 + + dec cx + + call cs:[_next_cluster] + jc .L8 + + dec bx + jnz .L7 + +.L8: + + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] + + mov word ptr [bp - 16], ax + mov word ptr [bp - 14], dx + + mov word ptr [bp - 12], cx + +.L9: + + and cx, cx + jz .L10 + + call cs:[_next_cluster] + jc .L10 + + push si + push di + + mov si, ax + mov di, dx + + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] + + mov word ptr [bp - 6], si + mov word ptr [bp - 4], di + + pop di + pop si + + push bx + push cx + + xor bx, bx + xor cx, cx + + call cs:[_update_cluster] + + pop cx + pop bx + + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] + + dec cx + jnz .L9 + +.L10: + + mov ax, word ptr [bp - 6] + mov dx, word ptr [bp - 4] + + push bx + push cx + + xor bx, bx + xor cx, cx + + call cs:[_update_cluster] + + pop cx + pop bx + + xor ax, ax + xor dx, dx + + mov bx, es:[si + 62] + or bx, es:[si + 64] + + and bx, bx + jz .L12 + + mov cx, word ptr [bp - 12] + + cmp cx, 2 + jb .L6 + + sub cx, 2 + +.L11: + + and cx, cx + jz .L6 + + call cs:[_find_free] + jc .L6 + + push bx + push cx + + mov bx, dx + mov cx, ax + + mov ax, word ptr [bp - 16] + mov dx, word ptr [bp - 14] + + call cs:[_update_cluster] + + mov word ptr [bp - 16], cx + mov word ptr [bp - 14], bx + + pop cx + pop bx + + dec cx + jnz .L11 + +.L6: + + push bx + push cx + + mov bx, HEX (FFFF) + mov cx, HEX (FFF8) + + mov ax, word ptr [bp - 16] + mov dx, word ptr [bp - 14] + + call cs:[_update_cluster] + + pop cx + pop bx + + mov ax, es:[si + 58] + mov dx, es:[si + 60] + +.L12: + + mov es:[si + 58], ax + mov es:[si + 60], dx + + mov word ptr [bp - 18], 1 + jmp .L23 + +.L17: + + mov word ptr [bp - 18], 0 + + push es + push di + push ax + + mov cx, es:[si + 50] + + mov ax, cs:[_disk_scratch] + mov es, ax + xor di, di + + xor al, al + rep stosb + + pop ax + pop di + pop es + + mov cx, es:[si + 50] + div cx + + mov bx, ax + + and dx, dx + jz .L2 inc bx @@ -1546,6 +2363,8 @@ _write_file.extend: inc cx .L1: + + mov word ptr [bp - 12], cx mov ax, es:[si + 58] mov dx, es:[si + 60] @@ -1554,7 +2373,7 @@ _write_file.extend: or di, dx and di, di - jnz _write_file.extend_walk + jnz .L13 call cs:[_find_free] jc _write_file.done @@ -1562,6 +2381,16 @@ _write_file.extend: mov word ptr [bp - 6], ax mov word ptr [bp - 4], dx + push bx + push cx + + mov bx, HEX (FFFF) + mov cx, HEX (FFF8) + call cs:[_update_cluster] + + pop cx + pop bx + mov es:[si + 58], ax mov es:[si + 60], dx @@ -1587,38 +2416,39 @@ _write_file.extend: call _write_sectors pop cx + dec cx + pop bx pop es - jmp _write_file.extend_no_walk + jmp .L14 -_write_file.extend_walk: +.L13: mov word ptr [bp - 6], ax mov word ptr [bp - 4], dx and bx, bx - jz _write_file.extend_no_walk + jz .L14 call cs:[_next_cluster] - jc _write_file.extend_no_walk + jc .L14 + dec word ptr [bp - 12] dec cx dec bx - jnz _write_file.extend_walk + jnz .L13 -_write_file.extend_no_walk: +.L14: mov ax, word ptr [bp - 6] mov dx, word ptr [bp - 4] - - mov word ptr [bp - 12], cx -_write_file.extend_loop: +.L15: and cx, cx - jz _write_file.extend_update + jz .L16 call cs:[_find_free] jc _write_file.done @@ -1640,7 +2470,7 @@ _write_file.extend_loop: pop cx pop bx - jc _write_file.extend_update + jc .L16 push es push bx @@ -1659,16 +2489,23 @@ _write_file.extend_loop: pop bx pop es - mov word ptr [bp - 6], cx - mov word ptr [bp - 4], bx + mov ax, cx + mov dx, bx + + mov bx, HEX (FFFF) + mov cx, HEX (FFF8) + call cs:[_update_cluster] pop cx pop bx + mov word ptr [bp - 6], ax + mov word ptr [bp - 4], dx + dec cx - jnz _write_file.extend_loop + jnz .L15 -_write_file.extend_update: +.L16: push es push bx @@ -1697,7 +2534,9 @@ _write_file.extend_update: pop cx pop bx pop es - + +.L23: + mov ax, es:[si + 58] mov word ptr [bp - 6], ax @@ -1784,9 +2623,21 @@ _write_file.extend_update: mov ax, es:[di + 8] mov dx, es:[di + 10] + cmp word ptr [bp - 18], 1 + jb .L25 + + add ax, word ptr [bp - 12] + adc dx, 0 + + jmp .L24 + +.L25: + sub ax, word ptr [bp - 12] sbb dx, 0 - + +.L24: + mov es:[di + 8], ax mov es:[di + 10], dx @@ -1801,17 +2652,17 @@ _write_file.extend_update: _write_file.done: - mov word ptr es:[si + 54], 1 - pop ds pop es pop di pop si + mov word ptr es:[si + 54], 1 + pop dx pop cx pop bx - add sp, 16 + add sp, 26 clc mov ax, word ptr [bp - 2] @@ -1821,17 +2672,17 @@ _write_file.done: _write_file.error: - mov word ptr es:[si + 54], 1 - pop ds pop es pop di pop si + mov word ptr es:[si + 54], 1 + pop dx pop cx pop bx - add sp, 16 + add sp, 26 stc mov ax, 5 diff --git a/src/kernel/int21.asm b/src/kernel/int21.asm index 7e3899a..eb28c8f 100644 --- a/src/kernel/int21.asm +++ b/src/kernel/int21.asm @@ -2588,9 +2588,6 @@ _int21_3C: push es push ds - xor bh, bh - mov bl, al - mov si, dx call _get_disk_info @@ -2610,7 +2607,11 @@ _int21_3C.create: mov word ptr [bp - 4], si mov word ptr [bp - 2], di + push cx + call _walk_path + pop cx + jc _int21_3C.error_path ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -3452,9 +3453,6 @@ _int21_41: push es push ds - xor bh, bh - mov bl, al - mov si, dx call _get_disk_info @@ -3521,7 +3519,7 @@ _int21_41.open: or bx, dx and bx, bx - jz _int21_41.update + jz _int21_41.no_start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Convert the size into the amount of cluster. @@ -3578,6 +3576,11 @@ _int21_41.clear: dec cx jnz _int21_41.clear +_int21_41.no_start: + + xor cx, cx + push cx + _int21_41.update: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -4183,6 +4186,8 @@ _int21_4E: push es push ds + mov word ptr [bp -8], cx + mov ax, cs:[_selected_disk] mov word ptr [bp - 10], ax -- 2.34.1