From: Robert Pengelly Date: Thu, 1 Aug 2024 04:28:38 +0000 (+0100) Subject: Added error messages X-Git-Url: https://git.candlhat.org/?a=commitdiff_plain;h=909fc89a302c28acc2c188e3602b202a0b661cb8;p=chimaera.git Added error messages --- diff --git a/build/chimaera.img b/build/chimaera.img index a1adb6e..fbf278f 100644 Binary files a/build/chimaera.img and b/build/chimaera.img differ diff --git a/build/chimaera.vhd b/build/chimaera.vhd index 63ee89c..d3567ff 100644 Binary files a/build/chimaera.vhd and b/build/chimaera.vhd differ diff --git a/src/apps/pcomm/Makefile.unix b/src/apps/pcomm/Makefile.unix index 4b669c3..215b56d 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 crlf.o date.o dir.o erase.o exit.o history.o pcomm.o time.o type.o vector.o writedec.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 pcomm.o time.o type.o vector.o writedec.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 994bad8..176b539 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 crlf.o date.o dir.o erase.o exit.o history.o pcomm.o time.o type.o vector.o writedec.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 pcomm.o time.o type.o vector.o writedec.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/cd.asm b/src/apps/pcomm/cd.asm new file mode 100644 index 0000000..2f62504 --- /dev/null +++ b/src/apps/pcomm/cd.asm @@ -0,0 +1,151 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; @file cd.asm +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +%ifndef HEX +% define HEX(y) 0x##y +%endif + +;****************************************************************************** +; @function _handler_cd +;****************************************************************************** +global _handler_cd +_handler_cd: + + push ax + push bx + push si + + cmp byte ptr [bx], 0 + jne _handler_cd.got_arg + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Print the current drive letter. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov al, cs:[_curr_drive] + add al, 'A' + + mov ah, HEX (02) + mov dl, al + int HEX (21) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Print a colon and backsplash. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov ah, HEX (02) + mov dl, ':' + int HEX (21) + + mov ah, HEX (02) + mov dl, '\\' + int HEX (21) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Print the current directory. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + mov bx, offset _curr_path + call _writestr + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Print a newline. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + call _crlf + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Jump to done. + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + jmp _handler_cd.done + +_handler_cd.got_arg: + + mov ax, ' ' + push ax + + mov si, bx + push si + + call _strchr + add sp, 4 + + and ax, ax + jz _handler_cd.change + + mov bx, ax + mov byte ptr [bx], 0 + + inc bx + +_handler_cd.skip: + + cmp byte ptr [bx], 0 + je _handler_cd.change + + cmp byte ptr [bx], ' ' + ja _handler_cd.err_invalid + + inc bx + jmp _handler_cd.skip + +_handler_cd.change: + + mov ah, HEX (3B) + mov dx, si + int HEX (21) + jnc _handler_cd.done + + cmp ax, 2 + jne _handler_cd.check3 + + mov bx, offset _err_no_file + jmp _handler_cd.error + +_handler_cd.check3: + + cmp ax, 3 + jne _handler_cd.unhandled + + mov bx, offset _err_no_dir + jmp _handler_cd.error + +_handler_cd.unhandled: + + pop bx + mov bx, offset _err_unhandled + +_handler_cd.error: + + call _writestr + + cmp ax, 3 + ja _handler_cd.done + + cmp ax, 2 + jb _handler_cd.done + + mov bx, si + + call _writestr + call _crlf + + jmp _handler_cd.done + +_handler_cd.err_invalid: + + mov bx, offset _err_invalid + call _writestr + +_handler_cd.done: + + pop si + pop bx + pop ax + ret + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Data area. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +_err_invalid: db "too many arguments", HEX (0D), HEX (0A), HEX (00) + +_err_no_dir: 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/pcomm.asm b/src/apps/pcomm/pcomm.asm index c9c2a41..f8505d1 100644 --- a/src/apps/pcomm/pcomm.asm +++ b/src/apps/pcomm/pcomm.asm @@ -35,6 +35,7 @@ _main: .L7: + mov word ptr cs:[_need_ext], 0 call _prompt mov cl, cs:[_scratch_size] @@ -378,6 +379,7 @@ _main: mov cx, ax rep movsb + mov word ptr cs:[_need_ext], 1 add bx, ax mov al, '.' @@ -425,6 +427,30 @@ _main: int HEX (21) jnc .L5 + mov bx, offset _err_invalid + call _writestr + + cmp word ptr cs:[_need_ext], 1 + jb .L34 + + mov ax, '.' + push ax + + mov bx, offset _app_path + push bx + + call _strrchr + add sp, 4 + + mov bx, ax + mov byte ptr [bx], 0 + +.L34: + + mov bx, offset _app_path + call _writestr + + call _crlf jmp .L5 .L1: @@ -659,65 +685,6 @@ _handle_backspace: ret -;****************************************************************************** -; @function _handler_cd -;****************************************************************************** -_handler_cd: - - push ax - push bx - push si - - mov ax, ' ' - push ax - - mov si, bx - push si - - call _strchr - add sp, 4 - - and ax, ax - jz _handler_cd.change - - mov bx, ax - mov byte ptr [bx], 0 - - inc bx - -_handler_cd.skip: - - cmp byte ptr [bx], 0 - je _handler_cd.change - - cmp byte ptr [bx], ' ' - ja _handler_cd.error - - inc bx - jmp _handler_cd.skip - -_handler_cd.change: - - mov ah, HEX (3B) - mov dx, si - int HEX (21) - - jmp _handler_cd.done - -_handler_cd.error: - - mov bx, offset _handler_cd.errmsg - call _writestr - -_handler_cd.done: - - pop si - pop bx - pop ax - ret - -_handler_cd.errmsg: db "cd: too many arguments", HEX (0D), HEX (0A), HEX (00) - ;****************************************************************************** ; @function _handler_cls ;****************************************************************************** @@ -921,9 +888,16 @@ _scratch: db 257 dup (0) _app_path: db 255 dup (0) _param_blk: db 16 dup (0) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Error messages. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +_err_invalid: db "Bad command or file name - ", HEX (00) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Data area. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +_need_ext: dw HEX (0000) + global _vec_history _vec_history: db 6 dup (0) @@ -939,7 +913,10 @@ _history_idx: dw HEX (0000) global _curr_scratch _curr_scratch: dw HEX (0000) +global _curr_path _curr_path: db 65 dup (0) + +global _curr_drive _curr_drive: db HEX (00) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/src/apps/pcomm/type.asm b/src/apps/pcomm/type.asm index 57197f2..4d504cf 100644 --- a/src/apps/pcomm/type.asm +++ b/src/apps/pcomm/type.asm @@ -28,6 +28,16 @@ _handler_type: mov word ptr [bp - 4], 0 mov word ptr [bp - 2], 0 + cmp byte ptr [bx], 0 + jne _handler_type.ok + + mov bx, offset _err_invalid + call _writestr + + jmp _handler_type.done + +_handler_type.ok: + push bx call _strlen @@ -117,11 +127,52 @@ _handler_type.next: _handler_type.open: + push bx + mov ax, HEX (3D02) mov dx, bx int HEX (21) - jc _handler_type.cleanup + jnc _handler_type.file_open + + cmp ax, 2 + jne _handler_type.check3 + + mov bx, offset _err_no_file + jmp _handler_type.error + +_handler_type.check3: + + cmp ax, 3 + jne _handler_type.unhandled + + mov bx, offset _err_no_dir + jmp _handler_type.error + +_handler_type.unhandled: + + pop bx + mov bx, offset _err_unhandled + +_handler_type.error: + + call _writestr + + cmp ax, 3 + ja _handler_type.cleanup + + cmp ax, 2 + jb _handler_type.cleanup + + pop bx + + call _writestr + call _crlf + jmp _handler_type.cleanup + +_handler_type.file_open: + + pop bx mov bx, ax _handler_type.clear_and_read: @@ -217,3 +268,9 @@ _vec_files: db 6 dup (0) _cmdline: db 256 dup (0) _buffer: 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_file: db "File not found: ", HEX (00) + +_err_unhandled: db "Unhandled error code", HEX (0D), HEX (0A), HEX (00)