From 4da68909513bfa5ad968bc04fad11aff2b902371 Mon Sep 17 00:00:00 2001 From: Robert Pengelly Date: Sat, 21 Sep 2024 19:20:52 +0100 Subject: [PATCH] More Ctrl+C improvements --- build/chimaera.img | Bin 368640 -> 368640 bytes build/chimaera.vhd | Bin 34120704 -> 34120704 bytes src/apps/pcomm/cbreak.asm | 49 +++++++++++++ src/apps/pcomm/pcomm.asm | 21 ++---- src/apps/pcomm/type.asm | 9 ++- src/kernel/int21.asm | 150 ++++++++++++++++++-------------------- src/kernel/int23.asm | 17 +++-- 7 files changed, 141 insertions(+), 105 deletions(-) diff --git a/build/chimaera.img b/build/chimaera.img index 2adf2a53172857dae64074002e0be338b6bf81fa..b454e691b6c56b2b2329df038a39fed0042ddd45 100644 GIT binary patch delta 7728 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 diff --git a/build/chimaera.vhd b/build/chimaera.vhd index 64344d5e9e1ab011f0819e24721fc50f360fa524..3e022c8c767d32c53e7fca8c0f774b59d3cf15c2 100644 GIT binary patch delta 10397 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 delta 10376 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 diff --git a/src/apps/pcomm/cbreak.asm b/src/apps/pcomm/cbreak.asm index c0e901c..cf6bd5d 100644 --- a/src/apps/pcomm/cbreak.asm +++ b/src/apps/pcomm/cbreak.asm @@ -13,6 +13,55 @@ _cbreak_handler: 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. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/src/apps/pcomm/pcomm.asm b/src/apps/pcomm/pcomm.asm index c24c1a1..e14ce4d 100644 --- a/src/apps/pcomm/pcomm.asm +++ b/src/apps/pcomm/pcomm.asm @@ -77,21 +77,9 @@ _main: .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 @@ -1905,6 +1893,7 @@ _handler_reboot: ;****************************************************************************** ; @function _prompt ;****************************************************************************** +global _prompt _prompt: push ax @@ -1977,7 +1966,10 @@ _prompt: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; int21/ah=0A variables. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +global _scratch_size _scratch_size: db 255 + +global _scratch_len _scratch_len: db 0 global _scratch @@ -2001,11 +1993,12 @@ _err_invalid: db "Bad command or file name - ", HEX _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) diff --git a/src/apps/pcomm/type.asm b/src/apps/pcomm/type.asm index c6bf67d..2abcbec 100644 --- a/src/apps/pcomm/type.asm +++ b/src/apps/pcomm/type.asm @@ -461,6 +461,9 @@ _read_file.file_open: _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 @@ -470,14 +473,14 @@ _read_file.clear_and_read: 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) diff --git a/src/kernel/int21.asm b/src/kernel/int21.asm index f73c893..4a9903d 100644 --- a/src/kernel/int21.asm +++ b/src/kernel/int21.asm @@ -597,6 +597,35 @@ _probe_disk.done: 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 ;****************************************************************************** @@ -609,32 +638,42 @@ _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 @@ -642,6 +681,14 @@ _int21_dispatch.check: 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: @@ -1002,18 +1049,6 @@ _int21_01.wait: 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: @@ -1086,25 +1121,13 @@ _int21_02: 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 @@ -1210,27 +1233,6 @@ _int21_09: _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, '$' @@ -1319,18 +1321,6 @@ _int21_0A.get_chars: 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 diff --git a/src/kernel/int23.asm b/src/kernel/int23.asm index 35b3fd0..3670df9 100644 --- a/src/kernel/int23.asm +++ b/src/kernel/int23.asm @@ -70,21 +70,18 @@ _regain_control_int23: _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 @@ -125,6 +122,7 @@ _spawn_int23: mov word ptr [bp + 5], cs xchg word ptr [bp - 4], bp + clc retf ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -141,3 +139,6 @@ _user_ax: dw HEX (0000) global _user_bp _user_bp: dw HEX (0000) + +global _cbreak +_cbreak: dw HEX (0000) -- 2.34.1