?? cdio.cod
字號(hào):
0000c e1a0a002 mov r10, r2
00010 e1a07001 mov r7, r1
00014 e1a08000 mov r8, r0
; 574 : DWORD dwSgLeft = dwSgCount;
; 575 : DWORD dwTransferCount;
; 576 : PSGX_BUF pCurrentSegment;
; 577 : DWORD dwWriteCount = 0;
; 578 : DWORD dwThisCount;
; 579 : BYTE *pCurrentBuffer=NULL;
; 580 :
; 581 : DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData - Entered SgCount=%ld.\r\n"), dwSgCount));
; 582 :
; 583 : pCurrentSegment = pSgBuf;
; 584 :
; 585 : m_wNextByte = 0xFFFF; // There is no byte left from the previous transaction.
00018 e3a0ecff mov lr, #0xFF, 24
0001c e38ee0ff orr lr, lr, #0xFF
00020 e3a05000 mov r5, #0
00024 e1c8e5b0 strh lr, [r8, #0x50]
00028 e58d5000 str r5, [sp]
0002c e3a0b000 mov r11, #0
00030 |$L32343|
; 586 :
; 587 : for(;;) {
; 588 : if (m_fInterruptSupported) {
00030 e598e040 ldr lr, [r8, #0x40]
00034 e35e0000 cmp lr, #0
00038 0a00000f beq |$L32351|
; 589 : //
; 590 : // Waiting for ATA_INTR_READ or ATA_INTR_WRITE or ATA_INTR_READY
; 591 : //
; 592 : if (!WaitForInterrupt(m_dwDiskIoTimeOut)) {
0003c e598e000 ldr lr, [r8]
00040 e59816c8 ldr r1, [r8, #0x6C8]
00044 e1a00008 mov r0, r8
00048 e59e4038 ldr r4, [lr, #0x38]
0004c e1a0e00f mov lr, pc
00050 e12fff14 bx r4
00054 e3500000 cmp r0, #0
00058 0a00006d beq |$L32978|
; 593 : DEBUGMSG( ZONE_CDROM | ZONE_ERROR, (TEXT("ATAPI:AtapiReceiveData - Wait for ATA_INTR_READ failed (DevId %x) \r\n"), m_dwDeviceId));
; 594 : return FALSE;
; 595 : }
; 596 : WORD wState = CheckIntrState();
0005c e1a00008 mov r0, r8
00060 eb000000 bl |?CheckIntrState@CDisk@@QAAGXZ|
00064 e1a03800 mov r3, r0, lsl #16
00068 e1a03823 mov r3, r3, lsr #16
; 597 : //
; 598 : // Return Error if not IO Interrupt
; 599 : //
; 600 : if (wState == ATA_INTR_ERROR)
0006c e3530000 cmp r3, #0
00070 0a000067 beq |$L32978|
; 604 :
; 605 : }
; 606 : if (wState == ATA_INTR_READY)
00074 e3530003 cmp r3, #3
00078 0a000061 beq |$L32981|
0007c |$L32351|
; 610 : }
; 611 : };
; 612 : //
; 613 : // Wait until device is ready for data transfer.
; 614 : //
; 615 : if (!WaitForDRQ())
0007c e5983000 ldr r3, [r8]
00080 e1a00008 mov r0, r8
00084 e5933018 ldr r3, [r3, #0x18]
00088 e1a0e00f mov lr, pc
0008c e12fff13 bx r3
00090 e3500000 cmp r0, #0
00094 0a00005e beq |$L32978|
; 616 : {
; 617 : DEBUGMSG( ZONE_IO | ZONE_ERROR | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData Failed at WaitForDRQ Status=%02X Error=%02X Deivce=%ld\r\n"), GetAltStatus(), GetError(), m_dwDeviceId));
; 618 : return(FALSE);
; 619 : }
; 620 :
; 621 : //
; 622 : // Read Transfer Counter set by Device.
; 623 : //
; 624 : dwTransferCount = GetCount();
00098 e1a00008 mov r0, r8
0009c eb000000 bl |?GetCount@CDisk@@QAAGXZ|
000a0 e1a09000 mov r9, r0
000a4 ea00004f b |$L32995|
000a8 |$L32357|
; 625 :
; 626 : DEBUGMSG (ZONE_CDROM | ZONE_IO, (TEXT(">>>Read Transfer Count : %x SG=%x \r\n"),dwTransferCount,dwSgLeft));
; 627 :
; 628 : while ((dwSgLeft>0) && (dwTransferCount>0))
000a8 e3590000 cmp r9, #0
000ac 0a00004f beq |$L32358|
; 629 : {
; 630 : dwThisCount = min(dwTransferCount, pCurrentSegment->sb_len);
000b0 e5d7e004 ldrb lr, [r7, #4]
000b4 e5d73005 ldrb r3, [r7, #5]
000b8 e5d72006 ldrb r2, [r7, #6]
000bc e5d71007 ldrb r1, [r7, #7]
000c0 e18e3403 orr r3, lr, r3, lsl #8
000c4 e1833802 orr r3, r3, r2, lsl #16
; 631 :
; 632 : if (pCurrentSegment->sb_buf) {
000c8 e5d70000 ldrb r0, [r7]
000cc e1836c01 orr r6, r3, r1, lsl #24
000d0 e5d73001 ldrb r3, [r7, #1]
000d4 e5d72002 ldrb r2, [r7, #2]
000d8 e5d71003 ldrb r1, [r7, #3]
000dc e1803403 orr r3, r0, r3, lsl #8
000e0 e1590006 cmp r9, r6
000e4 e1833802 orr r3, r3, r2, lsl #16
000e8 31a06009 movcc r6, r9
000ec e1930c01 orrs r0, r3, r1, lsl #24
000f0 0a000012 beq |$L32362|
; 633 : // map address and check for security violation
; 634 : pCurrentBuffer = (LPBYTE)MapCallerPtr((LPVOID)pCurrentSegment->sb_buf, pCurrentSegment->sb_len);
000f4 e5d7e004 ldrb lr, [r7, #4]
000f8 e5d73005 ldrb r3, [r7, #5]
000fc e5d72006 ldrb r2, [r7, #6]
00100 e5d71007 ldrb r1, [r7, #7]
00104 e18e3403 orr r3, lr, r3, lsl #8
00108 e1833802 orr r3, r3, r2, lsl #16
0010c e1831c01 orr r1, r3, r1, lsl #24
00110 eb000000 bl MapCallerPtr
; 635 : if (pCurrentSegment->sb_buf != NULL && pCurrentBuffer == NULL) {
00114 e5d7e000 ldrb lr, [r7]
00118 e5d73001 ldrb r3, [r7, #1]
0011c e5d72002 ldrb r2, [r7, #2]
00120 e5d71003 ldrb r1, [r7, #3]
00124 e18e3403 orr r3, lr, r3, lsl #8
00128 e1833802 orr r3, r3, r2, lsl #16
0012c e1933c01 orrs r3, r3, r1, lsl #24
00130 e1a0b000 mov r11, r0
00134 0a000001 beq |$L32362|
00138 e35b0000 cmp r11, #0
0013c 0a000036 beq |$L32976|
00140 |$L32362|
; 641 : }
; 642 : }
; 643 :
; 644 : if (pCurrentBuffer)
00140 e35b0000 cmp r11, #0
00144 0a000006 beq |$L32364|
; 645 : {
; 646 : WriteBuffer(pCurrentBuffer,dwThisCount);
00148 e1a02006 mov r2, r6
0014c e1a0100b mov r1, r11
00150 e1a00008 mov r0, r8
00154 eb000000 bl |?WriteBuffer@CDisk@@QAAXPAEK@Z|
; 647 : dwTransferCount -= dwThisCount;
; 648 : dwWriteCount += dwThisCount;
00158 e0855006 add r5, r5, r6
0015c e58d5000 str r5, [sp]
00160 e0499006 sub r9, r9, r6
00164 |$L32364|
; 649 : }
; 650 : pCurrentSegment->sb_len -=dwThisCount;
00164 e5d7e004 ldrb lr, [r7, #4]
00168 e5d72005 ldrb r2, [r7, #5]
; 651 : pCurrentSegment->sb_buf +=dwThisCount;
0016c e5d71000 ldrb r1, [r7]
00170 e5d73001 ldrb r3, [r7, #1]
00174 e5d74006 ldrb r4, [r7, #6]
00178 e5d75002 ldrb r5, [r7, #2]
0017c e5d70007 ldrb r0, [r7, #7]
00180 e18e2402 orr r2, lr, r2, lsl #8
00184 e5d7e003 ldrb lr, [r7, #3]
00188 e1811403 orr r1, r1, r3, lsl #8
0018c e1823804 orr r3, r2, r4, lsl #16
00190 e1812805 orr r2, r1, r5, lsl #16
00194 e1833c00 orr r3, r3, r0, lsl #24
00198 e1822c0e orr r2, r2, lr, lsl #24
0019c e0535006 subs r5, r3, r6
001a0 e0866002 add r6, r6, r2
001a4 e1a00426 mov r0, r6, lsr #8
001a8 e1a0e826 mov lr, r6, lsr #16
001ac e1a04c26 mov r4, r6, lsr #24
001b0 e1a03425 mov r3, r5, lsr #8
001b4 e1a02825 mov r2, r5, lsr #16
001b8 e1a01c25 mov r1, r5, lsr #24
001bc e5c70001 strb r0, [r7, #1]
001c0 e5c7e002 strb lr, [r7, #2]
001c4 e5c74003 strb r4, [r7, #3]
001c8 e5c73005 strb r3, [r7, #5]
001cc e5c72006 strb r2, [r7, #6]
001d0 e5c71007 strb r1, [r7, #7]
001d4 e5c75004 strb r5, [r7, #4]
001d8 e59d5000 ldr r5, [sp]
001dc e5c76000 strb r6, [r7]
; 652 :
; 653 : if (pCurrentSegment->sb_len == 0)
; 654 : {
; 655 : // Go to the next SG
; 656 : dwSgLeft--;
; 657 : pCurrentSegment++;
001e0 02877008 addeq r7, r7, #8
001e4 024aa001 subeq r10, r10, #1
001e8 |$L32995|
; 625 :
; 626 : DEBUGMSG (ZONE_CDROM | ZONE_IO, (TEXT(">>>Read Transfer Count : %x SG=%x \r\n"),dwTransferCount,dwSgLeft));
; 627 :
; 628 : while ((dwSgLeft>0) && (dwTransferCount>0))
001e8 e35a0000 cmp r10, #0
001ec 1affffad bne |$L32357|
001f0 |$L32358|
; 658 : }
; 659 :
; 660 : } // End of while loop
; 661 :
; 662 : if (pdwBytesWrite)
001f0 e59d3004 ldr r3, [sp, #4]
001f4 e3530000 cmp r3, #0
; 663 : *pdwBytesWrite = dwWriteCount;
001f8 15835000 strne r5, [r3]
; 664 : if (!dwSgLeft)
001fc e35a0000 cmp r10, #0
00200 1affff8a bne |$L32343|
00204 |$L32981|
; 665 : break;
; 666 : }
; 667 : return TRUE;
00204 e3a00001 mov r0, #1
00208 |$L32334|
; 668 : }
00208 e28dd008 add sp, sp, #8
0020c e8bd4ff0 ldmia sp!, {r4 - r11, lr}
00210 e12fff1e bx lr
00214 |$L32978|
; 601 : {
; 602 : DEBUGMSG( ZONE_IO | ZONE_ERROR | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData - Wait for ATA_INTR_READ failed (DevId %x) \r\n"), m_dwDeviceId));
; 603 : return FALSE;
00214 e3a00000 mov r0, #0
; 607 : {
; 608 : DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData - Exiting with Interrupt Ready signal Device=%ld\r\n"), m_dwDeviceId));
; 609 : return TRUE;
00218 eafffffa b |$L32334|
0021c |$L32976|
; 636 : // security violation
; 637 : DEBUGMSG(ZONE_ERROR, (TEXT(
; 638 : "Atapi!CPCIDiskAndCD::AtapiSendData> Failed to map pointer to caller\r\n"
; 639 : )));
; 640 : return ERROR_ACCESS_DENIED;
0021c e3a00005 mov r0, #5
00220 eafffff8 b |$L32334|
00224 |$M32998|
ENDP ; |?AtapiSendData@CPCIDiskAndCD@@QAAHPAU_SGX_BUF@@KPAK@Z|, CPCIDiskAndCD::AtapiSendData
EXPORT |?AtapiIsUnitReady@CPCIDiskAndCD@@QAAHPAU_IOREQ@@@Z| ; CPCIDiskAndCD::AtapiIsUnitReady
IMPORT |?IsRemoveableDevice@CDisk@@QAAHXZ| ; CDisk::IsRemoveableDevice
00000 AREA |.text| { |?AtapiIsUnitReady@CPCIDiskAndCD@@QAAHPAU_IOREQ@@@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?AtapiIsUnitReady@CPCIDiskAndCD@@QAAHPAU_IOREQ@@@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?AtapiIsUnitReady@CPCIDiskAndCD@@QAAHPAU_IOREQ@@@Z| } ; comdat associative
|$T33012| DCD |$L33011|
DCD 0x40003602
; Function compile flags: /Ogsy
00000 AREA |.text| { |?AtapiIsUnitReady@CPCIDiskAndCD@@QAAHPAU_IOREQ@@@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?AtapiIsUnitReady@CPCIDiskAndCD@@QAAHPAU_IOREQ@@@Z| PROC ; CPCIDiskAndCD::AtapiIsUnitReady
; 674 : {
00000 |$L33011|
00000 e92d4070 stmdb sp!, {r4 - r6, lr}
00004 e24dd01c sub sp, sp, #0x1C
00008 |$M33009|
00008 e1a05001 mov r5, r1
0000c e1a06000 mov r6, r0
; 675 : ATAPI_COMMAND_PACKET CmdPkt;
; 676 : DWORD dwRet;
; 677 : BOOL fRet = TRUE;
; 678 : if (!IsRemoveableDevice())
00010 e3a04001 mov r4, #1
00014 eb000000 bl |?IsRemoveableDevice@CDisk@@QAAHXZ|
00018 e3500000 cmp r0, #0
; 679 : return(TRUE);
0001c 03a04001 moveq r4, #1
00020 0a000028 beq |$L32382|
; 680 : memset(&CmdPkt, 0, sizeof(ATAPI_COMMAND_PACKET));
00024 e3a02014 mov r2, #0x14
00028 e3a01000 mov r1, #0
0002c e28d0008 add r0, sp, #8
00030 eb000000 bl memset
; 681 : CmdPkt.Opcode = ATAPI_PACKET_CMD_TEST_READY;
00034 e3a03000 mov r3, #0
00038 e5cd3008 strb r3, [sp, #8]
; 682 : if (AtapiSendCommand(&CmdPkt)) {
0003c e3a03000 mov r3, #0
00040 e3a02000 mov r2, #0
00044 e28d1008 add r1, sp, #8
00048 e1a00006 mov r0, r6
0004c eb000000 bl |?AtapiSendCommand@CPCIDiskAndCD@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z|
00050 e3500000 cmp r0, #0
00054 0a000006 beq |$L32377|
; 683 : if (!AtapiReceiveData( NULL, 0, &dwRet)) {
00058 e28d3000 add r3, sp, #0
0005c e3a02000 mov r2, #0
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -