📄 cdio.cod
字号:
; 176 : Byte 1 - N/A
; 177 : Byte 2 - Logical Block (MSB)
; 178 : Byte 2 - Logical Block
; 179 : Byte 2 - Logical Block
; 180 : Byte 2 - Logical Block (LSB)
; 181 : Byte 6 - Reserved
; 182 : Byte 7 - DataLength (MSB)
; 183 : Byte 8 - DataLength (LSB)
; 184 : Byte 9 - Control Byte
; 185 : ****** Atapi Packet ****/
; 186 : pCmdPkt->Byte_1 = 0x00;
; 187 : pCmdPkt->Byte_2 = LBA_MSB(&dwLBAAddr);
; 188 : pCmdPkt->Byte_3 = LBA_3rdLSB(&dwLBAAddr);
; 189 : pCmdPkt->Byte_4 = LBA_2ndLSB(&dwLBAAddr);
0002c e5dde021 ldrb lr, [sp, #0x21]
00030 e5dd2023 ldrb r2, [sp, #0x23]
00034 e5dd0022 ldrb r0, [sp, #0x22]
; 190 : pCmdPkt->Byte_5 = LBA_LSB(&dwLBAAddr);
00038 e5dd4020 ldrb r4, [sp, #0x20]
0003c e3a09000 mov r9, #0
00040 e5c6e004 strb lr, [r6, #4]
00044 e5c62002 strb r2, [r6, #2]
00048 e5c60003 strb r0, [r6, #3]
0004c e5c64005 strb r4, [r6, #5]
00050 e5c69001 strb r9, [r6, #1]
; 191 : if (fIsDVD && !bRawMode) {
00054 e3150040 tst r5, #0x40
00058 0a00000b beq |$L32872|
0005c e3580000 cmp r8, #0
00060 1a00000b bne |$L33590|
; 192 : pCmdPkt->Opcode = ATAPI_PACKET_CMD_READ_12;
00064 e3a000a8 mov r0, #0xA8
; 193 : pCmdPkt->Byte_6 = (BYTE)( dwTransferLength >> 24);
00068 e1a03c27 mov r3, r7, lsr #24
; 194 : pCmdPkt->Byte_7 = (BYTE)( (dwTransferLength & 0x00ff0000) >> 16);
0006c e1a02827 mov r2, r7, lsr #16
; 195 : pCmdPkt->Byte_8 = (BYTE)( (dwTransferLength & 0x0000ff00) >> 8);
00070 e1a01427 mov r1, r7, lsr #8
00074 e5c60000 strb r0, [r6]
00078 e5c63006 strb r3, [r6, #6]
0007c e5c62007 strb r2, [r6, #7]
00080 e5c61008 strb r1, [r6, #8]
; 196 : pCmdPkt->Byte_9 = (BYTE)( dwTransferLength);
00084 e5c67009 strb r7, [r6, #9]
; 197 : } else {
00088 ea00000b b |$L32877|
0008c |$L32872|
; 198 : pCmdPkt->Opcode = bRawMode ? ATAPI_PACKET_CMD_READ_CD : ATAPI_PACKET_CMD_READ;
0008c e3580000 cmp r8, #0
00090 0a000001 beq |$L33588|
00094 |$L33590|
00094 e3a020be mov r2, #0xBE
00098 ea000000 b |$L33589|
0009c |$L33588|
0009c e3a02028 mov r2, #0x28
000a0 |$L33589|
; 199 : pCmdPkt->Byte_6 = 0x00; // Reserved
; 200 : pCmdPkt->Byte_7 = (BYTE)( (dwTransferLength & 0x0000ff00) >> 8);
000a0 e1a03427 mov r3, r7, lsr #8
; 201 : pCmdPkt->Byte_8 = (BYTE)( dwTransferLength);
; 202 : pCmdPkt->Byte_9 = 0x10;
000a4 e3a01010 mov r1, #0x10
000a8 e5c63007 strb r3, [r6, #7]
000ac e5c61009 strb r1, [r6, #9]
000b0 e5c62000 strb r2, [r6]
000b4 e5c69006 strb r9, [r6, #6]
000b8 e5c67008 strb r7, [r6, #8]
000bc |$L32877|
; 203 : }
; 204 :
; 205 : pCmdPkt->Byte_10 = 0;
000bc e5c6900a strb r9, [r6, #0xA]
; 206 : return ERROR_SUCCESS;
000c0 e3a00000 mov r0, #0
; 207 : }
000c4 e89d63f0 ldmia sp, {r4 - r9, sp, lr}
000c8 e12fff1e bx lr
000cc |$M33600|
ENDP ; |?SetupCdRomRead@CDisk@@QAAKHKKPAU_ATAPI_COMMAND_PACKET@@@Z|, CDisk::SetupCdRomRead
EXPORT |?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z| ; CDisk::AtapiSendCommand
IMPORT |?WaitOnBusy@CDisk@@QAAEH@Z| ; CDisk::WaitOnBusy
IMPORT |?WaitForDRQ@CDisk@@QAAHXZ| ; CDisk::WaitForDRQ
IMPORT |?WaitForDisc@CDisk@@QAAHEKK@Z| ; CDisk::WaitForDisc
; File d:\wince500\platform\bvdmain\drivers\atapi\diskmain.h
00000 AREA |.text| { |?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z| } ; comdat associative
|$T33687| DCD |$L33686|
DCD 0x40007e01
; Function compile flags: /Ogsy
; File d:\wince500\platform\bvdmain\drivers\atapi\cdio.cpp
00000 AREA |.text| { |?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?AtapiSendCommand@CDisk@@QAAHPAU_ATAPI_COMMAND_PACKET@@GH@Z| PROC ; CDisk::AtapiSendCommand
; 403 : {
00000 |$L33686|
00000 e92d40f0 stmdb sp!, {r4 - r7, lr}
00004 |$M33684|
00004 e1a06003 mov r6, r3
00008 e1a05002 mov r5, r2
0000c e1a07001 mov r7, r1
00010 e1a04000 mov r4, r0
; 404 : // Set the Drive/Head registers
; 405 : SelectDevice();
00014 e594e64c ldr lr, [r4, #0x64C]
00018 e59f01c4 ldr r0, [pc, #0x1C4]
0001c e35e0000 cmp lr, #0
00020 03a0e0a0 moveq lr, #0xA0
00024 13a0e0b0 movne lr, #0xB0
00028 e20e10ff and r1, lr, #0xFF
0002c eb000000 bl WRITE_PORT_UCHAR
; 406 : GetBaseStatus();
00030 e59f01a8 ldr r0, [pc, #0x1A8]
00034 eb000000 bl READ_PORT_UCHAR
; 407 :
; 408 : SelectDevice();
00038 e594364c ldr r3, [r4, #0x64C]
0003c e59f01a0 ldr r0, [pc, #0x1A0]
00040 e3530000 cmp r3, #0
00044 03a030a0 moveq r3, #0xA0
00048 13a030b0 movne r3, #0xB0
0004c e20310ff and r1, r3, #0xFF
00050 eb000000 bl WRITE_PORT_UCHAR
; 409 : if (WaitOnBusy(FALSE))
00054 e3a01000 mov r1, #0
00058 e1a00004 mov r0, r4
0005c eb000000 bl |?WaitOnBusy@CDisk@@QAAEH@Z|
00060 e3500000 cmp r0, #0
00064 0a000004 beq |$L32963|
; 410 : {
; 411 : if (GetError() & ATA_STATUS_ERROR)
00068 e3a00183 mov r0, #0x83, 2
0006c e2400696 sub r0, r0, #0x96, 12
00070 eb000000 bl READ_PORT_UCHAR
00074 e3100001 tst r0, #1
; 412 : {
; 413 : return FALSE;
00078 1a000043 bne |$L33683|
0007c |$L32963|
; 414 : }
; 415 : }
; 416 :
; 417 : WriteSectorCount(0);
0007c e59f0170 ldr r0, [pc, #0x170]
00080 e3a01000 mov r1, #0
00084 eb000000 bl WRITE_PORT_UCHAR
; 418 :
; 419 : WriteSectorNumber(0);
00088 e59f0160 ldr r0, [pc, #0x160]
0008c e3a01000 mov r1, #0
00090 eb000000 bl WRITE_PORT_UCHAR
; 420 :
; 421 :
; 422 : // Set the byte tranfer count
; 423 : if (wCount) {
; 424 : WriteLowCount((BYTE)(0xff & wCount));
00094 e59f0150 ldr r0, [pc, #0x150]
00098 e3550000 cmp r5, #0
0009c 0a000004 beq |$L32964|
000a0 e20510ff and r1, r5, #0xFF
000a4 eb000000 bl WRITE_PORT_UCHAR
; 425 : WriteHighCount((BYTE)(0xff & (wCount >> 8)));
000a8 e1a03425 mov r3, r5, lsr #8
000ac e20310ff and r1, r3, #0xFF
; 426 : } else {
000b0 ea000002 b |$L33682|
000b4 |$L32964|
; 427 : WriteLowCount(0xFE);
000b4 e3a010fe mov r1, #0xFE
000b8 eb000000 bl WRITE_PORT_UCHAR
; 428 : WriteHighCount(0xFF);
000bc e3a010ff mov r1, #0xFF
000c0 |$L33682|
000c0 e59f0120 ldr r0, [pc, #0x120]
000c4 eb000000 bl WRITE_PORT_UCHAR
; 429 : }
; 430 :
; 431 :
; 432 : //
; 433 : // Set PIO or DMA Mode as specified in bFlags. 0 = PIO, 1 = DMA
; 434 : //
; 435 : WriteFeature(fDMA ? 0x1 : 0x0);
000c8 e3560000 cmp r6, #0
000cc 13a03001 movne r3, #1
000d0 03a03000 moveq r3, #0
000d4 e3a00183 mov r0, #0x83, 2
000d8 e20310ff and r1, r3, #0xFF
000dc e2400696 sub r0, r0, #0x96, 12
000e0 eb000000 bl WRITE_PORT_UCHAR
; 436 :
; 437 : WaitForDisc( WAIT_TYPE_NOT_BUSY, 20);
000e4 e3a03000 mov r3, #0
000e8 e3a02014 mov r2, #0x14
000ec e3a01002 mov r1, #2
000f0 e1a00004 mov r0, r4
000f4 eb000000 bl |?WaitForDisc@CDisk@@QAAHEKK@Z|
; 438 :
; 439 : // Write ATAPI into command register
; 440 :
; 441 : SelectDevice();
000f8 e594364c ldr r3, [r4, #0x64C]
000fc e59f00e0 ldr r0, [pc, #0xE0]
00100 e3530000 cmp r3, #0
00104 03a030a0 moveq r3, #0xA0
00108 13a030b0 movne r3, #0xB0
0010c e20310ff and r1, r3, #0xFF
00110 eb000000 bl WRITE_PORT_UCHAR
; 442 :
; 443 : WriteCommand(ATAPI_CMD_COMMAND);
00114 e59f00c4 ldr r0, [pc, #0xC4]
00118 e3a010a0 mov r1, #0xA0
0011c eb000000 bl WRITE_PORT_UCHAR
; 444 :
; 445 : WaitForDisc( WAIT_TYPE_NOT_BUSY, 20);
00120 e3a03000 mov r3, #0
00124 e3a02014 mov r2, #0x14
00128 e3a01002 mov r1, #2
0012c e1a00004 mov r0, r4
00130 eb000000 bl |?WaitForDisc@CDisk@@QAAHEKK@Z|
; 446 : //
; 447 : // Check how device is reporting CPU attention: DRQ or INTRQ?
; 448 : // INTRQ within 10 ms!!!
; 449 : //
; 450 : if (m_fInterruptSupported && IsDRQTypeIRQ())
00134 e5943684 ldr r3, [r4, #0x684]
00138 e3530000 cmp r3, #0
0013c 0a00000e beq |$L32969|
00140 e5d42444 ldrb r2, [r4, #0x444]
00144 e5d43445 ldrb r3, [r4, #0x445]
00148 e1823403 orr r3, r2, r3, lsl #8
0014c e2033060 and r3, r3, #0x60
00150 e3530020 cmp r3, #0x20
00154 1a000008 bne |$L32969|
; 451 : {
; 452 : // ATA_INTR_CMD is expected
; 453 : //
; 454 : if (!WaitForInterrupt(DISK_IO_TIME_OUT))
00158 e5943000 ldr r3, [r4]
0015c e3a01c4e mov r1, #0x4E, 24
00160 e3811020 orr r1, r1, #0x20
00164 e5933014 ldr r3, [r3, #0x14]
00168 e1a00004 mov r0, r4
0016c e1a0e00f mov lr, pc
00170 e12fff13 bx r3
00174 e3500000 cmp r0, #0
; 455 : {
; 456 : DEBUGMSG( ZONE_IO | ZONE_CDROM, (TEXT("ATAPI:AtapiSendCommand - Wait for ATA_INTR_CMD Interrupt (DevId %x) \r\n"), m_dwDeviceId));
; 457 : return FALSE;
00178 0a000003 beq |$L33683|
0017c |$L32969|
; 458 : }
; 459 : }
; 460 : //
; 461 : // Device will assert DRQ within (50us or 3ms) if no interrupt id used
; 462 : // Wait for not BSY and DRQ
; 463 :
; 464 :
; 465 : if (!WaitForDRQ())
0017c e1a00004 mov r0, r4
00180 eb000000 bl |?WaitForDRQ@CDisk@@QAAHXZ|
00184 e3500000 cmp r0, #0
00188 1a000002 bne |$L32971|
0018c |$L33683|
; 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;
0018c e3a00000 mov r0, #0
; 477 : }
00190 e8bd40f0 ldmia sp!, {r4 - r7, lr}
00194 e12fff1e bx lr
00198 |$L32971|
; 469 :
; 470 : }
; 471 :
; 472 : // Write the ATAPI Command Packet.
; 473 :
; 474 : WriteWordBuffer( (LPWORD)pCmdPkt,GetPacketSize()/sizeof(WORD));
00198 e5d42444 ldrb r2, [r4, #0x444]
0019c e5d43445 ldrb r3, [r4, #0x445]
001a0 e1a01007 mov r1, r7
001a4 e1a00004 mov r0, r4
001a8 e1823403 orr r3, r2, r3, lsl #8
001ac e3130003 tst r3, #3
001b0 13a02010 movne r2, #0x10
001b4 03a0200c moveq r2, #0xC
001b8 e5943000 ldr r3, [r4]
001bc e1a02802 mov r2, r2, lsl #16
001c0 e1a02822 mov r2, r2, lsr #16
001c4 e593303c ldr r3, [r3, #0x3C]
001c8 e1a020a2 mov r2, r2, lsr #1
001cc e1a0e00f mov lr, pc
001d0 e12fff13 bx r3
; 475 :
; 476 : return TRUE;
001d4 e3a00001 mov r0, #1
; 477 : }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -