📄 atapiio.cod
字号:
00010 e59f0068 ldr r0, [pc, #0x68]
00014 eb000000 bl READ_PORT_UCHAR
00018 e2006088 and r6, r0, #0x88
; 190 :
; 191 : if (bStatus & ATA_STATUS_BUSY) {
0001c e3160080 tst r6, #0x80
00020 1a000009 bne |$L32883|
; 192 : continue;
; 193 : }
; 194 : if (bStatus & ATA_STATUS_DATA_REQ){
00024 e3160008 tst r6, #8
00028 1a000011 bne |$L33280|
; 197 : }
; 198 : StallExecution(DEFAULT_WAIT_STALL_TIME);
0002c e5973004 ldr r3, [r7, #4]
00030 e3130301 tst r3, #1, 6
00034 0a000002 beq |$L33276|
00038 e3a00004 mov r0, #4
0003c eb000000 bl Sleep
00040 ea000001 b |$L32883|
00044 |$L33276|
00044 e3a00efa mov r0, #0xFA, 28
00048 eb000000 bl StallExecution
0004c |$L32883|
0004c e2855001 add r5, r5, #1
00050 e3550064 cmp r5, #0x64
00054 3affffed bcc |$L32882|
00058 e2844001 add r4, r4, #1
0005c e3540e7d cmp r4, #0x7D, 28
00060 3affffe9 bcc |$L32879|
; 199 : }
; 200 : DEBUGMSG( ZONE_WARNING, (TEXT("ATAPI:WaitForDRQ Status=%02X Error=%02X Reason=%02X\r\n"), GetAltStatus(), GetError(), GetReason()));
; 201 : }
; 202 : //RetailPrint1("ATAPIPCI: ATA_STATUS_DATA_REQ (Sleep)i= %x \r\n",i);
; 203 : return(bStatus == ATA_STATUS_DATA_REQ);
00064 e3560008 cmp r6, #8
00068 13a00000 movne r0, #0
; 204 :
; 205 : }
0006c 18bd40f0 ldmneia sp!, {r4 - r7, lr}
00070 112fff1e bxne lr
00074 |$L33280|
; 195 : DEBUGMSG(ZONE_IO, (TEXT("ATAPI: ATA_STATUS_DATA_REQ J=: %x \r\n"),j));
; 196 : return TRUE;
00074 e3a00001 mov r0, #1
; 204 :
; 205 : }
00078 e8bd40f0 ldmia sp!, {r4 - r7, lr}
0007c e12fff1e bx lr
00080 |$L33294|
00080 b6b000c0 DCD 0xb6b000c0
00084 |$M33290|
ENDP ; |?WaitForDRQ@CDisk@@QAAHXZ|, CDisk::WaitForDRQ
EXPORT |?CheckIntrState@CDisk@@QAAGXZ| ; CDisk::CheckIntrState
; File c:\wince500\platform\bvdmain\drivers\atapi\diskmain.h
00000 AREA |.text| { |?CheckIntrState@CDisk@@QAAGXZ| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?CheckIntrState@CDisk@@QAAGXZ|, PDATA, SELECTION=5, ASSOC=|.text| { |?CheckIntrState@CDisk@@QAAGXZ| } ; comdat associative
|$T33310| DCD |$L33309|
DCD 0x40001201
; Function compile flags: /Ogsy
; File c:\wince500\platform\bvdmain\drivers\atapi\atapiio.cpp
00000 AREA |.text| { |?CheckIntrState@CDisk@@QAAGXZ| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?CheckIntrState@CDisk@@QAAGXZ| PROC ; CDisk::CheckIntrState
; 232 : {
00000 |$L33309|
00000 e92d4010 stmdb sp!, {r4, lr}
00004 |$M33307|
; 233 : BYTE bReason, bDRQ;
; 234 :
; 235 : WaitOnBusy(FALSE);
00004 e3a01000 mov r1, #0
00008 eb000000 bl |?WaitOnBusy@CDisk@@QAAEH@Z|
; 236 :
; 237 : bReason = GetReason() & (ATA_IR_CoD | ATA_IR_IO);
0000c e59f0030 ldr r0, [pc, #0x30]
00010 eb000000 bl READ_PORT_UCHAR
00014 e1a03000 mov r3, r0
; 238 :
; 239 : bDRQ = GetAltStatus() & ATA_STATUS_DATA_REQ;
00018 e59f0020 ldr r0, [pc, #0x20]
0001c e2034003 and r4, r3, #3
00020 eb000000 bl READ_PORT_UCHAR
; 240 :
; 241 :
; 242 : if (bDRQ)
00024 e3100008 tst r0, #8
; 243 : bReason |=4;
00028 13844004 orrne r4, r4, #4
; 244 :
; 245 : if (bReason < 3)
0002c e3540003 cmp r4, #3
; 246 : return((WORD) ATA_INTR_READY);
00030 33a04003 movcc r4, #3
00034 e1a00004 mov r0, r4
; 247 :
; 248 : return ((WORD) bReason);
; 249 : }
00038 e8bd4010 ldmia sp!, {r4, lr}
0003c e12fff1e bx lr
00040 |$L33312|
00040 b6b000c0 DCD 0xb6b000c0
00044 b6a00040 DCD 0xb6a00040
00048 |$M33308|
ENDP ; |?CheckIntrState@CDisk@@QAAGXZ|, CDisk::CheckIntrState
EXPORT |?ReadBuffer@CDisk@@QAAXPAEK@Z| ; CDisk::ReadBuffer
00000 AREA |.text| { |?ReadBuffer@CDisk@@QAAXPAEK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?ReadBuffer@CDisk@@QAAXPAEK@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?ReadBuffer@CDisk@@QAAXPAEK@Z| } ; comdat associative
|$T33325| DCD |$L33324|
DCD 0x40003c02
; Function compile flags: /Ogsy
00000 AREA |.text| { |?ReadBuffer@CDisk@@QAAXPAEK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?ReadBuffer@CDisk@@QAAXPAEK@Z| PROC ; CDisk::ReadBuffer
; 258 : {
00000 |$L33324|
00000 e92d40f0 stmdb sp!, {r4 - r7, lr}
00004 e24dd004 sub sp, sp, #4
00008 |$M33322|
00008 e1b04002 movs r4, r2
0000c e1a05001 mov r5, r1
00010 e1a06000 mov r6, r0
; 259 : //
; 260 : // This is very unefficient way to solve word allignment violation.
; 261 :
; 262 : union {
; 263 : WORD us;
; 264 : BYTE uc[2];
; 265 : }unisc;
; 266 :
; 267 :
; 268 : if (dwCount == 0)
00014 0a000032 beq |$L32928|
; 269 : return;
; 270 :
; 271 : DEBUGMSG( ZONE_IO, (TEXT("ATAPI:ReadBuffer Entry Status: %x\r\n"),GetAltStatus()));
; 272 :
; 273 : // Check whether required byte was already read in previous transaction!
; 274 : // Value -1 in m_wNextByte means - no byte was read.
; 275 :
; 276 : if (m_wNextByte != 0xFFFF) {
00018 e2863c06 add r3, r6, #6, 24
0001c e1d328b0 ldrh r2, [r3, #0x80]
00020 e3a03cff mov r3, #0xFF, 24
00024 e38330ff orr r3, r3, #0xFF
00028 e1520003 cmp r2, r3
; 277 : DEBUGMSG( ZONE_WARNING, (TEXT("ATAPI:ReadBuffer - Unaligned buffer on prevous read!!!\r\n")));
; 278 : // Update the first byte.
; 279 : *pBuffer++ = (BYTE) m_wNextByte;
0002c 14c52001 strneb r2, [r5], #1
; 280 : dwCount--;
00030 12444001 subne r4, r4, #1
; 281 : }
; 282 : //
; 283 : // Check allignemt of pBuffer
; 284 : //
; 285 : if ((DWORD) pBuffer & 1) {
00034 e3150001 tst r5, #1
00038 0a000012 beq |$L32919|
; 286 : DEBUGMSG( ZONE_WARNING, (TEXT("ATAPI:ReadBuffer - Unaligned buffer !!!\r\n")));
; 287 : while (dwCount> 1)
0003c e3540001 cmp r4, #1
00040 9a00001b bls |$L33321|
00044 e2443002 sub r3, r4, #2
00048 e1a030a3 mov r3, r3, lsr #1
0004c e2837001 add r7, r3, #1
00050 |$L32922|
; 288 : {
; 289 : unisc.us = ReadWord();
00050 e5963000 ldr r3, [r6]
00054 e1a00006 mov r0, r6
00058 e5933048 ldr r3, [r3, #0x48]
0005c e1a0e00f mov lr, pc
00060 e12fff13 bx r3
00064 e1cd00b0 strh r0, [sp]
; 290 : *pBuffer++= unisc.uc[0];
; 291 : *pBuffer++= unisc.uc[1];
; 292 : dwCount-=2;
00068 e2444002 sub r4, r4, #2
0006c e5dd3000 ldrb r3, [sp]
00070 e5dd2001 ldrb r2, [sp, #1]
00074 e2577001 subs r7, r7, #1
00078 e4c53001 strb r3, [r5], #1
0007c e4c52001 strb r2, [r5], #1
00080 1afffff2 bne |$L32922|
; 293 : }
; 294 : } else {
00084 ea000009 b |$L32924|
00088 |$L32919|
; 295 : ReadWordBuffer((PWORD)pBuffer,(DWORD)(dwCount)/sizeof(SHORT));
00088 e5963000 ldr r3, [r6]
0008c e1a020a4 mov r2, r4, lsr #1
00090 e1a01005 mov r1, r5
00094 e5933038 ldr r3, [r3, #0x38]
00098 e1a00006 mov r0, r6
0009c e1a0e00f mov lr, pc
000a0 e12fff13 bx r3
; 296 : pBuffer += dwCount;
000a4 e0853004 add r3, r5, r4
; 297 : dwCount &= 1; // If 1, we need to read the next byte yet
000a8 e2044001 and r4, r4, #1
; 298 : pBuffer -= dwCount; // Adjust pBuffer if its value is odd
000ac e0435004 sub r5, r3, r4
000b0 |$L32924|
; 299 : }
; 300 : //
; 301 : // Also we have to read one Word event if need only one byte.
; 302 : // Save unused byte and use it as the first byte in the following SG buffer.
; 303 :
; 304 : if (dwCount == 1) {
000b0 e3540001 cmp r4, #1
000b4 |$L33321|
000b4 1a00000a bne |$L32928|
; 305 : DEBUGMSG( ZONE_WARNING, (TEXT("ATAPI:ReadBuffer - reading one word!!!\r\n")));
; 306 : unisc.us = ReadWord();
; 307 : *pBuffer= unisc.uc[0];
; 308 : m_wNextByte = (WORD)unisc.uc[1]; // Save byte for the next SG if
000b8 e1a04006 mov r4, r6
000bc e4943600 ldr r3, [r4], #0x600
000c0 e1a00006 mov r0, r6
000c4 e5933048 ldr r3, [r3, #0x48]
000c8 e1a0e00f mov lr, pc
000cc e12fff13 bx r3
000d0 e1cd00b0 strh r0, [sp]
000d4 e5dd3000 ldrb r3, [sp]
000d8 e5dd2001 ldrb r2, [sp, #1]
000dc e5c53000 strb r3, [r5]
000e0 e1c428b0 strh r2, [r4, #0x80]
000e4 |$L32928|
; 309 : }
; 310 :
; 311 : DEBUGMSG( ZONE_IO, (TEXT("ATAPI:ReadBuffer Exit Status: %x\r\n"),GetAltStatus()));
; 312 : }
000e4 e28dd004 add sp, sp, #4
000e8 e8bd40f0 ldmia sp!, {r4 - r7, lr}
000ec e12fff1e bx lr
000f0 |$M33323|
ENDP ; |?ReadBuffer@CDisk@@QAAXPAEK@Z|, CDisk::ReadBuffer
EXPORT |?WriteBuffer@CDisk@@QAAXPAEK@Z| ; CDisk::WriteBuffer
00000 AREA |.text| { |?WriteBuffer@CDisk@@QAAXPAEK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?WriteBuffer@CDisk@@QAAXPAEK@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?WriteBuffer@CDisk@@QAAXPAEK@Z| } ; comdat associative
|$T33339| DCD |$L33338|
DCD 0x40003b02
; Function compile flags: /Ogsy
00000 AREA |.text| { |?WriteBuffer@CDisk@@QAAXPAEK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?WriteBuffer@CDisk@@QAAXPAEK@Z| PROC ; CDisk::WriteBuffer
; 321 : {
00000 |$L33338|
00000 e92d40f0 stmdb sp!, {r4 - r7, lr}
00004 e24dd004 sub sp, sp, #4
00008 |$M33336|
00008 e1b04002 movs r4, r2
0000c e1a05001 mov r5, r1
00010 e1a06000 mov r6, r0
; 322 : //
; 323 : // This is very inefficient way to solve word allignment violation.
; 324 : union {
; 325 : WORD us;
; 326 : BYTE uc[2];
; 327 : }unisc;
; 328 :
; 329 : if (dwCount == 0)
00014 0a000031 beq |$L32962|
; 330 : return;
; 331 :
; 332 : DEBUGMSG( ZONE_IO, (TEXT("ATAPI:WriteBuffer Entry Status: %x\r\n"),GetAltStatus()));
; 333 :
; 334 : // Check whether one byte left from the previous transaction!
; 335 : // Value -1 in m_wNextByte means - no byteleft.
; 336 :
; 337 : if (m_wNextByte != 0xFFFF) {
00018 e2863c06 add r3, r6, #6, 24
0001c e1d328b0 ldrh r2, [r3, #0x80]
00020 e3a03cff mov r3, #0xFF, 24
00024 e38330ff orr r3, r3, #0xFF
00028 e1520003 cmp r2, r3
0002c 0a000008 beq |$L32949|
; 338 : // Update the first byte
; 339 : DEBUGMSG( ZONE_WARNING, (TEXT("ATAPI:ReadBuffer - Unaligned buffer on prevous read!!!\r\n")));
; 340 : unisc.uc[0] = (BYTE) m_wNextByte;
; 341 : unisc.uc[1] = *pBuffer++;
00030 e4d53001 ldrb r3, [r5], #1
; 342 : dwCount--;
; 343 : WriteWord(unisc.us);
00034 e596e000 ldr lr, [r6]
00038 e5cd2000 strb r2, [sp]
0003c e2444001 sub r4, r4, #1
00040 e5cd3001 strb r3, [sp, #1]
00044 e59e3044 ldr r3, [lr, #0x44]
00048 e1dd10b0 ldrh r1, [sp]
0004c e1a0e00f mov lr, pc
00050 e12fff13 bx r3
00054 |$L32949|
; 344 : }
; 345 : //
; 346 : // Check allignemt of pBuffer
; 347 : //
; 348 : if ((DWORD) pBuffer & 1) {
00054 e3150001 tst r5, #1
00058 0a000012 beq |$L32953|
; 349 : DEBUGMSG( ZONE_WARNING, (TEXT("ATAPI:ReadBuffer - Unaligned buffer !!!\r\n")));
; 350 : while (dwCount> 1) {
0005c e3540001 cmp r4, #1
00060 9a00001b bls |$L33335|
00064 e2443002 sub r3, r4, #2
00068 e1a030a3 mov r3, r3, lsr #1
0006c e2837001 add r7, r3, #1
00070 |$L32956|
; 351 : unisc.uc[0] = *pBuffer++;
00070 e4d52001 ldrb r2, [r5], #1
; 352 : unisc.uc[1] = *pBuffer++;
; 353 : WriteWord(unisc.us);
00074 e5961000 ldr r1, [r6]
00078 e1a00006 mov r0, r6
0007c e4d53001 ldrb r3, [r5], #1
00080 e5cd2000 strb r2, [sp]
00084 e5912044 ldr r2, [r1, #0x44]
00088 e5cd3001 strb r3, [sp, #1]
0008c e1dd10b0 ldrh r1, [sp]
00090 e1a0e00f mov lr, pc
00094 e12fff12 bx r2
; 354 : dwCount-=2;
00098 e2444002 sub r4, r4, #2
0009c e2577001 subs r7, r7, #1
000a0 1afffff2 bne |$L32956|
; 355 : }
; 356 : } else {
000a4 ea000009 b |$L32958|
000a8 |$L32953|
; 357 : WriteWordBuffer((PWORD)pBuffer,(DWORD)(dwCount)/sizeof(SHORT));
000a8 e5963000 ldr r3, [r6]
000ac e1a020a4 mov r2, r4, lsr #1
000b0 e1a01005 mov r1, r5
000b4 e593303c ldr r3, [r3, #0x3C]
000b8 e1a00006 mov r0, r6
000bc e1a0e00f mov lr, pc
000c0 e12fff13 bx r3
; 358 : pBuffer += dwCount;
000c4 e0853004 add r3, r5, r4
; 359 : dwCount &= 1; // If 1, we need to write the next byte yet
000c8 e2044001 and r4, r4, #1
; 360 : pBuffer -= dwCount; // Adjust pBuffer if its value is odd
000cc e0435004 sub r5, r3, r4
000d0 |$L32958|
; 361 :
; 362 : }
; 363 : //
; 364 : // Also we have to transfer one Word event if need only one byte.
; 365 : // Save unused byte and use it as the first byte in the following SG buffer.
; 366 :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -