Added error messages
authorRobert Pengelly <robertapengelly@hotmail.com>
Thu, 1 Aug 2024 04:28:38 +0000 (05:28 +0100)
committerRobert Pengelly <robertapengelly@hotmail.com>
Thu, 1 Aug 2024 04:28:38 +0000 (05:28 +0100)
build/chimaera.img
build/chimaera.vhd
src/apps/pcomm/Makefile.unix
src/apps/pcomm/Makefile.w32
src/apps/pcomm/cd.asm [new file with mode: 0644]
src/apps/pcomm/pcomm.asm
src/apps/pcomm/type.asm

index a1adb6ecdae438887f5080a8dfec7d39a758eaeb..fbf278fafeef33232f3f63e70847825ca00be465 100644 (file)
Binary files a/build/chimaera.img and b/build/chimaera.img differ
index 63ee89caf0e6144faad2c6290972a1cd134c07b1..d3567ff048d81b1bf83376aa6159cc9b23c0e1d5 100644 (file)
Binary files a/build/chimaera.vhd and b/build/chimaera.vhd differ
index 4b669c37a64edf3d46226672f702217ebe346602..215b56d9830303cb9ebd200a2cc42ac3b674b643 100644 (file)
@@ -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
index 994bad8eb53a1774617b23e7675d9e847179a585..176b539941e0ed62afe574e8c5c5d124c7629213 100644 (file)
@@ -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 (file)
index 0000000..2f62504
--- /dev/null
@@ -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)
index c9c2a41b444899df47cc28c6b60ff107197bddd7..f8505d1aad8260a63e2bef3dfb347b7bd3895175 100644 (file)
@@ -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)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
index 57197f224779b77053f6c177f12844f7d029d00f..4d504cf51058c2160457d83d5e6d3bfb03897ba1 100644 (file)
@@ -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)