-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.asm
More file actions
216 lines (181 loc) · 4.08 KB
/
utils.asm
File metadata and controls
216 lines (181 loc) · 4.08 KB
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
[bits 16]
global get_kb_char, write_str, write_char, set_char, get_char
global sleep, read_disk, get_cursor, move_cursor, clear_scn
_start:
;==========================================================
; get_kb_char:
; get the keyboard character
; return: al -> ASCII character of the key pressed
;==========================================================
get_kb_char:
mov ah, 10h
int 16h
ret
;==========================================================
; get_char:
; get the character at the current cursor position
; return: al -> the character
;==========================================================
get_char:
mov bh, 0h
mov ah, 08h
int 10h
ret
;==========================================================
; set_char:
; set a char at the given position
; paramaters:
; 0: char to set
; 1: row and column of the position
;==========================================================
set_char:
enter 0, 0
push bx
mov bh, 0
mov dx, [bp+6]
mov ah, 02h
int 10h
mov al, [bp+4]
mov bx, 0fh
mov cx, 1
mov ah, 09h
int 10h
pop bx
leave
ret
;==========================================================
; write_str:
; paramaters:
; 0: offset of the string to write (!!!ds)
; 1: length of the string
; 2: row and column of the position
;==========================================================
write_str:
enter 0, 0
push bx
mov dx, [bp+8]
mov cx, [bp+6]
push bp
mov bp, [bp+4]
mov ax, ds
mov es, ax
mov ah, 13h
mov al, 1h
mov bx, 05h
int 10h
pop bp
pop bx
leave
ret
;==========================================================
; write_char:
; write a char at the current position with teletype model
; paramaters:
; 0: char to write
;==========================================================
write_char:
enter 0, 0
push bx
mov al, [bp+4]
mov bx, 0
mov ah, 0eh
push bp
int 10h
pop bp
pop bx
leave
ret
;==========================================================
; sleep:
; sleep for some time
; paramaters:
; 0: interval to sleep in 65536 microseconds
;==========================================================
sleep:
enter 0, 0
mov dx, 0
mov cx, [bp+4]
mov ah, 86h
int 15h
leave
ret
;==========================================================
; get_cursor:
; get the cursor position
; return: ax -> the cursor position
;==========================================================
get_cursor:
mov bh, 0h
mov ah, 3h
int 10h
mov ax, dx
ret
;==========================================================
; move_cursor:
; move the cursor to specified position
; 0: the position to be moved to
;==========================================================
move_cursor:
enter 0, 0
mov dx, [bp+4]
mov bh, 0h
mov ah, 2h
int 10h
leave
ret
;==========================================================
; clear_scn
; clear screen
;==========================================================
clear_scn:
mov ax, 03h
int 10h
ret
;==========================================================
; read_disk:
; read some sectors into memory
; paramaters:
; 0: destination (ds should be set to the correct segment)
; 1: number of sectors to read (1-255)
; 2: staring LBA (couldn't access cylinder > 255)
; 3: drive number (0-255, bit 7 set for hard disk)
;==========================================================
read_disk:
enter 0, 0
push bx
push si
push di
mov ah, 08h
mov dl, [bp+10]
int 13h
mov ax, ds
mov es, ax
mov ah, 0h
mov al, cl
mul dh
mov bx, ax
mov ax, [bp+8]
;div bx
div bl
mov bl, al ;bl stores the Cylinder number
mov ax, [bp+8]
div cl
mov ah, 0h ;clear the remainder in ah
div dh
mov bh, ah ;bh stores the Head number
mov ax, [bp+8]
div cl
inc ah ;ah stores the Sector number
mov al, [bp+6]
mov ch, bl
mov cl, ah
mov dh, bh
mov dl, [bp+10]
mov bx, [bp+4]
mov ah, 02h
int 13h
pop di
pop si
pop bx
leave
ret