📄 cdio.cod
字号:
; 464 :
; 465 : if (!WaitForDRQ())
0013c e1a00004 mov r0, r4
00140 eb000000 bl |?WaitForDRQ@CDisk@@QAAHXZ|
00144 e3500000 cmp r0, #0
00148 1a000002 bne |$L32985|
0014c |$L33687|
; 466 : {
; 467 : DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPIPCI:AtapiSendCommand 1 - ATAWaitForDisc failed with: %x (DevId %x)\r\n"), GetError(), m_dwDeviceId));
; 468 : return FALSE;
0014c e3a00000 mov r0, #0
; 477 : }
00150 e8bd40f0 ldmia sp!, {r4 - r7, lr}
00154 e12fff1e bx lr
00158 |$L32985|
; 469 :
; 470 : }
; 471 :
; 472 : // Write the ATAPI Command Packet.
; 473 :
; 474 : WriteWordBuffer( (LPWORD)pCmdPkt,GetPacketSize()/sizeof(WORD));
00158 e5d42444 ldrb r2, [r4, #0x444]
0015c e5d43445 ldrb r3, [r4, #0x445]
00160 e1a01007 mov r1, r7
00164 e1a00004 mov r0, r4
00168 e1823403 orr r3, r2, r3, lsl #8
0016c e3130003 tst r3, #3
00170 13a02010 movne r2, #0x10
00174 03a0200c moveq r2, #0xC
00178 e5943000 ldr r3, [r4]
0017c e1a02802 mov r2, r2, lsl #16
00180 e1a02822 mov r2, r2, lsr #16
00184 e593303c ldr r3, [r3, #0x3C]
00188 e1a020a2 mov r2, r2, lsr #1
0018c e1a0e00f mov lr, pc
00190 e12fff13 bx r3
; 475 :
; 476 : return TRUE;
00194 e3a00001 mov r0, #1
; 477 : }
00198 e8bd40f0 ldmia sp!, {r4 - r7, lr}
0019c e12fff1e bx lr
001a0 |$L33693|
001a0 b6a000a0 DCD 0xb6a000a0
001a4 b6a00080 DCD 0xb6a00080
001a8 b6a00060 DCD 0xb6a00060
001ac b6a00040 DCD 0xb6a00040
001b0 b6a000e0 DCD 0xb6a000e0
001b4 |$M33689|
ENDP ; |?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z|, CDisk::AtapiSendCommand
EXPORT |?AtapiReceiveData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z| ; CDisk::AtapiReceiveData
IMPORT |?CheckIntrState@CDisk@@QAAGXZ| ; CDisk::CheckIntrState
IMPORT |?ReadBuffer@CDisk@@QAAXPAEK@Z| ; CDisk::ReadBuffer
IMPORT |MapPtrToProcess|
IMPORT |GetCallerProcess|
; File c:\wince500\platform\bvdmain\drivers\atapi\diskmain.h
00000 AREA |.text| { |?AtapiReceiveData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?AtapiReceiveData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?AtapiReceiveData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z| } ; comdat associative
|$T33743| DCD |$L33742|
DCD 0x40009302
; Function compile flags: /Ogsy
; File c:\wince500\platform\bvdmain\drivers\atapi\cdio.cpp
00000 AREA |.text| { |?AtapiReceiveData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?AtapiReceiveData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z| PROC ; CDisk::AtapiReceiveData
; 483 : {
00000 |$L33742|
00000 e92d4ff0 stmdb sp!, {r4 - r11, lr}
00004 e24dd004 sub sp, sp, #4
00008 |$M33740|
00008 e1a05003 mov r5, r3
0000c e58d5000 str r5, [sp]
00010 e1a09002 mov r9, r2
00014 e1a07001 mov r7, r1
00018 e1a06000 mov r6, r0
; 484 : DWORD dwSgLeft = dwSgCount;
; 485 : DWORD dwTransferCount;
; 486 : PSGX_BUF pCurrentSegment;
; 487 : DWORD dwReadCount = 0;
; 488 : DWORD dwThisCount;
; 489 : BYTE *pCurrentBuffer = NULL;
; 490 : DWORD dwLen;
; 491 :
; 492 : DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData - Entered SgCount=%ld.\r\n"), dwSgCount));
; 493 :
; 494 : if (ERROR_SUCCESS != WaitForDisc( WAIT_TYPE_READY, 5000, 100))
0001c e3a02d4e mov r2, #0x4E, 26
00020 e3822008 orr r2, r2, #8
00024 e3a03064 mov r3, #0x64
00028 e3a01003 mov r1, #3
0002c e3a0b000 mov r11, #0
00030 e3a0a000 mov r10, #0
00034 eb000000 bl |?WaitForDisc@CDisk@@QAAHEKK@Z|
00038 e3500000 cmp r0, #0
; 495 : return FALSE;
0003c 1a00007d bne |$L33721|
; 496 :
; 497 : pCurrentSegment = pSgBuf;
; 498 : if (pCurrentSegment) {
00040 e3570000 cmp r7, #0
00044 0a000012 beq |$L33725|
; 499 : dwLen = pCurrentSegment->sb_len;
00048 e5d70004 ldrb r0, [r7, #4]
0004c e5d73005 ldrb r3, [r7, #5]
00050 e5d72006 ldrb r2, [r7, #6]
00054 e5d71007 ldrb r1, [r7, #7]
00058 e1803403 orr r3, r0, r3, lsl #8
0005c e1833802 orr r3, r3, r2, lsl #16
00060 e1838c01 orr r8, r3, r1, lsl #24
; 500 : pCurrentBuffer = (LPBYTE)MapPtrToProcess(pCurrentSegment->sb_buf, GetCallerProcess());
00064 eb000000 bl GetCallerProcess
00068 e5d71000 ldrb r1, [r7]
0006c e5d73001 ldrb r3, [r7, #1]
00070 e5d72002 ldrb r2, [r7, #2]
00074 e5d7e003 ldrb lr, [r7, #3]
00078 e1813403 orr r3, r1, r3, lsl #8
0007c e1833802 orr r3, r3, r2, lsl #16
00080 e1a01000 mov r1, r0
00084 e1830c0e orr r0, r3, lr, lsl #24
00088 eb000000 bl MapPtrToProcess
0008c e1a0a000 mov r10, r0
00090 ea000000 b |$L33004|
00094 |$L33725|
00094 e59d8000 ldr r8, [sp]
00098 |$L33004|
; 501 : }
; 502 :
; 503 :
; 504 : m_wNextByte = 0xFFFF; // There is no byte left from the previous transaction.
00098 e3a02cff mov r2, #0xFF, 24
0009c e38220ff orr r2, r2, #0xFF
000a0 e2863c06 add r3, r6, #6, 24
000a4 e1c328b0 strh r2, [r3, #0x80]
000a8 |$L33007|
; 505 :
; 506 : for(;;) {
; 507 : if (m_fInterruptSupported) {
000a8 e5963684 ldr r3, [r6, #0x684]
000ac e3530000 cmp r3, #0
000b0 0a000014 beq |$L33016|
; 508 : //
; 509 : // Waiting for ATA_INTR_READ or ATA_INTR_WRITE or ATA_INTR_READY
; 510 : //
; 511 :
; 512 : if (!WaitForInterrupt(DISK_IO_TIME_OUT)) {
000b4 e5963000 ldr r3, [r6]
000b8 e3a01c4e mov r1, #0x4E, 24
000bc e3811020 orr r1, r1, #0x20
000c0 e5933014 ldr r3, [r3, #0x14]
000c4 e1a00006 mov r0, r6
000c8 e1a0e00f mov lr, pc
000cc e12fff13 bx r3
000d0 e3500000 cmp r0, #0
000d4 0a000057 beq |$L33721|
; 513 : DEBUGMSG( ZONE_CDROM | ZONE_ERROR, (TEXT("ATAPI:AtapiReceiveData - Wait for ATA_INTR_READ failed (DevId %x) \r\n"), m_dwDeviceId));
; 514 : return FALSE;
; 515 : }
; 516 :
; 517 : WORD wState = CheckIntrState();
000d8 e1a00006 mov r0, r6
000dc eb000000 bl |?CheckIntrState@CDisk@@QAAGXZ|
000e0 e1a03800 mov r3, r0, lsl #16
000e4 e1a03823 mov r3, r3, lsr #16
; 518 : //
; 519 : // Return Error if not IO Interrupt
; 520 : //
; 521 : if ((wState == ATA_INTR_ERROR) || (GetAltStatus() & ATA_STATUS_ERROR))
000e8 e1b04003 movs r4, r3
000ec 0a000051 beq |$L33721|
000f0 e59f0150 ldr r0, [pc, #0x150]
000f4 eb000000 bl READ_PORT_UCHAR
000f8 e3100001 tst r0, #1
000fc 1a00004d bne |$L33721|
; 522 : {
; 523 : DEBUGMSG( ZONE_IO | ZONE_ERROR | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData - Wait for ATA_INTR_READ failed (DevId %x) \r\n"), m_dwDeviceId));
; 524 : return FALSE;
; 525 :
; 526 : }
; 527 : if (wState == ATA_INTR_READY)
00100 e3540003 cmp r4, #3
00104 0a000047 beq |$L33722|
00108 |$L33016|
; 528 : {
; 529 : DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData - Exiting with Interrupt Ready signal Device=%ld\r\n"), m_dwDeviceId));
; 530 : return TRUE;
; 531 : }
; 532 :
; 533 :
; 534 : };
; 535 : //
; 536 : // Wait until device is ready for data transfer.
; 537 : //
; 538 : if (!WaitForDRQ())
00108 e1a00006 mov r0, r6
0010c eb000000 bl |?WaitForDRQ@CDisk@@QAAHXZ|
00110 e3500000 cmp r0, #0
00114 0a000047 beq |$L33721|
; 542 : }
; 543 :
; 544 : //
; 545 : // Read Transfer Counter set by Device.
; 546 : //
; 547 : dwTransferCount = GetCount();
00118 e59f0124 ldr r0, [pc, #0x124]
0011c eb000000 bl READ_PORT_UCHAR
00120 e1a04000 mov r4, r0
00124 e59f0114 ldr r0, [pc, #0x114]
00128 eb000000 bl READ_PORT_UCHAR
0012c e0843400 add r3, r4, r0, lsl #8
00130 e1a04803 mov r4, r3, lsl #16
00134 e1a04824 mov r4, r4, lsr #16
; 548 :
; 549 : DEBUGMSG (ZONE_CDROM | ZONE_IO, (TEXT(">>>Read Transfer Count : %x SG=%x \r\n"),dwTransferCount,dwSgLeft));
; 550 :
; 551 : while ((dwSgLeft>0) && (dwTransferCount>0))
00138 e3590000 cmp r9, #0
0013c 0a000027 beq |$L33717|
00140 |$L33022|
00140 e3540000 cmp r4, #0
00144 0a000032 beq |$L33739|
; 552 : {
; 553 : dwThisCount = min(dwTransferCount, dwLen);
00148 e1540008 cmp r4, r8
0014c 31a05004 movcc r5, r4
00150 21a05008 movcs r5, r8
; 554 :
; 555 : if (pCurrentBuffer) {
00154 e35a0000 cmp r10, #0
00158 0a000005 beq |$L33024|
; 556 : ReadBuffer(pCurrentBuffer,dwThisCount);
0015c e1a02005 mov r2, r5
00160 e1a0100a mov r1, r10
00164 e1a00006 mov r0, r6
00168 eb000000 bl |?ReadBuffer@CDisk@@QAAXPAEK@Z|
; 557 : dwTransferCount -= dwThisCount;
0016c e0444005 sub r4, r4, r5
; 558 : dwReadCount += dwThisCount;
00170 e08bb005 add r11, r11, r5
00174 |$L33024|
; 559 : }
; 560 : pCurrentBuffer += dwThisCount;
00174 e08aa005 add r10, r10, r5
; 561 : dwLen -= dwThisCount;
00178 e0588005 subs r8, r8, r5
; 562 :
; 563 : if (dwLen == 0) {
0017c 1a000014 bne |$L33026|
; 564 : // Go to the next SG
; 565 : dwSgLeft--;
00180 e2499001 sub r9, r9, #1
; 566 : pCurrentSegment++;
00184 e2977008 adds r7, r7, #8
; 567 : if (pCurrentSegment) {
00188 0a000011 beq |$L33026|
; 568 : dwLen = pCurrentSegment->sb_len;
0018c e5d70004 ldrb r0, [r7, #4]
00190 e5d73005 ldrb r3, [r7, #5]
00194 e5d72006 ldrb r2, [r7, #6]
00198 e5d71007 ldrb r1, [r7, #7]
0019c e1803403 orr r3, r0, r3, lsl #8
001a0 e1833802 orr r3, r3, r2, lsl #16
001a4 e1838c01 orr r8, r3, r1, lsl #24
; 569 : pCurrentBuffer = (LPBYTE)MapPtrToProcess(pCurrentSegment->sb_buf, GetCallerProcess());
001a8 eb000000 bl GetCallerProcess
001ac e5d71000 ldrb r1, [r7]
001b0 e5d73001 ldrb r3, [r7, #1]
001b4 e5d72002 ldrb r2, [r7, #2]
001b8 e5d7e003 ldrb lr, [r7, #3]
001bc e1813403 orr r3, r1, r3, lsl #8
001c0 e1833802 orr r3, r3, r2, lsl #16
001c4 e1a01000 mov r1, r0
001c8 e1830c0e orr r0, r3, lr, lsl #24
001cc eb000000 bl MapPtrToProcess
001d0 e1a0a000 mov r10, r0
001d4 |$L33026|
; 548 :
; 549 : DEBUGMSG (ZONE_CDROM | ZONE_IO, (TEXT(">>>Read Transfer Count : %x SG=%x \r\n"),dwTransferCount,dwSgLeft));
; 550 :
; 551 : while ((dwSgLeft>0) && (dwTransferCount>0))
001d4 e3590000 cmp r9, #0
001d8 1affffd8 bne |$L33022|
; 483 : {
001dc e59d5000 ldr r5, [sp]
001e0 |$L33717|
; 570 : }
; 571 : }
; 572 :
; 573 : } // End of while loop
; 574 :
; 575 : // Discard the rest of data if left.
; 576 :
; 577 : while (dwTransferCount > 0)
001e0 e3540000 cmp r4, #0
001e4 0a00000b beq |$L33030|
001e8 e2443001 sub r3, r4, #1
001ec e1a030a3 mov r3, r3, lsr #1
001f0 e2834001 add r4, r3, #1
001f4 |$L33029|
; 578 : {
; 579 : (void) ReadWord();
001f4 e5963000 ldr r3, [r6]
001f8 e1a00006 mov r0, r6
001fc e5933048 ldr r3, [r3, #0x48]
00200 e1a0e00f mov lr, pc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -