Search code examples
assemblynasmx86-16bootloaderbios

How to move the cursor with x86 BIOS calls?


I'm doing some operating system tutorials from the book "Operating systems from 0 to 1". One of the exercises is to set the cursor to a position on the screen in the bootloader. However, no matter what I try, the cursor only stays in the same position, at the top left.

To make things more confusing, in the book, it mentions that the registers I need to set before raising interrupt 10h are bh for the Y coordinate and bl for the X coordinate. Wikipedia mentions bh for page number, dh and dl for the row and column. Neither of these methods have worked for me.

Here is the function I am using (using the book method):

MovCursor:
    pusha

    mov ah, 0x02

    mov bh, 0x1
    mov bl, 0x4

    int 0x10

    popa

Any help to tell me what I am doing wrong would be greatly appreciated.


Solution

  • The Wikipedia register settings are correct. From your saying that "Neither of these methods have worked for me", I conclude that you have tried the Wikipedia version too. It's a pity I can't verify your code since you didn't include it in your question.

    A few points to consider regarding the cursor:

    • On a graphics screen the cursor is never rendered. The coordinates change but it stays invisible1. On a text screen the cursor defaults to a blinking underline.
    • The coordinates (column and row) of the cursor are zero-based. The upperleft corner of the screen is at (0,0).
    • The cursor will disappear if you position it off screen.
    • You can change the shape of the cursor with BIOS.SetCursorType function 01h. You can also make it disappear this way!

    Next code displays a string of colored A's in the middle of the screen:

    mov  ax, 0003h    ; BIOS.SetVideoMode 80x25 16-color text
    int  10h
    
    mov  dx, 0C23h    ; DH is Row (12), DL is Column (35)
    mov  bh, 0        ; DisplayPage
    mov  ah, 02h      ; BIOS.SetCursorPosition
    int  10h
    
    mov  cx, 10       ; ReplicationCount
    mov  bx, 002Fh    ; BH is DisplayPage (0) , BL is Attribute (BrightWhiteOnGreen)
    mov  ax, 0941h    ; BIOS.WriteCharacterAndAttribute, AL is ASCII ("A")
    int  10h
    
    mov  ah, 00h      ; BIOS.WaitKeyboardKey
    int  16h          ; -> AX
    

    1 For some light reading How can I add a blinking cursor to the graphics video modes?