Rev 1168 | Rev 2288 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1168 | Rev 1276 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 1168 $ |
8 | $Revision: 1276 $ |
9 | 9 | ||
10 | 10 | ||
11 | ;********************************************************** |
11 | ;********************************************************** |
12 | ; Íåïîñðåäñòâåííàÿ ðàáîòà ñ óñòðîéñòâîì ÑD (ATAPI) |
12 | ; Íåïîñðåäñòâåííàÿ ðàáîòà ñ óñòðîéñòâîì ÑD (ATAPI) |
Line 13... | Line 13... | ||
13 | ;********************************************************** |
13 | ;********************************************************** |
14 | ; Àâòîð ÷àñòè èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷ |
14 | ; Àâòîð ÷àñòè èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷ |
15 | ; Àäàïòàöèÿ, äîðàáîòêà è ðàçðàáîòêà Mario79 |
15 | ; Àäàïòàöèÿ, äîðàáîòêà è ðàçðàáîòêà Mario79, |
16 | 16 | ||
17 | ; Ìàêñèìàëüíîå êîëè÷åñòâî ïîâòîðåíèé îïåðàöèè ÷òåíèÿ |
17 | ; Ìàêñèìàëüíîå êîëè÷åñòâî ïîâòîðåíèé îïåðàöèè ÷òåíèÿ |
18 | MaxRetr equ 10 |
18 | MaxRetr equ 10 |
19 | ; Ïðåäåëüíîå âðåìÿ îæèäàíèÿ ãîòîâíîñòè ê ïðèåìó êîìàíäû |
- | |
20 | ; (â òèêàõ) |
- | |
21 | BSYWaitTime equ 1000 ;2 |
- | |
22 | NoTickWaitTime equ 0xfffff |
- | |
23 | - | ||
24 | ;************************************************* |
- | |
25 | ;* ÏÎËÍÎÅ ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÊÎÌÏÀÊÒ-ÄÈÑÊÀ * |
- | |
26 | ;* Ñ÷èòûâàþòñÿ äàííûå ïîëüçîâàòåëÿ, èíôîðìàöèÿ * |
- | |
27 | ;* ñóáêàíàëà è êîíòðîëüíàÿ èíôîðìàöèÿ * |
- | |
28 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
- | |
29 | ;* ïåðìåííûå: * |
- | |
30 | ;* ChannelNumber - íîìåð êàíàëà; * |
- | |
31 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå; * |
- | |
32 | ;* CDSectorAddress - àäðåñ ñ÷èòûâàåìîãî ñåêòîðà. * |
- | |
33 | ;* Äàííûå ñ÷èòûâàåòñÿ â ìàññèâ CDDataBuf. * |
- | |
34 | ;************************************************* |
19 | ; Ïðåäåëüíîå âðåìÿ îæèäàíèÿ ãîòîâíîñòè ê ïðèåìó êîìàíäû |
35 | ReadCD: |
- | |
36 | pusha |
- | |
37 | ; Çàäàòü ðàçìåð ñåêòîðà |
- | |
38 | mov [CDBlockSize],2048 ;2352 |
- | |
39 | ; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû |
- | |
40 | call clear_packet_buffer |
- | |
41 | ; Ñôîðìèðîâàòü ïàêåòíóþ êîìàíäó äëÿ ñ÷èòûâàíèÿ |
- | |
42 | ; ñåêòîðà äàííûõ |
- | |
43 | ; Çàäàòü êîä êîìàíäû Read CD |
- | |
44 | mov [PacketCommand],byte 0x28 ;0xBE |
- | |
45 | ; Çàäàòü àäðåñ ñåêòîðà |
- | |
46 | mov AX,word [CDSectorAddress+2] |
- | |
47 | xchg AL,AH |
- | |
48 | mov word [PacketCommand+2],AX |
- | |
49 | mov AX,word [CDSectorAddress] |
- | |
50 | xchg AL,AH |
- | |
51 | mov word [PacketCommand+4],AX |
- | |
52 | ; mov eax,[CDSectorAddress] |
- | |
53 | ; mov [PacketCommand+2],eax |
- | |
54 | ; Çàäàòü êîëè÷åñòâî ñ÷èòûâàåìûõ ñåêòîðîâ |
- | |
55 | mov [PacketCommand+8],byte 1 |
- | |
56 | ; Çàäàòü ñ÷èòûâàíèå äàííûõ â ïîëíîì îáúåìå |
- | |
57 | ; mov [PacketCommand+9],byte 0xF8 |
- | |
58 | ; Ïîäàòü êîìàíäó |
- | |
59 | call SendPacketDatCommand |
20 | ; (â òèêàõ) |
60 | popa |
21 | BSYWaitTime equ 1000 ;2 |
61 | ret |
22 | NoTickWaitTime equ 0xfffff |
62 | 23 | CDBlockSize equ 2048 |
|
63 | ;******************************************** |
24 | ;******************************************** |
Line 71... | Line 32... | ||
71 | ;----------------------------------------------------------- |
32 | ;----------------------------------------------------------- |
72 | pushad |
33 | pushad |
73 | mov eax,[CDSectorAddress] |
34 | mov eax,[CDSectorAddress] |
74 | mov ebx,[CDDataBuf_pointer] |
35 | mov ebx,[CDDataBuf_pointer] |
75 | call cd_calculate_cache |
36 | call cd_calculate_cache |
- | 37 | xor edi,edi |
|
76 | add esi,8 |
38 | add esi,8 |
77 | mov edi,1 |
39 | inc edi |
78 | .hdreadcache: |
40 | .hdreadcache: |
79 | ; cmp dword [esi+4],0 ; empty |
41 | ; cmp dword [esi+4],0 ; empty |
80 | ; je .nohdcache |
42 | ; je .nohdcache |
81 | cmp [esi],eax ; correct sector |
43 | cmp [esi],eax ; correct sector |
82 | je .yeshdcache |
44 | je .yeshdcache |
Line 126... | Line 88... | ||
126 | ; Öèêë, ïîêà êîìàíäà íå âûïîëíåíà óñïåøíî èëè íå |
88 | ; Öèêë, ïîêà êîìàíäà íå âûïîëíåíà óñïåøíî èëè íå |
127 | ; èñ÷åðïàíî êîëè÷åñòâî ïîïûòîê |
89 | ; èñ÷åðïàíî êîëè÷åñòâî ïîïûòîê |
128 | mov ECX,MaxRetr |
90 | mov ECX,MaxRetr |
129 | @@NextRetr: |
91 | @@NextRetr: |
130 | ; Ïîäàòü êîìàíäó |
92 | ; Ïîäàòü êîìàíäó |
- | 93 | ;************************************************* |
|
- | 94 | ;* ÏÎËÍÎÅ ×ÒÅÍÈÅ ÑÅÊÒÎÐÀ ÊÎÌÏÀÊÒ-ÄÈÑÊÀ * |
|
- | 95 | ;* Ñ÷èòûâàþòñÿ äàííûå ïîëüçîâàòåëÿ, èíôîðìàöèÿ * |
|
- | 96 | ;* ñóáêàíàëà è êîíòðîëüíàÿ èíôîðìàöèÿ * |
|
- | 97 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
|
- | 98 | ;* ïåðìåííûå: * |
|
- | 99 | ;* ChannelNumber - íîìåð êàíàëà; * |
|
- | 100 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå; * |
|
- | 101 | ;* CDSectorAddress - àäðåñ ñ÷èòûâàåìîãî ñåêòîðà. * |
|
- | 102 | ;* Äàííûå ñ÷èòûâàåòñÿ â ìàññèâ CDDataBuf. * |
|
- | 103 | ;************************************************* |
|
- | 104 | ;ReadCD: |
|
- | 105 | push ecx |
|
- | 106 | ; pusha |
|
- | 107 | ; Çàäàòü ðàçìåð ñåêòîðà |
|
- | 108 | ; mov [CDBlockSize],2048 ;2352 |
|
- | 109 | ; Î÷èñòèòü áóôåð ïàêåòíîé êîìàíäû |
|
- | 110 | call clear_packet_buffer |
|
- | 111 | ; Ñôîðìèðîâàòü ïàêåòíóþ êîìàíäó äëÿ ñ÷èòûâàíèÿ |
|
- | 112 | ; ñåêòîðà äàííûõ |
|
- | 113 | ; Çàäàòü êîä êîìàíäû Read CD |
|
- | 114 | mov [PacketCommand],byte 0x28 ;0xBE |
|
- | 115 | ; Çàäàòü àäðåñ ñåêòîðà |
|
- | 116 | mov AX,word [CDSectorAddress+2] |
|
- | 117 | xchg AL,AH |
|
- | 118 | mov word [PacketCommand+2],AX |
|
- | 119 | mov AX,word [CDSectorAddress] |
|
- | 120 | xchg AL,AH |
|
- | 121 | mov word [PacketCommand+4],AX |
|
- | 122 | ; mov eax,[CDSectorAddress] |
|
- | 123 | ; mov [PacketCommand+2],eax |
|
- | 124 | ; Çàäàòü êîëè÷åñòâî ñ÷èòûâàåìûõ ñåêòîðîâ |
|
- | 125 | mov [PacketCommand+8],byte 1 |
|
- | 126 | ; Çàäàòü ñ÷èòûâàíèå äàííûõ â ïîëíîì îáúåìå |
|
- | 127 | ; mov [PacketCommand+9],byte 0xF8 |
|
- | 128 | ; Ïîäàòü êîìàíäó |
|
- | 129 | call SendPacketDatCommand |
|
131 | call ReadCD |
130 | pop ecx |
- | 131 | ; ret |
|
- | 132 | ||
132 | cmp [DevErrorCode],0 |
133 | ; cmp [DevErrorCode],0 |
- | 134 | test eax,eax |
|
133 | je @@End_4 |
135 | jz @@End_4 |
Line 134... | Line 136... | ||
134 | 136 | ||
135 | or ecx,ecx ;{SPraid.simba} (for cd load) |
137 | or ecx,ecx ;{SPraid.simba} (for cd load) |
136 | jz @@End_4 |
138 | jz @@End_4 |
Line 137... | Line 139... | ||
137 | dec ecx |
139 | dec ecx |
138 | 140 | ||
139 | cmp [timer_ticks_enable],0 |
141 | cmp [timer_ticks_enable],0 |
140 | jne @f |
142 | jne @f |
141 | mov eax,NoTickWaitTime |
143 | mov eax,NoTickWaitTime |
142 | .wait: |
144 | .wait: |
143 | dec eax |
145 | dec eax |
144 | cmp eax,0 |
146 | ; test eax,eax |
145 | je @@NextRetr |
147 | jz @@NextRetr |
146 | jmp .wait |
148 | jmp .wait |
147 | @@: |
149 | @@: |
148 | ; Çàäåðæêà íà 2,5 ñåêóíäû |
150 | ; Çàäåðæêà íà 2,5 ñåêóíäû |
Line 152... | Line 154... | ||
152 | ; call change_task |
154 | ; call change_task |
153 | ; cmp EAX,[timer_ticks] |
155 | ; cmp EAX,[timer_ticks] |
154 | ; ja @@Wait |
156 | ; ja @@Wait |
155 | loop @@NextRetr |
157 | loop @@NextRetr |
156 | @@End_4: |
158 | @@End_4: |
- | 159 | mov dword [DevErrorCode],eax |
|
157 | popad |
160 | popad |
158 | ret |
161 | ret |
Line 159... | Line 162... | ||
159 | 162 | ||
160 | 163 | ||
Line 161... | Line 164... | ||
161 | ; Óíèâåðñàëüíûå ïðîöåäóðû, îáåñïå÷èâàþùèå âûïîëíåíèå |
164 | ; Óíèâåðñàëüíûå ïðîöåäóðû, îáåñïå÷èâàþùèå âûïîëíåíèå |
162 | ; ïàêåòíûõ êîìàíä â ðåæèìå PIO |
165 | ; ïàêåòíûõ êîìàíä â ðåæèìå PIO |
163 | - | ||
Line -... | Line 166... | ||
- | 166 | ||
- | 167 | ; Ìàêñèìàëüíî äîïóñòèìîå âðåìÿ îæèäàíèÿ ðåàêöèè |
|
164 | ; Ìàêñèìàëüíî äîïóñòèìîå âðåìÿ îæèäàíèÿ ðåàêöèè |
168 | ; óñòðîéñòâà íà ïàêåòíóþ êîìàíäó (â òèêàõ) |
165 | ; óñòðîéñòâà íà ïàêåòíóþ êîìàíäó (â òèêàõ) |
169 | |
166 | MaxCDWaitTime equ 1000 ;200 ;10 ñåêóíä |
170 | MaxCDWaitTime equ 1000 ;200 ;10 ñåêóíä |
167 | 171 | uglobal |
|
168 | ; Îáëàñòü ïàìÿòè äëÿ ôîðìèðîâàíèÿ ïàêåòíîé êîìàíäû |
172 | ; Îáëàñòü ïàìÿòè äëÿ ôîðìèðîâàíèÿ ïàêåòíîé êîìàíäû |
169 | PacketCommand: rb 12 ;DB 12 DUP (?) |
173 | PacketCommand: rb 12 ;DB 12 DUP (?) |
170 | ; Îáëàñòü ïàìÿòè äëÿ ïðèåìà äàííûõ îò äèñêîâîäà |
174 | ; Îáëàñòü ïàìÿòè äëÿ ïðèåìà äàííûõ îò äèñêîâîäà |
171 | ;CDDataBuf DB 4096 DUP (0) |
175 | ;CDDataBuf DB 4096 DUP (0) |
172 | ; Ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ â áàéòàõ |
176 | ; Ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ â áàéòàõ |
173 | CDBlockSize DW ? |
177 | ;CDBlockSize DW ? |
174 | ; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà äàííûõ |
178 | ; Àäðåñ ñ÷èòûâàåìîãî ñåêòîðà äàííûõ |
175 | CDSectorAddress: DD ? |
179 | CDSectorAddress: DD ? |
176 | ; Âðåìÿ íà÷àëà î÷åðåäíîé îïåðàöèè ñ äèñêîì |
180 | ; Âðåìÿ íà÷àëà î÷åðåäíîé îïåðàöèè ñ äèñêîì |
177 | TickCounter_1 DD 0 |
181 | TickCounter_1 DD 0 |
178 | ; Âðåìÿ íà÷àëà îæèäàíèÿ ãîòîâíîñòè óñòðîéñòâà |
182 | ; Âðåìÿ íà÷àëà îæèäàíèÿ ãîòîâíîñòè óñòðîéñòâà |
179 | WURStartTime DD 0 |
183 | WURStartTime DD 0 |
180 | ; óêàçàòåëü áóôåðà äëÿ ñ÷èòûâàíèÿ |
184 | ; óêàçàòåëü áóôåðà äëÿ ñ÷èòûâàíèÿ |
181 | CDDataBuf_pointer dd 0 |
185 | CDDataBuf_pointer dd 0 |
182 | 186 | endg |
|
183 | ;**************************************************** |
187 | ;**************************************************** |
184 | ;* ÏÎÑËÀÒÜ ÓÑÒÐÎÉÑÒÂÓ ATAPI ÏÀÊÅÒÍÓÞ ÊÎÌÀÍÄÓ, * |
188 | ;* ÏÎÑËÀÒÜ ÓÑÒÐÎÉÑÒÂÓ ATAPI ÏÀÊÅÒÍÓÞ ÊÎÌÀÍÄÓ, * |
185 | ;* ÏÐÅÄÓÑÌÀÒÐÈÂÀÞÙÓÞ ÏÅÐÅÄÀ×Ó ÎÄÍÎÃÎ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ * |
189 | ;* ÏÐÅÄÓÑÌÀÒÐÈÂÀÞÙÓÞ ÏÅÐÅÄÀ×Ó ÎÄÍÎÃÎ ÑÅÊÒÎÐÀ ÄÀÍÍÛÕ * |
186 | ;* ÐÀÇÌÅÐÎÌ 2048 ÁÀÉÒ ÎÒ ÓÑÒÐÎÉÑÒÂÀ Ê ÕÎÑÒÓ * |
190 | ;* ÐÀÇÌÅÐÎÌ 2048 ÁÀÉÒ ÎÒ ÓÑÒÐÎÉÑÒÂÀ Ê ÕÎÑÒÓ * |
187 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
191 | ;* Âõîäíûå ïàðàìåòðû ïåðåäàþòñÿ ÷åðåç ãëîáàëüíûå * |
188 | ;* ïåðìåííûå: * |
192 | ;* ïåðìåííûå: * |
- | 193 | ;* ChannelNumber - íîìåð êàíàëà; * |
|
189 | ;* ChannelNumber - íîìåð êàíàëà; * |
194 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå; * |
190 | ;* DiskNumber - íîìåð äèñêà íà êàíàëå; * |
195 | ;* PacketCommand - 12-áàéòíûé êîìàíäíûé ïàêåò; * |
191 | ;* PacketCommand - 12-áàéòíûé êîìàíäíûé ïàêåò; * |
196 | ;* CDBlockSize - ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ. * |
192 | ;* CDBlockSize - ðàçìåð ïðèíèìàåìîãî áëîêà äàííûõ. * |
197 | ; return eax DevErrorCode |
193 | ;**************************************************** |
198 | ;**************************************************** |
194 | SendPacketDatCommand: |
199 | SendPacketDatCommand: |
195 | pushad |
200 | xor eax,eax |
196 | mov [DevErrorCode],0 |
201 | ; mov byte [DevErrorCode],al |
197 | ; Çàäàòü ðåæèì CHS |
202 | ; Çàäàòü ðåæèì CHS |
198 | mov [ATAAddressMode],0 |
203 | mov byte [ATAAddressMode],al |
199 | ; Ïîñëàòü ATA-êîìàíäó ïåðåäà÷è ïàêåòíîé êîìàíäû |
204 | ; Ïîñëàòü ATA-êîìàíäó ïåðåäà÷è ïàêåòíîé êîìàíäû |
200 | mov [ATAFeatures],0 |
205 | mov byte |