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

Last change on this file since 323 was 287, checked in by aitotat@…, 13 years ago

Changes to Assembly Library:

  • Hopefully fixed a problem of wrong sized MDA cursor.
  • Some minor improvements.
File size: 9.7 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 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 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 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 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 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 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 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 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 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 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 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 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 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 JUMP_ALIGN, ret
321ReturnOffsetInAX:
322 ret
323%endif
Note: See TracBrowser for help on using the repository browser.