Rev 3711 | Rev 4700 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2288 | clevermous | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
3742 | clevermous | 3 | ;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;; |
2288 | clevermous | 4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
||
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
7 | |||
8 | $Revision: 3742 $ |
||
9 | |||
3742 | clevermous | 10 | search_partitions: |
11 | ; 1. Fill missing parameters in HD_DATA structures. |
||
12 | mov eax, [hd_address_table] |
||
13 | mov [hd0_data.hdbase], eax ;0x1f0 |
||
14 | mov [hd1_data.hdbase], eax |
||
15 | mov eax, [hd_address_table+16] |
||
16 | mov [hd2_data.hdbase], eax |
||
17 | mov [hd3_data.hdbase], eax |
||
18 | ; 2. Notify the system about /hd* disks. |
||
19 | ; For every existing disk, call ide_disk_add with correct parameters. |
||
20 | ; Generate name "hdN" on the stack; this is 4 bytes including terminating zero. |
||
21 | ; 2a. /hd0: exists if mask 0x40 in [DRIVE_DATA+1] is set, |
||
22 | ; data: hd0_data, |
||
23 | ; number of partitions: [DRIVE_DATA+2] |
||
2288 | clevermous | 24 | test [DRIVE_DATA+1], byte 0x40 |
3742 | clevermous | 25 | jz @f |
26 | push 'hd0' |
||
27 | mov eax, esp ; name |
||
28 | mov edx, hd0_data |
||
29 | call ide_disk_add |
||
30 | mov [DRIVE_DATA+2], al |
||
31 | pop ecx ; restore the stack |
||
32 | @@: |
||
33 | ; 2b. /hd1: exists if mask 0x10 in [DRIVE_DATA+1] is set, |
||
34 | ; data: hd1_data, |
||
35 | ; number of partitions: [DRIVE_DATA+3] |
||
2288 | clevermous | 36 | test [DRIVE_DATA+1], byte 0x10 |
3742 | clevermous | 37 | jz @f |
38 | push 'hd1' |
||
39 | mov eax, esp |
||
40 | mov edx, hd1_data |
||
41 | call ide_disk_add |
||
42 | mov [DRIVE_DATA+3], al |
||
2288 | clevermous | 43 | pop ecx |
3742 | clevermous | 44 | @@: |
45 | ; 2c. /hd2: exists if mask 4 in [DRIVE_DATA+1] is set, |
||
46 | ; data: hd2_data, |
||
47 | ; number of partitions: [DRIVE_DATA+4] |
||
48 | test [DRIVE_DATA+1], byte 4 |
||
49 | jz @f |
||
50 | push 'hd2' |
||
51 | mov eax, esp |
||
52 | mov edx, hd2_data |
||
53 | call ide_disk_add |
||
54 | mov [DRIVE_DATA+4], al |
||
55 | pop ecx |
||
56 | @@: |
||
57 | ; 2d. /hd3: exists if mask 1 in [DRIVE_DATA+1] is set, |
||
58 | ; data: hd3_data, |
||
59 | ; number of partitions: [DRIVE_DATA+5] |
||
60 | test [DRIVE_DATA+1], byte 1 |
||
61 | jz @f |
||
62 | push 'hd3' |
||
63 | mov eax, esp |
||
64 | mov edx, hd3_data |
||
65 | call ide_disk_add |
||
66 | mov [DRIVE_DATA+5], al |
||
67 | pop ecx |
||
68 | @@: |
||
69 | ; 3. Notify the system about /bd* disks. |
||
70 | ; 3a. Check whether there are BIOS disks. If no, skip step 3. |
||
71 | xor esi, esi |
||
72 | cmp esi, [NumBiosDisks] |
||
73 | jz .nobd |
||
74 | ; Loop over all disks. |
||
75 | push 0 |
||
76 | push 'bd' |
||
77 | .bdloop: |
||
78 | ; 3b. Get the drive number for using in /bd* name. |
||
79 | movzx eax, byte [BiosDisksData+esi*4] |
||
80 | sub al, 80h |
||
81 | ; 3c. Convert eax to decimal and store starting with [esp+3]. |
||
82 | ; First 2 bytes in [esp] are "bd". |
||
83 | lea edi, [esp+2] |
||
84 | ; store digits in the stack, ending with -'0' |
||
85 | push -'0' |
||
86 | @@: |
||
87 | xor edx, edx |
||
88 | iglobal |
||
89 | align 4 |
||
90 | _10 dd 10 |
||
91 | endg |
||
92 | div [_10] |
||
93 | push edx |
||
94 | test eax, eax |
||
95 | jnz @b |
||
96 | ; restore digits from the stack, this reverses the order; |
||
97 | ; add '0', stop, when zero is reached |
||
98 | @@: |
||
99 | pop eax |
||
100 | add al, '0' |
||
101 | stosb |
||
102 | jnz @b |
||
103 | ; 3e. Call the API with userdata = 80h + ecx. |
||
104 | mov eax, esp |
||
105 | lea edx, [esi+80h] |
||
106 | stdcall disk_add, bd_callbacks, eax, edx, 0 |
||
107 | test eax, eax |
||
108 | jz @f |
||
109 | stdcall disk_media_changed, eax, 1 |
||
110 | @@: |
||
111 | ; 3f. Continue the loop. |
||
112 | inc esi |
||
113 | cmp esi, [NumBiosDisks] |
||
114 | jnz .bdloop |
||
115 | pop ecx ecx ; restore stack after name |
||
116 | .nobd: |
||
2288 | clevermous | 117 | jmp end_search_partitions |
118 | |||
3742 | clevermous | 119 | ; Helper procedure for search_partitions, adds one IDE disk. |
120 | ; For compatibility, number of partitions for IDE disks is kept in a separate variable, |
||
121 | ; so the procedure returns number of partitions. |
||
122 | ; eax -> name, edx -> disk data |
||
123 | proc ide_disk_add |
||
124 | stdcall disk_add, ide_callbacks, eax, edx, 0 |
||
125 | test eax, eax |
||
126 | jz @f |
||
127 | push eax |
||
128 | stdcall disk_media_changed, eax, 1 |
||
129 | pop eax |
||
130 | mov eax, [eax+DISK.NumPartitions] |
||
131 | cmp eax, 255 |
||
132 | jbe @f |
||
133 | mov eax, 255 |
||
134 | @@: |
||
2288 | clevermous | 135 | ret |
3742 | clevermous | 136 | endp |
2288 | clevermous | 137 | |
1410 | turbanoff | 138 | end_search_partitions: |
139 |