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

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

Initial commit for Assembly Library.

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