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

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

Changes to Assembly Library:
Completely rewritten line splitting (slower but no need to modify string).
Some changes to string processing functions.
Saved few bytes from CGA detection.

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   :   12.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    Memory_ExchangeDSSIwithESDI
37    call    Keyboard_ReadUserInputtedStringToESDIWhilePrinting
38    call    Memory_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.