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

Last change on this file since 490 was 489, checked in by gregli@…, 12 years ago

Added version string to initial title banner, for cases where there is not a boot menu (just hotkeys, or no hotkeys). Also ifdef'd out some unused code.

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