summaryrefslogtreecommitdiffstats
path: root/yotlibc/char_vga.s
blob: 6ac1c206683049afd2f0f113a9cb2295fcb7f903 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
global _char_vga_get_cursor
global _char_vga_set_cursor
global _char_vga_tobios
global _char_vga_frombios
global _char_vga_memread    ; NOT A FUNCTION!
global _char_vga_memwrite   ; NOT A FUNCTION!
global _char_vga_cursor_x
global _char_vga_cursor_y

global _chv_memread
global _chv_memwrite

_char_vga_cursor_x: dw 0
_char_vga_cursor_y: dw 0

_char_vga_get_cursor:
    push    bp
    mov     bp, sp
    xor     cx, cx          ; cx=result

    mov     dx, 0x3D4
    mov     al, 0x0E
    out     dx, al          ; read high byte

    mov     dx, 0x3D5
    in      al, dx
    mov     ch, al

    mov     dx, 0x3D4
    mov     al, 0x0F
    out     dx, al          ; read low byte

    mov     dx, 0x3D5
    in      al, dx
    mov     cl, al

    mov     ax, cx          ; set return value

    mov     sp, bp
    pop     bp
    ret


_char_vga_set_cursor:
    push    bp
    mov     bp, sp
    mov     cx, [bp+4]      ; cx=argument

    mov     dx, 0x3D4
    mov     al, 0x0E
    out     dx, al          ; send high byte

    mov     dx, 0x3D5
    mov     al, ch
    out     dx, al

    mov     dx, 0x3D4
    mov     al, 0x0F
    out     dx, al          ; send low byte

    mov     dx, 0x3D5
    mov     al, cl
    out     dx, al

    mov     sp, bp
    pop     bp
    ret

_char_vga_tobios:
    push    bp
    mov     bp, sp
    
    mov     cx, bx      ; preserve bx

    mov     ah, 0x0f
    int     0x10        ; bh is set by int 0x10, ah=0x0f
    mov     dl, [_char_vga_cursor_x]
    mov     dh, [_char_vga_cursor_y]
    mov     ah, 0x02
    int     0x10

    mov     bx, cx      ; restore bx

    mov     sp, bp
    pop     bp
    ret
    
_char_vga_frombios:
    push    bp
    mov     bp, sp
    
    mov     cx, bx      ; preserve bx

    mov     ah, 0x0f
    int     0x10        ; bh is set by int 0x10, ah=0x0f
    mov     [_char_vga_cursor_x], dl
    mov     [_char_vga_cursor_y], dh
    mov     ah, 0x03
    int     0x10

    mov     bx, cx      ; restore bx

    mov     sp, bp
    pop     bp
    ret

_char_vga_memread:      ; al=result, bx=addr
    mov     dx, 0xb800
    mov     fs, dx
    mov     al, [fs:bx]
    ret

_char_vga_memwrite:     ; al=value, bx=addr
    mov     dx, 0xb800
    mov     fs, dx
    mov     [fs:bx], al
    ret

_chv_memread:
    push    bp
    mov     bp,sp

    mov     bx, [bp+4]
    call    _char_vga_memread
    xor     ah, ah

    mov     sp, bp
    pop     bp
    ret 
    
_chv_memwrite:
    push    bp
    mov     bp,sp

    mov     bx, [bp+4]
    mov     al, [bp+6]
    call    _char_vga_memwrite

    mov     sp, bp
    pop     bp
    ret