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

Last change on this file since 54 was 54, checked in by aitotat, 14 years ago

Changes to Assembly Library:
Drive selection moved to own dialog from File Dialog.
File Dialog now displays loading text for better usability in slow systems.
Moved some functions from Memory.asm to new Registers.asm.

File size: 7.9 KB
Line 
1; File name     :   Keyboard.asm
2; Project name  :   Assembly Library
3; Created date  :   5.7.2010
4; Last update   :   24.10.2010
5; Author        :   Tomi Tilli
6; Description   :   Functions for managing keyboard.
7
8BUFFER_SIZE_FOR_WORD_INPUT      EQU     6   ; 5 chars + NULL
9
10; Section containing code
11SECTION .text
12
13;--------------------------------------------------------------------
14; Reads user inputted word.
15; Function returns when ENTER or ESC will be pressed.
16; 
17; Keyboard_ReadUserInputtedWordWhilePrinting
18;   Parameters
19;       BX:     Numeric base (10 or 16)
20;   Returns:
21;       AX:     User inputted word
22;       ZF:     Set if user cancellation
23;   Corrupts registers:
24;       DX
25;--------------------------------------------------------------------
26ALIGN JUMP_ALIGN
27Keyboard_ReadUserInputtedWordWhilePrinting:
28    push    ds
29    push    si
30    push    cx
31
32    mov     cx, BUFFER_SIZE_FOR_WORD_INPUT
33    call    Memory_ReserveCXbytesFromStackToDSSI
34
35    call    Char_GetFilterFunctionToDXforNumericBaseInBX
36    call    Registers_ExchangeDSSIwithESDI
37    call    Keyboard_ReadUserInputtedStringToESDIWhilePrinting
38    call    Registers_ExchangeDSSIwithESDI  ; Does not modify FLAGS
39    jz      SHORT .CancelledByUser
40
41    call    String_ConvertWordToAXfromStringInDSSIwithBaseInBX
42.CancelledByUser:
43    add     sp, BYTE BUFFER_SIZE_FOR_WORD_INPUT
44    test    cx, cx                          ; Set ZF if string length is zero
45    pop     cx
46    pop     si
47    pop     ds
48    ret
49
50
51;--------------------------------------------------------------------
52; Reads user inputted string to buffer. Character filter is
53; supported to ignore unwanted characters.
54; Function returns when ENTER or ESC will be pressed.
55; 
56; Keyboard_ReadUserInputtedStringToESDIWhilePrinting
57;   Parameters:
58;       CX:     Buffer size (with NULL)
59;       ES:DI:  Ptr to destination buffer
60;       CS:DX:  Ptr to character filter function:
61;                   Parameters:
62;                       AL:     Character inputted by user
63;                   Returns:
64;                       CF:     Set if character is accepted
65;                               Cleared if character is rejected
66;                   Corrupts registers:
67;                       Nothing
68;   Returns:
69;       CX:     String length in characters (without NULL)
70;       ZF:     Set if user cancellation
71;   Corrupts registers:
72;       AX
73;--------------------------------------------------------------------
74ALIGN JUMP_ALIGN
75Keyboard_ReadUserInputtedStringToESDIWhilePrinting:
76    push    di
77    push    si
78    push    bx
79    call    .PrepareDisplayContextForKeyboardInput
80    jcxz    .ReturnAfterUpdatingZF
81
82    xor     bx, bx                              ; Zero character counter
83    dec     cx                                  ; Decrement buffer size for NULL
84    cld
85ALIGN JUMP_ALIGN
86.GetCharacterFromUser:
87    call    Keyboard_GetKeystrokeToAXandWaitIfNecessary ; Get ASCII to AL
88    call    .ProcessControlCharacter
89    jz      SHORT .TerminateStringWithNULL
90    jc      SHORT .PlayBellForRejectedCharacter
91    call    dx                                  ; Filter character
92    jnc     SHORT .PlayBellForRejectedCharacter
93    inc     bx                                  ; Increment number of characters stored
94    stosb                                       ; Store from AL to ES:DI
95    call    Keyboard_PrintInputtedCharacter
96    loop    .GetCharacterFromUser
97.PlayBellForRejectedCharacter:
98    cmp     al, BS                              ; No bell for backspace
99    je      SHORT .GetCharacterFromUser
100    call    Keyboard_PlayBellForUnwantedKeystroke
101    jmp     SHORT .GetCharacterFromUser
102
103.TerminateStringWithNULL:
104    stosb                                       ; Terminate string with NULL
105    mov     cx, bx                              ; String length now in CX
106
107.ReturnAfterUpdatingZF:
108    CALL_DISPLAY_LIBRARY PopDisplayContext
109    test    cx, cx                              ; Clear or set ZF
110    pop     bx
111    pop     si
112    pop     di
113    ret
114
115;--------------------------------------------------------------------
116; .PrepareDisplayContextForKeyboardInput
117;   Parameters:
118;       Nothing
119;   Returns:
120;       Nothing (Display context pushed to stack)
121;   Corrupts registers:
122;       AX, BX, SI
123;--------------------------------------------------------------------
124ALIGN JUMP_ALIGN
125.PrepareDisplayContextForKeyboardInput:
126    pop     bx                  ; Pop return address to BX
127    mov     si, di
128
129    CALL_DISPLAY_LIBRARY PushDisplayContext
130    mov     ax, CURSOR_NORMAL
131    CALL_DISPLAY_LIBRARY SetCursorShapeFromAX
132    CALL_DISPLAY_LIBRARY SynchronizeDisplayContextToHardware
133
134    mov     di, si
135    jmp     bx
136
137
138;--------------------------------------------------------------------
139; .ProcessControlCharacter
140;   Parameters:
141;       AL:     Character inputted by user
142;       CX:     Number of bytes left in buffer
143;       BX:     Total number of characters inputted
144;       ES:DI:  Ptr where to store next character
145;   Returns:
146;       AL:     Character inputted by user or NULL if end of input
147;       BX:     Cleared if user cancellation
148;       ZF:     Set if user has ended or cancelled key input
149;       CF:     Set if character is rejected
150;   Corrupts registers:
151;       AH
152;--------------------------------------------------------------------
153ALIGN JUMP_ALIGN
154.ProcessControlCharacter:
155    cmp     al, CR                              ; ENTER to terminate string?
156    je      SHORT .EndCharacterInput
157    cmp     al, ESC                             ; Cancel input?
158    je      SHORT .CancelCharacterInput
159    cmp     al, BS                              ; Backspace?
160    je      SHORT .Backspace
161    jcxz    .RejectCharacter
162    test    al, al                              ; Clear ZF and CF
163    ret
164
165.Backspace:
166    test    bx, bx                              ; At the beginning?
167    jz      SHORT .RejectCharacter
168    inc     cx                                  ; Increment bytes left
169    dec     bx                                  ; Decrement characters inputted
170    dec     di
171    call    Keyboard_PrintBackspace
172    mov     al, BS                              ; Restore character
173.RejectCharacter:
174    test    al, al                              ; Clear ZF...
175    stc                                         ; ...and set CF
176    ret
177
178.CancelCharacterInput:
179    xor     bx, bx
180.EndCharacterInput:
181    xor     al, al                              ; Set ZF and clear CF
182    ret
183
184
185;--------------------------------------------------------------------
186; Keyboard_PrintBackspace
187;   Parameters:
188;       Nothing
189;   Returns:
190;       Nothing
191;   Corrupts registers:
192;       AX
193;--------------------------------------------------------------------
194ALIGN JUMP_ALIGN
195Keyboard_PrintBackspace:
196    mov     al, BS
197    call    Keyboard_PrintInputtedCharacter
198    mov     al, ' '
199    call    Keyboard_PrintInputtedCharacter
200    mov     al, BS
201    jmp     SHORT Keyboard_PrintInputtedCharacter
202
203
204;--------------------------------------------------------------------
205; Keyboard_PlayBellForUnwantedKeystroke
206;   Parameters:
207;       Nothing
208;   Returns:
209;       Nothing
210;   Corrupts registers:
211;       AX
212;--------------------------------------------------------------------
213ALIGN JUMP_ALIGN
214Keyboard_PlayBellForUnwantedKeystroke:
215    mov     al, BELL
216    ; Fall to Keyboard_PrintInputtedCharacter
217
218;--------------------------------------------------------------------
219; Keyboard_PrintInputtedCharacter
220;   Parameters:
221;       AL:     Character inputted by user
222;   Returns:
223;       Nothing
224;   Corrupts registers:
225;       AX
226;--------------------------------------------------------------------
227ALIGN JUMP_ALIGN
228Keyboard_PrintInputtedCharacter:
229    push    di
230    CALL_DISPLAY_LIBRARY PrintCharacterFromAL
231    CALL_DISPLAY_LIBRARY SynchronizeDisplayContextToHardware    ; Hardware cursor
232    pop     di
233    ret
234
235
236;--------------------------------------------------------------------
237; Keyboard_RemoveAllKeystrokesFromBuffer
238;   Parameters:
239;       Nothing
240;   Returns:
241;       Nothing
242;   Corrupts registers:
243;       AX
244;--------------------------------------------------------------------
245ALIGN JUMP_ALIGN
246Keyboard_RemoveAllKeystrokesFromBuffer:
247    call    Keyboard_GetKeystrokeToAX
248    jnz     SHORT Keyboard_RemoveAllKeystrokesFromBuffer
249    ret
250
251
252;--------------------------------------------------------------------
253; Keyboard_GetKeystrokeToAX
254; Keyboard_GetKeystrokeToAXandLeaveItToBuffer
255; Keyboard_GetKeystrokeToAXandWaitIfNecessary
256;   Parameters:
257;       Nothing
258;   Returns:
259;       AL:     ASCII character (if keystroke available)
260;       AH:     BIOS scan code (if keystroke available)
261;       ZF:     Set if no keystroke available
262;               Cleared if keystroke available
263;   Corrupts registers:
264;       Nothing
265;--------------------------------------------------------------------
266ALIGN JUMP_ALIGN
267Keyboard_GetKeystrokeToAX:
268    call    Keyboard_GetKeystrokeToAXandLeaveItToBuffer
269    jnz     SHORT Keyboard_GetKeystrokeToAXandWaitIfNecessary
270    ret 
271ALIGN JUMP_ALIGN
272Keyboard_GetKeystrokeToAXandLeaveItToBuffer:
273    mov     ah, CHECK_FOR_KEYSTROKE
274    int     BIOS_KEYBOARD_INTERRUPT_16h
275    ret
276ALIGN JUMP_ALIGN
277Keyboard_GetKeystrokeToAXandWaitIfNecessary:
278    xor     ah, ah                      ; GET_KEYSTROKE
279    int     BIOS_KEYBOARD_INTERRUPT_16h
280    test    ax, ax                      ; Clear ZF
281    ret
Note: See TracBrowser for help on using the repository browser.