⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdio.cod

📁 PXA270的BSP
💻 COD
📖 第 1 页 / 共 5 页
字号:
; 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 + -