📄 osal_nv.lst
字号:
453 *
454 * @brief Walk the page items; calculate checksums, lost bytes & page offset.
455 *
456 * @param pg - Valid NV page to verify and init.
457 * @param id - Valid NV item Id to use function as a "findItem".
458 * If set to NULL then just perform the page initialization.
459 *
460 * @return If 'id' is non-NULL and good checksums are found, return the offset
461 * of the data corresponding to item Id; else OSAL_NV_ITEM_NULL.
462 */
\ In segment BANKED_CODE, align 1, keep-with-next
463 static uint16 initPage( uint8 pg, uint16 id )
\ ??initPage:
464 {
\ 000000 74F1 MOV A,#-0xf
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 15
\ 000005 ; Auto size: 10
\ 000005 74F6 MOV A,#-0xa
\ 000007 12.... LCALL ?ALLOC_XSTACK8
\ 00000A 85..82 MOV DPL,?XSP + 0
\ 00000D 85..83 MOV DPH,?XSP + 1
\ 000010 12.... LCALL ?Subroutine35 & 0xFFFF
\ ??CrossCallReturnLabel_93:
\ 000013 89.. MOV ?V0 + 6,R1
465 uint16 offset = OSAL_NV_PAGE_HDR_SIZE;
\ 000015 75..08 MOV ?V0 + 2,#0x8
\ 000018 75..00 MOV ?V0 + 3,#0x0
466 uint16 sz, lost = 0;
\ 00001B 7E00 MOV R6,#0x0
\ 00001D 7F00 MOV R7,#0x0
\ 00001F 8037 SJMP ??initPage_1
467 osalNvHdr_t hdr;
468
469 do
470 {
471 readHdr( pg, offset, (uint8 *)(&hdr) );
472
473 if ( hdr.id == OSAL_NV_ERASED_ID )
474 {
475 break;
476 }
477 offset += OSAL_NV_HDR_SIZE;
478 sz = ((hdr.len + (OSAL_NV_WORD_SIZE-1)) / OSAL_NV_WORD_SIZE) * OSAL_NV_WORD_SIZE;
479
480 // A bad 'len' write has blown away the rest of the page.
481 if ( (offset + sz) > OSAL_NV_PAGE_FREE )
482 {
483 lost += (OSAL_NV_PAGE_FREE - offset + OSAL_NV_HDR_SIZE);
484 offset = OSAL_NV_PAGE_FREE;
485 break;
486 }
487
488 if ( hdr.id != OSAL_NV_ZEROED_ID )
489 {
490 if ( hdr.chk == calcChkF( pg, offset, hdr.len ) )
491 {
492 /* This trick allows function to do double duty for findItem() without
493 * compromising its essential functionality at powerup initialization.
494 */
495 if ( id != OSAL_NV_ITEM_NULL )
496 {
497 /* This trick allows asking to find the old/transferred item in case
498 * of a successful new item write that gets interrupted before the
499 * old item can be zeroed out.
500 */
501 if ( (id & 0x7fff) == hdr.id )
502 {
503 if ( (((id & 0x8000) == 0) && (hdr.stat == OSAL_NV_ERASED_ID)) ||
504 (((id & 0x8000) != 0) && (hdr.stat != OSAL_NV_ERASED_ID)) )
505 {
506 return offset;
507 }
508 }
509 }
510 // When invoked from the osal_nv_init(), find and zero any duplicates.
511 else if ( hdr.stat == OSAL_NV_ERASED_ID )
512 {
513 /* The trick of setting the MSB of the item Id causes the logic
514 * immediately above to return a valid page only if the header 'stat'
515 * indicates that it was the older item being transferred.
516 */
517 uint16 off = findItem( (hdr.id | 0x8000) );
518
519 if ( off != OSAL_NV_ITEM_NULL )
520 {
521 setItem( findPg, off, eNvZero ); // Mark old duplicate as invalid.
522 }
523 }
524 }
525 else
526 {
527 setItem( pg, offset, eNvZero ); // Mark bad checksum as invalid.
\ ??initPage_2:
\ 000021 ; Setup parameters for call to function setItem
\ 000021 7C01 MOV R4,#0x1
\ 000023 AA.. MOV R2,?V0 + 2
\ 000025 AB.. MOV R3,?V0 + 3
\ 000027 A9.. MOV R1,?V0 + 6
\ ??initPage_3:
\ 000029 90.... MOV DPTR,#(??setItem & 0xffff)
\ 00002C 74.. MOV A,#((??setItem >> 16) & 0xff)
\ 00002E 12.... LCALL ?BCALL ; Banked call to: DPTR()
528 }
529 }
530
531 if ( hdr.id == OSAL_NV_ZEROED_ID )
\ ??initPage_4:
\ 000031 7402 MOV A,#0x2
\ 000033 12.... LCALL ?XSTACK_DISP0_8
\ 000036 E0 MOVX A,@DPTR
\ 000037 7002 JNZ ??initPage_5
\ 000039 A3 INC DPTR
\ 00003A E0 MOVX A,@DPTR
\ ??initPage_5:
\ 00003B 700F JNZ ??initPage_6
532 {
533 lost += (OSAL_NV_HDR_SIZE + sz);
\ 00003D 7408 MOV A,#0x8
\ 00003F 25.. ADD A,?V0 + 0
\ 000041 F8 MOV R0,A
\ 000042 E4 CLR A
\ 000043 35.. ADDC A,?V0 + 1
\ 000045 F9 MOV R1,A
\ 000046 EE MOV A,R6
\ 000047 28 ADD A,R0
\ 000048 FE MOV R6,A
\ 000049 EF MOV A,R7
\ 00004A 39 ADDC A,R1
\ 00004B FF MOV R7,A
534 }
535 offset += sz;
\ ??initPage_6:
\ 00004C E5.. MOV A,?V0 + 2
\ 00004E 25.. ADD A,?V0 + 0
\ 000050 F5.. MOV ?V0 + 2,A
\ 000052 E5.. MOV A,?V0 + 3
\ 000054 35.. ADDC A,?V0 + 1
\ 000056 F5.. MOV ?V0 + 3,A
536
537 } while ( TRUE );
\ ??initPage_1:
\ 000058 ; Setup parameters for call to function readHdr
\ 000058 7402 MOV A,#0x2
\ 00005A 12.... LCALL ?XSTACK_DISP0_8
\ 00005D AC82 MOV R4,DPL
\ 00005F AD83 MOV R5,DPH
\ 000061 AA.. MOV R2,?V0 + 2
\ 000063 AB.. MOV R3,?V0 + 3
\ 000065 A9.. MOV R1,?V0 + 6
\ 000067 90.... MOV DPTR,#(??readHdr & 0xffff)
\ 00006A 74.. MOV A,#((??readHdr >> 16) & 0xff)
\ 00006C 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 00006F 7402 MOV A,#0x2
\ 000071 12.... LCALL ?XSTACK_DISP0_8
\ 000074 E0 MOVX A,@DPTR
\ 000075 64FF XRL A,#0xff
\ 000077 7004 JNZ ??initPage_7
\ 000079 A3 INC DPTR
\ 00007A E0 MOVX A,@DPTR
\ 00007B 64FF XRL A,#0xff
\ ??initPage_7:
\ 00007D 603C JZ ??initPage_8
\ 00007F E5.. MOV A,?V0 + 2
\ 000081 2408 ADD A,#0x8
\ 000083 F5.. MOV ?V0 + 2,A
\ 000085 E5.. MOV A,?V0 + 3
\ 000087 3400 ADDC A,#0x0
\ 000089 F5.. MOV ?V0 + 3,A
\ 00008B 7404 MOV A,#0x4
\ 00008D 12.... LCALL ?XSTACK_DISP0_8
\ 000090 12.... LCALL ?Subroutine10 & 0xFFFF
\ ??CrossCallReturnLabel_32:
\ 000093 F5.. MOV ?V0 + 0,A
\ 000095 74FF MOV A,#-0x1
\ 000097 59 ANL A,R1
\ 000098 F5.. MOV ?V0 + 1,A
\ 00009A E5.. MOV A,?V0 + 0
\ 00009C 25.. ADD A,?V0 + 2
\ 00009E F8 MOV R0,A
\ 00009F E9 MOV A,R1
\ 0000A0 12.... LCALL ?Subroutine47 & 0xFFFF
\ ??CrossCallReturnLabel_124:
\ 0000A3 4037 JC ??initPage_9
\ 0000A5 E4 CLR A
\ 0000A6 2E ADD A,R6
\ 0000A7 F8 MOV R0,A
\ 0000A8 7408 MOV A,#0x8
\ 0000AA 3F ADDC A,R7
\ 0000AB F9 MOV R1,A
\ 0000AC E8 MOV A,R0
\ 0000AD C3 CLR C
\ 0000AE 95.. SUBB A,?V0 + 2
\ 0000B0 FE MOV R6,A
\ 0000B1 E9 MOV A,R1
\ 0000B2 95.. SUBB A,?V0 + 3
\ 0000B4 FF MOV R7,A
\ 0000B5 75..F8 MOV ?V0 + 2,#-0x8
\ 0000B8 75..07 MOV ?V0 + 3,#0x7
538
539 pgOff[pg - OSAL_NV_PAGE_BEG] = offset;
\ ??initPage_8:
\ 0000BB E5.. MOV A,?V0 + 6
\ 0000BD 12.... LCALL ??Subroutine45_0 & 0xFFFF
\ ??CrossCallReturnLabel_118:
\ 0000C0 E5.. MOV A,?V0 + 2
\ 0000C2 F0 MOVX @DPTR,A
\ 0000C3 A3 INC DPTR
\ 0000C4 E5.. MOV A,?V0 + 3
\ 0000C6 12.... LCALL ?Subroutine32 & 0xFFFF
540 pgLost[pg - OSAL_NV_PAGE_BEG] = lost;
\ ??CrossCallReturnLabel_89:
\ 0000C9 EE MOV A,R6
\ 0000CA F0 MOVX @DPTR,A
\ 0000CB A3 INC DPTR
\ 0000CC EF MOV A,R7
\ 0000CD F0 MOVX @DPTR,A
541
542 return OSAL_NV_ITEM_NULL;
\ 0000CE 7A00 MOV R2,#0x0
\ 0000D0 7B00 MOV R3,#0x0
\ ??initPage_10:
\ 0000D2 740A MOV A,#0xa
\ 0000D4 12.... LCALL ?DEALLOC_XSTACK8
\ 0000D7 7F07 MOV R7,#0x7
\ 0000D9 02.... LJMP ?BANKED_LEAVE_XDATA
\ ??initPage_9:
\ 0000DC 7402 MOV A,#0x2
\ 0000DE 12.... LCALL ?XSTACK_DISP0_8
\ 0000E1 E0 MOVX A,@DPTR
\ 0000E2 7002 JNZ ??initPage_11
\ 0000E4 A3 INC DPTR
\ 0000E5 E0 MOVX A,@DPTR
\ ??initPage_11:
\ 0000E6 7003 JNZ $+5
\ 0000E8 02.... LJMP ??initPage_4 & 0xFFFF
\ 0000EB ; Setup parameters for call to function calcChkF
\ 0000EB 7404 MOV A,#0x4
\ 0000ED 12.... LCALL ?XSTACK_DISP0_8
\ 0000F0 12.... LCALL ?Subroutine14 & 0xFFFF
\ ??CrossCallReturnLabel_36:
\ 0000F3 AA.. MOV R2,?V0 + 2
\ 0000F5 AB.. MOV R3,?V0 + 3
\ 0000F7 A9.. MOV R1,?V0 + 6
\ 0000F9 90.... MOV DPTR,#(??calcChkF & 0xffff)
\ 0000FC 74.. MOV A,#((??calcChkF >> 16) & 0xff)
\ 0000FE 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ 000101 8A.. MOV ?V0 + 4,R2
\ 000103 8B.. MOV ?V0 + 5,R3
\ 000105 A8..
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -