forked from TobiasKaiser/ahci_sbe
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathio.asm
477 lines (379 loc) · 8.54 KB
/
io.asm
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
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
; io.asm -- User interface functions via BIOS
; Copyright (C) 2014, 2016 Tobias Kaiser <mail@tb-kaiser.de>
; Password dialog
; ---------------
window_width equ 56
; pw_dialog provides the interface for the user to enter a password by
; keyboard.
; Returns 0 on success, 1 on Escape
pw_dialog:
pusha
call restore_last_password
mov [cur_style], byte 0x1F ; white on blue
mov [horiz_line_left], byte 0xB3 ; vertical line
mov [horiz_line_middle], byte 0x20 ; space
mov [horiz_line_right], byte 0xB3 ; vertical line
mov DH, 7 ; line number
call horiz_line
mov DH, 8 ; line number
call horiz_line
mov DH, 9 ; line number
call horiz_line
mov DH, 10 ; line number
call horiz_line
mov DH, 11 ; line number
call horiz_line
mov DH, 13 ; line number
call horiz_line
mov DH, 14 ; line number
call horiz_line
mov DH, 15 ; line number
call horiz_line
mov DH, 16 ; line number
call horiz_line
mov DH, 17 ; line number
call horiz_line
mov [horiz_line_middle], byte 0xC4 ; horizontal lines following
mov [horiz_line_left], byte 0xDA ; top left corner
mov [horiz_line_right], byte 0xBF ; top right corner
mov DH, 6 ; line number
call horiz_line
mov [horiz_line_left], byte 0xC3 ; |-
mov [horiz_line_right], byte 0xB4 ; -|
mov DH, 12 ; line number
call horiz_line
mov [horiz_line_left], byte 0xC0 ; bottom left corner
mov [horiz_line_right], byte 0xD9 ; bottom right corner
mov DH, 18 ; line number
call horiz_line
mov DL, (80-window_width)/2+2
mov DH, 8
mov AH, 02h ; set cursor position
int 10h
mov AX, pw_dialog_msg
call puts
mov [cur_style], byte 0x70 ; black on gray
mov DH, 16
mov AH, 02h ; set cursor position
int 10h
mov AX, pw_dialog_usage_msg
call puts
mov [cur_style], byte 0x1F
; Neatly fill the space between the usage hints
mov DH, 16
mov DL, (80-window_width)/2+2+12
mov AH, 02h ; set cursor position
int 10h
mov AL, ` `
call putc
call putc
mov DL, (80-window_width)/2+2+12+29
mov AH, 02h ; set cursor position
int 10h
mov AL, ` `
call putc
call putc
mov DL, (80-window_width)/2+2
mov DH, 10
mov AH, 02h ; set cursor position
int 10h
mov AX, identify_strbuf
call puts
mov DH, 14
mov AH, 02h ; set cursor position
int 10h
mov AX, pw_dialog_prompt
call puts
mov EDI, 0
; restore last password to dialog
mov ECX, [last_password_length]
restore_asterisks:
cmp ECX, 0
jz restore_asterisks_end
mov AL, '*'
call putc
inc EDI
dec ECX
jmp restore_asterisks
restore_asterisks_end:
mov ECX, [ahci_data_buf]
add ECX, 2 ; the password field for SECURITY UNLOCK is now at ES:ECX
pw_dialog_loop:
call getc
cmp AL, `\r`
jz pw_dialog_end_loop
cmp AL, 0x1b ; escape key cancels password dialog and continues boot with locked hdd
jz pw_dialog_escape
cmp AL, `\b`
jz pw_dialog_backspace
cmp EDI, 32
jnz pw_addchar_ok
jmp pw_dialog_loop ; too long
pw_addchar_ok:
mov [ES:ECX+EDI], AL
mov AL, '*'
call putc
inc EDI
jmp pw_dialog_loop
pw_dialog_backspace:
cmp EDI, 0
jnz pw_delchar_ok
jmp pw_dialog_loop ; already empty buffer
pw_dialog_escape:
mov [cur_style], byte 0x07 ; grey on black
popa
mov AX, 1 ; dialog cancelled
ret
pw_delchar_ok:
mov [ES:ECX+EDI], byte 0
call backspace
dec EDI
jmp pw_dialog_loop
pw_dialog_end_loop:
call clear_last_password
; check if shift is pressed. If so, set [unlock_multiple], else clear it.
mov AH, 0x02
int 16h
and AL, 3 ; first two bits are shift left and right
cmp AL, 0
jz pw_dialog_no_multiple
mov [unlock_multiple], byte 1
mov [last_password_length], EDI
call store_last_password
pw_dialog_no_multiple:
mov [cur_style], byte 0x07 ; grey on black
popa
mov AX, 0 ; success
ret
; Error box: Wrong password
; -------------------------
wrong_password_error_box:
pusha
mov [cur_style], byte 0x4F ; white on red
mov [horiz_line_left], byte 0xB3 ; vertical line
mov [horiz_line_middle], byte 0x20 ; space
mov [horiz_line_right], byte 0xB3 ; vertical line
mov DH, 11 ; line number
call horiz_line
mov DH, 12 ; line number
call horiz_line
mov DH, 13 ; line number
call horiz_line
mov [horiz_line_middle], byte 0xC4 ; horizontal lines following
mov [horiz_line_left], byte 0xDA ; top left corner
mov [horiz_line_right], byte 0xBF ; top right corner
mov DH, 10 ; line number
call horiz_line
mov [horiz_line_left], byte 0xC0 ; bottom left corner
mov [horiz_line_right], byte 0xD9 ; bottom right corner
mov DH, 14 ; line number
call horiz_line
mov DL, (80-window_width)/2+2
mov DH, 12
mov AH, 02h ; set cursor position
int 10h
mov AX, wrong_password_msg
call puts
wait_return:
call getc
cmp AL, `\r`
jnz wait_return
mov [cur_style], byte 0x07 ; grey on black
popa
ret
cls_blank:
; Clear screen
mov AH, 06h
mov AL, 0
mov BH, 07h
mov CH, 0
mov CL, 0
mov DH, 24
mov DL, 79
int 10h
; Move cursor to 0, 0
mov DL, 0
mov DH, 0
mov BH, 0 ; page number
mov AH, 02h ; set cursor position
int 10h
ret
cls:
pusha
call cls_blank
; Print version info at bottom
mov DL, 0
mov DH, 24
mov BH, 0 ; page number
mov AH, 02h ; set cursor position
int 10h
mov AX, version_str
call puts
; Move cursor to 0, 0
mov DL, 0
mov DH, 0
mov BH, 0 ; page number
mov AH, 02h ; set cursor position
int 10h
popa
ret
horiz_line: ; DH is line number, chars are [horiz_line_(left|middle|right)]
mov AH, 09h
mov BL, [cur_style]
mov BH, 0 ; page number
mov CX, 1 ; count
mov DL, (80-window_width)/2
mov AH, 02h ; set cursor position
int 10h
mov AH, 09h ; print char
mov AL, [horiz_line_left]
int 10h
pw_top_line_loop:
inc DL
cmp DL, 80 - (80-window_width)/2 - 1
mov AH, 02h ; set cursor position
int 10h
jz pw_end_top_line
mov AH, 09h ; print char
mov AL, [horiz_line_middle]
int 10h
jmp pw_top_line_loop
pw_end_top_line:
mov AH, 09h ; print char
mov AL, [horiz_line_right]
int 10h
ret
; Basic user interaction procedures
; ---------------------------------
nl:
push AX
mov AL, `\n`
call putc
pop AX
ret
getc: ; changes AH...
mov AH, 0
int 0x16
ret
pause:
push AX
mov AX, pause_msg
call puts
call getc
pop AX
ret
puts:
push AX
push BX
mov BX, AX
puts_loop:
mov AL, [BX]
cmp AL, 0
jz end_puts
call putc
inc BX
jmp puts_loop
end_puts:
pop BX
pop AX
ret
putdword:
push EAX
shr EAX, 16
call putword
pop EAX
call putword
ret
putword:
push AX
xchg AL, AH
call putbyte
pop AX
call putbyte
ret
putbyte:
push AX
shr AL, 4
call putnibble
pop AX
push AX
call putnibble
pop AX
ret
putnibble:
and AL, 0fh
cmp AL, 0ah
jge putnibble_alpha
putnibble_numeric:
add AL, '0'
jmp putnibble_endfork
putnibble_alpha:
add AL, 'A'-0ah
putnibble_endfork:
;mov AL, 'Z'
call putc
ret
backspace:
pusha
mov AH, 03h ; get cursor position
mov BH, 0 ; page number
int 10h
sub DL, 1
mov AH, 02h ; set cursor position
int 10h
mov AH, 09h
mov AL, ' '
mov BL, [cur_style]
mov BH, 0 ; page number
mov CX, 1 ; count
int 10h
popa
ret
putc:
pusha
cmp AL, `\n`
jz putc_nl
cmp AL, `\r`
jz putc_nl
jmp putc_print_char
putc_nl:
mov AH, 03h ; get cursor position
mov BH, 0 ; page number
int 10h
mov DL, 79
jmp nl_jump
putc_print_char:
mov AH, 09h
mov AL, AL ; character
mov BL, [cur_style]
mov BH, 0 ; page number
mov CX, 1 ; count
int 10h
mov AH, 03h ; get cursor position
mov BH, 0 ; page number
int 10h
nl_jump:
inc DL ; column
cmp DL, 79
jle putc_set_cursor
mov DL, 0
inc DH
cmp DH, 24
jle putc_set_cursor
; Scroll one line up
mov AH, 06h
mov AL, 1
mov BH, 07h
mov CH, 0
mov CL, 0
mov DH, 24
mov DL, 79
int 10h
mov AH, 03h ; get cursor position
mov BH, 0 ; page number
mov DL, 0
putc_set_cursor:
mov AH, 02h ; set cursor position
int 10h
popa
ret