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

Last change on this file since 602 was 592, checked in by Krister Nordvall, 6 years ago

Changes:

  • The problem with NASM in the previous revision (r591) has been fixed.
  • The colors used by the boot menu and hotkey bar can now be customized by selecting one of a number of pre-defined color themes. Suggestions for additional themes are more than welcome!
  • Large builds are now 10 KB. Small builds are still 8 KB with the exception of the Tiny build which is now 4 KB. In other words, builds are now as small as possible to make it easier to combine them with other BIOSes.
  • Added code to the library to improve drive error handling. XTIDECFG can now handle "Drive Not Ready" errors.
  • Fixed a couple of potential bugs in AtaID.asm (AtaID_GetMaxPioModeToAXandMinCycleTimeToCX); 1) ATA1.bPioMode was treated as a WORD variable. 2) ATA2.bPIOSupp was assumed to be non-zero which would result in PIO mode 3 being returned if the assumption was wrong.
  • Made the same changes in the equivalent function used by BIOSDRVS (DisplayPioModeInformationUsingAtaInfoFromDSBX in AtaInfo.asm).
  • Fixed a bug from r587 in PDC20x30.asm in PDC20x30_GetMaxPioModeToALandMinPioCycleTimeToBX.
  • Fixed a bug from r523 in XTIDECFG where Auto Configure would only set the IRQ on one IDE interface on AT-builds.
  • XTIDECFG will now restore the default settings for the "Serial port virtual device" when reselecting it in the list of device types. This makes it behave consistently for all device types.
  • The eAAM macro is now used regardless if USE_UNDOC_INTEL is defined or not because it is apparently supported on all processors including the NEC V20/V30 CPUs.
  • Renamed the EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS define to EXCLUDE_FROM_XUB.
  • Added a define to exclude unused library code from BIOSDRVS (EXCLUDE_FROM_BIOSDRVS). This makes it a lot smaller than in previous revisions.
  • All unnecessary CLD-instructions are now under a new define 'CLD_NEEDED' which is only enabled for the BIOS. It is disabled for XTIDECFG and BIOSDRVS but can be enabled if needed by adding this define to the respective makefile. This change was made because these unnecessary instructions are wasteful and should never be needed. In fact, they only serve to hide bugs (in other peoples code) which I strongly believe should be avoided. I recommend people making their own BIOSes from source to not use this define as it's extremely unlikely to be needed.
  • Updated the copyright info in SerDrive and changed an URL to point to the new site.
  • Updated the copyright info and version number in BIOSDRVS.
  • Updated the copyright info in XTIDECFG.
  • Optimizations in general.
