From: Robert Pengelly Date: Fri, 20 Sep 2024 18:25:42 +0000 (+0100) Subject: Better Ctrl+C handling X-Git-Url: https://git.candlhat.org/?a=commitdiff_plain;h=66bd2050fe1c851765622d8291ff8d0188ffc295;p=chimaera.git Better Ctrl+C handling --- diff --git a/build/chimaera.img b/build/chimaera.img index 3a86dda..2adf2a5 100644 Binary files a/build/chimaera.img and b/build/chimaera.img differ diff --git a/build/chimaera.vhd b/build/chimaera.vhd index 9aadad5..64344d5 100644 Binary files a/build/chimaera.vhd and b/build/chimaera.vhd differ diff --git a/src/apps/pcomm/cbreak.asm b/src/apps/pcomm/cbreak.asm index 6ead948..c0e901c 100644 --- a/src/apps/pcomm/cbreak.asm +++ b/src/apps/pcomm/cbreak.asm @@ -11,51 +11,16 @@ 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) diff --git a/src/apps/pcomm/pcomm.asm b/src/apps/pcomm/pcomm.asm index c32bb43..c24c1a1 100644 --- a/src/apps/pcomm/pcomm.asm +++ b/src/apps/pcomm/pcomm.asm @@ -20,6 +20,24 @@ _main: .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) @@ -36,7 +54,7 @@ _main: .L7: mov word ptr cs:[_need_ext], 0 - call _prompt + mov word ptr cs:[_cbreak], 0 mov cl, cs:[_scratch_size] xor ch, ch @@ -45,21 +63,35 @@ _main: 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 @@ -124,6 +156,31 @@ _main: .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 @@ -1732,9 +1789,43 @@ _handler_cls: ;****************************************************************************** _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 ;****************************************************************************** @@ -1814,40 +1905,23 @@ _handler_reboot: ;****************************************************************************** ; @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) @@ -1888,13 +1962,9 @@ _prompt: .L18: - pop di - pop cx - pop ds - pop es - pop si pop dx + pop cx pop bx pop ax ret diff --git a/src/apps/pcomm/type.asm b/src/apps/pcomm/type.asm index 95c126a..c6bf67d 100644 --- a/src/apps/pcomm/type.asm +++ b/src/apps/pcomm/type.asm @@ -475,18 +475,17 @@ _read_file.clear_and_read: _read_file.print_loop: + cmp word ptr cs:[_cbreak], 1 + je _read_file.close + lodsb cmp al, HEX (0A) jne _read_file.char_ok - push ax - mov ah, HEX (02) mov dl, HEX (0D) int HEX (21) - - pop ax _read_file.char_ok: diff --git a/src/kernel/int23.asm b/src/kernel/int23.asm index 5f1074e..35b3fd0 100644 --- a/src/kernel/int23.asm +++ b/src/kernel/int23.asm @@ -15,9 +15,9 @@ _check_handle_break: push bx push ax - xor bx, bx + mov bx, HEX (40) mov es, bx - mov bx, HEX (0471) + mov bx, HEX (71) mov al, es:[bx] @@ -71,14 +71,20 @@ _regain_control_int23: _int23_ign_carry: pop ax - pop bp - jnc _int23_respawn + xor ah, ah + pop bp + + jmp _int21_dispatch _int23_respawn: - jmp _int21_dispatch + mov bp, sp + or byte ptr [bp + 6], 1 ; set carry + + pop bp + iret ;****************************************************************************** ; @function _int23_handler @@ -119,8 +125,6 @@ _spawn_int23: mov word ptr [bp + 5], cs xchg word ptr [bp - 4], bp - clc - retf ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;