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
RevLine 
[41]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;--------------------------------------------------------------------
[369]16ALIGN DISPLAY_JUMP_ALIGN
[41]17DisplayContext_Initialize:
18    mov     WORD [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut], DEFAULT_CHARACTER_OUTPUT
[44]19    mov     BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute], SCREEN_BACKGROUND_ATTRIBUTE
[287]20    mov     ax, [VIDEO_BDA.wCursorShape]
21    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCursorShape], ax
[101]22    ; Fall to .DetectAndSetDisplaySegment
[41]23
24;--------------------------------------------------------------------
25; .DetectAndSetDisplaySegment
26;   Parameters:
27;       DS:     BDA segment (zero)
28;   Returns:
29;       Nothing
30;   Corrupts registers:
[50]31;       AX, DX
[41]32;--------------------------------------------------------------------
33.DetectAndSetDisplaySegment:
[50]34    mov     ax, COLOR_TEXT_SEGMENT
[41]35    cmp     BYTE [VIDEO_BDA.bMode], MDA_TEXT_MODE
[101]36    eCMOVE  ah, MONO_TEXT_SEGMENT >> 8
[50]37    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2], ax
[101]38    ; Fall to .InitializeFlags
[50]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
[101]56    ; Fall to .InitializeCursor
[41]57
[101]58;--------------------------------------------------------------------
59; .InitializeCursor
60;   Parameters:
61;       DS:     BDA segment (zero)
62;   Returns:
63;       Nothing
64;   Corrupts registers:
65;       AX, DX
66;--------------------------------------------------------------------
67.InitializeCursor:
[115]68    call    DisplayCursor_GetHardwareCoordinatesToAX    ; Coordinates before init
69    call    DisplayCursor_SetCoordinatesFromAX          ; Cursor to Display Context
[101]70    ; Fall to DisplayContext_SynchronizeToHardware
[41]71
72;--------------------------------------------------------------------
[101]73; DisplayContext_SynchronizeToHardware
74;   Parameters:
75;       DS:     BDA segment (zero)
76;   Returns:
77;       Nothing
78;   Corrupts registers:
79;       AX, DX
80;--------------------------------------------------------------------
[369]81ALIGN DISPLAY_JUMP_ALIGN
[101]82DisplayContext_SynchronizeToHardware:
83    call    DisplayPage_SynchronizeToHardware
84    call    DisplayCursor_SynchronizeShapeToHardware
85    jmp     DisplayCursor_SynchronizeCoordinatesToHardware
86
87
88;--------------------------------------------------------------------
[41]89; DisplayContext_Push
90;   Parameters:
91;       Nothing
92;   Returns:
93;       Nothing
94;   Corrupts registers:
95;       AX, DI
96;--------------------------------------------------------------------
[369]97ALIGN DISPLAY_JUMP_ALIGN
[41]98DisplayContext_Push:
99    mov     di, ds                  ; Backup DS
100    LOAD_BDA_SEGMENT_TO ds, ax
101    pop     ax                      ; Pop return address
102
[194]103%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS
[41]104    %assign i 0
105    %rep DISPLAY_CONTEXT_size / 2
106        push    WORD [VIDEO_BDA.displayContext + i]
107    %assign i i+2
108    %endrep
[194]109%endif
110       
[41]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;--------------------------------------------------------------------
[369]123ALIGN DISPLAY_JUMP_ALIGN
[41]124DisplayContext_Pop:
125    mov     di, ds                  ; Backup DS
126    LOAD_BDA_SEGMENT_TO ds, ax
127    pop     ax                      ; Pop return address
128
[194]129%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS       
[41]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
[194]135%endif
136       
[41]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;--------------------------------------------------------------------
[52]146; DisplayContext_PrepareOffScreenBufferInESBXwithLengthInCX
[48]147;   Parameters:
[52]148;       CX:     Off screen buffer length in characters
149;       ES:BX:  Ptr to off screen buffer
[48]150;   Returns:
151;       Nothing
152;   Corrupts registers:
[52]153;       AX, DI
[48]154;--------------------------------------------------------------------
[133]155%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]156ALIGN DISPLAY_JUMP_ALIGN
[52]157DisplayContext_PrepareOffScreenBufferInESBXwithLengthInCX:
[48]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
[52]168    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam], cx
[48]169
170    mov     bx, di
171    pop     ds
172    ret
[133]173%endif
[48]174
175
176;--------------------------------------------------------------------
[41]177; DisplayContext_SetCharacterPointerFromBXAX
178;   Parameters:
179;       BX:AX:  Ptr to destination for next character to output
180;       DS:     BDA segment (zero)
181;   Returns:
[48]182;       ES:DI:  Pointer that was in BX:AX
[41]183;   Corrupts registers:
184;       AX
185;--------------------------------------------------------------------
[133]186%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]187ALIGN DISPLAY_JUMP_ALIGN
[41]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
[133]194%endif
[41]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;--------------------------------------------------------------------
[133]206%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]207ALIGN DISPLAY_JUMP_ALIGN
[41]208DisplayContext_GetCharacterPointerToBXAX:
209    mov     ax, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition]
210    mov     bx, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2]
211    ret
[133]212%endif
[41]213
214
215;--------------------------------------------------------------------
[45]216; DisplayContext_SetCharOutputFunctionFromAXwithAttribFlagInBL
[41]217;   Parameters:
218;       AX:     Offset to character output function
[45]219;       BL:     Attribute Flag
[41]220;       DS:     BDA segment (zero)
221;   Returns:
222;       Nothing
223;   Corrupts registers:
[50]224;       BL
[41]225;--------------------------------------------------------------------
[369]226ALIGN DISPLAY_JUMP_ALIGN
[45]227DisplayContext_SetCharOutputFunctionFromAXwithAttribFlagInBL:
[50]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
[41]231    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut], ax
232    ret
[194]233       
[41]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;--------------------------------------------------------------------
[369]245ALIGN DISPLAY_JUMP_ALIGN
[41]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;--------------------------------------------------------------------
[369]261ALIGN DISPLAY_JUMP_ALIGN
[41]262DisplayContext_SetCharacterOutputParameterFromAX:
263    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam], ax
264    ret
265
[194]266       
[41]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
[133]275;--------------------------------------------------------------------
[181]276%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS OR EXCLUDE_FROM_XTIDECFG  ; This is currently unused (dead code)
[369]277ALIGN DISPLAY_JUMP_ALIGN
[181]278DisplayContext_GetCharacterOutputParameterToDX:
279    mov     dx, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam]
280    ret
281%endif
[44]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
[133]293;--------------------------------------------------------------------
[201]294%ifndef MODULE_STRINGS_COMPRESSED
[369]295ALIGN DISPLAY_JUMP_ALIGN
[44]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
[194]301%endif
[44]302
[194]303       
[44]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
[133]313;--------------------------------------------------------------------
[201]314%ifndef MODULE_STRINGS_COMPRESSED
[369]315ALIGN DISPLAY_JUMP_ALIGN
[44]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
[369]320ALIGN DISPLAY_JUMP_ALIGN, ret
[44]321ReturnOffsetInAX:
322    ret
[194]323%endif
Note: See TracBrowser for help on using the repository browser.