-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils_32cc.asm
More file actions
266 lines (223 loc) · 4.87 KB
/
utils_32cc.asm
File metadata and controls
266 lines (223 loc) · 4.87 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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
[bits 16]
global get_kb_char, write_str, write_char, set_char, get_char
global sleep, read_disk, get_cursor, move_cursor, clear_scn
global add_int_handler
_start:
;==========================================================
; get_kb_char:
; get the keyboard character
; return: al -> ASCII character of the key pressed
;==========================================================
get_kb_char:
mov ah, 10h
int 16h
pop ecx
jmp cx
;==========================================================
; get_char:
; get the character at the current cursor position
; return: al -> the character
;==========================================================
get_char:
push bx
mov bh, 0h
mov ah, 08h
int 10h
pop bx
pop ecx
jmp cx
;==========================================================
; 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+10]
mov ah, 02h
int 10h
mov al, [bp+6]
mov bx, 0fh
mov cx, 1
mov ah, 09h
int 10h
pop bx
leave
pop ecx
jmp cx
;==========================================================
; 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+14]
mov cx, [bp+10]
push bp
mov bp, [bp+6]
mov ax, ds
mov es, ax
mov ah, 13h
mov al, 1h
mov bx, 05h
int 10h
pop bp
pop bx
leave
pop ecx
jmp cx
;==========================================================
; 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+6]
mov bx, 0
mov ah, 0eh
push bp
int 10h
pop bp
pop bx
leave
pop ecx
jmp cx
;==========================================================
; sleep:
; sleep for some time
; paramaters:
; 0: interval to sleep in 65536 microseconds
;==========================================================
sleep:
enter 0, 0
mov dx, 0
mov cx, [bp+6]
mov ah, 86h
int 15h
leave
pop ecx
jmp cx
;==========================================================
; get_cursor:
; get the cursor position
; return: ax -> the cursor position
;==========================================================
get_cursor:
push bx
mov bh, 0h
mov ah, 3h
int 10h
mov ax, dx
pop bx
pop ecx
jmp cx
;==========================================================
; move_cursor:
; move the cursor to specified position
; 0: the position to be moved to
;==========================================================
move_cursor:
enter 0, 0
push bx
mov dx, [bp+6]
mov bh, 0h
mov ah, 2h
int 10h
pop bx
leave
pop ecx
jmp cx
;==========================================================
; clear_scn
; clear screen
;==========================================================
clear_scn:
mov ax, 03h
int 10h
pop ecx
jmp cx
;==========================================================
; 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+18]
int 13h
inc dh
mov ax, ds
mov es, ax
mov ah, 0h
mov al, cl
mul dh
mov bx, ax
mov ax, [bp+14]
;div bx
div bl
mov bl, al ;bl stores the Cylinder number
mov ax, [bp+14]
div cl
mov ah, 0h ;clear the remainder in ah
div dh
mov bh, ah ;bh stores the Head number
mov ax, [bp+14]
div cl
inc ah ;ah stores the Sector number
mov al, [bp+10]
mov ch, bl
mov cl, ah
mov dh, bh
mov dl, [bp+18]
mov bx, [bp+6]
mov ah, 02h
int 13h
pop di
pop si
pop bx
leave
pop ecx
jmp cx
;==========================================================
;add_int_handler
;add an interrupt handler into the IVT
; 0: Interrupt number
; 1: Offset of the handler (must be in the curent CS)
;Return: EAX: The original handler
;==========================================================
add_int_handler:
enter 0, 0
push bx
push ds
xor bx, bx
mov ds, bx
mov bl, [bp+6]
shl bx, 2
mov ax, cs
shl eax, 8
mov ax, [bp+10]
xchg [ds:bx], eax
pop ds
pop bx
leave
pop ecx
jmp cx