Execute from PATH when not found in current directory
authorRobert Pengelly <robertapengelly@hotmail.com>
Wed, 25 Sep 2024 12:07:29 +0000 (13:07 +0100)
committerRobert Pengelly <robertapengelly@hotmail.com>
Wed, 25 Sep 2024 12:07:29 +0000 (13:07 +0100)
build/chimaera.img
build/chimaera.vhd
src/Makefile.unix
src/apps/hello/hello.asm
src/apps/pcomm/path.asm
src/apps/pcomm/pcomm.asm
src/apps/pcomm/set.asm

index ee9474368ea5f199e8b0423eb99ae0ca9b36962e..79c30fdaf6c5293d02b71a149ae1edeaa654ea5c 100644 (file)
Binary files a/build/chimaera.img and b/build/chimaera.img differ
index f07d8336746cacc6b9efe6caa3f53ee50d265b18..7c92d87f7abcca6c3abec34c86d6c5877927925e 100644 (file)
Binary files a/build/chimaera.vhd and b/build/chimaera.vhd differ
index db0dd9c085c213d13ba602c5192ca4172d0f31fe..be37d93b10ff541c502c424316b5460f89f34ec2 100644 (file)
@@ -30,7 +30,9 @@ 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
+       
+#      utils/dosfstools/mmd -i $@ dos
+#      utils/dosfstools/mcopy -i $@ apps/hello/hello.com ::dos/hello.com
 
 chimaera.vhd: all
        if [ -f $@ ]; then rm -rf $@; fi
index 66c03e0a985aa7c55afbb9e0bff02cf70ffbca7a..c6eb2cfc935f45e6afc99e66964bfbae54aff329 100644 (file)
@@ -24,14 +24,14 @@ _main:
     mov     bx,     offset _msg_hello
     call    _writestr
     
-.L1:
-
-    mov     ah,     HEX (02)
-    mov     dl,     'A'
-    int     HEX (21)
-    
-    jmp     .L1
-    
+;.L1:
+;
+;    mov     ah,     HEX (02)
+;    mov     dl,     'A'
+;    int     HEX (21)
+;    
+;    jmp     .L1
+;    
 ;    mov     bp,     sp
 ;    
 ;    mov     ax,     bp
index f540a521a4bea8242ab804ac749812438d97ae9b..d1aaa6a26a707229382b2a26c19fb1b374ce0921 100644 (file)
@@ -372,10 +372,214 @@ _handler_path.done:
     pop     ax
     ret
 
+;******************************************************************************
+; @function         _get_paths
+;******************************************************************************
+global      _get_paths
+_get_paths:
+
+    push    ax
+    push    bx
+    push    cx
+    push    dx
+    push    si
+    push    di
+    push    es
+    push    ds
+    
+    mov     ax,     cs:[_vec_paths]
+    
+    and     ax,     ax
+    jz      _get_paths.clear
+    
+    push    ax
+    
+    call    _free
+    add     sp,     2
+    
+    xor     ax,     ax
+    mov     cs:[_vec_paths],    ax
+
+_get_paths.clear:
+
+    mov     di,     offset _vec_paths
+    xor     al,     al
+    
+    mov     cx,     6
+    rep     stosb
+    
+    mov     si,     cs:[_vec_env]
+    mov     cx,     cs:[_vec_env + 4]
+    
+    mov     es,     si
+    xor     di,     di
+
+_get_paths.find:
+
+    and     cx,     cx
+    jz      _get_paths.done
+    
+    push    es
+    mov     ax,     es:[di]
+    
+    mov     es,     ax
+    push    es
+    
+    xor     bx,     bx
+    mov     ax,     es:[bx]
+    
+    push    cx
+    push    es
+    push    ds
+    
+    mov     cx,     ds
+    mov     es,     cx
+    mov     ds,     ax
+    
+    push    es
+    push    di
+    
+    mov     di,     offset _temp
+    xor     al,     al
+    
+    mov     cx,     255
+    rep     stosb
+    
+    pop     di
+    pop     es
+    
+    xor     ax,     ax
+    push    ax
+    
+    mov     ax,     offset _temp
+    push    ax
+    
+    call    _strcpy
+    add     sp,     4
+    
+    pop     ds
+    
+    mov     ax,     ds
+    mov     es,     ax
+    
+    mov     ax,     offset _var
+    push    ax
+    
+    mov     ax,     offset _temp
+    push    ax
+    
+    call    _strcmp
+    add     sp,     4
+    
+    pop     es
+    pop     cx
+    
+    and     ax,     ax
+    jz      _get_paths.found
+    
+    pop     ax
+    pop     es
+    
+    add     di,     2
+    dec     cx
+    
+    jmp     _get_paths.find
+
+_get_paths.found:
+
+    pop     si
+    pop     es
+    
+    mov     es,     si
+    xor     bx,     bx
+    
+    mov     ax,     es:[bx + 2]
+    
+    and     ax,     ax
+    jz      _get_paths.done
+    
+    push    cx
+    push    es
+    push    ds
+    
+    mov     cx,     ds
+    mov     es,     cx
+    mov     ds,     ax
+    
+    push    es
+    push    di
+    
+    mov     di,     offset _temp
+    xor     al,     al
+    
+    mov     cx,     255
+    rep     stosb
+    
+    pop     di
+    pop     es
+    
+    xor     ax,     ax
+    push    ax
+    
+    mov     ax,     offset _temp
+    push    ax
+    
+    call    _strcpy
+    add     sp,     4
+    
+    pop     ds
+    pop     es
+    pop     cx
+    
+    mov     di,     offset _temp
+    xor     bx,     bx
+    
+    mov     ax,     ds
+    mov     es,     ax
+
+_get_paths.loop:
+
+    push    di
+    
+    mov     ax,     offset _vec_paths
+    push    ax
+    
+    call    _vec_push
+    add     sp,     4
+    
+    mov     ax,     ';'
+    push    ax
+    
+    push    di
+    
+    call    _strchr
+    add     sp,     4
+    
+    and     ax,     ax
+    jz      _get_paths.done
+    
+    mov     di,     ax
+    
+    xor     al,     al
+    stosb
+    
+    jmp     _get_paths.loop
+
+_get_paths.done:
+
+    pop     ds
+    pop     es
+    pop     di
+    pop     si
+    pop     dx
+    pop     cx
+    pop     bx
+    pop     ax
+    ret
+
 ;******************************************************************************
 ; @function         _skip_whitespace
 ;******************************************************************************
