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

📄 cdio.cod

📁 广东嵌入式培训中心GEC2410开发板的Windows CE 5.0的BSP
💻 COD
📖 第 1 页 / 共 5 页
字号:
; 464  :     // buffer and a null scatter/gather buffer count--which is valid.  We only
; 465  :     // want to map the caller buffer if the buffer and count are non-null.
; 466  :     if (pCurrentSegment && dwSgCount > 0) {

  00068	e3590000	 cmp         r9, #0
  0006c	0a000021	 beq         |$L32293|

; 467  :         // map address and check for security violation
; 468  :         pCurrentBuffer = (LPBYTE)MapCallerPtr((LPVOID)pCurrentSegment->sb_buf, pCurrentSegment->sb_len);

  00070	e5d70004	 ldrb        r0, [r7, #4]
  00074	e5d72005	 ldrb        r2, [r7, #5]
  00078	e5d71000	 ldrb        r1, [r7]
  0007c	e5d73001	 ldrb        r3, [r7, #1]
  00080	e5d74006	 ldrb        r4, [r7, #6]
  00084	e5d75002	 ldrb        r5, [r7, #2]
  00088	e1802402	 orr         r2, r0, r2, lsl #8
  0008c	e5d70007	 ldrb        r0, [r7, #7]
  00090	e5d7e003	 ldrb        lr, [r7, #3]
  00094	e1811403	 orr         r1, r1, r3, lsl #8
  00098	e1823804	 orr         r3, r2, r4, lsl #16
  0009c	e1812805	 orr         r2, r1, r5, lsl #16
  000a0	e1831c00	 orr         r1, r3, r0, lsl #24
  000a4	e1820c0e	 orr         r0, r2, lr, lsl #24
  000a8	eb000000	 bl          MapCallerPtr

; 469  :         if (pCurrentSegment->sb_buf != NULL && pCurrentBuffer == NULL) {

  000ac	e5d7e000	 ldrb        lr, [r7]
  000b0	e5d73001	 ldrb        r3, [r7, #1]
  000b4	e5d72002	 ldrb        r2, [r7, #2]
  000b8	e5d71003	 ldrb        r1, [r7, #3]
  000bc	e18e3403	 orr         r3, lr, r3, lsl #8
  000c0	e1833802	 orr         r3, r3, r2, lsl #16
  000c4	e1933c01	 orrs        r3, r3, r1, lsl #24
  000c8	e1a05000	 mov         r5, r0
  000cc	0a000002	 beq         |$L32296|
  000d0	e3550000	 cmp         r5, #0

; 470  :             // security violation
; 471  :             DEBUGMSG(ZONE_ERROR, (TEXT(
; 472  :                 "Atapi!CPCIDiskAndCD::AtapiReceiveData> Failed to map pointer to caller\r\n"
; 473  :                 )));
; 474  :             return ERROR_INVALID_PARAMETER;

  000d4	03a00057	 moveq       r0, #0x57
  000d8	0a00006e	 beq         |$L32281|
  000dc		 |$L32296|

; 475  :         }
; 476  :         dwLen = pCurrentSegment->sb_len;

  000dc	e5d70004	 ldrb        r0, [r7, #4]
  000e0	e5d73005	 ldrb        r3, [r7, #5]
  000e4	e5d72006	 ldrb        r2, [r7, #6]
  000e8	e5d71007	 ldrb        r1, [r7, #7]
  000ec	e1803403	 orr         r3, r0, r3, lsl #8
  000f0	e1833802	 orr         r3, r3, r2, lsl #16
  000f4	e183ac01	 orr         r10, r3, r1, lsl #24
  000f8		 |$L32293|

; 477  :     }
; 478  : 
; 479  :     m_wNextByte = 0xFFFF; // There is no byte left from the previous transaction.

  000f8	e3a03cff	 mov         r3, #0xFF, 24
  000fc	e38330ff	 orr         r3, r3, #0xFF
  00100	e1c635b0	 strh        r3, [r6, #0x50]
  00104		 |$L32299|

; 480  :     
; 481  :     for(;;) {   
; 482  :         if (m_fInterruptSupported) {   

  00104	e5963040	 ldr         r3, [r6, #0x40]
  00108	e3530000	 cmp         r3, #0
  0010c	0a000015	 beq         |$L32308|

; 483  :             // 
; 484  :             //  Waiting for ATA_INTR_READ or ATA_INTR_WRITE  or ATA_INTR_READY
; 485  :             //
; 486  :             if (!WaitForInterrupt(m_dwDiskIoTimeOut)) {

  00110	e5963000	 ldr         r3, [r6]
  00114	e59616c8	 ldr         r1, [r6, #0x6C8]
  00118	e1a00006	 mov         r0, r6
  0011c	e5933038	 ldr         r3, [r3, #0x38]
  00120	e1a0e00f	 mov         lr, pc
  00124	e12fff13	 bx          r3
  00128	e3500000	 cmp         r0, #0
  0012c	0a00005c	 beq         |$L32940|

; 489  :             }
; 490  :             WORD wState = CheckIntrState();

  00130	e1a00006	 mov         r0, r6
  00134	eb000000	 bl          |?CheckIntrState@CDisk@@QAAGXZ|
  00138	e1a03800	 mov         r3, r0, lsl #16
  0013c	e1a03823	 mov         r3, r3, lsr #16

; 491  :             //
; 492  :             // Return Error if not IO Interrupt
; 493  :             //
; 494  :             if ((wState ==  ATA_INTR_ERROR) || (GetAltStatus() & ATA_STATUS_ERROR))

  00140	e1b04003	 movs        r4, r3
  00144	0a000056	 beq         |$L32940|
  00148	e5962034	 ldr         r2, [r6, #0x34]
  0014c	e5963028	 ldr         r3, [r6, #0x28]
  00150	e0820003	 add         r0, r2, r3
  00154	eb000000	 bl          READ_PORT_UCHAR
  00158	e3100001	 tst         r0, #1
  0015c	1a000050	 bne         |$L32940|

; 495  :             {   
; 496  :                 DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData - Wait for ATA_INTR_READ failed (DevId %x) \r\n"), m_dwDeviceId));
; 497  :                 return FALSE;
; 498  :             
; 499  :             }
; 500  :             if (wState ==  ATA_INTR_READY)

  00160	e3540003	 cmp         r4, #3
  00164	0a00004a	 beq         |$L32944|
  00168		 |$L32308|

; 504  :             }
; 505  :         
; 506  :             
; 507  :         };
; 508  :         //
; 509  :         // Wait until device is ready for  data transfer.
; 510  :         //
; 511  :         if (!WaitForDRQ()) 

  00168	e5963000	 ldr         r3, [r6]
  0016c	e1a00006	 mov         r0, r6
  00170	e5933018	 ldr         r3, [r3, #0x18]
  00174	e1a0e00f	 mov         lr, pc
  00178	e12fff13	 bx          r3
  0017c	e3500000	 cmp         r0, #0
  00180	0a000047	 beq         |$L32940|

; 512  :         {
; 513  :             DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData Failed at WaitForDRQ Status=%02X Error=%02X Deivce=%ld\r\n"), GetAltStatus(), GetError(), m_dwDeviceId));
; 514  :             return(FALSE);
; 515  :         }
; 516  :     
; 517  :         //
; 518  :         //  Read Transfer Counter set by Device.
; 519  :         //
; 520  :         dwTransferCount = GetCount();

  00184	e1a00006	 mov         r0, r6
  00188	eb000000	 bl          |?GetCount@CDisk@@QAAGXZ|
  0018c	e1a08000	 mov         r8, r0
  00190	ea00002d	 b           |$L32961|
  00194		 |$L32314|

; 521  : 
; 522  :         DEBUGMSG (ZONE_CDROM | ZONE_IO, (TEXT(">>>Read Transfer Count : %x  SG=%x \r\n"),dwTransferCount,dwSgLeft));
; 523  : 
; 524  :         while ((dwSgLeft>0) && (dwTransferCount>0))

  00194	e3580000	 cmp         r8, #0
  00198	0a000038	 beq         |$L32325|

; 525  :         {   
; 526  :             dwThisCount = min(dwTransferCount, dwLen);

  0019c	e158000a	 cmp         r8, r10
  001a0	31a04008	 movcc       r4, r8
  001a4	21a0400a	 movcs       r4, r10

; 527  :             
; 528  :             if (pCurrentBuffer) {

  001a8	e3550000	 cmp         r5, #0
  001ac	0a000005	 beq         |$L32316|

; 529  :                 ReadBuffer(pCurrentBuffer,dwThisCount);

  001b0	e1a02004	 mov         r2, r4
  001b4	e1a01005	 mov         r1, r5
  001b8	e1a00006	 mov         r0, r6
  001bc	eb000000	 bl          |?ReadBuffer@CDisk@@QAAXPAEK@Z|

; 530  :                 dwTransferCount -= dwThisCount;

  001c0	e0488004	 sub         r8, r8, r4

; 531  :                 dwReadCount += dwThisCount;

  001c4	e08bb004	 add         r11, r11, r4
  001c8		 |$L32316|

; 532  :             }
; 533  :             pCurrentBuffer += dwThisCount;

  001c8	e0855004	 add         r5, r5, r4

; 534  :             dwLen -= dwThisCount;

  001cc	e05aa004	 subs        r10, r10, r4

; 535  : 
; 536  :             if (dwLen == 0) {

  001d0	1a00001d	 bne         |$L32961|

; 537  :                 // Go to the next SG
; 538  :                 dwSgLeft--;           

  001d4	e2499001	 sub         r9, r9, #1

; 539  :                 pCurrentSegment++;

  001d8	e2977008	 adds        r7, r7, #8

; 540  :                 if (pCurrentSegment) {

  001dc	0a00001a	 beq         |$L32961|

; 541  :                     dwLen = pCurrentSegment->sb_len;

  001e0	e5d72004	 ldrb        r2, [r7, #4]
  001e4	e5d73005	 ldrb        r3, [r7, #5]
  001e8	e5d7e006	 ldrb        lr, [r7, #6]

; 542  :                     // map address and check for security violation
; 543  :                     pCurrentBuffer = (LPBYTE)MapCallerPtr((LPVOID)pCurrentSegment->sb_buf, pCurrentSegment->sb_len);

  001ec	e5d75000	 ldrb        r5, [r7]
  001f0	e5d74001	 ldrb        r4, [r7, #1]
  001f4	e5d71007	 ldrb        r1, [r7, #7]
  001f8	e5d70002	 ldrb        r0, [r7, #2]
  001fc	e1823403	 orr         r3, r2, r3, lsl #8
  00200	e183280e	 orr         r2, r3, lr, lsl #16
  00204	e5d7e003	 ldrb        lr, [r7, #3]
  00208	e1853404	 orr         r3, r5, r4, lsl #8
  0020c	e1833800	 orr         r3, r3, r0, lsl #16
  00210	e182ac01	 orr         r10, r2, r1, lsl #24
  00214	e1830c0e	 orr         r0, r3, lr, lsl #24
  00218	e1a0100a	 mov         r1, r10
  0021c	eb000000	 bl          MapCallerPtr

; 544  :                     if (pCurrentSegment->sb_buf != NULL && pCurrentBuffer == NULL) {

  00220	e5d7e000	 ldrb        lr, [r7]
  00224	e5d73001	 ldrb        r3, [r7, #1]
  00228	e5d72002	 ldrb        r2, [r7, #2]
  0022c	e5d71003	 ldrb        r1, [r7, #3]
  00230	e18e3403	 orr         r3, lr, r3, lsl #8
  00234	e1833802	 orr         r3, r3, r2, lsl #16
  00238	e1933c01	 orrs        r3, r3, r1, lsl #24
  0023c	e1a05000	 mov         r5, r0
  00240	0a000001	 beq         |$L32961|
  00244	e3550000	 cmp         r5, #0
  00248	0a000017	 beq         |$L32939|
  0024c		 |$L32961|

; 521  : 
; 522  :         DEBUGMSG (ZONE_CDROM | ZONE_IO, (TEXT(">>>Read Transfer Count : %x  SG=%x \r\n"),dwTransferCount,dwSgLeft));
; 523  : 
; 524  :         while ((dwSgLeft>0) && (dwTransferCount>0))

  0024c	e3590000	 cmp         r9, #0
  00250	1affffcf	 bne         |$L32314|

; 550  :                     }
; 551  :                 }
; 552  :             }
; 553  : 
; 554  :         } // End of while loop
; 555  :     
; 556  :         // Discard the rest of data if left.
; 557  : 
; 558  :         while (dwTransferCount > 0) 

  00254	e3580000	 cmp         r8, #0
  00258	0a000008	 beq         |$L32325|
  0025c	e2483001	 sub         r3, r8, #1
  00260	e1a030a3	 mov         r3, r3, lsr #1
  00264	e2834001	 add         r4, r3, #1
  00268		 |$L32324|

; 559  :         {
; 560  :             (void) ReadWord();

  00268	e5962030	 ldr         r2, [r6, #0x30]
  0026c	e5963008	 ldr         r3, [r6, #8]
  00270	e0820003	 add         r0, r2, r3
  00274	eb000000	 bl          READ_PORT_USHORT
  00278	e2544001	 subs        r4, r4, #1
  0027c	1afffff9	 bne         |$L32324|
  00280		 |$L32325|

; 561  :             dwTransferCount-=2 ;          
; 562  :         }
; 563  :         if (pdwBytesRead)

  00280	e59d8000	 ldr         r8, [sp]
  00284	e3580000	 cmp         r8, #0

; 564  :             *pdwBytesRead = dwReadCount;

  00288	1588b000	 strne       r11, [r8]

; 565  :         if (!dwSgLeft)

  0028c	e3590000	 cmp         r9, #0
  00290	1affff9b	 bne         |$L32299|
  00294		 |$L32944|

; 566  :             break;
; 567  :     }
; 568  :     return TRUE;

  00294	e3a00001	 mov         r0, #1
  00298		 |$L32281|

; 569  : } 

  00298	e28dd004	 add         sp, sp, #4
  0029c	e8bd4ff0	 ldmia       sp!, {r4 - r11, lr}
  002a0	e12fff1e	 bx          lr
  002a4		 |$L32940|

; 487  :                 DEBUGMSG(ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData - Wait for ATA_INTR_READ failed (DevId %x) \r\n"), m_dwDeviceId));
; 488  :                 return FALSE;

  002a4	e3a00000	 mov         r0, #0

; 501  :             {
; 502  :                 DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPI:AtapiReceiveData - Exiting with Interrupt Ready signal Device=%ld\r\n"), m_dwDeviceId));
; 503  :                 return TRUE;

  002a8	eafffffa	 b           |$L32281|
  002ac		 |$L32939|

; 545  :                         // security violation
; 546  :                         DEBUGMSG(ZONE_ERROR, (TEXT(
; 547  :                             "Atapi!CPCIDiskAndCD::AtapiReceiveData> Failed to map pointer to caller\r\n"
; 548  :                             )));
; 549  :                         return ERROR_ACCESS_DENIED;

  002ac	e3a00005	 mov         r0, #5
  002b0	eafffff8	 b           |$L32281|
  002b4		 |$M32965|

			 ENDP  ; |?AtapiReceiveData@CPCIDiskAndCD@@QAAHPAU_SGX_BUF@@KPAK@Z|, CPCIDiskAndCD::AtapiReceiveData

	EXPORT	|?AtapiSendData@CPCIDiskAndCD@@QAAHPAU_SGX_BUF@@KPAK@Z| ; CPCIDiskAndCD::AtapiSendData
	IMPORT	|?WriteBuffer@CDisk@@QAAXPAEK@Z|	; CDisk::WriteBuffer

  00000			 AREA	 |.text| { |?AtapiSendData@CPCIDiskAndCD@@QAAHPAU_SGX_BUF@@KPAK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000			 AREA	 |.pdata$$?AtapiSendData@CPCIDiskAndCD@@QAAHPAU_SGX_BUF@@KPAK@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?AtapiSendData@CPCIDiskAndCD@@QAAHPAU_SGX_BUF@@KPAK@Z| } ; comdat associative
|$T33000| DCD	|$L32999|
	DCD	0x40008902
; Function compile flags: /Ogsy

  00000			 AREA	 |.text| { |?AtapiSendData@CPCIDiskAndCD@@QAAHPAU_SGX_BUF@@KPAK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000		 |?AtapiSendData@CPCIDiskAndCD@@QAAHPAU_SGX_BUF@@KPAK@Z| PROC ; CPCIDiskAndCD::AtapiSendData

; 573  : {

  00000		 |$L32999|
  00000	e92d4ff0	 stmdb       sp!, {r4 - r11, lr}
  00004	e24dd008	 sub         sp, sp, #8
  00008		 |$M32997|
  00008	e58d3004	 str         r3, [sp, #4]

⌨️ 快捷键说明

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