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

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

Changes to Assembly Library:
Added functions to clear Menu Title and Information areas.
Implemented automatic line change when writing Menu Title and Information areas.
CGA snow related functions have been moved to CgaSnow.asm.
Keyboard input functions no longer produce beep for backspace.

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   :   7.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    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    cmp     al, BS                              ; No bell for backspace
100    je      SHORT .GetCharacterFromUser
101    call    Keyboard_PlayBellForUnwantedKeystroke
102    jmp     SHORT .GetCharacterFromUser
103
104.TerminateStringWithNULL:
105    stosb                                       ; Terminate string with NULL
106    mov     cx, bx                              ; String length now in CX
107
108.ReturnAfterUpdatingZF:
109    CALL_DISPLAY_LIBRARY PopDisplayContext
110    test    cx, cx                              ; Clear or set ZF
111    pop     bx
112    pop     si
113    pop     di
114    ret
115
116;--------------------------------------------------------------------
117; .PrepareDisplayContextForKeyboardInput
118;   Parameters:
119;       Nothing
120;   Returns:
121;       Nothing (Display context pushed to stack)
122;   Corrupts registers:
123;       AX, BX, SI
124;--------------------------------------------------------------------
125ALIGN JUMP_ALIGN
126.PrepareDisplayContextForKeyboardInput:
127    pop     bx                  ; Pop return address to BX
128    mov     si, di
129
130    CALL_DISPLAY_LIBRARY PushDisplayContext
131    mov     ax, CURSOR_NORMAL
132    CALL_DISPLAY_LIBRARY SetCursorShapeFromAX
133    CALL_DISPLAY_LIBRARY SynchronizeDisplayContextToHardware
134
135    mov     di, si
136    jmp     bx
137
138
139;--------------------------------------------------------------------
140; .ProcessControlCharacter
141;   Parameters:
142;       AL:     Character inputted by user
143;       CX:     Number of bytes left in buffer
144;       BX:     Total number of characters inputted
145;       ES:DI:  Ptr where to store next character
146;   Returns:
147;       AL:     Character inputted by user or NULL if end of input
148;       BX:     Cleared if user cancellation
149;       ZF:     Set if user has ended or cancelled key input
150;       CF:     Set if character is rejected
151;   Corrupts registers:
152;       AH
153;--------------------------------------------------------------------
154ALIGN JUMP_ALIGN
155.ProcessControlCharacter:
156    cmp     al, CR                              ; ENTER to terminate string?
157    je      SHORT .EndCharacterInput
158    cmp     al, ESC                             ; Cancel input?
159    je      SHORT .CancelCharacterInput
160    cmp     al, BS                              ; Backspace?
161    je      SHORT .Backspace
162    jcxz    .RejectCharacter
163    test    al, al                              ; Clear ZF and CF
164    ret
165
166.Backspace:
167    test    bx, bx                              ; At the beginning?
168    jz      SHORT .RejectCharacter
169    inc     cx                                  ; Increment bytes left
170    dec     bx                                  ; Decrement characters inputted
171    dec     di
172    call    Keyboard_PrintBackspace
173    mov     al, BS                              ; Restore character
174.RejectCharacter:
175    test    al, al                              ; Clear ZF...
176    stc                                         ; ...and set CF
177    ret
178
179.CancelCharacterInput:
180    xor     bx, bx
181.EndCharacterInput:
182    xor     al, al                              ; Set ZF and clear CF
183    ret
184
185
186;--------------------------------------------------------------------
187; Keyboard_PrintBackspace
188;   Parameters:
189;       Nothing
190;   Returns:
191;       Nothing
192;   Corrupts registers:
193;       AX
194;--------------------------------------------------------------------
195ALIGN JUMP_ALIGN
196Keyboard_PrintBackspace:
197    mov     al, BS
198    call    Keyboard_PrintInputtedCharacter
199    mov     al, ' '
200    call    Keyboard_PrintInputtedCharacter
201    mov     al, BS
202    jmp     SHORT Keyboard_PrintInputtedCharacter
203
204
205;--------------------------------------------------------------------
206; Keyboard_PlayBellForUnwantedKeystroke
207;   Parameters:
208;       Nothing
209;   Returns:
210;       Nothing
211;   Corrupts registers:
212;       AX
213;--------------------------------------------------------------------
214ALIGN JUMP_ALIGN
215Keyboard_PlayBellForUnwantedKeystroke:
216    mov     al, BELL
217    ; Fall to Keyboard_PrintInputtedCharacter
218
219;--------------------------------------------------------------------
220; Keyboard_PrintInputtedCharacter
221;   Parameters:
222;       AL:     Character inputted by user
223;   Returns:
224;       Nothing
225;   Corrupts registers:
226;       AX
227;--------------------------------------------------------------------
228ALIGN JUMP_ALIGN
229Keyboard_PrintInputtedCharacter:
230    push    di
231    CALL_DISPLAY_LIBRARY PrintCharacterFromAL
232    CALL_DISPLAY_LIBRARY SynchronizeDisplayContextToHardware    ; Hardware cursor
233    pop     di
234    ret
235
236
237;--------------------------------------------------------------------
238; Keyboard_RemoveAllKeystrokesFromBuffer
239;   Parameters:
240;       Nothing
241;   Returns:
242;       Nothing
243;   Corrupts registers:
244;       AX
245;--------------------------------------------------------------------
246ALIGN JUMP_ALIGN
247Keyboard_RemoveAllKeystrokesFromBuffer:
248    call    Keyboard_GetKeystrokeToAX
249    jnz     SHORT Keyboard_RemoveAllKeystrokesFromBuffer
250    ret
251
252
253;--------------------------------------------------------------------
254; Keyboard_GetKeystrokeToAX
255; Keyboard_GetKeystrokeToAXandLeaveItToBuffer
256; Keyboard_GetKeystrokeToAXandWaitIfNecessary
257;   Parameters:
258;       Nothing
259;   Returns:
260;       AL:     ASCII character (if keystroke available)
261;       AH:     BIOS scan code (if keystroke available)
262;       ZF:     Set if no keystroke available
263;               Cleared if keystroke available
264;   Corrupts registers:
265;       Nothing
266;--------------------------------------------------------------------
267ALIGN JUMP_ALIGN
268Keyboard_GetKeystrokeToAX:
269    call    Keyboard_GetKeystrokeToAXandLeaveItToBuffer
270    jnz     SHORT Keyboard_GetKeystrokeToAXandWaitIfNecessary
271    ret 
272ALIGN JUMP_ALIGN
273Keyboard_GetKeystrokeToAXandLeaveItToBuffer:
274    mov     ah, CHECK_FOR_KEYSTROKE
275    int     BIOS_KEYBOARD_INTERRUPT_16h
276    ret
277ALIGN JUMP_ALIGN
278Keyboard_GetKeystrokeToAXandWaitIfNecessary:
279    xor     ah, ah                      ; GET_KEYSTROKE
280    int     BIOS_KEYBOARD_INTERRUPT_16h
281    test    ax, ax                      ; Clear ZF
282    ret
Note: See TracBrowser for help on using the repository browser.