Subversion Repositories Kolibri OS

Rev

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