Better Ctrl+C handling
authorRobert Pengelly <robertapengelly@hotmail.com>
Fri, 20 Sep 2024 18:25:42 +0000 (19:25 +0100)
committerRobert Pengelly <robertapengelly@hotmail.com>
Fri, 20 Sep 2024 18:25:42 +0000 (19:25 +0100)
build/chimaera.img
build/chimaera.vhd
src/apps/pcomm/cbreak.asm
src/apps/pcomm/pcomm.asm
src/apps/pcomm/type.asm
src/kernel/int23.asm

index 3a86ddacd4e7672947429944b112c67088e2b842..2adf2a53172857dae64074002e0be338b6bf81fa 100644 (file)
Binary files a/build/chimaera.img and b/build/chimaera.img differ
index 9aadad5a7c60cb7c9ed9280b650f20440dae25b7..64344d5e9e1ab011f0819e24721fc50f360fa524 100644 (file)
Binary files a/build/chimaera.vhd and b/build/chimaera.vhd differ
index 6ead9483c847c92ffea422ac45ce8a00640f70fb..c0e901c67a88d58132f1a031b26bbeed459fe095 100644 (file)
 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)
index c32bb431c6b7dce53d1ccba89679dc1aee94d6f8..c24c1a1b1290a35069b1d1b79a546e60d59cf77a 100644 (file)
@@ -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
index 95c126a531a7cedaf556225615fab7f440838312..c6bf67d0981b74f9ddae2f0bd62e425a1f2ba53d 100644 (file)
@@ -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:
 
index 5f1074ed91f590abb7cf29fddd2dcd8af22fc5d9..35b3fd00e58cf1e72059e2ae17835d0456c929e1 100644 (file)
@@ -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
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;