File size: 11.1 KB
RevLine 
[41]1; Project name : Assembly Library
2; Description : Functions for managing display context.
3
[376]4;
[491]5; XTIDE Universal BIOS and Associated Tools
[526]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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.
[491]12;
[376]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
[491]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[491]18;
[376]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
[588]68 eCMOVC dl, FLG_CONTEXT_ATTRIBUTES | FLG_CONTEXT_CGA
[50]69 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], dl
[101]70 ; Fall to .InitializeCursor
[41]71
[101]72;--------------------------------------------------------------------
73; .InitializeCursor
74; Parameters:
75; DS: BDA segment (zero)
76; Returns:
77; Nothing
78; Corrupts registers:
79; AX, DX
80;--------------------------------------------------------------------
81.InitializeCursor:
[115]82 call DisplayCursor_GetHardwareCoordinatesToAX ; Coordinates before init
83 call DisplayCursor_SetCoordinatesFromAX ; Cursor to Display Context
[101]84 ; Fall to DisplayContext_SynchronizeToHardware
[41]85
86;--------------------------------------------------------------------
[101]87; DisplayContext_SynchronizeToHardware
88; Parameters:
89; DS: BDA segment (zero)
90; Returns:
91; Nothing
92; Corrupts registers:
93; AX, DX
94;--------------------------------------------------------------------
[369]95ALIGN DISPLAY_JUMP_ALIGN
[101]96DisplayContext_SynchronizeToHardware:
97 call DisplayPage_SynchronizeToHardware
98 call DisplayCursor_SynchronizeShapeToHardware
99 jmp DisplayCursor_SynchronizeCoordinatesToHardware
100
101
102;--------------------------------------------------------------------
[41]103; DisplayContext_Push
[491]104; DisplayContext_Pop
[41]105; Parameters:
106; Nothing
107; Returns:
108; Nothing
109; Corrupts registers:
110; AX, DI
111;--------------------------------------------------------------------
[592]112%ifdef EXCLUDE_FROM_XUB
[491]113 %ifndef MODULE_BOOT_MENU
114 %define EXCLUDE
115 %endif
116%endif
117
[592]118%ifndef EXCLUDE OR EXCLUDE_FROM_BIOSDRVS
[369]119ALIGN DISPLAY_JUMP_ALIGN
[41]120DisplayContext_Push:
121 mov di, ds ; Backup DS
122 LOAD_BDA_SEGMENT_TO ds, ax
123 pop ax ; Pop return address
124
[194]125%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS
[41]126 %assign i 0
[531]127 %ifdef USE_386
128 %rep DISPLAY_CONTEXT_size / 4
129 push DWORD [VIDEO_BDA.displayContext + i]
130 %assign i i+4
131 %endrep
132 %else
133 %rep DISPLAY_CONTEXT_size / 2
134 push WORD [VIDEO_BDA.displayContext + i]
135 %assign i i+2
136 %endrep
137 %endif
[194]138%endif
[491]139
[41]140 mov ds, di ; Restore DS
141 jmp ax
142
[491]143
[369]144ALIGN DISPLAY_JUMP_ALIGN
[41]145DisplayContext_Pop:
146 mov di, ds ; Backup DS
147 LOAD_BDA_SEGMENT_TO ds, ax
148 pop ax ; Pop return address
149
[491]150%ifndef CHECK_FOR_UNUSED_ENTRYPOINTS
[531]151 %ifdef USE_386
152 %assign i DISPLAY_CONTEXT_size-4
153 %rep DISPLAY_CONTEXT_size / 4
154 pop DWORD [VIDEO_BDA.displayContext + i]
155 %assign i i-4
156 %endrep
157 %else
158 %assign i DISPLAY_CONTEXT_size-2
159 %rep DISPLAY_CONTEXT_size / 2
160 pop WORD [VIDEO_BDA.displayContext + i]
161 %assign i i-2
162 %endrep
163 %endif
[194]164%endif
[491]165
[41]166 push ax ; Push return address
167 push dx
168 call DisplayContext_SynchronizeToHardware
169 pop dx
170 mov ds, di ; Restore DS
171 ret
[592]172%endif ; EXCLUDE OR EXCLUDE_FROM_BIOSDRVS
[491]173%undef EXCLUDE
[41]174
[491]175
[41]176;--------------------------------------------------------------------
[52]177; DisplayContext_PrepareOffScreenBufferInESBXwithLengthInCX
[48]178; Parameters:
[52]179; CX: Off screen buffer length in characters
180; ES:BX: Ptr to off screen buffer
[48]181; Returns:
182; Nothing
183; Corrupts registers:
[52]184; AX, DI
[48]185;--------------------------------------------------------------------
[592]186%ifndef EXCLUDE_FROM_XUB OR EXCLUDE_FROM_BIOSDRVS
[369]187ALIGN DISPLAY_JUMP_ALIGN
[52]188DisplayContext_PrepareOffScreenBufferInESBXwithLengthInCX:
[48]189 push ds
190
191 LOAD_BDA_SEGMENT_TO ds, di
192 xchg ax, bx
193 mov bx, es
194 call DisplayContext_SetCharacterPointerFromBXAX ; ES:DI now has the pointer
195
196 mov bl, ATTRIBUTES_NOT_USED
197 mov ax, BUFFER_OUTPUT_WITH_CHAR_ONLY
198 call DisplayContext_SetCharOutputFunctionFromAXwithAttribFlagInBL
[52]199 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam], cx
[48]200
201 mov bx, di
202 pop ds
203 ret
[592]204%endif ; EXCLUDE_FROM_XUB OR EXCLUDE_FROM_BIOSDRVS
[48]205
206
207;--------------------------------------------------------------------
[41]208; DisplayContext_SetCharacterPointerFromBXAX
209; Parameters:
210; BX:AX: Ptr to destination for next character to output
211; DS: BDA segment (zero)
212; Returns:
[48]213; ES:DI: Pointer that was in BX:AX
[41]214; Corrupts registers:
215; AX
216;--------------------------------------------------------------------
[592]217%ifndef EXCLUDE_FROM_XUB OR EXCLUDE_FROM_BIOSDRVS
[369]218ALIGN DISPLAY_JUMP_ALIGN
[41]219DisplayContext_SetCharacterPointerFromBXAX:
220 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], ax
221 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2], bx
222 xchg di, ax
223 mov es, bx
224 ret
[133]225%endif
[41]226
227
228;--------------------------------------------------------------------
229; DisplayContext_GetCharacterPointerToBXAX
230; Parameters:
231; DS: BDA segment (zero)
232; Returns:
233; BX:AX: Ptr to destination for next character to output
234; Corrupts registers:
235; Nothing
236;--------------------------------------------------------------------
[592]237%ifndef EXCLUDE_FROM_XUB OR EXCLUDE_FROM_BIOSDRVS
[369]238ALIGN DISPLAY_JUMP_ALIGN
[41]239DisplayContext_GetCharacterPointerToBXAX:
240 mov ax, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition]
241 mov bx, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2]
242 ret
[133]243%endif
[41]244
245
[592]246%ifdef EXCLUDE_FROM_XUB
[491]247 %ifndef MODULE_BOOT_MENU
248 %define EXCLUDE
249 %endif
250%endif
[41]251;--------------------------------------------------------------------
[45]252; DisplayContext_SetCharOutputFunctionFromAXwithAttribFlagInBL
[41]253; Parameters:
254; AX: Offset to character output function
[45]255; BL: Attribute Flag
[41]256; DS: BDA segment (zero)
257; Returns:
258; Nothing
259; Corrupts registers:
[50]260; BL
[41]261;--------------------------------------------------------------------
[491]262%ifndef EXCLUDE ; 1 of 3
[369]263ALIGN DISPLAY_JUMP_ALIGN
[45]264DisplayContext_SetCharOutputFunctionFromAXwithAttribFlagInBL:
[50]265 and bl, FLG_CONTEXT_ATTRIBUTES
266 and BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], ~FLG_CONTEXT_ATTRIBUTES
267 or [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], bl
[41]268 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut], ax
269 ret
[491]270%endif
[41]271
[489]272
[41]273;--------------------------------------------------------------------
274; DisplayContext_SetCharacterAttributeFromAL
275; Parameters:
276; AL: Character attribute
277; DS: BDA segment (zero)
278; Returns:
279; Nothing
280; Corrupts registers:
281; Nothing
282;--------------------------------------------------------------------
[491]283%ifndef EXCLUDE ; 2 of 3
[592]284%ifndef EXCLUDE_FROM_BIOSDRVS
[369]285ALIGN DISPLAY_JUMP_ALIGN
[41]286DisplayContext_SetCharacterAttributeFromAL:
287 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute], al
288 ret
[491]289%endif
[592]290%endif
[41]291
292
293;--------------------------------------------------------------------
294; DisplayContext_SetCharacterOutputParameterFromAX
295; Parameters:
296; AX: Parameter for Character Output function
297; DS: BDA segment (zero)
298; Returns:
299; Nothing
300; Corrupts registers:
301; Nothing
302;--------------------------------------------------------------------
[491]303%ifndef EXCLUDE ; 3 of 3
[592]304%ifndef EXCLUDE_FROM_BIOSDRVS
[369]305ALIGN DISPLAY_JUMP_ALIGN
[41]306DisplayContext_SetCharacterOutputParameterFromAX:
307 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam], ax
308 ret
[491]309%endif
[592]310%endif
[491]311
312%undef EXCLUDE
313
314
[41]315;--------------------------------------------------------------------
316; DisplayContext_GetCharacterOutputParameterToDX
317; Parameters:
318; DS: BDA segment (zero)
319; Returns:
320; DX: User parameter for Character Output function
321; Corrupts registers:
322; Nothing
[133]323;--------------------------------------------------------------------
[592]324%ifndef EXCLUDE_FROM_XUB OR EXCLUDE_FROM_XTIDECFG OR EXCLUDE_FROM_BIOSDRVS
[369]325ALIGN DISPLAY_JUMP_ALIGN
[181]326DisplayContext_GetCharacterOutputParameterToDX:
327 mov dx, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam]
328 ret
329%endif
[44]330
331
332;--------------------------------------------------------------------
333; DisplayContext_GetCharacterOffsetToAXfromByteOffsetInAX
334; Parameters:
335; AX: Offset in bytes from some character to another
336; DS: BDA segment (zero)
337; Returns:
338; AX: Offset in characters from some character to another
339; Corrupts registers:
340; Nothing
[133]341;--------------------------------------------------------------------
[201]342%ifndef MODULE_STRINGS_COMPRESSED
[369]343ALIGN DISPLAY_JUMP_ALIGN
[44]344DisplayContext_GetCharacterOffsetToAXfromByteOffsetInAX:
345 test BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], FLG_CONTEXT_ATTRIBUTES
346 jz SHORT ReturnOffsetInAX
347 sar ax, 1 ; BYTE count to WORD count
348 ret
[194]349%endif
[44]350
[491]351
[44]352;--------------------------------------------------------------------
353; DisplayContext_GetByteOffsetToAXfromCharacterOffsetInAX
354; Parameters:
355; AX: Offset in characters from some character to another
356; DS: BDA segment (zero)
357; Returns:
358; AX: Offset in bytes from some character to another
359; Corrupts registers:
360; Nothing
[133]361;--------------------------------------------------------------------
[201]362%ifndef MODULE_STRINGS_COMPRESSED
[369]363ALIGN DISPLAY_JUMP_ALIGN
[44]364DisplayContext_GetByteOffsetToAXfromCharacterOffsetInAX:
365 test BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], FLG_CONTEXT_ATTRIBUTES
366 jz SHORT ReturnOffsetInAX
367 sal ax, 1 ; WORD count to BYTE count
[369]368ALIGN DISPLAY_JUMP_ALIGN, ret
[44]369ReturnOffsetInAX:
370 ret
[194]371%endif
Note: See TracBrowser for help on using the repository browser.