📄 cdio.cod
字号:
; 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 + -