📄 cdio.cod
字号:
00204 e12fff13 bx r3
00208 e2544001 subs r4, r4, #1
0020c 1afffff8 bne |$L33029|
; 483 : {
00210 ea000000 b |$L33030|
00214 |$L33739|
00214 e59d5000 ldr r5, [sp]
00218 |$L33030|
; 580 : dwTransferCount-=2 ;
; 581 : }
; 582 : if (pdwBytesRead)
00218 e3550000 cmp r5, #0
; 583 : *pdwBytesRead = dwReadCount;
0021c 1585b000 strne r11, [r5]
; 584 : if (!dwSgLeft)
00220 e3590000 cmp r9, #0
00224 1affff9f bne |$L33007|
00228 |$L33722|
; 585 : break;
; 586 : }
; 587 :
; 588 : return TRUE;
00228 e3a00001 mov r0, #1
0022c |$L32994|
; 589 : }
0022c e28dd004 add sp, sp, #4
00230 e8bd4ff0 ldmia sp!, {r4 - r11, lr}
00234 e12fff1e bx lr
00238 |$L33721|
; 539 : {
; 540 : 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));
; 541 : return(FALSE);
00238 e3a00000 mov r0, #0
0023c eafffffa b |$L32994|
00240 |$L33745|
00240 b6a000a0 DCD 0xb6a000a0
00244 b6a00080 DCD 0xb6a00080
00248 b6b000c0 DCD 0xb6b000c0
0024c |$M33741|
ENDP ; |?AtapiReceiveData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z|, CDisk::AtapiReceiveData
EXPORT |?AtapiSendData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z| ; CDisk::AtapiSendData
IMPORT |?WriteBuffer@CDisk@@QAAXPAEK@Z| ; CDisk::WriteBuffer
; File c:\wince500\platform\bvdmain\drivers\atapi\diskmain.h
00000 AREA |.text| { |?AtapiSendData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?AtapiSendData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?AtapiSendData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z| } ; comdat associative
|$T33788| DCD |$L33787|
DCD 0x40008a02
; Function compile flags: /Ogsy
; File c:\wince500\platform\bvdmain\drivers\atapi\cdio.cpp
00000 AREA |.text| { |?AtapiSendData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?AtapiSendData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z| PROC ; CDisk::AtapiSendData
; 593 : {
00000 |$L33787|
00000 e92d4ff0 stmdb sp!, {r4 - r11, lr}
00004 e24dd00c sub sp, sp, #0xC
00008 |$M33785|
00008 e1a09003 mov r9, r3
0000c e58d9008 str r9, [sp, #8]
00010 e1a0b002 mov r11, r2
00014 e1a07001 mov r7, r1
00018 e1a08000 mov r8, r0
; 594 : DWORD dwSgLeft = dwSgCount;
; 595 : DWORD dwTransferCount;
; 596 : PSGX_BUF pCurrentSegment;
; 597 : DWORD dwWriteCount = 0;
; 598 : DWORD dwThisCount;
; 599 : BYTE *pCurrentBuffer=NULL;
; 600 :
; 601 : DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData - Entered SgCount=%ld.\r\n"), dwSgCount));
; 602 :
; 603 : pCurrentSegment = pSgBuf;
; 604 :
; 605 : m_wNextByte = 0xFFFF; // There is no byte left from the previous transaction.
0001c e3a04cff mov r4, #0xFF, 24
00020 e38440ff orr r4, r4, #0xFF
00024 e288ec06 add lr, r8, #6, 24
00028 e3a05000 mov r5, #0
0002c e3a06000 mov r6, #0
00030 e1ce48b0 strh r4, [lr, #0x80]
00034 e58d5000 str r5, [sp]
00038 e58d6004 str r6, [sp, #4]
0003c |$L33048|
; 606 :
; 607 : for(;;) {
; 608 : if (m_fInterruptSupported) {
0003c e598e684 ldr lr, [r8, #0x684]
00040 e35e0000 cmp lr, #0
00044 0a000010 beq |$L33056|
; 609 : //
; 610 : // Waiting for ATA_INTR_READ or ATA_INTR_WRITE or ATA_INTR_READY
; 611 : //
; 612 : if (!WaitForInterrupt(DISK_IO_TIME_OUT)) {
00048 e598e000 ldr lr, [r8]
0004c e3a01c4e mov r1, #0x4E, 24
00050 e3811020 orr r1, r1, #0x20
00054 e59e4014 ldr r4, [lr, #0x14]
00058 e1a00008 mov r0, r8
0005c e1a0e00f mov lr, pc
00060 e12fff14 bx r4
00064 e3500000 cmp r0, #0
00068 0a00006a beq |$L33769|
; 613 : DEBUGMSG( ZONE_CDROM | ZONE_ERROR, (TEXT("ATAPI:AtapiReceiveData - Wait for ATA_INTR_READ failed (DevId %x) \r\n"), m_dwDeviceId));
; 614 : return FALSE;
; 615 : }
; 616 : WORD wState = CheckIntrState();
0006c e1a00008 mov r0, r8
00070 eb000000 bl |?CheckIntrState@CDisk@@QAAGXZ|
00074 e1a03800 mov r3, r0, lsl #16
00078 e1a03823 mov r3, r3, lsr #16
; 617 : //
; 618 : // Return Error if not IO Interrupt
; 619 : //
; 620 : if (wState == ATA_INTR_ERROR)
0007c e3530000 cmp r3, #0
00080 0a000064 beq |$L33769|
; 621 : {
; 622 : DEBUGMSG( ZONE_IO | ZONE_ERROR | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData - Wait for ATA_INTR_READ failed (DevId %x) \r\n"), m_dwDeviceId));
; 623 : return FALSE;
; 624 :
; 625 : }
; 626 : if (wState == ATA_INTR_READY)
00084 e3530003 cmp r3, #3
00088 0a00005e beq |$L33770|
0008c |$L33056|
; 627 : {
; 628 : DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData - Exiting with Interrupt Ready signal Device=%ld\r\n"), m_dwDeviceId));
; 629 : return TRUE;
; 630 : }
; 631 : };
; 632 : //
; 633 : // Wait until device is ready for data transfer.
; 634 : //
; 635 : if (!WaitForDRQ())
0008c e1a00008 mov r0, r8
00090 eb000000 bl |?WaitForDRQ@CDisk@@QAAHXZ|
00094 e3500000 cmp r0, #0
00098 0a00005e beq |$L33769|
; 639 : }
; 640 :
; 641 : //
; 642 : // Read Transfer Counter set by Device.
; 643 : //
; 644 : dwTransferCount = GetCount();
0009c e59f0180 ldr r0, [pc, #0x180]
000a0 eb000000 bl READ_PORT_UCHAR
000a4 e1a04000 mov r4, r0
000a8 e59f0170 ldr r0, [pc, #0x170]
000ac eb000000 bl READ_PORT_UCHAR
000b0 e0843400 add r3, r4, r0, lsl #8
000b4 e1a0a803 mov r10, r3, lsl #16
000b8 e1a0a82a mov r10, r10, lsr #16
; 645 :
; 646 : DEBUGMSG (ZONE_CDROM | ZONE_IO, (TEXT(">>>Read Transfer Count : %x SG=%x \r\n"),dwTransferCount,dwSgLeft));
; 647 :
; 648 : while ((dwSgLeft>0) && (dwTransferCount>0))
000bc e35b0000 cmp r11, #0
000c0 0a00004c beq |$L33063|
000c4 |$L33062|
000c4 e35a0000 cmp r10, #0
000c8 0a000049 beq |$L33772|
; 649 : {
; 650 : dwThisCount = min(dwTransferCount, pCurrentSegment->sb_len);
000cc e5d70004 ldrb r0, [r7, #4]
000d0 e5d73005 ldrb r3, [r7, #5]
000d4 e5d72006 ldrb r2, [r7, #6]
000d8 e5d71007 ldrb r1, [r7, #7]
000dc e1803403 orr r3, r0, r3, lsl #8
000e0 e1833802 orr r3, r3, r2, lsl #16
; 651 :
; 652 : if (pCurrentSegment->sb_buf)
000e4 e5d70000 ldrb r0, [r7]
000e8 e1839c01 orr r9, r3, r1, lsl #24
000ec e5d73001 ldrb r3, [r7, #1]
000f0 e5d72002 ldrb r2, [r7, #2]
000f4 e5d71003 ldrb r1, [r7, #3]
000f8 e1803403 orr r3, r0, r3, lsl #8
000fc e15a0009 cmp r10, r9
00100 e1833802 orr r3, r3, r2, lsl #16
00104 31a0900a movcc r9, r10
00108 e1933c01 orrs r3, r3, r1, lsl #24
0010c 0a00000b beq |$L33064|
; 653 : pCurrentBuffer = (LPBYTE)MapPtrToProcess(pCurrentSegment->sb_buf, GetCallerProcess());
00110 eb000000 bl GetCallerProcess
00114 e5d71000 ldrb r1, [r7]
00118 e5d73001 ldrb r3, [r7, #1]
0011c e5d72002 ldrb r2, [r7, #2]
00120 e5d7e003 ldrb lr, [r7, #3]
00124 e1813403 orr r3, r1, r3, lsl #8
00128 e1833802 orr r3, r3, r2, lsl #16
0012c e1a01000 mov r1, r0
00130 e1830c0e orr r0, r3, lr, lsl #24
00134 eb000000 bl MapPtrToProcess
00138 e1a06000 mov r6, r0
0013c e58d6004 str r6, [sp, #4]
00140 |$L33064|
; 654 :
; 655 : if (pCurrentBuffer)
00140 e3560000 cmp r6, #0
00144 0a000006 beq |$L33066|
; 656 : {
; 657 : WriteBuffer(pCurrentBuffer,dwThisCount);
00148 e1a02009 mov r2, r9
0014c e1a01006 mov r1, r6
00150 e1a00008 mov r0, r8
00154 eb000000 bl |?WriteBuffer@CDisk@@QAAXPAEK@Z|
; 658 : dwTransferCount -= dwThisCount;
; 659 : dwWriteCount += dwThisCount;
00158 e0855009 add r5, r5, r9
0015c e58d5000 str r5, [sp]
00160 e04aa009 sub r10, r10, r9
00164 |$L33066|
; 660 : }
; 661 : pCurrentSegment->sb_len -=dwThisCount;
00164 e5d7e004 ldrb lr, [r7, #4]
00168 e5d72005 ldrb r2, [r7, #5]
; 662 : pCurrentSegment->sb_buf +=dwThisCount;
0016c e5d71000 ldrb r1, [r7]
00170 e5d73001 ldrb r3, [r7, #1]
00174 e5d75006 ldrb r5, [r7, #6]
00178 e5d76002 ldrb r6, [r7, #2]
0017c e5d74003 ldrb r4, [r7, #3]
00180 e18e2402 orr r2, lr, r2, lsl #8
00184 e5d7e007 ldrb lr, [r7, #7]
00188 e1811403 orr r1, r1, r3, lsl #8
0018c e1823805 orr r3, r2, r5, lsl #16
00190 e1812806 orr r2, r1, r6, lsl #16
00194 e1833c0e orr r3, r3, lr, lsl #24
00198 e1822c04 orr r2, r2, r4, lsl #24
0019c e0535009 subs r5, r3, r9
001a0 e0896002 add r6, r9, r2
001a4 e1a03425 mov r3, r5, lsr #8
001a8 e1a02825 mov r2, r5, lsr #16
001ac e1a01c25 mov r1, r5, lsr #24
001b0 e1a00426 mov r0, r6, lsr #8
001b4 e1a0e826 mov lr, r6, lsr #16
001b8 e1a04c26 mov r4, r6, lsr #24
001bc e5c73005 strb r3, [r7, #5]
001c0 e5c72006 strb r2, [r7, #6]
001c4 e5c71007 strb r1, [r7, #7]
001c8 e5c70001 strb r0, [r7, #1]
001cc e5c7e002 strb lr, [r7, #2]
001d0 e5c74003 strb r4, [r7, #3]
001d4 e5c75004 strb r5, [r7, #4]
001d8 e5c76000 strb r6, [r7]
; 663 :
; 664 : if (pCurrentSegment->sb_len == 0)
; 665 : {
; 666 : // Go to the next SG
; 667 : dwSgLeft--;
001dc 024bb001 subeq r11, r11, #1
001e0 e59d5000 ldr r5, [sp]
001e4 e59d6004 ldr r6, [sp, #4]
; 668 : pCurrentSegment++;
001e8 02877008 addeq r7, r7, #8
001ec e35b0000 cmp r11, #0
001f0 1affffb3 bne |$L33062|
001f4 |$L33772|
; 593 : {
001f4 e59d9008 ldr r9, [sp, #8]
001f8 |$L33063|
; 669 : }
; 670 :
; 671 : } // End of while loop
; 672 :
; 673 : if (pdwBytesWrite)
001f8 e3590000 cmp r9, #0
; 674 : *pdwBytesWrite = dwWriteCount;
001fc 15895000 strne r5, [r9]
; 675 : if (!dwSgLeft)
00200 e35b0000 cmp r11, #0
00204 1affff8c bne |$L33048|
00208 |$L33770|
; 676 : break;
; 677 : }
; 678 : return TRUE;
00208 e3a00001 mov r0, #1
0020c |$L33039|
; 679 : }
0020c e28dd00c add sp, sp, #0xC
00210 e8bd4ff0 ldmia sp!, {r4 - r11, lr}
00214 e12fff1e bx lr
00218 |$L33769|
; 636 : {
; 637 : 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));
; 638 : return(FALSE);
00218 e3a00000 mov r0, #0
0021c eafffffa b |$L33039|
00220 |$L33790|
00220 b6a000a0 DCD 0xb6a000a0
00224 b6a00080 DCD 0xb6a00080
00228 |$M33786|
ENDP ; |?AtapiSendData@CDisk@@QAAHPAU_SGX_BUF@@KPAK@Z|, CDisk::AtapiSendData
EXPORT |?AtapiIsUnitReady@CDisk@@QAAHPAU_IOREQ@@@Z| ; CDisk::AtapiIsUnitReady
; File c:\wince500\platform\bvdmain\drivers\atapi\diskmain.h
00000 AREA |.text| { |?AtapiIsUnitReady@CDisk@@QAAHPAU_IOREQ@@@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?AtapiIsUnitReady@CDisk@@QAAHPAU_IOREQ@@@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?AtapiIsUnitReady@CDisk@@QAAHPAU_IOREQ@@@Z| } ; comdat associative
|$T33804| DCD |$L33803|
DCD 0x40003802
; Function compile flags: /Ogsy
; File c:\wince500\platform\bvdmain\drivers\atapi\cdio.cpp
00000 AREA |.text| { |?AtapiIsUnitReady@CDisk@@QAAHPAU_IOREQ@@@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?AtapiIsUnitReady@CDisk@@QAAHPA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -