source: xtideuniversalbios/trunk/Assembly_Library/Src/Display/DisplayCursor.asm@ 396

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

WIDE checkin... Added copyright and license information to sorce files, as per the GPL instructions for usage.

File size: 5.5 KB
Line 
1; Project name : Assembly Library
2; Description : Functions for managing display cursor.
3
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
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; DisplayCursor_SetShapeFromAX
25; Parameters:
26; AX: Cursor shape (AH=Start scan line, AL=End scan line)
27; DS: BDA segment (zero)
28; Returns:
29; Nothing
30; Corrupts registers:
31; Nothing
32;--------------------------------------------------------------------
33ALIGN DISPLAY_JUMP_ALIGN
34DisplayCursor_SetShapeFromAX:
35 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCursorShape], ax
36 ret
37
38
39;--------------------------------------------------------------------
40; DisplayCursor_SetCoordinatesFromAX
41; Parameters:
42; AL: Cursor column (X-coordinate)
43; AH: Cursor row (Y-coordinate)
44; DS: BDA segment (zero)
45; Returns:
46; DI: Offset to cursor location in video RAM
47; Corrupts registers:
48; AX, DX
49;--------------------------------------------------------------------
50ALIGN DISPLAY_JUMP_ALIGN
51DisplayCursor_SetCoordinatesFromAX:
52 xchg dx, ax
53 mov ax, [VIDEO_BDA.wColumns] ; Column count, 40 or 80
54 mul dh ; AX = Column count * row index
55 xor dh, dh
56 add ax, dx ; Add column offset
57 shl ax, 1 ; Convert to WORD offset
58 add ax, [VIDEO_BDA.wPageOffset] ; AX = Video RAM offset
59 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], ax
60 xchg di, ax
61 ret
62
63
64;--------------------------------------------------------------------
65; DisplayCursor_GetSoftwareCoordinatesToAX
66; Parameters:
67; AX: Offset to cursor location in selected page
68; DS: BDA segment (zero)
69; Returns:
70; AL: Cursor column (X-coordinate)
71; AH: Cursor row (Y-coordinate)
72; Corrupts registers:
73; Nothing
74;--------------------------------------------------------------------
75ALIGN DISPLAY_JUMP_ALIGN
76DisplayCursor_GetSoftwareCoordinatesToAX:
77 mov ax, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition]
78 sub ax, [VIDEO_BDA.wPageOffset]
79 shr ax, 1 ; WORD offset to character offset
80 div BYTE [VIDEO_BDA.wColumns] ; AL = full rows, AH = column index for last row
81 xchg al, ah
82 ret
83
84
85;--------------------------------------------------------------------
86; DisplayCursor_GetHardwareCoordinatesToAX
87; Parameters:
88; DS: BDA segment (zero)
89; Returns:
90; AL: Hardware cursor column (X-coordinate)
91; AH: Hardware cursor row (Y-coordinate)
92; Corrupts registers:
93; DX
94;--------------------------------------------------------------------
95ALIGN DISPLAY_JUMP_ALIGN
96DisplayCursor_GetHardwareCoordinatesToAX:
97 push cx
98 push bx
99
100 mov ah, GET_CURSOR_POSITION_AND_SIZE
101 mov bh, [VIDEO_BDA.bActivePage]
102 int BIOS_VIDEO_INTERRUPT_10h
103 xchg ax, dx
104
105 pop bx
106 pop cx
107 ret
108
109
110;--------------------------------------------------------------------
111; DisplayCursor_SynchronizeShapeToHardware
112; Parameters:
113; DS: BDA segment (zero)
114; Returns:
115; Nothing
116; Corrupts registers:
117; AX, DX
118;--------------------------------------------------------------------
119ALIGN DISPLAY_JUMP_ALIGN
120DisplayCursor_SynchronizeShapeToHardware:
121 mov dx, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCursorShape]
122 ; Fall to .SetHardwareCursorShapeFromDX
123
124;--------------------------------------------------------------------
125; .SetHardwareCursorShapeFromDX
126; Parameters:
127; DX: Cursor shape
128; DS: BDA segment (zero)
129; Returns:
130; Nothing
131; Corrupts registers:
132; AX
133;--------------------------------------------------------------------
134.SetHardwareCursorShapeFromDX:
135 cmp dx, [VIDEO_BDA.wCursorShape]
136 je SHORT .Return ; Return if no changes
137 push cx
138 mov cx, dx ; BIOS wants cursor shape in CX
139 mov al, [VIDEO_BDA.bMode] ; Load video mode to prevent lock ups on some BIOSes
140 mov ah, SET_TEXT_MODE_CURSOR_SHAPE
141 int BIOS_VIDEO_INTERRUPT_10h
142 pop cx
143.Return:
144 ret
145
146
147;--------------------------------------------------------------------
148; DisplayCursor_SynchronizeCoordinatesToHardware
149; Parameters:
150; DS: BDA segment (zero)
151; Returns:
152; Nothing
153; Corrupts registers:
154; AX, DX
155;--------------------------------------------------------------------
156ALIGN DISPLAY_JUMP_ALIGN
157DisplayCursor_SynchronizeCoordinatesToHardware:
158 call DisplayCursor_GetSoftwareCoordinatesToAX
159 ; Fall to .SetHardwareCursorCoordinatesFromAX
160
161;--------------------------------------------------------------------
162; .SetHardwareCursorCoordinatesFromAX
163; Parameters:
164; AL: Cursor column (X-coordinate)
165; AH: Cursor row (Y-coordinate)
166; DS: BDA segment (zero)
167; Returns:
168; Nothing
169; Corrupts registers:
170; AX, DX
171;--------------------------------------------------------------------
172.SetHardwareCursorCoordinatesFromAX:
173 push bx
174 xchg dx, ax ; BIOS wants coordinates in DX
175 mov ah, SET_CURSOR_POSITION
176 mov bh, [VIDEO_BDA.bActivePage]
177 int BIOS_VIDEO_INTERRUPT_10h
178 pop bx
179 ret
Note: See TracBrowser for help on using the repository browser.