mov word ptr cs:[_cbreak], 1
+ cmp ah, HEX (08)
+ jne _cbreak_handler.done
+
+ push ax
+ push si
+ push dx
+
+ 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:
+
+ mov word ptr cs:[_need_ext], 0
+ mov word ptr cs:[_cbreak], 0
+
+ mov cl, cs:[_scratch_size]
+ xor ch, ch
+
+ mov ax, cs:[_vec_history + 4]
+ mov cs:[_history_idx], ax
+
+ mov di, offset _scratch
+ xor al, al
+
+ push di
+ push cx
+ rep stosb
+
+ mov cs:[_scratch_len], al
+ pop cx
+ pop di
+
+ call _prompt
+ pop dx
+ pop si
+ pop ax
+
+_cbreak_handler.done:
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Clear the carry flag and return.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.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
;******************************************************************************
; @function _prompt
;******************************************************************************
+global _prompt
_prompt:
push ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; int21/ah=0A variables.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+global _scratch_size
_scratch_size: db 255
+
+global _scratch_len
_scratch_len: db 0
global _scratch
_fn_wild: db "*.*", HEX (00)
_temp: db 257 dup (0)
-_need_ext: dw HEX (0000)
_dta_addr: dw HEX (0000)
-
_insert: dw HEX (0000)
+global _need_ext
+_need_ext: dw HEX (0000)
+
global _vec_history
_vec_history: db 6 dup (0)
_read_file.clear_and_read:
+ cmp word ptr cs:[_cbreak], 1
+ je _read_file.close
+
mov ah, HEX (3F)
mov cx, 255
mov dx, offset _buffer
and ax, ax
jz _read_file.close
+ cmp word ptr cs:[_cbreak], 1
+ je _read_file.close
+
mov si, dx
mov cx, ax
_read_file.print_loop:
- cmp word ptr cs:[_cbreak], 1
- je _read_file.close
-
lodsb
cmp al, HEX (0A)
pop ax
ret
+;******************************************************************************
+; @function _check_for_break
+;******************************************************************************
+_check_for_break:
+
+ push ax
+
+ mov ah, HEX (01)
+ int HEX (16)
+ jz _check_for_break.no_break
+
+ xor ah, ah
+ int HEX (16)
+
+ cmp ax, HEX (2E03)
+ jne _check_for_break.no_break
+
+ stc
+ jmp _check_for_break.done
+
+_check_for_break.no_break:
+
+ clc
+
+_check_for_break.done:
+
+ pop ax
+ ret
+
;******************************************************************************
; @function _int21_dispatch
;******************************************************************************
mov cs:[_user_ax], ax
mov cs:[_user_bp], bp
- cmp ah, HEX (01)
- jb _int21_dispatch.no_key
+ cmp ah, HEX (08)
+ je _int21_dispatch.no_check
+
+_int21_dispatch.check:
+
+ cmp word ptr cs:[_cbreak], 1
+ jne _int21_dispatch.check_key
- cmp ah, HEX (05)
- jbe _int21_dispatch.check
+ mov al, '^'
+ call _writechr
- cmp ah, HEX (08)
- jb _int21_dispatch.no_key
+ mov al, 'C'
+ call _writechr
+
+ mov al, HEX (0D)
+ call _writechr
+
+ mov al, HEX (0A)
+ call _writechr
+
+ mov word ptr cs:[_cbreak], 0
- cmp ah, HEX (0B)
- ja _int21_dispatch.no_key
+ mov ax, cs:[_user_ax]
+ iret
-_int21_dispatch.check:
+_int21_dispatch.no_check:
- push ax
- mov ah, HEX (01)
- int HEX (16)
- pop ax
- jz _int21_dispatch.no_key
+ mov word ptr cs:[_cbreak], 0
+
+_int21_dispatch.check_key:
+
+ call _check_for_break
+ jnc _int21_dispatch.no_key
- push ax
- xor ah, ah
- int HEX (16)
- cmp ax, HEX (2E03)
- pop ax
- jne _int21_dispatch.no_key
+ cmp ah, HEX (08)
+ jne _int21_dispatch.spawn
mov al, '^'
call _writechr
mov al, 'C'
call _writechr
+ mov al, HEX (0D)
+ call _writechr
+
+ mov al, HEX (0A)
+ call _writechr
+
+_int21_dispatch.spawn:
+
jmp _spawn_int23
_int21_dispatch.no_key:
cmp ax, HEX (2E03)
jne _int21_01.char_ok
- mov al, '^'
- call _writechr
-
- mov al, 'C'
- call _writechr
-
- mov al, HEX (0D)
- call _writechr
-
- mov al, HEX (0A)
- call _writechr
-
jmp _spawn_int23
_int21_01.char_ok:
push ax
- call _check_handle_break
- jnc _int21_02.write
-
- mov al, '^'
- call _writechr
-
- mov al, 'C'
- call _writechr
-
- mov al, HEX (0D)
- call _writechr
-
- mov al, HEX (0A)
- call _writechr
+ call _check_for_break
+ jnc _int21_02.print
pop ax
jmp _spawn_int23
-_int21_02.write:
+_int21_02.print:
mov al, dl
call _writechr
_int21_09.loop:
- call _check_handle_break
- jnc _int21_09.print
-
- mov al, '^'
- call _writechr
-
- mov al, 'C'
- call _writechr
-
- mov al, HEX (0D)
- call _writechr
-
- mov al, HEX (0A)
- call _writechr
-
- pop si
- pop ax
- jmp _spawn_int23
-
-_int21_09.print:
-
lodsb
cmp al, '$'
mov di, dx
mov byte ptr [di + 1], 0
- mov al, '^'
- call _writechr
-
- mov al, 'C'
- call _writechr
-
- mov al, HEX (0D)
- call _writechr
-
- mov al, HEX (0A)
- call _writechr
-
pop ds
pop es
pop di
_int23_ign_carry:
+ mov word ptr cs:[_cbreak], 1
+
pop ax
+ pop bp
jnc _int23_respawn
xor ah, ah
- pop bp
-
- jmp _int21_dispatch
+ mov word ptr cs:[_cbreak], 0
_int23_respawn:
- mov bp, sp
- or byte ptr [bp + 6], 1 ; set carry
-
- pop bp
- iret
+ jmp _int21_dispatch
;******************************************************************************
; @function _int23_handler
mov word ptr [bp + 5], cs
xchg word ptr [bp - 4], bp
+ clc
retf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
global _user_bp
_user_bp: dw HEX (0000)
+
+global _cbreak
+_cbreak: dw HEX (0000)