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
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
--- /dev/null
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; @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)
.L7:
+ mov word ptr cs:[_need_ext], 0
call _prompt
mov cl, cs:[_scratch_size]
mov cx, ax
rep movsb
+ mov word ptr cs:[_need_ext], 1
add bx, ax
mov al, '.'
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:
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
;******************************************************************************
_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)
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)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
_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:
_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)