1 | ; File name : Display.inc |
---|
2 | ; Project name : AssemblyLibrary |
---|
3 | ; Created date : 25.6.2010 |
---|
4 | ; Last update : 28.9.2010 |
---|
5 | ; Author : Tomi Tilli |
---|
6 | ; Description : Defines for display library. |
---|
7 | %ifndef DISPLAY_INC |
---|
8 | %define DISPLAY_INC |
---|
9 | |
---|
10 | ;-------------------------------------------------------------------- |
---|
11 | ; Display Library users need to use this macro since it will provide |
---|
12 | ; compatibility with future library versions. |
---|
13 | ; |
---|
14 | ; CALL_DISPLAY_LIBRARY |
---|
15 | ; Parameters: |
---|
16 | ; %1: Function to call (functionName from DISPLAY_LIB) |
---|
17 | ; Registers: Depends on function to call |
---|
18 | ; Returns: |
---|
19 | ; Depends on function to call |
---|
20 | ; Corrupts registers: |
---|
21 | ; AX (unless used as a return register), DI |
---|
22 | ;-------------------------------------------------------------------- |
---|
23 | %macro CALL_DISPLAY_LIBRARY 1 |
---|
24 | %ifidn %1, PushDisplayContext |
---|
25 | call DisplayContext_Push |
---|
26 | %elifidn %1, PopDisplayContext |
---|
27 | call DisplayContext_Pop |
---|
28 | %else |
---|
29 | mov di, DISPLAY_LIB.%1 |
---|
30 | call Display_FunctionFromDI |
---|
31 | %endif |
---|
32 | %endmacro |
---|
33 | |
---|
34 | |
---|
35 | ; Display library functions |
---|
36 | struc DISPLAY_LIB |
---|
37 | .PushDisplayContext: |
---|
38 | .PopDisplayContext: |
---|
39 | .InitializeDisplayContext resb 2 |
---|
40 | |
---|
41 | .SetCharacterPointerFromBXAX resb 2 |
---|
42 | .SetCharOutputFunctionFromAXwithAttribFlagInBL resb 2 |
---|
43 | .SetCharacterOutputParameterFromAX resb 2 |
---|
44 | .SetCharacterAttributeFromAL resb 2 |
---|
45 | .SetCursorShapeFromAX resb 2 |
---|
46 | .SetCursorCoordinatesFromAX resb 2 |
---|
47 | .SetNewPageFromAL resb 2 |
---|
48 | .SynchronizeDisplayContextToHardware resb 2 |
---|
49 | |
---|
50 | .GetCharacterPointerToBXAX resb 2 |
---|
51 | .GetSoftwareCoordinatesToAX resb 2 |
---|
52 | .GetColumnsToALandRowsToAH resb 2 |
---|
53 | |
---|
54 | .FormatNullTerminatedStringFromCSSI resb 2 |
---|
55 | .PrintSignedWordFromAXWithBaseInBX resb 2 |
---|
56 | .PrintWordFromAXwithBaseInBX resb 2 |
---|
57 | .PrintCharBufferFromBXSIwithLengthInCX resb 2 |
---|
58 | .PrintNullTerminatedStringFromBXSI resb 2 |
---|
59 | .PrintNullTerminatedStringFromCSSI resb 2 |
---|
60 | .PrintRepeatedCharacterFromALwithCountInCX resb 2 |
---|
61 | .PrintCharacterFromAL resb 2 |
---|
62 | .PrintNewlineCharacters resb 2 |
---|
63 | .ClearAreaWithHeightInAHandWidthInAL resb 2 |
---|
64 | .ClearScreen resb 2 |
---|
65 | endstruc |
---|
66 | |
---|
67 | ; Attribute flags for DISPLAY_LIB.SetCharacterOutputFunctionFromAXwithAttributeFlagInDL |
---|
68 | ATTRIBUTES_NOT_USED EQU 0 |
---|
69 | ATTRIBUTES_ARE_USED EQU FLG_CONTEXT_ATTRIBUTES |
---|
70 | |
---|
71 | ; Character output functions for DISPLAY_LIB.SetCharacterOutputFunctionFromAXwithAttributeFlagInDL |
---|
72 | TELETYPE_OUTPUT_WITH_ATTRIBUTE EQU DisplayCharOut_TeletypeOutputWithAttribute |
---|
73 | TELETYPE_OUTPUT_WITHOUT_ATTRIBUTE EQU DisplayCharOut_TeletypeOutput |
---|
74 | TELETYPE_OUTPUT_USING_BIOS EQU DisplayCharOut_BiosTeletypeOutput |
---|
75 | FAST_OUTPUT_WITH_ATTRIBUTE_ONLY EQU DisplayCharOut_Attribute |
---|
76 | FAST_OUTPUT_WITH_CHAR_ONLY EQU DisplayCharOut_Character |
---|
77 | FAST_OUTPUT_WITH_CHAR_AND_ATTRIBUTE EQU DisplayCharOut_CharacterWithAttribute |
---|
78 | BUFFER_OUTPUT_WITH_CHAR_ONLY EQU DisplayCharOut_WriteCharacterToBuffer |
---|
79 | |
---|
80 | DEFAULT_CHARACTER_OUTPUT EQU TELETYPE_OUTPUT_WITH_ATTRIBUTE |
---|
81 | |
---|
82 | |
---|
83 | struc VIDEO_BDA |
---|
84 | resb 449h |
---|
85 | .bMode resb 1 ; 0:449h, Video, Mode |
---|
86 | .wColumns resb 2 ; 0:44Ah, Video, Number of columns |
---|
87 | .wBytesPerPage resb 2 ; 0:44Ch, Video, Total number of bytes per page |
---|
88 | .wPageOffset resb 2 ; 0:44Eh, Video, Current page offset |
---|
89 | .rgwCursors resb 4 ; 0:450h, Video, Cursor position, pages 0...1 |
---|
90 | .displayContext resb 12 ; Our own display context (normally cursors for pages 2...7) |
---|
91 | .wCursorShape resb 2 ; 0:460h, Video, Cursor shape |
---|
92 | .bActivePage resb 1 ; 0:462h, Video, Active display page |
---|
93 | .wVideoPort resb 2 ; 0:463h, Video, I/O Port number base |
---|
94 | .bInternalModeReg resb 1 ; 0:465h, Video, Internal mode register |
---|
95 | .bColorPalette resb 1 ; 0:466h, Video, Color palette |
---|
96 | endstruc |
---|
97 | |
---|
98 | struc DISPLAY_CONTEXT |
---|
99 | .fpCursorPosition resb 4 ; Far pointer to cursor position in video memory |
---|
100 | .fnCharOut resb 2 ; Function to draw character with |
---|
101 | .wCharOutParam resb 2 ; User parameter for custom character output function |
---|
102 | .wCursorShape resb 2 ; Current cursor shape |
---|
103 | .bAttribute resb 1 ; Selected character attribute |
---|
104 | .bFlags resb 1 ; Display context flags |
---|
105 | endstruc |
---|
106 | |
---|
107 | ; Display context flags |
---|
108 | FLG_CONTEXT_ATTRIBUTES EQU (1<<0) ; Character output function uses attributes |
---|
109 | |
---|
110 | |
---|
111 | ; Text mode character attribute byte bits for CGA+ (color adapters) |
---|
112 | FLG_COLOR_FORE_BLUE EQU (1<<0) |
---|
113 | FLG_COLOR_FORE_GREEN EQU (1<<1) |
---|
114 | FLG_COLOR_FORE_RED EQU (1<<2) |
---|
115 | FLG_COLOR_FORE_INTENSITY EQU (1<<3) |
---|
116 | FLG_COLOR_FORE_FONT_B EQU (1<<3) ; Select font set B (if available, EGA+) |
---|
117 | FLG_COLOR_BACK_BLUE EQU (1<<4) |
---|
118 | FLG_COLOR_BACK_GREEN EQU (1<<5) |
---|
119 | FLG_COLOR_BACK_RED EQU (1<<6) |
---|
120 | FLG_COLOR_BACK_INTENSITY EQU (1<<7) ; Intensity when blinking is disabled |
---|
121 | FLG_COLOR_BLINK EQU (1<<7) ; Blinking color when enabled (enabled by default) |
---|
122 | |
---|
123 | ; CGA colors |
---|
124 | %define COLOR_ATTRIBUTE(foreground, background) ( (foreground) | ((background)<<4) ) |
---|
125 | COLOR_BLACK EQU 0 |
---|
126 | COLOR_BLUE EQU 1 |
---|
127 | COLOR_GREEN EQU 2 |
---|
128 | COLOR_CYAN EQU 3 |
---|
129 | COLOR_RED EQU 4 |
---|
130 | COLOR_MAGENTA EQU 5 |
---|
131 | COLOR_BROWN EQU 6 |
---|
132 | COLOR_WHITE EQU 7 ; Last background color if blinking enabled |
---|
133 | COLOR_GRAY EQU 8 |
---|
134 | COLOR_LIGHT_BLUE EQU 9 |
---|
135 | COLOR_LIGHT_GREEN EQU 10 |
---|
136 | COLOR_LIGHT_CYAN EQU 11 |
---|
137 | COLOR_LIGHT_RED EQU 12 |
---|
138 | COLOR_LIGHT_MAGENTA EQU 13 |
---|
139 | COLOR_YELLOW EQU 14 |
---|
140 | COLOR_BRIGHT_WHITE EQU 15 |
---|
141 | |
---|
142 | |
---|
143 | ; Text mode character attribute byte bits for MDA (monochrome adapters) |
---|
144 | ; (attributes 00h, 08h, 80h, 88h, 70h, 78h, F0h and F8h are exceptions) |
---|
145 | FLG_MONO_UNDERLINE EQU (1<<1) |
---|
146 | FLG_MONO_INTENSITY EQU (1<<3) |
---|
147 | FLG_MONO_BLINK EQU (1<<7) |
---|
148 | |
---|
149 | ; Text mode character attribute bytes for MDA/Hercules (monochrome adapters) |
---|
150 | ; *Not displayed on some monitors |
---|
151 | MONO_HIDDEN EQU 00h ; Not displayed (same for 08h, 80h and 88h) |
---|
152 | MONO_UNDERLINE EQU 01h ; Underlined |
---|
153 | MONO_NORMAL EQU 07h ; Normal (white on black) |
---|
154 | MONO_BRIGHT_UNDERLINE EQU 09h ; High intensity, underlined |
---|
155 | MONO_BRIGHT EQU 0Fh ; High intensity |
---|
156 | MONO_REVERSE EQU 70h ; Reverse video (black on white) |
---|
157 | MONO_REVERSE_DARK EQU 78h ; (dark green on green) |
---|
158 | MONO_BLINK EQU 87h ; Blinking white on black* |
---|
159 | MONO_BRIGHT_BLINK EQU 8Fh ; Blinking high intensity* |
---|
160 | MONO_REVERSE_BLINK EQU 0F0h ; Blinking reverse video |
---|
161 | MONO_REVERSE_DARK_BLINK EQU 0F8h ; (blinking dark green on green) |
---|
162 | |
---|
163 | |
---|
164 | ; Cursor position macro for DX register |
---|
165 | %define CURSOR_XY(x, y) ( (x) | ((y)<<8) ) |
---|
166 | |
---|
167 | ; Cursor shapes |
---|
168 | CURSOR_NORMAL EQU 0607h ; Two line cursor near or at the bottom of cell |
---|
169 | CURSOR_HIDDEN EQU 2000h |
---|
170 | |
---|
171 | |
---|
172 | ; Display modes |
---|
173 | CGA_TEXT_MODE_BW40 EQU 0 ; Applications should use... |
---|
174 | CGA_TEXT_MODE_CO40 EQU 1 |
---|
175 | CGA_TEXT_MODE_BW80 EQU 2 ; ..black, white and bright white attributes only |
---|
176 | CGA_TEXT_MODE_CO80 EQU 3 |
---|
177 | MDA_TEXT_MODE EQU 7 ; Real monochrome attributes available |
---|
178 | |
---|
179 | |
---|
180 | ; Display segments |
---|
181 | COLOR_TEXT_SEGMENT EQU 0B800h ; Text modes 0...3 (CGA+) |
---|
182 | MONO_TEXT_SEGMENT EQU 0B000h ; Text mode 7 (MDA, Hercules) |
---|
183 | |
---|
184 | |
---|
185 | ; Control characters for teletype output |
---|
186 | NULL EQU 00h |
---|
187 | SOH EQU 01h ; Start of heading |
---|
188 | STX EQU 02h ; Start of text |
---|
189 | BELL EQU 07h ; Bell |
---|
190 | BS EQU 08h ; Backspace |
---|
191 | TAB EQU 09h ; Horizontal TAB |
---|
192 | LF EQU 0Ah ; Line feed (newline) |
---|
193 | CR EQU 0Dh ; Carriage return |
---|
194 | ESC EQU 1Bh ; Escape |
---|
195 | |
---|
196 | ; Non ASCII characters (code page 437) |
---|
197 | DOUBLE_TOP_RIGHT_CORNER EQU 187 |
---|
198 | DOUBLE_TOP_LEFT_CORNER EQU 201 |
---|
199 | DOUBLE_BOTTOM_RIGHT_CORNER EQU 188 |
---|
200 | DOUBLE_BOTTOM_LEFT_CORNER EQU 200 |
---|
201 | DOUBLE_VERTICAL EQU 186 |
---|
202 | DOUBLE_HORIZONTAL EQU 205 |
---|
203 | DOUBLE_VERTICAL_TO_RIGHT_SINGLE EQU 199 |
---|
204 | DOUBLE_VERTICAL_TO_LEFT_SINGLE EQU 182 |
---|
205 | DOUBLE_LEFT_HORIZONTAL_TO_SINGLE_VERTICAL EQU 181 |
---|
206 | DOUBLE_RIGHT_HORIZONTAL_TO_SINGLE_VERTICAL EQU 198 |
---|
207 | SINGLE_HORIZONTAL EQU 196 |
---|
208 | SINGLE_LEFT_HORIZONTAL_TO_VERTICAL EQU 180 |
---|
209 | SINGLE_RIGHT_HORIZONTAL_TO_VERTICAL EQU 195 |
---|
210 | ANGLE_QUOTE_LEFT EQU 174 |
---|
211 | ANGLE_QUOTE_RIGHT EQU 175 |
---|
212 | BLOCK_MOSTLY_BACKGROUND EQU 176 |
---|
213 | BLOCK_EVEN_BACKGROUND_AND_FOREGROUND EQU 177 |
---|
214 | BLOCK_MOSTLY_FOREGROUND EQU 178 |
---|
215 | BLOCK_FULL_FOREGROUND EQU 219 |
---|
216 | |
---|
217 | |
---|
218 | ; Background character for clearing screen |
---|
219 | %ifndef SCREEN_BACKGROUND_CHARACTER |
---|
220 | %define SCREEN_BACKGROUND_CHARACTER BLOCK_MOSTLY_BACKGROUND |
---|
221 | %endif |
---|
222 | %ifndef SCREEN_BACKGROUND_ATTRIBUTE |
---|
223 | %define SCREEN_BACKGROUND_ATTRIBUTE MONO_NORMAL |
---|
224 | %endif |
---|
225 | |
---|
226 | %endif ; DISPLAY_INC |
---|