Anonymous user
Text Mode Cursor: Difference between revisions
Finished rewriting page, added a few sections
[unchecked revision] | [unchecked revision] |
(Rewrote most of the page) |
(Finished rewriting page, added a few sections) |
||
Line 1:
In [[text mode]], the cursor does not work the same way as in high-level languages, automatically moving to one place after the last written character. Instead, it is simply a blinking area that can be resized, shown, hidden, and moved by the OS.
==With the BIOS==
To manipulate the cursor with the [[BIOS]], use int 0x10, the interrupt for screen functions.
===
Enabling the cursor also allows you to set the start and end scanlines, the rows where the cursor starts and ends. The highest scanline is 0 and the lowest scanline is the maximum scanline (usually 15).
* AH = 0x01
* CH = start scanline
* CL = end scanline
===Disabling the Cursor===
* AH = 0x01
* CH = 0x3F (bits 0-7 unused, bit 5 disables cursor, bits 0-4 control cursor shape)
===Moving the Cursor===
* AH = 0x02
* BH = display page (usually, if not always 0)
* DH = row
* DL = column
===Get Cursor Data===
* AH = 0x03
* BH = display page (usually, if not always 0)
The return values:
* CH = start scanline
* CL = end scanline
* DH = row
* DL = column
==Without the BIOS==
Without [[BIOS]] access, manipulating the cursor requires sending data directly to the hardware.
==
'''Source in C'''
Line 100 ⟶ 58:
</source>
'''Source in Assembly'''
TODO
===Disabling the Cursor===
'''Source in C'''
Line 129 ⟶ 79:
disable_cursor:
pushf
push
push
mov dx, 0x3D4
mov al,
out dx, al
inc dx
mov al, 0x3F ; bits 6-7
out dx, al
pop
pop eax
popf
ret
</source>
===Moving the Cursor===
Keep in mind that you don't need to update the cursor's location every time a new character is displayed. It would be faster to instead only update it after printing an entire string.
'''Source in C'''
<source lang="c">
void update_cursor(int x, int y)
{
uint16_t pos = y * VGA_WIDTH + x;
outb(0x3D4, 0x0F);
outb(0x3D5, (uint8_t) (pos & 0xFF));
outb(0x3D4, 0x0E);
outb(0x3D5, (uint8_t) ((pos >> 8) & 0xFF));
}
</source>
'''Source in Assembly'''
<source lang="asm">
; BL = x
; BH = y
update_cursor:
pushfq
push eax
push ebx
push ecx
push edx
; position = x * VGA_HEIGHT + y
mov ax, bx
and ax, 0FFh
mov cl, VGA_HEIGHT
mul cl
mov cx, bx
shr cx, 8
add ax, cx
mov cx, ax
; cursor low port to VGA index register
mov al, 0Fh
mov dx, 3D4h
out dx, al
; cursor low position to VGA data register
mov ax, cx
mov dx, 3D5h
out dx, al
; cursor high port to VGA index register
mov al, 0Eh
mov dx, 3D4h
out dx, al
; cursor high position to VGA data register
mov ax, cx
shr ax, 8
mov dx, 3D5h
out dx, al
pop edx
pop ecx
pop ebx
pop eax
popfq
ret
</source>
==A Note on GRUB==
If the timeout is set to 0 in your grub.cfg, the cursor will be disabled and you will need to enable it yourself. Otherwise, [[GRUB]] will enable the cursor for you. Because of this inconsistency, it is a good idea to always enable the cursor. Even if you don't set the timeout to 0, you might want to in the future, or someone might change it on their system.
==See Also==
* [http://wiki.osdev.org/VGA_Hardware VGA Hardware]
* [http://wiki.osdev.org/Text_UI Text UI]
===External Links===
* http://www.
* https://web.archive.org/web/20080731014051/http://www.bookcase.com:80/library/dos/ints/int10.html
* https://web.archive.org/web/20120324083032/http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_13/CH13-2.html
[[Category:Video]]
|