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
|