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

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

Changes to Assembly Library:
Removed Memory_ExchangeSSBPwithESDI since it obviously corrupted stack.
CGA detection is now only done once when initializing Display Context.
Moved File Library defines to File.inc.

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