global _cbreak_handler
_cbreak_handler:
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Preserve registers.
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- push es
- push ax
- push bx
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Reset our history index (bp should be unchanged).
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- mov ax, cs:[_vec_history + 4]
- mov cs:[_history_idx], ax
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Free the current command history if there is one.
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- mov ax, cs:[_curr_scratch]
-
- and ax, ax
- jz .L1
-
- push ax
-
- call _free
- add sp, 2
-
- xor ax, ax
- mov cs:[_curr_scratch], ax
-
-.L1:
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Reset the console to the prompt state.
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- call _prompt
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Restore registers.
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- pop bx
- pop ax
- pop es
+ mov word ptr cs:[_cbreak], 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Clear the carry flag and return.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
clc
retf 2
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Data area.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+global _cbreak
+_cbreak: dw HEX (0000)
.L5:
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Free the current command history if there is one.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ mov ax, cs:[_curr_scratch]
+
+ and ax, ax
+ jz .L82
+
+ push ax
+
+ call _free
+ add sp, 2
+
+ xor ax, ax
+ mov cs:[_curr_scratch], ax
+
+.L82:
+
mov ah, HEX (19)
int HEX (21)
.L7:
mov word ptr cs:[_need_ext], 0
- call _prompt
+ mov word ptr cs:[_cbreak], 0
mov cl, cs:[_scratch_size]
xor ch, ch
mov cs:[_history_idx], ax
mov di, offset _scratch
+ xor al, al
push di
push cx
-
- xor al, al
rep stosb
+ mov cs:[_scratch_len], al
pop cx
pop di
+
+ call _prompt
.L11:
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Clear the carry flag.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ clc
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Try to get a key press.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ah, HEX (08)
int HEX (21)
+ jc .L5
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; If AL is zero then we have an extended key press.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
and al, al
jnz .L10
.L10:
+ push ax
+
+ mov ax, cs:[_vec_history + 4]
+ mov cs:[_history_idx], ax
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Free the current command history if there is one.
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ mov ax, cs:[_curr_scratch]
+
+ and ax, ax
+ jz .L83
+
+ push ax
+
+ call _free
+ add sp, 2
+
+ xor ax, ax
+ mov cs:[_curr_scratch], ax
+
+.L83:
+
+ pop ax
+
cmp al, HEX (09)
jne .L14
;******************************************************************************
_handler_echo:
- call _writestr
- call _crlf
+ push ax
+ push dx
+ push si
+
+ mov si, bx
+
+_handler_echo.check:
+
+ cmp word ptr cs:[_cbreak], 1
+ je _handler_echo.done
+
+ lodsb
+
+ and al, al
+ jz _handler_echo.newline
+
+ mov ah, HEX (02)
+ mov dl, al
+ int HEX (21)
+ jmp _handler_echo.check
+
+_handler_echo.newline:
+
+ mov ah, HEX (02)
+ mov dl, HEX (0D)
+ int HEX (21)
+
+ mov ah, HEX (02)
+ mov dl, HEX (0A)
+ int HEX (21)
+
+_handler_echo.done:
+
+ pop si
+ pop dx
+ pop ax
ret
;******************************************************************************
;******************************************************************************
; @function _prompt
;******************************************************************************
-global _prompt
_prompt:
push ax
push bx
+ push cx
push dx
- push si
- push es
push ds
mov ax, cs
mov ds, ax
- mov es, ax
.L17:
- mov di, offset _scratch
- xor al, al
-
- mov cl, cs:[_scratch_size]
- xor ch, ch
-
- push cx
- push di
- rep stosb
-
- xor al, al
- mov cs:[_scratch_len], al
-
- mov al, cs:[_curr_drive]
- add al, 'A'
+ mov dl, cs:[_curr_drive]
+ add dl, 'A'
mov ah, HEX (02)
- mov dl, al
int HEX (21)
mov ah, HEX (02)
.L18:
- pop di
- pop cx
-
pop ds
- pop es
- pop si
pop dx
+ pop cx
pop bx
pop ax
ret