]> pd.if.org Git - mmurtl/blob - ossource/hardide.asm
autocommit for file dated 1995-02-09 11:17:00
[mmurtl] / ossource / hardide.asm
1 \r
2 .DATA\r
3 EXTRN _AllocExch FWORD\r
4 EXTRN _InitDevDr FWORD\r
5 EXTRN _UnMaskIRQ FWORD\r
6 EXTRN _MaskIRQ FWORD\r
7 EXTRN _SetIRQVector FWORD\r
8 EXTRN _EndOfIRQ FWORD\r
9 EXTRN _SendMsg FWORD\r
10 EXTRN _ISendMsg FWORD\r
11 EXTRN _WaitMsg FWORD\r
12 EXTRN _CheckMsg FWORD\r
13 EXTRN _Alarm FWORD\r
14 EXTRN _KillAlarm FWORD\r
15 EXTRN _Sleep FWORD\r
16 EXTRN _MicroDelay FWORD\r
17 EXTRN _OutByte FWORD\r
18 EXTRN _OutWord FWORD\r
19 EXTRN _InByte FWORD\r
20 EXTRN _InWord FWORD\r
21 EXTRN _ReadCMOS FWORD\r
22 EXTRN _CopyData FWORD\r
23 EXTRN _InWords FWORD\r
24 EXTRN _OutWords FWORD\r
25 _hd_Cmd DB 8 DUP(0)\r
26 _fDataReq DB 0h\r
27 _statbyte DB 0h\r
28 _hd_control DB 0h\r
29 _hd_command DB 0h\r
30 _hd_drive DB 0h\r
31 _hd_head DB 0h\r
32 _hd_nsectors DB 0h\r
33 _hd_sector DB 0h\r
34 _hd0_type DB 0h\r
35 _hd0_heads DB 0h\r
36 _hd0_secpertrk DB 0h\r
37 _hd0_cyls DW 0h\r
38 _hd1_type DB 0h\r
39 _hd1_heads DB 0h\r
40 _hd1_secpertrk DB 0h\r
41 _hd1_cyls DW 0h\r
42 _hdstatus DB 64 DUP(0)\r
43 _HDStatTmp DB 64 DUP(0)\r
44 _hdcb DB 128 DUP(0)\r
45 _hd_exch DD 0h\r
46 _hd_msg DD 0h\r
47 _hd_msg2 DD 0h\r
48 _HDDInt DD 0h\r
49 \r
50 \r
51 .CODE\r
52 EXTRN _xprintf: NEAR\r
53 PUBLIC _hdisk_setup:\r
54         PUSH EBP\r
55         MOV EBP,ESP\r
56         SUB ESP,4\r
57         MOV ESI,OFFSET _hdcb\r
58         MOV EAX,72\r
59         MOV BYTE PTR [ESI], AL\r
60         MOV ESI,OFFSET _hdcb\r
61         MOV EAX,1\r
62         ADD ESI,EAX\r
63         MOV EAX,68\r
64         MOV BYTE PTR [ESI], AL\r
65         MOV ESI,OFFSET _hdcb\r
66         MOV EAX,2\r
67         ADD ESI,EAX\r
68         MOV EAX,48\r
69         MOV BYTE PTR [ESI], AL\r
70         MOV ESI,OFFSET _hdcb\r
71         MOV EAX,3\r
72         MOV BYTE PTR [ESI+12], AL\r
73         MOV ESI,OFFSET _hdcb\r
74         MOV EAX,1\r
75         MOV BYTE PTR [ESI+13], AL\r
76         MOV ESI,OFFSET _hdcb\r
77         MOV EAX,512\r
78         MOV WORD PTR [ESI+14], AX\r
79         MOV ESI,OFFSET _hdcb\r
80         MOV EAX,524288\r
81         MOV DWORD PTR [ESI+20], EAX\r
82         MOV ESI,OFFSET _hdcb\r
83         MOV EAX,OFFSET _hddev_op\r
84         MOV DWORD PTR [ESI+24], EAX\r
85         MOV ESI,OFFSET _hdcb\r
86         MOV EAX,OFFSET _hddev_init\r
87         MOV DWORD PTR [ESI+28], EAX\r
88         MOV ESI,OFFSET _hdcb\r
89         MOV EAX,OFFSET _hddev_stat\r
90         MOV DWORD PTR [ESI+32], EAX\r
91         MOV EAX,64\r
92         MOV ESI,OFFSET _hdcb\r
93         ADD ESI,EAX\r
94         MOV EAX,72\r
95         MOV BYTE PTR [ESI], AL\r
96         MOV EAX,64\r
97         MOV ESI,OFFSET _hdcb\r
98         ADD ESI,EAX\r
99         MOV EAX,1\r
100         ADD ESI,EAX\r
101         MOV EAX,68\r
102         MOV BYTE PTR [ESI], AL\r
103         MOV EAX,64\r
104         MOV ESI,OFFSET _hdcb\r
105         ADD ESI,EAX\r
106         MOV EAX,2\r
107         ADD ESI,EAX\r
108         MOV EAX,49\r
109         MOV BYTE PTR [ESI], AL\r
110         MOV EAX,64\r
111         MOV ESI,OFFSET _hdcb\r
112         ADD ESI,EAX\r
113         MOV EAX,3\r
114         MOV BYTE PTR [ESI+12], AL\r
115         MOV EAX,64\r
116         MOV ESI,OFFSET _hdcb\r
117         ADD ESI,EAX\r
118         MOV EAX,1\r
119         MOV BYTE PTR [ESI+13], AL\r
120         MOV EAX,64\r
121         MOV ESI,OFFSET _hdcb\r
122         ADD ESI,EAX\r
123         MOV EAX,512\r
124         MOV WORD PTR [ESI+14], AX\r
125         MOV EAX,64\r
126         MOV ESI,OFFSET _hdcb\r
127         ADD ESI,EAX\r
128         MOV EAX,524288\r
129         MOV DWORD PTR [ESI+20], EAX\r
130         MOV EAX,64\r
131         MOV ESI,OFFSET _hdcb\r
132         ADD ESI,EAX\r
133         MOV EAX,OFFSET _hddev_op\r
134         MOV DWORD PTR [ESI+24], EAX\r
135         MOV EAX,64\r
136         MOV ESI,OFFSET _hdcb\r
137         ADD ESI,EAX\r
138         MOV EAX,OFFSET _hddev_init\r
139         MOV DWORD PTR [ESI+28], EAX\r
140         MOV EAX,64\r
141         MOV ESI,OFFSET _hdcb\r
142         ADD ESI,EAX\r
143         MOV EAX,OFFSET _hddev_stat\r
144         MOV DWORD PTR [ESI+32], EAX\r
145         PUSH 25\r
146         CALL FWORD PTR _ReadCMOS\r
147         MOV _hd0_type, AL\r
148         MOV EAX,16\r
149         MOV _hd0_heads, AL\r
150         MOV EAX,17\r
151         MOV _hd0_secpertrk, AL\r
152         MOV EAX,1024\r
153         MOV _hd0_cyls, AX\r
154         PUSH 26\r
155         CALL FWORD PTR _ReadCMOS\r
156         MOV _hd1_type, AL\r
157         MOV EAX,16\r
158         MOV _hd1_heads, AL\r
159         MOV EAX,17\r
160         MOV _hd1_secpertrk, AL\r
161         MOV EAX,1024\r
162         MOV _hd1_cyls, AX\r
163         PUSH OFFSET _hd_exch\r
164         CALL FWORD PTR _AllocExch\r
165         MOV DWORD PTR [EBP-4], EAX\r
166         PUSH 14\r
167         PUSH OFFSET _hdisk_isr\r
168         CALL FWORD PTR _SetIRQVector\r
169         PUSH 14\r
170         CALL FWORD PTR _UnMaskIRQ\r
171         CALL _hd_reset\r
172         XOR EAX,EAX\r
173         PUSH EAX\r
174         CALL _hd_recal\r
175         MOV DWORD PTR [EBP-4], EAX\r
176         MOV EAX,DWORD PTR [EBP-4]\r
177         AND EAX,EAX\r
178         JZ L_1\r
179         CALL _hd_reset\r
180         XOR EAX,EAX\r
181         PUSH EAX\r
182         CALL _hd_recal\r
183         MOV DWORD PTR [EBP-4], EAX\r
184         MOV EAX,DWORD PTR [EBP-4]\r
185         AND EAX,EAX\r
186         JZ L_2\r
187         MOV ESI,OFFSET _hdcb\r
188         MOV EAX,DWORD PTR [EBP-4]\r
189         MOV DWORD PTR [ESI+16], EAX\r
190         XOR EAX,EAX\r
191         MOV _hd0_type, AL\r
192         MOV EAX,655\r
193         JMP L_3\r
194 L_2:\r
195 L_1:\r
196         XOR EAX,EAX\r
197         MOV AL,_hd1_type\r
198         AND EAX,EAX\r
199         JZ L_4\r
200         PUSH 1\r
201         CALL _hd_recal\r
202         MOV DWORD PTR [EBP-4], EAX\r
203         MOV EAX,DWORD PTR [EBP-4]\r
204         AND EAX,EAX\r
205         JZ L_5\r
206         MOV EAX,64\r
207         MOV ESI,OFFSET _hdcb\r
208         ADD ESI,EAX\r
209         MOV EAX,DWORD PTR [EBP-4]\r
210         MOV DWORD PTR [ESI+16], EAX\r
211         XOR EAX,EAX\r
212         MOV _hd1_type, AL\r
213         MOV EAX,DWORD PTR [EBP-4]\r
214         AND EAX,EAX\r
215         JNZ L_6\r
216         CALL _hd_reset\r
217 L_6:\r
218         XOR EAX,EAX\r
219         PUSH EAX\r
220         CALL _hd_recal\r
221         MOV DWORD PTR [EBP-4], EAX\r
222         MOV ESI,OFFSET _hdcb\r
223         MOV EAX,DWORD PTR [EBP-4]\r
224         MOV DWORD PTR [ESI+16], EAX\r
225 L_5:\r
226 L_4:\r
227         PUSH 12\r
228         PUSH OFFSET _hdcb\r
229         PUSH 2\r
230         PUSH 1\r
231         CALL FWORD PTR _InitDevDr\r
232         MOV DWORD PTR [EBP-4], EAX\r
233 L_3:\r
234         MOV ESP,EBP\r
235         POP EBP\r
236         RETN\r
237 _hd_reset:\r
238         PUSH EBP\r
239         MOV EBP,ESP\r
240         SUB ESP,4\r
241         PUSH 14\r
242         CALL FWORD PTR _UnMaskIRQ\r
243         PUSH 4\r
244         PUSH 1014\r
245         CALL FWORD PTR _OutByte\r
246         PUSH 4\r
247         CALL FWORD PTR _MicroDelay\r
248         XOR EAX,EAX\r
249         MOV AL,_hd_control\r
250         MOV ECX,15\r
251         AND EAX,ECX\r
252         PUSH EAX\r
253         PUSH 1014\r
254         CALL FWORD PTR _OutByte\r
255         PUSH 20\r
256         CALL FWORD PTR _Sleep\r
257         PUSH _hd_exch\r
258         PUSH OFFSET _hd_msg\r
259         CALL FWORD PTR _CheckMsg\r
260         MOV DWORD PTR [EBP-4], EAX\r
261         MOV ESI,OFFSET _hdstatus\r
262         XOR EAX,EAX\r
263         MOV AL,_statbyte\r
264         MOV BYTE PTR [ESI+54], AL\r
265         MOV EAX,DWORD PTR [EBP-4]\r
266         AND EAX,EAX\r
267         JZ L_7\r
268         MOV ESI,OFFSET _hdstatus\r
269         MOV EAX,1\r
270         MOV BYTE PTR [ESI+42], AL\r
271         JMP L_8\r
272 L_7:\r
273         MOV ESI,OFFSET _hdstatus\r
274         XOR EAX,EAX\r
275         MOV BYTE PTR [ESI+42], AL\r
276 L_8:\r
277         MOV ESP,EBP\r
278         POP EBP\r
279         RETN\r
280 _hdisk_isr:\r
281         PUSHAD\r
282         PUSH 503\r
283         CALL FWORD PTR _InByte\r
284         MOV _statbyte, AL\r
285         MOV EAX,1\r
286         MOV _HDDInt, EAX\r
287         PUSH _hd_exch\r
288         PUSH -16\r
289         PUSH -16\r
290         CALL FWORD PTR _ISendMsg\r
291         PUSH 14\r
292         CALL FWORD PTR _EndOfIRQ\r
293         POPAD\r
294         IRETD\r
295 _check_busy:\r
296         PUSH EBP\r
297         MOV EBP,ESP\r
298         SUB ESP,2\r
299         XOR EAX,EAX\r
300         MOV WORD PTR [EBP-2], AX\r
301 L_9:\r
302         MOVSX EAX,WORD PTR [EBP-2]\r
303         INC WORD PTR [EBP-2]\r
304         CMP EAX,60\r
305         SETL AL\r
306         AND AL,AL\r
307         JZ L_10\r
308         PUSH 503\r
309         CALL FWORD PTR _InByte\r
310         MOV _statbyte, AL\r
311         XOR EAX,EAX\r
312         MOV AL,_statbyte\r
313         MOV ECX,128\r
314         AND EAX,ECX\r
315         XOR ECX,ECX\r
316         CMP EAX,ECX\r
317         SETE AL\r
318         AND AL,AL\r
319         JZ L_11\r
320         XOR EAX,EAX\r
321         JMP L_12\r
322 L_11:\r
323         PUSH 5\r
324         CALL FWORD PTR _Sleep\r
325         JMP L_9\r
326 L_10:\r
327         MOV EAX,667\r
328 L_12:\r
329         MOV ESP,EBP\r
330         POP EBP\r
331         RETN\r
332 _hd_init:\r
333         PUSH EBP\r
334         MOV EBP,ESP\r
335         SUB ESP,4\r
336         XOR EAX,EAX\r
337         MOV AL,BYTE PTR [EBP+8]\r
338         XOR ECX,ECX\r
339         CMP EAX,ECX\r
340         SETE AL\r
341         AND AL,AL\r
342         JZ L_13\r
343         MOV EAX,2\r
344         MOV ESI,OFFSET _hd_Cmd\r
345         ADD ESI,EAX\r
346         XOR EAX,EAX\r
347         MOV AL,_hd0_secpertrk\r
348         MOV BYTE PTR [ESI], AL\r
349         MOV EAX,6\r
350         MOV ESI,OFFSET _hd_Cmd\r
351         ADD ESI,EAX\r
352         XOR EAX,EAX\r
353         MOV AL,BYTE PTR [EBP+8]\r
354         MOV ECX,4\r
355         SHL EAX,CL\r
356         AND EAX,0FFh\r
357         MOV EBX,EAX\r
358         XOR EAX,EAX\r
359         MOV AL,_hd0_heads\r
360         MOV ECX,1\r
361         SUB EAX,ECX\r
362         MOV ECX,15\r
363         AND EAX,ECX\r
364         MOV ECX,EBX\r
365         OR EAX,ECX\r
366         MOV ECX,160\r
367         OR EAX,ECX\r
368         MOV BYTE PTR [ESI], AL\r
369         JMP L_14\r
370 L_13:\r
371         MOV EAX,2\r
372         MOV ESI,OFFSET _hd_Cmd\r
373         ADD ESI,EAX\r
374         XOR EAX,EAX\r
375         MOV AL,_hd1_secpertrk\r
376         MOV BYTE PTR [ESI], AL\r
377         MOV EAX,6\r
378         MOV ESI,OFFSET _hd_Cmd\r
379         ADD ESI,EAX\r
380         XOR EAX,EAX\r
381         MOV AL,BYTE PTR [EBP+8]\r
382         MOV ECX,4\r
383         SHL EAX,CL\r
384         AND EAX,0FFh\r
385         MOV EBX,EAX\r
386         XOR EAX,EAX\r
387         MOV AL,_hd1_heads\r
388         MOV ECX,1\r
389         SUB EAX,ECX\r
390         MOV ECX,15\r
391         AND EAX,ECX\r
392         MOV ECX,EBX\r
393         OR EAX,ECX\r
394         MOV ECX,160\r
395         OR EAX,ECX\r
396         MOV BYTE PTR [ESI], AL\r
397 L_14:\r
398         MOV EAX,1\r
399         MOV ESI,OFFSET _hd_Cmd\r
400         ADD ESI,EAX\r
401         XOR EAX,EAX\r
402         MOV BYTE PTR [ESI], AL\r
403         MOV EAX,3\r
404         MOV ESI,OFFSET _hd_Cmd\r
405         ADD ESI,EAX\r
406         XOR EAX,EAX\r
407         MOV BYTE PTR [ESI], AL\r
408         MOV EAX,4\r
409         MOV ESI,OFFSET _hd_Cmd\r
410         ADD ESI,EAX\r
411         XOR EAX,EAX\r
412         MOV BYTE PTR [ESI], AL\r
413         MOV EAX,5\r
414         MOV ESI,OFFSET _hd_Cmd\r
415         ADD ESI,EAX\r
416         XOR EAX,EAX\r
417         MOV BYTE PTR [ESI], AL\r
418         PUSH 145\r
419         CALL _send_command\r
420         MOV DWORD PTR [EBP-4], EAX\r
421         CALL _hd_wait\r
422         MOV DWORD PTR [EBP-4], EAX\r
423         MOV EAX,DWORD PTR [EBP-4]\r
424         AND EAX,EAX\r
425         JNZ L_15\r
426         PUSH 145\r
427         CALL _hd_status\r
428         MOV DWORD PTR [EBP-4], EAX\r
429 L_15:\r
430         MOV EAX,DWORD PTR [EBP-4]\r
431         MOV ESP,EBP\r
432         POP EBP\r
433         RETN 4\r
434 _hd_wait:\r
435         PUSH EBP\r
436         MOV EBP,ESP\r
437         SUB ESP,4\r
438         XOR EAX,EAX\r
439         MOV _HDDInt, EAX\r
440         PUSH _hd_exch\r
441         CALL FWORD PTR _KillAlarm\r
442         PUSH _hd_exch\r
443         PUSH 300\r
444         CALL FWORD PTR _Alarm\r
445         MOV DWORD PTR [EBP-4], EAX\r
446         MOV EAX,DWORD PTR [EBP-4]\r
447         AND EAX,EAX\r
448         JZ L_17\r
449         MOV EAX,DWORD PTR [EBP-4]\r
450         JMP L_18\r
451 L_17:\r
452         PUSH _hd_exch\r
453         PUSH OFFSET _hd_msg\r
454         CALL FWORD PTR _WaitMsg\r
455         MOV DWORD PTR [EBP-4], EAX\r
456         PUSH _hd_exch\r
457         CALL FWORD PTR _KillAlarm\r
458         MOV EAX,_hd_msg\r
459         CMP EAX,-16\r
460         SETNE AL\r
461         AND AL,AL\r
462         JZ L_19\r
463         MOV EAX,_HDDInt\r
464         AND EAX,EAX\r
465         JZ L_20\r
466         MOV EAX,675\r
467         JMP L_18\r
468 L_20:\r
469         MOV EAX,660\r
470         JMP L_18\r
471 L_21:\r
472         JMP L_22\r
473 L_19:\r
474         PUSH _hd_exch\r
475         CALL FWORD PTR _KillAlarm\r
476         XOR EAX,EAX\r
477 L_22:\r
478 L_18:\r
479         MOV ESP,EBP\r
480         POP EBP\r
481         RETN\r
482 _hd_recal:\r
483         PUSH EBP\r
484         MOV EBP,ESP\r
485         SUB ESP,4\r
486         MOV EAX,6\r
487         MOV ESI,OFFSET _hd_Cmd\r
488         ADD ESI,EAX\r
489         XOR EAX,EAX\r
490         MOV AL,BYTE PTR [EBP+8]\r
491         MOV ECX,4\r
492         SHL EAX,CL\r
493         AND EAX,0FFh\r
494         MOV EBX,EAX\r
495         XOR EAX,EAX\r
496         MOV AL,_hd_head\r
497         MOV ECX,15\r
498         AND EAX,ECX\r
499         MOV ECX,EBX\r
500         OR EAX,ECX\r
501         MOV ECX,160\r
502         OR EAX,ECX\r
503         MOV BYTE PTR [ESI], AL\r
504         PUSH 16\r
505         CALL _send_command\r
506         MOV DWORD PTR [EBP-4], EAX\r
507         MOV EAX,DWORD PTR [EBP-4]\r
508         AND EAX,EAX\r
509         JNZ L_23\r
510         CALL _hd_wait\r
511         MOV DWORD PTR [EBP-4], EAX\r
512 L_23:\r
513         MOV EAX,DWORD PTR [EBP-4]\r
514         AND EAX,EAX\r
515         JNZ L_24\r
516         PUSH 16\r
517         CALL _hd_status\r
518         MOV DWORD PTR [EBP-4], EAX\r
519 L_24:\r
520         XOR EAX,EAX\r
521         MOV AL,BYTE PTR [EBP+8]\r
522         AND EAX,EAX\r
523         JZ L_25\r
524         MOV ESI,OFFSET _hdstatus\r
525         MOV EAX,DWORD PTR [EBP-4]\r
526         MOV DWORD PTR [ESI+44], EAX\r
527         JMP L_26\r
528 L_25:\r
529         MOV ESI,OFFSET _hdstatus\r
530         MOV EAX,DWORD PTR [EBP-4]\r
531         MOV DWORD PTR [ESI+32], EAX\r
532 L_26:\r
533         MOV EAX,DWORD PTR [EBP-4]\r
534         MOV ESP,EBP\r
535         POP EBP\r
536         RETN 4\r
537 _send_command:\r
538         PUSH EBP\r
539         MOV EBP,ESP\r
540         SUB ESP,12\r
541 L_28:\r
542         PUSH _hd_exch\r
543         LEA EAX,DWORD PTR [EBP-12]\r
544         PUSH EAX\r
545         CALL FWORD PTR _CheckMsg\r
546         CMP EAX,0\r
547         SETE AL\r
548         AND AL,AL\r
549         JZ L_29\r
550         JMP L_28\r
551 L_29:\r
552         XOR EAX,EAX\r
553         MOV AL,_hd_head\r
554         CMP EAX,7\r
555         SETA AL\r
556         AND AL,AL\r
557         JZ L_30\r
558         XOR EAX,EAX\r
559         MOV AL,_hd_control\r
560         MOV ECX,8\r
561         OR EAX,ECX\r
562         MOV _hd_control, AL\r
563         XOR EAX,EAX\r
564         MOV AL,_hd_control\r
565         PUSH EAX\r
566         PUSH 1014\r
567         CALL FWORD PTR _OutByte\r
568         XOR EAX,EAX\r
569         MOV AL,_hd_control\r
570         MOV ECX,247\r
571         AND EAX,ECX\r
572         MOV _hd_control, AL\r
573 L_30:\r
574         CALL _check_busy\r
575         MOV DWORD PTR [EBP-4], EAX\r
576         MOV EAX,DWORD PTR [EBP-4]\r
577         AND EAX,EAX\r
578         JNZ L_31\r
579         MOV EAX,1\r
580         MOV ESI,OFFSET _hd_Cmd\r
581         ADD ESI,EAX\r
582         XOR EAX,EAX\r
583         MOV AL,BYTE PTR [ESI]\r
584         PUSH EAX\r
585         PUSH 497\r
586         CALL FWORD PTR _OutByte\r
587 L_31:\r
588         MOV EAX,DWORD PTR [EBP-4]\r
589         AND EAX,EAX\r
590         JNZ L_32\r
591         CALL _check_busy\r
592         MOV DWORD PTR [EBP-4], EAX\r
593 L_32:\r
594         MOV EAX,DWORD PTR [EBP-4]\r
595         AND EAX,EAX\r
596         JNZ L_33\r
597         MOV EAX,2\r
598         MOV ESI,OFFSET _hd_Cmd\r
599         ADD ESI,EAX\r
600         XOR EAX,EAX\r
601         MOV AL,BYTE PTR [ESI]\r
602         PUSH EAX\r
603         PUSH 498\r
604         CALL FWORD PTR _OutByte\r
605 L_33:\r
606         MOV EAX,DWORD PTR [EBP-4]\r
607         AND EAX,EAX\r
608         JNZ L_34\r
609         CALL _check_busy\r
610         MOV DWORD PTR [EBP-4], EAX\r
611 L_34:\r
612         MOV EAX,DWORD PTR [EBP-4]\r
613         AND EAX,EAX\r
614         JNZ L_35\r
615         MOV EAX,3\r
616         MOV ESI,OFFSET _hd_Cmd\r
617         ADD ESI,EAX\r
618         XOR EAX,EAX\r
619         MOV AL,BYTE PTR [ESI]\r
620         PUSH EAX\r
621         PUSH 499\r
622         CALL FWORD PTR _OutByte\r
623 L_35:\r
624         MOV EAX,DWORD PTR [EBP-4]\r
625         AND EAX,EAX\r
626         JNZ L_36\r
627         CALL _check_busy\r
628         MOV DWORD PTR [EBP-4], EAX\r
629 L_36:\r
630         MOV EAX,DWORD PTR [EBP-4]\r
631         AND EAX,EAX\r
632         JNZ L_37\r
633         MOV EAX,4\r
634         MOV ESI,OFFSET _hd_Cmd\r
635         ADD ESI,EAX\r
636         XOR EAX,EAX\r
637         MOV AL,BYTE PTR [ESI]\r
638         PUSH EAX\r
639         PUSH 500\r
640         CALL FWORD PTR _OutByte\r
641 L_37:\r
642         MOV EAX,DWORD PTR [EBP-4]\r
643         AND EAX,EAX\r
644         JNZ L_38\r
645         CALL _check_busy\r
646         MOV DWORD PTR [EBP-4], EAX\r
647 L_38:\r
648         MOV EAX,DWORD PTR [EBP-4]\r
649         AND EAX,EAX\r
650         JNZ L_39\r
651         MOV EAX,5\r
652         MOV ESI,OFFSET _hd_Cmd\r
653         ADD ESI,EAX\r
654         XOR EAX,EAX\r
655         MOV AL,BYTE PTR [ESI]\r
656         PUSH EAX\r
657         PUSH 501\r
658         CALL FWORD PTR _OutByte\r
659 L_39:\r
660         MOV EAX,DWORD PTR [EBP-4]\r
661         AND EAX,EAX\r
662         JNZ L_40\r
663         CALL _check_busy\r
664         MOV DWORD PTR [EBP-4], EAX\r
665 L_40:\r
666         MOV EAX,DWORD PTR [EBP-4]\r
667         AND EAX,EAX\r
668         JNZ L_41\r
669         MOV EAX,6\r
670         MOV ESI,OFFSET _hd_Cmd\r
671         ADD ESI,EAX\r
672         XOR EAX,EAX\r
673         MOV AL,BYTE PTR [ESI]\r
674         PUSH EAX\r
675         PUSH 502\r
676         CALL FWORD PTR _OutByte\r
677 L_41:\r
678         MOV EAX,DWORD PTR [EBP-4]\r
679         AND EAX,EAX\r
680         JNZ L_42\r
681         CALL _check_busy\r
682         MOV DWORD PTR [EBP-4], EAX\r
683 L_42:\r
684         MOV EAX,DWORD PTR [EBP-4]\r
685         AND EAX,EAX\r
686         JNZ L_43\r
687         XOR EAX,EAX\r
688         MOV AL,BYTE PTR [EBP+8]\r
689         PUSH EAX\r
690         PUSH 503\r
691         CALL FWORD PTR _OutByte\r
692 L_43:\r
693         MOV EAX,DWORD PTR [EBP-4]\r
694         MOV ESP,EBP\r
695         POP EBP\r
696         RETN 4\r
697 _setupseek:\r
698         PUSH EBP\r
699         MOV EBP,ESP\r
700         SUB ESP,6\r
701         MOV EAX,DWORD PTR [EBP+8]\r
702         CMP EAX,256\r
703         SETA AL\r
704         AND AL,AL\r
705         JZ L_45\r
706         MOV EAX,670\r
707         JMP L_46\r
708 L_45:\r
709         MOV EAX,DWORD PTR [EBP+8]\r
710         CMP EAX,0\r
711         SETE AL\r
712         AND AL,AL\r
713         JZ L_47\r
714         MOV EAX,671\r
715         JMP L_46\r
716 L_47:\r
717         MOV EAX,DWORD PTR [EBP+8]\r
718         MOV _hd_nsectors, AL\r
719         XOR EAX,EAX\r
720         MOV AL,_hd_nsectors\r
721         CMP EAX,256\r
722         SETE AL\r
723         AND AL,AL\r
724         JZ L_48\r
725         XOR EAX,EAX\r
726         MOV _hd_nsectors, AL\r
727 L_48:\r
728         XOR EAX,EAX\r
729         MOV AL,_hd_drive\r
730         XOR ECX,ECX\r
731         CMP EAX,ECX\r
732         SETE AL\r
733         AND AL,AL\r
734         JZ L_49\r
735         XOR EAX,EAX\r
736         MOV AL,_hd0_heads\r
737         XOR ECX,ECX\r
738         MOV CL,_hd0_secpertrk\r
739         MUL ECX\r
740         MOV ECX,EAX\r
741         MOV EAX,DWORD PTR [EBP+12]\r
742         XOR EDX,EDX\r
743         DIV ECX\r
744         MOV WORD PTR [EBP-6], AX\r
745         XOR EAX,EAX\r
746         MOV AL,_hd0_heads\r
747         XOR ECX,ECX\r
748         MOV CL,_hd0_secpertrk\r
749         MUL ECX\r
750         MOV ECX,EAX\r
751         MOV EAX,DWORD PTR [EBP+12]\r
752         XOR EDX,EDX\r
753         DIV ECX\r
754         MOV EAX,EDX\r
755         MOV DWORD PTR [EBP-4], EAX\r
756         MOV EAX,DWORD PTR [EBP-4]\r
757         XOR ECX,ECX\r
758         MOV CL,_hd0_secpertrk\r
759         XOR EDX,EDX\r
760         DIV ECX\r
761         MOV _hd_head, AL\r
762         MOV EAX,DWORD PTR [EBP-4]\r
763         XOR ECX,ECX\r
764         MOV CL,_hd0_secpertrk\r
765         XOR EDX,EDX\r
766         DIV ECX\r
767         MOV EAX,EDX\r
768         ADD EAX,1\r
769         MOV _hd_sector, AL\r
770         JMP L_50\r
771 L_49:\r
772         XOR EAX,EAX\r
773         MOV AL,_hd1_heads\r
774         XOR ECX,ECX\r
775         MOV CL,_hd1_secpertrk\r
776         MUL ECX\r
777         MOV ECX,EAX\r
778         MOV EAX,DWORD PTR [EBP+12]\r
779         XOR EDX,EDX\r
780         DIV ECX\r
781         MOV WORD PTR [EBP-6], AX\r
782         XOR EAX,EAX\r
783         MOV AL,_hd1_heads\r
784         XOR ECX,ECX\r
785         MOV CL,_hd1_secpertrk\r
786         MUL ECX\r
787         MOV ECX,EAX\r
788         MOV EAX,DWORD PTR [EBP+12]\r
789         XOR EDX,EDX\r
790         DIV ECX\r
791         MOV EAX,EDX\r
792         MOV DWORD PTR [EBP-4], EAX\r
793         MOV EAX,DWORD PTR [EBP-4]\r
794         XOR ECX,ECX\r
795         MOV CL,_hd1_secpertrk\r
796         XOR EDX,EDX\r
797         DIV ECX\r
798         MOV _hd_head, AL\r
799         MOV EAX,DWORD PTR [EBP-4]\r
800         XOR ECX,ECX\r
801         MOV CL,_hd1_secpertrk\r
802         XOR EDX,EDX\r
803         DIV ECX\r
804         MOV EAX,EDX\r
805         ADD EAX,1\r
806         MOV _hd_sector, AL\r
807 L_50:\r
808         MOV EAX,2\r
809         MOV ESI,OFFSET _hd_Cmd\r
810         ADD ESI,EAX\r
811         MOV EAX,DWORD PTR [EBP+8]\r
812         MOV BYTE PTR [ESI], AL\r
813         MOV EAX,3\r
814         MOV ESI,OFFSET _hd_Cmd\r
815         ADD ESI,EAX\r
816         XOR EAX,EAX\r
817         MOV AL,_hd_sector\r
818         MOV BYTE PTR [ESI], AL\r
819         MOV EAX,4\r
820         MOV ESI,OFFSET _hd_Cmd\r
821         ADD ESI,EAX\r
822         MOVZX EAX,WORD PTR [EBP-6]\r
823         MOV ECX,255\r
824         AND EAX,ECX\r
825         MOV BYTE PTR [ESI], AL\r
826         MOV EAX,5\r
827         MOV ESI,OFFSET _hd_Cmd\r
828         ADD ESI,EAX\r
829         MOVZX EAX,WORD PTR [EBP-6]\r
830         MOV ECX,8\r
831         SHR AX,CL\r
832         MOV ECX,255\r
833         AND EAX,ECX\r
834         MOV BYTE PTR [ESI], AL\r
835         MOV EAX,6\r
836         MOV ESI,OFFSET _hd_Cmd\r
837         ADD ESI,EAX\r
838         XOR EAX,EAX\r
839         MOV AL,_hd_drive\r
840         MOV ECX,4\r
841         SHL EAX,CL\r
842         AND EAX,0FFh\r
843         MOV EBX,EAX\r
844         XOR EAX,EAX\r
845         MOV AL,_hd_head\r
846         MOV ECX,15\r
847         AND EAX,ECX\r
848         MOV ECX,EBX\r
849         OR EAX,ECX\r
850         MOV ECX,160\r
851         OR EAX,ECX\r
852         MOV BYTE PTR [ESI], AL\r
853         XOR EAX,EAX\r
854 L_46:\r
855         MOV ESP,EBP\r
856         POP EBP\r
857         RETN 8\r
858 _hd_seek:\r
859         PUSH EBP\r
860         MOV EBP,ESP\r
861         SUB ESP,4\r
862         PUSH DWORD PTR [EBP+8]\r
863         PUSH 1\r
864         CALL _setupseek\r
865         MOV DWORD PTR [EBP-4], EAX\r
866         MOV EAX,DWORD PTR [EBP-4]\r
867         AND EAX,EAX\r
868         JNZ L_51\r
869         PUSH 112\r
870         CALL _send_command\r
871         MOV DWORD PTR [EBP-4], EAX\r
872 L_51:\r
873         MOV EAX,DWORD PTR [EBP-4]\r
874         AND EAX,EAX\r
875         JNZ L_52\r
876         CALL _hd_wait\r
877         MOV DWORD PTR [EBP-4], EAX\r
878 L_52:\r
879         MOV EAX,DWORD PTR [EBP-4]\r
880         AND EAX,EAX\r
881         JNZ L_53\r
882         PUSH 112\r
883         CALL _hd_status\r
884         MOV DWORD PTR [EBP-4], EAX\r
885 L_53:\r
886         MOV ESI,OFFSET _hdstatus\r
887         MOV EAX,DWORD PTR [EBP-4]\r
888         MOV DWORD PTR [ESI+36], EAX\r
889         MOV EAX,DWORD PTR [EBP-4]\r
890         MOV ESP,EBP\r
891         POP EBP\r
892         RETN 4\r
893 _hd_status:\r
894         PUSH EBP\r
895         MOV EBP,ESP\r
896         SUB ESP,6\r
897         CALL _check_busy\r
898         MOV DWORD PTR [EBP-4], EAX\r
899         MOV EAX,DWORD PTR [EBP-4]\r
900         AND EAX,EAX\r
901         JNZ L_55\r
902         PUSH 503\r
903         CALL FWORD PTR _InByte\r
904         MOV BYTE PTR [EBP-5], AL\r
905         JMP L_56\r
906 L_55:\r
907         MOV EAX,DWORD PTR [EBP-4]\r
908         JMP L_57\r
909 L_56:\r
910         XOR EAX,EAX\r
911         MOV AL,_hd_drive\r
912         AND EAX,EAX\r
913         JZ L_58\r
914         MOV ESI,OFFSET _hdstatus\r
915         XOR EAX,EAX\r
916         MOV AL,BYTE PTR [EBP-5]\r
917         MOV BYTE PTR [ESI+52], AL\r
918         JMP L_59\r
919 L_58:\r
920         MOV ESI,OFFSET _hdstatus\r
921         XOR EAX,EAX\r
922         MOV AL,BYTE PTR [EBP-5]\r
923         MOV BYTE PTR [ESI+40], AL\r
924 L_59:\r
925         XOR EAX,EAX\r
926         MOV AL,BYTE PTR [EBP-5]\r
927         MOV ECX,1\r
928         AND EAX,ECX\r
929         XOR ECX,ECX\r
930         CMP EAX,ECX\r
931         SETE AL\r
932         AND AL,AL\r
933         JZ L_60\r
934         XOR EAX,EAX\r
935         MOV DWORD PTR [EBP-4], EAX\r
936         XOR EAX,EAX\r
937         MOV AL,BYTE PTR [EBP+8]\r
938         JMP L_62\r
939 L_63:\r
940 L_64:\r
941 L_65:\r
942 L_66:\r
943 L_67:\r
944 L_68:\r
945         XOR EAX,EAX\r
946         MOV AL,BYTE PTR [EBP-5]\r
947         MOV ECX,32\r
948         AND EAX,ECX\r
949         JZ L_69\r
950         MOV EAX,672\r
951         MOV DWORD PTR [EBP-4], EAX\r
952         JMP L_70\r
953 L_69:\r
954         XOR EAX,EAX\r
955         MOV AL,BYTE PTR [EBP-5]\r
956         MOV ECX,16\r
957         AND EAX,ECX\r
958         XOR ECX,ECX\r
959         CMP EAX,ECX\r
960         SETE AL\r
961         AND AL,AL\r
962         JZ L_71\r
963         MOV EAX,659\r
964         MOV DWORD PTR [EBP-4], EAX\r
965 L_71:\r
966 L_70:\r
967         JMP L_61\r
968 L_72:\r
969 L_73:\r
970 L_74:\r
971 L_75:\r
972         JMP L_61\r
973 L_76:\r
974         JMP L_61\r
975 L_62:\r
976         CMP EAX,144\r
977         JE L_75\r
978         CMP EAX,80\r
979         JE L_74\r
980         CMP EAX,64\r
981         JE L_73\r
982         CMP EAX,145\r
983         JE L_72\r
984         CMP EAX,16\r
985         JE L_68\r
986         CMP EAX,112\r
987         JE L_67\r
988         CMP EAX,50\r
989         JE L_66\r
990         CMP EAX,48\r
991         JE L_65\r
992         CMP EAX,34\r
993         JE L_64\r
994         CMP EAX,32\r
995         JE L_63\r
996         JMP L_76\r
997 L_61:\r
998         MOV EAX,DWORD PTR [EBP-4]\r
999         JMP L_57\r
1000 L_60:\r
1001         CALL _check_busy\r
1002         MOV DWORD PTR [EBP-4], EAX\r
1003         MOV EAX,DWORD PTR [EBP-4]\r
1004         AND EAX,EAX\r
1005         JNZ L_78\r
1006         PUSH 497\r
1007         CALL FWORD PTR _InByte\r
1008         MOV BYTE PTR [EBP-6], AL\r
1009         JMP L_79\r
1010 L_78:\r
1011         MOV EAX,DWORD PTR [EBP-4]\r
1012         JMP L_57\r
1013 L_79:\r
1014         XOR EAX,EAX\r
1015         MOV AL,_hd_drive\r
1016         AND EAX,EAX\r
1017         JZ L_80\r
1018         MOV ESI,OFFSET _hdstatus\r
1019         XOR EAX,EAX\r
1020         MOV AL,BYTE PTR [EBP-6]\r
1021         MOV BYTE PTR [ESI+53], AL\r
1022         JMP L_81\r
1023 L_80:\r
1024         MOV ESI,OFFSET _hdstatus\r
1025         XOR EAX,EAX\r
1026         MOV AL,BYTE PTR [EBP-6]\r
1027         MOV BYTE PTR [ESI+41], AL\r
1028 L_81:\r
1029         XOR EAX,EAX\r
1030         MOV AL,BYTE PTR [EBP-6]\r
1031         MOV ECX,1\r
1032         AND EAX,ECX\r
1033         JZ L_82\r
1034         MOV EAX,652\r
1035         MOV DWORD PTR [EBP-4], EAX\r
1036         JMP L_83\r
1037 L_82:\r
1038         XOR EAX,EAX\r
1039         MOV AL,BYTE PTR [EBP-6]\r
1040         MOV ECX,2\r
1041         AND EAX,ECX\r
1042         JZ L_84\r
1043         MOV EAX,659\r
1044         MOV DWORD PTR [EBP-4], EAX\r
1045         JMP L_85\r
1046 L_84:\r
1047         XOR EAX,EAX\r
1048         MOV AL,BYTE PTR [EBP-6]\r
1049         MOV ECX,4\r
1050         AND EAX,ECX\r
1051         JZ L_86\r
1052         MOV EAX,668\r
1053         MOV DWORD PTR [EBP-4], EAX\r
1054         JMP L_87\r
1055 L_86:\r
1056         XOR EAX,EAX\r
1057         MOV AL,BYTE PTR [EBP-6]\r
1058         MOV ECX,16\r
1059         AND EAX,ECX\r
1060         JZ L_88\r
1061         MOV EAX,654\r
1062         MOV DWORD PTR [EBP-4], EAX\r
1063         JMP L_89\r
1064 L_88:\r
1065         XOR EAX,EAX\r
1066         MOV AL,BYTE PTR [EBP-6]\r
1067         MOV ECX,64\r
1068         AND EAX,ECX\r
1069         JZ L_90\r
1070         MOV EAX,653\r
1071         MOV DWORD PTR [EBP-4], EAX\r
1072         JMP L_91\r
1073 L_90:\r
1074         XOR EAX,EAX\r
1075         MOV AL,BYTE PTR [EBP-6]\r
1076         MOV ECX,128\r
1077         AND EAX,ECX\r
1078         JZ L_92\r
1079         MOV EAX,651\r
1080         MOV DWORD PTR [EBP-4], EAX\r
1081         JMP L_93\r
1082 L_92:\r
1083         MOV EAX,658\r
1084         MOV DWORD PTR [EBP-4], EAX\r
1085 L_93:\r
1086 L_91:\r
1087 L_89:\r
1088 L_87:\r
1089 L_85:\r
1090 L_83:\r
1091 L_77:\r
1092         MOV EAX,DWORD PTR [EBP-4]\r
1093 L_57:\r
1094         MOV ESP,EBP\r
1095         POP EBP\r
1096         RETN 4\r
1097 _hd_read:\r
1098         PUSH EBP\r
1099         MOV EBP,ESP\r
1100         SUB ESP,12\r
1101         XOR EAX,EAX\r
1102         MOV AL,_hd_drive\r
1103         MOV ECX,64\r
1104         MUL ECX\r
1105         MOV ESI,OFFSET _hdcb\r
1106         ADD ESI,EAX\r
1107         MOVSX EAX,WORD PTR [ESI+14]\r
1108         MOV DWORD PTR [EBP-12], EAX\r
1109         MOV EAX,DWORD PTR [EBP+12]\r
1110         MOV DWORD PTR [EBP-8], EAX\r
1111         PUSH DWORD PTR [EBP+16]\r
1112         PUSH DWORD PTR [EBP+12]\r
1113         CALL _setupseek\r
1114         MOV DWORD PTR [EBP-4], EAX\r
1115         MOV EAX,DWORD PTR [EBP-4]\r
1116         AND EAX,EAX\r
1117         JNZ L_94\r
1118         PUSH 32\r
1119         CALL _send_command\r
1120         MOV DWORD PTR [EBP-4], EAX\r
1121 L_94:\r
1122 L_95:\r
1123         MOV EAX,DWORD PTR [EBP-8]\r
1124         AND EAX,EAX\r
1125         JZ L_97\r
1126         MOV EAX,DWORD PTR [EBP-4]\r
1127         AND EAX,EAX\r
1128         SETZ AL\r
1129         AND AL,AL\r
1130 L_97:\r
1131         JZ L_96\r
1132         CALL _hd_wait\r
1133         MOV DWORD PTR [EBP-4], EAX\r
1134         MOV EAX,DWORD PTR [EBP-4]\r
1135         AND EAX,EAX\r
1136         JNZ L_98\r
1137         PUSH 32\r
1138         CALL _hd_status\r
1139         MOV DWORD PTR [EBP-4], EAX\r
1140 L_98:\r
1141         MOV EAX,DWORD PTR [EBP-4]\r
1142         AND EAX,EAX\r
1143         JNZ L_99\r
1144         PUSH 496\r
1145         PUSH DWORD PTR [EBP+8]\r
1146         PUSH DWORD PTR [EBP-12]\r
1147         CALL FWORD PTR _InWords\r
1148         MOV EAX,DWORD PTR [EBP+8]\r
1149         ADD EAX,DWORD PTR [EBP-12]\r
1150         MOV DWORD PTR [EBP+8], EAX\r
1151         DEC DWORD PTR [EBP-8]\r
1152         MOV EAX,DWORD PTR [EBP-8]\r
1153 L_99:\r
1154         JMP L_95\r
1155 L_96:\r
1156         MOV EAX,DWORD PTR [EBP-4]\r
1157         MOV ESP,EBP\r
1158         POP EBP\r
1159         RETN 12\r
1160 _hd_write:\r
1161         PUSH EBP\r
1162         MOV EBP,ESP\r
1163         SUB ESP,12\r
1164         XOR EAX,EAX\r
1165         MOV AL,_hd_drive\r
1166         MOV ECX,64\r
1167         MUL ECX\r
1168         MOV ESI,OFFSET _hdcb\r
1169         ADD ESI,EAX\r
1170         MOVSX EAX,WORD PTR [ESI+14]\r
1171         MOV DWORD PTR [EBP-12], EAX\r
1172         XOR EAX,EAX\r
1173         MOV DWORD PTR [EBP-8], EAX\r
1174         PUSH DWORD PTR [EBP+16]\r
1175         PUSH DWORD PTR [EBP+12]\r
1176         CALL _setupseek\r
1177         MOV DWORD PTR [EBP-4], EAX\r
1178         PUSH 48\r
1179         CALL _send_command\r
1180         MOV DWORD PTR [EBP-4], EAX\r
1181         CALL _check_busy\r
1182         MOV DWORD PTR [EBP-4], EAX\r
1183         MOV EAX,DWORD PTR [EBP-4]\r
1184         AND EAX,EAX\r
1185         SETZ AL\r
1186         AND AL,AL\r
1187         JZ L_101\r
1188         XOR EAX,EAX\r
1189         MOV AL,_statbyte\r
1190         MOV ECX,8\r
1191         AND EAX,ECX\r
1192 L_101:\r
1193         JZ L_102\r
1194         PUSH 496\r
1195         PUSH DWORD PTR [EBP+8]\r
1196         PUSH DWORD PTR [EBP-12]\r
1197         CALL FWORD PTR _OutWords\r
1198         MOV EAX,DWORD PTR [EBP+8]\r
1199         ADD EAX,DWORD PTR [EBP-12]\r
1200         MOV DWORD PTR [EBP+8], EAX\r
1201         MOV EAX,DWORD PTR [EBP-8]\r
1202         INC DWORD PTR [EBP-8]\r
1203 L_102:\r
1204 L_103:\r
1205         MOV EAX,DWORD PTR [EBP-8]\r
1206         CMP EAX,DWORD PTR [EBP+12]\r
1207         SETB AL\r
1208         AND AL,AL\r
1209         JZ L_105\r
1210         MOV EAX,DWORD PTR [EBP-4]\r
1211         CMP EAX,0\r
1212         SETE AL\r
1213         AND AL,AL\r
1214 L_105:\r
1215         JZ L_104\r
1216         CALL _hd_wait\r
1217         MOV DWORD PTR [EBP-4], EAX\r
1218         MOV EAX,DWORD PTR [EBP-4]\r
1219         CMP EAX,0\r
1220         SETE AL\r
1221         AND AL,AL\r
1222         JZ L_106\r
1223         PUSH 48\r
1224         CALL _hd_status\r
1225         MOV DWORD PTR [EBP-4], EAX\r
1226 L_106:\r
1227         MOV EAX,DWORD PTR [EBP-4]\r
1228         CMP EAX,0\r
1229         SETE AL\r
1230         AND AL,AL\r
1231         JZ L_107\r
1232         XOR EAX,EAX\r
1233         MOV AL,_statbyte\r
1234         MOV ECX,8\r
1235         AND EAX,ECX\r
1236 L_107:\r
1237         JZ L_108\r
1238         PUSH 496\r
1239         PUSH DWORD PTR [EBP+8]\r
1240         PUSH DWORD PTR [EBP-12]\r
1241         CALL FWORD PTR _OutWords\r
1242         MOV EAX,DWORD PTR [EBP+8]\r
1243         ADD EAX,DWORD PTR [EBP-12]\r
1244         MOV DWORD PTR [EBP+8], EAX\r
1245         MOV EAX,DWORD PTR [EBP-8]\r
1246         INC DWORD PTR [EBP-8]\r
1247 L_108:\r
1248         JMP L_103\r
1249 L_104:\r
1250         MOV EAX,DWORD PTR [EBP-4]\r
1251         AND EAX,EAX\r
1252         JNZ L_109\r
1253         CALL _hd_wait\r
1254         MOV DWORD PTR [EBP-4], EAX\r
1255 L_109:\r
1256         MOV EAX,DWORD PTR [EBP-4]\r
1257         AND EAX,EAX\r
1258         JNZ L_110\r
1259         PUSH 48\r
1260         CALL _hd_status\r
1261         MOV DWORD PTR [EBP-4], EAX\r
1262 L_110:\r
1263         MOV EAX,DWORD PTR [EBP-4]\r
1264         MOV ESP,EBP\r
1265         POP EBP\r
1266         RETN 12\r
1267 _hd_format_track:\r
1268         PUSH EBP\r
1269         MOV EBP,ESP\r
1270         SUB ESP,4\r
1271         PUSH DWORD PTR [EBP+12]\r
1272         PUSH DWORD PTR [EBP+8]\r
1273         CALL _setupseek\r
1274         MOV DWORD PTR [EBP-4], EAX\r
1275         PUSH 80\r
1276         CALL _send_command\r
1277         MOV DWORD PTR [EBP-4], EAX\r
1278         CALL _hd_wait\r
1279         MOV DWORD PTR [EBP-4], EAX\r
1280         MOV EAX,DWORD PTR [EBP-4]\r
1281         CMP EAX,0\r
1282         SETE AL\r
1283         AND AL,AL\r
1284         JZ L_112\r
1285         PUSH 80\r
1286         CALL _hd_status\r
1287         MOV DWORD PTR [EBP-4], EAX\r
1288 L_112:\r
1289         MOV EAX,DWORD PTR [EBP-4]\r
1290         MOV ESP,EBP\r
1291         POP EBP\r
1292         RETN 8\r
1293 _ReadSector:\r
1294         PUSH EBP\r
1295         MOV EBP,ESP\r
1296         SUB ESP,6\r
1297         MOV EAX,DWORD PTR [EBP+16]\r
1298         MOV WORD PTR [EBP-6], AX\r
1299         MOV EAX,DWORD PTR [EBP+12]\r
1300         AND EAX,65535\r
1301         MOV _hd_head, AL\r
1302         MOV EAX,DWORD PTR [EBP+12]\r
1303         MOV ECX,16\r
1304         SHR EAX,CL\r
1305         AND EAX,65535\r
1306         MOV _hd_sector, AL\r
1307         MOV EAX,2\r
1308         MOV ESI,OFFSET _hd_Cmd\r
1309         ADD ESI,EAX\r
1310         MOV EAX,1\r
1311         MOV BYTE PTR [ESI], AL\r
1312         MOV EAX,3\r
1313         MOV ESI,OFFSET _hd_Cmd\r
1314         ADD ESI,EAX\r
1315         XOR EAX,EAX\r
1316         MOV AL,_hd_sector\r
1317         MOV BYTE PTR [ESI], AL\r
1318         MOV EAX,4\r
1319         MOV ESI,OFFSET _hd_Cmd\r
1320         ADD ESI,EAX\r
1321         MOVZX EAX,WORD PTR [EBP-6]\r
1322         MOV ECX,255\r
1323         AND EAX,ECX\r
1324         MOV BYTE PTR [ESI], AL\r
1325         MOV EAX,5\r
1326         MOV ESI,OFFSET _hd_Cmd\r
1327         ADD ESI,EAX\r
1328         MOVZX EAX,WORD PTR [EBP-6]\r
1329         MOV ECX,8\r
1330         SHR AX,CL\r
1331         MOV ECX,255\r
1332         AND EAX,ECX\r
1333         MOV BYTE PTR [ESI], AL\r
1334         MOV EAX,6\r
1335         MOV ESI,OFFSET _hd_Cmd\r
1336         ADD ESI,EAX\r
1337         XOR EAX,EAX\r
1338         MOV AL,_hd_drive\r
1339         MOV ECX,4\r
1340         SHL EAX,CL\r
1341         AND EAX,0FFh\r
1342         MOV EBX,EAX\r
1343         XOR EAX,EAX\r
1344         MOV AL,_hd_head\r
1345         MOV ECX,15\r
1346         AND EAX,ECX\r
1347         MOV ECX,EBX\r
1348         OR EAX,ECX\r
1349         MOV ECX,160\r
1350         OR EAX,ECX\r
1351         MOV BYTE PTR [ESI], AL\r
1352         PUSH 32\r
1353         CALL _send_command\r
1354         MOV DWORD PTR [EBP-4], EAX\r
1355         CALL _hd_wait\r
1356         MOV DWORD PTR [EBP-4], EAX\r
1357         MOV EAX,DWORD PTR [EBP-4]\r
1358         AND EAX,EAX\r
1359         JNZ L_114\r
1360         PUSH 32\r
1361         CALL _hd_status\r
1362         MOV DWORD PTR [EBP-4], EAX\r
1363 L_114:\r
1364         MOV EAX,DWORD PTR [EBP-4]\r
1365         AND EAX,EAX\r
1366         JNZ L_115\r
1367         PUSH 496\r
1368         PUSH DWORD PTR [EBP+8]\r
1369         PUSH 512\r
1370         CALL FWORD PTR _InWords\r
1371 L_115:\r
1372         MOV EAX,DWORD PTR [EBP-4]\r
1373         MOV ESP,EBP\r
1374         POP EBP\r
1375         RETN 12\r
1376 _hddev_op:\r
1377         PUSH EBP\r
1378         MOV EBP,ESP\r
1379         SUB ESP,4\r
1380         MOV ESI,OFFSET _hdstatus\r
1381         XOR EAX,EAX\r
1382         MOV DWORD PTR [ESI+4], EAX\r
1383         XOR EAX,EAX\r
1384         MOV DWORD PTR [EBP-4], EAX\r
1385         MOV EAX,DWORD PTR [EBP+24]\r
1386         CMP EAX,12\r
1387         SETE AL\r
1388         AND AL,AL\r
1389         JZ L_117\r
1390         XOR EAX,EAX\r
1391         MOV _hd_drive, AL\r
1392         JMP L_118\r
1393 L_117:\r
1394         MOV EAX,1\r
1395         MOV _hd_drive, AL\r
1396 L_118:\r
1397         PUSH _hd_exch\r
1398         PUSH OFFSET _hd_msg\r
1399         CALL FWORD PTR _CheckMsg\r
1400         XOR EAX,EAX\r
1401         MOV AL,_hd_drive\r
1402         XOR ECX,ECX\r
1403         CMP EAX,ECX\r
1404         SETE AL\r
1405         AND AL,AL\r
1406         JZ L_119\r
1407         XOR EAX,EAX\r
1408         MOV AL,_hd0_type\r
1409         XOR ECX,ECX\r
1410         CMP EAX,ECX\r
1411         SETE AL\r
1412         AND AL,AL\r
1413         JZ L_120\r
1414         MOV EAX,663\r
1415         MOV DWORD PTR [EBP-4], EAX\r
1416 L_120:\r
1417         JMP L_121\r
1418 L_119:\r
1419         XOR EAX,EAX\r
1420         MOV AL,_hd1_type\r
1421         XOR ECX,ECX\r
1422         CMP EAX,ECX\r
1423         SETE AL\r
1424         AND AL,AL\r
1425         JZ L_122\r
1426         MOV EAX,663\r
1427         MOV DWORD PTR [EBP-4], EAX\r
1428 L_122:\r
1429 L_121:\r
1430         MOV EAX,DWORD PTR [EBP-4]\r
1431         AND EAX,EAX\r
1432         JNZ L_123\r
1433         XOR EAX,EAX\r
1434         MOV AL,_hd_drive\r
1435         MOV ECX,64\r
1436         MUL ECX\r
1437         MOV ESI,OFFSET _hdcb\r
1438         ADD ESI,EAX\r
1439         MOV EAX,DWORD PTR [EBP+16]\r
1440         CMP EAX,DWORD PTR [ESI+20]\r
1441         SETA AL\r
1442         AND AL,AL\r
1443         JZ L_124\r
1444         MOV EAX,662\r
1445         MOV DWORD PTR [EBP-4], EAX\r
1446 L_124:\r
1447 L_123:\r
1448         MOV EAX,DWORD PTR [EBP-4]\r
1449         AND EAX,EAX\r
1450         JNZ L_125\r
1451         MOV EAX,DWORD PTR [EBP+20]\r
1452         JMP L_127\r
1453 L_128:\r
1454         XOR EAX,EAX\r
1455         MOV DWORD PTR [EBP-4], EAX\r
1456         JMP L_126\r
1457 L_129:\r
1458         PUSH DWORD PTR [EBP+16]\r
1459         PUSH DWORD PTR [EBP+12]\r
1460         PUSH DWORD PTR [EBP+8]\r
1461         CALL _hd_read\r
1462         MOV DWORD PTR [EBP-4], EAX\r
1463         JMP L_126\r
1464 L_130:\r
1465         PUSH DWORD PTR [EBP+16]\r
1466         PUSH DWORD PTR [EBP+12]\r
1467         PUSH DWORD PTR [EBP+8]\r
1468         CALL _hd_write\r
1469         MOV DWORD PTR [EBP-4], EAX\r
1470         JMP L_126\r
1471 L_131:\r
1472         MOV EAX,656\r
1473         MOV DWORD PTR [EBP-4], EAX\r
1474         JMP L_126\r
1475 L_132:\r
1476         PUSH DWORD PTR [EBP+16]\r
1477         CALL _hd_seek\r
1478         MOV DWORD PTR [EBP-4], EAX\r
1479         JMP L_126\r
1480 L_133:\r
1481         PUSH DWORD PTR [EBP+16]\r
1482         PUSH DWORD PTR [EBP+12]\r
1483         CALL _hd_format_track\r
1484         MOV DWORD PTR [EBP-4], EAX\r
1485         JMP L_126\r
1486 L_134:\r
1487         CALL _hd_reset\r
1488         XOR EAX,EAX\r
1489         MOV DWORD PTR [EBP-4], EAX\r
1490         JMP L_126\r
1491 L_135:\r
1492         PUSH DWORD PTR [EBP+16]\r
1493         PUSH DWORD PTR [EBP+12]\r
1494         PUSH DWORD PTR [EBP+8]\r
1495         CALL _ReadSector\r
1496         MOV DWORD PTR [EBP-4], EAX\r
1497         JMP L_126\r
1498 L_136:\r
1499         MOV EAX,664\r
1500         MOV DWORD PTR [EBP-4], EAX\r
1501         JMP L_126\r
1502 L_127:\r
1503         CMP EAX,256\r
1504         JE L_135\r
1505         CMP EAX,8\r
1506         JE L_134\r
1507         CMP EAX,5\r
1508         JE L_133\r
1509         CMP EAX,6\r
1510         JE L_132\r
1511         CMP EAX,3\r
1512         JE L_131\r
1513         CMP EAX,2\r
1514         JE L_130\r
1515         CMP EAX,1\r
1516         JE L_129\r
1517         CMP EAX,0\r
1518         JE L_128\r
1519         JMP L_136\r
1520 L_126:\r
1521 L_125:\r
1522         XOR EAX,EAX\r
1523         MOV AL,_hd_drive\r
1524         MOV ECX,64\r
1525         MUL ECX\r
1526         MOV ESI,OFFSET _hdcb\r
1527         ADD ESI,EAX\r
1528         MOV EAX,DWORD PTR [EBP-4]\r
1529         MOV DWORD PTR [ESI+16], EAX\r
1530         MOV EAX,DWORD PTR [EBP-4]\r
1531 L_137:\r
1532         MOV ESP,EBP\r
1533         POP EBP\r
1534         RETN 20\r
1535 _hddev_stat:\r
1536         PUSH EBP\r
1537         MOV EBP,ESP\r
1538         SUB ESP,4\r
1539         MOV EAX,DWORD PTR [EBP+20]\r
1540         CMP EAX,12\r
1541         SETE AL\r
1542         AND AL,AL\r
1543         JZ L_138\r
1544         MOV ESI,OFFSET _hdstatus\r
1545         MOV EBX,ESI\r
1546         MOV ESI,OFFSET _hdcb\r
1547         MOV EAX,DWORD PTR [ESI+16]\r
1548         MOV DWORD PTR [EBX], EAX\r
1549         MOV ESI,OFFSET _hdstatus\r
1550         XOR EAX,EAX\r
1551         MOV AL,_hd0_type\r
1552         MOV BYTE PTR [ESI+13], AL\r
1553         MOV ESI,OFFSET _hdstatus\r
1554         MOVZX EAX,_hd0_cyls\r
1555         MOV DWORD PTR [ESI+16], EAX\r
1556         MOV ESI,OFFSET _hdstatus\r
1557         XOR EAX,EAX\r
1558         MOV AL,_hd0_heads\r
1559         MOV DWORD PTR [ESI+20], EAX\r
1560         MOV ESI,OFFSET _hdstatus\r
1561         XOR EAX,EAX\r
1562         MOV AL,_hd0_secpertrk\r
1563         MOV DWORD PTR [ESI+24], EAX\r
1564         MOV ESI,OFFSET _hdstatus\r
1565         MOV EBX,ESI\r
1566         MOV ESI,OFFSET _hdcb\r
1567         MOVSX EAX,WORD PTR [ESI+14]\r
1568         MOV DWORD PTR [EBX+28], EAX\r
1569         JMP L_139\r
1570 L_138:\r
1571         MOV ESI,OFFSET _hdstatus\r
1572         MOV EAX,64\r
1573         MOV EBX,ESI\r
1574         MOV ESI,OFFSET _hdcb\r
1575         ADD ESI,EAX\r
1576         MOV EAX,DWORD PTR [ESI+16]\r
1577         MOV DWORD PTR [EBX], EAX\r
1578         MOV ESI,OFFSET _hdstatus\r
1579         XOR EAX,EAX\r
1580         MOV AL,_hd1_type\r
1581         MOV BYTE PTR [ESI+13], AL\r
1582         MOV ESI,OFFSET _hdstatus\r
1583         MOVZX EAX,_hd1_cyls\r
1584         MOV DWORD PTR [ESI+16], EAX\r
1585         MOV ESI,OFFSET _hdstatus\r
1586         XOR EAX,EAX\r
1587         MOV AL,_hd1_heads\r
1588         MOV DWORD PTR [ESI+20], EAX\r
1589         MOV ESI,OFFSET _hdstatus\r
1590         XOR EAX,EAX\r
1591         MOV AL,_hd1_secpertrk\r
1592         MOV DWORD PTR [ESI+24], EAX\r
1593         MOV ESI,OFFSET _hdstatus\r
1594         MOV EAX,64\r
1595         MOV EBX,ESI\r
1596         MOV ESI,OFFSET _hdcb\r
1597         ADD ESI,EAX\r
1598         MOVSX EAX,WORD PTR [ESI+14]\r
1599         MOV DWORD PTR [EBX+28], EAX\r
1600 L_139:\r
1601         MOV EAX,DWORD PTR [EBP+12]\r
1602         CMP EAX,64\r
1603         SETBE AL\r
1604         AND AL,AL\r
1605         JZ L_140\r
1606         MOV EAX,DWORD PTR [EBP+12]\r
1607         MOV DWORD PTR [EBP-4], EAX\r
1608         JMP L_141\r
1609 L_140:\r
1610         MOV EAX,64\r
1611         MOV DWORD PTR [EBP-4], EAX\r
1612 L_141:\r
1613         PUSH OFFSET _hdstatus\r
1614         PUSH DWORD PTR [EBP+16]\r
1615         PUSH DWORD PTR [EBP-4]\r
1616         CALL FWORD PTR _CopyData\r
1617         MOV ESI,DWORD PTR [EBP+8]\r
1618         MOV EAX,DWORD PTR [EBP-4]\r
1619         MOV DWORD PTR [ESI], EAX\r
1620         XOR EAX,EAX\r
1621         MOV ESP,EBP\r
1622         POP EBP\r
1623         RETN 16\r
1624 _hddev_init:\r
1625         PUSH EBP\r
1626         MOV EBP,ESP\r
1627         SUB ESP,8\r
1628         XOR EAX,EAX\r
1629         MOV DWORD PTR [EBP-4], EAX\r
1630         MOV EAX,DWORD PTR [EBP+8]\r
1631         CMP EAX,64\r
1632         SETA AL\r
1633         AND AL,AL\r
1634         JZ L_143\r
1635         MOV EAX,64\r
1636         MOV DWORD PTR [EBP-8], EAX\r
1637         JMP L_144\r
1638 L_143:\r
1639         MOV EAX,DWORD PTR [EBP+8]\r
1640         MOV DWORD PTR [EBP-8], EAX\r
1641 L_144:\r
1642         PUSH DWORD PTR [EBP+12]\r
1643         PUSH OFFSET _HDStatTmp\r
1644         PUSH DWORD PTR [EBP-8]\r
1645         CALL FWORD PTR _CopyData\r
1646         MOV EAX,DWORD PTR [EBP+16]\r
1647         CMP EAX,12\r
1648         SETE AL\r
1649         AND AL,AL\r
1650         JZ L_145\r
1651         XOR EAX,EAX\r
1652         MOV _hd_drive, AL\r
1653         JMP L_146\r
1654 L_145:\r
1655         MOV EAX,1\r
1656         MOV _hd_drive, AL\r
1657 L_146:\r
1658         XOR EAX,EAX\r
1659         MOV AL,_hd_drive\r
1660         XOR ECX,ECX\r
1661         CMP EAX,ECX\r
1662         SETE AL\r
1663         AND AL,AL\r
1664         JZ L_147\r
1665         MOV ESI,OFFSET _HDStatTmp\r
1666         XOR EAX,EAX\r
1667         MOV AL,BYTE PTR [ESI+13]\r
1668         MOV _hd0_type, AL\r
1669         XOR EAX,EAX\r
1670         MOV AL,_hd0_type\r
1671         AND EAX,EAX\r
1672         JZ L_148\r
1673         MOV ESI,OFFSET _HDStatTmp\r
1674         MOV EAX,DWORD PTR [ESI+16]\r
1675         MOV _hd0_cyls, AX\r
1676         MOV ESI,OFFSET _HDStatTmp\r
1677         MOV EAX,DWORD PTR [ESI+20]\r
1678         MOV _hd0_heads, AL\r
1679         MOV ESI,OFFSET _HDStatTmp\r
1680         MOV EAX,DWORD PTR [ESI+24]\r
1681         MOV _hd0_secpertrk, AL\r
1682         JMP L_149\r
1683 L_148:\r
1684         MOV EAX,663\r
1685         MOV DWORD PTR [EBP-4], EAX\r
1686 L_149:\r
1687         JMP L_150\r
1688 L_147:\r
1689         MOV ESI,OFFSET _HDStatTmp\r
1690         XOR EAX,EAX\r
1691         MOV AL,BYTE PTR [ESI+13]\r
1692         MOV _hd1_type, AL\r
1693         XOR EAX,EAX\r
1694         MOV AL,_hd1_type\r
1695         AND EAX,EAX\r
1696         JZ L_151\r
1697         MOV ESI,OFFSET _HDStatTmp\r
1698         MOV EAX,DWORD PTR [ESI+16]\r
1699         MOV _hd1_cyls, AX\r
1700         MOV ESI,OFFSET _HDStatTmp\r
1701         MOV EAX,DWORD PTR [ESI+20]\r
1702         MOV _hd1_heads, AL\r
1703         MOV ESI,OFFSET _HDStatTmp\r
1704         MOV EAX,DWORD PTR [ESI+24]\r
1705         MOV _hd1_secpertrk, AL\r
1706         JMP L_152\r
1707 L_151:\r
1708         MOV EAX,663\r
1709         MOV DWORD PTR [EBP-4], EAX\r
1710 L_152:\r
1711 L_150:\r
1712         MOV EAX,DWORD PTR [EBP-4]\r
1713         AND EAX,EAX\r
1714         JNZ L_153\r
1715         XOR EAX,EAX\r
1716         MOV AL,_hd_drive\r
1717         PUSH EAX\r
1718         CALL _hd_init\r
1719         MOV DWORD PTR [EBP-4], EAX\r
1720 L_153:\r
1721         MOV EAX,DWORD PTR [EBP-4]\r
1722         AND EAX,EAX\r
1723         JNZ L_154\r
1724         XOR EAX,EAX\r
1725         MOV AL,_hd_drive\r
1726         PUSH EAX\r
1727         CALL _hd_recal\r
1728         MOV DWORD PTR [EBP-4], EAX\r
1729 L_154:\r
1730         MOV EAX,DWORD PTR [EBP-4]\r
1731         AND EAX,EAX\r
1732         JNZ L_155\r
1733         XOR EAX,EAX\r
1734         MOV AL,_hd_drive\r
1735         MOV ECX,64\r
1736         MUL ECX\r
1737         MOV ESI,OFFSET _hdcb\r
1738         ADD ESI,EAX\r
1739         MOV EBX,ESI\r
1740         MOV ESI,OFFSET _HDStatTmp\r
1741         MOV EAX,DWORD PTR [ESI+28]\r
1742         MOV WORD PTR [EBX+14], AX\r
1743         XOR EAX,EAX\r
1744         MOV AL,_hd_drive\r
1745         MOV ECX,64\r
1746         MUL ECX\r
1747         MOV ESI,OFFSET _hdcb\r
1748         ADD ESI,EAX\r
1749         XOR EAX,EAX\r
1750         MOV DWORD PTR [ESI+16], EAX\r
1751         XOR EAX,EAX\r
1752         MOV AL,_hd_drive\r
1753         MOV ECX,64\r
1754         MUL ECX\r
1755         MOV ESI,OFFSET _hdcb\r
1756         ADD ESI,EAX\r
1757         MOV EBX,ESI\r
1758         MOV ESI,OFFSET _HDStatTmp\r
1759         PUSH EBX\r
1760         MOV EBX,ESI\r
1761         MOV ESI,OFFSET _HDStatTmp\r
1762         MOV EAX,DWORD PTR [EBX+16]\r
1763         MOV ECX,DWORD PTR [ESI+24]\r
1764         MUL ECX\r
1765         MOV EBX,EAX\r
1766         MOV ESI,OFFSET _HDStatTmp\r
1767         MOV EAX,EBX\r
1768         MOV ECX,DWORD PTR [ESI+20]\r
1769         MUL ECX\r
1770         POP EDX\r
1771         MOV DWORD PTR [EDX+20], EAX\r
1772 L_155:\r
1773         XOR EAX,EAX\r
1774         MOV AL,_hd_drive\r
1775         MOV ECX,64\r
1776         MUL ECX\r
1777         MOV ESI,OFFSET _hdcb\r
1778         ADD ESI,EAX\r
1779         MOV EAX,DWORD PTR [EBP-4]\r
1780         MOV DWORD PTR [ESI+16], EAX\r
1781         MOV EAX,DWORD PTR [EBP-4]\r
1782         MOV ESP,EBP\r
1783         POP EBP\r
1784         RETN 12\r