source: xtideuniversalbios/trunk/Assembly_Library/Src/Display/DisplayContext.asm @ 369

Last change on this file since 369 was 369, checked in by gregli@…, 12 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: 9.8 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Functions for managing display context.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; DisplayContext_Initialize
9;   Parameters:
10;       DS:     BDA segment (zero)
11;   Returns:
12;       Nothing
13;   Corrupts registers:
14;       AX, DX, DI
15;--------------------------------------------------------------------
16ALIGN DISPLAY_JUMP_ALIGN
17DisplayContext_Initialize:
18    mov     WORD [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut], DEFAULT_CHARACTER_OUTPUT
19    mov     BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute], SCREEN_BACKGROUND_ATTRIBUTE
20    mov     ax, [VIDEO_BDA.wCursorShape]
21    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCursorShape], ax
22    ; Fall to .DetectAndSetDisplaySegment
23
24;--------------------------------------------------------------------
25; .DetectAndSetDisplaySegment
26;   Parameters:
27;       DS:     BDA segment (zero)
28;   Returns:
29;       Nothing
30;   Corrupts registers:
31;       AX, DX
32;--------------------------------------------------------------------
33.DetectAndSetDisplaySegment:
34    mov     ax, COLOR_TEXT_SEGMENT
35    cmp     BYTE [VIDEO_BDA.bMode], MDA_TEXT_MODE
36    eCMOVE  ah, MONO_TEXT_SEGMENT >> 8
37    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2], ax
38    ; Fall to .InitializeFlags
39
40;--------------------------------------------------------------------
41; .InitializeFlags
42;   Parameters:
43;       DS:     BDA segment (zero)
44;   Returns:
45;       Nothing
46;   Corrupts registers:
47;       AX, DX
48;--------------------------------------------------------------------
49.InitializeFlags:
50    mov     dl, FLG_CONTEXT_ATTRIBUTES
51    call    CgaSnow_IsCgaPresent
52    jnc     SHORT .DoNotSetCgaFlag
53    or      dl, FLG_CONTEXT_CGA
54.DoNotSetCgaFlag:
55    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], dl
56    ; Fall to .InitializeCursor
57
58;--------------------------------------------------------------------
59; .InitializeCursor
60;   Parameters:
61;       DS:     BDA segment (zero)
62;   Returns:
63;       Nothing
64;   Corrupts registers:
65;       AX, DX
66;--------------------------------------------------------------------
67.InitializeCursor:
68    call    DisplayCursor_GetHardwareCoordinatesToAX    ; Coordinates before init
69    call    DisplayCursor_SetCoordinatesFromAX          ; Cursor to Display Context
70    ; Fall to DisplayContext_SynchronizeToHardware
71
72;--------------------------------------------------------------------
73; DisplayContext_SynchronizeToHardware
74;   Parameters:
75;       DS:     BDA segment (zero)
76;   Returns:
77;       Nothing
78;   Corrupts registers:
79;       AX, DX
80;--------------------------------------------------------------------
81ALIGN DISPLAY_JUMP_ALIGN
82DisplayContext_SynchronizeToHardware:
83    call    DisplayPage_SynchronizeToHardware
84    call    DisplayCursor_SynchronizeShapeToHardware
85    jmp     DisplayCursor_SynchronizeCoordinatesToHardware
86
87
88;--------------------------------------------------------------------
89; DisplayContext_Push
90;   Parameters:
91;       Nothing
92;   Returns:
93;       Nothing
94;   Corrupts registers:
95;       AX, DI
96;--------------------------------------------------------------------
97ALIGN DISPLAY_JUMP_ALIGN
98DisplayContext_Push:
99    mov     di, ds                  ; Backup DS
100    LOAD_BDA_SEGMENT_TO ds, ax
101    pop     ax                      ; Pop return address
102
103%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS
104    %assign i 0
105    %rep DISPLAY_CONTEXT_size / 2
106        push    WORD [VIDEO_BDA.displayContext + i]
107    %assign i i+2
108    %endrep
109%endif
110       
111    mov     ds, di                  ; Restore DS
112    jmp     ax
113
114;--------------------------------------------------------------------
115; DisplayContext_Pop
116;   Parameters:
117;       Nothing
118;   Returns:
119;       Nothing
120;   Corrupts registers:
121;       AX, DI
122;--------------------------------------------------------------------
123ALIGN DISPLAY_JUMP_ALIGN
124DisplayContext_Pop:
125    mov     di, ds                  ; Backup DS
126    LOAD_BDA_SEGMENT_TO ds, ax
127    pop     ax                      ; Pop return address
128
129%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS       
130    %assign i DISPLAY_CONTEXT_size-2
131    %rep DISPLAY_CONTEXT_size / 2
132        pop     WORD [VIDEO_BDA.displayContext + i]
133    %assign i i-2
134    %endrep
135%endif
136       
137    push    ax                      ; Push return address
138    push    dx
139    call    DisplayContext_SynchronizeToHardware
140    pop     dx
141    mov     ds, di                  ; Restore DS
142    ret
143
144
145;--------------------------------------------------------------------
146; DisplayContext_PrepareOffScreenBufferInESBXwithLengthInCX
147;   Parameters:
148;       CX:     Off screen buffer length in characters
149;       ES:BX:  Ptr to off screen buffer
150;   Returns:
151;       Nothing
152;   Corrupts registers:
153;       AX, DI
154;--------------------------------------------------------------------
155%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
156ALIGN DISPLAY_JUMP_ALIGN
157DisplayContext_PrepareOffScreenBufferInESBXwithLengthInCX:
158    push    ds
159
160    LOAD_BDA_SEGMENT_TO ds, di
161    xchg    ax, bx
162    mov     bx, es
163    call    DisplayContext_SetCharacterPointerFromBXAX  ; ES:DI now has the pointer
164
165    mov     bl, ATTRIBUTES_NOT_USED
166    mov     ax, BUFFER_OUTPUT_WITH_CHAR_ONLY
167    call    DisplayContext_SetCharOutputFunctionFromAXwithAttribFlagInBL
168    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam], cx
169
170    mov     bx, di
171    pop     ds
172    ret
173%endif
174
175
176;--------------------------------------------------------------------
177; DisplayContext_SetCharacterPointerFromBXAX
178;   Parameters:
179;       BX:AX:  Ptr to destination for next character to output
180;       DS:     BDA segment (zero)
181;   Returns:
182;       ES:DI:  Pointer that was in BX:AX
183;   Corrupts registers:
184;       AX
185;--------------------------------------------------------------------
186%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
187ALIGN DISPLAY_JUMP_ALIGN
188DisplayContext_SetCharacterPointerFromBXAX:
189    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], ax
190    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2], bx
191    xchg    di, ax
192    mov     es, bx
193    ret
194%endif
195
196
197;--------------------------------------------------------------------
198; DisplayContext_GetCharacterPointerToBXAX
199;   Parameters:
200;       DS:     BDA segment (zero)
201;   Returns:
202;       BX:AX:  Ptr to destination for next character to output
203;   Corrupts registers:
204;       Nothing
205;--------------------------------------------------------------------
206%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
207ALIGN DISPLAY_JUMP_ALIGN
208DisplayContext_GetCharacterPointerToBXAX:
209    mov     ax, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition]
210    mov     bx, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2]
211    ret
212%endif
213
214
215;--------------------------------------------------------------------
216; DisplayContext_SetCharOutputFunctionFromAXwithAttribFlagInBL
217;   Parameters:
218;       AX:     Offset to character output function
219;       BL:     Attribute Flag
220;       DS:     BDA segment (zero)
221;   Returns:
222;       Nothing
223;   Corrupts registers:
224;       BL
225;--------------------------------------------------------------------
226ALIGN DISPLAY_JUMP_ALIGN
227DisplayContext_SetCharOutputFunctionFromAXwithAttribFlagInBL:
228    and     bl, FLG_CONTEXT_ATTRIBUTES
229    and     BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], ~FLG_CONTEXT_ATTRIBUTES
230    or      [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], bl
231    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut], ax
232    ret
233       
234
235;--------------------------------------------------------------------
236; DisplayContext_SetCharacterAttributeFromAL
237;   Parameters:
238;       AL:     Character attribute
239;       DS:     BDA segment (zero)
240;   Returns:
241;       Nothing
242;   Corrupts registers:
243;       Nothing
244;--------------------------------------------------------------------
245ALIGN DISPLAY_JUMP_ALIGN
246DisplayContext_SetCharacterAttributeFromAL:
247    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute], al
248    ret
249
250
251;--------------------------------------------------------------------
252; DisplayContext_SetCharacterOutputParameterFromAX
253;   Parameters:
254;       AX:     Parameter for Character Output function
255;       DS:     BDA segment (zero)
256;   Returns:
257;       Nothing
258;   Corrupts registers:
259;       Nothing
260;--------------------------------------------------------------------
261ALIGN DISPLAY_JUMP_ALIGN
262DisplayContext_SetCharacterOutputParameterFromAX:
263    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam], ax
264    ret
265
266       
267;--------------------------------------------------------------------
268; DisplayContext_GetCharacterOutputParameterToDX
269;   Parameters:
270;       DS:     BDA segment (zero)
271;   Returns:
272;       DX:     User parameter for Character Output function
273;   Corrupts registers:
274;       Nothing
275;--------------------------------------------------------------------
276%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS OR EXCLUDE_FROM_XTIDECFG  ; This is currently unused (dead code)
277ALIGN DISPLAY_JUMP_ALIGN
278DisplayContext_GetCharacterOutputParameterToDX:
279    mov     dx, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam]
280    ret
281%endif
282
283
284;--------------------------------------------------------------------
285; DisplayContext_GetCharacterOffsetToAXfromByteOffsetInAX
286;   Parameters:
287;       AX:     Offset in bytes from some character to another
288;       DS:     BDA segment (zero)
289;   Returns:
290;       AX:     Offset in characters from some character to another
291;   Corrupts registers:
292;       Nothing
293;--------------------------------------------------------------------
294%ifndef MODULE_STRINGS_COMPRESSED
295ALIGN DISPLAY_JUMP_ALIGN
296DisplayContext_GetCharacterOffsetToAXfromByteOffsetInAX:
297    test    BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], FLG_CONTEXT_ATTRIBUTES
298    jz      SHORT ReturnOffsetInAX
299    sar     ax, 1       ; BYTE count to WORD count
300    ret
301%endif
302
303       
304;--------------------------------------------------------------------
305; DisplayContext_GetByteOffsetToAXfromCharacterOffsetInAX
306;   Parameters:
307;       AX:     Offset in characters from some character to another
308;       DS:     BDA segment (zero)
309;   Returns:
310;       AX:     Offset in bytes from some character to another
311;   Corrupts registers:
312;       Nothing
313;--------------------------------------------------------------------
314%ifndef MODULE_STRINGS_COMPRESSED
315ALIGN DISPLAY_JUMP_ALIGN
316DisplayContext_GetByteOffsetToAXfromCharacterOffsetInAX:
317    test    BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], FLG_CONTEXT_ATTRIBUTES
318    jz      SHORT ReturnOffsetInAX
319    sal     ax, 1       ; WORD count to BYTE count
320ALIGN DISPLAY_JUMP_ALIGN, ret
321ReturnOffsetInAX:
322    ret
323%endif
Note: See TracBrowser for help on using the repository browser.