📄 ide.cod
字号:
; 423 : WriteAltDriveController(ATA_CTRL_RESET | ATA_CTRL_ENABLE_INTR);
00018 e3a00004 mov r0, #4
0001c eb000000 bl WriteAltDriveController
; 424 :
; 425 : WaitForDisc( WAIT_TYPE_BUSY, 5000);
00020 e3a03d4e mov r3, #0x4E, 26
00024 e3831008 orr r1, r3, #8
00028 e3a00001 mov r0, #1
0002c eb000000 bl WaitForDisc
; 426 :
; 427 : WriteAltDriveController(ATA_CTRL_ENABLE_INTR);
00030 e3a00000 mov r0, #0
00034 eb000000 bl WriteAltDriveController
; 428 :
; 429 : WaitForDisc( WAIT_TYPE_READY, 4000);
00038 e3a01efa mov r1, #0xFA, 28
0003c e3a00003 mov r0, #3
00040 eb000000 bl WaitForDisc
; 430 : // if (bSoftReset)
; 431 : // {
; 432 : // SERPRINT("ATAPI:ResetController ...performing soft reset !\r\n");
; 433 : // AtapiSoftReset();
; 434 : // }
; 435 : // else
; 436 : {
; 437 : DelayInuSec(50000);
00044 e3a03cc3 mov r3, #0xC3, 24
00048 e3830050 orr r0, r3, #0x50
0004c eb000000 bl DelayInuSec
; 438 : }
; 439 : #define MAX_RESET_ATTEMPTS 10
; 440 :
; 441 : for (dwAttempts = 0; dwAttempts < MAX_RESET_ATTEMPTS; dwAttempts++)
00050 e3a03000 mov r3, #0
00054 e58d3000 str r3, [sp]
00058 ea000002 b |$L38937|
0005c |$L38938|
0005c e59d3000 ldr r3, [sp]
00060 e2833001 add r3, r3, #1
00064 e58d3000 str r3, [sp]
00068 |$L38937|
00068 e59d3000 ldr r3, [sp]
0006c e353000a cmp r3, #0xA
00070 2a00002b bcs |$L38939|
; 442 : {
; 443 : bStatus = GetBaseStatus();
00074 eb000000 bl GetBaseStatus
00078 e5cd000d strb r0, [sp, #0xD]
0007c e5dd300d ldrb r3, [sp, #0xD]
00080 e5cd3004 strb r3, [sp, #4]
; 444 :
; 445 : if ((bStatus != ATA_STATUS_IDLE) && (bStatus != 0x0))
00084 e5dd3004 ldrb r3, [sp, #4]
00088 e3530050 cmp r3, #0x50
0008c 0a000022 beq |$L38940|
00090 e5dd3004 ldrb r3, [sp, #4]
00094 e3530000 cmp r3, #0
00098 0a00001f beq |$L38940|
; 446 : {
; 447 :
; 448 : if (bStatus == 0xFF)
0009c e5dd3004 ldrb r3, [sp, #4]
000a0 e35300ff cmp r3, #0xFF
000a4 1a000018 bne |$L38941|
; 449 : {
; 450 : SetDriveHead( ATA_HEAD_DRIVE_2);
000a8 e3a000b0 mov r0, #0xB0
000ac eb000000 bl SetDriveHead
; 451 :
; 452 : bStatus = GetBaseStatus();
000b0 eb000000 bl GetBaseStatus
000b4 e5cd000e strb r0, [sp, #0xE]
000b8 e5dd300e ldrb r3, [sp, #0xE]
000bc e5cd3004 strb r3, [sp, #4]
; 453 :
; 454 : if ((bStatus != ATA_STATUS_IDLE) && (bStatus != 0x0))
000c0 e5dd3004 ldrb r3, [sp, #4]
000c4 e3530050 cmp r3, #0x50
000c8 0a00000e beq |$L38942|
000cc e5dd3004 ldrb r3, [sp, #4]
000d0 e3530000 cmp r3, #0
000d4 0a00000b beq |$L38942|
; 455 : {
; 456 : SERPRINT("ATAPI::ResetController Drive 2 status = 0x%X\r\n", bStatus);
000d8 e5dd1004 ldrb r1, [sp, #4]
000dc e59f0084 ldr r0, [pc, #0x84]
000e0 eb000000 bl EdbgOutputDebugString
; 457 :
; 458 : if (bStatus == 0xFF)
000e4 e5dd3004 ldrb r3, [sp, #4]
000e8 e35300ff cmp r3, #0xFF
000ec 1a000004 bne |$L38944|
; 459 : {
; 460 : SERPRINT("ATAPI::ResetController no second device\r\n");
000f0 e59f006c ldr r0, [pc, #0x6C]
000f4 eb000000 bl EdbgOutputDebugString
; 461 : return -1;
000f8 e3e03000 mvn r3, #0
000fc e58d3008 str r3, [sp, #8]
00100 ea000012 b |$L38934|
00104 |$L38944|
; 462 : }
; 463 : }
; 464 : else
00104 ea000000 b |$L38946|
00108 |$L38942|
; 465 : {
; 466 : break;
00108 ea000005 b |$L38939|
0010c |$L38946|
0010c |$L38941|
; 467 : }
; 468 : }
; 469 : DelayInuSec(50000);
0010c e3a03cc3 mov r3, #0xC3, 24
00110 e3830050 orr r0, r3, #0x50
00114 eb000000 bl DelayInuSec
; 470 : }
; 471 : else
00118 ea000000 b |$L38947|
0011c |$L38940|
; 472 : {
; 473 : break;
0011c ea000000 b |$L38939|
00120 |$L38947|
; 474 : }
; 475 : }
00120 eaffffcd b |$L38938|
00124 |$L38939|
; 476 : if (dwAttempts == MAX_RESET_ATTEMPTS)
00124 e59d3000 ldr r3, [sp]
00128 e353000a cmp r3, #0xA
0012c 1a000005 bne |$L38948|
; 477 : {
; 478 : SERPRINT("ATAPIPCI:AtaResetController no response after %d reset attempts\r\n", MAX_RESET_ATTEMPTS);
00130 e3a0100a mov r1, #0xA
00134 e59f0024 ldr r0, [pc, #0x24]
00138 eb000000 bl EdbgOutputDebugString
; 479 : return -1;
0013c e3e03000 mvn r3, #0
00140 e58d3008 str r3, [sp, #8]
00144 ea000001 b |$L38934|
00148 |$L38948|
; 480 : }
; 481 : return 0;
00148 e3a03000 mov r3, #0
0014c e58d3008 str r3, [sp, #8]
00150 |$L38934|
; 461 : return -1;
00150 e59d0008 ldr r0, [sp, #8]
; 482 : }
00154 e28dd010 add sp, sp, #0x10
00158 e49de004 ldr lr, [sp], #4
0015c e12fff1e bx lr
00160 |$L39485|
00160 00000000 DCD |??_C@_0EC@LGMMBIF@ATAPIPCI?3AtaResetController?5no?5r@|
00164 00000000 DCD |??_C@_0CK@FFOACHGO@ATAPI?3?3ResetController?5no?5second@|
00168 00000000 DCD |??_C@_0CP@GPAFOMID@ATAPI?3?3ResetController?5Drive?52?5s@|
0016c |$M39481|
ENDP ; |ide_reset|
EXPORT |WaitOnBusy|
00000 AREA |.text| { |WaitOnBusy| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$WaitOnBusy|, PDATA, SELECTION=5, ASSOC=|.text| { |WaitOnBusy| } ; comdat associative
|$T39494| DCD |$L39493|
DCD 0x40003904
; Function compile flags: /Ods
00000 AREA |.text| { |WaitOnBusy| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |WaitOnBusy| PROC
; 488 : {
00000 |$L39493|
00000 e1a0c00d mov r12, sp
00004 e92d0001 stmdb sp!, {r0}
00008 e92d5000 stmdb sp!, {r12, lr}
0000c e24dd01c sub sp, sp, #0x1C
00010 |$M39491|
; 489 : DWORD i,j;
; 490 : BYTE bStatus;
; 491 : for (i=0; i< DEFAULT_WAIT_CHECK_ITER; i++)
00010 e3a03000 mov r3, #0
00014 e58d3004 str r3, [sp, #4]
00018 ea000002 b |$L38957|
0001c |$L38958|
0001c e59d3004 ldr r3, [sp, #4]
00020 e2833001 add r3, r3, #1
00024 e58d3004 str r3, [sp, #4]
00028 |$L38957|
00028 e59d3004 ldr r3, [sp, #4]
0002c e3530e7d cmp r3, #0x7D, 28
00030 2a000023 bcs |$L38959|
; 492 : {
; 493 : for (j=0; j<DEFAULT_WAIT_SAMPLE_TIMES; j++)
00034 e3a03000 mov r3, #0
00038 e58d3008 str r3, [sp, #8]
0003c ea000002 b |$L38960|
00040 |$L38961|
00040 e59d3008 ldr r3, [sp, #8]
00044 e2833001 add r3, r3, #1
00048 e58d3008 str r3, [sp, #8]
0004c |$L38960|
0004c e59d3008 ldr r3, [sp, #8]
00050 e3530064 cmp r3, #0x64
00054 2a000017 bcs |$L38962|
; 494 : {
; 495 : bStatus = fBase ? GetBaseStatus() : GetAltStatus();
00058 e59d3024 ldr r3, [sp, #0x24]
0005c e3530000 cmp r3, #0
00060 0a000004 beq |$L39488|
00064 eb000000 bl GetBaseStatus
00068 e5cd0010 strb r0, [sp, #0x10]
0006c e5dd3010 ldrb r3, [sp, #0x10]
00070 e58d3014 str r3, [sp, #0x14]
00074 ea000003 b |$L39489|
00078 |$L39488|
00078 eb000000 bl GetAltStatus
0007c e5cd0018 strb r0, [sp, #0x18]
00080 e5dd3018 ldrb r3, [sp, #0x18]
00084 e58d3014 str r3, [sp, #0x14]
00088 |$L39489|
00088 e59d3014 ldr r3, [sp, #0x14]
0008c e20330ff and r3, r3, #0xFF
00090 e5cd3000 strb r3, [sp]
; 496 : if (!(bStatus & ATA_STATUS_BUSY))
00094 e5dd3000 ldrb r3, [sp]
00098 e3130080 tst r3, #0x80
0009c 1a000004 bne |$L38963|
; 497 : {
; 498 : return bStatus & (ATA_STATUS_ERROR |ATA_STATUS_BUSY);
000a0 e5dd3000 ldrb r3, [sp]
000a4 e2033081 and r3, r3, #0x81
000a8 e20330ff and r3, r3, #0xFF
000ac e5cd300c strb r3, [sp, #0xC]
000b0 ea000007 b |$L38953|
000b4 |$L38963|
; 499 : }
; 500 : }
000b4 eaffffe1 b |$L38961|
000b8 |$L38962|
; 501 : DelayInuSec(DEFAULT_WAIT_STALL_TIME);
000b8 e3a00efa mov r0, #0xFA, 28
000bc eb000000 bl DelayInuSec
; 502 : }
000c0 eaffffd5 b |$L38958|
000c4 |$L38959|
; 503 : return bStatus & (ATA_STATUS_ERROR |ATA_STATUS_BUSY);
000c4 e5dd3000 ldrb r3, [sp]
000c8 e2033081 and r3, r3, #0x81
000cc e20330ff and r3, r3, #0xFF
000d0 e5cd300c strb r3, [sp, #0xC]
000d4 |$L38953|
; 497 : {
; 498 : return bStatus & (ATA_STATUS_ERROR |ATA_STATUS_BUSY);
000d4 e5dd000c ldrb r0, [sp, #0xC]
; 504 : }
000d8 e28dd01c add sp, sp, #0x1C
000dc e89d6000 ldmia sp, {sp, lr}
000e0 e12fff1e bx lr
000e4 |$M39492|
ENDP ; |WaitOnBusy|
EXPORT |IsAtapiDevice|
00000 AREA |.text| { |IsAtapiDevice| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$IsAtapiDevice|, PDATA, SELECTION=5, ASSOC=|.text| { |IsAtapiDevice| } ; comdat associative
|$T39504| DCD |$L39503|
DCD 0x40001201
; Function compile flags: /Ods
00000 AREA |.text| { |IsAtapiDevice| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |IsAtapiDevice| PROC
; 507 : {
00000 |$L39503|
00000 e24dd008 sub sp, sp, #8
00004 |$M39501|
; 508 : // return (m_Id.GeneralConfiguration & IDE_IDDATA_ATAPI_DEVICE);
; 509 : return (m_BootDeviceType==BOOT_FROM_IDE_CDROM);
00004 e59f3038 ldr r3, [pc, #0x38]
00008 e5932000 ldr r2, [r3]
0000c e3a03c02 mov r3, #2, 24
00010 e3833002 orr r3, r3, #2
00014 e1520003 cmp r2, r3
00018 1a000002 bne |$L39498|
0001c e3a03001 mov r3, #1
00020 e58d3004 str r3, [sp, #4]
00024 ea000001 b |$L39499|
00028 |$L39498|
00028 e3a03000 mov r3, #0
0002c e58d3004 str r3, [sp, #4]
00030 |$L39499|
00030 e59d3004 ldr r3, [sp, #4]
00034 e58d3000 str r3, [sp]
00038 e59d0000 ldr r0, [sp]
; 510 : }
0003c e28dd008 add sp, sp, #8
00040 e12fff1e bx lr
00044 |$L39506|
00044 00000000 DCD |m_BootDeviceType|
00048 |$M39502|
ENDP ; |IsAtapiDevice|
EXPORT |AtapiSoftReset|
00000 AREA |.text| { |AtapiSoftReset| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$AtapiSoftReset|, PDATA, SELECTION=5, ASSOC=|.text| { |AtapiSoftReset| } ; comdat associative
|$T39512| DCD |$L39511|
DCD 0x40001001
; Function compile flags: /Ods
00000 AREA |.text| { |AtapiSoftReset| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |AtapiSoftReset| PROC
; 513 : {
00000 |$L39511|
00000 e52de004 str lr, [sp, #-4]!
00004 |$M39509|
; 514 : WriteCommand( ATAPI_CMD_SOFT_RESET);
00004 e3a00008 mov r0, #8
00008 eb000000 bl WriteCommand
; 515 : DelayInuSec(400);
0000c e3a00e19 mov r0, #0x19, 28
00010 eb000000 bl DelayInuSec
; 516 : WaitForDisc_P(WAIT_TYPE_NOT_BUSY,4000, 100);
00014 e3a02064 mov r2, #0x64
00018 e3a01efa mov r1, #0xFA, 28
0001c e3a00002 mov r0, #2
00020 eb000000 bl WaitForDisc_P
; 517 : WaitForDisc_P(WAIT_TYPE_READY,5000, 100);
00024 e3a02064 mov r2, #0x64
00028 e3a03d4e mov r3, #0x4E, 26
0002c e3831008 orr r1, r3, #8
00030 e3a00003 mov r0, #3
00034 eb000000 bl WaitForDisc_P
; 518 : }
00038 e4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -