📄 realtimeclock.cod
字号:
; Listing generated by Microsoft (R) Optimizing Compiler Version 13.10.4237
TTL C:\WINCE500\PLATFORM\Ep93xx\Src\Kernel\Hal\Common\.\realtimeclock.c
CODE32
00000 AREA |.drectve|, DRECTVE
DCB "-defaultlib:coredll.lib "
DCB "-defaultlib:corelibc.lib "
00000 AREA |.data|, DATA
COMMON |dwReschedIncrement|, 0x4
|gfInitRTC| DCD 0x1
; File c:\wince500\platform\ep93xx\src\kernel\hal\common\realtimeclock.c
00000 AREA |.text| { |add64_64_64| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$add64_64_64|, PDATA, SELECTION=5, ASSOC=|.text| { |add64_64_64| } ; comdat associative
|$T14411| DCD |$L14410|
DCD 0x40000b01
; Function compile flags: /Ogsy
00000 AREA |.text| { |add64_64_64| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |add64_64_64| PROC
; 328 : {
00000 |$L14410|
00000 e52de004 str lr, [sp, #-4]!
00004 |$M14408|
; 329 : __int64 num1, num2;
; 330 :
; 331 : num1 = (((__int64)lpNum1->dwHighDateTime)<<32);
; 332 : num1 += (__int64)lpNum1->dwLowDateTime;
; 333 : num2 = (((__int64)lpNum2->dwHighDateTime)<<32);
; 334 : num2 += (__int64)lpNum2->dwLowDateTime;
; 335 : num1 += num2;
00004 e590e004 ldr lr, [r0, #4]
00008 e5913004 ldr r3, [r1, #4]
0000c e5900000 ldr r0, [r0]
00010 e09ee003 adds lr, lr, r3
00014 e5913000 ldr r3, [r1]
00018 e0901003 adds r1, r0, r3
0001c e2ae3000 adc r3, lr, #0
; 336 : lpResult->dwHighDateTime = (DWORD)(num1 >> 32);
; 337 : lpResult->dwLowDateTime = (DWORD)(num1 & 0xffffffff);
00020 e882000a stmia r2, {r1, r3}
; 338 : }
00024 e49de004 ldr lr, [sp], #4
00028 e12fff1e bx lr
0002c |$M14409|
ENDP ; |add64_64_64|
IMPORT |memset|
IMPORT |KSystemTimeToFileTime|
IMPORT |CurTicks|
00000 AREA |.bss|, NOINIT
|gftLastFileTime| % 0x8
|gliLastCurTicks| % 0x8
00000 AREA |.text| { |initRTC| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$initRTC|, PDATA, SELECTION=5, ASSOC=|.text| { |initRTC| } ; comdat associative
|$T14419| DCD |$L14418|
DCD 0x40003102
; Function compile flags: /Ogsy
00000 AREA |.text| { |initRTC| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |initRTC| PROC
; 347 : {
00000 |$L14418|
00000 e92d41f0 stmdb sp!, {r4 - r8, lr}
00004 e24dd018 sub sp, sp, #0x18
00008 |$M14416|
; 348 : SYSTEMTIME curSysTime;
; 349 : FILETIME curFTime;
; 350 :
; 351 : RETAILMSG(FALSE,(TEXT("\r\n\n******Called initRTC\r\n\n")));
; 352 :
; 353 : // This is changed here so that we don't try to
; 354 : // initialize the RTC at the same time that it
; 355 : // is already being done.
; 356 : //
; 357 : gfInitRTC = FALSE;
00008 e59f30b0 ldr r3, [pc, #0xB0]
0000c e3a01000 mov r1, #0
; 358 :
; 359 : //
; 360 : // Provide a default time...
; 361 : memset( &curSysTime, 0, sizeof( curSysTime ) );
00010 e3a02010 mov r2, #0x10
00014 e5831000 str r1, [r3]
00018 e3a01000 mov r1, #0
0001c e28d0008 add r0, sp, #8
00020 eb000000 bl memset
; 362 : curSysTime.wMonth = 6;
; 363 : curSysTime.wDay = 1;
; 364 : curSysTime.wYear = 1999;
; 365 : curSysTime.wHour = 12;
; 366 : curSysTime.wMinute = 0;
; 367 : curSysTime.wSecond = 0;
; 368 :
; 369 : // Convert the file time structure
; 370 : //
; 371 : if( !KSystemTimeToFileTime( &curSysTime, &curFTime ) )
00024 e59f3090 ldr r3, [pc, #0x90]
00028 e3a02d1f mov r2, #0x1F, 26
0002c e382200f orr r2, r2, #0xF
00030 e5933000 ldr r3, [r3]
00034 e3a05006 mov r5, #6
00038 e3a04001 mov r4, #1
0003c e3a0600c mov r6, #0xC
00040 e3a07000 mov r7, #0
00044 e3a08000 mov r8, #0
00048 e1cd20b8 strh r2, [sp, #8]
0004c e28d1000 add r1, sp, #0
00050 e28d0008 add r0, sp, #8
00054 e1cd50ba strh r5, [sp, #0xA]
00058 e1cd40be strh r4, [sp, #0xE]
0005c e1cd61b0 strh r6, [sp, #0x10]
00060 e1cd71b2 strh r7, [sp, #0x12]
00064 e1cd81b4 strh r8, [sp, #0x14]
00068 e1a0e00f mov lr, pc
0006c e12fff13 bx r3
; 372 : {
; 373 : memset( &curSysTime, 0, sizeof( curSysTime ) );
; 374 : memset( &curFTime, 0, sizeof( curFTime ) );
; 375 : }
; 376 :
; 377 : // Update current versions of the RTC support
; 378 : //
; 379 : gliLastCurTicks.QuadPart = CurTicks.QuadPart;
00070 e59f2040 ldr r2, [pc, #0x40]
00074 e3500000 cmp r0, #0
00078 03a03000 moveq r3, #0
0007c e59fe030 ldr lr, [pc, #0x30]
00080 058d3000 streq r3, [sp]
; 380 : gftLastFileTime.dwLowDateTime = curFTime.dwLowDateTime;
00084 e59d0000 ldr r0, [sp]
00088 058d3004 streq r3, [sp, #4]
0008c e5923000 ldr r3, [r2]
00090 e5922004 ldr r2, [r2, #4]
; 381 : gftLastFileTime.dwHighDateTime = curFTime.dwHighDateTime;
00094 e59d1004 ldr r1, [sp, #4]
00098 e58e3000 str r3, [lr]
0009c e58e0008 str r0, [lr, #8]
000a0 e58e2004 str r2, [lr, #4]
000a4 e58e100c str r1, [lr, #0xC]
; 382 : }
000a8 e28dd018 add sp, sp, #0x18
000ac e8bd41f0 ldmia sp!, {r4 - r8, lr}
000b0 e12fff1e bx lr
000b4 |$L14421|
000b4 00000000 DCD |gliLastCurTicks|
000b8 00000000 DCD |CurTicks|
000bc 00000000 DCD |KSystemTimeToFileTime|
000c0 00000000 DCD |gfInitRTC|
000c4 |$M14417|
ENDP ; |initRTC|
EXPORT |OEMGetRealTime|
IMPORT |KFileTimeToSystemTime|
00000 AREA |.text| { |OEMGetRealTime| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$OEMGetRealTime|, PDATA, SELECTION=5, ASSOC=|.text| { |OEMGetRealTime| } ; comdat associative
|$T14449| DCD |$L14448|
DCD 0x40003d02
; Function compile flags: /Ogsy
00000 AREA |.text| { |OEMGetRealTime| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |OEMGetRealTime| PROC
; 386 : {
00000 |$L14448|
00000 e92d41f0 stmdb sp!, {r4 - r8, lr}
00004 e24dd008 sub sp, sp, #8
00008 |$M14446|
00008 e1a08000 mov r8, r0
; 387 : //
; 388 : // NOTE: this function is assumed to return a LOCAL time rather than a UTC time!
; 389 : //
; 390 : unsigned __int64 ui64Delta;
; 391 : BOOL bResult = FALSE;
; 392 : LARGE_INTEGER liTimeDelta;
; 393 : FILETIME ftDelta;
; 394 : FILETIME ftCurFTime;
; 395 : LARGE_INTEGER tmpCurTicks;
; 396 :
; 397 : if (gfInitRTC)
0000c e59f30dc ldr r3, [pc, #0xDC]
00010 e5933000 ldr r3, [r3]
00014 e3530000 cmp r3, #0
; 398 : {
; 399 : // Setup the software RTC...
; 400 : // gliLastCurTicks & gftLastFileTime is set in
; 401 : // the following call.
; 402 : initRTC();
00018 1b000000 blne initRTC
; 403 : }
; 404 :
; 405 : // get a snapshot of the current tick count...
; 406 : tmpCurTicks.QuadPart = CurTicks.QuadPart;
0001c e59f30c8 ldr r3, [pc, #0xC8]
; 407 :
; 408 : // Calculate the current diference
; 409 : //
; 410 : if( tmpCurTicks.QuadPart >= gliLastCurTicks.QuadPart )
00020 e59f50c0 ldr r5, [pc, #0xC0]
00024 e5936000 ldr r6, [r3]
00028 e5937004 ldr r7, [r3, #4]
0002c e5951004 ldr r1, [r5, #4]
00030 e5953000 ldr r3, [r5]
00034 e1570001 cmp r7, r1
00038 ba000005 blt |$L14347|
0003c ca000001 bgt |$L14429|
00040 e1560003 cmp r6, r3
00044 3a000002 bcc |$L14347|
00048 |$L14429|
; 411 : {
; 412 : liTimeDelta.QuadPart =
; 413 : tmpCurTicks.QuadPart - gliLastCurTicks.QuadPart;
00048 e056e003 subs lr, r6, r3
0004c e0c74001 sbc r4, r7, r1
; 414 : }
; 415 : else
00050 ea000005 b |$L14348|
00054 |$L14347|
; 416 : {
; 417 : // The counter wrapped...
; 418 : LARGE_INTEGER liMaxLargeInt;
; 419 :
; 420 : liMaxLargeInt.HighPart = 0xFFFFFFFF;
; 421 : liMaxLargeInt.LowPart = 0xFFFFFFFF;
00054 e3e02000 mvn r2, #0
; 422 :
; 423 : liTimeDelta.QuadPart =
; 424 : tmpCurTicks.QuadPart +
; 425 : (liMaxLargeInt.QuadPart - gliLastCurTicks.QuadPart);
00058 e0522003 subs r2, r2, r3
0005c e3e03000 mvn r3, #0
00060 e0c33001 sbc r3, r3, r1
00064 e092e006 adds lr, r2, r6
00068 e0a34007 adc r4, r3, r7
0006c |$L14348|
; 426 : }
; 427 :
; 428 : ui64Delta = (unsigned __int64) liTimeDelta.QuadPart;
; 429 : TICKS_TO_NANO_CHUNKS( ui64Delta ); // convert to nano chunks
0006c e3a02e51 mov r2, #0x51, 28
00070 e3822006 orr r2, r2, #6
00074 e083029e umull r0, r3, lr, r2
00078 e0213294 mla r1, r4, r2, r3
; 430 :
; 431 : // setup to add in the nano chunk time difference
; 432 : ftDelta.dwLowDateTime = (DWORD) ui64Delta;
; 433 : ftDelta.dwHighDateTime = (DWORD) (ui64Delta >> 32);
; 434 :
; 435 : // Add the delta to the last known time...
; 436 : //
; 437 : add64_64_64( &gftLastFileTime , &ftDelta, &ftCurFTime );
0007c e595200c ldr r2, [r5, #0xC]
00080 e1a03c81 mov r3, r1, lsl #25
00084 e092e3a1 adds lr, r2, r1, lsr #7
00088 e5952008 ldr r2, [r5, #8]
0008c e18303a0 orr r0, r3, r0, lsr #7
; 438 :
; 439 : // convert the answer to a system time format
; 440 : //
; 441 : if(KFileTimeToSystemTime( &ftCurFTime, lpst ) )
00090 e59f304c ldr r3, [pc, #0x4C]
00094 e0922000 adds r2, r2, r0
00098 e1a01008 mov r1, r8
0009c e5934000 ldr r4, [r3]
000a0 e2ae3000 adc r3, lr, #0
000a4 e58d3004 str r3, [sp, #4]
000a8 e28d0000 add r0, sp, #0
000ac e58d2000 str r2, [sp]
000b0 e1a0e00f mov lr, pc
000b4 e12fff14 bx r4
000b8 e3500000 cmp r0, #0
; 442 : {
; 443 : //
; 444 : // update the RTC variables...
; 445 : //
; 446 : gftLastFileTime.dwLowDateTime = ftCurFTime.dwLowDateTime;
000bc 159d3000 ldrne r3, [sp]
; 447 : gftLastFileTime.dwHighDateTime = ftCurFTime.dwHighDateTime;
000c0 159d2004 ldrne r2, [sp, #4]
; 448 : gliLastCurTicks.QuadPart = tmpCurTicks.QuadPart;
; 449 : bResult = TRUE;
000c4 13a00001 movne r0, #1
000c8 15853008 strne r3, [r5, #8]
000cc 1585200c strne r2, [r5, #0xC]
000d0 188500c0 stmneia r5, {r6, r7}
; 450 : }
; 451 : else
; 452 : {
; 453 : // Failed, don't change anything!!!!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -