source: xtideuniversalbios/trunk/Assembly_Library/Src/Keyboard/Keyboard.asm @ 602

Last change on this file since 602 was 602, checked in by krille_n_, 5 years ago

Changes:

  • SerDrive: Fixed a bug that prevented use of 3.5" 720 KB floppy disk images.
  • Also added support for Microsoft DMF (Distribution Media Format) floppy disk images.
  • XTIDECFG / Library: Minor size optimizations. Added a new macro (SKIP1B) as part of that.
  • BIOS: A small size optimization (2 bytes) to MODULE_8BIT_IDE_ADVANCED that is enabled only when USE_NEC_V is defined.
File size: 9.3 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Functions for managing keyboard.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20
21BUFFER_SIZE_FOR_WORD_INPUT      EQU     6   ; 5 chars + NULL
22
23; Section containing code
24SECTION .text
25
26;--------------------------------------------------------------------
27; Reads user inputted word.
28; Function returns when ENTER or ESC will be pressed.
29;
30; Keyboard_ReadUserInputtedWordWhilePrinting
31;   Parameters
32;       BX:     Numeric base (10 or 16)
33;   Returns:
34;       AX:     User inputted word
35;       ZF:     Set if user cancellation
36;   Corrupts registers:
37;       DX
38;--------------------------------------------------------------------
39%ifndef EXCLUDE_FROM_XUB OR EXCLUDE_FROM_BIOSDRVS
40ALIGN KEYBOARD_JUMP_ALIGN
41Keyboard_ReadUserInputtedWordWhilePrinting:
42    push    ds
43    push    si
44    push    cx
45
46    mov     cl, BUFFER_SIZE_FOR_WORD_INPUT
47    call    Memory_ReserveCLbytesFromStackToDSSI
48
49    call    Char_GetFilterFunctionToDXforNumericBaseInBX
50    call    Registers_ExchangeDSSIwithESDI
51    call    Keyboard_ReadUserInputtedStringToESDIWhilePrinting
52    call    Registers_ExchangeDSSIwithESDI  ; Does not modify FLAGS
53    jz      SHORT .CancelledByUser
54
55    call    String_ConvertWordToAXfromStringInDSSIwithBaseInBX
56.CancelledByUser:
57    add     sp, BYTE BUFFER_SIZE_FOR_WORD_INPUT
58    test    cx, cx                          ; Set ZF if string length is zero
59    pop     cx
60    pop     si
61    pop     ds
62    ret
63%endif
64
65
66;--------------------------------------------------------------------
67; Reads user inputted string to buffer. Character filter is
68; supported to ignore unwanted characters.
69; Function returns when ENTER or ESC will be pressed.
70;
71; Keyboard_ReadUserInputtedStringToESDIWhilePrinting
72;   Parameters:
73;       CX:     Buffer size (with NULL)
74;       ES:DI:  Ptr to destination buffer
75;       CS:DX:  Ptr to character filter function:
76;                   Parameters:
77;                       AL:     Character inputted by user
78;                   Returns:
79;                       CF:     Set if character is accepted
80;                               Cleared if character is rejected
81;                   Corrupts registers:
82;                       Nothing
83;   Returns:
84;       CX:     String length in characters (without NULL)
85;       ZF:     Set if user cancellation
86;   Corrupts registers:
87;       AX
88;--------------------------------------------------------------------
89%ifndef EXCLUDE_FROM_XUB OR EXCLUDE_FROM_BIOSDRVS
90ALIGN KEYBOARD_JUMP_ALIGN
91Keyboard_ReadUserInputtedStringToESDIWhilePrinting:
92    push    di
93    push    si
94    push    bx
95    call    .PrepareDisplayContextForKeyboardInput
96    jcxz    .ReturnAfterUpdatingZF
97
98    xor     bx, bx                              ; Zero character counter
99    dec     cx                                  ; Decrement buffer size for NULL
100%ifdef CLD_NEEDED
101    cld
102%endif
103ALIGN KEYBOARD_JUMP_ALIGN
104.GetCharacterFromUser:
105    call    Keyboard_GetKeystrokeToAXandWaitIfNecessary ; Get ASCII to AL
106    call    .ProcessControlCharacter
107    jz      SHORT .TerminateStringWithNULL
108    jc      SHORT .PlayBellForRejectedCharacter
109    call    dx                                  ; Filter character
110    jnc     SHORT .PlayBellForRejectedCharacter
111    inc     bx                                  ; Increment number of characters stored
112    stosb                                       ; Store from AL to ES:DI
113    call    Keyboard_PrintInputtedCharacter
114    loop    .GetCharacterFromUser
115.PlayBellForRejectedCharacter:
116    cmp     al, BS                              ; No bell for backspace
117    je      SHORT .GetCharacterFromUser
118    call    Keyboard_PlayBellForUnwantedKeystroke
119    jmp     SHORT .GetCharacterFromUser
120
121.TerminateStringWithNULL:
122    stosb                                       ; Terminate string with NULL
123    mov     cx, bx                              ; String length now in CX
124
125.ReturnAfterUpdatingZF:
126    CALL_DISPLAY_LIBRARY PopDisplayContext
127    test    cx, cx                              ; Clear or set ZF
128    pop     bx
129    pop     si
130    pop     di
131    ret
132
133;--------------------------------------------------------------------
134; .PrepareDisplayContextForKeyboardInput
135;   Parameters:
136;       Nothing
137;   Returns:
138;       Nothing (Display context pushed to stack)
139;   Corrupts registers:
140;       AX, BX, SI
141;--------------------------------------------------------------------
142ALIGN KEYBOARD_JUMP_ALIGN
143.PrepareDisplayContextForKeyboardInput:
144    pop     bx                  ; Pop return address to BX
145    mov     si, di
146
147    CALL_DISPLAY_LIBRARY PushDisplayContext
148    call    DisplayCursor_GetDefaultCursorShapeToAX
149    CALL_DISPLAY_LIBRARY SetCursorShapeFromAX
150    CALL_DISPLAY_LIBRARY SynchronizeDisplayContextToHardware
151
152    mov     di, si
153    jmp     bx
154
155
156;--------------------------------------------------------------------
157; .ProcessControlCharacter
158;   Parameters:
159;       AL:     Character inputted by user
160;       CX:     Number of bytes left in buffer
161;       BX:     Total number of characters inputted
162;       ES:DI:  Ptr where to store next character
163;   Returns:
164;       AL:     Character inputted by user or NULL if end of input
165;       BX:     Cleared if user cancellation
166;       ZF:     Set if user has ended or cancelled key input
167;       CF:     Set if character is rejected
168;   Corrupts registers:
169;       AH
170;--------------------------------------------------------------------
171ALIGN KEYBOARD_JUMP_ALIGN
172.ProcessControlCharacter:
173    cmp     al, CR                              ; ENTER to terminate string?
174    je      SHORT .EndCharacterInput
175    cmp     al, ESC                             ; Cancel input?
176    je      SHORT .CancelCharacterInput
177    cmp     al, BS                              ; Backspace?
178    je      SHORT .Backspace
179    jcxz    .RejectCharacter
180    clc                                         ; Clear CF (ZF is already cleared)
181    ret
182
183.Backspace:
184    test    bx, bx                              ; At the beginning?
185    jz      SHORT .RejectCharacter
186    inc     cx                                  ; Increment bytes left
187    dec     bx                                  ; Decrement characters inputted
188    dec     di
189    call    Keyboard_PrintBackspace
190    mov     al, BS                              ; Restore character
191.RejectCharacter:
192    test    al, al                              ; Clear ZF...
193    stc                                         ; ...and set CF
194    ret
195
196.CancelCharacterInput:
197    xor     bx, bx
198.EndCharacterInput:
199    xor     al, al                              ; Set ZF and clear CF
200    ret
201%endif ; EXCLUDE_FROM_XUB OR EXCLUDE_FROM_BIOSDRVS
202
203
204;--------------------------------------------------------------------
205; Keyboard_PrintBackspace
206;   Parameters:
207;       Nothing
208;   Returns:
209;       Nothing
210;   Corrupts registers:
211;       AX
212;--------------------------------------------------------------------
213%ifndef EXCLUDE_FROM_XUB OR EXCLUDE_FROM_BIOSDRVS
214ALIGN KEYBOARD_JUMP_ALIGN
215Keyboard_PrintBackspace:
216    mov     al, BS
217    call    Keyboard_PrintInputtedCharacter
218    mov     al, ' '
219    call    Keyboard_PrintInputtedCharacter
220    mov     al, BS
221    jmp     SHORT Keyboard_PrintInputtedCharacter
222%endif
223
224
225;--------------------------------------------------------------------
226; Keyboard_PlayBellForUnwantedKeystroke
227;   Parameters:
228;       Nothing
229;   Returns:
230;       Nothing
231;   Corrupts registers:
232;       AX
233;--------------------------------------------------------------------
234%ifndef EXCLUDE_FROM_XUB OR EXCLUDE_FROM_BIOSDRVS
235ALIGN KEYBOARD_JUMP_ALIGN
236Keyboard_PlayBellForUnwantedKeystroke:
237    mov     al, BELL
238    ; Fall to Keyboard_PrintInputtedCharacter
239%endif
240
241;--------------------------------------------------------------------
242; Keyboard_PrintInputtedCharacter
243;   Parameters:
244;       AL:     Character inputted by user
245;   Returns:
246;       Nothing
247;   Corrupts registers:
248;       AX
249;--------------------------------------------------------------------
250%ifndef EXCLUDE_FROM_XUB OR EXCLUDE_FROM_BIOSDRVS
251ALIGN KEYBOARD_JUMP_ALIGN
252Keyboard_PrintInputtedCharacter:
253    push    di
254    CALL_DISPLAY_LIBRARY PrintCharacterFromAL
255    CALL_DISPLAY_LIBRARY SynchronizeDisplayContextToHardware    ; Hardware cursor
256    pop     di
257    ret
258%endif
259
260
261;--------------------------------------------------------------------
262; Keyboard_RemoveAllKeystrokesFromBuffer
263;   Parameters:
264;       Nothing
265;   Returns:
266;       Nothing
267;   Corrupts registers:
268;       AX
269;--------------------------------------------------------------------
270%ifndef EXCLUDE_FROM_XUB OR EXCLUDE_FROM_BIOSDRVS               ; Only used when debugging
271ALIGN KEYBOARD_JUMP_ALIGN
272Keyboard_RemoveAllKeystrokesFromBuffer:
273    call    Keyboard_GetKeystrokeToAX
274    jnz     SHORT Keyboard_RemoveAllKeystrokesFromBuffer
275    ret
276%endif
277
278
279;--------------------------------------------------------------------
280; Keyboard_GetKeystrokeToAX
281; Keyboard_GetKeystrokeToAXandLeaveItToBuffer
282; Keyboard_GetKeystrokeToAXandWaitIfNecessary
283;   Parameters:
284;       Nothing
285;   Returns:
286;       AL:     ASCII character (if keystroke available)
287;       AH:     BIOS scan code (if keystroke available)
288;       ZF:     Set if no keystroke available
289;               Cleared if keystroke available
290;   Corrupts registers:
291;       Nothing
292;--------------------------------------------------------------------
293%ifdef EXCLUDE_FROM_XUB
294    %define EXCLUDE
295    %ifdef MODULE_HOTKEYS OR MODULE_BOOT_MENU
296        %undef EXCLUDE
297    %endif
298%endif
299
300%ifndef EXCLUDE
301ALIGN KEYBOARD_JUMP_ALIGN
302Keyboard_GetKeystrokeToAXandLeaveItToBuffer:
303    mov     ah, CHECK_FOR_KEYSTROKE
304    int     BIOS_KEYBOARD_INTERRUPT_16h
305    ret
306
307ALIGN KEYBOARD_JUMP_ALIGN
308Keyboard_GetKeystrokeToAX:
309    call    Keyboard_GetKeystrokeToAXandLeaveItToBuffer
310    jz      SHORT Keyboard_GetKeystrokeToAXReturn
311    ; Fall to Keyboard_GetKeystrokeToAXandWaitIfNecessary
312ALIGN KEYBOARD_JUMP_ALIGN
313Keyboard_GetKeystrokeToAXandWaitIfNecessary:
314    xor     ah, ah                      ; GET_KEYSTROKE
315    int     BIOS_KEYBOARD_INTERRUPT_16h
316    test    ax, ax                      ; Clear ZF
317Keyboard_GetKeystrokeToAXReturn:
318    ret
319
320%endif
321%undef EXCLUDE
Note: See TracBrowser for help on using the repository browser.