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

Last change on this file since 370 was 369, checked in by gregli@…, 13 years ago

Removed align directives for initalization code and added define for align in boot-time calls to the assembly library (defaulting to 1), resulting in a significant savings for the AT and 386 builds. Fixed a bug with switch command line handling in the serial server. Put in CR characters in licesnse.txt, so that it properly displays on Windows. In the configurator, added default values for user supplied CHS and LBA values, defaulting to values within range when those features are enabled. Updated the copyright message in the configurator as the literal word Copyright is important.

File size: 8.4 KB
Line 
1; Project name : Assembly Library
2; Description : Functions for managing keyboard.
3
4BUFFER_SIZE_FOR_WORD_INPUT EQU 6 ; 5 chars + NULL
5
6; Section containing code
7SECTION .text
8
9;--------------------------------------------------------------------
10; Reads user inputted word.
11; Function returns when ENTER or ESC will be pressed.
12;
13; Keyboard_ReadUserInputtedWordWhilePrinting
14; Parameters
15; BX: Numeric base (10 or 16)
16; Returns:
17; AX: User inputted word
18; ZF: Set if user cancellation
19; Corrupts registers:
20; DX
21;--------------------------------------------------------------------
22%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
23ALIGN KEYBOARD_JUMP_ALIGN
24Keyboard_ReadUserInputtedWordWhilePrinting:
25 push ds
26 push si
27 push cx
28
29 mov cx, BUFFER_SIZE_FOR_WORD_INPUT
30 call Memory_ReserveCXbytesFromStackToDSSI
31
32 call Char_GetFilterFunctionToDXforNumericBaseInBX
33 call Registers_ExchangeDSSIwithESDI
34 call Keyboard_ReadUserInputtedStringToESDIWhilePrinting
35 call Registers_ExchangeDSSIwithESDI ; Does not modify FLAGS
36 jz SHORT .CancelledByUser
37
38 call String_ConvertWordToAXfromStringInDSSIwithBaseInBX
39.CancelledByUser:
40 add sp, BYTE BUFFER_SIZE_FOR_WORD_INPUT
41 test cx, cx ; Set ZF if string length is zero
42 pop cx
43 pop si
44 pop ds
45 ret
46%endif
47
48
49;--------------------------------------------------------------------
50; Reads user inputted string to buffer. Character filter is
51; supported to ignore unwanted characters.
52; Function returns when ENTER or ESC will be pressed.
53;
54; Keyboard_ReadUserInputtedStringToESDIWhilePrinting
55; Parameters:
56; CX: Buffer size (with NULL)
57; ES:DI: Ptr to destination buffer
58; CS:DX: Ptr to character filter function:
59; Parameters:
60; AL: Character inputted by user
61; Returns:
62; CF: Set if character is accepted
63; Cleared if character is rejected
64; Corrupts registers:
65; Nothing
66; Returns:
67; CX: String length in characters (without NULL)
68; ZF: Set if user cancellation
69; Corrupts registers:
70; AX
71;--------------------------------------------------------------------
72%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
73ALIGN KEYBOARD_JUMP_ALIGN
74Keyboard_ReadUserInputtedStringToESDIWhilePrinting:
75 push di
76 push si
77 push bx
78 call .PrepareDisplayContextForKeyboardInput
79 jcxz .ReturnAfterUpdatingZF
80
81 xor bx, bx ; Zero character counter
82 dec cx ; Decrement buffer size for NULL
83 cld
84ALIGN KEYBOARD_JUMP_ALIGN
85.GetCharacterFromUser:
86 call Keyboard_GetKeystrokeToAXandWaitIfNecessary ; Get ASCII to AL
87 call .ProcessControlCharacter
88 jz SHORT .TerminateStringWithNULL
89 jc SHORT .PlayBellForRejectedCharacter
90 call dx ; Filter character
91 jnc SHORT .PlayBellForRejectedCharacter
92 inc bx ; Increment number of characters stored
93 stosb ; Store from AL to ES:DI
94 call Keyboard_PrintInputtedCharacter
95 loop .GetCharacterFromUser
96.PlayBellForRejectedCharacter:
97 cmp al, BS ; No bell for backspace
98 je SHORT .GetCharacterFromUser
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 KEYBOARD_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 KEYBOARD_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 clc ; Clear CF (ZF is already cleared)
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 mov al, BS ; Restore character
172.RejectCharacter:
173 test al, al ; Clear ZF...
174 stc ; ...and set CF
175 ret
176
177.CancelCharacterInput:
178 xor bx, bx
179.EndCharacterInput:
180 xor al, al ; Set ZF and clear CF
181 ret
182%endif ; EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
183
184
185;--------------------------------------------------------------------
186; Keyboard_PrintBackspace
187; Parameters:
188; Nothing
189; Returns:
190; Nothing
191; Corrupts registers:
192; AX
193;--------------------------------------------------------------------
194%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
195ALIGN KEYBOARD_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%endif
204
205
206;--------------------------------------------------------------------
207; Keyboard_PlayBellForUnwantedKeystroke
208; Parameters:
209; Nothing
210; Returns:
211; Nothing
212; Corrupts registers:
213; AX
214;--------------------------------------------------------------------
215%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
216ALIGN KEYBOARD_JUMP_ALIGN
217Keyboard_PlayBellForUnwantedKeystroke:
218 mov al, BELL
219 ; Fall to Keyboard_PrintInputtedCharacter
220%endif
221
222;--------------------------------------------------------------------
223; Keyboard_PrintInputtedCharacter
224; Parameters:
225; AL: Character inputted by user
226; Returns:
227; Nothing
228; Corrupts registers:
229; AX
230;--------------------------------------------------------------------
231%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
232ALIGN KEYBOARD_JUMP_ALIGN
233Keyboard_PrintInputtedCharacter:
234 push di
235 CALL_DISPLAY_LIBRARY PrintCharacterFromAL
236 CALL_DISPLAY_LIBRARY SynchronizeDisplayContextToHardware ; Hardware cursor
237 pop di
238 ret
239%endif
240
241
242;--------------------------------------------------------------------
243; Keyboard_RemoveAllKeystrokesFromBuffer
244; Parameters:
245; Nothing
246; Returns:
247; Nothing
248; Corrupts registers:
249; AX
250;--------------------------------------------------------------------
251%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS ; Only used when debugging
252ALIGN KEYBOARD_JUMP_ALIGN
253Keyboard_RemoveAllKeystrokesFromBuffer:
254 call Keyboard_GetKeystrokeToAX
255 jnz SHORT Keyboard_RemoveAllKeystrokesFromBuffer
256 ret
257%endif
258
259
260;--------------------------------------------------------------------
261; Keyboard_GetKeystrokeToAX
262; Keyboard_GetKeystrokeToAXandLeaveItToBuffer
263; Keyboard_GetKeystrokeToAXandWaitIfNecessary
264; Parameters:
265; Nothing
266; Returns:
267; AL: ASCII character (if keystroke available)
268; AH: BIOS scan code (if keystroke available)
269; ZF: Set if no keystroke available
270; Cleared if keystroke available
271; Corrupts registers:
272; Nothing
273;--------------------------------------------------------------------
274ALIGN KEYBOARD_JUMP_ALIGN
275Keyboard_GetKeystrokeToAXandLeaveItToBuffer:
276 mov ah, CHECK_FOR_KEYSTROKE
277 int BIOS_KEYBOARD_INTERRUPT_16h
278 ret
279ALIGN KEYBOARD_JUMP_ALIGN
280Keyboard_GetKeystrokeToAX:
281 call Keyboard_GetKeystrokeToAXandLeaveItToBuffer
282 jz SHORT Keyboard_GetKeystrokeToAXReturn
283 ; Fall to Keyboard_GetKeystrokeToAXandWaitIfNecessary
284ALIGN KEYBOARD_JUMP_ALIGN
285Keyboard_GetKeystrokeToAXandWaitIfNecessary:
286 xor ah, ah ; GET_KEYSTROKE
287 int BIOS_KEYBOARD_INTERRUPT_16h
288 test ax, ax ; Clear ZF
289Keyboard_GetKeystrokeToAXReturn:
290 ret
Note: See TracBrowser for help on using the repository browser.