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

Last change on this file since 85 was 41, checked in by Tomi Tilli, 14 years ago

Initial commit for Assembly Library.

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