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

📄 cdio.cod

📁 广东嵌入式培训中心GEC2410开发板的Windows CE 5.0的BSP
💻 COD
📖 第 1 页 / 共 5 页
字号:
  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
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -