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

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

Spaces can now be generated before format specifier when printing formatted string.
Background character and attribute can now be easily specified before compiling.

File size: 7.8 KB
Line 
1; File name     :   DisplayContext.asm
2; Project name  :   Assembly Library
3; Created date  :   25.6.2010
4; Last update   :   27.9.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
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    mov     BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], FLG_CONTEXT_ATTRIBUTES
27
28    xor     ax, ax
29    call    DisplayCursor_SetCoordinatesFromAX
30    jmp     SHORT DisplayContext_SynchronizeToHardware
31
32;--------------------------------------------------------------------
33; .DetectAndSetDisplaySegment
34;   Parameters:
35;       DS:     BDA segment (zero)
36;   Returns:
37;       Nothing
38;   Corrupts registers:
39;       Nothing
40;--------------------------------------------------------------------
41.DetectAndSetDisplaySegment:
42    mov     WORD [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2], COLOR_TEXT_SEGMENT
43    cmp     BYTE [VIDEO_BDA.bMode], MDA_TEXT_MODE
44    jne     SHORT .Return
45    sub     WORD [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2], COLOR_TEXT_SEGMENT - MONO_TEXT_SEGMENT
46.Return:
47    ret
48
49
50;--------------------------------------------------------------------
51; DisplayContext_Push
52;   Parameters:
53;       Nothing
54;   Returns:
55;       Nothing
56;   Corrupts registers:
57;       AX, DI
58;--------------------------------------------------------------------
59ALIGN JUMP_ALIGN
60DisplayContext_Push:
61    mov     di, ds                  ; Backup DS
62    LOAD_BDA_SEGMENT_TO ds, ax
63    pop     ax                      ; Pop return address
64
65    %assign i 0
66    %rep DISPLAY_CONTEXT_size / 2
67        push    WORD [VIDEO_BDA.displayContext + i]
68    %assign i i+2
69    %endrep
70
71    mov     ds, di                  ; Restore DS
72    jmp     ax
73
74;--------------------------------------------------------------------
75; DisplayContext_Pop
76;   Parameters:
77;       Nothing
78;   Returns:
79;       Nothing
80;   Corrupts registers:
81;       AX, DI
82;--------------------------------------------------------------------
83ALIGN JUMP_ALIGN
84DisplayContext_Pop:
85    mov     di, ds                  ; Backup DS
86    LOAD_BDA_SEGMENT_TO ds, ax
87    pop     ax                      ; Pop return address
88
89    %assign i DISPLAY_CONTEXT_size-2
90    %rep DISPLAY_CONTEXT_size / 2
91        pop     WORD [VIDEO_BDA.displayContext + i]
92    %assign i i-2
93    %endrep
94
95    push    ax                      ; Push return address
96    push    dx
97    call    DisplayContext_SynchronizeToHardware
98    pop     dx
99    mov     ds, di                  ; Restore DS
100    ret
101
102
103;--------------------------------------------------------------------
104; DisplayContext_SynchronizeToHardware
105;   Parameters:
106;       DS:     BDA segment (zero)
107;   Returns:
108;       Nothing
109;   Corrupts registers:
110;       AX, DX
111;--------------------------------------------------------------------
112ALIGN JUMP_ALIGN
113DisplayContext_SynchronizeToHardware:
114    call    DisplayPage_SynchronizeToHardware
115    call    DisplayCursor_SynchronizeShapeToHardware
116    jmp     DisplayCursor_SynchronizeCoordinatesToHardware
117
118
119;--------------------------------------------------------------------
120; DisplayContext_SetCharacterPointerFromBXAX
121;   Parameters:
122;       BX:AX:  Ptr to destination for next character to output
123;       DS:     BDA segment (zero)
124;   Returns:
125;       ES:DI:  Pointer that was in DX:AX
126;   Corrupts registers:
127;       AX
128;--------------------------------------------------------------------
129ALIGN JUMP_ALIGN
130DisplayContext_SetCharacterPointerFromBXAX:
131    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], ax
132    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2], bx
133    xchg    di, ax
134    mov     es, bx
135    ret
136
137
138;--------------------------------------------------------------------
139; DisplayContext_GetCharacterPointerToBXAX
140;   Parameters:
141;       DS:     BDA segment (zero)
142;   Returns:
143;       BX:AX:  Ptr to destination for next character to output
144;   Corrupts registers:
145;       Nothing
146;--------------------------------------------------------------------
147ALIGN JUMP_ALIGN
148DisplayContext_GetCharacterPointerToBXAX:
149    mov     ax, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition]
150    mov     bx, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2]
151    ret
152
153
154;--------------------------------------------------------------------
155; DisplayContext_SetCharOutputFunctionFromAXwithAttribFlagInDL
156;   Parameters:
157;       AX:     Offset to character output function
158;       DL:     Attribute Flag
159;       DS:     BDA segment (zero)
160;   Returns:
161;       Nothing
162;   Corrupts registers:
163;       Nothing
164;--------------------------------------------------------------------
165ALIGN JUMP_ALIGN
166DisplayContext_SetCharOutputFunctionFromAXwithAttribFlagInDL:
167    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut], ax
168    and     BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], ~FLG_CONTEXT_ATTRIBUTES
169    mov     al, dl
170    and     al, FLG_CONTEXT_ATTRIBUTES
171    or      [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], al
172    ret
173
174
175;--------------------------------------------------------------------
176; DisplayContext_SetCharacterAttributeFromAL
177;   Parameters:
178;       AL:     Character attribute
179;       DS:     BDA segment (zero)
180;   Returns:
181;       Nothing
182;   Corrupts registers:
183;       Nothing
184;--------------------------------------------------------------------
185ALIGN JUMP_ALIGN
186DisplayContext_SetCharacterAttributeFromAL:
187    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute], al
188    ret
189
190
191;--------------------------------------------------------------------
192; DisplayContext_SetCharacterOutputParameterFromAX
193;   Parameters:
194;       AX:     Parameter for Character Output function
195;       DS:     BDA segment (zero)
196;   Returns:
197;       Nothing
198;   Corrupts registers:
199;       Nothing
200;--------------------------------------------------------------------
201ALIGN JUMP_ALIGN
202DisplayContext_SetCharacterOutputParameterFromAX:
203    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam], ax
204    ret
205
206;--------------------------------------------------------------------
207; DisplayContext_GetCharacterOutputParameterToDX
208;   Parameters:
209;       DS:     BDA segment (zero)
210;   Returns:
211;       DX:     User parameter for Character Output function
212;   Corrupts registers:
213;       Nothing
214;--------------------------------------------------------------------   
215ALIGN JUMP_ALIGN
216DisplayContext_GetCharacterOutputParameterToDX:
217    mov     dx, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam]
218    ret
219
220
221;--------------------------------------------------------------------
222; DisplayContext_GetCharacterOffsetToAXfromByteOffsetInAX
223;   Parameters:
224;       AX:     Offset in bytes from some character to another
225;       DS:     BDA segment (zero)
226;   Returns:
227;       AX:     Offset in characters from some character to another
228;   Corrupts registers:
229;       Nothing
230;--------------------------------------------------------------------   
231ALIGN JUMP_ALIGN
232DisplayContext_GetCharacterOffsetToAXfromByteOffsetInAX:
233    test    BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], FLG_CONTEXT_ATTRIBUTES
234    jz      SHORT ReturnOffsetInAX
235    sar     ax, 1       ; BYTE count to WORD count
236    ret
237
238;--------------------------------------------------------------------
239; DisplayContext_GetByteOffsetToAXfromCharacterOffsetInAX
240;   Parameters:
241;       AX:     Offset in characters from some character to another
242;       DS:     BDA segment (zero)
243;   Returns:
244;       AX:     Offset in bytes from some character to another
245;   Corrupts registers:
246;       Nothing
247;--------------------------------------------------------------------   
248ALIGN JUMP_ALIGN
249DisplayContext_GetByteOffsetToAXfromCharacterOffsetInAX:
250    test    BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], FLG_CONTEXT_ATTRIBUTES
251    jz      SHORT ReturnOffsetInAX
252    sal     ax, 1       ; WORD count to BYTE count
253ALIGN JUMP_ALIGN, ret
254ReturnOffsetInAX:
255    ret
Note: See TracBrowser for help on using the repository browser.