📄 atapiio.cod
字号:
; 204 :
; 205 : }
0006c 18bd40f0 ldmneia sp!, {r4 - r7, lr}
00070 112fff1e bxne lr
00074 |$L33251|
; 195 : DEBUGMSG(ZONE_IO, (TEXT("ATAPI: ATA_STATUS_DATA_REQ J=: %x \r\n"),j));
; 196 : return TRUE;
00074 e3a00001 mov r0, #1
; 204 :
; 205 : }
00078 e8bd40f0 ldmia sp!, {r4 - r7, lr}
0007c e12fff1e bx lr
00080 |$L33265|
00080 b6b000c0 DCD 0xb6b000c0
00084 |$M33261|
ENDP ; |?WaitForDRQ@CDisk@@QAAHXZ|, CDisk::WaitForDRQ
EXPORT |?CheckIntrState@CDisk@@QAAGXZ| ; CDisk::CheckIntrState
; File d:\wince500\platform\bvdmain\drivers\atapi\diskmain.h
00000 AREA |.text| { |?CheckIntrState@CDisk@@QAAGXZ| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?CheckIntrState@CDisk@@QAAGXZ|, PDATA, SELECTION=5, ASSOC=|.text| { |?CheckIntrState@CDisk@@QAAGXZ| } ; comdat associative
|$T33281| DCD |$L33280|
DCD 0x40001201
; Function compile flags: /Ogsy
; File d:\wince500\platform\bvdmain\drivers\atapi\atapiio.cpp
00000 AREA |.text| { |?CheckIntrState@CDisk@@QAAGXZ| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?CheckIntrState@CDisk@@QAAGXZ| PROC ; CDisk::CheckIntrState
; 232 : {
00000 |$L33280|
00000 e92d4010 stmdb sp!, {r4, lr}
00004 |$M33278|
; 233 : BYTE bReason, bDRQ;
; 234 :
; 235 : WaitOnBusy(FALSE);
00004 e3a01000 mov r1, #0
00008 eb000000 bl |?WaitOnBusy@CDisk@@QAAEH@Z|
; 236 :
; 237 : bReason = GetReason() & (ATA_IR_CoD | ATA_IR_IO);
0000c e59f0030 ldr r0, [pc, #0x30]
00010 eb000000 bl READ_PORT_UCHAR
00014 e1a03000 mov r3, r0
; 238 :
; 239 : bDRQ = GetAltStatus() & ATA_STATUS_DATA_REQ;
00018 e59f0020 ldr r0, [pc, #0x20]
0001c e2034003 and r4, r3, #3
00020 eb000000 bl READ_PORT_UCHAR
; 240 :
; 241 :
; 242 : if (bDRQ)
00024 e3100008 tst r0, #8
; 243 : bReason |=4;
00028 13844004 orrne r4, r4, #4
; 244 :
; 245 : if (bReason < 3)
0002c e3540003 cmp r4, #3
; 246 : return((WORD) ATA_INTR_READY);
00030 33a04003 movcc r4, #3
00034 e1a00004 mov r0, r4
; 247 :
; 248 : return ((WORD) bReason);
; 249 : }
00038 e8bd4010 ldmia sp!, {r4, lr}
0003c e12fff1e bx lr
00040 |$L33283|
00040 b6b000c0 DCD 0xb6b000c0
00044 b6a00040 DCD 0xb6a00040
00048 |$M33279|
ENDP ; |?CheckIntrState@CDisk@@QAAGXZ|, CDisk::CheckIntrState
EXPORT |?ReadBuffer@CDisk@@QAAXPAEK@Z| ; CDisk::ReadBuffer
00000 AREA |.text| { |?ReadBuffer@CDisk@@QAAXPAEK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?ReadBuffer@CDisk@@QAAXPAEK@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?ReadBuffer@CDisk@@QAAXPAEK@Z| } ; comdat associative
|$T33296| DCD |$L33295|
DCD 0x40003c02
; Function compile flags: /Ogsy
00000 AREA |.text| { |?ReadBuffer@CDisk@@QAAXPAEK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?ReadBuffer@CDisk@@QAAXPAEK@Z| PROC ; CDisk::ReadBuffer
; 258 : {
00000 |$L33295|
00000 e92d40f0 stmdb sp!, {r4 - r7, lr}
00004 e24dd004 sub sp, sp, #4
00008 |$M33293|
00008 e1b04002 movs r4, r2
0000c e1a05001 mov r5, r1
00010 e1a06000 mov r6, r0
; 259 : //
; 260 : // This is very unefficient way to solve word allignment violation.
; 261 :
; 262 : union {
; 263 : WORD us;
; 264 : BYTE uc[2];
; 265 : }unisc;
; 266 :
; 267 :
; 268 : if (dwCount == 0)
00014 0a000032 beq |$L32914|
; 269 : return;
; 270 :
; 271 : DEBUGMSG( ZONE_IO, (TEXT("ATAPI:ReadBuffer Entry Status: %x\r\n"),GetAltStatus()));
; 272 :
; 273 : // Check whether required byte was already read in previous transaction!
; 274 : // Value -1 in m_wNextByte means - no byte was read.
; 275 :
; 276 : if (m_wNextByte != 0xFFFF) {
00018 e2863c06 add r3, r6, #6, 24
0001c e1d328b0 ldrh r2, [r3, #0x80]
00020 e3a03cff mov r3, #0xFF, 24
00024 e38330ff orr r3, r3, #0xFF
00028 e1520003 cmp r2, r3
; 277 : DEBUGMSG( ZONE_WARNING, (TEXT("ATAPI:ReadBuffer - Unaligned buffer on prevous read!!!\r\n")));
; 278 : // Update the first byte.
; 279 : *pBuffer++ = (BYTE) m_wNextByte;
0002c 14c52001 strneb r2, [r5], #1
; 280 : dwCount--;
00030 12444001 subne r4, r4, #1
; 281 : }
; 282 : //
; 283 : // Check allignemt of pBuffer
; 284 : //
; 285 : if ((DWORD) pBuffer & 1) {
00034 e3150001 tst r5, #1
00038 0a000012 beq |$L32905|
; 286 : DEBUGMSG( ZONE_WARNING, (TEXT("ATAPI:ReadBuffer - Unaligned buffer !!!\r\n")));
; 287 : while (dwCount> 1)
0003c e3540001 cmp r4, #1
00040 9a00001b bls |$L33292|
00044 e2443002 sub r3, r4, #2
00048 e1a030a3 mov r3, r3, lsr #1
0004c e2837001 add r7, r3, #1
00050 |$L32908|
; 288 : {
; 289 : unisc.us = ReadWord();
00050 e5963000 ldr r3, [r6]
00054 e1a00006 mov r0, r6
00058 e5933048 ldr r3, [r3, #0x48]
0005c e1a0e00f mov lr, pc
00060 e12fff13 bx r3
00064 e1cd00b0 strh r0, [sp]
; 290 : *pBuffer++= unisc.uc[0];
; 291 : *pBuffer++= unisc.uc[1];
; 292 : dwCount-=2;
00068 e2444002 sub r4, r4, #2
0006c e5dd3000 ldrb r3, [sp]
00070 e5dd2001 ldrb r2, [sp, #1]
00074 e2577001 subs r7, r7, #1
00078 e4c53001 strb r3, [r5], #1
0007c e4c52001 strb r2, [r5], #1
00080 1afffff2 bne |$L32908|
; 293 : }
; 294 : } else {
00084 ea000009 b |$L32910|
00088 |$L32905|
; 295 : ReadWordBuffer((PWORD)pBuffer,(DWORD)(dwCount)/sizeof(SHORT));
00088 e5963000 ldr r3, [r6]
0008c e1a020a4 mov r2, r4, lsr #1
00090 e1a01005 mov r1, r5
00094 e5933038 ldr r3, [r3, #0x38]
00098 e1a00006 mov r0, r6
0009c e1a0e00f mov lr, pc
000a0 e12fff13 bx r3
; 296 : pBuffer += dwCount;
000a4 e0853004 add r3, r5, r4
; 297 : dwCount &= 1; // If 1, we need to read the next byte yet
000a8 e2044001 and r4, r4, #1
; 298 : pBuffer -= dwCount; // Adjust pBuffer if its value is odd
000ac e0435004 sub r5, r3, r4
000b0 |$L32910|
; 299 : }
; 300 : //
; 301 : // Also we have to read one Word event if need only one byte.
; 302 : // Save unused byte and use it as the first byte in the following SG buffer.
; 303 :
; 304 : if (dwCount == 1) {
000b0 e3540001 cmp r4, #1
000b4 |$L33292|
000b4 1a00000a bne |$L32914|
; 305 : DEBUGMSG( ZONE_WARNING, (TEXT("ATAPI:ReadBuffer - reading one word!!!\r\n")));
; 306 : unisc.us = ReadWord();
; 307 : *pBuffer= unisc.uc[0];
; 308 : m_wNextByte = (WORD)unisc.uc[1]; // Save byte for the next SG if
000b8 e1a04006 mov r4, r6
000bc e4943600 ldr r3, [r4], #0x600
000c0 e1a00006 mov r0, r6
000c4 e5933048 ldr r3, [r3, #0x48]
000c8 e1a0e00f mov lr, pc
000cc e12fff13 bx r3
000d0 e1cd00b0 strh r0, [sp]
000d4 e5dd3000 ldrb r3, [sp]
000d8 e5dd2001 ldrb r2, [sp, #1]
000dc e5c53000 strb r3, [r5]
000e0 e1c428b0 strh r2, [r4, #0x80]
000e4 |$L32914|
; 309 : }
; 310 :
; 311 : DEBUGMSG( ZONE_IO, (TEXT("ATAPI:ReadBuffer Exit Status: %x\r\n"),GetAltStatus()));
; 312 : }
000e4 e28dd004 add sp, sp, #4
000e8 e8bd40f0 ldmia sp!, {r4 - r7, lr}
000ec e12fff1e bx lr
000f0 |$M33294|
ENDP ; |?ReadBuffer@CDisk@@QAAXPAEK@Z|, CDisk::ReadBuffer
EXPORT |?WriteBuffer@CDisk@@QAAXPAEK@Z| ; CDisk::WriteBuffer
00000 AREA |.text| { |?WriteBuffer@CDisk@@QAAXPAEK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?WriteBuffer@CDisk@@QAAXPAEK@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?WriteBuffer@CDisk@@QAAXPAEK@Z| } ; comdat associative
|$T33310| DCD |$L33309|
DCD 0x40003b02
; Function compile flags: /Ogsy
00000 AREA |.text| { |?WriteBuffer@CDisk@@QAAXPAEK@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |?WriteBuffer@CDisk@@QAAXPAEK@Z| PROC ; CDisk::WriteBuffer
; 321 : {
00000 |$L33309|
00000 e92d40f0 stmdb sp!, {r4 - r7, lr}
00004 e24dd004 sub sp, sp, #4
00008 |$M33307|
00008 e1b04002 movs r4, r2
0000c e1a05001 mov r5, r1
00010 e1a06000 mov r6, r0
; 322 : //
; 323 : // This is very inefficient way to solve word allignment violation.
; 324 : union {
; 325 : WORD us;
; 326 : BYTE uc[2];
; 327 : }unisc;
; 328 :
; 329 : if (dwCount == 0)
00014 0a000031 beq |$L32948|
; 330 : return;
; 331 :
; 332 : DEBUGMSG( ZONE_IO, (TEXT("ATAPI:WriteBuffer Entry Status: %x\r\n"),GetAltStatus()));
; 333 :
; 334 : // Check whether one byte left from the previous transaction!
; 335 : // Value -1 in m_wNextByte means - no byteleft.
; 336 :
; 337 : if (m_wNextByte != 0xFFFF) {
00018 e2863c06 add r3, r6, #6, 24
0001c e1d328b0 ldrh r2, [r3, #0x80]
00020 e3a03cff mov r3, #0xFF, 24
00024 e38330ff orr r3, r3, #0xFF
00028 e1520003 cmp r2, r3
0002c 0a000008 beq |$L32935|
; 338 : // Update the first byte
; 339 : DEBUGMSG( ZONE_WARNING, (TEXT("ATAPI:ReadBuffer - Unaligned buffer on prevous read!!!\r\n")));
; 340 : unisc.uc[0] = (BYTE) m_wNextByte;
; 341 : unisc.uc[1] = *pBuffer++;
00030 e4d53001 ldrb r3, [r5], #1
; 342 : dwCount--;
; 343 : WriteWord(unisc.us);
00034 e596e000 ldr lr, [r6]
00038 e5cd2000 strb r2, [sp]
0003c e2444001 sub r4, r4, #1
00040 e5cd3001 strb r3, [sp, #1]
00044 e59e3044 ldr r3, [lr, #0x44]
00048 e1dd10b0 ldrh r1, [sp]
0004c e1a0e00f mov lr, pc
00050 e12fff13 bx r3
00054 |$L32935|
; 344 : }
; 345 : //
; 346 : // Check allignemt of pBuffer
; 347 : //
; 348 : if ((DWORD) pBuffer & 1) {
00054 e3150001 tst r5, #1
00058 0a000012 beq |$L32939|
; 349 : DEBUGMSG( ZONE_WARNING, (TEXT("ATAPI:ReadBuffer - Unaligned buffer !!!\r\n")));
; 350 : while (dwCount> 1) {
0005c e3540001 cmp r4, #1
00060 9a00001b bls |$L33306|
00064 e2443002 sub r3, r4, #2
00068 e1a030a3 mov r3, r3, lsr #1
0006c e2837001 add r7, r3, #1
00070 |$L32942|
; 351 : unisc.uc[0] = *pBuffer++;
00070 e4d52001 ldrb r2, [r5], #1
; 352 : unisc.uc[1] = *pBuffer++;
; 353 : WriteWord(unisc.us);
00074 e5961000 ldr r1, [r6]
00078 e1a00006 mov r0, r6
0007c e4d53001 ldrb r3, [r5], #1
00080 e5cd2000 strb r2, [sp]
00084 e5912044 ldr r2, [r1, #0x44]
00088 e5cd3001 strb r3, [sp, #1]
0008c e1dd10b0 ldrh r1, [sp]
00090 e1a0e00f mov lr, pc
00094 e12fff12 bx r2
; 354 : dwCount-=2;
00098 e2444002 sub r4, r4, #2
0009c e2577001 subs r7, r7, #1
000a0 1afffff2 bne |$L32942|
; 355 : }
; 356 : } else {
000a4 ea000009 b |$L32944|
000a8 |$L32939|
; 357 : WriteWordBuffer((PWORD)pBuffer,(DWORD)(dwCount)/sizeof(SHORT));
000a8 e5963000 ldr r3, [r6]
000ac e1a020a4 mov r2, r4, lsr #1
000b0 e1a01005 mov r1, r5
000b4 e593303c ldr r3, [r3, #0x3C]
000b8 e1a00006 mov r0, r6
000bc e1a0e00f mov lr, pc
000c0 e12fff13 bx r3
; 358 : pBuffer += dwCount;
000c4 e0853004 add r3, r5, r4
; 359 : dwCount &= 1; // If 1, we need to write the next byte yet
000c8 e2044001 and r4, r4, #1
; 360 : pBuffer -= dwCount; // Adjust pBuffer if its value is odd
000cc e0435004 sub r5, r3, r4
000d0 |$L32944|
; 361 :
; 362 : }
; 363 : //
; 364 : // Also we have to transfer one Word event if need only one byte.
; 365 : // Save unused byte and use it as the first byte in the following SG buffer.
; 366 :
; 367 : if (dwCount == 1) {
000d0 e3540001 cmp r4, #1
000d4 |$L33306|
; 368 : DEBUGMSG( ZONE_WARNING, (TEXT("ATAPI:ReadBuffer - reading one word!!!\r\n")));
; 369 : m_wNextByte = (WORD) *pBuffer; // Save byte for the next SG if
000d4 05d52000 ldreqb r2, [r5]
000d8 02863c06 addeq r3, r6, #6, 24
000dc 01c328b0 streqh r2, [r3, #0x80]
000e0 |$L32948|
; 370 : }
; 371 :
; 372 : DEBUGMSG( ZONE_IO, (TEXT("ATAPI:WriteBuffer Exit Status: %x\r\n"),GetAltStatus()));
; 373 : }
000e0 e28dd004 add sp, sp, #4
000e4 e8bd40f0 ldmia sp!, {r4 - r7, lr}
000e8 e12fff1e bx lr
000ec |$M33308|
ENDP ; |?WriteBuffer@CDisk@@QAAXPAEK@Z|, CDisk::WriteBuffer
EXPORT |?SetTransferMode@CDisk@@QAAHE@Z| ; CDisk::SetTransferMode
IMPORT |?ResetController@CDisk@@QAAHH@Z| ; CDisk::ResetController
; File d:\wince500\platform\bvdmain\drivers\atapi\diskmain.h
00000 AREA |.text| { |?SetTransferMode@CDisk@@QAAHE@Z| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$?SetTransferMode@CDisk@@QAAHE@Z|, PDATA, SELECTION=5, ASSOC=|.text| { |?SetTransferMode@CDisk@@QAAHE@Z| } ; comdat associative
|$T33377| DCD |$L33376|
DCD 0x40006001
; Function compile flags: /Ogsy
; File d:\wince500\platform\bvdmain\drivers\atapi\atapiio.cpp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -