Implemented int 21h/AH=01
authorRobert Pengelly <robertapengelly@hotmail.com>
Mon, 12 Aug 2024 04:46:10 +0000 (05:46 +0100)
committerRobert Pengelly <robertapengelly@hotmail.com>
Mon, 12 Aug 2024 04:46:10 +0000 (05:46 +0100)
build/chimaera.img
build/chimaera.vhd
src/apps/hello/hello.asm
src/kernel/int21.asm

index 1a20b316af9aa033ee77c59245a1204993a22ae1..a28c5360de2a52173e1910e83c15486619a68741 100644 (file)
Binary files a/build/chimaera.img and b/build/chimaera.img differ
index 3868ac93db139f313cd27c6f5df927a8404a7437..2321841972c112fd147baee467c70c6f5ed7fbc9 100644 (file)
Binary files a/build/chimaera.vhd and b/build/chimaera.vhd differ
index 5f26689047ca288e8ece0e90e1ebe1431ac61ba8..6180d5f5244507156989d993d7697b64b4fb775c 100644 (file)
@@ -18,7 +18,14 @@ _main:
 
     mov     bx,     offset _msg_hello
     call    _writestr
-    
+
+;.console_loop:
+;
+;    mov     ah,     HEX (01)
+;    int     HEX (21)
+;    
+;    jmp     .console_loop
+;    
 ;    mov     ax,     offset _flags
 ;    push    ax
 ;    
index eb28c8f4ea70ae9217d41742d8ea4779eb85eb2d..257d2b7ffe84321ff072ee34ec8d5a34847d49a9 100644 (file)
@@ -750,6 +750,12 @@ _int21_dispatch.list:
     db      HEX (00)
     dw      _int21_00
     
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    ;; Console Input With Echo.
+    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+    db      HEX (01)
+    dw      _int21_01
+    
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ;; Display Output.
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -970,6 +976,102 @@ _int21_00:
     xor     al,     al
     jmp     _int21_4C
 
+;******************************************************************************
+; @function         _int21_01
+; @brief            Console Input With Echo
+;******************************************************************************
+_int21_01:
+
+    mov     al,     cs:[_int21_01.scan]
+    
+    and     al,     al
+    jz      _int21_01.wait
+    
+    mov     byte ptr cs:[_int21_01.scan],    0
+    jmp     _int21_01.output
+
+_int21_01.wait:
+
+    xor     ah,     ah
+    int     HEX (16)
+    
+    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:
+
+    mov     cs:[_int21_01.scan],     ah
+    
+    and     al,     al
+    jz      _int21_01.output
+    
+    mov     byte ptr cs:[_int21_01.scan],    0
+
+_int21_01.output:
+
+    cmp     al,     HEX (09)
+    jne     _int21_01.no_tab
+    
+    push    ax
+    push    bx
+    push    cx
+    push    dx
+    
+    mov     ah,     HEX (03)
+    xor     bh,     bh
+    int     HEX (10)
+    
+    xor     ah,     ah
+    mov     al,     dl
+    xor     dx,     dx
+    
+    mov     cx,     4
+    div     cx
+    
+    mov     cx,     4
+    sub     cx,     dx
+
+_int21_01.tab_loop:
+
+    mov     al,     ' '
+    call    _writechr
+    
+    loop    _int21_01.tab_loop
+
+_int21_01.tab_done:
+
+    pop     dx
+    pop     cx
+    pop     bx
+    pop     ax
+    
+    jmp     _int21_01.done
+
+_int21_01.no_tab:
+
+    call    _writechr
+
+_int21_01.done:
+
+    mov     ah,     HEX (01)
+    iret
+
+_int21_01.scan:                  db      HEX (00)
+
 ;******************************************************************************
 ; @function         _int21_02
 ; @brief            Display Ouput