-global      _skip_whitespace
 _skip_whitespace:
 
     cmp     byte ptr [bx],      0
index 9a59251bd786a1ba3099e8fb3255cff8431fd571..8e01127df810cdc937ac6a9f70fb3fefdf6f8e1d 100644 (file)
@@ -1356,6 +1356,8 @@ _main:
     xor     al,     al
     stosb
     
+    push    bx
+    
     mov     dx,     offset _app_path
     inc     bx
     mov     di,     bx
@@ -1367,8 +1369,79 @@ _main:
     
     mov     ax,     HEX (4B00)
     int     HEX (21)
+    pop     bx
     jnc     .L5
     
+    mov     ax,     '\\'
+    push    ax
+    
+    mov     ax,     offset _app_path
+    push    ax
+    
+    call    _strrchr
+    add     sp,     4
+    
+    and     ax,     ax
+    jnz     .L98
+
+.L99:
+
+    call    _get_paths
+    
+    push    ax
+    push    bx
+    push    cx
+    push    di
+    push    es
+    
+    mov     ax,     cs:[_vec_paths]
+    mov     es,     ax
+    mov     cx,     cs:[_vec_paths + 4]
+    
+    xor     di,     di
+
+.L96:
+
+    and     cx,     cx
+    jz      .L97
+    
+    mov     ax,     offset _app_path
+    push    ax
+    
+    mov     ax,     es:[di]
+    push    ax
+    
+    call    _concat_exec
+    jnc     .L100
+    add     sp,     4
+    
+    add     di,     2
+    dec     cx
+    
+    jmp     .L96
+
+.L100:
+
+    add     sp,     4
+    
+    pop     es
+    pop     di
+    pop     cx
+    pop     bx
+    pop     ax
+    
+    jmp     .L5
+
+.L97:
+
+    pop     es
+    pop     di
+    pop     cx
+    pop     bx
+    pop     ax
+
+.L98:
+
     mov     bx,     offset _err_invalid
     call    _writestr
     
@@ -1543,6 +1616,60 @@ _main:
     
     jmp     .L11
 
+;******************************************************************************
+; @function         _concat_exec
+;******************************************************************************
+_concat_exec:
+
+    push    bp
+    mov     bp,     sp
+    
+    push    ax
+    push    bx
+    push    cx
+    push    dx
+    push    si
+    push    di
+    push    es
+    
+    mov     ax,     ds
+    mov     es,     ax
+    
+    mov     di,     offset _full_path
+    
+    mov     si,     word ptr [bp + 4]
+    call    _format_path
+    
+    mov     al,     '\\'
+    stosb
+    
+    mov     si,     word ptr [bp + 6]
+    call    _format_path
+    
+    mov     dx,     offset _full_path
+    inc     bx
+    mov     di,     bx
+    
+    mov     bx,     offset _param_blk
+    
+    mov     word ptr [bx + 2],      di
+    mov     word ptr [bx + 4],      ds
+    
+    mov     ax,     HEX (4B00)
+    int     HEX (21)
+
+_concat_exec.done:
+
+    pop     es
+    pop     di
+    pop     si
+    pop     dx
+    pop     cx
+    pop     bx
+    pop     ax
+    pop     bp
+    ret
+
 ;******************************************************************************
 ; @function         _get_env
 ;******************************************************************************
@@ -2241,9 +2368,11 @@ _scratch:                       db      257     dup (0)
 ;; Variables for executing application.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;_formatted_cmd:                 db      255     dup (0)
-_app_path:                      db      255     dup (0)
+_app_path:                      db      256     dup (0)
 _param_blk:                     db      16      dup (0)
 
+_full_path:                     db      256     dup (0)
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Error messages.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2268,6 +2397,9 @@ _vec_history:                   db      6       dup (0)
 global      _vec_env
 _vec_env:                       db      6       dup (0)
 
+global      _vec_paths
+_vec_paths:                     db      6       dup (0)
+
 global      _curr_row
 _curr_row:                      db      HEX (00)
 
index ff64a392128af2260d47cdddd15826c26b650b2d..95049eca422586747d69af7c59056a95bc15a51b 100644 (file)
@@ -354,7 +354,6 @@ _handler_set.done:
 ;******************************************************************************
 ; @function         _skip_whitespace
 ;******************************************************************************
-global      _skip_whitespace
 _skip_whitespace:
 
     cmp     byte ptr [bx],      0