📄 cdio.cod
字号:
00000 |?GetPacketSize@CDisk@@QAAGXZ| PROC ; CDisk::GetPacketSize
; 577 : {
00000 |$L33612|
00000 |$M33610|
; 578 : return m_Id.GeneralConfiguration & 0x0003 ? 16 : 12;
00000 e5d02444 ldrb r2, [r0, #0x444]
00004 e5d03445 ldrb r3, [r0, #0x445]
00008 e1823403 orr r3, r2, r3, lsl #8
0000c e3130003 tst r3, #3
00010 13a03010 movne r3, #0x10
00014 03a0300c moveq r3, #0xC
00018 e1a00803 mov r0, r3, lsl #16
0001c e1a00820 mov r0, r0, lsr #16
; 579 : }
00020 e12fff1e bx lr
00024 |$M33611|
ENDP ; |?GetPacketSize@CDisk@@QAAGXZ|, CDisk::GetPacketSize
EXPORT |?SetupCdRomRead@CDisk@@QAAKHKKPAU_ATAPI_COMMAND_PACKET@@@Z| ; CDisk::SetupCdRomRead
IMPORT |memset|
; File c:\wince500\platform\bvdmain\drivers\atapi\cdio.cpp
00000 AREA |.text| { |?SetupCdRomRead@CDisk@@QAAKHKKPAU_ATAPI_COMMAND_PACKET@@@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?SetupCdRomRead@CDisk@@QAAKHKKPAU_ATAPI_COMMAND_PACKET@@@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?SetupCdRomRead@CDisk@@QAAKHKKPAU_ATAPI_COMMAND_PACKET@@@Z| } ; comdat associative
|$T33631| DCD |$L33630|
DCD 0x40003303
; Function compile flags: /Ogsy
00000 AREA |.text| { |?SetupCdRomRead@CDisk@@QAAKHKKPAU_ATAPI_COMMAND_PACKET@@@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?SetupCdRomRead@CDisk@@QAAKHKKPAU_ATAPI_COMMAND_PACKET@@@Z| PROC ; CDisk::SetupCdRomRead
; 168 : {
00000 |$L33630|
00000 e1a0c00d mov r12, sp
00004 e92d0004 stmdb sp!, {r2}
00008 e92d53f0 stmdb sp!, {r4 - r9, r12, lr}
0000c |$M33628|
0000c e1a07003 mov r7, r3
00010 e1a08001 mov r8, r1
; 169 : BOOL fIsDVD = (m_dwDeviceFlags & DFLAGS_DEVICE_ISDVD);
; 170 :
; 171 : memset( pCmdPkt, 0, sizeof(ATAPI_COMMAND_PACKET));
00014 e59d6024 ldr r6, [sp, #0x24]
00018 e5905004 ldr r5, [r0, #4]
0001c e3a02014 mov r2, #0x14
00020 e1a00006 mov r0, r6
00024 e3a01000 mov r1, #0
00028 eb000000 bl memset
; 172 :
; 173 :
; 174 : /**** Atapi Packet *****
; 175 : Byte 0 - Cmd/OpCode
; 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 |$L32886|
0005c e3580000 cmp r8, #0
00060 1a00000b bne |$L33619|
; 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 |$L32891|
0008c |$L32886|
; 198 : pCmdPkt->Opcode = bRawMode ? ATAPI_PACKET_CMD_READ_CD : ATAPI_PACKET_CMD_READ;
0008c e3580000 cmp r8, #0
00090 0a000001 beq |$L33617|
00094 |$L33619|
00094 e3a020be mov r2, #0xBE
00098 ea000000 b |$L33618|
0009c |$L33617|
0009c e3a02028 mov r2, #0x28
000a0 |$L33618|
; 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 |$L32891|
; 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 |$M33629|
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 c:\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
|$T33691| DCD |$L33690|
DCD 0x40006d01
; Function compile flags: /Ogsy
; File c:\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 |$L33690|
00000 e92d40f0 stmdb sp!, {r4 - r7, lr}
00004 |$M33688|
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 eb000000 bl |?SelectDevice@CDisk@@QAAXXZ|
; 406 : GetBaseStatus();
00018 e59f0190 ldr r0, [pc, #0x190]
0001c eb000000 bl READ_PORT_UCHAR
; 407 :
; 408 : SelectDevice();
00020 e1a00004 mov r0, r4
00024 eb000000 bl |?SelectDevice@CDisk@@QAAXXZ|
; 409 : if (WaitOnBusy(FALSE))
00028 e3a01000 mov r1, #0
0002c e1a00004 mov r0, r4
00030 eb000000 bl |?WaitOnBusy@CDisk@@QAAEH@Z|
00034 e3500000 cmp r0, #0
00038 0a000004 beq |$L32977|
; 410 : {
; 411 : if (GetError() & ATA_STATUS_ERROR)
0003c e3a00183 mov r0, #0x83, 2
00040 e2400696 sub r0, r0, #0x96, 12
00044 eb000000 bl READ_PORT_UCHAR
00048 e3100001 tst r0, #1
; 412 : {
; 413 : return FALSE;
0004c 1a00003e bne |$L33687|
00050 |$L32977|
; 414 : }
; 415 : }
; 416 :
; 417 : WriteSectorCount(0);
00050 e59f0154 ldr r0, [pc, #0x154]
00054 e3a01000 mov r1, #0
00058 eb000000 bl WRITE_PORT_UCHAR
; 418 :
; 419 : WriteSectorNumber(0);
0005c e59f0144 ldr r0, [pc, #0x144]
00060 e3a01000 mov r1, #0
00064 eb000000 bl WRITE_PORT_UCHAR
; 420 :
; 421 :
; 422 : // Set the byte tranfer count
; 423 : if (wCount) {
; 424 : WriteLowCount((BYTE)(0xff & wCount));
00068 e59f0134 ldr r0, [pc, #0x134]
0006c e3550000 cmp r5, #0
00070 0a000004 beq |$L32978|
00074 e20510ff and r1, r5, #0xFF
00078 eb000000 bl WRITE_PORT_UCHAR
; 425 : WriteHighCount((BYTE)(0xff & (wCount >> 8)));
0007c e1a03425 mov r3, r5, lsr #8
00080 e20310ff and r1, r3, #0xFF
; 426 : } else {
00084 ea000002 b |$L33686|
00088 |$L32978|
; 427 : WriteLowCount(0xFE);
00088 e3a010fe mov r1, #0xFE
0008c eb000000 bl WRITE_PORT_UCHAR
; 428 : WriteHighCount(0xFF);
00090 e3a010ff mov r1, #0xFF
00094 |$L33686|
00094 e59f0104 ldr r0, [pc, #0x104]
00098 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);
0009c e3560000 cmp r6, #0
000a0 13a03001 movne r3, #1
000a4 03a03000 moveq r3, #0
000a8 e3a00183 mov r0, #0x83, 2
000ac e20310ff and r1, r3, #0xFF
000b0 e2400696 sub r0, r0, #0x96, 12
000b4 eb000000 bl WRITE_PORT_UCHAR
; 436 :
; 437 : WaitForDisc( WAIT_TYPE_NOT_BUSY, 20);
000b8 e3a03000 mov r3, #0
000bc e3a02014 mov r2, #0x14
000c0 e3a01002 mov r1, #2
000c4 e1a00004 mov r0, r4
000c8 eb000000 bl |?WaitForDisc@CDisk@@QAAHEKK@Z|
; 438 :
; 439 : // Write ATAPI into command register
; 440 :
; 441 : SelectDevice();
000cc e1a00004 mov r0, r4
000d0 eb000000 bl |?SelectDevice@CDisk@@QAAXXZ|
; 442 :
; 443 : WriteCommand(ATAPI_CMD_COMMAND);
000d4 e3a010a0 mov r1, #0xA0
000d8 e1a00004 mov r0, r4
000dc eb000000 bl |?WriteCommand@CDisk@@QAAXE@Z|
; 444 :
; 445 : WaitForDisc( WAIT_TYPE_NOT_BUSY, 20);
000e0 e3a03000 mov r3, #0
000e4 e3a02014 mov r2, #0x14
000e8 e3a01002 mov r1, #2
000ec e1a00004 mov r0, r4
000f0 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())
000f4 e5943684 ldr r3, [r4, #0x684]
000f8 e3530000 cmp r3, #0
000fc 0a00000e beq |$L32983|
00100 e5d42444 ldrb r2, [r4, #0x444]
00104 e5d43445 ldrb r3, [r4, #0x445]
00108 e1823403 orr r3, r2, r3, lsl #8
0010c e2033060 and r3, r3, #0x60
00110 e3530020 cmp r3, #0x20
00114 1a000008 bne |$L32983|
; 451 : {
; 452 : // ATA_INTR_CMD is expected
; 453 : //
; 454 : if (!WaitForInterrupt(DISK_IO_TIME_OUT))
00118 e5943000 ldr r3, [r4]
0011c e3a01c4e mov r1, #0x4E, 24
00120 e3811020 orr r1, r1, #0x20
00124 e5933014 ldr r3, [r3, #0x14]
00128 e1a00004 mov r0, r4
0012c e1a0e00f mov lr, pc
00130 e12fff13 bx r3
00134 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;
00138 0a000003 beq |$L33687|
0013c |$L32983|
; 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 :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -