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

Last change on this file since 101 was 101, checked in by aitotat, 13 years ago

Changes to Assembly Library:

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